001 package org.cumulus4j.store.model; 002 003 import javax.jdo.JDOObjectNotFoundException; 004 import javax.jdo.PersistenceManager; 005 import javax.jdo.Query; 006 import javax.jdo.identity.IntIdentity; 007 008 public class KeyStoreRefDAO extends AbstractDAO { 009 010 public KeyStoreRefDAO() { } 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 KeyStoreRefDAO(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 public KeyStoreRef getKeyStoreRef(int keyStoreRefID) { 029 IntIdentity id = new IntIdentity(KeyStoreRef.class, keyStoreRefID); 030 try { 031 KeyStoreRef keyStoreRef = (KeyStoreRef) pm.getObjectById(id); 032 return keyStoreRef; 033 } catch (JDOObjectNotFoundException x) { 034 return null; 035 } 036 } 037 038 public KeyStoreRef getKeyStoreRef(String keyStoreID) { 039 if (keyStoreID == null) 040 throw new IllegalArgumentException("keyStoreID == null"); 041 042 Query q = pm.newNamedQuery(KeyStoreRef.class, "getKeyStoreRefByKeyStoreID"); 043 return (KeyStoreRef) q.execute(keyStoreID); 044 // UNIQUE query does not need to be closed, because there is no result list lingering. 045 } 046 047 public KeyStoreRef createKeyStoreRef(String keyStoreID) { 048 KeyStoreRef keyStoreRef = getKeyStoreRef(keyStoreID); 049 if (keyStoreRef == null) { 050 keyStoreRef = pm.makePersistent(new KeyStoreRef(keyStoreID)); 051 // It does not matter, whether this ID is negative, or not, but we don't 052 // need so many IDs and thus we can use solely positive numbers. And as 053 // we *require* positive numbers in EncryptionCoordinateSet-IDs, the underlying 054 // datastore needs to support starting at 0, anyway, hence we can make this 055 // constraint for the sake of beauty (of the raw datastore). 056 // In many cases, 0 is the one and only ID, because we seldomly share 057 // one underlying database among multiple tenants (= key stores). 058 // Additionally, we use 0 as default value which is relevant for updates 059 // from older Cumulus4j versions. 060 if (keyStoreRef.getKeyStoreRefID() < 0) 061 throw new IllegalStateException("keyStoreRefID = " + keyStoreRef.getKeyStoreRefID() + " < 0!!!"); 062 } 063 return keyStoreRef; 064 } 065 }