001 package org.cumulus4j.store.datastoreversion; 002 003 import java.util.Date; 004 import java.util.Properties; 005 006 import javax.jdo.PersistenceManager; 007 008 import org.cumulus4j.store.Cumulus4jStoreManager; 009 import org.cumulus4j.store.WorkInProgressException; 010 import org.cumulus4j.store.crypto.CryptoContext; 011 import org.cumulus4j.store.model.DatastoreVersion; 012 import org.slf4j.Logger; 013 import org.slf4j.LoggerFactory; 014 015 public class CommandApplyParam 016 { 017 private static final Logger logger = LoggerFactory.getLogger(CommandApplyParam.class); 018 public static final String PROPERTY_KEY_TIMEOUT = "cumulus4j.DatastoreVersionCommand.applyWorkInProgressTimeout"; 019 020 private Date applyStartTimestamp = new Date(); 021 private Cumulus4jStoreManager storeManager; 022 private CryptoContext cryptoContext; 023 private PersistenceManager persistenceManager; 024 private DatastoreVersion datastoreVersion; 025 // private Map<String, DatastoreVersion> datastoreVersionID2DatastoreVersionMap; 026 private Properties workInProgressStateProperties; 027 028 /** 029 * 030 * @param storeManager TODO 031 * @param cryptoContext the context; must not be <code>null</code>. 032 * @param persistenceManager the persistence-manager; must not be <code>null</code>. 033 * @param datastoreVersion the current datastore-version (representing the last execution of the same command 034 * as currently being applied). Always <code>null</code>, if the command is final. Only not <code>null</code>, if 035 * the command is not final and was already applied in an earlier version. 036 * @param workInProgressStateProperties TODO 037 */ 038 public CommandApplyParam( 039 Cumulus4jStoreManager storeManager, CryptoContext cryptoContext, PersistenceManager persistenceManager, 040 DatastoreVersion datastoreVersion, 041 // Map<String, DatastoreVersion> datastoreVersionID2DatastoreVersionMap, 042 Properties workInProgressStateProperties 043 ) 044 { 045 if (storeManager == null) 046 throw new IllegalArgumentException("storeManager == null"); 047 048 if (cryptoContext == null) 049 throw new IllegalArgumentException("cryptoContext == null"); 050 051 if (persistenceManager == null) 052 throw new IllegalArgumentException("persistenceManager == null"); 053 054 // if (datastoreVersionID2DatastoreVersionMap == null) 055 // throw new IllegalArgumentException("datastoreVersionID2DatastoreVersionMap == null"); 056 057 if (workInProgressStateProperties == null) 058 throw new IllegalArgumentException("workInProgressStateProperties == null"); 059 060 this.storeManager = storeManager; 061 this.cryptoContext = cryptoContext; 062 this.persistenceManager = persistenceManager; 063 this.datastoreVersion = datastoreVersion; 064 // this.datastoreVersionID2DatastoreVersionMap = datastoreVersionID2DatastoreVersionMap; 065 this.workInProgressStateProperties = workInProgressStateProperties; 066 } 067 068 public Cumulus4jStoreManager getStoreManager() { 069 return storeManager; 070 } 071 072 public CryptoContext getCryptoContext() { 073 return cryptoContext; 074 } 075 076 public PersistenceManager getPersistenceManager() { 077 return persistenceManager; 078 } 079 080 public DatastoreVersion getDatastoreVersion() { 081 return datastoreVersion; 082 } 083 084 // public Map<String, DatastoreVersion> getDatastoreVersionID2DatastoreVersionMap() { 085 // return datastoreVersionID2DatastoreVersionMap; 086 // } 087 088 public Properties getWorkInProgressStateProperties() { 089 return workInProgressStateProperties; 090 } 091 092 /** 093 * Get the time in milliseconds after which a {@link WorkInProgressException} should be thrown by the 094 * {@link DatastoreVersionCommand}. 095 * @return the timeout in milliseconds. 096 */ 097 public long getDatastoreVersionCommandApplyWorkInProgressTimeout() { 098 long result = 10L * 1000L; 099 Object propertyValue = storeManager.getProperty(PROPERTY_KEY_TIMEOUT); 100 if (propertyValue == null) 101 return result; 102 103 long val; 104 try { 105 val = Long.parseLong(propertyValue.toString()); 106 } catch (NumberFormatException x) { 107 logger.warn(String.format("Value for property '%s' is not a valid number!", PROPERTY_KEY_TIMEOUT), x); 108 return result; 109 } 110 111 if (val <= 0) { 112 logger.warn("Value for property '{}' is zero or negative, but must be positive!", PROPERTY_KEY_TIMEOUT); 113 return result; 114 } 115 116 result = val; 117 return result; 118 } 119 120 public Date getApplyStartTimestamp() { 121 return applyStartTimestamp; 122 } 123 124 public boolean isDatastoreVersionCommandApplyWorkInProgressTimeoutExceeded() { 125 return System.currentTimeMillis() - applyStartTimestamp.getTime() > getDatastoreVersionCommandApplyWorkInProgressTimeout(); 126 } 127 }