001    /*
002     * Copyright 2010-2016 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2010-2016 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.util;
022    
023    
024    
025    import java.io.OutputStream;
026    import java.io.PrintStream;
027    
028    import com.unboundid.ldap.listener.InMemoryDirectoryServerTool;
029    import com.unboundid.ldap.sdk.ResultCode;
030    import com.unboundid.ldap.sdk.Version;
031    import com.unboundid.ldap.sdk.examples.AuthRate;
032    import com.unboundid.ldap.sdk.examples.IdentifyReferencesToMissingEntries;
033    import com.unboundid.ldap.sdk.examples.IdentifyUniqueAttributeConflicts;
034    import com.unboundid.ldap.sdk.examples.LDAPCompare;
035    import com.unboundid.ldap.sdk.examples.LDAPDebugger;
036    import com.unboundid.ldap.sdk.examples.LDAPModify;
037    import com.unboundid.ldap.sdk.examples.LDAPSearch;
038    import com.unboundid.ldap.sdk.examples.ModRate;
039    import com.unboundid.ldap.sdk.examples.SearchRate;
040    import com.unboundid.ldap.sdk.examples.SearchAndModRate;
041    import com.unboundid.ldap.sdk.examples.ValidateLDIF;
042    import com.unboundid.ldap.sdk.persist.GenerateSchemaFromSource;
043    import com.unboundid.ldap.sdk.persist.GenerateSourceFromSchema;
044    
045    
046    
047    /**
048     * This class provides an entry point that may be used to launch other tools
049     * provided as part of the LDAP SDK.  This is primarily a convenience for
050     * someone who just has the jar file and none of the scripts, since you can run
051     * "<CODE>java -jar unboundid-ldapsdk-se.jar {tool-name} {tool-args}</CODE>"
052     * in order to invoke any of the example tools.  Running just
053     * "<CODE>java -jar unboundid-ldapsdk-se.jar</CODE>" will display version
054     * information about the LDAP SDK.
055     * <BR><BR>
056     * The tool names are case-insensitive.  Supported tool names include:
057     * <UL>
058     *   <LI>authrate -- Launch the {@link AuthRate} tool.</LI>
059     *   <LI>in-memory-directory-server -- Launch the
060     *       {@link InMemoryDirectoryServerTool} tool.</LI>
061     *   <LI>generate-schema-from-source -- Launch the
062     *       {@link GenerateSchemaFromSource} tool.</LI>
063     *   <LI>generate-source-from-schema -- Launch the
064     *       {@link GenerateSourceFromSchema} tool.</LI>
065     *   <LI>identify-references-to-missing-entries -- Launch the
066     *       {@link IdentifyReferencesToMissingEntries} tool.</LI>
067     *   <LI>identify-unique-attribute-conflicts -- Launch the
068     *       {@link IdentifyUniqueAttributeConflicts} tool.</LI>
069     *   <LI>in-memory-directory-server -- Launch the
070     *       {@link InMemoryDirectoryServerTool} tool.</LI>
071     *   <LI>ldapcompare -- Launch the {@link LDAPCompare} tool.</LI>
072     *   <LI>ldapmodify -- Launch the {@link LDAPModify} tool.</LI>
073     *   <LI>ldapsearch -- Launch the {@link LDAPSearch} tool.</LI>
074     *   <LI>ldap-debugger -- Launch the {@link LDAPDebugger} tool.</LI>
075     *   <LI>modrate -- Launch the {@link ModRate} tool.</LI>
076     *   <LI>searchrate -- Launch the {@link SearchRate} tool.</LI>
077     *   <LI>search-and-mod-rate -- Launch the {@link SearchAndModRate} tool.</LI>
078     *   <LI>validate-ldif -- Launch the {@link ValidateLDIF} tool.</LI>
079     *   <LI>version -- Display version information for the LDAP SDK.</LI>
080     * </UL>
081     */
082    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
083    public final class Launcher
084    {
085      /**
086       * Prevent this utility class from being externally instantiated.
087       */
088      Launcher()
089      {
090        // No implementation required.
091      }
092    
093    
094    
095      /**
096       * Parses the command-line arguments and performs any appropriate processing
097       * for this program.
098       *
099       * @param  args  The command-line arguments provided to this program.
100       */
101      public static void main(final String... args)
102      {
103        main(System.out, System.err, args);
104      }
105    
106    
107    
108      /**
109       * Parses the command-line arguments and performs any appropriate processing
110       * for this program.
111       *
112       * @param  outStream  The output stream to which standard out should be
113       *                    written.  It may be {@code null} if output should be
114       *                    suppressed.
115       * @param  errStream  The output stream to which standard error should be
116       *                    written.  It may be {@code null} if error messages
117       *                    should be suppressed.
118       * @param  args       The command-line arguments provided to this program.
119       *
120       * @return  A result code with information about the status of processing.
121       */
122      public static ResultCode main(final OutputStream outStream,
123                                    final OutputStream errStream,
124                                    final String... args)
125      {
126        if ((args == null) || (args.length == 0) ||
127            args[0].equalsIgnoreCase("version"))
128        {
129          if (outStream != null)
130          {
131            final PrintStream out = new PrintStream(outStream);
132            for (final String line : Version.getVersionLines())
133            {
134              out.println(line);
135            }
136          }
137    
138          return ResultCode.SUCCESS;
139        }
140    
141        final String firstArg = StaticUtils.toLowerCase(args[0]);
142        final String[] remainingArgs = new String[args.length - 1];
143        System.arraycopy(args, 1, remainingArgs, 0, remainingArgs.length);
144    
145        if (firstArg.equals("authrate"))
146        {
147          return AuthRate.main(remainingArgs, outStream, errStream);
148        }
149        else if (firstArg.equals("identify-references-to-missing-entries"))
150        {
151          return IdentifyReferencesToMissingEntries.main(remainingArgs, outStream,
152               errStream);
153        }
154        else if (firstArg.equals("identify-unique-attribute-conflicts"))
155        {
156          return IdentifyUniqueAttributeConflicts.main(remainingArgs, outStream,
157               errStream);
158        }
159        else if (firstArg.equals("in-memory-directory-server"))
160        {
161          return InMemoryDirectoryServerTool.main(remainingArgs, outStream,
162               errStream);
163        }
164        else if (firstArg.equals("generate-schema-from-source"))
165        {
166          return GenerateSchemaFromSource.main(remainingArgs, outStream, errStream);
167        }
168        else if (firstArg.equals("generate-source-from-schema"))
169        {
170          return GenerateSourceFromSchema.main(remainingArgs, outStream, errStream);
171        }
172        else if (firstArg.equals("ldapcompare"))
173        {
174          return LDAPCompare.main(remainingArgs, outStream, errStream);
175        }
176        else if (firstArg.equals("ldapmodify"))
177        {
178          return LDAPModify.main(remainingArgs, outStream, errStream);
179        }
180        else if (firstArg.equals("ldapsearch"))
181        {
182          return LDAPSearch.main(remainingArgs, outStream, errStream);
183        }
184        else if (firstArg.equals("ldap-debugger"))
185        {
186          return LDAPDebugger.main(remainingArgs, outStream, errStream);
187        }
188        else if (firstArg.equals("modrate"))
189        {
190          return ModRate.main(remainingArgs, outStream, errStream);
191        }
192        else if (firstArg.equals("searchrate"))
193        {
194          return SearchRate.main(remainingArgs, outStream, errStream);
195        }
196        else if (firstArg.equals("search-and-mod-rate"))
197        {
198          return SearchAndModRate.main(remainingArgs, outStream, errStream);
199        }
200        else if (firstArg.equals("validate-ldif"))
201        {
202          return ValidateLDIF.main(remainingArgs, outStream, errStream);
203        }
204        else
205        {
206          if (errStream != null)
207          {
208            final PrintStream err = new PrintStream(errStream);
209            err.println("Unrecognized tool name '" + args[0] + '\'');
210            err.println("Supported tool names include:");
211            err.println("     authrate");
212            err.println("     identify-references-to-missing-entries");
213            err.println("     identify-unique-attribute-conflicts");
214            err.println("     in-memory-directory-server");
215            err.println("     generate-schema-from-source");
216            err.println("     generate-source-from-schema");
217            err.println("     ldapcompare");
218            err.println("     ldapmodify");
219            err.println("     ldapsearch");
220            err.println("     ldap-debugger");
221            err.println("     modrate");
222            err.println("     searchrate");
223            err.println("     search-and-mod-rate");
224            err.println("     validate-ldif");
225            err.println("     version");
226          }
227    
228          return ResultCode.PARAM_ERROR;
229        }
230      }
231    }