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