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 4463 2012-03-28 00:46:22Z schulte2005 $
032     *
033     */
034    // </editor-fold>
035    // SECTION-END
036    package org.jomc.cli;
037    
038    import java.io.BufferedReader;
039    import java.io.IOException;
040    import java.io.PrintWriter;
041    import java.io.StringReader;
042    import java.io.StringWriter;
043    import java.util.Date;
044    import java.util.logging.Level;
045    import org.apache.commons.cli.CommandLine;
046    import org.apache.commons.cli.HelpFormatter;
047    import org.apache.commons.cli.Options;
048    import org.apache.commons.cli.ParseException;
049    import org.apache.commons.lang.StringUtils;
050    import org.jomc.model.modlet.DefaultModelProcessor;
051    import org.jomc.model.modlet.DefaultModelProvider;
052    import 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</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:schulte2005@users.sourceforge.net">Christian Schulte</a> 1.0
068     * @version 1.2.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.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
075    // </editor-fold>
076    // SECTION-END
077    public 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 ? t.getMessage() != null ? t.getMessage() : getMessage( t.getCause() ) : null;
526        }
527    
528        // SECTION-END
529        // SECTION-START[Constructors]
530        // <editor-fold defaultstate="collapsed" desc=" Generated Constructors ">
531        /** Creates a new {@code Jomc} instance. */
532        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
533        public Jomc()
534        {
535            // SECTION-START[Default Constructor]
536            super();
537            // SECTION-END
538        }
539        // </editor-fold>
540        // SECTION-END
541        // SECTION-START[Dependencies]
542        // <editor-fold defaultstate="collapsed" desc=" Generated Dependencies ">
543        /**
544         * Gets the {@code <CommandLineParser>} dependency.
545         * <p>
546         *   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.
547         *   That specification does not apply to any scope. A new object is returned whenever requested.
548         * </p>
549         * <dl>
550         *   <dt><b>Final:</b></dt><dd>No</dd>
551         * </dl>
552         * @return The {@code <CommandLineParser>} dependency.
553         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
554         */
555        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
556        private org.apache.commons.cli.CommandLineParser getCommandLineParser()
557        {
558            final org.apache.commons.cli.CommandLineParser _d = (org.apache.commons.cli.CommandLineParser) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "CommandLineParser" );
559            assert _d != null : "'CommandLineParser' dependency not found.";
560            return _d;
561        }
562        /**
563         * Gets the {@code <Commands>} dependency.
564         * <p>
565         *   This method returns any available object of the {@code <JOMC CLI Command>} specification at specification level 1.0.
566         *   That specification does not apply to any scope. A new object is returned whenever requested.
567         * </p>
568         * <dl>
569         *   <dt><b>Final:</b></dt><dd>No</dd>
570         * </dl>
571         * @return The {@code <Commands>} dependency.
572         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
573         */
574        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
575        private org.jomc.cli.Command[] getCommands()
576        {
577            final org.jomc.cli.Command[] _d = (org.jomc.cli.Command[]) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Commands" );
578            assert _d != null : "'Commands' dependency not found.";
579            return _d;
580        }
581        /**
582         * Gets the {@code <DebugOption>} dependency.
583         * <p>
584         *   This method returns the {@code <JOMC CLI Debug Option>} object of the {@code <JOMC CLI Application Option>} specification at specification level 1.2.
585         *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
586         * </p>
587         * <dl>
588         *   <dt><b>Final:</b></dt><dd>No</dd>
589         * </dl>
590         * @return The {@code <DebugOption>} dependency.
591         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
592         */
593        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
594        private org.apache.commons.cli.Option getDebugOption()
595        {
596            final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "DebugOption" );
597            assert _d != null : "'DebugOption' dependency not found.";
598            return _d;
599        }
600        /**
601         * Gets the {@code <FailOnWarningsOption>} dependency.
602         * <p>
603         *   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.
604         *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
605         * </p>
606         * <dl>
607         *   <dt><b>Final:</b></dt><dd>No</dd>
608         * </dl>
609         * @return The {@code <FailOnWarningsOption>} dependency.
610         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
611         */
612        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
613        private org.apache.commons.cli.Option getFailOnWarningsOption()
614        {
615            final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "FailOnWarningsOption" );
616            assert _d != null : "'FailOnWarningsOption' dependency not found.";
617            return _d;
618        }
619        /**
620         * Gets the {@code <Locale>} dependency.
621         * <p>
622         *   This method returns the {@code <default>} object of the {@code <java.util.Locale>} specification at specification level 1.1.
623         *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
624         * </p>
625         * <dl>
626         *   <dt><b>Final:</b></dt><dd>No</dd>
627         * </dl>
628         * @return The {@code <Locale>} dependency.
629         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
630         */
631        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
632        private java.util.Locale getLocale()
633        {
634            final java.util.Locale _d = (java.util.Locale) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Locale" );
635            assert _d != null : "'Locale' dependency not found.";
636            return _d;
637        }
638        /**
639         * Gets the {@code <VerboseOption>} dependency.
640         * <p>
641         *   This method returns the {@code <JOMC CLI Verbose Option>} object of the {@code <JOMC CLI Application Option>} specification at specification level 1.2.
642         *   That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.
643         * </p>
644         * <dl>
645         *   <dt><b>Final:</b></dt><dd>No</dd>
646         * </dl>
647         * @return The {@code <VerboseOption>} dependency.
648         * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
649         */
650        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
651        private org.apache.commons.cli.Option getVerboseOption()
652        {
653            final org.apache.commons.cli.Option _d = (org.apache.commons.cli.Option) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "VerboseOption" );
654            assert _d != null : "'VerboseOption' dependency not found.";
655            return _d;
656        }
657        // </editor-fold>
658        // SECTION-END
659        // SECTION-START[Properties]
660        // <editor-fold defaultstate="collapsed" desc=" Generated Properties ">
661        /**
662         * Gets the value of the {@code <descPad>} property.
663         * <p><dl>
664         *   <dt><b>Final:</b></dt><dd>No</dd>
665         * </dl></p>
666         * @return The number of characters of padding to be prefixed to each description line.
667         * @throws org.jomc.ObjectManagementException if getting the property instance fails.
668         */
669        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
670        private int getDescPad()
671        {
672            final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "descPad" );
673            assert _p != null : "'descPad' property not found.";
674            return _p.intValue();
675        }
676        /**
677         * Gets the value of the {@code <helpCommandName>} property.
678         * <p><dl>
679         *   <dt><b>Final:</b></dt><dd>No</dd>
680         * </dl></p>
681         * @return The name of the command used to request help.
682         * @throws org.jomc.ObjectManagementException if getting the property instance fails.
683         */
684        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
685        private java.lang.String getHelpCommandName()
686        {
687            final java.lang.String _p = (java.lang.String) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "helpCommandName" );
688            assert _p != null : "'helpCommandName' property not found.";
689            return _p;
690        }
691        /**
692         * Gets the value of the {@code <leftPad>} property.
693         * <p><dl>
694         *   <dt><b>Final:</b></dt><dd>No</dd>
695         * </dl></p>
696         * @return The number of characters of padding to be prefixed to each line.
697         * @throws org.jomc.ObjectManagementException if getting the property instance fails.
698         */
699        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
700        private int getLeftPad()
701        {
702            final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "leftPad" );
703            assert _p != null : "'leftPad' property not found.";
704            return _p.intValue();
705        }
706        /**
707         * Gets the value of the {@code <width>} property.
708         * <p><dl>
709         *   <dt><b>Final:</b></dt><dd>No</dd>
710         * </dl></p>
711         * @return The number of characters per line for the usage statement.
712         * @throws org.jomc.ObjectManagementException if getting the property instance fails.
713         */
714        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
715        private int getWidth()
716        {
717            final java.lang.Integer _p = (java.lang.Integer) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getProperty( this, "width" );
718            assert _p != null : "'width' property not found.";
719            return _p.intValue();
720        }
721        // </editor-fold>
722        // SECTION-END
723        // SECTION-START[Messages]
724        // <editor-fold defaultstate="collapsed" desc=" Generated Messages ">
725        /**
726         * Gets the text of the {@code <defaultExceptionMessage>} message.
727         * <p><dl>
728         *   <dt><b>Languages:</b></dt>
729         *     <dd>English (default)</dd>
730         *     <dd>Deutsch</dd>
731         *   <dt><b>Final:</b></dt><dd>No</dd>
732         * </dl></p>
733         * @param locale The locale of the message to return.
734         * @return The text of the {@code <defaultExceptionMessage>} message for {@code locale}.
735         * @throws org.jomc.ObjectManagementException if getting the message instance fails.
736         */
737        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
738        private String getDefaultExceptionMessage( final java.util.Locale locale )
739        {
740            final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "defaultExceptionMessage", locale );
741            assert _m != null : "'defaultExceptionMessage' message not found.";
742            return _m;
743        }
744        /**
745         * Gets the text of the {@code <defaultLogLevelInfo>} message.
746         * <p><dl>
747         *   <dt><b>Languages:</b></dt>
748         *     <dd>English (default)</dd>
749         *     <dd>Deutsch</dd>
750         *   <dt><b>Final:</b></dt><dd>No</dd>
751         * </dl></p>
752         * @param locale The locale of the message to return.
753         * @param defaultLogLevel Format argument.
754         * @return The text of the {@code <defaultLogLevelInfo>} message for {@code locale}.
755         * @throws org.jomc.ObjectManagementException if getting the message instance fails.
756         */
757        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
758        private String getDefaultLogLevelInfo( final java.util.Locale locale, final java.lang.String defaultLogLevel )
759        {
760            final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "defaultLogLevelInfo", locale, defaultLogLevel );
761            assert _m != null : "'defaultLogLevelInfo' message not found.";
762            return _m;
763        }
764        /**
765         * Gets the text of the {@code <illegalArgumentsInfo>} message.
766         * <p><dl>
767         *   <dt><b>Languages:</b></dt>
768         *     <dd>English (default)</dd>
769         *     <dd>Deutsch</dd>
770         *   <dt><b>Final:</b></dt><dd>No</dd>
771         * </dl></p>
772         * @param locale The locale of the message to return.
773         * @param command Format argument.
774         * @param helpCommandName Format argument.
775         * @return The text of the {@code <illegalArgumentsInfo>} message for {@code locale}.
776         * @throws org.jomc.ObjectManagementException if getting the message instance fails.
777         */
778        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
779        private String getIllegalArgumentsInfo( final java.util.Locale locale, final java.lang.String command, final java.lang.String helpCommandName )
780        {
781            final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "illegalArgumentsInfo", locale, command, helpCommandName );
782            assert _m != null : "'illegalArgumentsInfo' message not found.";
783            return _m;
784        }
785        /**
786         * Gets the text of the {@code <timeInfo>} message.
787         * <p><dl>
788         *   <dt><b>Languages:</b></dt>
789         *     <dd>English (default)</dd>
790         *     <dd>Deutsch</dd>
791         *   <dt><b>Final:</b></dt><dd>No</dd>
792         * </dl></p>
793         * @param locale The locale of the message to return.
794         * @param time Format argument.
795         * @return The text of the {@code <timeInfo>} message for {@code locale}.
796         * @throws org.jomc.ObjectManagementException if getting the message instance fails.
797         */
798        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
799        private String getTimeInfo( final java.util.Locale locale, final java.util.Date time )
800        {
801            final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "timeInfo", locale, time );
802            assert _m != null : "'timeInfo' message not found.";
803            return _m;
804        }
805        /**
806         * Gets the text of the {@code <usage>} message.
807         * <p><dl>
808         *   <dt><b>Languages:</b></dt>
809         *     <dd>English (default)</dd>
810         *     <dd>Deutsch</dd>
811         *   <dt><b>Final:</b></dt><dd>No</dd>
812         * </dl></p>
813         * @param locale The locale of the message to return.
814         * @param helpCommandName Format argument.
815         * @return The text of the {@code <usage>} message for {@code locale}.
816         * @throws org.jomc.ObjectManagementException if getting the message instance fails.
817         */
818        @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.2.2", comments = "See http://jomc.sourceforge.net/jomc/1.2/jomc-tools-1.2.2" )
819        private String getUsage( final java.util.Locale locale, final java.lang.String helpCommandName )
820        {
821            final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "usage", locale, helpCommandName );
822            assert _m != null : "'usage' message not found.";
823            return _m;
824        }
825        // </editor-fold>
826        // SECTION-END
827    }