blob: faf6b9d4637e593ba8adc44d286439e17f6f1082 [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.rep.impl;
import java.util.Enumeration;
import java.util.Properties;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.EnvironmentFailureException;
import com.sleepycat.je.config.ConfigParam;
import com.sleepycat.je.config.EnvironmentParams;
import com.sleepycat.je.dbi.DbConfigManager;
import com.sleepycat.je.dbi.RepConfigProxy;
import com.sleepycat.je.rep.RepInternal;
import com.sleepycat.je.rep.ReplicationConfig;
public class RepConfigManager extends DbConfigManager {
/**
* If the replication configuration object was set with overridden
* validation, we need to continue to override when we generate a new
* configuration.
*/
private final boolean validateParams;
public RepConfigManager(EnvironmentConfig envConfig,
RepConfigProxy repConfigProxy) {
super(envConfig);
checkEnvConfig(envConfig);
ReplicationConfig repConfig = (ReplicationConfig) repConfigProxy;
props.putAll(repConfig.getProps());
repConfig.verify();
this.validateParams = repConfig.getValidateParams();
}
/**
* Verifies that the environment config is suitable for a replicated
* environment.
*
* @param envConfig the environment config being checked.
*
* @throws IllegalArgumentException via ReplicatedEnvironment ctor.
*/
private static void checkEnvConfig(EnvironmentConfig envConfig)
throws IllegalArgumentException {
if (!envConfig.getTransactional()) {
throw new IllegalArgumentException
("A replicated environment must be transactional");
}
String logMemOnly = envConfig.getConfigParam
(EnvironmentParams.LOG_MEMORY_ONLY.getName());
if (Boolean.parseBoolean(logMemOnly)) {
throw new IllegalArgumentException
("A replicated environment must not log to memory");
}
}
/**
* Create a new ReplicationConfig for use in creating Replicator handles.
* Be sure to only pick out replication related properties.
*/
public ReplicationConfig makeReplicationConfig() {
/*
* TODO: the code would be nicer if we replaced the properties bag with
* a class that knows how to iterate over the param values, associating
* the ConfigParam object with it. As a future task, this is similar to
* code in DbConfigManager, and ought to be refactored out. We can also
* strip out the multivalued param support.
*/
Properties repProperties = new Properties();
/* Check that the properties have valid names and values. */
Enumeration<?> propNames = props.propertyNames();
while (propNames.hasMoreElements()) {
String name = (String) propNames.nextElement();
/* Is this a valid property name? */
ConfigParam param =
EnvironmentParams.SUPPORTED_PARAMS.get(name);
if (param == null) {
/* See if the parameter is an multi-value parameter. */
String mvParamName = ConfigParam.multiValueParamName(name);
param = EnvironmentParams.SUPPORTED_PARAMS.get(mvParamName);
if (param == null) {
throw EnvironmentFailureException.unexpectedState
(name +
" is not a valid BDBJE environment configuration");
}
}
if (param.isForReplication()) {
repProperties.setProperty(name, props.getProperty(name));
}
}
return RepInternal.makeReplicationConfig
(repProperties, validateParams);
}
}