package com.sleepycat.je;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import com.sleepycat.je.config.ConfigParam;
import com.sleepycat.je.config.EnvironmentParams;
import com.sleepycat.je.dbi.EnvironmentImpl;
import de.ovgu.cide.jakutil.*;
/**
* Javadoc for this public class is generated
* via the doc templates in the doc_src directory.
*/
public class EnvironmentMutableConfig implements Cloneable {
private boolean txnNoSync=false;
private boolean txnWriteNoSync=false;
protected long cacheSize;
/**
* Note that in the implementation we choose not to extend Properties
* in order to keep the configuration type safe.
*/
private Properties props;
/**
* For unit testing, to prevent loading of je.properties.
*/
private boolean loadPropertyFile=true;
/**
* Internal boolean that says whether or not to validate params. Setting
* it to false means that parameter value validatation won't be performed
* during setVal() calls. Only should be set to false by unit tests using
* DbInternal.
*/
private boolean validateParams=true;
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public EnvironmentMutableConfig(){
props=new Properties();
}
/**
* Used by EnvironmentConfig to construct from properties.
*/
EnvironmentMutableConfig( Properties properties) throws IllegalArgumentException {
validateProperties(properties);
props=new Properties();
props.putAll(properties);
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public void setTxnNoSync( boolean noSync){
txnNoSync=noSync;
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public boolean getTxnNoSync(){
return txnNoSync;
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public void setTxnWriteNoSync( boolean writeNoSync){
txnWriteNoSync=writeNoSync;
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public boolean getTxnWriteNoSync(){
return txnWriteNoSync;
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public void setCacheSize( long totalBytes) throws IllegalArgumentException {
setVal(EnvironmentParams.MAX_MEMORY,Long.toString(totalBytes));
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public long getCacheSize(){
return cacheSize;
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public void setCachePercent( int percent) throws IllegalArgumentException {
setVal(EnvironmentParams.MAX_MEMORY_PERCENT,Integer.toString(percent));
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public int getCachePercent(){
String val=getVal(EnvironmentParams.MAX_MEMORY_PERCENT);
try {
return Integer.parseInt(val);
}
catch ( NumberFormatException e) {
throw new IllegalArgumentException("Cache percent is not a valid integer: " + e.getMessage());
}
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public void setConfigParam( String paramName, String value) throws IllegalArgumentException {
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(paramName);
if (param == null) {
throw new IllegalArgumentException(paramName + " is not a valid BDBJE environment configuration");
}
if (!param.isMutable()) {
throw new IllegalArgumentException(paramName + " is not a mutable BDBJE environment configuration");
}
setVal(param,value);
}
/**
* Javadoc for this public method is generated via
* the doc templates in the doc_src directory.
*/
public String getConfigParam( String paramName) throws IllegalArgumentException {
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(paramName);
if (param == null) {
throw new IllegalArgumentException(paramName + " is not a valid BDBJE environment configuration");
}
return getVal(param);
}
/**
* Gets either the value stored in this configuration or the
* default value for this param.
*/
String getVal( ConfigParam param){
String val=props.getProperty(param.getName());
if (val == null) {
val=param.getDefault();
}
return val;
}
/**
* Sets and validates the specified parameter.
*/
void setVal( ConfigParam param, String val) throws IllegalArgumentException {
if (validateParams) {
param.validateValue(val);
}
props.setProperty(param.getName(),val);
}
void setValidateParams( boolean validateParams){
this.validateParams=validateParams;
}
/**
* Validate a property bag passed in a construction time.
*/
void validateProperties( Properties props) throws IllegalArgumentException {
Enumeration propNames=props.propertyNames();
while (propNames.hasMoreElements()) {
String name=(String)propNames.nextElement();
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(name);
if (param == null) {
throw new IllegalArgumentException(name + " is not a valid BDBJE environment configuration");
}
param.validateValue(props.getProperty(name));
}
}
/**
* Check that the immutable values in the environment config used to open
* an environment match those in the config object saved by the underlying
* shared EnvironmentImpl.
*/
void checkImmutablePropsForEquality( EnvironmentMutableConfig passedConfig) throws IllegalArgumentException {
Properties passedProps=passedConfig.props;
Iterator iter=EnvironmentParams.SUPPORTED_PARAMS.keySet().iterator();
while (iter.hasNext()) {
String paramName=(String)iter.next();
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(paramName);
assert param != null;
if (!param.isMutable()) {
String paramVal=props.getProperty(paramName);
String useParamVal=passedProps.getProperty(paramName);
if ((paramVal != null) ? (!paramVal.equals(useParamVal)) : (useParamVal != null)) {
throw new IllegalArgumentException(paramName + " is set to " + useParamVal+ " in the config parameter"+ " which is incompatible"+ " with the value of "+ paramVal+ " in the"+ " underlying environment");
}
}
}
}
/**
* Overrides Object.clone() to clone all properties, used by this class and
* EnvironmentConfig.
*/
protected Object clone() throws CloneNotSupportedException {
EnvironmentMutableConfig copy=(EnvironmentMutableConfig)super.clone();
copy.props=(Properties)props.clone();
return copy;
}
/**
* Used by Environment to create a copy of the application
* supplied configuration. Done this way to provide non-public cloning.
*/
EnvironmentMutableConfig cloneMutableConfig(){
try {
EnvironmentMutableConfig copy=(EnvironmentMutableConfig)clone();
copy.clearImmutableProps();
return copy;
}
catch ( CloneNotSupportedException willNeverOccur) {
return null;
}
}
/**
* Copies the per-handle properties of this object to the given config
* object.
*/
void copyHandlePropsTo( EnvironmentMutableConfig other){
other.txnNoSync=txnNoSync;
other.txnWriteNoSync=txnWriteNoSync;
}
/**
* Copies all mutable props to the given config object.
*/
void copyMutablePropsTo( EnvironmentMutableConfig toConfig){
Properties toProps=toConfig.props;
Enumeration propNames=props.propertyNames();
while (propNames.hasMoreElements()) {
String paramName=(String)propNames.nextElement();
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(paramName);
assert param != null;
if (param.isMutable()) {
String newVal=props.getProperty(paramName);
toProps.setProperty(paramName,newVal);
}
}
}
/**
* Fill in the properties calculated by the environment to the given
* config object.
*/
void fillInEnvironmentGeneratedProps( EnvironmentImpl envImpl){
cacheSize=envImpl.getMemoryBudget().getMaxMemory();
}
/**
* Removes all immutable props.
*/
private void clearImmutableProps(){
Enumeration propNames=props.propertyNames();
while (propNames.hasMoreElements()) {
String paramName=(String)propNames.nextElement();
ConfigParam param=(ConfigParam)EnvironmentParams.SUPPORTED_PARAMS.get(paramName);
assert param != null;
if (!param.isMutable()) {
props.remove(paramName);
}
}
}
/**
* For unit testing, to prevent loading of je.properties.
*/
void setLoadPropertyFile( boolean loadPropertyFile){
this.loadPropertyFile=loadPropertyFile;
}
/**
* For unit testing, to prevent loading of je.properties.
*/
boolean getLoadPropertyFile(){
return loadPropertyFile;
}
/**
* Testing support
*/
int getNumExplicitlySetParams(){
return props.size();
}
public String toString(){
return props.toString();
}
}