001 package org.cumulus4j.store.datastoreversion.command;
002
003 import java.util.Collection;
004 import java.util.Set;
005
006 import javax.jdo.PersistenceManager;
007 import javax.jdo.Query;
008
009 import org.cumulus4j.store.Cumulus4jStoreManager;
010 import org.cumulus4j.store.crypto.CryptoContext;
011 import org.cumulus4j.store.datastoreversion.AbstractDatastoreVersionCommand;
012 import org.cumulus4j.store.datastoreversion.CommandApplyParam;
013 import org.cumulus4j.store.model.DataEntry;
014 import org.cumulus4j.store.model.IndexEntry;
015
016 public class IntroduceKeyStoreRefID extends AbstractDatastoreVersionCommand
017 {
018 private CryptoContext cryptoContext;
019 private Set<Class<? extends IndexEntry>> indexEntryClasses;
020
021 @Override
022 public int getCommandVersion() {
023 return 0;
024 }
025
026 @Override
027 public void apply(CommandApplyParam commandApplyParam) {
028 PersistenceManager pm = commandApplyParam.getPersistenceManager();
029 cryptoContext = commandApplyParam.getCryptoContext();
030
031 if (pm == cryptoContext.getPersistenceManagerForData())
032 applyToData(commandApplyParam, pm);
033
034 if (pm == cryptoContext.getPersistenceManagerForIndex())
035 applyToIndex(commandApplyParam, pm);
036 }
037
038 @SuppressWarnings("deprecation")
039 protected void applyToData(CommandApplyParam commandApplyParam, PersistenceManager pm) {
040 Collection<DataEntry> dataEntries = getAll(pm, DataEntry.class);
041 for (DataEntry dataEntry : dataEntries) {
042 dataEntry.setKeyStoreRefID(commandApplyParam.getCryptoContext().getKeyStoreRefID());
043 }
044 }
045
046 protected void applyToIndex(CommandApplyParam commandApplyParam, PersistenceManager pm) {
047 for (Class<? extends IndexEntry> indexEntryClass : getIndexEntryClasses()) {
048 Collection<? extends IndexEntry> indexEntries = getAll(pm, indexEntryClass);
049 for (IndexEntry indexEntry : indexEntries) {
050 indexEntry.setKeyStoreRefID(commandApplyParam.getCryptoContext().getKeyStoreRefID());
051 }
052 }
053 }
054
055 protected <T> Collection<T> getAll(PersistenceManager pm, Class<T> entityClass) {
056 Query q = pm.newQuery(entityClass);
057 @SuppressWarnings("unchecked")
058 Collection<T> c = (Collection<T>) q.execute();
059 return c;
060 }
061
062 protected Set<Class<? extends IndexEntry>> getIndexEntryClasses() {
063 if (indexEntryClasses == null)
064 indexEntryClasses = ((Cumulus4jStoreManager)cryptoContext.getExecutionContext().getStoreManager()).getIndexFactoryRegistry().getIndexEntryClasses();
065
066 return indexEntryClasses;
067 }
068 }