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}