001/*
002 *   Copyright (C) 2005 Christian Schulte <cs@schulte.it>
003 *   All rights reserved.
004 *
005 *   Redistribution and use in source and binary forms, with or without
006 *   modification, are permitted provided that the following conditions
007 *   are met:
008 *
009 *     o Redistributions of source code must retain the above copyright
010 *       notice, this list of conditions and the following disclaimer.
011 *
012 *     o Redistributions in binary form must reproduce the above copyright
013 *       notice, this list of conditions and the following disclaimer in
014 *       the documentation and/or other materials provided with the
015 *       distribution.
016 *
017 *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
018 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
019 *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
020 *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
021 *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
022 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
023 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
024 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
026 *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027 *
028 *   $JOMC: ToolsModelValidator.java 5135 2016-04-08 13:53:07Z schulte $
029 *
030 */
031package org.jomc.tools.modlet;
032
033import java.text.MessageFormat;
034import java.util.ArrayList;
035import java.util.Arrays;
036import java.util.List;
037import java.util.Locale;
038import java.util.ResourceBundle;
039import java.util.logging.Level;
040import javax.xml.bind.JAXBElement;
041import org.jomc.model.Dependencies;
042import org.jomc.model.Dependency;
043import org.jomc.model.Implementation;
044import org.jomc.model.Message;
045import org.jomc.model.Messages;
046import org.jomc.model.ModelObjectException;
047import org.jomc.model.Module;
048import org.jomc.model.Modules;
049import org.jomc.model.Specification;
050import org.jomc.model.modlet.ModelHelper;
051import org.jomc.modlet.Model;
052import org.jomc.modlet.ModelContext;
053import org.jomc.modlet.ModelException;
054import org.jomc.modlet.ModelValidationReport;
055import org.jomc.modlet.ModelValidator;
056import org.jomc.tools.model.ObjectFactory;
057import org.jomc.tools.model.SourceFileType;
058import org.jomc.tools.model.SourceFilesType;
059import org.jomc.tools.model.SourceSectionType;
060import org.jomc.tools.model.SourceSectionsType;
061import org.jomc.tools.model.TemplateParameterType;
062
063/**
064 * Object management and configuration tools {@code ModelValidator} implementation.
065 *
066 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
067 * @version $JOMC: ToolsModelValidator.java 5135 2016-04-08 13:53:07Z schulte $
068 * @see ModelContext#validateModel(org.jomc.modlet.Model)
069 * @since 1.2
070 */
071public class ToolsModelValidator implements ModelValidator
072{
073
074    /**
075     * Constant for the name of the model context attribute backing property {@code validateJava}.
076     *
077     * @see ModelContext#getAttribute(java.lang.String)
078     * @since 1.6
079     */
080    public static final String VALIDATE_JAVA_ATTRIBUTE_NAME =
081        "org.jomc.tools.modlet.ToolsModelValidator.validateJavaAttribute";
082
083    /**
084     * Constant for the name of the system property controlling property {@code defaultValidateJava}.
085     *
086     * @see #isDefaultValidateJava()
087     * @since 1.6
088     */
089    private static final String DEFAULT_VALIDATE_JAVA_PROPERTY_NAME =
090        "org.jomc.tools.modlet.ToolsModelValidator.defaultValidateJava";
091
092    /**
093     * Default value of the flag indicating the validator is performing Java related validation by default.
094     *
095     * @see #isDefaultValidateJava()
096     * @since 1.6
097     */
098    private static final Boolean DEFAULT_VALIDATE_JAVA = Boolean.TRUE;
099
100    /**
101     * Flag indicating the validator is performing Java related validation by default.
102     *
103     * @since 1.6
104     */
105    private static volatile Boolean defaultValidateJava;
106
107    /**
108     * Flag indicating the validator is performing Java related validation.
109     *
110     * @since 1.6
111     */
112    private Boolean validateJava;
113
114    /**
115     * Creates a new {@code ToolsModelValidator} instance.
116     */
117    public ToolsModelValidator()
118    {
119        super();
120    }
121
122    /**
123     * Gets a flag indicating the validator is performing Java related validation by default.
124     * <p>
125     * The default validate Java flag is controlled by system property
126     * {@code org.jomc.tools.modlet.ToolsModelValidator.defaultValidateJava} holding a value indicating the validator
127     * is performing Java related validation by default. If that property is not set, the {@code true} default is
128     * returned.
129     * </p>
130     *
131     * @return {@code true}, if the validator is performing Java related validation by default; {@code false}, if the
132     * validator is not performing Java related validation by default.
133     *
134     * @see #setDefaultValidateJava(java.lang.Boolean)
135     *
136     * @since 1.6
137     */
138    public static boolean isDefaultValidateJava()
139    {
140        if ( defaultValidateJava == null )
141        {
142            defaultValidateJava = Boolean.valueOf( System.getProperty( DEFAULT_VALIDATE_JAVA_PROPERTY_NAME,
143                                                                       Boolean.toString( DEFAULT_VALIDATE_JAVA ) ) );
144
145        }
146
147        return defaultValidateJava;
148    }
149
150    /**
151     * Sets the flag indicating the validator is performing Java related validation by default.
152     *
153     * @param value The new value of the flag indicating the validator is performing Java related validation by default
154     * or {@code null}.
155     *
156     * @see #isDefaultValidateJava()
157     *
158     * @since 1.6
159     */
160    public static void setDefaultValidateJava( final Boolean value )
161    {
162        defaultValidateJava = value;
163    }
164
165    /**
166     * Gets a flag indicating the validator is performing Java related validation.
167     *
168     * @return {@code true}, if the validator is performing Java related validation; {@code false}, if the the validator
169     * is not performing Java related validation.
170     *
171     * @see #isDefaultValidateJava()
172     * @see #setValidateJava(java.lang.Boolean)
173     *
174     * @since 1.6
175     */
176    public final boolean isValidateJava()
177    {
178        if ( this.validateJava == null )
179        {
180            this.validateJava = isDefaultValidateJava();
181        }
182
183        return this.validateJava;
184    }
185
186    /**
187     * Sets the flag indicating the validator is performing Java related validation.
188     *
189     * @param value The new value of the flag indicating the validator is performing Java related validation or
190     * {@code null}.
191     *
192     * @see #isValidateJava()
193     *
194     * @since 1.6
195     */
196    public final void setValidateJava( final Boolean value )
197    {
198        this.validateJava = value;
199    }
200
201    public ModelValidationReport validateModel( final ModelContext context, final Model model ) throws ModelException
202    {
203        if ( context == null )
204        {
205            throw new NullPointerException( "context" );
206        }
207        if ( model == null )
208        {
209            throw new NullPointerException( "model" );
210        }
211
212        final ModelValidationReport report = new ModelValidationReport();
213        this.assertValidToolsTypes( context, model, report );
214        return report;
215    }
216
217    private void assertValidToolsTypes( final ModelContext context, final Model model,
218                                        final ModelValidationReport report )
219    {
220        final List<SourceFileType> sourceFileType = model.getAnyObjects( SourceFileType.class );
221        final List<SourceFilesType> sourceFilesType = model.getAnyObjects( SourceFilesType.class );
222        final List<SourceSectionType> sourceSectionType = model.getAnyObjects( SourceSectionType.class );
223        final List<SourceSectionsType> sourceSectionsType = model.getAnyObjects( SourceSectionsType.class );
224
225        if ( sourceFileType != null )
226        {
227            for ( final SourceFileType s : sourceFileType )
228            {
229                report.getDetails().add( new ModelValidationReport.Detail(
230                    "MODEL_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
231                        "modelSourceFileConstraint", model.getIdentifier(), s.getIdentifier() ),
232                    new ObjectFactory().createSourceFile( s ) ) );
233
234                if ( this.isValidateJava() )
235                {
236                    for ( final TemplateParameterType p : s.getTemplateParameter() )
237                    {
238                        try
239                        {
240                            p.getJavaValue( context.getClassLoader() );
241                        }
242                        catch ( final ModelObjectException e )
243                        {
244                            final String message = getMessage( e );
245
246                            if ( context.isLoggable( Level.FINE ) )
247                            {
248                                context.log( Level.FINE, message, e );
249                            }
250
251                            report.getDetails().add( new ModelValidationReport.Detail(
252                                "MODEL_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE, getMessage(
253                                    "modelSourceFileTemplateParameterJavaValueConstraint", model.getIdentifier(),
254                                    s.getIdentifier(), p.getName(),
255                                    message != null && message.length() > 0 ? " " + message : "" ),
256                                new ObjectFactory().createSourceFile( s ) ) );
257
258                        }
259                    }
260                }
261
262                this.validateTemplateParameters( report, context, s.getSourceSections(),
263                                                 "MODEL_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
264                                                 new ObjectFactory().createSourceFile( s ),
265                                                 "modelSourceFileSectionTemplateParameterJavaValueConstraint",
266                                                 model.getIdentifier(), s.getIdentifier() );
267
268            }
269        }
270
271        if ( sourceFilesType != null )
272        {
273            for ( final SourceFilesType files : sourceFilesType )
274            {
275                for ( final SourceFileType s : files.getSourceFile() )
276                {
277                    report.getDetails().add( new ModelValidationReport.Detail(
278                        "MODEL_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
279                            "modelSourceFileConstraint", model.getIdentifier(), s.getIdentifier() ),
280                        new ObjectFactory().createSourceFile( s ) ) );
281
282                    if ( this.isValidateJava() )
283                    {
284                        for ( final TemplateParameterType p : s.getTemplateParameter() )
285                        {
286                            try
287                            {
288                                p.getJavaValue( context.getClassLoader() );
289                            }
290                            catch ( final ModelObjectException e )
291                            {
292                                final String message = getMessage( e );
293
294                                if ( context.isLoggable( Level.FINE ) )
295                                {
296                                    context.log( Level.FINE, message, e );
297                                }
298
299                                report.getDetails().add( new ModelValidationReport.Detail(
300                                    "MODEL_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
301                                    getMessage( "modelSourceFileTemplateParameterJavaValueConstraint",
302                                                model.getIdentifier(), s.getIdentifier(), p.getName(),
303                                                message != null && message.length() > 0 ? " " + message : "" ),
304                                    new ObjectFactory().createSourceFile( s ) ) );
305
306                            }
307                        }
308                    }
309
310                    this.validateTemplateParameters(
311                        report, context, s.getSourceSections(),
312                        "MODEL_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
313                        new ObjectFactory().createSourceFile( s ),
314                        "modelSourceFileSectionTemplateParameterJavaValueConstraint",
315                        model.getIdentifier(), s.getIdentifier() );
316
317                }
318
319                if ( files.getSourceFile().isEmpty() )
320                {
321                    report.getDetails().add( new ModelValidationReport.Detail(
322                        "MODEL_SOURCE_FILES_CONSTRAINT", Level.SEVERE, getMessage(
323                            "modelSourceFilesConstraint", model.getIdentifier() ),
324                        new ObjectFactory().createSourceFiles( files ) ) );
325
326                }
327            }
328        }
329
330        if ( sourceSectionType != null )
331        {
332            for ( final SourceSectionType s : sourceSectionType )
333            {
334                report.getDetails().add( new ModelValidationReport.Detail(
335                    "MODEL_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
336                        "modelSourceSectionConstraint", model.getIdentifier(), s.getName() ),
337                    new ObjectFactory().createSourceSection( s ) ) );
338
339                if ( this.isValidateJava() )
340                {
341                    for ( final TemplateParameterType p : s.getTemplateParameter() )
342                    {
343                        try
344                        {
345                            p.getJavaValue( context.getClassLoader() );
346                        }
347                        catch ( final ModelObjectException e )
348                        {
349                            final String message = getMessage( e );
350
351                            if ( context.isLoggable( Level.FINE ) )
352                            {
353                                context.log( Level.FINE, message, e );
354                            }
355
356                            report.getDetails().add( new ModelValidationReport.Detail(
357                                "MODEL_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
358                                getMessage( "modelSourceSectionTemplateParameterJavaValueConstraint",
359                                            model.getIdentifier(), s.getName(), p.getName(),
360                                            message != null && message.length() > 0 ? " " + message : "" ),
361                                new ObjectFactory().createSourceSection( s ) ) );
362
363                        }
364                    }
365                }
366
367                this.validateTemplateParameters( report, context, s.getSourceSections(),
368                                                 "MODEL_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
369                                                 new ObjectFactory().createSourceSection( s ),
370                                                 "modelSourceSectionTemplateParameterJavaValueConstraint",
371                                                 model.getIdentifier() );
372
373            }
374        }
375
376        if ( sourceSectionsType != null )
377        {
378            for ( final SourceSectionsType sections : sourceSectionsType )
379            {
380                for ( final SourceSectionType s : sections.getSourceSection() )
381                {
382                    report.getDetails().add( new ModelValidationReport.Detail(
383                        "MODEL_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
384                            "modelSourceSectionConstraint", model.getIdentifier(), s.getName() ),
385                        new ObjectFactory().createSourceSection( s ) ) );
386
387                }
388
389                if ( sections.getSourceSection().isEmpty() )
390                {
391                    report.getDetails().add( new ModelValidationReport.Detail(
392                        "MODEL_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
393                            "modelSourceSectionsConstraint", model.getIdentifier() ),
394                        new ObjectFactory().createSourceSections( sections ) ) );
395
396                }
397
398                this.validateTemplateParameters( report, context, sections,
399                                                 "MODEL_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
400                                                 new ObjectFactory().createSourceSections( sections ),
401                                                 "modelSourceSectionTemplateParameterJavaValueConstraint",
402                                                 model.getIdentifier() );
403
404            }
405        }
406
407        final Modules modules = ModelHelper.getModules( model );
408
409        if ( modules != null )
410        {
411            this.assertValidToolsTypes( context, modules, report );
412        }
413    }
414
415    private void assertValidToolsTypes( final ModelContext context, final Modules modules,
416                                        final ModelValidationReport report )
417    {
418        for ( int i = 0, s0 = modules.getModule().size(); i < s0; i++ )
419        {
420            this.assertValidToolsTypes( context, modules.getModule().get( i ), report );
421        }
422    }
423
424    private void assertValidToolsTypes( final ModelContext context, final Module module,
425                                        final ModelValidationReport report )
426    {
427        final List<SourceFileType> sourceFileType = module.getAnyObjects( SourceFileType.class );
428        final List<SourceFilesType> sourceFilesType = module.getAnyObjects( SourceFilesType.class );
429        final List<SourceSectionType> sourceSectionType = module.getAnyObjects( SourceSectionType.class );
430        final List<SourceSectionsType> sourceSectionsType = module.getAnyObjects( SourceSectionsType.class );
431
432        if ( sourceFileType != null )
433        {
434            for ( final SourceFileType s : sourceFileType )
435            {
436                report.getDetails().add( new ModelValidationReport.Detail(
437                    "MODULE_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
438                        "moduleSourceFileConstraint", module.getName(), s.getIdentifier() ),
439                    new ObjectFactory().createSourceFile( s ) ) );
440
441                if ( this.isValidateJava() )
442                {
443                    for ( final TemplateParameterType p : s.getTemplateParameter() )
444                    {
445                        try
446                        {
447                            p.getJavaValue( context.getClassLoader() );
448                        }
449                        catch ( final ModelObjectException e )
450                        {
451                            final String message = getMessage( e );
452
453                            if ( context.isLoggable( Level.FINE ) )
454                            {
455                                context.log( Level.FINE, message, e );
456                            }
457
458                            report.getDetails().add( new ModelValidationReport.Detail(
459                                "MODULE_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE, getMessage(
460                                    "moduleSourceFileTemplateParameterJavaValueConstraint", module.getName(),
461                                    s.getIdentifier(), p.getName(),
462                                    message != null && message.length() > 0 ? " " + message : "" ),
463                                new ObjectFactory().createSourceFile( s ) ) );
464
465                        }
466                    }
467                }
468
469                this.validateTemplateParameters(
470                    report, context, s.getSourceSections(),
471                    "MODULE_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
472                    new ObjectFactory().createSourceFile( s ),
473                    "moduleSourceFileSectionTemplateParameterJavaValueConstraint",
474                    module.getName(), s.getIdentifier() );
475
476            }
477        }
478
479        if ( sourceFilesType != null )
480        {
481            for ( final SourceFilesType files : sourceFilesType )
482            {
483                for ( final SourceFileType s : files.getSourceFile() )
484                {
485                    report.getDetails().add( new ModelValidationReport.Detail(
486                        "MODULE_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
487                            "moduleSourceFileConstraint", module.getName(), s.getIdentifier() ),
488                        new ObjectFactory().createSourceFile( s ) ) );
489
490                    if ( this.isValidateJava() )
491                    {
492                        for ( final TemplateParameterType p : s.getTemplateParameter() )
493                        {
494                            try
495                            {
496                                p.getJavaValue( context.getClassLoader() );
497                            }
498                            catch ( final ModelObjectException e )
499                            {
500                                final String message = getMessage( e );
501
502                                if ( context.isLoggable( Level.FINE ) )
503                                {
504                                    context.log( Level.FINE, message, e );
505                                }
506
507                                report.getDetails().add( new ModelValidationReport.Detail(
508                                    "MODULE_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
509                                    getMessage( "moduleSourceFileTemplateParameterJavaValueConstraint",
510                                                module.getName(), s.getIdentifier(), p.getName(),
511                                                message != null && message.length() > 0 ? " " + message : "" ),
512                                    new ObjectFactory().createSourceFile( s ) ) );
513
514                            }
515                        }
516                    }
517
518                    this.validateTemplateParameters(
519                        report, context, s.getSourceSections(),
520                        "MODULE_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
521                        new ObjectFactory().createSourceFile( s ),
522                        "moduleSourceFileSectionTemplateParameterJavaValueConstraint",
523                        module.getName(), s.getIdentifier() );
524
525                }
526
527                if ( files.getSourceFile().isEmpty() )
528                {
529                    report.getDetails().add( new ModelValidationReport.Detail(
530                        "MODULE_SOURCE_FILES_CONSTRAINT", Level.SEVERE, getMessage(
531                            "moduleSourceFilesConstraint", module.getName() ),
532                        new ObjectFactory().createSourceFiles( files ) ) );
533
534                }
535            }
536        }
537
538        if ( sourceSectionType != null )
539        {
540            for ( final SourceSectionType s : sourceSectionType )
541            {
542                report.getDetails().add( new ModelValidationReport.Detail(
543                    "MODULE_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
544                        "moduleSourceSectionConstraint", module.getName(), s.getName() ),
545                    new ObjectFactory().createSourceSection( s ) ) );
546
547                if ( this.isValidateJava() )
548                {
549                    for ( final TemplateParameterType p : s.getTemplateParameter() )
550                    {
551                        try
552                        {
553                            p.getJavaValue( context.getClassLoader() );
554                        }
555                        catch ( final ModelObjectException e )
556                        {
557                            final String message = getMessage( e );
558
559                            if ( context.isLoggable( Level.FINE ) )
560                            {
561                                context.log( Level.FINE, message, e );
562                            }
563
564                            report.getDetails().add( new ModelValidationReport.Detail(
565                                "MODULE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
566                                getMessage( "moduleSourceSectionTemplateParameterJavaValueConstraint",
567                                            module.getName(), s.getName(), p.getName(),
568                                            message != null && message.length() > 0 ? " " + message : "" ),
569                                new ObjectFactory().createSourceSection( s ) ) );
570
571                        }
572                    }
573                }
574
575                this.validateTemplateParameters(
576                    report, context, s.getSourceSections(),
577                    "MODULE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
578                    new ObjectFactory().createSourceSection( s ),
579                    "moduleSourceSectionTemplateParameterJavaValueConstraint",
580                    module.getName(), s.getName() );
581
582            }
583        }
584
585        if ( sourceSectionsType != null )
586        {
587            for ( final SourceSectionsType sections : sourceSectionsType )
588            {
589                for ( final SourceSectionType s : sections.getSourceSection() )
590                {
591                    report.getDetails().add( new ModelValidationReport.Detail(
592                        "MODULE_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
593                            "moduleSourceSectionConstraint", module.getName(), s.getName() ),
594                        new ObjectFactory().createSourceSection( s ) ) );
595
596                    if ( this.isValidateJava() )
597                    {
598                        for ( final TemplateParameterType p : s.getTemplateParameter() )
599                        {
600                            try
601                            {
602                                p.getJavaValue( context.getClassLoader() );
603                            }
604                            catch ( final ModelObjectException e )
605                            {
606                                final String message = getMessage( e );
607
608                                if ( context.isLoggable( Level.FINE ) )
609                                {
610                                    context.log( Level.FINE, message, e );
611                                }
612
613                                report.getDetails().add( new ModelValidationReport.Detail(
614                                    "MODULE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
615                                    getMessage( "moduleSourceSectionTemplateParameterJavaValueConstraint",
616                                                module.getName(), s.getName(), p.getName(),
617                                                message != null && message.length() > 0 ? " " + message : "" ),
618                                    new ObjectFactory().createSourceSection( s ) ) );
619
620                            }
621                        }
622                    }
623
624                    this.validateTemplateParameters( report, context, s.getSourceSections(),
625                                                     "MODULE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
626                                                     new ObjectFactory().createSourceSection( s ),
627                                                     "moduleSourceSectionTemplateParameterJavaValueConstraint",
628                                                     module.getName(), s.getName() );
629
630                }
631
632                if ( sections.getSourceSection().isEmpty() )
633                {
634                    report.getDetails().add( new ModelValidationReport.Detail(
635                        "MODULE_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
636                            "moduleSourceSectionsConstraint", module.getName() ),
637                        new ObjectFactory().createSourceSections( sections ) ) );
638
639                }
640            }
641        }
642
643        if ( module.getImplementations() != null )
644        {
645            for ( int i = 0, s0 = module.getImplementations().getImplementation().size(); i < s0; i++ )
646            {
647                this.assertValidToolsTypes( context, module, module.getImplementations().getImplementation().get( i ),
648                                            report );
649
650            }
651        }
652
653        if ( module.getSpecifications() != null )
654        {
655            for ( int i = 0, s0 = module.getSpecifications().getSpecification().size(); i < s0; i++ )
656            {
657                this.assertValidToolsTypes( context, module, module.getSpecifications().getSpecification().get( i ),
658                                            report );
659
660            }
661        }
662    }
663
664    private void assertValidToolsTypes( final ModelContext context, final Module module,
665                                        final Implementation implementation, final ModelValidationReport report )
666    {
667        final List<SourceFileType> sourceFileType = implementation.getAnyObjects( SourceFileType.class );
668        final List<SourceFilesType> sourceFilesType = implementation.getAnyObjects( SourceFilesType.class );
669        final List<SourceSectionType> sourceSectionType = implementation.getAnyObjects( SourceSectionType.class );
670        final List<SourceSectionsType> sourceSectionsType = implementation.getAnyObjects( SourceSectionsType.class );
671
672        if ( sourceFileType != null )
673        {
674            for ( final SourceFileType s : sourceFileType )
675            {
676                if ( this.isValidateJava() )
677                {
678                    for ( final TemplateParameterType p : s.getTemplateParameter() )
679                    {
680                        try
681                        {
682                            p.getJavaValue( context.getClassLoader() );
683                        }
684                        catch ( final ModelObjectException e )
685                        {
686                            final String message = getMessage( e );
687
688                            if ( context.isLoggable( Level.FINE ) )
689                            {
690                                context.log( Level.FINE, message, e );
691                            }
692
693                            report.getDetails().add( new ModelValidationReport.Detail(
694                                "IMPLEMENTATION_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
695                                getMessage( "implementationSourceFileTemplateParameterJavaValueConstraint",
696                                            module.getName(), implementation.getIdentifier(),
697                                            s.getIdentifier(), p.getName(),
698                                            message != null && message.length() > 0 ? " " + message : "" ),
699                                new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
700
701                        }
702                    }
703                }
704
705                this.validateTemplateParameters(
706                    report, context, s.getSourceSections(),
707                    "IMPLEMENTATION_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
708                    new org.jomc.model.ObjectFactory().createImplementation( implementation ),
709                    "implementationSourceFileSectionTemplateParameterJavaValueConstraint",
710                    module.getName(), implementation.getIdentifier(), s.getIdentifier() );
711
712            }
713
714            if ( sourceFileType.size() > 1 )
715            {
716                report.getDetails().add( new ModelValidationReport.Detail(
717                    "IMPLEMENTATION_SOURCE_FILE_MULTIPLICITY_CONSTRAINT", Level.SEVERE, getMessage(
718                        "implementationSourceFileMultiplicityConstraint", module.getName(),
719                        implementation.getIdentifier(), sourceFileType.size() ),
720                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
721
722            }
723            else if ( sourceFileType.size() == 1 )
724            {
725                report.getDetails().add( new ModelValidationReport.Detail(
726                    "IMPLEMENTATION_SOURCE_FILE_INFORMATION", Level.INFO, getMessage(
727                        "implementationSourceFileInfo", module.getName(), implementation.getIdentifier(),
728                        sourceFileType.get( 0 ).getIdentifier() ),
729                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
730
731            }
732        }
733
734        if ( sourceFilesType != null )
735        {
736            if ( sourceFilesType.size() > 1 )
737            {
738                report.getDetails().add( new ModelValidationReport.Detail(
739                    "IMPLEMENTATION_SOURCE_FILES_MULTIPLICITY_CONSTRAINT", Level.SEVERE, getMessage(
740                        "implementationSourceFilesMultiplicityConstraint", module.getName(),
741                        implementation.getIdentifier(), sourceFilesType.size() ),
742                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
743
744            }
745
746            for ( final SourceFilesType l : sourceFilesType )
747            {
748                for ( final SourceFileType s : l.getSourceFile() )
749                {
750                    if ( this.isValidateJava() )
751                    {
752                        for ( final TemplateParameterType p : s.getTemplateParameter() )
753                        {
754                            try
755                            {
756                                p.getJavaValue( context.getClassLoader() );
757                            }
758                            catch ( final ModelObjectException e )
759                            {
760                                final String message = getMessage( e );
761
762                                if ( context.isLoggable( Level.FINE ) )
763                                {
764                                    context.log( Level.FINE, message, e );
765                                }
766
767                                report.getDetails().add( new ModelValidationReport.Detail(
768                                    "IMPLEMENTATION_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
769                                    getMessage( "implementationSourceFileTemplateParameterJavaValueConstraint",
770                                                module.getName(), implementation.getIdentifier(),
771                                                s.getIdentifier(), p.getName(),
772                                                message != null && message.length() > 0 ? " " + message : "" ),
773                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
774
775                            }
776                        }
777                    }
778
779                    this.validateTemplateParameters(
780                        report, context, s.getSourceSections(),
781                        "IMPLEMENTATION_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
782                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
783                        "implementationSourceFileSectionTemplateParameterJavaValueConstraint",
784                        module.getName(), implementation.getIdentifier(), s.getIdentifier() );
785
786                }
787            }
788        }
789
790        if ( sourceSectionType != null )
791        {
792            for ( final SourceSectionType s : sourceSectionType )
793            {
794                report.getDetails().add( new ModelValidationReport.Detail(
795                    "IMPLEMENTATION_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
796                        "implementationSourceSectionConstraint", module.getName(), implementation.getIdentifier(),
797                        s.getName() ), new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
798
799                if ( this.isValidateJava() )
800                {
801                    for ( final TemplateParameterType p : s.getTemplateParameter() )
802                    {
803                        try
804                        {
805                            p.getJavaValue( context.getClassLoader() );
806                        }
807                        catch ( final ModelObjectException e )
808                        {
809                            final String message = getMessage( e );
810
811                            if ( context.isLoggable( Level.FINE ) )
812                            {
813                                context.log( Level.FINE, message, e );
814                            }
815
816                            report.getDetails().add( new ModelValidationReport.Detail(
817                                "IMPLEMENTATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
818                                getMessage( "implementationSourceSectionTemplateParameterJavaValueConstraint",
819                                            module.getName(), implementation.getIdentifier(),
820                                            s.getName(), p.getName(),
821                                            message != null && message.length() > 0 ? " " + message : "" ),
822                                new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
823
824                        }
825                    }
826                }
827
828                this.validateTemplateParameters(
829                    report, context, s.getSourceSections(),
830                    "IMPLEMENTATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
831                    new org.jomc.model.ObjectFactory().createImplementation( implementation ),
832                    "implementationSourceSectionTemplateParameterJavaValueConstraint",
833                    module.getName(), implementation.getIdentifier() );
834
835            }
836        }
837
838        if ( sourceSectionsType != null )
839        {
840            for ( final SourceSectionsType sections : sourceSectionsType )
841            {
842                for ( final SourceSectionType s : sections.getSourceSection() )
843                {
844                    report.getDetails().add( new ModelValidationReport.Detail(
845                        "IMPLEMENTATION_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
846                            "implementationSourceSectionConstraint", module.getName(), implementation.getIdentifier(),
847                            s.getName() ),
848                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
849
850                    if ( this.isValidateJava() )
851                    {
852                        for ( final TemplateParameterType p : s.getTemplateParameter() )
853                        {
854                            try
855                            {
856                                p.getJavaValue( context.getClassLoader() );
857                            }
858                            catch ( final ModelObjectException e )
859                            {
860                                final String message = getMessage( e );
861
862                                if ( context.isLoggable( Level.FINE ) )
863                                {
864                                    context.log( Level.FINE, message, e );
865                                }
866
867                                report.getDetails().add( new ModelValidationReport.Detail(
868                                    "IMPLEMENTATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
869                                    Level.SEVERE, getMessage(
870                                        "implementationSourceSectionTemplateParameterJavaValueConstraint",
871                                        module.getName(), implementation.getIdentifier(), s.getName(), p.getName(),
872                                        message != null && message.length() > 0 ? " " + message : "" ),
873                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
874
875                            }
876                        }
877                    }
878
879                    this.validateTemplateParameters(
880                        report, context, s.getSourceSections(),
881                        "IMPLEMENTATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
882                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
883                        "implementationSourceSectionTemplateParameterJavaValueConstraint",
884                        module.getName(), implementation.getIdentifier() );
885
886                }
887
888                if ( sections.getSourceSection().isEmpty() )
889                {
890                    report.getDetails().add( new ModelValidationReport.Detail(
891                        "IMPLEMENTATION_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
892                            "implementationSourceSectionsConstraint", module.getName(),
893                            implementation.getIdentifier() ),
894                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
895
896                }
897            }
898        }
899
900        if ( implementation.getDependencies() != null )
901        {
902            this.assertValidToolsTypes( context, module, implementation, implementation.getDependencies(), report );
903        }
904
905        if ( implementation.getMessages() != null )
906        {
907            this.assertValidToolsTypes( context, module, implementation, implementation.getMessages(), report );
908        }
909    }
910
911    private void assertValidToolsTypes( final ModelContext context, final Module module,
912                                        final Implementation implementation, final Dependencies dependencies,
913                                        final ModelValidationReport report )
914    {
915        for ( final Dependency d : dependencies.getDependency() )
916        {
917            final List<SourceFileType> sourceFileType = d.getAnyObjects( SourceFileType.class );
918            final List<SourceFilesType> sourceFilesType = d.getAnyObjects( SourceFilesType.class );
919            final List<SourceSectionType> sourceSectionType = d.getAnyObjects( SourceSectionType.class );
920            final List<SourceSectionsType> sourceSectionsType = d.getAnyObjects( SourceSectionsType.class );
921
922            if ( sourceFileType != null )
923            {
924                for ( final SourceFileType s : sourceFileType )
925                {
926                    report.getDetails().add( new ModelValidationReport.Detail(
927                        "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
928                            "dependencySourceFileConstraint", module.getName(), implementation.getIdentifier(),
929                            d.getName(), s.getIdentifier() ),
930                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
931
932                    if ( this.isValidateJava() )
933                    {
934                        for ( final TemplateParameterType p : s.getTemplateParameter() )
935                        {
936                            try
937                            {
938                                p.getJavaValue( context.getClassLoader() );
939                            }
940                            catch ( final ModelObjectException e )
941                            {
942                                final String message = getMessage( e );
943
944                                if ( context.isLoggable( Level.FINE ) )
945                                {
946                                    context.log( Level.FINE, message, e );
947                                }
948
949                                report.getDetails().add( new ModelValidationReport.Detail(
950                                    "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
951                                    Level.SEVERE, getMessage(
952                                        "dependencySourceFileTemplateParameterJavaValueConstraint",
953                                        module.getName(), implementation.getIdentifier(), d.getName(),
954                                        s.getIdentifier(), p.getName(),
955                                        message != null && message.length() > 0 ? " " + message : "" ),
956                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
957
958                            }
959                        }
960                    }
961
962                    this.validateTemplateParameters(
963                        report, context, s.getSourceSections(),
964                        "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
965                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
966                        "dependencySourceFileSectionTemplateParameterJavaValueConstraint",
967                        module.getName(), implementation.getIdentifier(), d.getName(), s.getIdentifier() );
968
969                }
970            }
971
972            if ( sourceFilesType != null )
973            {
974                for ( final SourceFilesType files : sourceFilesType )
975                {
976                    for ( final SourceFileType s : files.getSourceFile() )
977                    {
978                        report.getDetails().add( new ModelValidationReport.Detail(
979                            "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
980                                "dependencySourceFileConstraint", module.getName(), implementation.getIdentifier(),
981                                d.getName(), s.getIdentifier() ),
982                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
983
984                        if ( this.isValidateJava() )
985                        {
986                            for ( final TemplateParameterType p : s.getTemplateParameter() )
987                            {
988                                try
989                                {
990                                    p.getJavaValue( context.getClassLoader() );
991                                }
992                                catch ( final ModelObjectException e )
993                                {
994                                    final String message = getMessage( e );
995
996                                    if ( context.isLoggable( Level.FINE ) )
997                                    {
998                                        context.log( Level.FINE, message, e );
999                                    }
1000
1001                                    report.getDetails().add( new ModelValidationReport.Detail(
1002                                        "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1003                                        Level.SEVERE, getMessage(
1004                                            "dependencySourceFileTemplateParameterJavaValueConstraint",
1005                                            module.getName(), implementation.getIdentifier(), d.getName(),
1006                                            s.getIdentifier(), p.getName(),
1007                                            message != null && message.length() > 0 ? " " + message : "" ),
1008                                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1009
1010                                }
1011                            }
1012                        }
1013
1014                        this.validateTemplateParameters(
1015                            report, context, s.getSourceSections(),
1016                            "IMPLEMENTATION_DEPENDENCY_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1017                            new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1018                            "dependencySourceFileSectionTemplateParameterJavaValueConstraint",
1019                            module.getName(), implementation.getIdentifier(), d.getName(), s.getIdentifier() );
1020
1021                    }
1022
1023                    if ( files.getSourceFile().isEmpty() )
1024                    {
1025                        report.getDetails().add( new ModelValidationReport.Detail(
1026                            "IMPLEMENTATION_DEPENDENCY_SOURCE_FILES_CONSTRAINT", Level.SEVERE, getMessage(
1027                                "dependencySourceFilesConstraint", module.getName(), implementation.getIdentifier(),
1028                                d.getName() ),
1029                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1030
1031                    }
1032                }
1033            }
1034
1035            if ( sourceSectionType != null )
1036            {
1037                for ( final SourceSectionType s : sourceSectionType )
1038                {
1039                    report.getDetails().add( new ModelValidationReport.Detail(
1040                        "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1041                            "dependencySourceSectionConstraint", module.getName(), implementation.getIdentifier(),
1042                            d.getName(), s.getName() ),
1043                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1044
1045                    if ( this.isValidateJava() )
1046                    {
1047                        for ( final TemplateParameterType p : s.getTemplateParameter() )
1048                        {
1049                            try
1050                            {
1051                                p.getJavaValue( context.getClassLoader() );
1052                            }
1053                            catch ( final ModelObjectException e )
1054                            {
1055                                final String message = getMessage( e );
1056
1057                                if ( context.isLoggable( Level.FINE ) )
1058                                {
1059                                    context.log( Level.FINE, message, e );
1060                                }
1061
1062                                report.getDetails().add( new ModelValidationReport.Detail(
1063                                    "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1064                                    Level.SEVERE, getMessage(
1065                                        "dependencySourceSectionTemplateParameterJavaValueConstraint",
1066                                        module.getName(), implementation.getIdentifier(), d.getName(),
1067                                        s.getName(), p.getName(),
1068                                        message != null && message.length() > 0 ? " " + message : "" ),
1069                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1070
1071                            }
1072                        }
1073                    }
1074
1075                    this.validateTemplateParameters(
1076                        report, context, s.getSourceSections(),
1077                        "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1078                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1079                        "dependencySourceSectionTemplateParameterJavaValueConstraint",
1080                        module.getName(), implementation.getIdentifier(), d.getName() );
1081
1082                }
1083            }
1084
1085            if ( sourceSectionsType != null )
1086            {
1087                for ( final SourceSectionsType sections : sourceSectionsType )
1088                {
1089                    for ( final SourceSectionType s : sections.getSourceSection() )
1090                    {
1091                        report.getDetails().add( new ModelValidationReport.Detail(
1092                            "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1093                                "dependencySourceSectionConstraint", module.getName(), implementation.getIdentifier(),
1094                                d.getName(), s.getName() ),
1095                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1096
1097                        if ( this.isValidateJava() )
1098                        {
1099                            for ( final TemplateParameterType p : s.getTemplateParameter() )
1100                            {
1101                                try
1102                                {
1103                                    p.getJavaValue( context.getClassLoader() );
1104                                }
1105                                catch ( final ModelObjectException e )
1106                                {
1107                                    final String message = getMessage( e );
1108
1109                                    if ( context.isLoggable( Level.FINE ) )
1110                                    {
1111                                        context.log( Level.FINE, message, e );
1112                                    }
1113
1114                                    report.getDetails().add( new ModelValidationReport.Detail(
1115                                        "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1116                                        Level.SEVERE, getMessage(
1117                                            "dependencySourceSectionTemplateParameterJavaValueConstraint",
1118                                            module.getName(), implementation.getIdentifier(), d.getName(),
1119                                            s.getName(), p.getName(),
1120                                            message != null && message.length() > 0 ? " " + message : "" ),
1121                                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1122
1123                                }
1124                            }
1125                        }
1126
1127                        this.validateTemplateParameters(
1128                            report, context, s.getSourceSections(),
1129                            "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1130                            new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1131                            "dependencySourceSectionTemplateParameterJavaValueConstraint",
1132                            module.getName(), implementation.getIdentifier(), d.getName() );
1133
1134                    }
1135
1136                    if ( sections.getSourceSection().isEmpty() )
1137                    {
1138                        report.getDetails().add( new ModelValidationReport.Detail(
1139                            "IMPLEMENTATION_DEPENDENCY_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
1140                                "dependencySourceSectionsConstraint", module.getName(), implementation.getIdentifier(),
1141                                d.getName() ),
1142                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1143
1144                    }
1145                }
1146            }
1147        }
1148    }
1149
1150    private void assertValidToolsTypes( final ModelContext context, final Module module,
1151                                        final Implementation implementation, final Messages messages,
1152                                        final ModelValidationReport report )
1153    {
1154        for ( final Message m : messages.getMessage() )
1155        {
1156            final List<SourceFileType> sourceFileType = m.getAnyObjects( SourceFileType.class );
1157            final List<SourceFilesType> sourceFilesType = m.getAnyObjects( SourceFilesType.class );
1158            final List<SourceSectionType> sourceSectionType = m.getAnyObjects( SourceSectionType.class );
1159            final List<SourceSectionsType> sourceSectionsType = m.getAnyObjects( SourceSectionsType.class );
1160
1161            if ( sourceFileType != null )
1162            {
1163                for ( final SourceFileType s : sourceFileType )
1164                {
1165                    report.getDetails().add( new ModelValidationReport.Detail(
1166                        "IMPLEMENTATION_MESSAGE_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
1167                            "messageSourceFileConstraint", module.getName(), implementation.getIdentifier(),
1168                            m.getName(), s.getIdentifier() ),
1169                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1170
1171                    if ( this.isValidateJava() )
1172                    {
1173                        for ( final TemplateParameterType p : s.getTemplateParameter() )
1174                        {
1175                            try
1176                            {
1177                                p.getJavaValue( context.getClassLoader() );
1178                            }
1179                            catch ( final ModelObjectException e )
1180                            {
1181                                final String message = getMessage( e );
1182
1183                                if ( context.isLoggable( Level.FINE ) )
1184                                {
1185                                    context.log( Level.FINE, message, e );
1186                                }
1187
1188                                report.getDetails().add( new ModelValidationReport.Detail(
1189                                    "IMPLEMENTATION_MESSAGE_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1190                                    Level.SEVERE, getMessage(
1191                                        "messageSourceFileTemplateParameterJavaValueConstraint",
1192                                        module.getName(), implementation.getIdentifier(), m.getName(),
1193                                        s.getIdentifier(), p.getName(),
1194                                        message != null && message.length() > 0 ? " " + message : "" ),
1195                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1196
1197                            }
1198                        }
1199                    }
1200
1201                    this.validateTemplateParameters(
1202                        report, context, s.getSourceSections(),
1203                        "IMPLEMENTATION_MESSAGE_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1204                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1205                        "messageSourceFileSectionTemplateParameterJavaValueConstraint",
1206                        module.getName(), implementation.getIdentifier(), m.getName(), s.getIdentifier() );
1207
1208                }
1209            }
1210
1211            if ( sourceFilesType != null )
1212            {
1213                for ( final SourceFilesType files : sourceFilesType )
1214                {
1215                    for ( final SourceFileType s : files.getSourceFile() )
1216                    {
1217                        report.getDetails().add( new ModelValidationReport.Detail(
1218                            "IMPLEMENTATION_MESSAGE_SOURCE_FILE_CONSTRAINT", Level.SEVERE, getMessage(
1219                                "messageSourceFileConstraint", module.getName(), implementation.getIdentifier(),
1220                                m.getName(), s.getIdentifier() ),
1221                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1222
1223                        if ( this.isValidateJava() )
1224                        {
1225                            for ( final TemplateParameterType p : s.getTemplateParameter() )
1226                            {
1227                                try
1228                                {
1229                                    p.getJavaValue( context.getClassLoader() );
1230                                }
1231                                catch ( final ModelObjectException e )
1232                                {
1233                                    final String message = getMessage( e );
1234
1235                                    if ( context.isLoggable( Level.FINE ) )
1236                                    {
1237                                        context.log( Level.FINE, message, e );
1238                                    }
1239
1240                                    report.getDetails().add( new ModelValidationReport.Detail(
1241                                        "IMPLEMENTATION_MESSAGE_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1242                                        Level.SEVERE, getMessage(
1243                                            "messageSourceFileTemplateParameterJavaValueConstraint",
1244                                            module.getName(), implementation.getIdentifier(), m.getName(),
1245                                            s.getIdentifier(), p.getName(),
1246                                            message != null && message.length() > 0 ? " " + message : "" ),
1247                                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1248
1249                                }
1250                            }
1251                        }
1252
1253                        this.validateTemplateParameters(
1254                            report, context, s.getSourceSections(),
1255                            "IMPLEMENTATION_MESSAGE_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1256                            new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1257                            "messageSourceFileSectionTemplateParameterJavaValueConstraint",
1258                            module.getName(), implementation.getIdentifier(), m.getName(), s.getIdentifier() );
1259
1260                    }
1261
1262                    if ( files.getSourceFile().isEmpty() )
1263                    {
1264                        report.getDetails().add( new ModelValidationReport.Detail(
1265                            "IMPLEMENTATION_MESSAGE_SOURCE_FILES_CONSTRAINT", Level.SEVERE, getMessage(
1266                                "messageSourceFilesConstraint", module.getName(), implementation.getIdentifier(),
1267                                m.getName() ),
1268                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1269
1270                    }
1271                }
1272            }
1273
1274            if ( sourceSectionType != null )
1275            {
1276                for ( final SourceSectionType s : sourceSectionType )
1277                {
1278                    report.getDetails().add( new ModelValidationReport.Detail(
1279                        "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1280                            "messageSourceSectionConstraint", module.getName(), implementation.getIdentifier(),
1281                            m.getName(), s.getName() ),
1282                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1283
1284                    if ( this.isValidateJava() )
1285                    {
1286                        for ( final TemplateParameterType p : s.getTemplateParameter() )
1287                        {
1288                            try
1289                            {
1290                                p.getJavaValue( context.getClassLoader() );
1291                            }
1292                            catch ( final ModelObjectException e )
1293                            {
1294                                final String message = getMessage( e );
1295
1296                                if ( context.isLoggable( Level.FINE ) )
1297                                {
1298                                    context.log( Level.FINE, message, e );
1299                                }
1300
1301                                report.getDetails().add( new ModelValidationReport.Detail(
1302                                    "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1303                                    Level.SEVERE, getMessage(
1304                                        "messageSourceSectionTemplateParameterJavaValueConstraint",
1305                                        module.getName(), implementation.getIdentifier(), m.getName(),
1306                                        s.getName(), p.getName(),
1307                                        message != null && message.length() > 0 ? " " + message : "" ),
1308                                    new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1309
1310                            }
1311                        }
1312                    }
1313
1314                    this.validateTemplateParameters(
1315                        report, context, s.getSourceSections(),
1316                        "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1317                        new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1318                        "messageSourceSectionTemplateParameterJavaValueConstraint",
1319                        module.getName(), implementation.getIdentifier(), m.getName() );
1320
1321                }
1322            }
1323
1324            if ( sourceSectionsType != null )
1325            {
1326                for ( final SourceSectionsType sections : sourceSectionsType )
1327                {
1328                    for ( final SourceSectionType s : sections.getSourceSection() )
1329                    {
1330                        report.getDetails().add( new ModelValidationReport.Detail(
1331                            "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1332                                "messageSourceSectionConstraint", module.getName(), implementation.getIdentifier(),
1333                                m.getName(), s.getName() ),
1334                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1335
1336                        if ( this.isValidateJava() )
1337                        {
1338                            for ( final TemplateParameterType p : s.getTemplateParameter() )
1339                            {
1340                                try
1341                                {
1342                                    p.getJavaValue( context.getClassLoader() );
1343                                }
1344                                catch ( final ModelObjectException e )
1345                                {
1346                                    final String message = getMessage( e );
1347
1348                                    if ( context.isLoggable( Level.FINE ) )
1349                                    {
1350                                        context.log( Level.FINE, message, e );
1351                                    }
1352
1353                                    report.getDetails().add( new ModelValidationReport.Detail(
1354                                        "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1355                                        Level.SEVERE, getMessage(
1356                                            "messageSourceSectionTemplateParameterJavaValueConstraint",
1357                                            module.getName(), implementation.getIdentifier(), m.getName(),
1358                                            s.getName(), p.getName(),
1359                                            message != null && message.length() > 0 ? " " + message : "" ),
1360                                        new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1361
1362                                }
1363                            }
1364                        }
1365
1366                        this.validateTemplateParameters(
1367                            report, context, s.getSourceSections(),
1368                            "IMPLEMENTATION_MESSAGE_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1369                            new org.jomc.model.ObjectFactory().createImplementation( implementation ),
1370                            "messageSourceSectionTemplateParameterJavaValueConstraint",
1371                            module.getName(), implementation.getIdentifier(), m.getName() );
1372
1373                    }
1374
1375                    if ( sections.getSourceSection().isEmpty() )
1376                    {
1377                        report.getDetails().add( new ModelValidationReport.Detail(
1378                            "IMPLEMENTATION_MESSAGE_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
1379                                "messageSourceSectionsConstraint", module.getName(), implementation.getIdentifier(),
1380                                m.getName() ),
1381                            new org.jomc.model.ObjectFactory().createImplementation( implementation ) ) );
1382
1383                    }
1384                }
1385            }
1386        }
1387    }
1388
1389    private void assertValidToolsTypes( final ModelContext context, final Module module,
1390                                        final Specification specification, final ModelValidationReport report )
1391    {
1392        final List<SourceFileType> sourceFileType = specification.getAnyObjects( SourceFileType.class );
1393        final List<SourceFilesType> sourceFilesType = specification.getAnyObjects( SourceFilesType.class );
1394        final List<SourceSectionType> sourceSectionType = specification.getAnyObjects( SourceSectionType.class );
1395        final List<SourceSectionsType> sourceSectionsType = specification.getAnyObjects( SourceSectionsType.class );
1396
1397        if ( sourceFileType != null )
1398        {
1399            for ( final SourceFileType s : sourceFileType )
1400            {
1401                if ( this.isValidateJava() )
1402                {
1403                    for ( final TemplateParameterType p : s.getTemplateParameter() )
1404                    {
1405                        try
1406                        {
1407                            p.getJavaValue( context.getClassLoader() );
1408                        }
1409                        catch ( final ModelObjectException e )
1410                        {
1411                            final String message = getMessage( e );
1412
1413                            if ( context.isLoggable( Level.FINE ) )
1414                            {
1415                                context.log( Level.FINE, message, e );
1416                            }
1417
1418                            report.getDetails().add( new ModelValidationReport.Detail(
1419                                "SPECIFICATION_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1420                                Level.SEVERE, getMessage(
1421                                    "specificationSourceFileTemplateParameterJavaValueConstraint",
1422                                    module.getName(), specification.getIdentifier(), s.getIdentifier(), p.getName(),
1423                                    message != null && message.length() > 0 ? " " + message : "" ),
1424                                new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1425
1426                        }
1427                    }
1428                }
1429
1430                this.validateTemplateParameters(
1431                    report, context, s.getSourceSections(),
1432                    "SPECIFICATION_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1433                    new org.jomc.model.ObjectFactory().createSpecification( specification ),
1434                    "specificationSourceFileSectionTemplateParameterJavaValueConstraint",
1435                    module.getName(), specification.getIdentifier(), s.getIdentifier() );
1436
1437            }
1438
1439            if ( sourceFileType.size() > 1 )
1440            {
1441                report.getDetails().add( new ModelValidationReport.Detail(
1442                    "SPECIFICATION_SOURCE_FILE_MULTIPLICITY_CONSTRAINT", Level.SEVERE, getMessage(
1443                        "specificationSourceFileMultiplicityConstraint", module.getName(),
1444                        specification.getIdentifier(), sourceFileType.size() ),
1445                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1446
1447            }
1448            else if ( sourceFileType.size() == 1 )
1449            {
1450                report.getDetails().add( new ModelValidationReport.Detail(
1451                    "SPECIFICATION_SOURCE_FILE_INFORMATION", Level.INFO, getMessage(
1452                        "specificationSourceFileInfo", module.getName(), specification.getIdentifier(),
1453                        sourceFileType.get( 0 ).getIdentifier() ),
1454                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1455
1456            }
1457        }
1458
1459        if ( sourceFilesType != null )
1460        {
1461            for ( final SourceFilesType l : sourceFilesType )
1462            {
1463                for ( final SourceFileType s : l.getSourceFile() )
1464                {
1465                    if ( this.isValidateJava() )
1466                    {
1467                        for ( final TemplateParameterType p : s.getTemplateParameter() )
1468                        {
1469                            try
1470                            {
1471                                p.getJavaValue( context.getClassLoader() );
1472                            }
1473                            catch ( final ModelObjectException e )
1474                            {
1475                                final String message = getMessage( e );
1476
1477                                if ( context.isLoggable( Level.FINE ) )
1478                                {
1479                                    context.log( Level.FINE, message, e );
1480                                }
1481
1482                                report.getDetails().add( new ModelValidationReport.Detail(
1483                                    "SPECIFICATION_SOURCE_FILE_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1484                                    Level.SEVERE, getMessage(
1485                                        "specificationSourceFileTemplateParameterJavaValueConstraint",
1486                                        module.getName(), specification.getIdentifier(), s.getIdentifier(), p.getName(),
1487                                        message != null && message.length() > 0 ? " " + message : "" ),
1488                                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1489
1490                            }
1491                        }
1492                    }
1493
1494                    this.validateTemplateParameters(
1495                        report, context, s.getSourceSections(),
1496                        "SPECIFICATION_SOURCE_FILE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1497                        new org.jomc.model.ObjectFactory().createSpecification( specification ),
1498                        "specificationSourceFileSectionTemplateParameterJavaValueConstraint",
1499                        module.getName(), specification.getIdentifier(), s.getIdentifier() );
1500
1501                }
1502            }
1503
1504            if ( sourceFilesType.size() > 1 )
1505            {
1506                report.getDetails().add( new ModelValidationReport.Detail(
1507                    "SPECIFICATION_SOURCE_FILES_MULTIPLICITY_CONSTRAINT", Level.SEVERE, getMessage(
1508                        "specificationSourceFilesMultiplicityConstraint", module.getName(),
1509                        specification.getIdentifier(), sourceFilesType.size() ),
1510                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1511
1512            }
1513        }
1514
1515        if ( sourceSectionType != null )
1516        {
1517            for ( final SourceSectionType s : sourceSectionType )
1518            {
1519                report.getDetails().add( new ModelValidationReport.Detail(
1520                    "SPECIFICATION_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1521                        "specificationSourceSectionConstraint", specification.getIdentifier(), s.getName() ),
1522                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1523
1524                if ( this.isValidateJava() )
1525                {
1526                    for ( final TemplateParameterType p : s.getTemplateParameter() )
1527                    {
1528                        try
1529                        {
1530                            p.getJavaValue( context.getClassLoader() );
1531                        }
1532                        catch ( final ModelObjectException e )
1533                        {
1534                            final String message = getMessage( e );
1535
1536                            if ( context.isLoggable( Level.FINE ) )
1537                            {
1538                                context.log( Level.FINE, message, e );
1539                            }
1540
1541                            report.getDetails().add( new ModelValidationReport.Detail(
1542                                "SPECIFICATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1543                                Level.SEVERE, getMessage(
1544                                    "specificationSourceSectionTemplateParameterJavaValueConstraint",
1545                                    module.getName(), specification.getIdentifier(), s.getName(), p.getName(),
1546                                    message != null && message.length() > 0 ? " " + message : "" ),
1547                                new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1548
1549                        }
1550                    }
1551                }
1552
1553                this.validateTemplateParameters(
1554                    report, context, s.getSourceSections(),
1555                    "SPECIFICATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1556                    new org.jomc.model.ObjectFactory().createSpecification( specification ),
1557                    "specificationSourceSectionTemplateParameterJavaValueConstraint",
1558                    module.getName(), specification.getIdentifier() );
1559
1560            }
1561        }
1562
1563        if ( sourceSectionsType != null )
1564        {
1565            for ( final SourceSectionsType sections : sourceSectionsType )
1566            {
1567                for ( final SourceSectionType s : sections.getSourceSection() )
1568                {
1569                    report.getDetails().add( new ModelValidationReport.Detail(
1570                        "SPECIFICATION_SOURCE_SECTION_CONSTRAINT", Level.SEVERE, getMessage(
1571                            "specificationSourceSectionConstraint", specification.getIdentifier(), s.getName() ),
1572                        new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1573
1574                    if ( this.isValidateJava() )
1575                    {
1576                        for ( final TemplateParameterType p : s.getTemplateParameter() )
1577                        {
1578                            try
1579                            {
1580                                p.getJavaValue( context.getClassLoader() );
1581                            }
1582                            catch ( final ModelObjectException e )
1583                            {
1584                                final String message = getMessage( e );
1585
1586                                if ( context.isLoggable( Level.FINE ) )
1587                                {
1588                                    context.log( Level.FINE, message, e );
1589                                }
1590
1591                                report.getDetails().add( new ModelValidationReport.Detail(
1592                                    "SPECIFICATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1593                                    Level.SEVERE, getMessage(
1594                                        "specificationSourceSectionTemplateParameterJavaValueConstraint",
1595                                        module.getName(), specification.getIdentifier(), s.getName(), p.getName(),
1596                                        message != null && message.length() > 0 ? " " + message : "" ),
1597                                    new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1598
1599                            }
1600                        }
1601                    }
1602
1603                    this.validateTemplateParameters(
1604                        report, context, s.getSourceSections(),
1605                        "SPECIFICATION_SOURCE_SECTION_TEMPLATE_PARAMETER_JAVA_VALUE_CONSTRAINT",
1606                        new org.jomc.model.ObjectFactory().createSpecification( specification ),
1607                        "specificationSourceSectionTemplateParameterJavaValueConstraint",
1608                        module.getName(), specification.getIdentifier() );
1609
1610                }
1611
1612                if ( sections.getSourceSection().isEmpty() )
1613                {
1614                    report.getDetails().add( new ModelValidationReport.Detail(
1615                        "SPECIFICATION_SOURCE_SECTIONS_CONSTRAINT", Level.SEVERE, getMessage(
1616                            "specificationSourceSectionsConstraint", specification.getIdentifier() ),
1617                        new org.jomc.model.ObjectFactory().createSpecification( specification ) ) );
1618
1619                }
1620            }
1621        }
1622    }
1623
1624    private void validateTemplateParameters( final ModelValidationReport report, final ModelContext context,
1625                                             final SourceSectionsType sourceSectionsType,
1626                                             final String detailIdentifier,
1627                                             final JAXBElement<?> detailElement,
1628                                             final String messageKey, final Object... messageArguments )
1629    {
1630        if ( sourceSectionsType != null )
1631        {
1632            if ( this.isValidateJava() )
1633            {
1634                for ( final SourceSectionType s : sourceSectionsType.getSourceSection() )
1635                {
1636                    for ( final TemplateParameterType p : s.getTemplateParameter() )
1637                    {
1638                        try
1639                        {
1640                            p.getJavaValue( context.getClassLoader() );
1641                        }
1642                        catch ( final ModelObjectException e )
1643                        {
1644                            final String message = getMessage( e );
1645
1646                            if ( context.isLoggable( Level.FINE ) )
1647                            {
1648                                context.log( Level.FINE, message, e );
1649                            }
1650
1651                            final List<Object> arguments = new ArrayList<Object>( Arrays.asList( messageArguments ) );
1652                            arguments.add( s.getName() );
1653                            arguments.add( p.getName() );
1654                            arguments.add( message != null && message.length() > 0 ? " " + message : "" );
1655
1656                            report.getDetails().add( new ModelValidationReport.Detail(
1657                                detailIdentifier, Level.SEVERE, getMessage(
1658                                    messageKey, arguments.toArray( new Object[ arguments.size() ] ) ),
1659                                detailElement ) );
1660
1661                        }
1662                    }
1663
1664                    this.validateTemplateParameters( report, context, s.getSourceSections(), detailIdentifier,
1665                                                     detailElement, messageKey, messageArguments );
1666
1667                }
1668            }
1669        }
1670    }
1671
1672    private static String getMessage( final String key, final Object... args )
1673    {
1674        return MessageFormat.format( ResourceBundle.getBundle(
1675            ToolsModelValidator.class.getName().replace( '.', '/' ), Locale.getDefault() ).getString( key ), args );
1676
1677    }
1678
1679    private static String getMessage( final Throwable t )
1680    {
1681        return t != null
1682                   ? t.getMessage() != null && t.getMessage().trim().length() > 0
1683                         ? t.getMessage()
1684                         : getMessage( t.getCause() )
1685                   : null;
1686
1687    }
1688
1689}