001package co.codewizards.cloudstore.local.persistence; 002 003import java.util.Collection; 004 005import javax.jdo.Query; 006 007import org.slf4j.Logger; 008import org.slf4j.LoggerFactory; 009 010import co.codewizards.cloudstore.core.util.AssertUtil; 011 012public class ModificationDao extends Dao<Modification, ModificationDao> { 013 private static final Logger logger = LoggerFactory.getLogger(ModificationDao.class); 014 015 /** 016 * Gets those {@link Modification}s being assigned to the given {@link Modification#getRemoteRepository() remoteRepository} 017 * whose {@link Modification#getLocalRevision() localRevision} is greater than the given {@code localRevision}. 018 * @param remoteRepository the {@link Modification#getRemoteRepository() remoteRepository} the queried modifications are assigned to. 019 * @param localRevision the {@link Modification#getLocalRevision() localRevision}, after which the modifications 020 * to be queried where created. 021 * @return those {@link Modification}s matching the given criteria. Never <code>null</code>, but maybe empty. 022 */ 023 public Collection<Modification> getModificationsAfter(final RemoteRepository remoteRepository, final long localRevision) { 024 AssertUtil.assertNotNull(remoteRepository, "remoteRepository"); 025 final Query query = pm().newNamedQuery(getEntityClass(), "getModificationsAfter_remoteRepository_localRevision"); 026 try { 027 long startTimestamp = System.currentTimeMillis(); 028 @SuppressWarnings("unchecked") 029 Collection<Modification> modifications = (Collection<Modification>) query.execute(remoteRepository, localRevision); 030 logger.debug("getModificationsAfter: query.execute(...) took {} ms.", System.currentTimeMillis() - startTimestamp); 031 032 startTimestamp = System.currentTimeMillis(); 033 modifications = load(modifications); 034 logger.debug("getModificationsAfter: Loading result-set with {} elements took {} ms.", modifications.size(), System.currentTimeMillis() - startTimestamp); 035 036 return modifications; 037 } finally { 038 query.closeAll(); 039 } 040 } 041 042 public Collection<Modification> getModificationsBeforeOrEqual(final RemoteRepository remoteRepository, final long localRevision) { 043 AssertUtil.assertNotNull(remoteRepository, "remoteRepository"); 044 final Query query = pm().newNamedQuery(getEntityClass(), "getModificationsBeforeOrEqual_remoteRepository_localRevision"); 045 try { 046 long startTimestamp = System.currentTimeMillis(); 047 @SuppressWarnings("unchecked") 048 Collection<Modification> modifications = (Collection<Modification>) query.execute(remoteRepository, localRevision); 049 logger.debug("getModificationsBeforeOrEqual: query.execute(...) took {} ms.", System.currentTimeMillis() - startTimestamp); 050 051 startTimestamp = System.currentTimeMillis(); 052 modifications = load(modifications); 053 logger.debug("getModificationsBeforeOrEqual: Loading result-set with {} elements took {} ms.", modifications.size(), System.currentTimeMillis() - startTimestamp); 054 055 return modifications; 056 } finally { 057 query.closeAll(); 058 } 059 } 060 061 /** 062 * Gets all {@link Modification}s being assigned to the given {@link Modification#getRemoteRepository() remoteRepository}. 063 * @param remoteRepository the {@link Modification#getRemoteRepository() remoteRepository} the queried modifications are assigned to. 064 * @return those {@link Modification}s matching the given criteria. Never <code>null</code>, but maybe empty. 065 */ 066 public Collection<Modification> getModifications(final RemoteRepository remoteRepository) { 067 return getModificationsAfter(remoteRepository, -1); 068 } 069}