001package co.codewizards.cloudstore.client;
002
003import static co.codewizards.cloudstore.core.util.Util.*;
004
005import java.io.File;
006import java.util.Collection;
007
008import co.codewizards.cloudstore.core.dto.DateTime;
009import co.codewizards.cloudstore.core.repo.local.LocalRepoManager;
010import co.codewizards.cloudstore.core.repo.local.LocalRepoManagerFactory;
011import co.codewizards.cloudstore.core.repo.local.LocalRepoRegistry;
012import co.codewizards.cloudstore.core.repo.local.LocalRepoTransaction;
013import co.codewizards.cloudstore.core.util.HashUtil;
014import co.codewizards.cloudstore.local.persistence.CopyModificationDAO;
015import co.codewizards.cloudstore.local.persistence.DeleteModificationDAO;
016import co.codewizards.cloudstore.local.persistence.DirectoryDAO;
017import co.codewizards.cloudstore.local.persistence.NormalFileDAO;
018import co.codewizards.cloudstore.local.persistence.RemoteRepository;
019import co.codewizards.cloudstore.local.persistence.RemoteRepositoryDAO;
020import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequest;
021import co.codewizards.cloudstore.local.persistence.RemoteRepositoryRequestDAO;
022
023/**
024 * {@link SubCommand} implementation for showing information about a repository in the local file system.
025 *
026 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
027 */
028public class RepoInfoSubCommand extends SubCommandWithExistingLocalRepo
029{
030        public RepoInfoSubCommand() { }
031
032        protected RepoInfoSubCommand(File localRoot) {
033                this.localRoot = assertNotNull("localRoot", localRoot);
034                this.localFile = this.localRoot;
035                this.local = localRoot.getPath();
036        }
037
038        @Override
039        public String getSubCommandDescription() {
040                return "Show information about an existing repository.";
041        }
042
043        @Override
044        public void run() throws Exception {
045                LocalRepoManager localRepoManager = LocalRepoManagerFactory.Helper.getInstance().createLocalRepoManagerForExistingRepository(localRoot);
046                try {
047                        LocalRepoTransaction transaction = localRepoManager.beginReadTransaction();
048                        try {
049                                showMainProperties(transaction);
050//                              showRepositoryAliases(transaction);
051                                showRemoteRepositories(transaction);
052                                showRemoteRepositoryRequests(transaction);
053                                showRepositoryStats(transaction);
054
055                                transaction.commit();
056                        } finally {
057                                transaction.rollbackIfActive();
058                        }
059                } finally {
060                        localRepoManager.close();
061                }
062        }
063
064        private void showMainProperties(LocalRepoTransaction transaction) {
065                LocalRepoManager localRepoManager = transaction.getLocalRepoManager();
066                Collection<String> repositoryAliases = LocalRepoRegistry.getInstance().getRepositoryAliasesOrFail(localRepoManager.getRepositoryId().toString());
067                System.out.println("Local repository:");
068                System.out.println("  repository.repositoryId = " + localRepoManager.getRepositoryId());
069                System.out.println("  repository.localRoot = " + localRepoManager.getLocalRoot());
070                System.out.println("  repository.aliases = " + repositoryAliases);
071                System.out.println("  repository.publicKeySha1 = " + HashUtil.sha1ForHuman(localRepoManager.getPublicKey()));
072                System.out.println();
073        }
074
075//      private void showRepositoryAliases(LocalRepoTransaction transaction) {
076//              LocalRepoManager localRepoManager = transaction.getLocalRepoManager();
077//              Collection<String> repositoryAliases = LocalRepoRegistry.getInstance().getRepositoryAliasesOrFail(localRepoManager.getRepositoryId().toString());
078//              if (repositoryAliases.isEmpty())
079//                      System.out.println("Aliases: {NONE}");
080//              else {
081//                      System.out.println("Aliases:");
082//                      for (String repositoryAlias : repositoryAliases)
083//                              System.out.println("  * " + repositoryAlias);
084//              }
085//              System.out.println();
086//      }
087
088        private void showRemoteRepositories(LocalRepoTransaction transaction) {
089                Collection<RemoteRepository> remoteRepositories = transaction.getDAO(RemoteRepositoryDAO.class).getObjects();
090                if (remoteRepositories.isEmpty()) {
091                        System.out.println("Remote repositories connected: {NONE}");
092                        System.out.println();
093                }
094                else {
095                        System.out.println("Remote repositories connected:");
096                        for (RemoteRepository remoteRepository : remoteRepositories) {
097                                System.out.println("  * remoteRepository.repositoryId = " + remoteRepository.getRepositoryId());
098                                if (remoteRepository.getRemoteRoot() != null)
099                                        System.out.println("    remoteRepository.remoteRoot = " + remoteRepository.getRemoteRoot());
100
101                                System.out.println("    remoteRepository.publicKeySha1 = " + HashUtil.sha1ForHuman(remoteRepository.getPublicKey()));
102                                System.out.println();
103                        }
104                }
105        }
106
107        private void showRemoteRepositoryRequests(LocalRepoTransaction transaction) {
108                Collection<RemoteRepositoryRequest> remoteRepositoryRequests = transaction.getDAO(RemoteRepositoryRequestDAO.class).getObjects();
109                if (remoteRepositoryRequests.isEmpty()) {
110                        System.out.println("Remote repositories requesting connection: {NONE}");
111                        System.out.println();
112                }
113                else {
114                        System.out.println("Remote repositories requesting connection:");
115                        for (RemoteRepositoryRequest remoteRepositoryRequest : remoteRepositoryRequests) {
116                                System.out.println("  * remoteRepositoryRequest.repositoryId = " + remoteRepositoryRequest.getRepositoryId());
117                                System.out.println("    remoteRepositoryRequest.publicKeySha1 = " + HashUtil.sha1ForHuman(remoteRepositoryRequest.getPublicKey()));
118                                System.out.println("    remoteRepositoryRequest.created = " + new DateTime(remoteRepositoryRequest.getCreated()));
119                                System.out.println("    remoteRepositoryRequest.changed = " + new DateTime(remoteRepositoryRequest.getChanged()));
120                                System.out.println();
121                        }
122                }
123        }
124
125        private void showRepositoryStats(LocalRepoTransaction transaction) {
126                NormalFileDAO normalFileDAO = transaction.getDAO(NormalFileDAO.class);
127                DirectoryDAO directoryDAO = transaction.getDAO(DirectoryDAO.class);
128                CopyModificationDAO copyModificationDAO = transaction.getDAO(CopyModificationDAO.class);
129                DeleteModificationDAO deleteModificationDAO = transaction.getDAO(DeleteModificationDAO.class);
130                long normalFileCount = normalFileDAO.getObjectsCount();
131                long directoryCount = directoryDAO.getObjectsCount();
132                long copyModificationCount = copyModificationDAO.getObjectsCount();
133                long deleteModificationCount = deleteModificationDAO.getObjectsCount();
134
135                System.out.println("Statistics:");
136                System.out.println("  * Count(NormalFile): " + normalFileCount);
137                System.out.println("  * Count(Directory): " + directoryCount);
138                System.out.println("  * Count(CopyModification): " + copyModificationCount);
139                System.out.println("  * Count(DeleteModification): " + deleteModificationCount);
140                System.out.println();
141        }
142}