001 package org.cumulus4j.store.model;
002
003 import java.util.Collection;
004 import java.util.HashSet;
005 import java.util.Set;
006
007 import javax.jdo.JDOObjectNotFoundException;
008 import javax.jdo.PersistenceManager;
009 import javax.jdo.identity.LongIdentity;
010
011 import org.cumulus4j.store.crypto.CryptoContext;
012
013 public class DataEntryDAO extends AbstractDAO {
014
015 private int keyStoreRefID;
016
017 public DataEntryDAO() { }
018
019 /**
020 * Create a new instance with the backend-<code>PersistenceManager</code> used for data.
021 * @param pmData the backend-<code>PersistenceManager</code>. Must not be <code>null</code>.
022 * @param keyStoreRefID the key-store-reference-ID obtained usually from {@link CryptoContext#getKeyStoreRefID()}.
023 */
024 public DataEntryDAO(PersistenceManager pmData, int keyStoreRefID) {
025 super(pmData);
026 this.keyStoreRefID = keyStoreRefID;
027 }
028
029 /**
030 * Get the <code>DataEntry</code> identified by the specified {@link #getDataEntryID() dataEntryID} or
031 * <code>null</code> if no such instance exists.
032 * @param dataEntryID the <code>DataEntry</code>'s {@link #getDataEntryID() identifier}.
033 * @return the <code>DataEntry</code> matching the given <code>dataEntryID</code> or <code>null</code>, if no such instance exists.
034 */
035 public DataEntry getDataEntry(long dataEntryID)
036 {
037 DataEntry dataEntry;
038 try {
039 dataEntry = (DataEntry) pm.getObjectById(new LongIdentity(DataEntry.class, dataEntryID));
040 } catch (JDOObjectNotFoundException x) {
041 dataEntry = null;
042 }
043 return dataEntry;
044 }
045
046 /**
047 * Get the <code>DataEntry</code> identified by the given type and JDO/JPA-object-ID.
048 *
049 * @param classMeta reference to the searched <code>DataEntry</code>'s {@link #getClassMeta() classMeta} (which must match
050 * the searched instance's concrete type - <b>not</b> the root-type of the inheritance tree!).
051 * @param objectID the <code>String</code>-representation of the JDO/JPA-object-ID.
052 * @return the <code>DataEntry</code> matching the given combination of <code>classMeta</code> and <code>objectID</code>;
053 * or <code>null</code>, if no such instance exists.
054 */
055 public DataEntry getDataEntry(ClassMeta classMeta, String objectID)
056 {
057 javax.jdo.Query q = pm.newNamedQuery(DataEntry.class, DataEntry.NamedQueries.getDataEntryByClassMetaClassIDAndObjectID);
058 return (DataEntry) q.execute(keyStoreRefID, classMeta.getClassID(), objectID);
059 // UNIQUE query does not need to be closed, because there is no result list lingering.
060 }
061
062 /**
063 * <p>
064 * Get the {@link #getDataEntryID() dataEntryID} of the <code>DataEntry</code> identified by the
065 * given type and JDO/JPA-object-ID.
066 * </p>
067 * <p>
068 * This method is equivalent to first calling
069 * </p>
070 * <pre>DataEntry e = {@link #getDataEntry(PersistenceManager, ClassMeta, String)}</pre>
071 * <p>
072 * and then
073 * </p>
074 * <pre>e == null ? null : Long.valueOf({@link #getDataEntryID() e.getDataEntryID()})</pre>
075 * <p>
076 * but faster, because it does not query unnecessary data from the underlying database.
077 * </p>
078 *
079 * @param classMeta reference to the searched <code>DataEntry</code>'s {@link #getClassMeta() classMeta} (which must match
080 * the searched instance's concrete type - <b>not</b> the root-type of the inheritance tree!).
081 * @param objectID the <code>String</code>-representation of the JDO/JPA-object-ID.
082 * @return the {@link #getDataEntryID() dataEntryID} of the <code>DataEntry</code> matching the
083 * given combination of <code>classMeta</code> and <code>objectID</code>;
084 * or <code>null</code>, if no such instance exists.
085 */
086 public Long getDataEntryID(ClassMeta classMeta, String objectID)
087 {
088 javax.jdo.Query q = pm.newNamedQuery(DataEntry.class, DataEntry.NamedQueries.getDataEntryIDByClassMetaClassIDAndObjectID);
089 return (Long) q.execute(keyStoreRefID, classMeta.getClassID(), objectID);
090 // UNIQUE query does not need to be closed, because there is no result list lingering.
091 }
092
093 /**
094 * <p>
095 * Get the {@link #getDataEntryID() dataEntryID}s of all those <code>DataEntry</code> instances
096 * which do <b>not</b> match the given type and JDO/JPA-object-ID.
097 * </p>
098 * <p>
099 * This method is thus the negation of {@link #getDataEntryID(PersistenceManager, ClassMeta, String)}.
100 * </p>
101 *
102 * @param classMeta reference to the searched <code>DataEntry</code>'s {@link #getClassMeta() classMeta} (which must match
103 * the searched instance's concrete type - <b>not</b> the root-type of the inheritance tree!).
104 * @param notThisObjectID the <code>String</code>-representation of the JDO/JPA-object-ID, which should be
105 * excluded.
106 * @return the {@link #getDataEntryID() dataEntryID}s of those <code>DataEntry</code>s which match the given
107 * <code>classMeta</code> but have an object-ID different from the one specified as <code>notThisObjectID</code>.
108 */
109 public Set<Long> getDataEntryIDsNegated(ClassMeta classMeta, String notThisObjectID)
110 {
111 javax.jdo.Query q = pm.newNamedQuery(DataEntry.class, DataEntry.NamedQueries.getDataEntryIDsByClassMetaClassIDAndObjectIDNegated);
112 @SuppressWarnings("unchecked")
113 Collection<Long> dataEntryIDsColl = (Collection<Long>) q.execute(keyStoreRefID, classMeta.getClassID(), notThisObjectID);
114 Set<Long> dataEntryIDsSet = new HashSet<Long>(dataEntryIDsColl);
115 q.closeAll();
116 return dataEntryIDsSet;
117 }
118 }