From 477f4009f82865bbcb3c679cd9398cd8a6b503d8 Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Thu, 20 Sep 2007 14:35:30 +0000
Subject: [PATCH] Fix for issue #582 (Need Client-Side Configuration File)
---
opendj-sdk/opends/src/server/org/opends/server/util/args/ArgumentParser.java | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 204 insertions(+), 16 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/args/ArgumentParser.java b/opendj-sdk/opends/src/server/org/opends/server/util/args/ArgumentParser.java
index 63ea8ab..4b2b5e9 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/args/ArgumentParser.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/args/ArgumentParser.java
@@ -29,10 +29,12 @@
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Properties;
@@ -60,6 +62,17 @@
*/
public class ArgumentParser
{
+ /**
+ * The argument that will be used to indicate the file properties.
+ */
+ private StringArgument filePropertiesPathArgument;
+
+ /**
+ * The argument that will be used to indicate that we'll not look for
+ * default properties file.
+ */
+ private BooleanArgument NoPropertiesFileArgument;
+
// The argument that will be used to trigger the display of usage information.
private Argument usageArgument;
@@ -148,6 +161,8 @@
trailingArguments = new ArrayList<String>();
rawArguments = null;
usageArgument = null;
+ filePropertiesPathArgument = null;
+ NoPropertiesFileArgument = null;
usageOutputStream = System.out;
}
@@ -402,7 +417,6 @@
}
-
/**
* Adds the provided argument to the set of arguments handled by this parser.
*
@@ -501,6 +515,31 @@
}
+ /**
+ * Sets the provided argument which will be used to identify the
+ * file properties.
+ *
+ * @param argument
+ * The argument which will be used to identify the file
+ * properties.
+ */
+ public void setFilePropertiesArgument(StringArgument argument)
+ {
+ filePropertiesPathArgument= argument;
+ }
+
+ /**
+ * Sets the provided argument which will be used to identify the
+ * file properties.
+ *
+ * @param argument
+ * The argument which will be used to indicate if we have to
+ * look for properties file.
+ */
+ public void setNoPropertiesFileArgument(BooleanArgument argument)
+ {
+ NoPropertiesFileArgument= argument;
+ }
/**
* Parses the provided set of arguments and updates the information associated
@@ -943,37 +982,55 @@
}
}
+ // If we don't have the argumentProperties, try to load a properties file.
+ if (argumentProperties == null)
+ {
+ argumentProperties = checkExternalProperties();
+ }
// Iterate through all of the arguments. For any that were not provided on
// the command line, see if there is an alternate default that can be used.
// For cases where there is not, see that argument is required.
for (Argument a : argumentList)
{
- if ((! a.isPresent()) && a.needsValue())
+ if (! a.isPresent())
{
- // See if there is a default value in the properties that can be used.
- boolean valueSet = false;
+ // See if there is a value in the properties that can be used
if ((argumentProperties != null) && (a.getPropertyName() != null))
{
- String value = argumentProperties.getProperty(a.getPropertyName());
+ String value = argumentProperties.getProperty(a.getPropertyName()
+ .toLowerCase());
if (value != null)
{
- a.addValue(value);
- valueSet = true;
+ if (a.needsValue())
+ {
+ a.addValue(value);
+ a.setPresent(true);
+ }
+ else
+ if (value.toLowerCase().equals(CONFIG_VALUE_TRUE))
+ {
+ // Boolean value. Set to "present" only if
+ // value property value is "true"
+ // (insensitive case)
+ a.setPresent(true);
+ }
}
}
+ }
- // If there is still no value, then see if the argument defines a
- // default.
- if ((! valueSet) && (a.getDefaultValue() != null))
+
+ if ((! a.isPresent()) && a.needsValue())
+ {
+ // See if the argument defines a default.
+ if (a.getDefaultValue() != null)
{
a.addValue(a.getDefaultValue());
- valueSet = true;
}
// If there is still no value and the argument is required, then that's
// a problem.
- if ((! valueSet) && a.isRequired())
+ if ((! a.hasValue()) && a.isRequired())
{
Message message =
ERR_ARGPARSER_NO_VALUE_FOR_REQUIRED_ARG.get(a.getName());
@@ -986,11 +1043,142 @@
/**
- * Appends usage information based on the defined arguments to the provided
- * buffer.
+ * Check if we have a properties file.
*
- * @param buffer The buffer to which the usage information should be
- * appended.
+ * @return The properties found in the properties file or null.
+ * @throws ArgumentException
+ * If a problem was encountered while parsing the provided
+ * arguments.
+ */
+ protected Properties checkExternalProperties()
+ throws ArgumentException
+ {
+ // We don't look for properties file.
+ if ((NoPropertiesFileArgument != null)
+ && (NoPropertiesFileArgument.isPresent()))
+ {
+ return null;
+ }
+
+ // Check if we have a properties file argument
+ if (filePropertiesPathArgument == null)
+ {
+ return null;
+ }
+
+ // check if the properties file argument has been set. If not
+ // look for default location.
+ String propertiesFilePath = null;
+ if (filePropertiesPathArgument.isPresent())
+ {
+ propertiesFilePath = filePropertiesPathArgument.getValue();
+ }
+ else
+ {
+ // Check in "user home"/.opends directory
+ String userDir = System.getProperty("user.home");
+ propertiesFilePath = findPropertiesFile(userDir + File.separator
+ + DEFAULT_OPENDS_CONFIG_DIR);
+
+ if (propertiesFilePath == null)
+ {
+ // check "Opends instance"/config directory
+ String instanceDir = System.getProperty(PROPERTY_SERVER_ROOT);
+ propertiesFilePath = findPropertiesFile(instanceDir+ File.separator
+ + "config");
+ }
+ }
+
+ // We don't have a properties file location
+ if (propertiesFilePath == null)
+ {
+ return null;
+ }
+
+ // We have a location for the properties file.
+ Properties argumentProperties = new Properties();
+ String scriptName = System.getProperty(PROPERTY_SCRIPT_NAME);
+ try
+ {
+ Properties p = new Properties();
+ FileInputStream fis = new FileInputStream(propertiesFilePath);
+ p.load(fis);
+ fis.close();
+
+ for (Enumeration<?> e = p.propertyNames(); e.hasMoreElements();)
+ {
+ String currentPropertyName = (String) e.nextElement();
+ String propertyName = currentPropertyName;
+
+ // Property name form <script name>.<property name> has the
+ // precedence to <property name>
+ if (scriptName != null)
+ {
+ if (currentPropertyName.startsWith(scriptName))
+ {
+ propertyName = currentPropertyName
+ .substring(scriptName.length() + 1);
+ }
+ else
+ {
+ if (p.containsKey(scriptName + "." + currentPropertyName ))
+ {
+ continue;
+ }
+ }
+ }
+ argumentProperties.setProperty(propertyName.toLowerCase(), p
+ .getProperty(currentPropertyName));
+ }
+ }
+ catch (Exception e)
+ {
+ Message message = ERR_ARGPARSER_CANNOT_READ_PROPERTIES_FILE.get(String
+ .valueOf(propertiesFilePath), getExceptionMessage(e));
+ throw new ArgumentException(message, e);
+ }
+ return argumentProperties;
+ }
+
+
+ /**
+ * Get the absolute path of the properties file.
+ *
+ * @param directory
+ * The location in which we should look for properties file
+ * @return The absolute path of the properties file or null
+ */
+ private String findPropertiesFile(String directory)
+ {
+ // Check directory
+ File dir = new File(directory);
+ if (! dir.exists())
+ {
+ return null;
+ }
+
+ // Look for the tools properties file
+ String path = directory + File.separator
+ + DEFAULT_OPENDS_PROPERTIES_FILE_NAME
+ + DEFAULT_OPENDS_PROPERTIES_FILE_EXTENSION;
+ File f = new File(path);
+ if (f.exists() && f.canRead())
+ {
+ return f.getAbsolutePath();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Appends usage information based on the defined arguments to the
+ * provided buffer.
+ *
+ * @param buffer
+ * The buffer to which the usage information should be
+ * appended.
*/
public void getUsage(StringBuilder buffer)
{
--
Gitblit v1.10.0