001 package org.cumulus4j.store.model;
002
003 import javax.jdo.JDOObjectNotFoundException;
004 import javax.jdo.PersistenceManager;
005 import javax.jdo.identity.LongIdentity;
006 import javax.jdo.identity.SingleFieldIdentity;
007
008 public class EncryptionCoordinateSetDAO extends AbstractDAO {
009
010 public EncryptionCoordinateSetDAO() { }
011
012 /**
013 * @param pm the backend-{@link PersistenceManager} (the one used for data, if there is a separate index-DB used).
014 */
015 public EncryptionCoordinateSetDAO(PersistenceManager pm) {
016 super(pm);
017 }
018
019 /**
020 * {@inheritDoc}
021 * @param pm the backend-{@link PersistenceManager} (the one used for data, if there is a separate index-DB used).
022 */
023 @Override
024 public void setPersistenceManager(PersistenceManager pm) {
025 super.setPersistenceManager(pm);
026 }
027
028 /**
029 * Get an existing <code>EncryptionCoordinateSet</code> identified by its {@link #getEncryptionCoordinateSetID() encryptionCoordinateSetID}.
030 *
031 * @param encryptionCoordinateSetID the {@link #getEncryptionCoordinateSetID() identifier} of the searched instance.
032 * @return the <code>EncryptionCoordinateSet</code> identified by the given <code>encryptionCoordinateSetID</code> or
033 * <code>null</code>, if no such instance exists in the datastore.
034 */
035 public EncryptionCoordinateSet getEncryptionCoordinateSet(int encryptionCoordinateSetID)
036 {
037 SingleFieldIdentity id = new LongIdentity(EncryptionCoordinateSet.class, encryptionCoordinateSetID);
038 try {
039 EncryptionCoordinateSet encryptionCoordinateSet = (EncryptionCoordinateSet) pm.getObjectById(id);
040 return encryptionCoordinateSet;
041 } catch (JDOObjectNotFoundException x) {
042 return null;
043 }
044 }
045
046 /**
047 * <p>
048 * Get an existing <code>EncryptionCoordinateSet</code> identified by its unique properties.
049 * </p>
050 * <p>
051 * As each <code>EncryptionCoordinateSet</code> maps all encryption settings to an ID, all
052 * properties of this class except for the ID form a unique index together. At the moment,
053 * these are: {@link #getCipherTransformation() cipher-transformation} and {@link #getMACAlgorithm() MAC-algorithm}.
054 * </p>
055 *
056 * @param cipherTransformation the {@link #getCipherTransformation() cipher-transformation} of the searched instance.
057 * Must not be <code>null</code>.
058 * @param macAlgorithm the {@link #getMACAlgorithm()} of the searched instance. Must not be <code>null</code>
059 * (use {@value #MAC_ALGORITHM_NONE} for no MAC).
060 * @return the <code>EncryptionCoordinateSet</code> identified by the given properties or
061 * <code>null</code>, if no such instance exists in the datastore.
062 * @see #createEncryptionCoordinateSet(PersistenceManager, String, String)
063 */
064 public EncryptionCoordinateSet getEncryptionCoordinateSet(String cipherTransformation, String macAlgorithm)
065 {
066 if (cipherTransformation == null)
067 throw new IllegalArgumentException("cipherTransformation == null");
068
069 if (macAlgorithm == null)
070 throw new IllegalArgumentException("macAlgorithm == null");
071
072 javax.jdo.Query q = pm.newNamedQuery(EncryptionCoordinateSet.class, "getEncryptionCoordinateSetByAllAlgorithms");
073 return (EncryptionCoordinateSet) q.execute(cipherTransformation, macAlgorithm);
074 // UNIQUE query does not need to be closed, because there is no result list lingering.
075 }
076
077 /**
078 * <p>
079 * Get an existing <code>EncryptionCoordinateSet</code> identified by its unique properties or create one
080 * if necessary.
081 * </p>
082 * <p>
083 * This method is similar to {@link #getEncryptionCoordinateSet(PersistenceManager, String, String)}, but
084 * creates a new <code>EncryptionCoordinateSet</code> instead of returning <code>null</code>, if there is
085 * no existing instance, yet.
086 * </p>
087 *
088 * @param cipherTransformation the {@link #getCipherTransformation() cipher-transformation} of the searched instance.
089 * Must not be <code>null</code>.
090 * @param macAlgorithm the {@link #getMACAlgorithm()} of the searched instance. Must not be <code>null</code>
091 * (use {@value #MAC_ALGORITHM_NONE} for no MAC).
092 * @return the <code>EncryptionCoordinateSet</code> identified by the given properties. This method never returns
093 * <code>null</code>, but instead creates and persists a new instance if needed.
094 * @see #getEncryptionCoordinateSet(PersistenceManager, String, String)
095 */
096 public EncryptionCoordinateSet createEncryptionCoordinateSet(String cipherTransformation, String macAlgorithm)
097 {
098 EncryptionCoordinateSet encryptionCoordinateSet = getEncryptionCoordinateSet(cipherTransformation, macAlgorithm);
099 if (encryptionCoordinateSet == null) {
100 encryptionCoordinateSet = pm.makePersistent(new EncryptionCoordinateSet(cipherTransformation, macAlgorithm));
101 // It is essential that the first ID is 0 (and never a negative value), because
102 // we encode this ID into the binary data assuming that it is positive or 0!
103 // Hence, we check here, already.
104 if (encryptionCoordinateSet.getEncryptionCoordinateSetID() < 0)
105 throw new IllegalStateException("encryptionCoordinateSetID = " + encryptionCoordinateSet.getEncryptionCoordinateSetID() + " < 0!!!");
106 }
107
108 return encryptionCoordinateSet;
109 }
110
111 }