package co.codewizards.cloudstore.local.persistence;
import static co.codewizards.cloudstore.core.util.HashUtil.sha1;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.jdo.Query;
import co.codewizards.cloudstore.core.util.AssertUtil;
import co.codewizards.cloudstore.core.util.UrlUtil;
public class RemoteRepositoryDao extends Dao<RemoteRepository, RemoteRepositoryDao> {
public RemoteRepository getRemoteRepository(final UUID repositoryId) {
AssertUtil.assertNotNull(repositoryId, "repositoryId");
final Query query = pm().newNamedQuery(getEntityClass(), "getRemoteRepository_repositoryId");
try {
final RemoteRepository remoteRepository = (RemoteRepository) query.execute(repositoryId.toString());
return remoteRepository;
} finally {
query.closeAll();
}
}
public RemoteRepository getRemoteRepository(URL remoteRoot) {
AssertUtil.assertNotNull(remoteRoot, "remoteRoot");
remoteRoot = UrlUtil.canonicalizeURL(remoteRoot);
final Query query = pm().newNamedQuery(getEntityClass(), "getRemoteRepository_remoteRootSha1");
try {
final String remoteRootSha1 = sha1(remoteRoot.toExternalForm());
final RemoteRepository remoteRepository = (RemoteRepository) query.execute(remoteRootSha1);
return remoteRepository;
} finally {
query.closeAll();
}
}
public RemoteRepository getRemoteRepositoryOrFail(final UUID repositoryId) {
final RemoteRepository remoteRepository = getRemoteRepository(repositoryId);
if (remoteRepository == null)
throw new IllegalArgumentException(String.format(
"There is no RemoteRepository with repositoryId='%s'!",
repositoryId));
return remoteRepository;
}
public RemoteRepository getRemoteRepositoryOrFail(final URL remoteRoot) {
final RemoteRepository remoteRepository = getRemoteRepository(remoteRoot);
if (remoteRepository == null)
throw new IllegalArgumentException(String.format(
"There is no RemoteRepository with remoteRoot='%s'!",
UrlUtil.canonicalizeURL(remoteRoot)));
return remoteRepository;
}
public Map<UUID, URL> getRemoteRepositoryId2RemoteRootMap() {
final Map<UUID, URL> result = new HashMap<UUID, URL>();
final Collection<RemoteRepository> remoteRepositories = getObjects();
for (final RemoteRepository remoteRepository : remoteRepositories) {
if (remoteRepository.getRemoteRoot() == null)
continue;
result.put(remoteRepository.getRepositoryId(), remoteRepository.getRemoteRoot());
}
return result;
}
@Override
public void deletePersistent(final RemoteRepository entity) {
AssertUtil.assertNotNull(entity, "entity");
deleteDependentObjects(entity);
pm().flush();
super.deletePersistent(entity);
}
@Override
public void deletePersistentAll(final Collection<? extends RemoteRepository> entities) {
AssertUtil.assertNotNull(entities, "entities");
for (final RemoteRepository remoteRepository : entities) {
deleteDependentObjects(remoteRepository);
}
pm().flush();
super.deletePersistentAll(entities);
}
protected void deleteDependentObjects(final RemoteRepository remoteRepository) {
AssertUtil.assertNotNull(remoteRepository, "remoteRepository");
final ModificationDao modificationDao = getDao(ModificationDao.class);
modificationDao.deletePersistentAll(modificationDao.getModifications(remoteRepository));
final LastSyncToRemoteRepoDao lastSyncToRemoteRepoDao = getDao(LastSyncToRemoteRepoDao.class);
final LastSyncToRemoteRepo lastSyncToRemoteRepo = lastSyncToRemoteRepoDao.getLastSyncToRemoteRepo(remoteRepository);
if (lastSyncToRemoteRepo != null)
lastSyncToRemoteRepoDao.deletePersistent(lastSyncToRemoteRepo);
}
}