Merge branch 'feature/entities-version-control' of github.com:thingsboard/thingsboard into feature/entities-version-control

This commit is contained in:
Andrii Shvaika 2022-05-24 17:32:42 +03:00
commit 701547e38f
7 changed files with 58 additions and 25 deletions

View File

@ -53,9 +53,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static org.thingsboard.server.controller.ControllerConstants.NEW_LINE;
import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION;
import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION;
import static org.thingsboard.server.controller.ControllerConstants.*;
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES;
@RestController
@TbCoreComponent
@ -131,10 +130,14 @@ public class EntitiesVersionControlController extends BaseController {
@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
@RequestParam int pageSize,
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
@RequestParam int page) throws ThingsboardException {
@RequestParam int page,
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
@RequestParam(required = false) String sortProperty,
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
try {
EntityId externalEntityId = EntityIdFactory.getByTypeAndUuid(entityType, externalEntityUuid);
PageLink pageLink = new PageLink(pageSize, page);
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
return wrapFuture(versionControlService.listEntityVersions(getTenantId(), branch, externalEntityId, pageLink));
} catch (Exception e) {
throw handleException(e);
@ -154,9 +157,13 @@ public class EntitiesVersionControlController extends BaseController {
@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
@RequestParam int pageSize,
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
@RequestParam int page) throws ThingsboardException {
@RequestParam int page,
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
@RequestParam(required = false) String sortProperty,
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
try {
PageLink pageLink = new PageLink(pageSize, page);
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
return wrapFuture(versionControlService.listEntityTypeVersions(getTenantId(), branch, entityType, pageLink));
} catch (Exception e) {
throw handleException(e);
@ -183,9 +190,13 @@ public class EntitiesVersionControlController extends BaseController {
@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
@RequestParam int pageSize,
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
@RequestParam int page) throws ThingsboardException {
@RequestParam int page,
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "timestamp")
@RequestParam(required = false) String sortProperty,
@ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES)
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
try {
PageLink pageLink = new PageLink(pageSize, page);
PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
return wrapFuture(versionControlService.listVersions(getTenantId(), branch, pageLink));
} catch (Exception e) {
throw handleException(e);

View File

@ -312,7 +312,7 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
} else if (vcResponseMsg.hasCommitResponse()) {
var commitResponse = vcResponseMsg.getCommitResponse();
var commitResult = new VersionCreationResult();
commitResult.setVersion(new EntityVersion(commitResponse.getCommitId(), commitResponse.getName()));
commitResult.setVersion(new EntityVersion(commitResponse.getTs(), commitResponse.getCommitId(), commitResponse.getName()));
commitResult.setAdded(commitResponse.getAdded());
commitResult.setRemoved(commitResponse.getRemoved());
commitResult.setModified(commitResponse.getModified());
@ -344,7 +344,7 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
}
private EntityVersion getEntityVersion(TransportProtos.EntityVersionProto proto) {
return new EntityVersion(proto.getId(), proto.getName());
return new EntityVersion(proto.getTs(), proto.getId(), proto.getName());
}
private VersionedEntityInfo getVersionedEntityInfo(TransportProtos.VersionedEntityInfoProto proto) {

View File

@ -689,11 +689,12 @@ message CommitRequestMsg {
}
message CommitResponseMsg {
string commitId = 1;
string name = 2;
int32 added = 3;
int32 modified = 4;
int32 removed = 5;
int64 ts = 1;
string commitId = 2;
string name = 3;
int32 added = 4;
int32 modified = 5;
int32 removed = 6;
}
message PrepareMsg {

View File

@ -23,6 +23,7 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
public class EntityVersion {
private long timestamp;
private String id;
private String name;
}

View File

@ -297,7 +297,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe
.setTotalElements(data.getTotalElements())
.setHasNext(data.hasNext())
.addAllVersions(data.getData().stream().map(
v -> EntityVersionProto.newBuilder().setId(v.getId()).setName(v.getName()).build()
v -> EntityVersionProto.newBuilder().setTs(v.getTimestamp()).setId(v.getId()).setName(v.getName()).build()
).collect(Collectors.toList())))
);
}
@ -417,6 +417,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe
private void reply(VersionControlRequestCtx ctx, VersionCreationResult result) {
reply(ctx, Optional.empty(), builder -> builder.setCommitResponse(CommitResponseMsg.newBuilder()
.setTs(result.getVersion().getTimestamp())
.setCommitId(result.getVersion().getId())
.setName(result.getVersion().getName())
.setAdded(result.getAdded())

View File

@ -248,7 +248,7 @@ public class DefaultGitRepositoryService implements GitRepositoryService {
}
private EntityVersion toVersion(GitRepository.Commit commit) {
return new EntityVersion(commit.getId(), commit.getMessage());
return new EntityVersion(commit.getTimestamp(), commit.getId(), commit.getMessage());
}
private EntityId fromRelativePath(String path) {

View File

@ -16,6 +16,7 @@
package org.thingsboard.server.service.sync.vc;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import com.google.common.collect.Streams;
import lombok.Data;
import lombok.Getter;
@ -48,6 +49,7 @@ import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilter;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.common.data.sync.vc.EntitiesVersionControlSettings;
import org.thingsboard.server.common.data.sync.vc.VersionControlAuthMethod;
@ -58,10 +60,7 @@ import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -180,7 +179,7 @@ public class GitRepository {
command.addPath(path);
}
Iterable<RevCommit> commits = execute(command);
return iterableToPageData(commits, this::toCommit, pageLink);
return iterableToPageData(commits, this::toCommit, pageLink, revCommitComparatorFunction);
}
public List<String> listFilesAtCommit(String commitId) throws IOException {
@ -282,7 +281,7 @@ public class GitRepository {
// }
private Commit toCommit(RevCommit revCommit) {
return new Commit(revCommit.getName(), revCommit.getFullMessage(), revCommit.getAuthorIdent().getName());
return new Commit(revCommit.getCommitTime() * 1000, revCommit.getName(), revCommit.getFullMessage(), revCommit.getAuthorIdent().getName());
}
private RevCommit resolveCommit(String id) throws IOException {
@ -300,11 +299,30 @@ public class GitRepository {
return command.call();
}
private static <T,R> PageData<R> iterableToPageData (Iterable<T> iterable, Function<? super T, ? extends R> mapper, PageLink pageLink) {
private static Function<PageLink, Comparator<RevCommit>> revCommitComparatorFunction = pageLink -> {
SortOrder sortOrder = pageLink.getSortOrder();
if (sortOrder != null
&& sortOrder.getProperty().equals("timestamp")
&& SortOrder.Direction.ASC.equals(sortOrder.getDirection())) {
return Comparator.comparingInt(RevCommit::getCommitTime);
}
return null;
};
private static <T,R> PageData<R> iterableToPageData (Iterable<T> iterable,
Function<? super T, ? extends R> mapper,
PageLink pageLink,
Function<PageLink, Comparator<T>> comparatorFunction) {
int totalElements = Iterables.size(iterable);
int totalPages = pageLink.getPageSize() > 0 ? (int) Math.ceil((float) totalElements / pageLink.getPageSize()) : 1;
int startIndex = pageLink.getPageSize() * pageLink.getPage();
int limit = startIndex + pageLink.getPageSize();
if (comparatorFunction != null) {
Comparator<T> comparator = comparatorFunction.apply(pageLink);
if (comparator != null) {
iterable = Ordering.from(comparator).immutableSortedCopy(iterable);
}
}
iterable = Iterables.limit(iterable, limit);
if (startIndex < totalElements) {
iterable = Iterables.skip(iterable, startIndex);
@ -374,6 +392,7 @@ public class GitRepository {
@Data
public static class Commit {
private final long timestamp;
private final String id;
private final String message;
private final String authorName;