From 2095a28e3b117ddc7b565bc7fbe410af70cb48f4 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Mon, 31 Oct 2016 14:00:38 +0000
Subject: [PATCH] OPENDJ-2772 Align SDK client tool with server's

---
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java |  144 ++++++++++++++++++++++++++---------------------
 1 files changed, 79 insertions(+), 65 deletions(-)

diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
index 1094b5e..6d428e7 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
@@ -18,10 +18,15 @@
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
 import static com.forgerock.opendj.cli.CommonArguments.showUsageArgument;
+import static com.forgerock.opendj.cli.CommonArguments.wrapColumnArgument;
 import static com.forgerock.opendj.cli.ToolVersionHandler.newSdkVersionHandler;
+import static com.forgerock.opendj.ldap.tools.LDAPToolException.newToolException;
+import static com.forgerock.opendj.ldap.tools.LDAPToolException.newToolExceptionAlreadyPrinted;
+import static com.forgerock.opendj.ldap.tools.LDAPToolException.newToolParamException;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
 import static com.forgerock.opendj.cli.Utils.filterExitCode;
-import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_MAKELDIF_WRAP_COLUMN_PLACEHOLDER;
+import static com.forgerock.opendj.ldap.tools.Utils.computeWrapColumn;
+import static com.forgerock.opendj.ldap.tools.Utils.parseArguments;
 import static org.forgerock.util.Utils.closeSilently;
 
 import java.io.BufferedWriter;
@@ -40,6 +45,7 @@
 import com.forgerock.opendj.cli.StringArgument;
 
 import org.forgerock.opendj.ldap.Entry;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldif.EntryGenerator;
 import org.forgerock.opendj.ldif.LDIFEntryWriter;
 
@@ -51,25 +57,53 @@
     /** 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;
-    private static final int EXIT_CODE_FAILURE = 1;
-
-    /** The total number of entries that have been written. */
-    private long numberOfEntriesWritten;
-
     /**
-     * Main method for MakeLDIF tool.
+     * The main method for makeldif tool.
      *
      * @param args
      *            The command-line arguments provided to this program.
      */
     public static void main(final String[] args) {
-        final int retCode = new MakeLDIF().run(args);
-        System.exit(filterExitCode(retCode));
+        System.exit(filterExitCode(run(System.out, System.err, args)));
     }
 
-    /** Run Make LDIF with provided command-line arguments. */
-    int run(final String[] args) {
+    /**
+     * Run {@link MakeLDIF} tool with the provided arguments.
+     * Output and errors will be written on the provided streams.
+     * This method can be used to run the tool programmatically.
+     *
+     * @param out
+     *      {@link PrintStream} which will be used by the tool to write results and information messages.
+     * @param err
+     *      {@link PrintStream} which will be used by the tool to write errors.
+     * @param args
+     *      Arguments set to pass to the tool.
+     * @return
+     *      An integer which represents the result code of the tool.
+     */
+    public static int run(final PrintStream out, final PrintStream err, final String... args) {
+        final MakeLDIF makeLDIF = new MakeLDIF(out, err);
+        try {
+            return makeLDIF.run(args);
+        } catch (final LDAPToolException e) {
+            e.printErrorMessage(makeLDIF);
+            return e.getResultCode();
+        }
+    }
+
+    private MakeLDIF(final PrintStream out, final PrintStream err) {
+        super(out, err);
+    }
+
+    @Override
+    public boolean isInteractive() {
+        return false;
+    }
+
+    /** The total number of entries that have been written. */
+    private long numberOfEntriesWritten;
+
+    private int run(final String[] args) throws LDAPToolException {
         final LocalizableMessage toolDescription = INFO_MAKELDIF_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser = LDAPToolArgumentParser.builder(MakeLDIF.class.getName())
                 .toolDescription(toolDescription)
@@ -117,43 +151,35 @@
             showUsage = showUsageArgument();
             argParser.addArgument(showUsage);
 
-            wrapColumn =
-                    IntegerArgument.builder("wrapColumn")
-                            .shortIdentifier('w')
-                            .description(INFO_MAKELDIF_DESCRIPTION_WRAP_COLUMN.get())
-                            .lowerBound(0)
-                            .defaultValue(0)
-                            .valuePlaceholder(INFO_MAKELDIF_WRAP_COLUMN_PLACEHOLDER.get())
-                            .buildAndAddToParser(argParser);
+            wrapColumn = wrapColumnArgument();
+            argParser.addArgument(wrapColumn);
 
             argParser.setUsageArgument(showUsage, getOutputStream());
-        } catch (ArgumentException ae) {
-            errPrintln(ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()));
-            return EXIT_CODE_FAILURE;
+        } catch (final ArgumentException ae) {
+            throw newToolParamException(ae, ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()));
         }
 
-        // Parse the command-line arguments provided to the program.
-        try {
-            argParser.parseArguments(args);
-        } catch (ArgumentException ae) {
-            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-            return EXIT_CODE_FAILURE;
-        }
 
+        parseArguments(argParser, getErrStream(), args);
         if (argParser.usageOrVersionDisplayed()) {
-            return 0;
+            return ResultCode.SUCCESS.intValue();
         }
         final String templatePath = argParser.getTrailingArguments().get(0);
         return run(templatePath, resourcePath, ldifFile, randomSeed, constants, wrapColumn);
     }
 
     /** Run Make LDIF with provided arguments. */
-    private int run(final String templatePath, final StringArgument resourcePath, final StringArgument ldifFile,
-            final IntegerArgument randomSeedArg, final StringArgument constants, final IntegerArgument wrapColumn) {
+    private int run(final String templatePath,
+                    final StringArgument resourcePath,
+                    final StringArgument ldifFile,
+                    final IntegerArgument randomSeedArg,
+                    final StringArgument constants,
+                    final IntegerArgument wrapColumn)  throws LDAPToolException {
         LDIFEntryWriter writer = null;
         try (EntryGenerator generator = createGenerator(templatePath, resourcePath, randomSeedArg, constants)) {
             if (generator == null) {
-                return EXIT_CODE_FAILURE;
+                // Root exception has already been printed
+                throw newToolExceptionAlreadyPrinted(null, ResultCode.UNDEFINED);
             }
 
             if (generator.hasWarnings()) {
@@ -163,28 +189,25 @@
             }
 
             try {
-                writer = createLdifWriter(ldifFile, wrapColumn);
+                writer = createLdifWriter(ldifFile, computeWrapColumn(wrapColumn));
             } catch (final IOException e) {
-                errPrintln(ERR_MAKELDIF_UNABLE_TO_CREATE_LDIF.get(ldifFile.getValue(), e.getMessage()));
-                return EXIT_CODE_FAILURE;
+                throw newToolParamException(
+                        e, ERR_MAKELDIF_UNABLE_TO_CREATE_LDIF.get(ldifFile.getValue(), e.getMessage()));
             } catch (final ArgumentException e) {
-                errPrintln(ERR_ERROR_PARSING_ARGS.get(e.getMessageObject()));
-                return EXIT_CODE_FAILURE;
+                throw newToolParamException(
+                        e, ERR_ERROR_PARSING_ARGS.get(e.getMessageObject()));
             }
 
-            if (!generateEntries(generator, writer, ldifFile)) {
-                return EXIT_CODE_FAILURE;
-            }
+            generateEntries(generator, writer, ldifFile);
 
-            errPrintln(INFO_MAKELDIF_PROCESSING_COMPLETE.get(numberOfEntriesWritten));
-
-            return EXIT_CODE_SUCCESS;
+            println(INFO_MAKELDIF_PROCESSING_COMPLETE.get(numberOfEntriesWritten));
+            return ResultCode.SUCCESS.intValue();
         } finally {
             closeSilently(writer);
         }
     }
 
-    private LDIFEntryWriter createLdifWriter(final StringArgument ldifFile, final IntegerArgument wrapColumn)
+    private LDIFEntryWriter createLdifWriter(final StringArgument ldifFile, final int wrapColumn)
             throws IOException, ArgumentException {
         final LDIFEntryWriter writer;
         if (ldifFile.isPresent()) {
@@ -192,7 +215,7 @@
         } else {
             writer = new LDIFEntryWriter(getOutputStream());
         }
-        return writer.setWrapColumn(wrapColumn.getIntValue());
+        return writer.setWrapColumn(wrapColumn);
     }
 
     static EntryGenerator createGenerator(final String templatePath, final StringArgument resourcePath,
@@ -258,34 +281,25 @@
     }
 
     /** Returns true if generation is successful, false otherwise. */
-    private boolean generateEntries(final EntryGenerator generator, final LDIFEntryWriter writer,
-            final StringArgument ldifFile) {
+    private void generateEntries(final EntryGenerator generator,
+                                    final LDIFEntryWriter writer,
+                                    final StringArgument ldifFile) throws LDAPToolException {
         try {
             while (generator.hasNext()) {
                 final Entry entry = generator.readEntry();
                 try {
                     writer.writeEntry(entry);
-                } catch (IOException e) {
-                    errPrintln(ERR_MAKELDIF_ERROR_WRITING_LDIF.get(ldifFile.getValue(), e.getMessage()));
-                    return false;
+                } catch (final IOException e) {
+                    throw newToolParamException(
+                            e, ERR_MAKELDIF_ERROR_WRITING_LDIF.get(ldifFile.getValue(), e.getMessage()));
                 }
                 if ((++numberOfEntriesWritten % 1000) == 0) {
                     errPrintln(INFO_MAKELDIF_PROCESSED_N_ENTRIES.get(numberOfEntriesWritten));
                 }
             }
-        } catch (Exception e) {
-            errPrintln(ERR_MAKELDIF_EXCEPTION_DURING_PROCESSING.get(e.getMessage()));
-            return false;
+        } catch (final Exception e) {
+            throw newToolException(
+                    e, ResultCode.UNDEFINED, ERR_MAKELDIF_EXCEPTION_DURING_PROCESSING.get(e.getMessage()));
         }
-        return true;
-    }
-
-    private MakeLDIF() {
-        // nothing to do
-    }
-
-    /** To allow tests. */
-    MakeLDIF(PrintStream out, PrintStream err) {
-        super(out, err);
     }
 }

--
Gitblit v1.10.0