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