001// SECTION-START[License Header]
002// <editor-fold defaultstate="collapsed" desc=" Generated License ">
003/*
004 *   Java Object Management and Configuration
005 *   Copyright (C) Christian Schulte, 2005-206
006 *   All rights reserved.
007 *
008 *   Redistribution and use in source and binary forms, with or without
009 *   modification, are permitted provided that the following conditions
010 *   are met:
011 *
012 *     o Redistributions of source code must retain the above copyright
013 *       notice, this list of conditions and the following disclaimer.
014 *
015 *     o Redistributions in binary form must reproduce the above copyright
016 *       notice, this list of conditions and the following disclaimer in
017 *       the documentation and/or other materials provided with the
018 *       distribution.
019 *
020 *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
021 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
022 *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
023 *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
024 *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
025 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
026 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
027 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
029 *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030 *
031 *   $JOMC: Jomc.java 4795 2013-04-21 09:09:02Z schulte $
032 *
033 */
034// </editor-fold>
035// SECTION-END
036package org.jomc.cli;
037
038import java.io.BufferedReader;
039import java.io.IOException;
040import java.io.PrintWriter;
041import java.io.StringReader;
042import java.io.StringWriter;
043import java.util.Date;
044import java.util.logging.Level;
045import org.apache.commons.cli.CommandLine;
046import org.apache.commons.cli.HelpFormatter;
047import org.apache.commons.cli.Options;
048import org.apache.commons.cli.ParseException;
049import org.apache.commons.lang.StringUtils;
050import org.jomc.model.modlet.DefaultModelProcessor;
051import org.jomc.model.modlet.DefaultModelProvider;
052import org.jomc.modlet.DefaultModletProvider;
053
054// SECTION-START[Documentation]
055// <editor-fold defaultstate="collapsed" desc=" Generated Documentation ">
056/**
057 * JOMC command line interface.
058 *
059 * <dl>
060 *   <dt><b>Identifier:</b></dt><dd>JOMC ⁑ CLI ⁑ Application</dd>
061 *   <dt><b>Name:</b></dt><dd>JOMC ⁑ CLI ⁑ Application</dd>
062 *   <dt><b>Abstract:</b></dt><dd>No</dd>
063 *   <dt><b>Final:</b></dt><dd>No</dd>
064 *   <dt><b>Stateless:</b></dt><dd>No</dd>
065 * </dl>
066 *
067 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 1.0
068 * @version 1.5
069 */
070// </editor-fold>
071// SECTION-END
072// SECTION-START[Annotations]
073// <editor-fold defaultstate="collapsed" desc=" Generated Annotations ">
074@javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
075// </editor-fold>
076// SECTION-END
077public final class Jomc
078{
079    // SECTION-START[Jomc]
080
081    /**
082     * Log level events are logged at by default.
083     * @see #getDefaultLogLevel()
084     */
085    private static final Level DEFAULT_LOG_LEVEL = Level.WARNING;
086
087    /** Default log level. */
088    private static volatile Level defaultLogLevel;
089
090    /** Print writer of the instance. */
091    private PrintWriter printWriter;
092
093    /** Log level of the instance. */
094    private Level logLevel;
095
096    /** Greatest severity logged by the command. */
097    private Level severity = Level.ALL;
098
099    /**
100     * Gets the print writer of the instance.
101     *
102     * @return The print writer of the instance.
103     *
104     * @see #setPrintWriter(java.io.PrintWriter)
105     */
106    public PrintWriter getPrintWriter()
107    {
108        if ( this.printWriter == null )
109        {
110            // JDK: As of JDK 6, "this.printWriter = System.console().writer()".
111            this.printWriter = new PrintWriter( System.out, true );
112        }
113
114        return this.printWriter;
115    }
116
117    /**
118     * Sets the print writer of the instance.
119     *
120     * @param value The new print writer of the instance or {@code null}.
121     *
122     * @see #getPrintWriter()
123     */
124    public void setPrintWriter( final PrintWriter value )
125    {
126        this.printWriter = value;
127    }
128
129    /**
130     * Gets the default log level events are logged at.
131     * <p>The default log level is controlled by system property {@code org.jomc.cli.Jomc.defaultLogLevel} holding the
132     * log level to log events at by default. If that property is not set, the {@code WARNING} default is returned.</p>
133     *
134     * @return The log level events are logged at by default.
135     *
136     * @see #getLogLevel()
137     * @see Level#parse(java.lang.String)
138     */
139    public static Level getDefaultLogLevel()
140    {
141        if ( defaultLogLevel == null )
142        {
143            defaultLogLevel = Level.parse( System.getProperty(
144                "org.jomc.cli.Jomc.defaultLogLevel", DEFAULT_LOG_LEVEL.getName() ) );
145
146        }
147
148        return defaultLogLevel;
149    }
150
151    /**
152     * Sets the default log level events are logged at.
153     *
154     * @param value The new default level events are logged at or {@code null}.
155     *
156     * @see #getDefaultLogLevel()
157     */
158    public static void setDefaultLogLevel( final Level value )
159    {
160        defaultLogLevel = value;
161    }
162
163    /**
164     * Gets the log level of the instance.
165     *
166     * @return The log level of the instance.
167     *
168     * @see #getDefaultLogLevel()
169     * @see #setLogLevel(java.util.logging.Level)
170     * @see #isLoggable(java.util.logging.Level)
171     */
172    public Level getLogLevel()
173    {
174        if ( this.logLevel == null )
175        {
176            this.logLevel = getDefaultLogLevel();
177
178            if ( this.isLoggable( Level.CONFIG ) )
179            {
180                this.log( Level.CONFIG,
181                          this.getDefaultLogLevelInfo( this.getLocale(), this.logLevel.getLocalizedName() ), null );
182
183            }
184        }
185
186        return this.logLevel;
187    }
188
189    /**
190     * Sets the log level of the instance.
191     *
192     * @param value The new log level of the instance or {@code null}.
193     *
194     * @see #getLogLevel()
195     * @see #isLoggable(java.util.logging.Level)
196     */
197    public void setLogLevel( final Level value )
198    {
199        this.logLevel = value;
200    }
201
202    /**
203     * Checks if a message at a given level is provided to the listeners of the instance.
204     *
205     * @param level The level to test.
206     *
207     * @return {@code true}, if messages at {@code level} are provided to the listeners of the instance;
208     * {@code false}, if messages at {@code level} are not provided to the listeners of the instance.
209     *
210     * @throws NullPointerException if {@code level} is {@code null}.
211     *
212     * @see #getLogLevel()
213     * @see #setLogLevel(java.util.logging.Level)
214     */
215    public boolean isLoggable( final Level level )
216    {
217        if ( level == null )
218        {
219            throw new NullPointerException( "level" );
220        }
221
222        return level.intValue() >= this.getLogLevel().intValue();
223    }
224
225    /**
226     * Processes the given arguments and executes the corresponding command.
227     *
228     * @param args Arguments to process.
229     *
230     * @return Status code.
231     *
232     * @see Command#STATUS_SUCCESS
233     * @see Command#STATUS_FAILURE
234     */
235    public int jomc( final String[] args )
236    {
237        Command cmd = null;
238        this.severity = Level.ALL;
239
240        try
241        {
242            DefaultModelProvider.setDefaultModuleLocation( "META-INF/jomc-cli.xml" );
243            DefaultModelProcessor.setDefaultTransformerLocation( "META-INF/jomc-cli.xsl" );
244            DefaultModletProvider.setDefaultModletLocation( "META-INF/jomc-modlet.xml" );
245
246            final StringBuilder commandInfo = new StringBuilder();
247
248            for ( Command c : this.getCommands() )
249            {
250                if ( cmd == null && args != null && args.length > 0
251                     && ( args[0].equals( c.getName() ) || args[0].equals( c.getAbbreviatedName() ) ) )
252                {
253                    cmd = c;
254                }
255
256                commandInfo.append( StringUtils.rightPad( c.getName(), 25 ) ).append( " : " ).
257                    append( c.getShortDescription( this.getLocale() ) ).append( " (" ).append( c.getAbbreviatedName() ).
258                    append( ")" ).append( System.getProperty( "line.separator", "\n" ) );
259
260            }
261
262            if ( cmd == null )
263            {
264                this.getPrintWriter().println( this.getUsage( this.getLocale(), this.getHelpCommandName() ) );
265                this.getPrintWriter().println();
266                this.getPrintWriter().println( commandInfo.toString() );
267                return Command.STATUS_FAILURE;
268            }
269
270            final String[] commandArguments = new String[ args.length - 1 ];
271            System.arraycopy( args, 1, commandArguments, 0, commandArguments.length );
272
273            final Options options = cmd.getOptions();
274            options.addOption( this.getDebugOption() );
275            options.addOption( this.getVerboseOption() );
276            options.addOption( this.getFailOnWarningsOption() );
277
278            if ( commandArguments.length > 0 && this.getHelpCommandName().equals( commandArguments[0] ) )
279            {
280                final StringWriter usage = new StringWriter();
281                final StringWriter opts = new StringWriter();
282                final HelpFormatter formatter = new HelpFormatter();
283
284                PrintWriter pw = new PrintWriter( usage );
285                formatter.printUsage( pw, this.getWidth(), cmd.getName(), options );
286                pw.close();
287                assert !pw.checkError() : "Unexpected error printing usage.";
288
289                pw = new PrintWriter( opts );
290                formatter.printOptions( pw, this.getWidth(), options, this.getLeftPad(), this.getDescPad() );
291                pw.close();
292                assert !pw.checkError() : "Unexpected error printing options.";
293
294                this.getPrintWriter().println( cmd.getShortDescription( this.getLocale() ) );
295                this.getPrintWriter().println();
296                this.getPrintWriter().println( usage.toString() );
297                this.getPrintWriter().println( opts.toString() );
298                this.getPrintWriter().println();
299                this.getPrintWriter().println( cmd.getLongDescription( this.getLocale() ) );
300                this.getPrintWriter().println();
301                return Command.STATUS_SUCCESS;
302            }
303
304            cmd.getListeners().add( new Command.Listener()
305            {
306
307                public void onLog( final Level level, final String message, final Throwable t )
308                {
309                    log( level, message, t );
310                }
311
312            } );
313
314            DefaultModelProvider.setDefaultModuleLocation( null );
315            DefaultModelProcessor.setDefaultTransformerLocation( null );
316            DefaultModletProvider.setDefaultModletLocation( null );
317
318            final CommandLine commandLine = this.getCommandLineParser().parse( options, commandArguments );
319            final boolean debug = commandLine.hasOption( this.getDebugOption().getOpt() );
320            final boolean verbose = commandLine.hasOption( this.getVerboseOption().getOpt() );
321            Level debugLevel = Level.ALL;
322
323            if ( debug )
324            {
325                final String debugOption = commandLine.getOptionValue( this.getDebugOption().getOpt() );
326                if ( debugOption != null )
327                {
328                    debugLevel = Level.parse( debugOption );
329                }
330            }
331
332            if ( debug || verbose )
333            {
334                this.setLogLevel( debug ? debugLevel : Level.INFO );
335            }
336
337            cmd.setLogLevel( this.getLogLevel() );
338
339            if ( this.isLoggable( Level.FINER ) )
340            {
341                for ( int i = 0; i < args.length; i++ )
342                {
343                    this.log( Level.FINER, new StringBuilder().append( "[" ).append( i ).append( "] -> '" ).
344                        append( args[i] ).append( "'" ).append( System.getProperty( "line.separator", "\n" ) ).
345                        toString(), null );
346
347                }
348            }
349
350            final boolean failOnWarnings = commandLine.hasOption( this.getFailOnWarningsOption().getOpt() );
351
352            final int status = cmd.execute( commandLine );
353            if ( status == Command.STATUS_SUCCESS && failOnWarnings
354                 && this.severity.intValue() >= Level.WARNING.intValue() )
355            {
356                return Command.STATUS_FAILURE;
357            }
358
359            return status;
360        }
361        catch ( final ParseException e )
362        {
363            this.log( Level.SEVERE, this.getIllegalArgumentsInfo(
364                this.getLocale(), cmd.getName(), this.getHelpCommandName() ), e );
365
366            return Command.STATUS_FAILURE;
367        }
368        catch ( final Throwable t )
369        {
370            this.log( Level.SEVERE, null, t );
371            return Command.STATUS_FAILURE;
372        }
373        finally
374        {
375            DefaultModelProvider.setDefaultModuleLocation( null );
376            DefaultModelProcessor.setDefaultTransformerLocation( null );
377            DefaultModletProvider.setDefaultModletLocation( null );
378            this.getPrintWriter().flush();
379            this.severity = Level.ALL;
380        }
381    }
382
383    /**
384     * Main entry point.
385     *
386     * @param args The application arguments.
387     */
388    public static void main( final String[] args )
389    {
390        System.exit( run( args ) );
391    }
392
393    /**
394     * Main entry point without exiting the VM.
395     *
396     * @param args The application arguments.
397     *
398     * @return Status code.
399     *
400     * @see Command#STATUS_SUCCESS
401     * @see Command#STATUS_FAILURE
402     */
403    public static int run( final String[] args )
404    {
405        return new Jomc().jomc( args );
406    }
407
408    /**
409     * Logs to the print writer of the instance.
410     *
411     * @param level The level of the event.
412     * @param message The message of the event or {@code null}.
413     * @param throwable The throwable of the event {@code null}.
414     *
415     * @throws NullPointerException if {@code level} is {@code null}.
416     */
417    private void log( final Level level, final String message, final Throwable throwable )
418    {
419        if ( level == null )
420        {
421            throw new NullPointerException( "level" );
422        }
423
424        if ( this.severity.intValue() < level.intValue() )
425        {
426            this.severity = level;
427        }
428
429        if ( this.isLoggable( level ) )
430        {
431            if ( message != null )
432            {
433                this.getPrintWriter().print( this.formatLogLines( level, "" ) );
434                this.getPrintWriter().print( this.formatLogLines( level, message ) );
435            }
436
437            if ( throwable != null )
438            {
439                this.getPrintWriter().print( this.formatLogLines( level, "" ) );
440                final String m = getMessage( throwable );
441
442                if ( m != null && m.length() > 0 )
443                {
444                    this.getPrintWriter().print( this.formatLogLines( level, m ) );
445                }
446                else
447                {
448                    this.getPrintWriter().print( this.formatLogLines(
449                        level, this.getDefaultExceptionMessage( this.getLocale() ) ) );
450
451                }
452
453                if ( this.getLogLevel().intValue() < Level.INFO.intValue() )
454                {
455                    final StringWriter stackTrace = new StringWriter();
456                    final PrintWriter pw = new PrintWriter( stackTrace );
457                    throwable.printStackTrace( pw );
458                    pw.flush();
459                    this.getPrintWriter().print( this.formatLogLines( level, stackTrace.toString() ) );
460                }
461            }
462        }
463
464        this.getPrintWriter().flush();
465    }
466
467    private String formatLogLines( final Level level, final String text )
468    {
469        BufferedReader reader = null;
470        boolean suppressExceptionOnClose = true;
471
472        try
473        {
474            final StringBuilder lines = new StringBuilder( text.length() );
475            reader = new BufferedReader( new StringReader( text ) );
476
477            String line;
478            while ( ( line = reader.readLine() ) != null )
479            {
480                final boolean debug = this.getLogLevel().intValue() < Level.INFO.intValue();
481                lines.append( "[" ).append( level.getLocalizedName() );
482
483                if ( debug )
484                {
485                    lines.append( "|" ).append( Thread.currentThread().getName() ).append( "|" ).
486                        append( this.getTimeInfo( this.getLocale(), new Date( System.currentTimeMillis() ) ) );
487
488                }
489
490                lines.append( "] " ).append( line ).append( System.getProperty( "line.separator", "\n" ) );
491            }
492
493            suppressExceptionOnClose = false;
494            return lines.toString();
495        }
496        catch ( final IOException e )
497        {
498            throw new AssertionError( e );
499        }
500        finally
501        {
502            try
503            {
504                if ( reader != null )
505                {
506                    reader.close();
507                }
508            }
509            catch ( final IOException e )
510            {
511                if ( suppressExceptionOnClose )
512                {
513                    this.log( Level.SEVERE, getMessage( e ), e );
514                }
515                else
516                {
517                    throw new AssertionError( e );
518                }
519            }
520        }
521    }
522
523    private static String getMessage( final Throwable t )
524    {
525        return t != null
526               ? t.getMessage() != null && t.getMessage().trim().length() > 0
527                 ? t.getMessage()
528                 : getMessage( t.getCause() )
529               : null;
530
531    }
532
533    // SECTION-END
534    // SECTION-START[Constructors]
535    // <editor-fold defaultstate="collapsed" desc=" Generated Constructors ">
536    /** Creates a new {@code Jomc} instance. */
537    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
538    public Jomc()
539    {
540        // SECTION-START[Default Constructor]
541        super();
542        // SECTION-END
543    }
544    // </editor-fold>
545    // SECTION-END
546    // SECTION-START[Dependencies]
547    // <editor-fold defaultstate="collapsed" desc=" Generated Dependencies ">
548    /**
549     * Gets the {@code <Command Line Parser>} dependency.
550     * <p>
551     *   This method returns the {@code <Commons CLI - GNU Command Line Parser>} object of the {@code <org.apache.commons.cli.CommandLineParser>} specification at any specification level.
552     *   That specification does not apply to any scope. A new object is returned whenever requested.
553     * </p>
554     * <dl>
555     *   <dt><b>Final:</b></dt><dd>No</dd>
556     * </dl>
557     * @return The {@code <Command Line Parser>} dependency.
558     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
559     */
560    @SuppressWarnings("unused")
561    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
562    private org.apache.commons.cli.CommandLineParser getCommandLineParser()
563    {
564        final org.apache.commons.cli.CommandLineParser _d = (org.apache.commons.cli.CommandLineParser) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Command Line Parser" );
565        assert _d != null : "'Command Line Parser' dependency not found.";
566        return _d;
567    }
568    /**
569     * Gets the {@code <Commands>} dependency.
570     * <p>
571     *   This method returns any available object of the {@code <JOMC ⁑ CLI ⁑ Command>} specification at specification level 1.0.
572     *   That specification does not apply to any scope. A new object is returned whenever requested.
573     * </p>
574     * <dl>
575     *   <dt><b>Final:</b></dt><dd>No</dd>
576     * </dl>
577     * @return The {@code <Commands>} dependency.
578     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
579     */
580    @SuppressWarnings("unused")
581    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
582    private org.jomc.cli.Command[] getCommands()
583    {
584        final org.jomc.cli.Command[] _d = (org.jomc.cli.Command[]) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Commands" );
585        assert _d != null : "'Commands' dependency not found.";
586        return _d;
587    }
588    /**
589     * Gets the {@code <Debug Option>} dependency.
590     * <p>
591     *   This method returns the {@code <JOMC ⁑ CLI ⁑ Debug Option>} object of the {@code <JOMC ⁑ CLI ⁑ Application Option>} specification at specification level 1.2.
592     *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
593     * </p>
594     * <dl>
595     *   <dt><b>Final:</b></dt><dd>No</dd>
596     * </dl>
597     * @return The {@code <Debug Option>} dependency.
598     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
599     */
600    @SuppressWarnings("unused")
601    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
602    private org.apache.commons.cli.Option getDebugOption()
603    {
604        final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Debug Option" );
605        assert _d != null : "'Debug Option' dependency not found.";
606        return _d;
607    }
608    /**
609     * Gets the {@code <Fail On Warnings Option>} dependency.
610     * <p>
611     *   This method returns the {@code <JOMC ⁑ CLI ⁑ Fail-On-Warnings Option>} object of the {@code <JOMC ⁑ CLI ⁑ Application Option>} specification at specification level 1.2.
612     *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
613     * </p>
614     * <dl>
615     *   <dt><b>Final:</b></dt><dd>No</dd>
616     * </dl>
617     * @return The {@code <Fail On Warnings Option>} dependency.
618     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
619     */
620    @SuppressWarnings("unused")
621    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
622    private org.apache.commons.cli.Option getFailOnWarningsOption()
623    {
624        final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Fail On Warnings Option" );
625        assert _d != null : "'Fail On Warnings Option' dependency not found.";
626        return _d;
627    }
628    /**
629     * Gets the {@code <Locale>} dependency.
630     * <p>
631     *   This method returns the {@code <default>} object of the {@code <java.util.Locale>} specification at specification level 1.1.
632     *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
633     * </p>
634     * <dl>
635     *   <dt><b>Final:</b></dt><dd>No</dd>
636     * </dl>
637     * @return The {@code <Locale>} dependency.
638     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
639     */
640    @SuppressWarnings("unused")
641    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
642    private java.util.Locale getLocale()
643    {
644        final java.util.Locale _d = (java.util.Locale) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Locale" );
645        assert _d != null : "'Locale' dependency not found.";
646        return _d;
647    }
648    /**
649     * Gets the {@code <Verbose Option>} dependency.
650     * <p>
651     *   This method returns the {@code <JOMC ⁑ CLI ⁑ Verbose Option>} object of the {@code <JOMC ⁑ CLI ⁑ Application Option>} specification at specification level 1.2.
652     *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
653     * </p>
654     * <dl>
655     *   <dt><b>Final:</b></dt><dd>No</dd>
656     * </dl>
657     * @return The {@code <Verbose Option>} dependency.
658     * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
659     */
660    @SuppressWarnings("unused")
661    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
662    private org.apache.commons.cli.Option getVerboseOption()
663    {
664        final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Verbose Option" );
665        assert _d != null : "'Verbose Option' dependency not found.";
666        return _d;
667    }
668    // </editor-fold>
669    // SECTION-END
670    // SECTION-START[Properties]
671    // <editor-fold defaultstate="collapsed" desc=" Generated Properties ">
672    /**
673     * Gets the value of the {@code <Desc Pad>} property.
674     * <p><dl>
675     *   <dt><b>Final:</b></dt><dd>No</dd>
676     * </dl></p>
677     * @return The number of characters of padding to be prefixed to each description line.
678     * @throws org.jomc.ObjectManagementException if getting the property instance fails.
679     */
680    @SuppressWarnings("unused")
681    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
682    private int getDescPad()
683    {
684        final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "Desc Pad" );
685        assert _p != null : "'Desc Pad' property not found.";
686        return _p.intValue();
687    }
688    /**
689     * Gets the value of the {@code <Help Command Name>} property.
690     * <p><dl>
691     *   <dt><b>Final:</b></dt><dd>No</dd>
692     * </dl></p>
693     * @return The name of the command used to request help.
694     * @throws org.jomc.ObjectManagementException if getting the property instance fails.
695     */
696    @SuppressWarnings("unused")
697    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
698    private java.lang.String getHelpCommandName()
699    {
700        final java.lang.String _p = (java.lang.String) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "Help Command Name" );
701        assert _p != null : "'Help Command Name' property not found.";
702        return _p;
703    }
704    /**
705     * Gets the value of the {@code <Left Pad>} property.
706     * <p><dl>
707     *   <dt><b>Final:</b></dt><dd>No</dd>
708     * </dl></p>
709     * @return The number of characters of padding to be prefixed to each line.
710     * @throws org.jomc.ObjectManagementException if getting the property instance fails.
711     */
712    @SuppressWarnings("unused")
713    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
714    private int getLeftPad()
715    {
716        final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "Left Pad" );
717        assert _p != null : "'Left Pad' property not found.";
718        return _p.intValue();
719    }
720    /**
721     * Gets the value of the {@code <width>} property.
722     * <p><dl>
723     *   <dt><b>Final:</b></dt><dd>No</dd>
724     * </dl></p>
725     * @return The number of characters per line for the usage statement.
726     * @throws org.jomc.ObjectManagementException if getting the property instance fails.
727     */
728    @SuppressWarnings("unused")
729    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
730    private int getWidth()
731    {
732        final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "width" );
733        assert _p != null : "'width' property not found.";
734        return _p.intValue();
735    }
736    // </editor-fold>
737    // SECTION-END
738    // SECTION-START[Messages]
739    // <editor-fold defaultstate="collapsed" desc=" Generated Messages ">
740    /**
741     * Gets the text of the {@code <Default Exception Message>} message.
742     * <p><dl>
743     *   <dt><b>Languages:</b></dt>
744     *     <dd>English (default)</dd>
745     *     <dd>Deutsch</dd>
746     *   <dt><b>Final:</b></dt><dd>No</dd>
747     * </dl></p>
748     * @param locale The locale of the message to return.
749     * @return The text of the {@code <Default Exception Message>} message for {@code locale}.
750     * @throws org.jomc.ObjectManagementException if getting the message instance fails.
751     */
752    @SuppressWarnings("unused")
753    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
754    private String getDefaultExceptionMessage( final java.util.Locale locale )
755    {
756        final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "Default Exception Message", locale );
757        assert _m != null : "'Default Exception Message' message not found.";
758        return _m;
759    }
760    /**
761     * Gets the text of the {@code <Default Log Level Info>} message.
762     * <p><dl>
763     *   <dt><b>Languages:</b></dt>
764     *     <dd>English (default)</dd>
765     *     <dd>Deutsch</dd>
766     *   <dt><b>Final:</b></dt><dd>No</dd>
767     * </dl></p>
768     * @param locale The locale of the message to return.
769     * @param defaultLogLevel Format argument.
770     * @return The text of the {@code <Default Log Level Info>} message for {@code locale}.
771     * @throws org.jomc.ObjectManagementException if getting the message instance fails.
772     */
773    @SuppressWarnings("unused")
774    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
775    private String getDefaultLogLevelInfo( final java.util.Locale locale, final java.lang.String defaultLogLevel )
776    {
777        final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "Default Log Level Info", locale, defaultLogLevel );
778        assert _m != null : "'Default Log Level Info' message not found.";
779        return _m;
780    }
781    /**
782     * Gets the text of the {@code <Illegal Arguments Info>} message.
783     * <p><dl>
784     *   <dt><b>Languages:</b></dt>
785     *     <dd>English (default)</dd>
786     *     <dd>Deutsch</dd>
787     *   <dt><b>Final:</b></dt><dd>No</dd>
788     * </dl></p>
789     * @param locale The locale of the message to return.
790     * @param command Format argument.
791     * @param helpCommandName Format argument.
792     * @return The text of the {@code <Illegal Arguments Info>} message for {@code locale}.
793     * @throws org.jomc.ObjectManagementException if getting the message instance fails.
794     */
795    @SuppressWarnings("unused")
796    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
797    private String getIllegalArgumentsInfo( final java.util.Locale locale, final java.lang.String command, final java.lang.String helpCommandName )
798    {
799        final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "Illegal Arguments Info", locale, command, helpCommandName );
800        assert _m != null : "'Illegal Arguments Info' message not found.";
801        return _m;
802    }
803    /**
804     * Gets the text of the {@code <Time Info>} message.
805     * <p><dl>
806     *   <dt><b>Languages:</b></dt>
807     *     <dd>English (default)</dd>
808     *     <dd>Deutsch</dd>
809     *   <dt><b>Final:</b></dt><dd>No</dd>
810     * </dl></p>
811     * @param locale The locale of the message to return.
812     * @param time Format argument.
813     * @return The text of the {@code <Time Info>} message for {@code locale}.
814     * @throws org.jomc.ObjectManagementException if getting the message instance fails.
815     */
816    @SuppressWarnings("unused")
817    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
818    private String getTimeInfo( final java.util.Locale locale, final java.util.Date time )
819    {
820        final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "Time Info", locale, time );
821        assert _m != null : "'Time Info' message not found.";
822        return _m;
823    }
824    /**
825     * Gets the text of the {@code <Usage>} message.
826     * <p><dl>
827     *   <dt><b>Languages:</b></dt>
828     *     <dd>English (default)</dd>
829     *     <dd>Deutsch</dd>
830     *   <dt><b>Final:</b></dt><dd>No</dd>
831     * </dl></p>
832     * @param locale The locale of the message to return.
833     * @param helpCommandName Format argument.
834     * @return The text of the {@code <Usage>} message for {@code locale}.
835     * @throws org.jomc.ObjectManagementException if getting the message instance fails.
836     */
837    @SuppressWarnings("unused")
838    @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.5", comments = "See http://www.jomc.org/jomc/1.5/jomc-tools-1.5" )
839    private String getUsage( final java.util.Locale locale, final java.lang.String helpCommandName )
840    {
841        final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "Usage", locale, helpCommandName );
842        assert _m != null : "'Usage' message not found.";
843        return _m;
844    }
845    // </editor-fold>
846    // SECTION-END
847}