001package co.codewizards.cloudstore.local.persistence;
002
003import static co.codewizards.cloudstore.core.util.HashUtil.*;
004import static java.util.Objects.*;
005
006import java.net.URL;
007import java.util.Collection;
008import java.util.HashMap;
009import java.util.Map;
010import java.util.UUID;
011
012import javax.jdo.Query;
013
014import co.codewizards.cloudstore.core.util.UrlUtil;
015
016public class RemoteRepositoryDao extends Dao<RemoteRepository, RemoteRepositoryDao> {
017        public RemoteRepository getRemoteRepository(final UUID repositoryId) {
018                requireNonNull(repositoryId, "repositoryId");
019                final Query query = pm().newNamedQuery(getEntityClass(), "getRemoteRepository_repositoryId");
020                try {
021                        final RemoteRepository remoteRepository = (RemoteRepository) query.execute(repositoryId.toString());
022                        return remoteRepository;
023                } finally {
024                        query.closeAll();
025                }
026        }
027
028        public RemoteRepository getRemoteRepository(URL remoteRoot) {
029                requireNonNull(remoteRoot, "remoteRoot");
030                remoteRoot = UrlUtil.canonicalizeURL(remoteRoot);
031                final Query query = pm().newNamedQuery(getEntityClass(), "getRemoteRepository_remoteRootSha1");
032                try {
033                        final String remoteRootSha1 = sha1(remoteRoot.toExternalForm());
034                        final RemoteRepository remoteRepository = (RemoteRepository) query.execute(remoteRootSha1);
035                        return remoteRepository;
036                } finally {
037                        query.closeAll();
038                }
039        }
040
041        public RemoteRepository getRemoteRepositoryOrFail(final UUID repositoryId) {
042                final RemoteRepository remoteRepository = getRemoteRepository(repositoryId);
043                if (remoteRepository == null)
044                        throw new IllegalArgumentException(String.format(
045                                        "There is no RemoteRepository with repositoryId='%s'!",
046                                        repositoryId));
047
048                return remoteRepository;
049        }
050
051        public RemoteRepository getRemoteRepositoryOrFail(final URL remoteRoot) {
052                final RemoteRepository remoteRepository = getRemoteRepository(remoteRoot);
053                if (remoteRepository == null)
054                        throw new IllegalArgumentException(String.format(
055                                        "There is no RemoteRepository with remoteRoot='%s'!",
056                                        UrlUtil.canonicalizeURL(remoteRoot)));
057
058                return remoteRepository;
059        }
060
061        public Map<UUID, URL> getRemoteRepositoryId2RemoteRootMap() {
062                final Map<UUID, URL> result = new HashMap<UUID, URL>();
063                final Collection<RemoteRepository> remoteRepositories = getObjects();
064                for (final RemoteRepository remoteRepository : remoteRepositories) {
065                        if (remoteRepository.getRemoteRoot() == null)
066                                continue;
067
068                        result.put(remoteRepository.getRepositoryId(), remoteRepository.getRemoteRoot());
069                }
070                return result;
071        }
072
073        @Override
074        public void deletePersistent(final RemoteRepository entity) {
075                requireNonNull(entity, "entity");
076                deleteDependentObjects(entity);
077                pm().flush();
078                super.deletePersistent(entity);
079        }
080
081        @Override
082        public void deletePersistentAll(final Collection<? extends RemoteRepository> entities) {
083                requireNonNull(entities, "entities");
084                for (final RemoteRepository remoteRepository : entities) {
085                        deleteDependentObjects(remoteRepository);
086                }
087                pm().flush();
088                super.deletePersistentAll(entities);
089        }
090
091        protected void deleteDependentObjects(final RemoteRepository remoteRepository) {
092                requireNonNull(remoteRepository, "remoteRepository");
093
094                final ModificationDao modificationDao = getDao(ModificationDao.class);
095                modificationDao.deletePersistentAll(modificationDao.getModifications(remoteRepository));
096
097                final LastSyncToRemoteRepoDao lastSyncToRemoteRepoDao = getDao(LastSyncToRemoteRepoDao.class);
098                final LastSyncToRemoteRepo lastSyncToRemoteRepo = lastSyncToRemoteRepoDao.getLastSyncToRemoteRepo(remoteRepository);
099                if (lastSyncToRemoteRepo != null)
100                        lastSyncToRemoteRepoDao.deletePersistent(lastSyncToRemoteRepo);
101        }
102
103}