001 package org.cumulus4j.store; 002 003 import java.util.HashMap; 004 import java.util.Map; 005 006 import javax.jdo.FetchPlan; 007 import javax.jdo.PersistenceManager; 008 009 import org.cumulus4j.store.model.KeyStoreRef; 010 import org.cumulus4j.store.model.KeyStoreRefDAO; 011 012 public class KeyStoreRefManager { 013 014 private Map<Integer, KeyStoreRef> keyStoreRefID2KeyStoreRef = new HashMap<Integer, KeyStoreRef>(); 015 private Map<String, KeyStoreRef> keyStoreID2KeyStoreRef = new HashMap<String, KeyStoreRef>(); 016 017 public KeyStoreRefManager() { } 018 019 /** 020 * Get the {@link KeyStoreRef} identified by the given <code>keyStoreRefID</code>. 021 * If no such <code>KeyStoreRef</code> exists, <code>null</code> is returned. 022 * @param persistenceManagerConnection the connection to the underlying datastore(s). 023 * @param keyStoreRefID {@link KeyStoreRef#getKeyStoreRefID() identifier} of the 024 * <code>KeyStoreRef</code> to be retrieved. 025 * @return the {@link KeyStoreRef} identified by the given <code>keyStoreRefID</code> or <code>null</code>. 026 */ 027 public synchronized KeyStoreRef getKeyStoreRef(PersistenceManagerConnection persistenceManagerConnection, int keyStoreRefID) 028 { 029 KeyStoreRef keyStoreRef = keyStoreRefID2KeyStoreRef.get(keyStoreRefID); 030 if (keyStoreRef == null) { 031 PersistenceManager pm = persistenceManagerConnection.getDataPM(); 032 keyStoreRef = new KeyStoreRefDAO(pm).getKeyStoreRef(keyStoreRefID); 033 if (keyStoreRef != null) { 034 pm.getFetchPlan().setMaxFetchDepth(-1); 035 pm.getFetchPlan().setGroup(FetchPlan.ALL); 036 keyStoreRef = pm.detachCopy(keyStoreRef); 037 keyStoreRefID2KeyStoreRef.put( 038 keyStoreRef.getKeyStoreRefID(), keyStoreRef 039 ); 040 keyStoreID2KeyStoreRef.put( 041 keyStoreRef.getKeyStoreID(), keyStoreRef 042 ); 043 } 044 } 045 return keyStoreRef; 046 } 047 048 /** 049 * <p> 050 * Get the {@link KeyStoreRef} identified by the given properties. 051 * </p><p> 052 * If it does not yet exist in the in-memory-cache, 053 * it is looked up in the datastore. If it is found there, it is detached, cached and returned. If it does not exist in the 054 * datastore either, it is - if <code>create == true</code> - created, persisted, detached, cached and returned; if 055 * <code>create == false</code>, <code>null</code> is returned instead. 056 * </p><p> 057 * The <code>KeyStoreRef</code> instances are only held in the 058 * {@link PersistenceManagerConnection#getDataPM() data-datastore} (not in the index-datastore). This might change in the future 059 * (in case replication becomes necessary). 060 * </p> 061 * 062 * @param create whether to create a new instance, if it does not yet exist. If <code>true</code>, a new instance 063 * will be created, persisted, detached, cached and returned, if it does not yet exist. If <code>false</code>, <code>null</code> 064 * will be returned instead. 065 * @param persistenceManagerConnection the connection to the underlying datastore(s). 066 * @param keyStoreID the <code>KeyStore</code>'s ID. Must not be <code>null</code>. 067 * @return the <code>KeyStoreRef</code> (detached) matching the given properties. If <code>create == true</code>, this 068 * is never <code>null</code>. If <code>create == false</code> and there does not yet exist an appropriate 069 * <code>KeyStoreRef</code>, this is <code>null</code>. 070 */ 071 protected KeyStoreRef _createOrGetKeyStoreRef(boolean create, PersistenceManagerConnection persistenceManagerConnection, String keyStoreID) 072 { 073 KeyStoreRef keyStoreRef = keyStoreID2KeyStoreRef.get(keyStoreID); 074 if (keyStoreRef == null) { 075 PersistenceManager pm = persistenceManagerConnection.getDataPM(); 076 077 if (create) 078 keyStoreRef = new KeyStoreRefDAO(pm).createKeyStoreRef(keyStoreID); 079 else 080 keyStoreRef = new KeyStoreRefDAO(pm).getKeyStoreRef(keyStoreID); 081 082 if (keyStoreRef != null) { 083 pm.getFetchPlan().setMaxFetchDepth(-1); 084 pm.getFetchPlan().setGroup(FetchPlan.ALL); 085 keyStoreRef = pm.detachCopy(keyStoreRef); 086 keyStoreRefID2KeyStoreRef.put( 087 keyStoreRef.getKeyStoreRefID(), keyStoreRef 088 ); 089 keyStoreID2KeyStoreRef.put( 090 keyStoreRef.getKeyStoreID(), keyStoreRef 091 ); 092 } 093 } 094 return keyStoreRef; 095 } 096 097 /** 098 * <p> 099 * Get the {@link KeyStoreRef} identified by the given properties. 100 * </p><p> 101 * If there is no appropriate <code>KeyStoreRef</code> (neither in the in-memory-cache nor in the datastore), 102 * <code>null</code> is returned. 103 * </p><p> 104 * This method delegates to {@link #_createOrGetKeyStoreRef(boolean, PersistenceManagerConnection, String, String)} with 105 * <code>create == false</code>. 106 * </p> 107 * 108 * @param persistenceManagerConnection the connection to the underlying datastore(s). 109 * @param keyStoreID the <code>KeyStore</code>'s ID. Must not be <code>null</code>. 110 * @return the <code>KeyStoreRef</code> (detached) matching the given properties or <code>null</code>. 111 */ 112 public synchronized KeyStoreRef getKeyStoreRef(PersistenceManagerConnection persistenceManagerConnection, String keyStoreID) 113 { 114 return _createOrGetKeyStoreRef(false, persistenceManagerConnection, keyStoreID); 115 } 116 117 /** 118 * <p> 119 * Get the {@link KeyStoreRef} identified by the given properties. 120 * </p><p> 121 * If there is no appropriate <code>KeyStoreRef</code> (neither in the in-memory-cache nor in the datastore), 122 * it is created and persisted. 123 * </p><p> 124 * This method delegates to {@link #_createOrGetKeyStoreRef(boolean, PersistenceManagerConnection, String, String)} with 125 * <code>create == true</code>. 126 * </p> 127 * 128 * @param persistenceManagerConnection the connection to the underlying datastore(s). 129 * @param keyStoreID the <code>KeyStore</code>'s ID. Must not be <code>null</code>. 130 * @return the <code>KeyStoreRef</code> (detached) matching the given properties; never <code>null</code>. 131 */ 132 public synchronized KeyStoreRef createKeyStoreRef(PersistenceManagerConnection persistenceManagerConnection, String keyStoreID) 133 { 134 return _createOrGetKeyStoreRef(true, persistenceManagerConnection, keyStoreID); 135 } 136 }