package co.codewizards.cloudstore.ls.rest.server.service; import static co.codewizards.cloudstore.core.oio.OioFileFactory.*; import static co.codewizards.cloudstore.core.util.AssertUtil.*; import java.util.Collection; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import co.codewizards.cloudstore.core.oio.File; import co.codewizards.cloudstore.core.repo.local.LocalRepoManager; import co.codewizards.cloudstore.core.repo.local.LocalRepoManagerFactory; import co.codewizards.cloudstore.core.repo.local.LocalRepoRegistryImpl; import co.codewizards.cloudstore.core.repo.local.LocalRepoTransaction; import co.codewizards.cloudstore.local.persistence.CopyModificationDao; import co.codewizards.cloudstore.local.persistence.DeleteModificationDao; import co.codewizards.cloudstore.local.persistence.DirectoryDao; import co.codewizards.cloudstore.local.persistence.NormalFileDao; import co.codewizards.cloudstore.local.persistence.RemoteRepository; import co.codewizards.cloudstore.local.persistence.RemoteRepositoryDao; import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequest; import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequestDao; import co.codewizards.cloudstore.ls.core.dto.RemoteRepositoryDto; import co.codewizards.cloudstore.ls.core.dto.RemoteRepositoryRequestDto; import co.codewizards.cloudstore.ls.core.dto.RepoInfoRequestDto; import co.codewizards.cloudstore.ls.core.dto.RepoInfoResponseDto; @Path("RepoInfo") @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) public class RepoInfoService { private static final Logger logger = LoggerFactory.getLogger(RepoInfoService.class); { logger.debug("<init>: Instance created."); } private LocalRepoTransaction transaction; private RepoInfoResponseDto repoInfoResponseDto; @POST public RepoInfoResponseDto run(final RepoInfoRequestDto repoInfoRequestDto) { assertNotNull(repoInfoRequestDto, "repoInfoRequestDto"); repoInfoResponseDto = new RepoInfoResponseDto(); final File localRoot = createFile(assertNotNull(repoInfoRequestDto.getLocalRoot(), "")); final LocalRepoManager localRepoManager = LocalRepoManagerFactory.Helper.getInstance().createLocalRepoManagerForExistingRepository(localRoot); try { try ( LocalRepoTransaction transaction = localRepoManager.beginReadTransaction(); ) { this.transaction = transaction; collectMainProperties(); collectRemoteRepositories(); collectRemoteRepositoryRequests(); collectRepositoryStats(); transaction.commit(); } } finally { localRepoManager.close(); } return repoInfoResponseDto; } private void collectMainProperties() { final LocalRepoManager localRepoManager = transaction.getLocalRepoManager(); repoInfoResponseDto.setRepositoryId(localRepoManager.getRepositoryId()); repoInfoResponseDto.setLocalRoot(localRepoManager.getLocalRoot().getPath()); repoInfoResponseDto.setPublicKey(localRepoManager.getPublicKey()); final Collection<String> repositoryAliases = LocalRepoRegistryImpl.getInstance().getRepositoryAliasesOrFail(localRepoManager.getRepositoryId().toString()); repoInfoResponseDto.getRepositoryAliases().addAll(repositoryAliases); } private void collectRemoteRepositories() { final Collection<RemoteRepository> remoteRepositories = transaction.getDao(RemoteRepositoryDao.class).getObjects(); for (final RemoteRepository remoteRepository : remoteRepositories) { final RemoteRepositoryDto remoteRepositoryDto = new RemoteRepositoryDto(); remoteRepositoryDto.setRepositoryId(remoteRepository.getRepositoryId()); remoteRepositoryDto.setPublicKey(remoteRepository.getPublicKey()); if (remoteRepository.getRemoteRoot() != null) remoteRepositoryDto.setRemoteRoot(remoteRepository.getRemoteRoot().toExternalForm()); repoInfoResponseDto.getRemoteRepositoryDtos().add(remoteRepositoryDto); } } private void collectRemoteRepositoryRequests() { final Collection<RemoteRepositoryRequest> remoteRepositoryRequests = transaction.getDao(RemoteRepositoryRequestDao.class).getObjects(); for (final RemoteRepositoryRequest remoteRepositoryRequest : remoteRepositoryRequests) { final RemoteRepositoryRequestDto remoteRepositoryRequestDto = new RemoteRepositoryRequestDto(); remoteRepositoryRequestDto.setRepositoryId(remoteRepositoryRequest.getRepositoryId()); remoteRepositoryRequestDto.setPublicKey(remoteRepositoryRequest.getPublicKey()); remoteRepositoryRequestDto.setCreated(remoteRepositoryRequest.getCreated()); remoteRepositoryRequestDto.setChanged(remoteRepositoryRequest.getChanged()); repoInfoResponseDto.getRemoteRepositoryRequestDtos().add(remoteRepositoryRequestDto); } } private void collectRepositoryStats() { final NormalFileDao normalFileDao = transaction.getDao(NormalFileDao.class); final DirectoryDao directoryDao = transaction.getDao(DirectoryDao.class); final CopyModificationDao copyModificationDao = transaction.getDao(CopyModificationDao.class); final DeleteModificationDao deleteModificationDao = transaction.getDao(DeleteModificationDao.class); repoInfoResponseDto.setNormalFileCount(normalFileDao.getObjectsCount()); repoInfoResponseDto.setDirectoryCount(directoryDao.getObjectsCount()); repoInfoResponseDto.setCopyModificationCount(copyModificationDao.getObjectsCount()); repoInfoResponseDto.setDeleteModificationCount(deleteModificationDao.getObjectsCount()); } }