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}