Merge branch 'feature/entities-version-control' of github.com:thingsboard/thingsboard into feature/entities-version-control
This commit is contained in:
		
						commit
						701547e38f
					
				@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ import lombok.NoArgsConstructor;
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
public class EntityVersion {
 | 
			
		||||
    private long timestamp;
 | 
			
		||||
    private String id;
 | 
			
		||||
    private String name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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())
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user