001 package org.cumulus4j.store.datastoreversion; 002 003 import javax.jdo.PersistenceManager; 004 005 import org.cumulus4j.store.model.KeyStoreRef; 006 007 /** 008 * Command for managing a datastore version (change). 009 * <p> 010 * A new instance of a class implementing this interface is created for each run of 011 * {@link DatastoreVersionManager#applyOnce(org.cumulus4j.store.crypto.CryptoContext)}. Therefore, implementations 012 * do not need to be thread-safe and can share data in fields across implementation methods. 013 * <p> 014 * Implementations should subclass {@link AbstractDatastoreVersionCommand} instead of directly implementing 015 * this interface. 016 * <p> 017 * Implementations must be manually registered in {@link org.cumulus4j.store.datastoreversion.DatastoreVersionManager}! 018 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 019 */ 020 public interface DatastoreVersionCommand { 021 String getCommandID(); 022 023 /** 024 * Get the version of this command. 025 * <p> 026 * This version must be incremented, if this command is modified! 027 * <p> 028 * Note, that a {@link #isFinal() final} command cannot be modified!!! You can only modify a final command 029 * if this command was newly introduced in the current SNAPSHOT. <b><u>Never</u> modify a command after it 030 * was released!!!</b> 031 * @return the version of this command. 032 */ 033 int getCommandVersion(); 034 035 /** 036 * Perform the upgrade or do whatever this command has to do. 037 * @param commandApplyParam various arguments bundled for better compatibility with future extensions. Never <code>null</code>. 038 */ 039 void apply(CommandApplyParam commandApplyParam); 040 041 /** 042 * Is this command final, i.e. applied only once, or should this command be applied again, when the commandVersion 043 * was incremented? 044 * @return <code>true</code>, if this command is final; <code>false</code> otherwise. 045 */ 046 boolean isFinal(); 047 048 /** 049 * Is this command dependent on the key-store? If yes, it is applied separately for every key-store, i.e. with different 050 * {@link KeyStoreRef#getKeyStoreRefID() keyStoreRefID}s. If no, it is applied only once 051 * {@link KeyStoreRef#GLOBAL_KEY_STORE_REF_ID globally}. 052 * @return <code>true</code>, if this command should be applied once per key-store (and per underlying {@link PersistenceManager} 053 * [there might be two if data and index is stored separately]); <code>false</code> otherwise. 054 */ 055 boolean isKeyStoreDependent(); 056 }