From 6c5a0862f30d13a27da02ea812e08e29d1512883 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 16 Dec 2015 11:20:39 +0000
Subject: [PATCH] OPENDJ-2311 Option -V/--version don't work for SDK tools

---
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java           |   33 +----
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java         |    9 -
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java            |   17 +--
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java         |   13 -
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java           |   19 +--
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SdkVersionHandler.java  |   66 +++++++++++++
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java        |   11 +-
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java         |   20 +--
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java            |    6 
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java |    5 
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java         |   15 +--
 opendj-sdk/opendj-core/pom.xml                                                                       |   20 ++++
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java         |    4 
 opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java           |   17 +--
 14 files changed, 143 insertions(+), 112 deletions(-)

diff --git a/opendj-sdk/opendj-core/pom.xml b/opendj-sdk/opendj-core/pom.xml
index 58609b9..a7e81c8 100644
--- a/opendj-sdk/opendj-core/pom.xml
+++ b/opendj-sdk/opendj-core/pom.xml
@@ -77,6 +77,7 @@
         <opendj.osgi.import.additional>
             com.sun.security.auth*;resolution:=optional
         </opendj.osgi.import.additional>
+        <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
     </properties>
 
 
@@ -100,6 +101,20 @@
                 </executions>
             </plugin>
 
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>buildnumber-maven-plugin</artifactId>
+                <version>1.4</version>
+                <executions>
+                    <execution>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>create</goal>
+                        </goals>
+                     </execution>
+                </executions>
+            </plugin>
+
             <!-- Creates opendj-core bundle -->
             <plugin>
                 <groupId>org.apache.felix</groupId>
@@ -112,6 +127,11 @@
                             org.forgerock.opendj.ldap*,
                             org.forgerock.opendj.ldif
                         </Export-Package>
+                        <Build-Maven>Apache Maven ${maven.version}</Build-Maven>
+                        <SCM-Revision>${buildNumber}</SCM-Revision>
+                        <SCM-Branch>${scmBranch}</SCM-Branch>
+                        <Build-Time>${maven.build.timestamp}</Build-Time>
+                        <Build-Java>${java.version}</Build-Java>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
index f2a07e0..b21b354 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
@@ -52,8 +52,8 @@
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.LdapException;
-import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.LdapResultHandler;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.responses.Responses;
 import org.forgerock.opendj.ldap.responses.Result;
 import org.forgerock.opendj.ldif.EntryGenerator;
@@ -395,19 +395,16 @@
         super(out, err);
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isInteractive() {
         return false;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isScriptFriendly() {
         return scriptFriendly.isPresent();
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isVerbose() {
         return verbose.isPresent();
@@ -418,6 +415,7 @@
         final LocalizableMessage toolDescription = INFO_ADDRATE_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
             new ArgumentParser(AddRate.class.getName(), toolDescription, false, true, 1, 1, "template-file-path");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_ADDRATE.get());
         argParser.setDocToolDescriptionSupplement(SUPPLEMENT_DESCRIPTION_RATE_TOOLS.get());
 
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
index 47c3ded..5156335 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -96,8 +96,7 @@
             }
         }
 
-        private final class BindUpdateStatsResultHandler extends
-                UpdateStatsResultHandler<BindResult> {
+        private final class BindUpdateStatsResultHandler extends UpdateStatsResultHandler<BindResult> {
             private BindUpdateStatsResultHandler(final long startTime) {
                 super(startTime);
             }
@@ -119,16 +118,13 @@
             private final char[] invalidPassword = "invalid-password".toCharArray();
 
             private final ThreadLocal<Random> rng = new ThreadLocal<Random>() {
-
                 @Override
                 protected Random initialValue() {
                     return new Random();
                 }
-
             };
 
-            private BindWorkerThread(final Connection connection,
-                    final ConnectionFactory connectionFactory) {
+            private BindWorkerThread(final Connection connection, final ConnectionFactory connectionFactory) {
                 super(connection, connectionFactory);
             }
 
@@ -347,7 +343,6 @@
      * @param args
      *            The command-line arguments provided to this program.
      */
-
     public static void main(final String[] args) {
         final int retCode = new AuthRate().run(args);
         System.exit(filterExitCode(retCode));
@@ -372,19 +367,16 @@
         super(out, err);
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isInteractive() {
         return false;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isScriptFriendly() {
         return scriptFriendly.isPresent();
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isVerbose() {
         return verbose.isPresent();
@@ -396,6 +388,7 @@
         final ArgumentParser argParser =
                 new ArgumentParser(AuthRate.class.getName(), toolDescription, false, true, 0, 0,
                         "[filter format string] [attributes ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_AUTHRATE.get());
         argParser.setDocToolDescriptionSupplement(SUPPLEMENT_DESCRIPTION_RATE_TOOLS.get());
 
@@ -410,7 +403,6 @@
         StringArgument propertiesFileArgument;
         BooleanArgument noPropertiesFileArgument;
         IntegerArgument invalidCredPercent;
-
         try {
             setDefaultPerfToolProperties();
             PerformanceRunnerOptions options = new PerformanceRunnerOptions(argParser, this);
@@ -479,8 +471,7 @@
         try {
             argParser.parseArguments(args);
 
-            /* If we should just display usage or version information,
-             then print it and exit.*/
+            /* If we should just display usage or version information, then print it and exit. */
             if (argParser.usageOrVersionDisplayed()) {
                 return 0;
             }
@@ -499,7 +490,7 @@
 
         final List<String> attributes = new LinkedList<>();
         final ArrayList<String> filterAndAttributeStrings = argParser.getTrailingArguments();
-        if (filterAndAttributeStrings.size() > 0) {
+        if (!filterAndAttributeStrings.isEmpty()) {
              /*The list of trailing arguments should be structured as follow:
              the first trailing argument is considered the filter, the other
              as attributes.*/
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
index 72a57d7..a8df64e 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
@@ -143,13 +143,13 @@
     }
 
     int run(final String[] args) {
-        // Create the command-line argument parser for use with this
-        // program.
+        // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_LDAPCOMPARE_TOOL_DESCRIPTION.get();
-        final ArgumentParser argParser =
-                new ArgumentParser(LDAPCompare.class.getName(), toolDescription, false, true, 1, 0,
-                        "attribute:value [DN ...]");
+        final ArgumentParser argParser = new ArgumentParser(
+            LDAPCompare.class.getName(), toolDescription, false, true, 1, 0, "attribute:value [DN ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDAPCOMPARE.get());
+
         ConnectionFactoryProvider connectionFactoryProvider;
         ConnectionFactory connectionFactory;
         BindRequest bindRequest;
@@ -165,7 +165,6 @@
         StringArgument proxyAuthzID;
         StringArgument propertiesFileArgument;
         BooleanArgument noPropertiesFileArgument;
-
         try {
             connectionFactoryProvider = new ConnectionFactoryProvider(argParser, this);
 
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
index 59defe8..882080c 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
@@ -160,8 +160,7 @@
             if (r.getResultCode() != ResultCode.SUCCESS && r.getResultCode() != ResultCode.REFERRAL) {
                 final LocalizableMessage msg = INFO_OPERATION_FAILED.get(operationType);
                 errPrintln(msg);
-                errPrintln(ERR_TOOL_RESULT_CODE.get(r.getResultCode().intValue(), r.getResultCode()
-                        .toString()));
+                errPrintln(ERR_TOOL_RESULT_CODE.get(r.getResultCode().intValue(), r.getResultCode()));
                 if (r.getDiagnosticMessage() != null && r.getDiagnosticMessage().length() > 0) {
                     errPrintln(LocalizableMessage.raw(r.getDiagnosticMessage()));
                 }
@@ -169,8 +168,7 @@
                     errPrintln(ERR_TOOL_MATCHED_DN.get(r.getMatchedDN()));
                 }
             } else {
-                final LocalizableMessage msg = INFO_OPERATION_SUCCESSFUL.get(operationType, name);
-                println(msg);
+                println(INFO_OPERATION_SUCCESSFUL.get(operationType, name));
                 if (r.getDiagnosticMessage() != null && r.getDiagnosticMessage().length() > 0) {
                     errPrintln(LocalizableMessage.raw(r.getDiagnosticMessage()));
                 }
@@ -217,7 +215,6 @@
      * @param args
      *            The command-line arguments provided to this program.
      */
-
     public static void main(final String[] args) {
         final int retCode = new LDAPModify().run(args);
         System.exit(filterExitCode(retCode));
@@ -252,7 +249,9 @@
         final LocalizableMessage toolDescription = INFO_LDAPMODIFY_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
                 new ArgumentParser(LDAPModify.class.getName(), toolDescription, false);
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDAPMODIFY.get());
+
         ConnectionFactoryProvider connectionFactoryProvider;
         ConnectionFactory connectionFactory;
         BindRequest bindRequest;
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
index 480ad9f..e410794 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
@@ -96,12 +96,13 @@
     }
 
     private int run(final String[] args) {
-        // Create the command-line argument parser for use with this
-        // program.
+        // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_LDAPPWMOD_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
                 new ArgumentParser(LDAPPasswordModify.class.getName(), toolDescription, false);
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDAPPASSWORDMODIFY.get());
+
         ConnectionFactoryProvider connectionFactoryProvider;
         ConnectionFactory connectionFactory;
 
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
index 7eb772b..47b5bdf 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
@@ -218,7 +218,7 @@
      * @param err error stream of console application
      */
     LDAPSearch(PrintStream out, PrintStream err) {
-      super(out, err);
+        super(out, err);
     }
 
     /** {@inheritDoc} */
@@ -241,7 +241,9 @@
         final ArgumentParser argParser =
                 new ArgumentParser(LDAPSearch.class.getName(), toolDescription, false, true, 0, 0,
                         "[filter] [attributes ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDAPSEARCH.get());
+
         ConnectionFactoryProvider connectionFactoryProvider;
         ConnectionFactory connectionFactory;
         BindRequest bindRequest;
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
index 2ee93e5..e69259a 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
@@ -76,18 +76,15 @@
     }
 
     private int run(final String[] args) {
-        // Create the command-line argument parser for use with this
-        // program.
-
+        // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_LDIFDIFF_TOOL_DESCRIPTION.get();
-        final ArgumentParser argParser =
-                new ArgumentParser(LDIFDiff.class.getName(), toolDescription, false, true, 2, 2,
-                        "source target");
+        final ArgumentParser argParser = new ArgumentParser(
+            LDIFDiff.class.getName(), toolDescription, false, true, 2, 2, "source target");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDIFDIFF.get());
 
         final BooleanArgument showUsage;
         final StringArgument outputFilename;
-
         try {
             outputFilename =
                     new StringArgument("outputFilename", OPTION_SHORT_OUTPUT_LDIF_FILENAME,
@@ -110,8 +107,7 @@
         try {
             argParser.parseArguments(args);
 
-            /* If we should just display usage or version information,
-             then print it and exit.*/
+            /* If we should just display usage or version information, then print it and exit. */
             if (argParser.usageOrVersionDisplayed()) {
                 return ResultCode.SUCCESS.intValue();
             }
@@ -182,8 +178,7 @@
                 outputStream = System.out;
             }
 
-            /* Check that we are not attempting to read both the source and
-             target from stdin.*/
+            /* Check that we are not attempting to read both the source and target from stdin. */
             if (sourceInputStream == targetInputStream) {
                 final LocalizableMessage message = ERR_LDIFDIFF_MULTIPLE_USES_OF_STDIN.get();
                 errPrintln(message);
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
index 495023a..f5a1ec1 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
@@ -66,7 +66,6 @@
  * to a set of entries contained in an LDIF file.
  */
 public final class LDIFModify extends ConsoleApplication {
-
     /**
      * The main method for LDIFModify tool.
      *
@@ -83,19 +82,16 @@
     }
 
     private int run(final String[] args) {
-        // Create the command-line argument parser for use with this
-        // program.
-
+        // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_LDIFMODIFY_TOOL_DESCRIPTION.get();
-        final ArgumentParser argParser =
-                new ArgumentParser(LDIFModify.class.getName(), toolDescription, false, true, 1, 2,
-                        "source [changes]");
+        final ArgumentParser argParser = new ArgumentParser(
+            LDIFModify.class.getName(), toolDescription, false, true, 1, 2, "source [changes]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDIFMODIFY.get());
 
         final BooleanArgument continueOnError;
         final BooleanArgument showUsage;
         final StringArgument outputFilename;
-
         try {
             outputFilename =
                     new StringArgument("outputFilename", OPTION_SHORT_OUTPUT_LDIF_FILENAME,
@@ -193,8 +189,7 @@
                 outputStream = System.out;
             }
 
-            /* Check that we are not attempting to read both the source and
-             changes from stdin.*/
+            /* Check that we are not attempting to read both the source and changes from stdin. */
             if (sourceInputStream == changesInputStream) {
                 final LocalizableMessage message = ERR_LDIFMODIFY_MULTIPLE_USES_OF_STDIN.get();
                 errPrintln(message);
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
index f9c4977..da5c13e 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
@@ -63,12 +63,8 @@
 import com.forgerock.opendj.cli.MultiChoiceArgument;
 import com.forgerock.opendj.cli.StringArgument;
 
-/**
- * This utility can be used to perform search operations against data in an LDIF
- * file.
- */
+/** This utility can be used to perform search operations against data in an LDIF file. */
 public final class LDIFSearch extends ConsoleApplication {
-
     /**
      * The main method for LDIFSearch tool.
      *
@@ -85,13 +81,11 @@
     }
 
     private int run(final String[] args) {
-        /* Create the command-line argument parser for use with this
-         program.*/
-
+        /* Create the command-line argument parser for use with this program. */
         final LocalizableMessage toolDescription = INFO_LDIFSEARCH_TOOL_DESCRIPTION.get();
-        final ArgumentParser argParser =
-                new ArgumentParser(LDIFSearch.class.getName(), toolDescription, false, true, 1, 0,
-                        "source [filter] [attributes ...]");
+        final ArgumentParser argParser = new ArgumentParser(
+            LDIFSearch.class.getName(), toolDescription, false, true, 1, 0, "source [filter] [attributes ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_LDIFSEARCH.get());
 
         final BooleanArgument showUsage;
@@ -102,7 +96,6 @@
         final StringArgument baseDN;
         final MultiChoiceArgument<SearchScope> searchScope;
         final IntegerArgument sizeLimit;
-
         try {
             outputFilename =
                     new StringArgument("outputFilename", OPTION_SHORT_OUTPUT_LDIF_FILENAME,
@@ -162,8 +155,7 @@
         try {
             argParser.parseArguments(args);
 
-            /* If we should just display usage or version information,
-             then print it and exit.*/
+            /* If we should just display usage or version information, then print it and exit. */
             if (argParser.usageOrVersionDisplayed()) {
                 return ResultCode.SUCCESS.intValue();
             }
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
index 9004182..7347a0f 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
@@ -50,19 +50,12 @@
 import org.forgerock.opendj.ldif.EntryGenerator;
 import org.forgerock.opendj.ldif.LDIFEntryWriter;
 
-/**
- * Program that generate LDIF content based on a template.
- */
+/** Program that generate LDIF content based on a template. */
 public final class MakeLDIF extends ConsoleApplication {
-
-    /**
-     * The value for the constant option in LDIF generator tools.
-     */
+    /** The value for the constant option in LDIF generator tools. */
     public static final String OPTION_LONG_CONSTANT = "constant";
 
-    /**
-     * The value for the path to look for LDIF resources (e.g data files).
-     */
+    /** The value for the path to look for LDIF resources (e.g data files). */
     public static final String OPTION_LONG_RESOURCE_PATH = "resourcePath";
 
     private static final int EXIT_CODE_SUCCESS = 0;
@@ -87,6 +80,7 @@
         final LocalizableMessage toolDescription = INFO_MAKELDIF_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser = new ArgumentParser(MakeLDIF.class.getName(), toolDescription,
                 false, true, 1, 1, "template-file-path");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_MAKELDIF.get());
         argParser.setDocToolDescriptionSupplement(SUPPLEMENT_DESCRIPTION_MAKELDIF.get());
 
@@ -142,10 +136,8 @@
     /** Run Make LDIF with provided arguments. */
     private int run(final String templatePath, final StringArgument resourcePath,
             final StringArgument ldifFile, final IntegerArgument randomSeedArg, final StringArgument constants) {
-        EntryGenerator generator = null;
         LDIFEntryWriter writer = null;
-        try {
-            generator = createGenerator(templatePath, resourcePath, randomSeedArg, constants);
+        try (EntryGenerator generator = createGenerator(templatePath, resourcePath, randomSeedArg, constants)) {
             if (generator == null) {
                 return EXIT_CODE_FAILURE;
             }
@@ -173,11 +165,10 @@
 
             errPrintln(INFO_MAKELDIF_PROCESSING_COMPLETE.get(numberOfEntriesWritten));
 
+            return EXIT_CODE_SUCCESS;
         } finally {
-            closeSilently(generator, writer);
+            closeSilently(writer);
         }
-
-        return EXIT_CODE_SUCCESS;
     }
 
     static EntryGenerator createGenerator(final String templatePath, final StringArgument resourcePath,
@@ -223,9 +214,7 @@
         return generator;
     }
 
-    /**
-     * Returns true if all constants are added to generator, false otherwise.
-     */
+    /** Returns true if all constants are added to generator, false otherwise. */
     private static boolean addConstantsToGenerator(StringArgument constants, EntryGenerator generator,
                                                        final ConsoleApplication app) {
         for (final String constant : constants.getValues()) {
@@ -239,15 +228,12 @@
         return true;
     }
 
-
     private EntryGenerator createGenerator(final String templatePath, final StringArgument resourcePath,
             final IntegerArgument randomSeedArg, final StringArgument constants) {
         return createGenerator(templatePath, resourcePath, randomSeedArg, constants, true, this);
     }
 
-    /**
-     * Returns true if generation is successful, false otherwise.
-     */
+    /** Returns true if generation is successful, false otherwise. */
     private boolean generateEntries(final EntryGenerator generator, final LDIFEntryWriter writer,
             final StringArgument ldifFile) {
         try {
@@ -278,5 +264,4 @@
     MakeLDIF(PrintStream out, PrintStream err) {
         super(out, err);
     }
-
 }
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
index 422c2a9..52947ee 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
@@ -129,7 +129,6 @@
      * @param args
      *            The command-line arguments provided to this program.
      */
-
     public static void main(final String[] args) {
         final int retCode = new ModRate().run(args);
         System.exit(filterExitCode(retCode));
@@ -142,33 +141,31 @@
         // Nothing to do.
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isInteractive() {
         return false;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isScriptFriendly() {
         return scriptFriendly.isPresent();
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isVerbose() {
         return verbose.isPresent();
     }
 
     private int run(final String[] args) {
-        /* Creates the command-line argument parser for use with this
-         program*/
+        // Creates the command-line argument parser for use with this program
         final LocalizableMessage toolDescription = INFO_MODRATE_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
                 new ArgumentParser(ModRate.class.getName(), toolDescription, false, true, 1, 0,
                         "[(attribute:value format string) ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_MODRATE.get());
         argParser.setDocToolDescriptionSupplement(SUPPLEMENT_DESCRIPTION_RATE_TOOLS.get());
+
         ConnectionFactoryProvider connectionFactoryProvider;
         ConnectionFactory connectionFactory;
         ModifyPerformanceRunner runner;
@@ -177,7 +174,6 @@
         StringArgument propertiesFileArgument;
         BooleanArgument noPropertiesFileArgument;
         StringArgument baseDN;
-
         try {
             Utils.setDefaultPerfToolProperties();
 
@@ -221,8 +217,7 @@
         try {
             argParser.parseArguments(args);
 
-            /* If we should just display usage or version information,
-             then print it and exit.*/
+            /* If we should just display usage or version information, then print it and exit. */
             if (argParser.usageOrVersionDisplayed()) {
                 return 0;
             }
@@ -241,9 +236,7 @@
         runner.baseDN = baseDN.getValue();
 
         try {
-
-            /* Try it out to make sure the format string and data sources
-             match.*/
+            /* Try it out to make sure the format string and data sources match. */
             final Object[] data = DataSource.generateData(runner.getDataSources(), null);
             for (final String modString : runner.modStrings) {
                 String.format(modString, data);
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SdkVersionHandler.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SdkVersionHandler.java
new file mode 100644
index 0000000..8678781
--- /dev/null
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SdkVersionHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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 2015 ForgeRock AS
+ */
+package com.forgerock.opendj.ldap.tools;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import com.forgerock.opendj.cli.VersionHandler;
+
+/** Class that prints the version of the SDK to System.out. */
+public class SdkVersionHandler implements VersionHandler {
+
+    @Override
+    public void printVersion() {
+        System.out.println(getVersion());
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + "(" + getVersion() + ")";
+    }
+
+    private String getVersion() {
+        try {
+            final Enumeration<URL> manifests = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
+            while (manifests.hasMoreElements()) {
+                final URL manifestUrl = manifests.nextElement();
+                if (manifestUrl.toString().contains("/opendj-core-")) {
+                    try (InputStream manifestStream = manifestUrl.openStream()) {
+                        final Attributes attrs = new Manifest(manifestStream).getMainAttributes();
+                        return attrs.getValue("Bundle-Version") + " (revision " + attrs.getValue("SCM-Revision") + ")";
+                    }
+                }
+            }
+            return null;
+        } catch (IOException e) {
+            throw new RuntimeException("IOException while determining SDK version", e);
+        }
+    }
+}
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
index 356dabe..509d338 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
@@ -183,31 +183,28 @@
         // Nothing to do.
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isInteractive() {
         return false;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isScriptFriendly() {
         return scriptFriendly.isPresent();
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean isVerbose() {
         return verbose.isPresent();
     }
 
     private int run(final String[] args) {
-        // Create the command-line argument parser for use with this
-        // program.
+        // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_SEARCHRATE_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
                 new ArgumentParser(SearchRate.class.getName(), toolDescription, false, true, 1, 0,
                         "[filter format string] [attributes ...]");
+        argParser.setVersionHandler(new SdkVersionHandler());
         argParser.setShortToolDescription(REF_SHORT_DESC_SEARCHRATE.get());
         argParser.setDocToolDescriptionSupplement(SUPPLEMENT_DESCRIPTION_RATE_TOOLS.get());
 
@@ -221,7 +218,6 @@
         BooleanArgument showUsage;
         StringArgument propertiesFileArgument;
         BooleanArgument noPropertiesFileArgument;
-
         try {
             Utils.setDefaultPerfToolProperties();
 
@@ -293,7 +289,7 @@
 
         final List<String> attributes = new LinkedList<>();
         final ArrayList<String> filterAndAttributeStrings = argParser.getTrailingArguments();
-        if (filterAndAttributeStrings.size() > 0) {
+        if (!filterAndAttributeStrings.isEmpty()) {
             /* The list of trailing arguments should be structured as follow:
              the first trailing argument is considered the filter, the other as attributes.*/
             runner.filter = filterAndAttributeStrings.remove(0);
@@ -311,8 +307,7 @@
         }
 
         try {
-            /* Try it out to make sure the format string and data sources
-             match.*/
+            /* Try it out to make sure the format string and data sources match. */
             final Object[] data = DataSource.generateData(runner.getDataSources(), null);
             String.format(runner.filter, data);
             String.format(runner.baseDN, data);

--
Gitblit v1.10.0