/* * 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 2014-2016 ForgeRock AS */ package org.opends.server.tools; import static com.forgerock.opendj.cli.Utils.*; import static com.forgerock.opendj.util.OperatingSystem.*; import static com.forgerock.opendj.cli.CommonArguments.*; import static org.opends.messages.ToolMessages.*; import java.io.File; import java.util.LinkedHashSet; import org.forgerock.i18n.LocalizableMessage; import org.opends.quicksetup.Constants; import org.opends.quicksetup.Installation; import org.opends.quicksetup.util.Utils; import org.opends.server.core.DirectoryServer.DirectoryServerVersionHandler; import com.forgerock.opendj.cli.ArgumentException; import com.forgerock.opendj.cli.ArgumentParser; import com.forgerock.opendj.cli.BooleanArgument; import com.forgerock.opendj.cli.StringArgument; /** * Class used to parse the arguments of the java properties tool command-line. */ public class JavaPropertiesToolArgumentParser extends ArgumentParser { /** Usage argument. */ BooleanArgument showUsageArg; /** Quiet argument. */ BooleanArgument quietArg; /** The file containing the properties. */ StringArgument propertiesFileArg; /** The file that is generated. */ StringArgument destinationFileArg; /** * The default constructor for this class. * @param mainClassName the class name of the main class for the command-line * that is being used. */ public JavaPropertiesToolArgumentParser(String mainClassName) { super(mainClassName, INFO_JAVAPROPERTIES_TOOL_DESCRIPTION.get(getDefaultPropertiesValue()), false); setShortToolDescription(REF_SHORT_DESC_DSJAVAPROPERTIES.get()); setVersionHandler(new DirectoryServerVersionHandler()); } /** * Initializes the arguments without parsing them. * @throws ArgumentException if there was an error creating or adding the * arguments. If this occurs is likely to be a bug. */ public void initializeArguments() throws ArgumentException { quietArg = quietArgument(); addArgument(quietArg); propertiesFileArg = StringArgument.builder("propertiesFile") .shortIdentifier('p') .description(INFO_JAVAPROPERTIES_DESCRIPTION_PROPERTIES_FILE.get(getDefaultPropertiesValue())) .hidden() .defaultValue(getDefaultPropertiesValue()) .valuePlaceholder(INFO_PATH_PLACEHOLDER.get()) .buildArgument(); addArgument(propertiesFileArg); destinationFileArg = StringArgument.builder("destinationFile") .shortIdentifier('d') .description(INFO_JAVAPROPERTIES_DESCRIPTION_DESTINATION_FILE.get(getDefaultDestinationValue())) .hidden() .defaultValue(getDefaultDestinationValue()) .valuePlaceholder(INFO_PATH_PLACEHOLDER.get()) .buildArgument(); addArgument(destinationFileArg); showUsageArg = showUsageArgument(); addArgument(showUsageArg); setUsageArgument(showUsageArg); } /** {@inheritDoc} */ @Override public void parseArguments(String[] args) throws ArgumentException { LinkedHashSet errorMessages = new LinkedHashSet<>(); try { super.parseArguments(args); } catch (ArgumentException ae) { errorMessages.add(ae.getMessageObject()); } if (!isUsageArgumentPresent() && !isVersionArgumentPresent()) { String value = propertiesFileArg.getValue(); if (value != null) { File f = new File(value); if (!f.exists() || !f.isFile() || !f.canRead()) { errorMessages.add(ERR_JAVAPROPERTIES_WITH_PROPERTIES_FILE.get(value)); } } value = destinationFileArg.getValue(); if (value != null) { File f = new File(value); if (f.isDirectory() || !canWrite(value)) { errorMessages.add( ERR_JAVAPROPERTIES_WITH_DESTINATION_FILE.get(value)); } } if (!errorMessages.isEmpty()) { LocalizableMessage message = ERR_CANNOT_INITIALIZE_ARGS.get( Utils.getMessageFromCollection(errorMessages, Constants.LINE_SEPARATOR)); throw new ArgumentException(message); } } } /** * Returns the default destination file by inspecting the class loader. * @return the default destination file retrieved by inspecting the class * loader. */ private String getDefaultDestinationValue() { // Use this instead of Installation.getLocal() because making that call // starts a new JVM and the command-line becomes less responsive. String installPath = Utils.getInstallPathFromClasspath(); String root = Utils.getInstancePathFromInstallPath(installPath); if (root != null) { return getPath(Utils.getPath(root, Installation.LIBRARIES_PATH_RELATIVE)); } else { // This can happen when we are not launched using the command-line (for // instance from the WebInstaller). return getPath(Installation.LIBRARIES_PATH_RELATIVE); } } private String getPath(String libDir) { final String relativePath = isWindows() ? Installation.SET_JAVA_PROPERTIES_FILE_WINDOWS : Installation.SET_JAVA_PROPERTIES_FILE_UNIX; return Utils.getPath(libDir, relativePath); } /** * Returns the default java properties file by inspecting the class loader. * @return the default java properties file retrieved by inspecting the class * loader. */ private static String getDefaultPropertiesValue() { // Use this instead of Installation.getLocal() because making that call // starts a new JVM and the command-line becomes less responsive. String installPath = Utils.getInstallPathFromClasspath(); String root = Utils.getInstancePathFromInstallPath(installPath); if (root != null) { String configDir = Utils.getPath(root, Installation.CONFIG_PATH_RELATIVE); return Utils.getPath(configDir, Installation.DEFAULT_JAVA_PROPERTIES_FILE); } else { // This can happen when we are not launched using the command-line (for // instance from the WebInstaller). return Installation.DEFAULT_JAVA_PROPERTIES_FILE; } } }