001package co.codewizards.cloudstore.ls.rest.server.service;
002
003import static co.codewizards.cloudstore.core.oio.OioFileFactory.*;
004import static java.util.Objects.*;
005
006import java.util.Collection;
007
008import javax.ws.rs.Consumes;
009import javax.ws.rs.POST;
010import javax.ws.rs.Path;
011import javax.ws.rs.Produces;
012import javax.ws.rs.core.MediaType;
013
014import org.slf4j.Logger;
015import org.slf4j.LoggerFactory;
016
017import co.codewizards.cloudstore.core.oio.File;
018import co.codewizards.cloudstore.core.repo.local.LocalRepoManager;
019import co.codewizards.cloudstore.core.repo.local.LocalRepoManagerFactory;
020import co.codewizards.cloudstore.core.repo.local.LocalRepoRegistryImpl;
021import co.codewizards.cloudstore.core.repo.local.LocalRepoTransaction;
022import co.codewizards.cloudstore.local.persistence.CopyModificationDao;
023import co.codewizards.cloudstore.local.persistence.DeleteModificationDao;
024import co.codewizards.cloudstore.local.persistence.DirectoryDao;
025import co.codewizards.cloudstore.local.persistence.NormalFileDao;
026import co.codewizards.cloudstore.local.persistence.RemoteRepository;
027import co.codewizards.cloudstore.local.persistence.RemoteRepositoryDao;
028import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequest;
029import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequestDao;
030import co.codewizards.cloudstore.ls.core.dto.RemoteRepositoryDto;
031import co.codewizards.cloudstore.ls.core.dto.RemoteRepositoryRequestDto;
032import co.codewizards.cloudstore.ls.core.dto.RepoInfoRequestDto;
033import co.codewizards.cloudstore.ls.core.dto.RepoInfoResponseDto;
034
035@Path("RepoInfo")
036@Consumes(MediaType.APPLICATION_XML)
037@Produces(MediaType.APPLICATION_XML)
038public class RepoInfoService
039{
040        private static final Logger logger = LoggerFactory.getLogger(RepoInfoService.class);
041
042        {
043                logger.debug("<init>: Instance created.");
044        }
045
046        private LocalRepoTransaction transaction;
047        private RepoInfoResponseDto repoInfoResponseDto;
048
049        @POST
050        public RepoInfoResponseDto run(final RepoInfoRequestDto repoInfoRequestDto)
051        {
052                requireNonNull(repoInfoRequestDto, "repoInfoRequestDto");
053                repoInfoResponseDto = new RepoInfoResponseDto();
054
055                final File localRoot = createFile(requireNonNull(repoInfoRequestDto.getLocalRoot(), ""));
056                final LocalRepoManager localRepoManager = LocalRepoManagerFactory.Helper.getInstance().createLocalRepoManagerForExistingRepository(localRoot);
057                try {
058                        try ( LocalRepoTransaction transaction = localRepoManager.beginReadTransaction(); ) {
059                                this.transaction = transaction;
060
061                                collectMainProperties();
062                                collectRemoteRepositories();
063                                collectRemoteRepositoryRequests();
064                                collectRepositoryStats();
065
066                                transaction.commit();
067                        }
068                } finally {
069                        localRepoManager.close();
070                }
071
072                return repoInfoResponseDto;
073        }
074
075        private void collectMainProperties() {
076                final LocalRepoManager localRepoManager = transaction.getLocalRepoManager();
077
078                repoInfoResponseDto.setRepositoryId(localRepoManager.getRepositoryId());
079                repoInfoResponseDto.setLocalRoot(localRepoManager.getLocalRoot().getPath());
080                repoInfoResponseDto.setPublicKey(localRepoManager.getPublicKey());
081
082                final Collection<String> repositoryAliases = LocalRepoRegistryImpl.getInstance().getRepositoryAliasesOrFail(localRepoManager.getRepositoryId().toString());
083                repoInfoResponseDto.getRepositoryAliases().addAll(repositoryAliases);
084        }
085
086        private void collectRemoteRepositories() {
087                final Collection<RemoteRepository> remoteRepositories = transaction.getDao(RemoteRepositoryDao.class).getObjects();
088                for (final RemoteRepository remoteRepository : remoteRepositories) {
089                        final RemoteRepositoryDto remoteRepositoryDto = new RemoteRepositoryDto();
090                        remoteRepositoryDto.setRepositoryId(remoteRepository.getRepositoryId());
091                        remoteRepositoryDto.setPublicKey(remoteRepository.getPublicKey());
092
093                        if (remoteRepository.getRemoteRoot() != null)
094                                remoteRepositoryDto.setRemoteRoot(remoteRepository.getRemoteRoot().toExternalForm());
095
096                        repoInfoResponseDto.getRemoteRepositoryDtos().add(remoteRepositoryDto);
097                }
098        }
099
100        private void collectRemoteRepositoryRequests() {
101                final Collection<RemoteRepositoryRequest> remoteRepositoryRequests = transaction.getDao(RemoteRepositoryRequestDao.class).getObjects();
102                for (final RemoteRepositoryRequest remoteRepositoryRequest : remoteRepositoryRequests) {
103                        final RemoteRepositoryRequestDto remoteRepositoryRequestDto = new RemoteRepositoryRequestDto();
104                        remoteRepositoryRequestDto.setRepositoryId(remoteRepositoryRequest.getRepositoryId());
105                        remoteRepositoryRequestDto.setPublicKey(remoteRepositoryRequest.getPublicKey());
106                        remoteRepositoryRequestDto.setCreated(remoteRepositoryRequest.getCreated());
107                        remoteRepositoryRequestDto.setChanged(remoteRepositoryRequest.getChanged());
108
109                        repoInfoResponseDto.getRemoteRepositoryRequestDtos().add(remoteRepositoryRequestDto);
110                }
111        }
112
113        private void collectRepositoryStats() {
114                final NormalFileDao normalFileDao = transaction.getDao(NormalFileDao.class);
115                final DirectoryDao directoryDao = transaction.getDao(DirectoryDao.class);
116                final CopyModificationDao copyModificationDao = transaction.getDao(CopyModificationDao.class);
117                final DeleteModificationDao deleteModificationDao = transaction.getDao(DeleteModificationDao.class);
118
119                repoInfoResponseDto.setNormalFileCount(normalFileDao.getObjectsCount());
120                repoInfoResponseDto.setDirectoryCount(directoryDao.getObjectsCount());
121                repoInfoResponseDto.setCopyModificationCount(copyModificationDao.getObjectsCount());
122                repoInfoResponseDto.setDeleteModificationCount(deleteModificationDao.getObjectsCount());
123        }
124}