ReplicationCliArgumentParser.java revision d90a03781f4833f726597d735b79b49073940d75
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2007-2010 Sun Microsystems, Inc.
* Portions Copyright 2012-2015 ForgeRock AS.
*/
package org.opends.server.tools.dsreplication;
import static com.forgerock.opendj.cli.ArgumentConstants.*;
import static com.forgerock.opendj.cli.Utils.*;
import static org.opends.messages.AdminToolMessages.*;
import static org.opends.messages.ToolMessages.*;
import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.opends.quicksetup.Constants;
import org.opends.server.admin.AdministrationConnector;
import org.opends.server.admin.client.cli.SecureConnectionCliArgs;
import org.opends.server.admin.client.cli.SecureConnectionCliParser;
import org.opends.server.admin.client.cli.TaskScheduleArgs;
import org.opends.server.core.DirectoryServer.DirectoryServerVersionHandler;
import org.opends.server.extensions.ConfigFileHandler;
import org.opends.server.tasks.PurgeConflictsHistoricalTask;
import com.forgerock.opendj.cli.Argument;
import com.forgerock.opendj.cli.ArgumentException;
import com.forgerock.opendj.cli.ArgumentGroup;
import com.forgerock.opendj.cli.BooleanArgument;
import com.forgerock.opendj.cli.ClientException;
import com.forgerock.opendj.cli.CommonArguments;
import com.forgerock.opendj.cli.FileBasedArgument;
import com.forgerock.opendj.cli.IntegerArgument;
import com.forgerock.opendj.cli.StringArgument;
import com.forgerock.opendj.cli.SubCommand;
/**
* This class is used to parse the arguments passed to the replication CLI.
* It also checks the compatibility between the values and that all the
* required information has been provided. However it does not do any
* verification that require connection to any server.
*/
public class ReplicationCliArgumentParser extends SecureConnectionCliParser
{
/** Arguments used when enabling replication for a server. */
static class ServerArgs
{
/** The 'hostName' argument for the first server. */
StringArgument hostNameArg;
/** The 'port' argument for the first server. */
IntegerArgument portArg;
/** The 'bindDN' argument for the first server. */
StringArgument bindDnArg;
/** The 'bindPasswordFile' argument for the first server. */
FileBasedArgument bindPasswordFileArg;
/** The 'bindPassword' argument for the first server. */
StringArgument bindPasswordArg;
/** The 'replicationPort' argument for the first server. */
IntegerArgument replicationPortArg;
/** The 'noReplicationServer' argument for the first server. */
BooleanArgument noReplicationServerArg;
/** The 'onlyReplicationServer' argument for the first server. */
BooleanArgument onlyReplicationServerArg;
/** The 'secureReplication' argument for the first server. */
BooleanArgument secureReplicationArg;
/**
* Get the password which has to be used for the command to connect to this server without
* prompting the user in the enable replication subcommand. If no password was specified return
* null.
*
* @return the password which has to be used for the command to connect to this server without
* prompting the user in the enable replication subcommand. If no password was specified
* return null.
*/
String getBindPassword()
{
return ReplicationCliArgumentParser.getBindPassword(bindPasswordArg, bindPasswordFileArg);
}
boolean configureReplicationDomain()
{
return !onlyReplicationServerArg.isPresent();
}
boolean configureReplicationServer()
{
return !noReplicationServerArg.isPresent();
}
}
private SubCommand enableReplicationSubCmd;
private SubCommand disableReplicationSubCmd;
private SubCommand initializeReplicationSubCmd;
private SubCommand initializeAllReplicationSubCmd;
private SubCommand postExternalInitializationSubCmd;
private SubCommand preExternalInitializationSubCmd;
private SubCommand resetChangelogNumber;
private SubCommand statusReplicationSubCmd;
private SubCommand purgeHistoricalSubCmd;
private int defaultAdminPort =
AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT;
/** No-prompt argument. */
BooleanArgument noPromptArg;
private String defaultLocalHostValue;
/** Arguments for the first server. */
ServerArgs server1 = new ServerArgs();
/** Arguments for the second server. */
ServerArgs server2 = new ServerArgs();
/** The 'skipPortCheckArg' argument to not check replication ports. */
private BooleanArgument skipPortCheckArg;
/** The 'noSchemaReplication' argument to not replicate schema. */
BooleanArgument noSchemaReplicationArg;
/** The 'useSecondServerAsSchemaSource' argument to not replicate schema. */
private BooleanArgument useSecondServerAsSchemaSourceArg;
/** The 'disableAll' argument to disable all the replication configuration of server. */
BooleanArgument disableAllArg;
/** The 'disableReplicationServer' argument to disable the replication server. */
BooleanArgument disableReplicationServerArg;
/** The 'hostName' argument for the source server. */
private StringArgument hostNameSourceArg;
/** The 'port' argument for the source server. */
private IntegerArgument portSourceArg;
/** The 'hostName' argument for the destination server. */
private StringArgument hostNameDestinationArg;
/** The 'port' argument for the destination server. */
private IntegerArgument portDestinationArg;
/** The 'suffixes' global argument. */
StringArgument baseDNsArg;
/**The 'quiet' argument. */
private BooleanArgument quietArg;
/**The 'scriptFriendly' argument. */
BooleanArgument scriptFriendlyArg;
/**Properties file argument. */
StringArgument propertiesFileArgument;
/**No-properties file argument. */
BooleanArgument noPropertiesFileArgument;
/**
* The argument that the user must set to display the equivalent
* non-interactive mode argument.
*/
BooleanArgument displayEquivalentArgument;
/**
* The argument that allows the user to dump the equivalent non-interactive
* command to a file.
*/
StringArgument equivalentCommandFileArgument;
/** The argument that the user must set to have advanced options in interactive mode. */
BooleanArgument advancedArg;
/**
* The argument set by the user to specify the configuration class
* (useful when dsreplication purge-historical runs locally).
*/
private StringArgument configClassArg;
/**
* The argument set by the user to specify the configuration file
* (useful when dsreplication purge-historical runs locally).
*/
private StringArgument configFileArg;
TaskScheduleArgs taskArgs;
/** The 'maximumDuration' argument for the purge of historical. */
IntegerArgument maximumDurationArg;
/** the 'change-number' argument for task reset-changenumber. */
IntegerArgument resetChangeNumber;
/** The text of the enable replication subcommand. */
static final String ENABLE_REPLICATION_SUBCMD_NAME = "enable";
/** The text of the disable replication subcommand. */
static final String DISABLE_REPLICATION_SUBCMD_NAME = "disable";
/** The text of the initialize replication subcommand. */
static final String INITIALIZE_REPLICATION_SUBCMD_NAME = "initialize";
/** The text of the initialize all replication subcommand. */
public static final String INITIALIZE_ALL_REPLICATION_SUBCMD_NAME = "initialize-all";
/** The text of the pre external initialization subcommand. */
static final String PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME = "pre-external-initialization";
/** The text of the initialize all replication subcommand. */
static final String POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME = "post-external-initialization";
/** The text of the reset changenumber subcommand. */
static final String RESET_CHANGE_NUMBER_SUBCMD_NAME = "reset-change-number";
/** The text of the status replication subcommand. */
static final String STATUS_REPLICATION_SUBCMD_NAME = "status";
/** The text of the purge historical subcommand. */
static final String PURGE_HISTORICAL_SUBCMD_NAME = "purge-historical";
/** This CLI is always using the administration connector with SSL. */
private static final boolean alwaysSSL = true;
/**
* Creates a new instance of this argument parser with no arguments.
*
* @param mainClassName
* The fully-qualified name of the Java class that should
* be invoked to launch the program with which this
* argument parser is associated.
*/
ReplicationCliArgumentParser(String mainClassName)
{
super(mainClassName,
INFO_REPLICATION_TOOL_DESCRIPTION.get(ENABLE_REPLICATION_SUBCMD_NAME, INITIALIZE_REPLICATION_SUBCMD_NAME),
false);
setShortToolDescription(REF_SHORT_DESC_DSREPLICATION.get());
setVersionHandler(new DirectoryServerVersionHandler());
}
/**
* Initialize the parser with the Global options and subcommands.
*
* @param outStream
* The output stream to use for standard output, or {@code null}
* if standard output is not needed.
* @throws ArgumentException
* If there is a problem with any of the parameters used to create this argument.
*/
void initializeParser(OutputStream outStream)
throws ArgumentException
{
taskArgs = new TaskScheduleArgs();
initializeGlobalArguments(outStream);
try
{
defaultAdminPort = secureArgsList.getAdminPortFromConfig();
}
catch (Throwable t)
{
// Ignore
}
createEnableReplicationSubCommand();
createDisableReplicationSubCommand();
createRelatedServersOptions();
createInitializeReplicationSubCommand();
createInitializeAllReplicationSubCommand();
createPreExternalInitializationSubCommand();
createPostExternalInitializationSubCommand();
createResetChangeNumberSubCommand();
createStatusReplicationSubCommand();
createPurgeHistoricalSubCommand();
}
/**
* Checks all the options parameters and updates the provided LocalizableMessageBuilder
* with the errors that where encountered.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
void validateOptions(LocalizableMessageBuilder buf)
{
validateGlobalOptions(buf);
validateSubcommandOptions(buf);
}
/** {@inheritDoc} */
@Override
public int validateGlobalOptions(LocalizableMessageBuilder buf)
{
int returnValue;
super.validateGlobalOptions(buf);
ArrayList<LocalizableMessage> errors = new ArrayList<>();
if (secureArgsList.bindPasswordArg.isPresent() &&
secureArgsList.bindPasswordFileArg.isPresent()) {
LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
secureArgsList.bindPasswordArg.getLongIdentifier(),
secureArgsList.bindPasswordFileArg.getLongIdentifier());
errors.add(message);
}
// Check that we can write on the provided path where we write the
// equivalent non-interactive commands.
if (equivalentCommandFileArgument.isPresent())
{
String file = equivalentCommandFileArgument.getValue();
if (!canWrite(file))
{
errors.add(ERR_REPLICATION_CANNOT_WRITE_EQUIVALENT_COMMAND_LINE_FILE.get(file));
}
else
{
File f = new File(file);
if (f.isDirectory())
{
errors.add(
ERR_REPLICATION_EQUIVALENT_COMMAND_LINE_FILE_DIRECTORY.get(file));
}
}
}
if (noPromptArg.isPresent() && advancedArg.isPresent())
{
LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
noPromptArg.getLongIdentifier(),
advancedArg.getLongIdentifier());
errors.add(message);
}
if (!isInteractive())
{
// Check that we have the required data
if (!baseDNsArg.isPresent() &&
!isStatusReplicationSubcommand() &&
!isResetChangeNumber() &&
!disableAllArg.isPresent() &&
!disableReplicationServerArg.isPresent())
{
errors.add(ERR_REPLICATION_NO_BASE_DN_PROVIDED.get());
}
if (getBindPasswordAdmin() == null &&
!isPurgeHistoricalSubcommand())
{
errors.add(ERR_REPLICATION_NO_ADMINISTRATOR_PASSWORD_PROVIDED.get(
"--"+secureArgsList.bindPasswordArg.getLongIdentifier(),
"--"+secureArgsList.bindPasswordFileArg.getLongIdentifier()));
}
}
if (baseDNsArg.isPresent())
{
LinkedList<String> baseDNs = baseDNsArg.getValues();
for (String dn : baseDNs)
{
if (!isDN(dn))
{
errors.add(ERR_REPLICATION_NOT_A_VALID_BASEDN.get(dn));
}
if (dn.equalsIgnoreCase(Constants.REPLICATION_CHANGES_DN))
{
errors.add(ERR_REPLICATION_NOT_A_USER_SUFFIX.get(Constants.REPLICATION_CHANGES_DN));
}
}
}
if (!errors.isEmpty())
{
for (LocalizableMessage error : errors)
{
addMessage(buf, error);
}
}
if (buf.length() > 0)
{
returnValue = ReplicationCliReturnCode.CONFLICTING_ARGS.getReturnCode();
}
else
{
returnValue = ReplicationCliReturnCode.SUCCESSFUL_NOP.getReturnCode();
}
return returnValue;
}
/**
* Initialize Global option.
*
* @param outStream
* The output stream used for the usage.
* @throws ArgumentException
* If there is a problem with any of the parameters used
* to create this argument.
*/
private void initializeGlobalArguments(OutputStream outStream)
throws ArgumentException
{
ArrayList<Argument> defaultArgs = new ArrayList<>(createGlobalArguments(outStream, alwaysSSL));
Argument[] argsToRemove = {
secureArgsList.hostNameArg,
secureArgsList.portArg,
secureArgsList.bindDnArg,
secureArgsList.bindPasswordFileArg,
secureArgsList.bindPasswordArg
};
for (Argument arg : argsToRemove)
{
defaultArgs.remove(arg);
}
defaultArgs.remove(super.noPropertiesFileArg);
defaultArgs.remove(super.propertiesFileArg);
// Remove it from the default location and redefine it.
defaultArgs.remove(getAdminUidArg());
int index = 0;
baseDNsArg = new StringArgument("baseDNs", OPTION_SHORT_BASEDN,
OPTION_LONG_BASEDN, false, true, true, INFO_BASEDN_PLACEHOLDER.get(),
null,
null, INFO_DESCRIPTION_REPLICATION_BASEDNS.get());
baseDNsArg.setPropertyName(OPTION_LONG_BASEDN);
defaultArgs.add(index++, baseDNsArg);
secureArgsList.adminUidArg = new StringArgument("adminUID", 'I',
OPTION_LONG_ADMIN_UID, false, false, true,
INFO_ADMINUID_PLACEHOLDER.get(),
Constants.GLOBAL_ADMIN_UID, null,
INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get(
ENABLE_REPLICATION_SUBCMD_NAME));
getAdminUidArg().setPropertyName(OPTION_LONG_ADMIN_UID);
getAdminUidArg().setHidden(false);
defaultArgs.add(index++, getAdminUidArg());
secureArgsList.bindPasswordArg = new StringArgument(
OPTION_LONG_ADMIN_PWD.toLowerCase(),
OPTION_SHORT_BINDPWD, OPTION_LONG_ADMIN_PWD, false, false, true,
INFO_BINDPWD_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get());
defaultArgs.add(index++, secureArgsList.bindPasswordArg);
secureArgsList.bindPasswordFileArg = new FileBasedArgument(
OPTION_LONG_ADMIN_PWD_FILE.toLowerCase(),
OPTION_SHORT_BINDPWD_FILE, OPTION_LONG_ADMIN_PWD_FILE, false, false,
INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get());
defaultArgs.add(index++, secureArgsList.bindPasswordFileArg);
defaultArgs.remove(verboseArg);
quietArg = CommonArguments.getQuiet();
defaultArgs.add(index++, quietArg);
noPromptArg = CommonArguments.getNoPrompt();
defaultArgs.add(index++, noPromptArg);
displayEquivalentArgument = CommonArguments.getDisplayEquivalentCommand();
defaultArgs.add(index++, displayEquivalentArgument);
equivalentCommandFileArgument =
CommonArguments
.getEquivalentCommandFile(
INFO_REPLICATION_DESCRIPTION_EQUIVALENT_COMMAND_FILE_PATH.get());
defaultArgs.add(index++, equivalentCommandFileArgument);
advancedArg = CommonArguments.getAdvancedMode();
defaultArgs.add(index++, advancedArg);
configClassArg =
CommonArguments.getConfigClass(ConfigFileHandler.class.getName());
defaultArgs.add(index++, configClassArg);
configFileArg = CommonArguments.getConfigFile();
defaultArgs.add(index++, configFileArg);
for (int i=0; i<index; i++)
{
Argument arg = defaultArgs.get(i);
arg.setPropertyName(arg.getLongIdentifier());
}
this.propertiesFileArgument = CommonArguments.getPropertiesFile();
defaultArgs.add(this.propertiesFileArgument);
setFilePropertiesArgument(this.propertiesFileArgument);
this.noPropertiesFileArgument = CommonArguments.getNoPropertiesFile();
defaultArgs.add(this.noPropertiesFileArgument);
setNoPropertiesFileArgument(this.noPropertiesFileArgument);
initializeGlobalArguments(defaultArgs, null);
}
/**
* Initialize the global options with the provided set of arguments.
* @param args the arguments to use to initialize the global options.
* @param argGroup the group to which args will be added.
* @throws ArgumentException if there is a conflict with the provided
* arguments.
*/
@Override
protected void initializeGlobalArguments(
Collection<Argument> args,
ArgumentGroup argGroup)
throws ArgumentException
{
for (Argument arg : args)
{
if (arg == advancedArg)
{
ArgumentGroup toolOptionsGroup = new ArgumentGroup(
INFO_DESCRIPTION_CONFIG_OPTIONS_ARGS.get(), 2);
addGlobalArgument(advancedArg, toolOptionsGroup);
}
else
{
addGlobalArgument(arg, argGroup);
}
}
// Set the propertiesFile argument
setFilePropertiesArgument(propertiesFileArg);
}
/**
* Creates the enable replication subcommand and all the specific options
* for the subcommand.
*/
private void createEnableReplicationSubCommand() throws ArgumentException
{
createServerArgs1();
createServerArgs2();
skipPortCheckArg = new BooleanArgument(
"skipportcheck", 'S', "skipPortCheck",
INFO_DESCRIPTION_ENABLE_REPLICATION_SKIPPORT.get());
noSchemaReplicationArg = new BooleanArgument(
"noschemareplication", null, "noSchemaReplication",
INFO_DESCRIPTION_ENABLE_REPLICATION_NO_SCHEMA_REPLICATION.get());
useSecondServerAsSchemaSourceArg = new BooleanArgument(
"usesecondserverasschemasource", null, "useSecondServerAsSchemaSource",
INFO_DESCRIPTION_ENABLE_REPLICATION_USE_SECOND_AS_SCHEMA_SOURCE.get(
"--"+noSchemaReplicationArg.getLongIdentifier()));
enableReplicationSubCmd = new SubCommand(this,
ENABLE_REPLICATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_ENABLE_REPLICATION.get());
Argument[] argsToAdd = {
server1.hostNameArg, server1.portArg, server1.bindDnArg, server1.bindPasswordArg,
server1.bindPasswordFileArg, server1.replicationPortArg, server1.secureReplicationArg,
server1.noReplicationServerArg, server1.onlyReplicationServerArg,
server2.hostNameArg, server2.portArg, server2.bindDnArg, server2.bindPasswordArg,
server2.bindPasswordFileArg, server2.replicationPortArg, server2.secureReplicationArg,
server2.noReplicationServerArg, server2.onlyReplicationServerArg,
skipPortCheckArg, noSchemaReplicationArg, useSecondServerAsSchemaSourceArg
};
for (Argument arg : argsToAdd)
{
arg.setPropertyName(arg.getLongIdentifier());
enableReplicationSubCmd.addArgument(arg);
}
}
private void createServerArgs1() throws ArgumentException
{
ServerArgs server = server1;
server.hostNameArg = new StringArgument("host1", OPTION_SHORT_HOST,
"host1", false, false, true, INFO_HOST_PLACEHOLDER.get(),
getDefaultHostValue(),
null, INFO_DESCRIPTION_ENABLE_REPLICATION_HOST1.get());
server.portArg = new IntegerArgument("port1", OPTION_SHORT_PORT, "port1",
false, false, true, INFO_PORT_PLACEHOLDER.get(),
defaultAdminPort, null,
true, 1,
true, 65336,
INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT1.get());
server.bindDnArg = new StringArgument("bindDN1", OPTION_SHORT_BINDDN,
"bindDN1", false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
"cn=Directory Manager", null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN1.get());
server.bindPasswordArg = new StringArgument("bindPassword1",
null, "bindPassword1", false, false, true,
INFO_BINDPWD_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD1.get());
server.bindPasswordFileArg = new FileBasedArgument("bindPasswordFile1",
null, "bindPasswordFile1", false, false,
INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE1.get());
server.replicationPortArg = new IntegerArgument("replicationPort1", 'r',
"replicationPort1", false, false, true, INFO_PORT_PLACEHOLDER.get(),
8989, null,
true, 1,
true, 65336,
INFO_DESCRIPTION_ENABLE_REPLICATION_PORT1.get());
server.secureReplicationArg = new BooleanArgument("secureReplication1", null,
"secureReplication1",
INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION1.get());
server.noReplicationServerArg = new BooleanArgument(
"noreplicationserver1", null, "noReplicationServer1",
INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER1.get());
server.onlyReplicationServerArg = new BooleanArgument(
"onlyreplicationserver1", null, "onlyReplicationServer1",
INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER1.get());
}
private void createServerArgs2() throws ArgumentException
{
ServerArgs server = server2;
server.hostNameArg = new StringArgument("host2", 'O',
"host2", false, false, true, INFO_HOST_PLACEHOLDER.get(),
getDefaultHostValue(),
null, INFO_DESCRIPTION_ENABLE_REPLICATION_HOST2.get());
server.portArg = new IntegerArgument("port2", null, "port2",
false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort, null,
true, 1,
true, 65336,
INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT2.get());
server.bindDnArg = new StringArgument("bindDN2", null,
"bindDN2", false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
"cn=Directory Manager", null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN2.get());
server.bindPasswordArg = new StringArgument("bindPassword2",
null, "bindPassword2", false, false, true,
INFO_BINDPWD_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD2.get());
server.bindPasswordFileArg = new FileBasedArgument("bindPasswordFile2",
'F', "bindPasswordFile2", false, false,
INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE2.get());
server.replicationPortArg = new IntegerArgument("replicationPort2", 'R',
"replicationPort2", false, false, true, INFO_PORT_PLACEHOLDER.get(),
8989, null,
true, 1,
true, 65336,
INFO_DESCRIPTION_ENABLE_REPLICATION_PORT2.get());
server.secureReplicationArg = new BooleanArgument("secureReplication2", null,
"secureReplication2",
INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION2.get());
server.noReplicationServerArg = new BooleanArgument(
"noreplicationserver2", null, "noReplicationServer2",
INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER2.get());
server.onlyReplicationServerArg = new BooleanArgument(
"onlyreplicationserver2", null, "onlyReplicationServer2",
INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER2.get());
}
/**
* Creates the disable replication subcommand and all the specific options
* for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createDisableReplicationSubCommand()
throws ArgumentException
{
disableReplicationSubCmd = new SubCommand(this,
DISABLE_REPLICATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_DISABLE_REPLICATION.get());
secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
secureArgsList.bindDnArg = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
OPTION_LONG_BINDDN, false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
"cn=Directory Manager", OPTION_LONG_BINDDN,
INFO_DESCRIPTION_DISABLE_REPLICATION_BINDDN.get());
disableReplicationServerArg = new BooleanArgument(
"disablereplicationserver", null, "disableReplicationServer",
INFO_DESCRIPTION_DISABLE_REPLICATION_SERVER.get());
disableAllArg = new BooleanArgument(
"disableall", 'a', "disableAll",
INFO_DESCRIPTION_DISABLE_ALL.get());
Argument[] argsToAdd = { secureArgsList.hostNameArg,
secureArgsList.portArg, secureArgsList.bindDnArg,
disableReplicationServerArg, disableAllArg};
for (Argument arg : argsToAdd)
{
disableReplicationSubCmd.addArgument(arg);
}
}
/**
* Creates the initialize replication subcommand and all the specific options
* for the subcommand.
*/
private void createInitializeReplicationSubCommand() throws ArgumentException
{
initializeReplicationSubCmd = new SubCommand(this, INITIALIZE_REPLICATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_INITIALIZE_REPLICATION.get(INITIALIZE_ALL_REPLICATION_SUBCMD_NAME));
Argument[] argsToAdd = {
hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg
};
setSubCommandArguments(initializeReplicationSubCmd, argsToAdd);
}
private void createRelatedServersOptions() throws ArgumentException
{
hostNameSourceArg = new StringArgument("hostSource", OPTION_SHORT_HOST,
"hostSource", false, false, true, INFO_HOST_PLACEHOLDER.get(),
getDefaultHostValue(), null,
INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_SOURCE.get());
portSourceArg = new IntegerArgument("portSource", OPTION_SHORT_PORT,
"portSource", false, false, true, INFO_PORT_PLACEHOLDER.get(),
defaultAdminPort, null,
true, 1,
true, 65336,
INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_SOURCE.get());
hostNameDestinationArg = new StringArgument("hostDestination", 'O',
"hostDestination", false, false, true, INFO_HOST_PLACEHOLDER.get(),
getDefaultHostValue(), null,
INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_DESTINATION.get());
portDestinationArg = new IntegerArgument("portDestination", null,
"portDestination", false, false, true, INFO_PORT_PLACEHOLDER.get(),
defaultAdminPort,
null,
true, 1,
true, 65336,
INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_DESTINATION.get());
}
/**
* Creates the initialize all replication subcommand and all the specific
* options for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createInitializeAllReplicationSubCommand()
throws ArgumentException
{
initializeAllReplicationSubCmd = new SubCommand(this,
INITIALIZE_ALL_REPLICATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_INITIALIZE_ALL_REPLICATION.get(
INITIALIZE_REPLICATION_SUBCMD_NAME));
secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
Argument[] argsToAdd = { secureArgsList.hostNameArg,
secureArgsList.portArg };
for (Argument arg : argsToAdd)
{
initializeAllReplicationSubCmd.addArgument(arg);
}
}
/**
* Creates the subcommand that the user must launch before doing an external
* initialization of the topology ( and all the specific
* options for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createPreExternalInitializationSubCommand()
throws ArgumentException
{
preExternalInitializationSubCmd = new SubCommand(this,
PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_PRE_EXTERNAL_INITIALIZATION.get(
POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME));
secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
BooleanArgument externalInitializationLocalOnlyArg = new BooleanArgument(
"local-only",
'l',
"local-only",
LocalizableMessage.EMPTY);
externalInitializationLocalOnlyArg.setHidden(true);
Argument[] argsToAdd = { secureArgsList.hostNameArg,
secureArgsList.portArg,
externalInitializationLocalOnlyArg};
for (Argument arg : argsToAdd)
{
preExternalInitializationSubCmd.addArgument(arg);
}
}
/**
* Creates the subcommand that the user must launch after doing an external
* initialization of the topology ( and all the specific
* options for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createPostExternalInitializationSubCommand()
throws ArgumentException
{
postExternalInitializationSubCmd = new SubCommand(this,
POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_POST_EXTERNAL_INITIALIZATION.get(
PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME));
secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
Argument[] argsToAdd = { secureArgsList.hostNameArg,
secureArgsList.portArg };
for (Argument arg : argsToAdd)
{
postExternalInitializationSubCmd.addArgument(arg);
}
}
private void createResetChangeNumberSubCommand() throws ArgumentException
{
resetChangelogNumber = new SubCommand(this, RESET_CHANGE_NUMBER_SUBCMD_NAME,
INFO_DESCRIPTION_RESET_CHANGE_NUMBER.get());
resetChangeNumber = newChangeNumberArgument();
Argument[] argsToAdd = {
hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg, resetChangeNumber
};
setSubCommandArguments(resetChangelogNumber, argsToAdd);
}
private void setSubCommandArguments(SubCommand subCommand, Argument[] argsToAdd) throws ArgumentException
{
for (Argument arg : argsToAdd)
{
arg.setPropertyName(arg.getLongIdentifier());
subCommand.addArgument(arg);
}
}
IntegerArgument newChangeNumberArgument() throws ArgumentException
{
return new IntegerArgument("change-number", null, "change-number",
false, true, INFO_CHANGE_NUMBER_PLACEHOLDER.get(), INFO_DESCRIPTION_START_CHANGE_NUMBER.get());
}
/**
* Creates the status replication subcommand and all the specific options
* for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createStatusReplicationSubCommand() throws ArgumentException
{
statusReplicationSubCmd = new SubCommand(this,
STATUS_REPLICATION_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_STATUS_REPLICATION.get());
scriptFriendlyArg = new BooleanArgument(
"script-friendly",
's',
"script-friendly",
INFO_DESCRIPTION_SCRIPT_FRIENDLY.get());
scriptFriendlyArg.setPropertyName(scriptFriendlyArg.getLongIdentifier());
secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
Argument[] argsToAdd = { secureArgsList.hostNameArg,
secureArgsList.portArg, scriptFriendlyArg };
for (Argument arg : argsToAdd)
{
statusReplicationSubCmd.addArgument(arg);
}
}
/**
* Creates the purge historical subcommand and all the specific options
* for the subcommand. Note: this method assumes that
* initializeGlobalArguments has already been called and that hostNameArg and
* portArg have been created.
*/
private void createPurgeHistoricalSubCommand()
throws ArgumentException
{
maximumDurationArg = new IntegerArgument(
"maximumDuration",
null, // shortId
"maximumDuration",
true, // isRequired
false, // isMultivalued
true, // needsValue
INFO_MAXIMUM_DURATION_PLACEHOLDER.get(),
PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION,
null,
true, 0,
false, Integer.MAX_VALUE,
INFO_DESCRIPTION_PURGE_HISTORICAL_MAXIMUM_DURATION.get());
purgeHistoricalSubCmd = new SubCommand(
this,
PURGE_HISTORICAL_SUBCMD_NAME,
INFO_DESCRIPTION_SUBCMD_PURGE_HISTORICAL.get());
Argument[] argsToAdd = {
secureArgsList.hostNameArg,
secureArgsList.portArg,
maximumDurationArg};
for (Argument arg : argsToAdd)
{
arg.setPropertyName(arg.getLongIdentifier());
purgeHistoricalSubCmd.addArgument(arg);
}
for (Argument arg : taskArgs.getArguments())
{
purgeHistoricalSubCmd.addArgument(arg);
}
}
/**
* Tells whether the user specified to have an interactive operation or not.
* This method must be called after calling parseArguments.
* @return {@code true} if the user specified to have an interactive
* operation and {@code false} otherwise.
*/
public boolean isInteractive()
{
return !noPromptArg.isPresent();
}
/**
* Tells whether the user specified to have a quite operation or not.
* This method must be called after calling parseArguments.
* @return {@code true} if the user specified to have a quite operation
* and {@code false} otherwise.
*/
public boolean isQuiet()
{
return quietArg.isPresent();
}
/**
* Tells whether the user specified to have a script-friendly output or not.
* This method must be called after calling parseArguments.
* @return {@code true} if the user specified to have a script-friendly
* output and {@code false} otherwise.
*/
public boolean isScriptFriendly()
{
return scriptFriendlyArg.isPresent();
}
/**
* Get the global administrator password which has to be used for the command
* to connect to the server(s) without prompting the user. If no password was
* specified, return null.
*
* @return the global administrator password which has to be used for the
* command to connect to the server(s) without prompting the user. If no
* password was specified, return null.
*/
public String getBindPasswordAdmin()
{
return getBindPassword(secureArgsList.bindPasswordArg, secureArgsList.bindPasswordFileArg);
}
/**
* Returns the Administrator UID explicitly provided in the command-line.
* @return the Administrator UID explicitly provided in the command-line.
*/
@Override
public String getAdministratorUID()
{
return getValue(getAdminUidArg());
}
/**
* Returns the default Administrator UID value.
* @return the default Administrator UID value.
*/
public String getAdministratorUIDOrDefault()
{
return getValueOrDefault(getAdminUidArg());
}
/**
* Returns the Administrator UID argument.
* @return the Administrator UID argument.
*/
StringArgument getAdminUidArg()
{
return secureArgsList.adminUidArg;
}
/**
* Returns the first server replication port explicitly provided in the enable
* replication subcommand.
* @return the first server replication port explicitly provided in the enable
* replication subcommand. Returns -1 if no port was explicitly provided.
*/
public int getReplicationPort1()
{
return getValue(server1.replicationPortArg);
}
/**
* Returns the second server replication port explicitly provided in the
* enable replication subcommand.
* @return the second server replication port explicitly provided in the
* enable replication subcommand. Returns -1 if no port was explicitly
* provided.
*/
public int getReplicationPort2()
{
return getValue(server2.replicationPortArg);
}
/**
* Returns whether the user asked to skip the replication port checks (if the
* ports are free) or not.
* @return {@code true} the user asked to skip the replication port
* checks (if the ports are free) and {@code false} otherwise.
*/
boolean skipReplicationPortCheck()
{
return skipPortCheckArg.isPresent();
}
/**
* Returns whether the user asked to not replicate the schema between servers.
* @return {@code true} if the user asked to not replicate schema and
* {@code false} otherwise.
*/
boolean noSchemaReplication()
{
return noSchemaReplicationArg.isPresent();
}
/**
* Returns whether the user asked to use the second server to initialize the
* schema of the first server.
* @return {@code true} if the user asked to use the second server to
* initialize the schema of the first server and {@code false} otherwise.
*/
boolean useSecondServerAsSchemaSource()
{
return useSecondServerAsSchemaSourceArg.isPresent();
}
/**
* Returns the host name explicitly provided in the disable replication
* subcommand.
* @return the host name explicitly provided in the disable replication
* subcommand.
*/
public String getHostNameToDisable()
{
return getValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name default value in the disable replication
* subcommand.
* @return the host name default value in the disable replication
* subcommand.
*/
public String getHostNameToDisableOrDefault()
{
return getValueOrDefault(secureArgsList.hostNameArg);
}
/**
* Returns the server bind dn explicitly provided in the disable replication
* subcommand.
* @return the server bind dn explicitly provided in the disable replication
* subcommand.
*/
public String getBindDNToDisable()
{
return getValue(secureArgsList.bindDnArg);
}
/**
* Returns the server bind dn default value in the disable replication
* subcommand.
* @return the server bind dn default value in the enable replication
* subcommand.
*/
public String getDefaultBindDnToDisable()
{
return getDefaultValue(secureArgsList.bindDnArg);
}
/**
* Returns the host name explicitly provided in the status replication
* subcommand.
* @return the host name explicitly provided in the status replication
* subcommand.
*/
public String getHostNameToStatus()
{
return getValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name default value in the status replication subcommand.
* @return the host name default value in the status replication subcommand.
*/
public String getHostNameToStatusOrDefault()
{
return getValueOrDefault(secureArgsList.hostNameArg);
}
/**
* Returns the host name explicitly provided in the initialize all replication
* subcommand.
* @return the host name explicitly provided in the initialize all replication
* subcommand.
*/
public String getHostNameToInitializeAll()
{
return getValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name default value in the initialize all replication
* subcommand.
* @return the host name default value in the initialize all replication
* subcommand.
*/
public String getHostNameToInitializeAllOrDefault()
{
return getValueOrDefault(secureArgsList.hostNameArg);
}
/**
* Returns the host name explicitly provided in the pre external
* initialization subcommand.
* @return the host name explicitly provided in the pre external
* initialization subcommand.
*/
public String getHostNameToPreExternalInitialization()
{
return getValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name default value in the pre external initialization
* subcommand.
* @return the host name default value in the pre external initialization
* subcommand.
*/
public String getDefaultHostNameToPreExternalInitialization()
{
return getDefaultValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name explicitly provided in the post external
* initialization subcommand.
* @return the host name explicitly provided in the post external
* initialization subcommand.
*/
public String getHostNameToPostExternalInitialization()
{
return getValue(secureArgsList.hostNameArg);
}
/**
* Returns the host name default value in the post external initialization
* subcommand.
* @return the host name default value in the post external initialization
* subcommand.
*/
public String getDefaultHostNameToPostExternalInitialization()
{
return getDefaultValue(secureArgsList.hostNameArg);
}
/**
* Returns the source host name explicitly provided in the initialize
* replication subcommand.
* @return the source host name explicitly provided in the initialize
* replication subcommand.
*/
public String getHostNameSource()
{
return getValue(hostNameSourceArg);
}
/**
* Returns the first host name default value in the initialize replication
* subcommand.
* @return the first host name default value in the initialize replication
* subcommand.
*/
public String getHostNameSourceOrDefault()
{
return getValueOrDefault(hostNameSourceArg);
}
/**
* Returns the destination host name explicitly provided in the initialize
* replication subcommand.
* @return the destination host name explicitly provided in the initialize
* replication subcommand.
*/
public String getHostNameDestination()
{
return getValue(hostNameDestinationArg);
}
/**
* Returns the destination host name default value in the initialize
* replication subcommand.
* @return the destination host name default value in the initialize
* replication subcommand.
*/
public String getHostNameDestinationOrDefault()
{
return getValueOrDefault(hostNameDestinationArg);
}
/**
* Returns the source server port explicitly provided in the initialize
* replication subcommand.
* @return the source server port explicitly provided in the initialize
* replication subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortSource()
{
return getValue(portSourceArg);
}
/**
* Returns the source server port default value in the initialize replication
* subcommand.
* @return the source server port default value in the initialize replication
* subcommand.
*/
public int getPortSourceOrDefault()
{
return getValueOrDefault(portSourceArg);
}
/**
* Returns the destination server port explicitly provided in the initialize
* replication subcommand.
* @return the destination server port explicitly provided in the initialize
* replication subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortDestination()
{
return getValue(portDestinationArg);
}
/**
* Returns the destination server port default value in the initialize
* replication subcommand.
* @return the destination server port default value in the initialize
* replication subcommand.
*/
public int getPortDestinationOrDefault()
{
return getValueOrDefault(portDestinationArg);
}
/**
* Returns the server port explicitly provided in the disable replication
* subcommand.
* @return the server port explicitly provided in the disable replication
* subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortToDisable()
{
return getValue(secureArgsList.portArg);
}
/**
* Returns the server port default value in the disable replication
* subcommand.
* @return the server port default value in the disable replication
* subcommand.
*/
public int getPortToDisableOrDefault()
{
return getValueOrDefault(secureArgsList.portArg);
}
/**
* Returns the server port explicitly provided in the initialize all
* replication subcommand.
* @return the server port explicitly provided in the initialize all
* replication subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortToInitializeAll()
{
return getValue(secureArgsList.portArg);
}
/**
* Returns the server port default value in the initialize all replication
* subcommand.
* @return the server port default value in the initialize all replication
* subcommand.
*/
public int getPortToInitializeAllOrDefault()
{
return getValueOrDefault(secureArgsList.portArg);
}
/**
* Returns the server port explicitly provided in the pre external
* initialization subcommand.
* @return the server port explicitly provided in the pre external
* initialization subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortToPreExternalInitialization()
{
return getValue(secureArgsList.portArg);
}
/**
* Returns the server port default value in the pre external initialization
* subcommand.
* @return the server port default value in the pre external initialization
* subcommand.
*/
public int getDefaultPortToPreExternalInitialization()
{
return getDefaultValue(secureArgsList.portArg);
}
/**
* Returns the server port explicitly provided in the post external
* initialization subcommand.
* @return the server port explicitly provided in the post external
* initialization subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortToPostExternalInitialization()
{
return getValue(secureArgsList.portArg);
}
/**
* Returns the server port default value in the post external initialization
* subcommand.
* @return the server port default value in the post external initialization
* subcommand.
*/
public int getDefaultPortToPostExternalInitialization()
{
return getDefaultValue(secureArgsList.portArg);
}
/**
* Returns the server port explicitly provided in the status replication
* subcommand.
* @return the server port explicitly provided in the status replication
* subcommand. Returns -1 if no port was explicitly provided.
*/
public int getPortToStatus()
{
return getValue(secureArgsList.portArg);
}
/**
* Returns the server port default value in the status replication subcommand.
* @return the server port default value in the status replication subcommand.
*/
public int getPortToStatusOrDefault()
{
return getValueOrDefault(secureArgsList.portArg);
}
/**
* Returns the list of base DNs provided by the user.
* @return the list of base DNs provided by the user.
*/
public LinkedList<String> getBaseDNs()
{
return baseDNsArg.getValues();
}
/**
* Returns the config class value provided in the hidden argument of the
* command-line.
* @return the config class value provided in the hidden argument of the
* command-line.
*/
public String getConfigClass()
{
return getValue(configClassArg);
}
/**
* Returns the config file value provided in the hidden argument of the
* command-line.
* @return the config file value provided in the hidden argument of the
* command-line.
*/
public String getConfigFile()
{
return getValue(configFileArg);
}
/**
* Returns the argument's value if present or else return the argument's default value.
*
* @param arg the argument
* @return the argument's value if present, the argument's default value if not present
*/
static String getValueOrDefault(StringArgument arg)
{
String v = getValue(arg);
String defaultValue = getDefaultValue(arg);
return v != null ? v : defaultValue;
}
/**
* Returns the argument's value if present or else return the argument's default value.
*
* @param arg the argument
* @return the argument's value if present, the argument's default value if not present
*/
static int getValueOrDefault(IntegerArgument arg)
{
int v = getValue(arg);
int defaultValue = getDefaultValue(arg);
return v != -1 ? v : defaultValue;
}
/**
* Returns the value of the provided argument only if the user provided it
* explicitly.
* @param arg the StringArgument to be handled.
* @return the value of the provided argument only if the user provided it
* explicitly.
*/
static String getValue(StringArgument arg)
{
return arg.isPresent() ? arg.getValue() : null;
}
/**
* Returns the default value of the provided argument.
* @param arg the StringArgument to be handled.
* @return the default value of the provided argument.
*/
static String getDefaultValue(StringArgument arg)
{
return arg.getDefaultValue();
}
/**
* Returns the value of the provided argument only if the user provided it
* explicitly.
* @param arg the StringArgument to be handled.
* @return the value of the provided argument only if the user provided it
* explicitly.
*/
static int getValue(IntegerArgument arg)
{
if (arg.isPresent())
{
try
{
return arg.getIntValue();
}
catch (ArgumentException ae)
{
// This is a bug
throw new IllegalStateException(
"There was an argument exception calling "+
"ReplicationCliParser.getValue(). This appears to be a bug "+
"because this method should be called after calling "+
"parseArguments which should result in an error.", ae);
}
}
return -1;
}
/**
* Returns the default value of the provided argument.
* @param arg the StringArgument to be handled.
* @return the default value of the provided argument.
*/
static int getDefaultValue(IntegerArgument arg)
{
String v = arg.getDefaultValue();
return v != null ? Integer.parseInt(v) : -1;
}
/**
* Checks the subcommand options and updates the provided LocalizableMessageBuilder
* with the errors that were encountered with the subcommand options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validateSubcommandOptions(LocalizableMessageBuilder buf)
{
if (isEnableReplicationSubcommand())
{
validateEnableReplicationOptions(buf);
}
else if (isDisableReplicationSubcommand())
{
validateDisableReplicationOptions(buf);
}
else if (isStatusReplicationSubcommand())
{
validateStatusReplicationOptions(buf);
}
else if (isInitializeReplicationSubcommand())
{
validateSourceAndDestinationServersOptions(buf);
}
else if (isPurgeHistoricalSubcommand())
{
validatePurgeHistoricalOptions(buf);
}
else if (isResetChangeNumber())
{
validateSourceAndDestinationServersOptions(buf);
}
}
/**
* Checks the purge historical subcommand options and updates the
* provided LocalizableMessageBuilder with the errors that were encountered with the
* subcommand options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validatePurgeHistoricalOptions(LocalizableMessageBuilder buf)
{
try
{
if (!isInteractive() && !connectionArgumentsPresent())
{
taskArgs.validateArgsIfOffline();
}
else
{
taskArgs.validateArgs();
}
}
catch (ClientException | ArgumentException e)
{
addMessage(buf, e.getMessageObject());
}
}
/**
* Returns whether the user provided subcommand is the enable replication
* or not.
* @return {@code true} if the user provided subcommand is the
* enable replication and {@code false} otherwise.
*/
public boolean isEnableReplicationSubcommand()
{
return isSubcommand(ENABLE_REPLICATION_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the disable replication
* or not.
* @return {@code true} if the user provided subcommand is the
* disable replication and {@code false} otherwise.
*/
public boolean isDisableReplicationSubcommand()
{
return isSubcommand(DISABLE_REPLICATION_SUBCMD_NAME);
}
/**
* Returns whether the user specified the reset changelog numbering subcommand.
* @return {@code true} if the user wanted to reset change number
*/
public boolean isResetChangeNumber()
{
return isSubcommand(RESET_CHANGE_NUMBER_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the status replication
* or not.
* @return {@code true} if the user provided subcommand is the
* status replication and {@code false} otherwise.
*/
public boolean isStatusReplicationSubcommand()
{
return isSubcommand(STATUS_REPLICATION_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the purge historical
* or not.
* @return {@code true} if the user provided subcommand is the
* purge historical and {@code false} otherwise.
*/
public boolean isPurgeHistoricalSubcommand()
{
return isSubcommand(PURGE_HISTORICAL_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the initialize all
* replication or not.
* @return {@code true} if the user provided subcommand is the
* initialize all replication and {@code false} otherwise.
*/
public boolean isInitializeAllReplicationSubcommand()
{
return isSubcommand(INITIALIZE_ALL_REPLICATION_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the pre external
* initialization or not.
* @return {@code true} if the user provided subcommand is the
* pre external initialization and {@code false} otherwise.
*/
public boolean isPreExternalInitializationSubcommand()
{
return isSubcommand(PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the post external
* initialization or not.
* @return {@code true} if the user provided subcommand is the
* post external initialization and {@code false} otherwise.
*/
public boolean isPostExternalInitializationSubcommand()
{
return isSubcommand(POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME);
}
/**
* Returns whether the user provided subcommand is the initialize replication
* or not.
* @return {@code true} if the user provided subcommand is the
* initialize replication and {@code false} otherwise.
*/
public boolean isInitializeReplicationSubcommand()
{
return isSubcommand(INITIALIZE_REPLICATION_SUBCMD_NAME);
}
/**
* Returns whether the command-line subcommand has the name provided
* or not.
* @param name the name of the subcommand.
* @return {@code true} if command-line subcommand has the name provided
* and {@code false} otherwise.
*/
private boolean isSubcommand(String name)
{
SubCommand subCommand = getSubCommand();
return subCommand != null && subCommand.getName().equalsIgnoreCase(name);
}
/**
* Checks the enable replication subcommand options and updates the provided
* LocalizableMessageBuilder with the errors that were encountered with the subcommand
* options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validateEnableReplicationOptions(LocalizableMessageBuilder buf)
{
Argument[][] conflictingPairs =
{
{ server1.bindPasswordArg, server1.bindPasswordFileArg },
{ server2.bindPasswordArg, server2.bindPasswordFileArg },
{ server1.replicationPortArg, server1.noReplicationServerArg },
{ server1.noReplicationServerArg, server1.onlyReplicationServerArg },
{ server2.replicationPortArg, server2.noReplicationServerArg },
{ server2.noReplicationServerArg, server2.onlyReplicationServerArg },
{noSchemaReplicationArg, useSecondServerAsSchemaSourceArg}
};
for (Argument[] conflictingPair : conflictingPairs)
{
Argument arg1 = conflictingPair[0];
Argument arg2 = conflictingPair[1];
if (arg1.isPresent() && arg2.isPresent())
{
LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
arg1.getLongIdentifier(), arg2.getLongIdentifier());
addMessage(buf, message);
}
}
if (server1.hostNameArg.getValue().equalsIgnoreCase(server2.hostNameArg.getValue())
&& !isInteractive()
&& server1.portArg.getValue().equals(server2.portArg.getValue()))
{
LocalizableMessage message = ERR_REPLICATION_ENABLE_SAME_SERVER_PORT.get(
server1.hostNameArg.getValue(), server1.portArg.getValue());
addMessage(buf, message);
}
}
/**
* Checks the disable replication subcommand options and updates the provided
* LocalizableMessageBuilder with the errors that were encountered with the subcommand
* options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validateDisableReplicationOptions(LocalizableMessageBuilder buf)
{
Argument[][] conflictingPairs =
{
{getAdminUidArg(), secureArgsList.bindDnArg},
{disableAllArg, disableReplicationServerArg},
{disableAllArg, baseDNsArg}
};
for (Argument[] conflictingPair : conflictingPairs)
{
Argument arg1 = conflictingPair[0];
Argument arg2 = conflictingPair[1];
if (arg1.isPresent() && arg2.isPresent())
{
LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
arg1.getLongIdentifier(), arg2.getLongIdentifier());
addMessage(buf, message);
}
}
}
/**
* Checks the status replication subcommand options and updates the provided
* LocalizableMessageBuilder with the errors that were encountered with the subcommand
* options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validateStatusReplicationOptions(LocalizableMessageBuilder buf)
{
if (quietArg.isPresent())
{
LocalizableMessage message = ERR_REPLICATION_STATUS_QUIET.get(
STATUS_REPLICATION_SUBCMD_NAME, "--"+quietArg.getLongIdentifier());
addMessage(buf, message);
}
}
/**
* Checks the initialize replication subcommand options and updates the
* provided LocalizableMessageBuilder with the errors that were encountered with the
* subcommand options.
*
* This method assumes that the method parseArguments for the parser has
* already been called.
* @param buf the LocalizableMessageBuilder object where we add the error messages
* describing the errors encountered.
*/
private void validateSourceAndDestinationServersOptions(LocalizableMessageBuilder buf)
{
if (hostNameSourceArg.getValue().equalsIgnoreCase(hostNameDestinationArg.getValue())
&& !isInteractive()
&& portSourceArg.getValue().equals(portDestinationArg.getValue()))
{
LocalizableMessage message = ERR_SOURCE_DESTINATION_INITIALIZE_SAME_SERVER_PORT.get(
hostNameSourceArg.getValue(), portSourceArg.getValue());
addMessage(buf, message);
}
}
/**
* Adds a message to the provided LocalizableMessageBuilder.
* @param buf the LocalizableMessageBuilder.
* @param message the message to be added.
*/
private void addMessage(LocalizableMessageBuilder buf, LocalizableMessage message)
{
if (buf.length() > 0)
{
buf.append(LINE_SEPARATOR);
}
buf.append(message);
}
/**
* Returns the default value to be used for the host.
* @return the default value to be used for the host.
*/
private String getDefaultHostValue()
{
if (defaultLocalHostValue == null)
{
try
{
defaultLocalHostValue =
java.net.InetAddress.getLocalHost().getHostName();
}
catch (Throwable t)
{
}
if (defaultLocalHostValue == null)
{
defaultLocalHostValue = "localhost";
}
}
return defaultLocalHostValue;
}
/**
* Returns the SecureConnectionCliArgs object containing the arguments
* of this parser.
* @return the SecureConnectionCliArgs object containing the arguments
* of this parser.
*/
public SecureConnectionCliArgs getSecureArgsList()
{
return secureArgsList;
}
/**
* Returns the TaskScheduleArgs object containing the arguments
* of this parser.
* @return the TaskScheduleArgs object containing the arguments
* of this parser.
*/
public TaskScheduleArgs getTaskArgsList()
{
return taskArgs;
}
/**
* Returns whether the user specified connection arguments or not.
* @return {@code true} if the user specified connection arguments and
* {@code false} otherwise.
*/
boolean connectionArgumentsPresent()
{
if (isPurgeHistoricalSubcommand()) {
boolean secureArgsPresent = getSecureArgsList() != null &&
getSecureArgsList().argumentsPresent();
// This have to be explicitly specified because their original definition
// has been replaced.
boolean adminArgsPresent = getAdminUidArg().isPresent() ||
secureArgsList.bindPasswordArg.isPresent() ||
secureArgsList.bindPasswordFileArg.isPresent();
return secureArgsPresent || adminArgsPresent;
}
return true;
}
/**
* Returns the maximum duration explicitly provided in the purge historical
* replication subcommand.
* @return the maximum duration explicitly provided in the purge historical
* replication subcommand. Returns -1 if no port was explicitly provided.
*/
public int getMaximumDuration()
{
return getValue(maximumDurationArg);
}
/**
* Returns the maximum duration default value in the purge historical
* replication subcommand.
* @return the maximum duration default value in the purge historical
* replication subcommand.
*/
public int getMaximumDurationOrDefault()
{
return getValueOrDefault(maximumDurationArg);
}
/**
* Returns the changenumber specified as argument.
* @return the changenumber specified as argument
*/
public int getResetChangeNumber()
{
return getValue(resetChangeNumber);
}
/**
* Sets the start change number value.
* @param changeNumber the new value of the option
*/
public void setResetChangeNumber(String changeNumber)
{
resetChangeNumber.setPresent(true);
resetChangeNumber.addValue(changeNumber);
}
}