DefaultModelValidator.java

  1. /*
  2.  *   Copyright (C) Christian Schulte <cs@schulte.it>, 2005-206
  3.  *   All rights reserved.
  4.  *
  5.  *   Redistribution and use in source and binary forms, with or without
  6.  *   modification, are permitted provided that the following conditions
  7.  *   are met:
  8.  *
  9.  *     o Redistributions of source code must retain the above copyright
  10.  *       notice, this list of conditions and the following disclaimer.
  11.  *
  12.  *     o Redistributions in binary form must reproduce the above copyright
  13.  *       notice, this list of conditions and the following disclaimer in
  14.  *       the documentation and/or other materials provided with the
  15.  *       distribution.
  16.  *
  17.  *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  18.  *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  19.  *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
  20.  *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  *
  28.  *   $JOMC: DefaultModelValidator.java 5043 2015-05-27 07:03:39Z schulte $
  29.  *
  30.  */
  31. package org.jomc.model.modlet;

  32. import java.text.MessageFormat;
  33. import java.util.Collection;
  34. import java.util.Collections;
  35. import java.util.HashMap;
  36. import java.util.HashSet;
  37. import java.util.Iterator;
  38. import java.util.Locale;
  39. import java.util.Map;
  40. import java.util.ResourceBundle;
  41. import java.util.Set;
  42. import java.util.logging.Level;
  43. import javax.xml.bind.JAXBElement;
  44. import javax.xml.bind.JAXBException;
  45. import javax.xml.bind.util.JAXBSource;
  46. import javax.xml.namespace.QName;
  47. import javax.xml.transform.Source;
  48. import org.jomc.model.Argument;
  49. import org.jomc.model.Dependency;
  50. import org.jomc.model.Implementation;
  51. import org.jomc.model.ImplementationReference;
  52. import org.jomc.model.Implementations;
  53. import org.jomc.model.Inheritable;
  54. import org.jomc.model.InheritanceModel;
  55. import org.jomc.model.JavaIdentifier;
  56. import org.jomc.model.Message;
  57. import org.jomc.model.MessageReference;
  58. import org.jomc.model.ModelObject;
  59. import org.jomc.model.ModelObjectException;
  60. import org.jomc.model.Module;
  61. import org.jomc.model.Modules;
  62. import org.jomc.model.Multiplicity;
  63. import org.jomc.model.ObjectFactory;
  64. import org.jomc.model.Property;
  65. import org.jomc.model.PropertyReference;
  66. import org.jomc.model.Specification;
  67. import org.jomc.model.SpecificationReference;
  68. import org.jomc.model.Specifications;
  69. import org.jomc.model.Text;
  70. import org.jomc.modlet.Model;
  71. import org.jomc.modlet.ModelContext;
  72. import org.jomc.modlet.ModelException;
  73. import org.jomc.modlet.ModelValidationReport;
  74. import org.jomc.modlet.ModelValidator;
  75. import org.jomc.util.ParseException;
  76. import org.jomc.util.TokenMgrError;
  77. import org.jomc.util.VersionParser;
  78. import org.w3c.dom.Element;

  79. /**
  80.  * Default object management and configuration {@code ModelValidator} implementation.
  81.  *
  82.  * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
  83.  * @version $JOMC: DefaultModelValidator.java 5043 2015-05-27 07:03:39Z schulte $
  84.  * @see ModelContext#validateModel(org.jomc.modlet.Model)
  85.  */
  86. public class DefaultModelValidator implements ModelValidator
  87. {

  88.     /**
  89.      * Constant for the name of the model context attribute backing property {@code enabled}.
  90.      *
  91.      * @see #validateModel(org.jomc.modlet.ModelContext, org.jomc.modlet.Model)
  92.      * @see ModelContext#getAttribute(java.lang.String)
  93.      * @since 1.7
  94.      */
  95.     public static final String ENABLED_ATTRIBUTE_NAME = "org.jomc.model.modlet.DefaultModelValidator.enabledAttribute";

  96.     /**
  97.      * Constant for the name of the system property controlling property {@code defaultEnabled}.
  98.      *
  99.      * @see #isDefaultEnabled()
  100.      * @since 1.7
  101.      */
  102.     private static final String DEFAULT_ENABLED_PROPERTY_NAME =
  103.         "org.jomc.model.modlet.DefaultModelValidator.defaultEnabled";

  104.     /**
  105.      * Default value of the flag indicating the validator is enabled by default.
  106.      *
  107.      * @see #isDefaultEnabled()
  108.      * @since 1.7
  109.      */
  110.     private static final Boolean DEFAULT_ENABLED = Boolean.TRUE;

  111.     /**
  112.      * Flag indicating the validator is enabled by default.
  113.      *
  114.      * @since 1.7
  115.      */
  116.     private static volatile Boolean defaultEnabled;

  117.     /**
  118.      * Flag indicating the validator is enabled.
  119.      *
  120.      * @since 1.7
  121.      */
  122.     private Boolean enabled;

  123.     /**
  124.      * Constant for the name of the model context attribute backing property {@code validateJava}.
  125.      *
  126.      * @see ModelContext#getAttribute(java.lang.String)
  127.      * @since 1.4
  128.      */
  129.     public static final String VALIDATE_JAVA_ATTRIBUTE_NAME =
  130.         "org.jomc.model.modlet.DefaultModelValidator.validateJavaAttribute";

  131.     /**
  132.      * Constant for the name of the system property controlling property {@code defaultValidateJava}.
  133.      *
  134.      * @see #isDefaultValidateJava()
  135.      * @since 1.4
  136.      */
  137.     private static final String DEFAULT_VALIDATE_JAVA_PROPERTY_NAME =
  138.         "org.jomc.model.modlet.DefaultModelValidator.defaultValidateJava";

  139.     /**
  140.      * Default value of the flag indicating the validator is performing Java related validation by default.
  141.      *
  142.      * @see #isDefaultValidateJava()
  143.      * @since 1.4
  144.      */
  145.     private static final Boolean DEFAULT_VALIDATE_JAVA = Boolean.TRUE;

  146.     /**
  147.      * Flag indicating the validator is performing Java related validation by default.
  148.      *
  149.      * @since 1.4
  150.      */
  151.     private static volatile Boolean defaultValidateJava;

  152.     /**
  153.      * Flag indicating the validator is performing Java related validation.
  154.      *
  155.      * @since 1.4
  156.      */
  157.     private Boolean validateJava;

  158.     /**
  159.      * Creates a new {@code DefaultModelValidator} instance.
  160.      */
  161.     public DefaultModelValidator()
  162.     {
  163.         super();
  164.     }

  165.     /**
  166.      * Gets a flag indicating the validator is enabled by default.
  167.      * <p>
  168.      * The default enabled flag is controlled by system property
  169.      * {@code org.jomc.model.modlet.DefaultModelValidator.defaultEnabled} holding a value indicating the validator is
  170.      * enabled by default. If that property is not set, the {@code true} default is returned.
  171.      * </p>
  172.      *
  173.      * @return {@code true}, if the validator is enabled by default; {@code false}, if the validator is disabled by
  174.      * default.
  175.      *
  176.      * @see #setDefaultEnabled(java.lang.Boolean)
  177.      * @since 1.7
  178.      */
  179.     public static boolean isDefaultEnabled()
  180.     {
  181.         if ( defaultEnabled == null )
  182.         {
  183.             defaultEnabled = Boolean.valueOf( System.getProperty( DEFAULT_ENABLED_PROPERTY_NAME,
  184.                                                                   Boolean.toString( DEFAULT_ENABLED ) ) );

  185.         }

  186.         return defaultEnabled;
  187.     }

  188.     /**
  189.      * Sets the flag indicating the validator is enabled by default.
  190.      *
  191.      * @param value The new value of the flag indicating the validator is enabled by default or {@code null}.
  192.      *
  193.      * @see #isDefaultEnabled()
  194.      * @since 1.7
  195.      */
  196.     public static void setDefaultEnabled( final Boolean value )
  197.     {
  198.         defaultEnabled = value;
  199.     }

  200.     /**
  201.      * Gets a flag indicating the validator is enabled.
  202.      *
  203.      * @return {@code true}, if the validator is enabled; {@code false}, if the validator is disabled.
  204.      *
  205.      * @see #isDefaultEnabled()
  206.      * @see #setEnabled(java.lang.Boolean)
  207.      * @since 1.7
  208.      */
  209.     public final boolean isEnabled()
  210.     {
  211.         if ( this.enabled == null )
  212.         {
  213.             this.enabled = isDefaultEnabled();
  214.         }

  215.         return this.enabled;
  216.     }

  217.     /**
  218.      * Sets the flag indicating the validator is enabled.
  219.      *
  220.      * @param value The new value of the flag indicating the validator is enabled or {@code null}.
  221.      *
  222.      * @see #isEnabled()
  223.      * @since 1.7
  224.      */
  225.     public final void setEnabled( final Boolean value )
  226.     {
  227.         this.enabled = value;
  228.     }

  229.     /**
  230.      * Gets a flag indicating the validator is performing Java related validation by default.
  231.      * <p>
  232.      * The default validate Java flag is controlled by system property
  233.      * {@code org.jomc.model.modlet.DefaultModelValidator.defaultValidateJava} holding a value indicating the validator
  234.      * is performing Java related validation by default. If that property is not set, the {@code true} default is
  235.      * returned.
  236.      * </p>
  237.      *
  238.      * @return {@code true}, if the validator is performing Java related validation by default; {@code false}, if the
  239.      * validator is not performing Java related validation by default.
  240.      *
  241.      * @see #setDefaultValidateJava(java.lang.Boolean)
  242.      *
  243.      * @since 1.4
  244.      */
  245.     public static boolean isDefaultValidateJava()
  246.     {
  247.         if ( defaultValidateJava == null )
  248.         {
  249.             defaultValidateJava = Boolean.valueOf( System.getProperty( DEFAULT_VALIDATE_JAVA_PROPERTY_NAME,
  250.                                                                        Boolean.toString( DEFAULT_VALIDATE_JAVA ) ) );

  251.         }

  252.         return defaultValidateJava;
  253.     }

  254.     /**
  255.      * Sets the flag indicating the validator is performing Java related validation by default.
  256.      *
  257.      * @param value The new value of the flag indicating the validator is performing Java related validation by default
  258.      * or {@code null}.
  259.      *
  260.      * @see #isDefaultValidateJava()
  261.      *
  262.      * @since 1.4
  263.      */
  264.     public static void setDefaultValidateJava( final Boolean value )
  265.     {
  266.         defaultValidateJava = value;
  267.     }

  268.     /**
  269.      * Gets a flag indicating the validator is performing Java related validation.
  270.      *
  271.      * @return {@code true}, if the validator is performing Java related validation; {@code false}, if the the validator
  272.      * is not performing Java related validation.
  273.      *
  274.      * @see #isDefaultValidateJava()
  275.      * @see #setValidateJava(java.lang.Boolean)
  276.      *
  277.      * @since 1.4
  278.      */
  279.     public final boolean isValidateJava()
  280.     {
  281.         if ( this.validateJava == null )
  282.         {
  283.             this.validateJava = isDefaultValidateJava();
  284.         }

  285.         return this.validateJava;
  286.     }

  287.     /**
  288.      * Sets the flag indicating the validator is performing Java related validation.
  289.      *
  290.      * @param value The new value of the flag indicating the validator is performing Java related validation or
  291.      * {@code null}.
  292.      *
  293.      * @see #isValidateJava()
  294.      *
  295.      * @since 1.4
  296.      */
  297.     public final void setValidateJava( final Boolean value )
  298.     {
  299.         this.validateJava = value;
  300.     }

  301.     public ModelValidationReport validateModel( final ModelContext context, final Model model ) throws ModelException
  302.     {
  303.         if ( context == null )
  304.         {
  305.             throw new NullPointerException( "context" );
  306.         }
  307.         if ( model == null )
  308.         {
  309.             throw new NullPointerException( "model" );
  310.         }

  311.         boolean contextEnabled = this.isEnabled();
  312.         if ( DEFAULT_ENABLED == contextEnabled
  313.                  && context.getAttribute( ENABLED_ATTRIBUTE_NAME ) instanceof Boolean )
  314.         {
  315.             contextEnabled = (Boolean) context.getAttribute( ENABLED_ATTRIBUTE_NAME );
  316.         }

  317.         boolean contextValidateJava = this.isValidateJava();
  318.         if ( DEFAULT_VALIDATE_JAVA == contextValidateJava
  319.                  && context.getAttribute( VALIDATE_JAVA_ATTRIBUTE_NAME ) instanceof Boolean )
  320.         {
  321.             contextValidateJava = (Boolean) context.getAttribute( VALIDATE_JAVA_ATTRIBUTE_NAME );
  322.         }

  323.         try
  324.         {
  325.             ModelValidationReport report = new ModelValidationReport();

  326.             if ( contextEnabled )
  327.             {
  328.                 final Source source = new JAXBSource( context.createContext( model.getIdentifier() ),
  329.                                                       new org.jomc.modlet.ObjectFactory().createModel( model ) );

  330.                 report = context.validateModel( model.getIdentifier(), source );

  331.                 final Modules modules = ModelHelper.getModules( model );

  332.                 if ( modules != null )
  333.                 {
  334.                     final ValidationContext validationContext =
  335.                         new ValidationContext( context, modules, report, contextValidateJava );

  336.                     assertModulesValid( validationContext );
  337.                     assertSpecificationsValid( validationContext );
  338.                     assertImplementationsValid( validationContext );
  339.                 }
  340.             }
  341.             else if ( context.isLoggable( Level.FINER ) )
  342.             {
  343.                 context.log( Level.FINER, getMessage( "disabled", this.getClass().getSimpleName(),
  344.                                                       model.getIdentifier() ), null );

  345.             }

  346.             return report;
  347.         }
  348.         catch ( final JAXBException e )
  349.         {
  350.             String message = getMessage( e );
  351.             if ( message == null && e.getLinkedException() != null )
  352.             {
  353.                 message = getMessage( e.getLinkedException() );
  354.             }

  355.             if ( context.isLoggable( Level.FINE ) )
  356.             {
  357.                 context.log( Level.FINE, message, e );
  358.             }

  359.             throw new ModelException( message, e );
  360.         }
  361.     }

  362.     private static void assertModulesValid( final ValidationContext validationContext )
  363.     {
  364.         for ( int i = 0, s0 = validationContext.getModules().getModule().size(); i < s0; i++ )
  365.         {
  366.             final Module m = validationContext.getModules().getModule().get( i );

  367.             if ( m.getImplementations() != null )
  368.             {
  369.                 for ( int j = 0, s1 = m.getImplementations().getReference().size(); j < s1; j++ )
  370.                 {
  371.                     final ImplementationReference r = m.getImplementations().getReference().get( j );
  372.                     addDetail( validationContext.getReport(), "MODULE_IMPLEMENTATION_REFERENCE_DECLARATION_CONSTRAINT",
  373.                                Level.SEVERE, new ObjectFactory().createModule( m ),
  374.                                "moduleImplementationReferenceDeclarationConstraint", m.getName(), r.getIdentifier() );

  375.                 }
  376.             }

  377.             if ( m.getMessages() != null )
  378.             {
  379.                 for ( int j = 0, s1 = m.getMessages().getMessage().size(); j < s1; j++ )
  380.                 {
  381.                     final Message msg = m.getMessages().getMessage().get( j );

  382.                     if ( msg.isFinal() )
  383.                     {
  384.                         addDetail( validationContext.getReport(), "MODULE_FINAL_MESSAGE_DECLARATION_CONSTRAINT",
  385.                                    Level.SEVERE, new ObjectFactory().createModule( m ), "moduleFinalMessageConstraint",
  386.                                    m.getName(), msg.getName() );

  387.                     }

  388.                     if ( msg.isOverride() )
  389.                     {
  390.                         addDetail( validationContext.getReport(), "MODULE_OVERRIDE_MESSAGE_DECLARATION_CONSTRAINT",
  391.                                    Level.SEVERE, new ObjectFactory().createModule( m ),
  392.                                    "moduleOverrideMessageConstraint", m.getName(), msg.getName() );

  393.                     }

  394.                     if ( validationContext.isValidateJava() )
  395.                     {
  396.                         try
  397.                         {
  398.                             msg.getJavaConstantName();
  399.                         }
  400.                         catch ( final ModelObjectException e )
  401.                         {
  402.                             final String message = getMessage( e );

  403.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  404.                             {
  405.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  406.                             }

  407.                             addDetail( validationContext.getReport(),
  408.                                        "MODULE_MESSAGE_JAVA_CONSTANT_NAME_CONSTRAINT",
  409.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  410.                                        "moduleMessageJavaConstantNameConstraint", m.getName(), msg.getName(),
  411.                                        message != null && message.length() > 0 ? " " + message : "" );

  412.                         }

  413.                         try
  414.                         {
  415.                             msg.getJavaGetterMethodName();
  416.                         }
  417.                         catch ( final ModelObjectException e )
  418.                         {
  419.                             final String message = getMessage( e );

  420.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  421.                             {
  422.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  423.                             }

  424.                             addDetail( validationContext.getReport(),
  425.                                        "MODULE_MESSAGE_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  426.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  427.                                        "moduleMessageJavaGetterMethodNameConstraint", m.getName(), msg.getName(),
  428.                                        message != null && message.length() > 0 ? " " + message : "" );

  429.                         }

  430.                         try
  431.                         {
  432.                             msg.getJavaSetterMethodName();
  433.                         }
  434.                         catch ( final ModelObjectException e )
  435.                         {
  436.                             final String message = getMessage( e );

  437.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  438.                             {
  439.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  440.                             }

  441.                             addDetail( validationContext.getReport(),
  442.                                        "MODULE_MESSAGE_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  443.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  444.                                        "moduleMessageJavaSetterMethodNameConstraint", m.getName(), msg.getName(),
  445.                                        message != null && message.length() > 0 ? " " + message : "" );

  446.                         }

  447.                         try
  448.                         {
  449.                             msg.getJavaVariableName();
  450.                         }
  451.                         catch ( final ModelObjectException e )
  452.                         {
  453.                             final String message = getMessage( e );

  454.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  455.                             {
  456.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  457.                             }

  458.                             addDetail( validationContext.getReport(),
  459.                                        "MODULE_MESSAGE_JAVA_VARIABLE_NAME_CONSTRAINT",
  460.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  461.                                        "moduleMessageJavaVariableNameConstraint", m.getName(), msg.getName(),
  462.                                        message != null && message.length() > 0 ? " " + message : "" );

  463.                         }
  464.                     }

  465.                     if ( msg.getTemplate() != null )
  466.                     {
  467.                         for ( int k = 0, s2 = msg.getTemplate().getText().size(); k < s2; k++ )
  468.                         {
  469.                             final Text t = msg.getTemplate().getText().get( k );

  470.                             try
  471.                             {
  472.                                 t.getMimeType();
  473.                             }
  474.                             catch ( final ModelObjectException e )
  475.                             {
  476.                                 final String message = getMessage( e );

  477.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  478.                                 {
  479.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  480.                                 }

  481.                                 addDetail( validationContext.getReport(),
  482.                                            "MODULE_MESSAGE_TEMPLATE_MIME_TYPE_CONSTRAINT",
  483.                                            Level.SEVERE, new ObjectFactory().createModule( m ),
  484.                                            "moduleMessageTemplateMimeTypeConstraint", m.getName(), msg.getName(),
  485.                                            t.getLanguage(),
  486.                                            message != null && message.length() > 0 ? " " + message : "" );

  487.                             }

  488.                             if ( validationContext.isValidateJava() )
  489.                             {
  490.                                 try
  491.                                 {
  492.                                     new MessageFormat( t.getValue(), new Locale( t.getLanguage() ) );
  493.                                 }
  494.                                 catch ( final IllegalArgumentException e )
  495.                                 {
  496.                                     final String message = getMessage( e );

  497.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  498.                                     {
  499.                                         validationContext.getModelContext().log( Level.FINE, message, e );
  500.                                     }

  501.                                     addDetail( validationContext.getReport(), "MODULE_MESSAGE_TEMPLATE_CONSTRAINT",
  502.                                                Level.SEVERE, new ObjectFactory().createModule( m ),
  503.                                                "moduleMessageTemplateConstraint", m.getName(), msg.getName(),
  504.                                                t.getValue(),
  505.                                                message != null && message.length() > 0 ? " " + message : "" );

  506.                                 }
  507.                             }
  508.                         }
  509.                     }

  510.                     if ( msg.getArguments() != null )
  511.                     {
  512.                         final Map<JavaIdentifier, Argument> javaVariableNames =
  513.                             new HashMap<JavaIdentifier, Argument>( msg.getArguments().getArgument().size() );

  514.                         for ( int k = 0, s2 = msg.getArguments().getArgument().size(); k < s2; k++ )
  515.                         {
  516.                             final Argument a = msg.getArguments().getArgument( k );

  517.                             if ( validationContext.isValidateJava() )
  518.                             {
  519.                                 try
  520.                                 {
  521.                                     a.getJavaTypeName();
  522.                                 }
  523.                                 catch ( final ModelObjectException e )
  524.                                 {
  525.                                     final String message = getMessage( e );

  526.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  527.                                     {
  528.                                         validationContext.getModelContext().log( Level.FINE, message, e );
  529.                                     }

  530.                                     addDetail( validationContext.getReport(),
  531.                                                "MODULE_MESSAGE_ARGUMENT_JAVA_TYPE_NAME_CONSTRAINT",
  532.                                                Level.SEVERE, new ObjectFactory().createModule( m ),
  533.                                                "moduleMessageArgumentJavaTypeNameConstraint", m.getName(),
  534.                                                msg.getName(), a.getIndex(),
  535.                                                message != null && message.length() > 0 ? " " + message : "" );

  536.                                 }

  537.                                 try
  538.                                 {
  539.                                     final JavaIdentifier javaIdentifier = a.getJavaVariableName();

  540.                                     if ( javaVariableNames.containsKey( javaIdentifier ) )
  541.                                     {
  542.                                         addDetail( validationContext.getReport(),
  543.                                                    "MODULE_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  544.                                                    Level.SEVERE, new ObjectFactory().createModule( m ),
  545.                                                    "moduleMessageArgumentJavaVariableNameUniquenessConstraint",
  546.                                                    m.getName(), msg.getName(), a.getName(),
  547.                                                    javaIdentifier, javaVariableNames.get( javaIdentifier ).getName() );

  548.                                     }
  549.                                     else
  550.                                     {
  551.                                         javaVariableNames.put( javaIdentifier, a );
  552.                                     }
  553.                                 }
  554.                                 catch ( final ModelObjectException e )
  555.                                 {
  556.                                     final String message = getMessage( e );

  557.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  558.                                     {
  559.                                         validationContext.getModelContext().log( Level.FINE, message, e );
  560.                                     }

  561.                                     addDetail( validationContext.getReport(),
  562.                                                "MODULE_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_CONSTRAINT",
  563.                                                Level.SEVERE, new ObjectFactory().createModule( m ),
  564.                                                "moduleMessageArgumentJavaVariableNameConstraint", m.getName(),
  565.                                                msg.getName(), a.getIndex(),
  566.                                                message != null && message.length() > 0 ? " " + message : "" );

  567.                                 }
  568.                             }
  569.                         }
  570.                     }
  571.                 }

  572.                 for ( int j = 0, s1 = m.getMessages().getReference().size(); j < s1; j++ )
  573.                 {
  574.                     final MessageReference r = m.getMessages().getReference().get( j );
  575.                     addDetail( validationContext.getReport(), "MODULE_MESSAGE_REFERENCE_DECLARATION_CONSTRAINT",
  576.                                Level.SEVERE, new ObjectFactory().createModule( m ),
  577.                                "moduleMessageReferenceDeclarationConstraint", m.getName(), r.getName() );

  578.                 }
  579.             }

  580.             if ( m.getProperties() != null )
  581.             {
  582.                 for ( int j = 0, s1 = m.getProperties().getProperty().size(); j < s1; j++ )
  583.                 {
  584.                     final Property p = m.getProperties().getProperty().get( j );

  585.                     if ( p.isFinal() )
  586.                     {
  587.                         addDetail( validationContext.getReport(), "MODULE_FINAL_PROPERTY_DECLARATION_CONSTRAINT",
  588.                                    Level.SEVERE, new ObjectFactory().createModule( m ), "moduleFinalPropertyConstraint",
  589.                                    m.getName(), p.getName() );

  590.                     }

  591.                     if ( p.isOverride() )
  592.                     {
  593.                         addDetail( validationContext.getReport(), "MODULE_OVERRIDE_PROPERTY_DECLARATION_CONSTRAINT",
  594.                                    Level.SEVERE, new ObjectFactory().createModule( m ),
  595.                                    "moduleOverridePropertyConstraint", m.getName(), p.getName() );

  596.                     }

  597.                     if ( p.getValue() != null && p.getAny() != null )
  598.                     {
  599.                         addDetail( validationContext.getReport(), "MODULE_PROPERTY_VALUE_CONSTRAINT", Level.SEVERE,
  600.                                    new ObjectFactory().createModule( m ), "modulePropertyValueConstraint", m.getName(),
  601.                                    p.getName() );

  602.                     }

  603.                     if ( p.getAny() != null && p.getType() == null )
  604.                     {
  605.                         addDetail( validationContext.getReport(), "MODULE_PROPERTY_TYPE_CONSTRAINT", Level.SEVERE,
  606.                                    new ObjectFactory().createModule( m ), "modulePropertyTypeConstraint", m.getName(),
  607.                                    p.getName() );

  608.                     }

  609.                     if ( validationContext.isValidateJava() )
  610.                     {
  611.                         try
  612.                         {
  613.                             p.getJavaConstantName();
  614.                         }
  615.                         catch ( final ModelObjectException e )
  616.                         {
  617.                             final String message = getMessage( e );

  618.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  619.                             {
  620.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  621.                             }

  622.                             addDetail( validationContext.getReport(),
  623.                                        "MODULE_PROPERTY_JAVA_CONSTANT_NAME_CONSTRAINT",
  624.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  625.                                        "modulePropertyJavaConstantNameConstraint", m.getName(), p.getName(),
  626.                                        message != null && message.length() > 0 ? " " + message : "" );

  627.                         }

  628.                         try
  629.                         {
  630.                             p.getJavaGetterMethodName();
  631.                         }
  632.                         catch ( final ModelObjectException e )
  633.                         {
  634.                             final String message = getMessage( e );

  635.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  636.                             {
  637.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  638.                             }

  639.                             addDetail( validationContext.getReport(),
  640.                                        "MODULE_PROPERTY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  641.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  642.                                        "modulePropertyJavaGetterMethodNameConstraint", m.getName(), p.getName(),
  643.                                        message != null && message.length() > 0 ? " " + message : "" );

  644.                         }

  645.                         try
  646.                         {
  647.                             p.getJavaSetterMethodName();
  648.                         }
  649.                         catch ( final ModelObjectException e )
  650.                         {
  651.                             final String message = getMessage( e );

  652.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  653.                             {
  654.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  655.                             }

  656.                             addDetail( validationContext.getReport(),
  657.                                        "MODULE_PROPERTY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  658.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  659.                                        "modulePropertyJavaSetterMethodNameConstraint", m.getName(), p.getName(),
  660.                                        message != null && message.length() > 0 ? " " + message : "" );

  661.                         }

  662.                         try
  663.                         {
  664.                             p.getJavaTypeName();
  665.                         }
  666.                         catch ( final ModelObjectException e )
  667.                         {
  668.                             final String message = getMessage( e );

  669.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  670.                             {
  671.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  672.                             }

  673.                             addDetail( validationContext.getReport(),
  674.                                        "MODULE_PROPERTY_JAVA_TYPE_NAME_CONSTRAINT",
  675.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  676.                                        "modulePropertyJavaTypeNameConstraint", m.getName(), p.getName(),
  677.                                        message != null && message.length() > 0 ? " " + message : "" );

  678.                         }

  679.                         try
  680.                         {
  681.                             p.getJavaVariableName();
  682.                         }
  683.                         catch ( final ModelObjectException e )
  684.                         {
  685.                             final String message = getMessage( e );

  686.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  687.                             {
  688.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  689.                             }

  690.                             addDetail( validationContext.getReport(),
  691.                                        "MODULE_PROPERTY_JAVA_VARIABLE_NAME_CONSTRAINT",
  692.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  693.                                        "modulePropertyJavaVariableNameConstraint", m.getName(), p.getName(),
  694.                                        message != null && message.length() > 0 ? " " + message : "" );

  695.                         }

  696.                         try
  697.                         {
  698.                             p.getJavaValue( validationContext.getModelContext().getClassLoader() );
  699.                         }
  700.                         catch ( final ModelObjectException e )
  701.                         {
  702.                             final String message = getMessage( e );

  703.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  704.                             {
  705.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  706.                             }

  707.                             addDetail( validationContext.getReport(), "MODULE_PROPERTY_JAVA_VALUE_CONSTRAINT",
  708.                                        Level.SEVERE, new ObjectFactory().createModule( m ),
  709.                                        "modulePropertyJavaValueConstraint", m.getName(), p.getName(),
  710.                                        message != null && message.length() > 0 ? " " + message : "" );

  711.                         }
  712.                     }
  713.                 }

  714.                 for ( int j = 0, s1 = m.getProperties().getReference().size(); j < s1; j++ )
  715.                 {
  716.                     final PropertyReference r = m.getProperties().getReference().get( j );
  717.                     addDetail( validationContext.getReport(), "MODULE_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT",
  718.                                Level.SEVERE, new ObjectFactory().createModule( m ),
  719.                                "modulePropertyReferenceDeclarationConstraint", m.getName(), r.getName() );

  720.                 }
  721.             }

  722.             if ( m.getSpecifications() != null )
  723.             {
  724.                 for ( int j = 0, s1 = m.getSpecifications().getReference().size(); j < s1; j++ )
  725.                 {
  726.                     final SpecificationReference r = m.getSpecifications().getReference().get( j );
  727.                     addDetail( validationContext.getReport(), "MODULE_SPECIFICATION_REFERENCE_DECLARATION_CONSTRAINT",
  728.                                Level.SEVERE, new ObjectFactory().createModule( m ),
  729.                                "moduleSpecificationReferenceDeclarationConstraint", m.getName(), r.getIdentifier() );

  730.                 }
  731.             }
  732.         }
  733.     }

  734.     private static void assertImplementationsValid( final ValidationContext validationContext )
  735.     {
  736.         final Implementations implementations = validationContext.getAllImplementations();

  737.         if ( implementations != null )
  738.         {
  739.             final Map<String, Implementation> implementationClassDeclarations = new HashMap<String, Implementation>();
  740.             final Map<String, Implementation> implementationJavaClassDeclarations =
  741.                 new HashMap<String, Implementation>();

  742.             for ( int i = 0, s0 = implementations.getImplementation().size(); i < s0; i++ )
  743.             {
  744.                 final Implementation impl = implementations.getImplementation().get( i );
  745.                 final InheritanceModel imodel = validationContext.getInheritanceModel();
  746.                 final Module moduleOfImpl = validationContext.getModuleOfImplementation( impl.getIdentifier() );
  747.                 final Set<InheritanceModel.Node<ImplementationReference>> cyclicImplementationReferenceNodes =
  748.                     imodel.getCycleNodes( impl.getIdentifier() );

  749.                 for ( final InheritanceModel.Node<ImplementationReference> node : cyclicImplementationReferenceNodes )
  750.                 {
  751.                     addDetail( validationContext.getReport(), "IMPLEMENTATION_INHERITANCE_CYCLE_CONSTRAINT",
  752.                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  753.                                "implementationInheritanceCycleConstraint", impl.getIdentifier(),
  754.                                moduleOfImpl.getName(), getNodePathString( node ) );

  755.                 }

  756.                 if ( validationContext.isValidateJava() )
  757.                 {
  758.                     try
  759.                     {
  760.                         impl.getJavaTypeName();
  761.                     }
  762.                     catch ( final ModelObjectException e )
  763.                     {
  764.                         final String message = getMessage( e );

  765.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  766.                         {
  767.                             validationContext.getModelContext().log( Level.FINE, message, e );
  768.                         }

  769.                         addDetail( validationContext.getReport(),
  770.                                    "IMPLEMENTATION_JAVA_TYPE_NAME_CONSTRAINT",
  771.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  772.                                    "implementationJavaTypeNameConstraint", impl.getIdentifier(),
  773.                                    moduleOfImpl.getName(), impl.getClazz(),
  774.                                    message != null && message.length() > 0 ? " " + message : "" );

  775.                     }
  776.                 }

  777.                 if ( impl.isClassDeclaration() )
  778.                 {
  779.                     if ( impl.getClazz() == null )
  780.                     {
  781.                         addDetail( validationContext.getReport(), "IMPLEMENTATION_CLASS_CONSTRAINT", Level.SEVERE,
  782.                                    new ObjectFactory().createImplementation( impl ), "implementationClassConstraint",
  783.                                    impl.getIdentifier(), moduleOfImpl.getName() );

  784.                     }
  785.                     else
  786.                     {
  787.                         final Implementation prev = implementationClassDeclarations.get( impl.getClazz() );

  788.                         if ( prev != null && !prev.getIdentifier().equals( impl.getIdentifier() ) )
  789.                         {
  790.                             final Module moduleOfPrev =
  791.                                 validationContext.getModuleOfImplementation( prev.getIdentifier() );

  792.                             addDetail( validationContext.getReport(), "IMPLEMENTATION_CLASS_DECLARATION_CONSTRAINT",
  793.                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  794.                                        "implementationClassDeclarationConstraint", impl.getIdentifier(),
  795.                                        moduleOfImpl.getName(), impl.getClazz(), prev.getIdentifier(),
  796.                                        moduleOfPrev.getName() );

  797.                         }
  798.                         else
  799.                         {
  800.                             implementationClassDeclarations.put( impl.getClazz(), impl );
  801.                         }

  802.                         if ( validationContext.isValidateJava() )
  803.                         {
  804.                             try
  805.                             {
  806.                                 final Implementation java =
  807.                                     implementationJavaClassDeclarations.get( impl.getJavaTypeName().getClassName() );

  808.                                 if ( java != null && !java.getIdentifier().equals( impl.getIdentifier() ) )
  809.                                 {
  810.                                     final Module moduleOfJava =
  811.                                         validationContext.getModuleOfImplementation( java.getIdentifier() );

  812.                                     addDetail( validationContext.getReport(),
  813.                                                "IMPLEMENTATION_JAVA_CLASS_DECLARATION_CONSTRAINT",
  814.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  815.                                                "implementationJavaClassDeclarationConstraint", impl.getIdentifier(),
  816.                                                moduleOfImpl.getName(), impl.getJavaTypeName().getClassName(),
  817.                                                java.getIdentifier(), moduleOfJava.getName() );

  818.                                 }
  819.                                 else
  820.                                 {
  821.                                     implementationJavaClassDeclarations.put( impl.getJavaTypeName().getClassName(),
  822.                                                                              impl );

  823.                                 }
  824.                             }
  825.                             catch ( final ModelObjectException e )
  826.                             {
  827.                                 // Already validated above.
  828.                             }
  829.                         }
  830.                     }
  831.                 }

  832.                 if ( impl.isAbstract() && impl.getLocation() != null )
  833.                 {
  834.                     addDetail( validationContext.getReport(), "IMPLEMENTATION_ABSTRACT_LOCATION_DECLARATION_CONSTRAINT",
  835.                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  836.                                "implementationAbstractLocationDeclarationConstraint", impl.getIdentifier(),
  837.                                moduleOfImpl.getName(), impl.getLocation() );

  838.                 }

  839.                 if ( impl.getDependencies() != null )
  840.                 {
  841.                     for ( int j = 0, s1 = impl.getDependencies().getDependency().size(); j < s1; j++ )
  842.                     {
  843.                         final Dependency d = impl.getDependencies().getDependency().get( j );

  844.                         final Set<InheritanceModel.Node<Dependency>> effDependencies =
  845.                             imodel.getDependencyNodes( impl.getIdentifier(), d.getName() );

  846.                         for ( final InheritanceModel.Node<Dependency> effDependency : effDependencies )
  847.                         {
  848.                             final Set<InheritanceModel.Node<Dependency>> overriddenDependencies =
  849.                                 modifiableSet( effDependency.getOverriddenNodes() );

  850.                             if ( d.isOverride() && effDependency.getOverriddenNodes().isEmpty() )
  851.                             {
  852.                                 addDetail( validationContext.getReport(),
  853.                                            "IMPLEMENTATION_DEPENDENCY_OVERRIDE_CONSTRAINT",
  854.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  855.                                            "implementationDependencyOverrideConstraint", impl.getIdentifier(),
  856.                                            moduleOfImpl.getName(), d.getName() );

  857.                             }

  858.                             if ( !( d.isOverride() || overriddenDependencies.isEmpty() ) )
  859.                             {
  860.                                 for ( final InheritanceModel.Node<Dependency> overriddenDependency
  861.                                           : overriddenDependencies )
  862.                                 {
  863.                                     Implementation overriddenImplementation = overriddenDependency.getImplementation();
  864.                                     if ( overriddenDependency.getClassDeclaration() != null )
  865.                                     {
  866.                                         overriddenImplementation = overriddenDependency.getClassDeclaration();
  867.                                     }

  868.                                     final Module moduleOfDependency =
  869.                                         validationContext.getModuleOfImplementation(
  870.                                             overriddenImplementation.getIdentifier() );

  871.                                     addDetail( validationContext.getReport(),
  872.                                                "IMPLEMENTATION_DEPENDENCY_OVERRIDE_WARNING",
  873.                                                Level.WARNING, new ObjectFactory().createImplementation( impl ),
  874.                                                "implementationDependencyOverrideWarning", impl.getIdentifier(),
  875.                                                moduleOfImpl.getName(), d.getName(),
  876.                                                overriddenImplementation.getIdentifier(),
  877.                                                moduleOfDependency.getName(),
  878.                                                getNodePathString( overriddenDependency ) );

  879.                                 }
  880.                             }

  881.                             retainFinalNodes( overriddenDependencies );

  882.                             for ( final InheritanceModel.Node<Dependency> overriddenDependency : overriddenDependencies )
  883.                             {
  884.                                 Implementation overriddenImplementation = overriddenDependency.getImplementation();
  885.                                 if ( overriddenDependency.getClassDeclaration() != null )
  886.                                 {
  887.                                     overriddenImplementation = overriddenDependency.getClassDeclaration();
  888.                                 }

  889.                                 final Module moduleOfDependency =
  890.                                     validationContext.getModuleOfImplementation(
  891.                                         overriddenImplementation.getIdentifier() );

  892.                                 addDetail( validationContext.getReport(),
  893.                                            "IMPLEMENTATION_DEPENDENCY_INHERITANCE_CONSTRAINT", Level.SEVERE,
  894.                                            new ObjectFactory().createImplementation( impl ),
  895.                                            "implementationDependencyFinalConstraint", impl.getIdentifier(),
  896.                                            moduleOfImpl.getName(), d.getName(),
  897.                                            overriddenImplementation.getIdentifier(),
  898.                                            moduleOfDependency.getName(),
  899.                                            getNodePathString( overriddenDependency ) );

  900.                             }
  901.                         }

  902.                         if ( validationContext.isValidateJava() )
  903.                         {
  904.                             try
  905.                             {
  906.                                 d.getJavaConstantName();
  907.                             }
  908.                             catch ( final ModelObjectException e )
  909.                             {
  910.                                 final String message = getMessage( e );

  911.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  912.                                 {
  913.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  914.                                 }

  915.                                 addDetail( validationContext.getReport(),
  916.                                            "IMPLEMENTATION_DEPENDENCY_JAVA_CONSTANT_NAME_CONSTRAINT",
  917.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  918.                                            "implementationDependencyJavaConstantNameConstraint", impl.getIdentifier(),
  919.                                            moduleOfImpl.getName(), d.getName(),
  920.                                            message != null && message.length() > 0 ? " " + message : "" );

  921.                             }

  922.                             try
  923.                             {
  924.                                 d.getJavaGetterMethodName();
  925.                             }
  926.                             catch ( final ModelObjectException e )
  927.                             {
  928.                                 final String message = getMessage( e );

  929.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  930.                                 {
  931.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  932.                                 }

  933.                                 addDetail( validationContext.getReport(),
  934.                                            "IMPLEMENTATION_DEPENDENCY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  935.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  936.                                            "implementationDependencyJavaGetterMethodNameConstraint",
  937.                                            impl.getIdentifier(), moduleOfImpl.getName(), d.getName(),
  938.                                            message != null && message.length() > 0 ? " " + message : "" );

  939.                             }

  940.                             try
  941.                             {
  942.                                 d.getJavaSetterMethodName();
  943.                             }
  944.                             catch ( final ModelObjectException e )
  945.                             {
  946.                                 final String message = getMessage( e );

  947.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  948.                                 {
  949.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  950.                                 }

  951.                                 addDetail( validationContext.getReport(),
  952.                                            "IMPLEMENTATION_DEPENDENCY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  953.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  954.                                            "implementationDependencyJavaSetterMethodNameConstraint",
  955.                                            impl.getIdentifier(), moduleOfImpl.getName(), d.getName(),
  956.                                            message != null && message.length() > 0 ? " " + message : "" );

  957.                             }

  958.                             try
  959.                             {
  960.                                 d.getJavaVariableName();
  961.                             }
  962.                             catch ( final ModelObjectException e )
  963.                             {
  964.                                 final String message = getMessage( e );

  965.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  966.                                 {
  967.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  968.                                 }

  969.                                 addDetail( validationContext.getReport(),
  970.                                            "IMPLEMENTATION_DEPENDENCY_JAVA_VARIABLE_NAME_CONSTRAINT",
  971.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  972.                                            "implementationDependencyJavaVariableNameConstraint",
  973.                                            impl.getIdentifier(), moduleOfImpl.getName(), d.getName(),
  974.                                            message != null && message.length() > 0 ? " " + message : "" );

  975.                             }
  976.                         }

  977.                         assertDependencyValid( validationContext, impl, d );
  978.                     }
  979.                 }

  980.                 if ( impl.getImplementations() != null )
  981.                 {
  982.                     final Set<String> effImplementationReferences =
  983.                         imodel.getImplementationReferenceIdentifiers( impl.getIdentifier() );

  984.                     for ( final String effImplementationReference : effImplementationReferences )
  985.                     {
  986.                         final Implementation ancestorImplementation =
  987.                             validationContext.getImplementation( effImplementationReference );

  988.                         if ( ancestorImplementation != null && ancestorImplementation.isFinal() )
  989.                         {
  990.                             final Module moduleOfFinal =
  991.                                 validationContext.getModuleOfImplementation( ancestorImplementation.getIdentifier() );

  992.                             addDetail( validationContext.getReport(),
  993.                                        "IMPLEMENTATION_IMPLEMENTATION_INHERITANCE_CONSTRAINT", Level.SEVERE,
  994.                                        new ObjectFactory().createImplementation( impl ),
  995.                                        "implementationFinalImplementationConstraint", impl.getIdentifier(),
  996.                                        moduleOfImpl.getName(), ancestorImplementation.getIdentifier(),
  997.                                        moduleOfFinal.getName() );

  998.                         }
  999.                     }

  1000.                     for ( int j = 0, s1 = impl.getImplementations().getImplementation().size(); j < s1; j++ )
  1001.                     {
  1002.                         final Implementation pi = impl.getImplementations().getImplementation().get( j );

  1003.                         addDetail( validationContext.getReport(),
  1004.                                    "IMPLEMENTATION_IMPLEMENTATION_DECLARATION_CONSTRAINT", Level.SEVERE,
  1005.                                    new ObjectFactory().createImplementation( impl ),
  1006.                                    "implementationImplementationDeclarationConstraint", impl.getIdentifier(),
  1007.                                    moduleOfImpl.getName(), pi.getIdentifier() );

  1008.                     }

  1009.                     for ( int j = 0, s1 = impl.getImplementations().getReference().size(); j < s1; j++ )
  1010.                     {
  1011.                         final ImplementationReference r = impl.getImplementations().getReference().get( j );

  1012.                         final Set<InheritanceModel.Node<ImplementationReference>> effReferences =
  1013.                             imodel.getImplementationReferenceNodes( impl.getIdentifier(), r.getIdentifier() );

  1014.                         for ( final InheritanceModel.Node<ImplementationReference> effReference : effReferences )
  1015.                         {
  1016.                             final Set<InheritanceModel.Node<ImplementationReference>> overriddenReferences =
  1017.                                 modifiableSet( effReference.getOverriddenNodes() );

  1018.                             if ( r.isOverride() && overriddenReferences.isEmpty() )
  1019.                             {
  1020.                                 addDetail( validationContext.getReport(),
  1021.                                            "IMPLEMENTATION_IMPLEMENTATION_OVERRIDE_CONSTRAINT", Level.SEVERE,
  1022.                                            new ObjectFactory().createImplementation( impl ),
  1023.                                            "implementationImplementationOverrideConstraint", impl.getIdentifier(),
  1024.                                            moduleOfImpl.getName(), r.getIdentifier() );

  1025.                             }

  1026.                             if ( !( r.isOverride() || overriddenReferences.isEmpty() ) )
  1027.                             {
  1028.                                 for ( final InheritanceModel.Node<ImplementationReference> overriddenReference
  1029.                                           : overriddenReferences )
  1030.                                 {
  1031.                                     Implementation overriddenImplementation = overriddenReference.getImplementation();
  1032.                                     if ( overriddenReference.getClassDeclaration() != null )
  1033.                                     {
  1034.                                         overriddenImplementation = overriddenReference.getClassDeclaration();
  1035.                                     }

  1036.                                     final Module moduleOfReference =
  1037.                                         validationContext.getModuleOfImplementation(
  1038.                                             overriddenImplementation.getIdentifier() );

  1039.                                     addDetail( validationContext.getReport(),
  1040.                                                "IMPLEMENTATION_IMPLEMENTATION_REFERENCE_OVERRIDE_WARNING",
  1041.                                                Level.WARNING, new ObjectFactory().createImplementation( impl ),
  1042.                                                "implementationImplementationOverrideWarning", impl.getIdentifier(),
  1043.                                                moduleOfImpl.getName(), r.getIdentifier(),
  1044.                                                overriddenImplementation.getIdentifier(),
  1045.                                                moduleOfReference.getName(),
  1046.                                                getNodePathString( overriddenReference ) );

  1047.                                 }
  1048.                             }

  1049.                             retainFinalNodes( overriddenReferences );

  1050.                             for ( final InheritanceModel.Node<ImplementationReference> overriddenReference
  1051.                                       : overriddenReferences )
  1052.                             {
  1053.                                 Implementation overriddenImplementation = overriddenReference.getImplementation();
  1054.                                 if ( overriddenReference.getClassDeclaration() != null )
  1055.                                 {
  1056.                                     overriddenImplementation = overriddenReference.getClassDeclaration();
  1057.                                 }

  1058.                                 final Module moduleOfReference =
  1059.                                     validationContext.getModuleOfImplementation(
  1060.                                         overriddenImplementation.getIdentifier() );

  1061.                                 addDetail( validationContext.getReport(),
  1062.                                            "IMPLEMENTATION_IMPLEMENTATION_REFERENCE_INHERITANCE_CONSTRAINT",
  1063.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1064.                                            "implementationFinalImplementatioReferenceConstraint", impl.getIdentifier(),
  1065.                                            moduleOfImpl.getName(), r.getIdentifier(),
  1066.                                            overriddenImplementation.getIdentifier(),
  1067.                                            moduleOfReference.getName(), getNodePathString( overriddenReference ) );

  1068.                             }
  1069.                         }
  1070.                     }
  1071.                 }

  1072.                 if ( impl.getMessages() != null )
  1073.                 {
  1074.                     for ( int j = 0, s1 = impl.getMessages().getMessage().size(); j < s1; j++ )
  1075.                     {
  1076.                         final Message m = impl.getMessages().getMessage().get( j );

  1077.                         if ( impl.getMessages().getReference( m.getName() ) != null )
  1078.                         {
  1079.                             addDetail( validationContext.getReport(), "IMPLEMENTATION_MESSAGES_UNIQUENESS_CONSTRAINT",
  1080.                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1081.                                        "implementationMessagesUniquenessConstraint", impl.getIdentifier(),
  1082.                                        moduleOfImpl.getName(), m.getName() );

  1083.                         }

  1084.                         if ( validationContext.isValidateJava() )
  1085.                         {
  1086.                             try
  1087.                             {
  1088.                                 m.getJavaConstantName();
  1089.                             }
  1090.                             catch ( final ModelObjectException e )
  1091.                             {
  1092.                                 final String message = getMessage( e );

  1093.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1094.                                 {
  1095.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1096.                                 }

  1097.                                 addDetail( validationContext.getReport(),
  1098.                                            "IMPLEMENTATION_MESSAGE_JAVA_CONSTANT_NAME_CONSTRAINT", Level.SEVERE,
  1099.                                            new ObjectFactory().createImplementation( impl ),
  1100.                                            "implementationMessageJavaConstantNameConstraint", impl.getIdentifier(),
  1101.                                            moduleOfImpl.getName(), m.getName(),
  1102.                                            message != null && message.length() > 0 ? " " + message : "" );

  1103.                             }

  1104.                             try
  1105.                             {
  1106.                                 m.getJavaGetterMethodName();
  1107.                             }
  1108.                             catch ( final ModelObjectException e )
  1109.                             {
  1110.                                 final String message = getMessage( e );

  1111.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1112.                                 {
  1113.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1114.                                 }

  1115.                                 addDetail( validationContext.getReport(),
  1116.                                            "IMPLEMENTATION_MESSAGE_JAVA_GETTER_METHOD_NAME_CONSTRAINT", Level.SEVERE,
  1117.                                            new ObjectFactory().createImplementation( impl ),
  1118.                                            "implementationMessageJavaGetterMethodNameConstraint", impl.getIdentifier(),
  1119.                                            moduleOfImpl.getName(), m.getName(),
  1120.                                            message != null && message.length() > 0 ? " " + message : "" );

  1121.                             }

  1122.                             try
  1123.                             {
  1124.                                 m.getJavaSetterMethodName();
  1125.                             }
  1126.                             catch ( final ModelObjectException e )
  1127.                             {
  1128.                                 final String message = getMessage( e );

  1129.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1130.                                 {
  1131.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1132.                                 }

  1133.                                 addDetail( validationContext.getReport(),
  1134.                                            "IMPLEMENTATION_MESSAGE_JAVA_SETTER_METHOD_NAME_CONSTRAINT", Level.SEVERE,
  1135.                                            new ObjectFactory().createImplementation( impl ),
  1136.                                            "implementationMessageJavaSetterMethodNameConstraint", impl.getIdentifier(),
  1137.                                            moduleOfImpl.getName(), m.getName(),
  1138.                                            message != null && message.length() > 0 ? " " + message : "" );

  1139.                             }

  1140.                             try
  1141.                             {
  1142.                                 m.getJavaVariableName();
  1143.                             }
  1144.                             catch ( final ModelObjectException e )
  1145.                             {
  1146.                                 final String message = getMessage( e );

  1147.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1148.                                 {
  1149.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1150.                                 }

  1151.                                 addDetail( validationContext.getReport(),
  1152.                                            "IMPLEMENTATION_MESSAGE_JAVA_VARIABLE_NAME_CONSTRAINT", Level.SEVERE,
  1153.                                            new ObjectFactory().createImplementation( impl ),
  1154.                                            "implementationMessageJavaVariableNameConstraint", impl.getIdentifier(),
  1155.                                            moduleOfImpl.getName(), m.getName(),
  1156.                                            message != null && message.length() > 0 ? " " + message : "" );

  1157.                             }
  1158.                         }

  1159.                         if ( m.getTemplate() != null )
  1160.                         {
  1161.                             for ( int k = 0, s2 = m.getTemplate().getText().size(); k < s2; k++ )
  1162.                             {
  1163.                                 final Text t = m.getTemplate().getText().get( k );

  1164.                                 try
  1165.                                 {
  1166.                                     t.getMimeType();
  1167.                                 }
  1168.                                 catch ( final ModelObjectException e )
  1169.                                 {
  1170.                                     final String message = getMessage( e );

  1171.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1172.                                     {
  1173.                                         validationContext.getModelContext().log( Level.FINE, message, e );
  1174.                                     }

  1175.                                     addDetail( validationContext.getReport(),
  1176.                                                "IMPLEMENTATION_MESSAGE_TEMPLATE_MIME_TYPE_CONSTRAINT", Level.SEVERE,
  1177.                                                new ObjectFactory().createImplementation( impl ),
  1178.                                                "implementationMessageTemplateMimeTypeConstraint", impl.getIdentifier(),
  1179.                                                moduleOfImpl.getName(), m.getName(), t.getLanguage(),
  1180.                                                message != null && message.length() > 0 ? " " + message : "" );

  1181.                                 }

  1182.                                 if ( validationContext.isValidateJava() )
  1183.                                 {
  1184.                                     try
  1185.                                     {
  1186.                                         new MessageFormat( t.getValue(), new Locale( t.getLanguage() ) );
  1187.                                     }
  1188.                                     catch ( final IllegalArgumentException e )
  1189.                                     {
  1190.                                         final String message = getMessage( e );

  1191.                                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1192.                                         {
  1193.                                             validationContext.getModelContext().log( Level.FINE, message, e );
  1194.                                         }

  1195.                                         addDetail( validationContext.getReport(),
  1196.                                                    "IMPLEMENTATION_MESSAGE_TEMPLATE_CONSTRAINT", Level.SEVERE,
  1197.                                                    new ObjectFactory().createImplementation( impl ),
  1198.                                                    "implementationMessageTemplateConstraint", impl.getIdentifier(),
  1199.                                                    moduleOfImpl.getName(), m.getName(), t.getLanguage(),
  1200.                                                    message != null && message.length() > 0 ? " " + message : "" );

  1201.                                     }
  1202.                                 }
  1203.                             }
  1204.                         }

  1205.                         final Set<InheritanceModel.Node<Message>> effMessages =
  1206.                             imodel.getMessageNodes( impl.getIdentifier(), m.getName() );

  1207.                         for ( final InheritanceModel.Node<Message> effMessage : effMessages )
  1208.                         {
  1209.                             final Set<InheritanceModel.Node<Message>> overriddenMessages =
  1210.                                 modifiableSet( effMessage.getOverriddenNodes() );

  1211.                             if ( m.isOverride() && overriddenMessages.isEmpty() )
  1212.                             {
  1213.                                 addDetail( validationContext.getReport(), "IMPLEMENTATION_MESSAGE_OVERRIDE_CONSTRAINT",
  1214.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1215.                                            "implementationMessageOverrideConstraint", impl.getIdentifier(),
  1216.                                            moduleOfImpl.getName(), m.getName() );

  1217.                             }

  1218.                             if ( !( m.isOverride() || overriddenMessages.isEmpty() ) )
  1219.                             {
  1220.                                 for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  1221.                                 {
  1222.                                     Implementation overriddenImplementation = overriddenMessage.getImplementation();
  1223.                                     if ( overriddenMessage.getClassDeclaration() != null )
  1224.                                     {
  1225.                                         overriddenImplementation = overriddenMessage.getClassDeclaration();
  1226.                                     }

  1227.                                     final Module moduleOfMessage =
  1228.                                         validationContext.getModuleOfImplementation(
  1229.                                             overriddenImplementation.getIdentifier() );

  1230.                                     addDetail( validationContext.getReport(), "IMPLEMENTATION_MESSAGE_OVERRIDE_WARNING",
  1231.                                                Level.WARNING, new ObjectFactory().createImplementation( impl ),
  1232.                                                "implementationMessageOverrideWarning", impl.getIdentifier(),
  1233.                                                moduleOfImpl.getName(), m.getName(),
  1234.                                                overriddenImplementation.getIdentifier(),
  1235.                                                moduleOfMessage.getName(), getNodePathString( overriddenMessage ) );

  1236.                                 }
  1237.                             }

  1238.                             retainFinalNodes( overriddenMessages );

  1239.                             for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  1240.                             {
  1241.                                 Implementation overriddenImplementation = overriddenMessage.getImplementation();
  1242.                                 if ( overriddenMessage.getClassDeclaration() != null )
  1243.                                 {
  1244.                                     overriddenImplementation = overriddenMessage.getClassDeclaration();
  1245.                                 }

  1246.                                 final Module moduleOfMessage = validationContext.getModuleOfImplementation(
  1247.                                     overriddenImplementation.getIdentifier() );

  1248.                                 addDetail( validationContext.getReport(),
  1249.                                            "IMPLEMENTATION_MESSAGE_INHERITANCE_CONSTRAINT",
  1250.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1251.                                            "implementationMessageFinalConstraint", impl.getIdentifier(),
  1252.                                            moduleOfImpl.getName(), m.getName(),
  1253.                                            overriddenImplementation.getIdentifier(),
  1254.                                            moduleOfMessage.getName(), getNodePathString( overriddenMessage ) );

  1255.                             }
  1256.                         }

  1257.                         if ( m.getArguments() != null )
  1258.                         {
  1259.                             final Map<JavaIdentifier, Argument> javaVariableNames =
  1260.                                 new HashMap<JavaIdentifier, Argument>( m.getArguments().getArgument().size() );

  1261.                             for ( int k = 0, s2 = m.getArguments().getArgument().size(); k < s2; k++ )
  1262.                             {
  1263.                                 final Argument a = m.getArguments().getArgument().get( k );

  1264.                                 if ( validationContext.isValidateJava() )
  1265.                                 {
  1266.                                     try
  1267.                                     {
  1268.                                         a.getJavaTypeName();
  1269.                                     }
  1270.                                     catch ( final ModelObjectException e )
  1271.                                     {
  1272.                                         final String message = getMessage( e );

  1273.                                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1274.                                         {
  1275.                                             validationContext.getModelContext().log( Level.FINE, message, e );
  1276.                                         }

  1277.                                         addDetail( validationContext.getReport(),
  1278.                                                    "IMPLEMENTATION_MESSAGE_ARGUMENT_JAVA_TYPE_NAME_CONSTRAINT",
  1279.                                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1280.                                                    "implementationMessageArgumentJavaTypeNameConstraint",
  1281.                                                    impl.getIdentifier(), moduleOfImpl.getName(), m.getName(),
  1282.                                                    a.getName(),
  1283.                                                    message != null && message.length() > 0 ? " " + message : "" );

  1284.                                     }

  1285.                                     try
  1286.                                     {
  1287.                                         final JavaIdentifier javaIdentifier = a.getJavaVariableName();

  1288.                                         if ( javaVariableNames.containsKey( javaIdentifier ) )
  1289.                                         {
  1290.                                             addDetail( validationContext.getReport(),
  1291.                                                        "IMPLEMENTATION_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  1292.                                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1293.                                                        "implementationMessageArgumentJavaVariableNameUniquenessConstraint",
  1294.                                                        impl.getIdentifier(), moduleOfImpl.getName(), m.getName(),
  1295.                                                        a.getName(), javaIdentifier,
  1296.                                                        javaVariableNames.get( javaIdentifier ).getName() );

  1297.                                         }
  1298.                                         else
  1299.                                         {
  1300.                                             javaVariableNames.put( javaIdentifier, a );
  1301.                                         }
  1302.                                     }
  1303.                                     catch ( final ModelObjectException e )
  1304.                                     {
  1305.                                         final String message = getMessage( e );

  1306.                                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1307.                                         {
  1308.                                             validationContext.getModelContext().log( Level.FINE, message, e );
  1309.                                         }

  1310.                                         addDetail( validationContext.getReport(),
  1311.                                                    "IMPLEMENTATION_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_CONSTRAINT",
  1312.                                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1313.                                                    "implementationMessageArgumentJavaVariableNameConstraint",
  1314.                                                    impl.getIdentifier(), moduleOfImpl.getName(), m.getName(),
  1315.                                                    a.getIndex(),
  1316.                                                    message != null && message.length() > 0 ? " " + message : "" );

  1317.                                     }
  1318.                                 }
  1319.                             }
  1320.                         }
  1321.                     }

  1322.                     for ( int j = 0, s1 = impl.getMessages().getReference().size(); j < s1; j++ )
  1323.                     {
  1324.                         final MessageReference r = impl.getMessages().getReference().get( j );

  1325.                         final Set<InheritanceModel.Node<Message>> effMessages =
  1326.                             imodel.getMessageNodes( impl.getIdentifier(), r.getName() );

  1327.                         for ( final InheritanceModel.Node<Message> effMessage : effMessages )
  1328.                         {
  1329.                             final Set<InheritanceModel.Node<Message>> overriddenMessages =
  1330.                                 modifiableSet( effMessage.getOverriddenNodes() );

  1331.                             if ( r.isOverride() && overriddenMessages.isEmpty() )
  1332.                             {
  1333.                                 addDetail( validationContext.getReport(), "IMPLEMENTATION_MESSAGE_OVERRIDE_CONSTRAINT",
  1334.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1335.                                            "implementationMessageOverrideConstraint", impl.getIdentifier(),
  1336.                                            moduleOfImpl.getName(), r.getName() );

  1337.                             }

  1338.                             if ( !( r.isOverride() || overriddenMessages.isEmpty() ) )
  1339.                             {
  1340.                                 for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  1341.                                 {
  1342.                                     Implementation overriddenImplementation = overriddenMessage.getImplementation();
  1343.                                     if ( overriddenMessage.getClassDeclaration() != null )
  1344.                                     {
  1345.                                         overriddenImplementation = overriddenMessage.getClassDeclaration();
  1346.                                     }

  1347.                                     final Module moduleOfMessage =
  1348.                                         validationContext.getModuleOfImplementation(
  1349.                                             overriddenImplementation.getIdentifier() );

  1350.                                     addDetail( validationContext.getReport(), "IMPLEMENTATION_MESSAGE_OVERRIDE_WARNING",
  1351.                                                Level.WARNING, new ObjectFactory().createImplementation( impl ),
  1352.                                                "implementationMessageOverrideWarning", impl.getIdentifier(),
  1353.                                                moduleOfImpl.getName(), r.getName(),
  1354.                                                overriddenImplementation.getIdentifier(),
  1355.                                                moduleOfMessage.getName(), getNodePathString( overriddenMessage ) );

  1356.                                 }
  1357.                             }

  1358.                             retainFinalNodes( overriddenMessages );

  1359.                             for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  1360.                             {
  1361.                                 Implementation overriddenImplementation = overriddenMessage.getImplementation();
  1362.                                 if ( overriddenMessage.getClassDeclaration() != null )
  1363.                                 {
  1364.                                     overriddenImplementation = overriddenMessage.getClassDeclaration();
  1365.                                 }

  1366.                                 final Module moduleOfMessage =
  1367.                                     validationContext.getModuleOfImplementation(
  1368.                                         overriddenImplementation.getIdentifier() );

  1369.                                 addDetail( validationContext.getReport(),
  1370.                                            "IMPLEMENTATION_MESSAGE_INHERITANCE_CONSTRAINT",
  1371.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1372.                                            "implementationMessageFinalConstraint", impl.getIdentifier(),
  1373.                                            moduleOfImpl.getName(), r.getName(),
  1374.                                            overriddenImplementation.getIdentifier(),
  1375.                                            moduleOfMessage.getName(), getNodePathString( overriddenMessage ) );

  1376.                             }
  1377.                         }
  1378.                     }
  1379.                 }

  1380.                 if ( impl.getProperties() != null )
  1381.                 {
  1382.                     for ( int j = 0, s1 = impl.getProperties().getProperty().size(); j < s1; j++ )
  1383.                     {
  1384.                         final Property p = impl.getProperties().getProperty().get( j );

  1385.                         if ( impl.getProperties().getReference( p.getName() ) != null )
  1386.                         {
  1387.                             addDetail( validationContext.getReport(), "IMPLEMENTATION_PROPERTIES_UNIQUENESS_CONSTRAINT",
  1388.                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1389.                                        "implementationPropertiesUniquenessConstraint", impl.getIdentifier(),
  1390.                                        moduleOfImpl.getName(), p.getName() );

  1391.                         }

  1392.                         if ( p.getValue() != null && p.getAny() != null )
  1393.                         {
  1394.                             addDetail( validationContext.getReport(), "IMPLEMENTATION_PROPERTY_VALUE_CONSTRAINT",
  1395.                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1396.                                        "implementationPropertyValueConstraint", impl.getIdentifier(),
  1397.                                        moduleOfImpl.getName(), p.getName() );

  1398.                         }

  1399.                         if ( p.getAny() != null && p.getType() == null )
  1400.                         {
  1401.                             addDetail( validationContext.getReport(), "IMPLEMENTATION_PROPERTY_TYPE_CONSTRAINT",
  1402.                                        Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1403.                                        "implementationPropertyTypeConstraint", impl.getIdentifier(),
  1404.                                        moduleOfImpl.getName(), p.getName() );

  1405.                         }

  1406.                         if ( validationContext.isValidateJava() )
  1407.                         {
  1408.                             try
  1409.                             {
  1410.                                 p.getJavaConstantName();
  1411.                             }
  1412.                             catch ( final ModelObjectException e )
  1413.                             {
  1414.                                 final String message = getMessage( e );

  1415.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1416.                                 {
  1417.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1418.                                 }

  1419.                                 addDetail( validationContext.getReport(),
  1420.                                            "IMPLEMENTATION_PROPERTY_JAVA_CONSTANT_NAME_CONSTRAINT",
  1421.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1422.                                            "implementationPropertyJavaConstantNameConstraint", impl.getIdentifier(),
  1423.                                            moduleOfImpl.getName(), p.getName(),
  1424.                                            message != null && message.length() > 0 ? " " + message : "" );

  1425.                             }

  1426.                             try
  1427.                             {
  1428.                                 p.getJavaGetterMethodName();
  1429.                             }
  1430.                             catch ( final ModelObjectException e )
  1431.                             {
  1432.                                 final String message = getMessage( e );

  1433.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1434.                                 {
  1435.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1436.                                 }

  1437.                                 addDetail( validationContext.getReport(),
  1438.                                            "IMPLEMENTATION_PROPERTY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  1439.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1440.                                            "implementationPropertyJavaGetterMethodNameConstraint", impl.getIdentifier(),
  1441.                                            moduleOfImpl.getName(), p.getName(),
  1442.                                            message != null && message.length() > 0 ? " " + message : "" );

  1443.                             }

  1444.                             try
  1445.                             {
  1446.                                 p.getJavaSetterMethodName();
  1447.                             }
  1448.                             catch ( final ModelObjectException e )
  1449.                             {
  1450.                                 final String message = getMessage( e );

  1451.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1452.                                 {
  1453.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1454.                                 }

  1455.                                 addDetail( validationContext.getReport(),
  1456.                                            "IMPLEMENTATION_PROPERTY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  1457.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1458.                                            "implementationPropertyJavaSetterMethodNameConstraint", impl.getIdentifier(),
  1459.                                            moduleOfImpl.getName(), p.getName(),
  1460.                                            message != null && message.length() > 0 ? " " + message : "" );

  1461.                             }

  1462.                             try
  1463.                             {
  1464.                                 p.getJavaTypeName();
  1465.                             }
  1466.                             catch ( final ModelObjectException e )
  1467.                             {
  1468.                                 final String message = getMessage( e );

  1469.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1470.                                 {
  1471.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1472.                                 }

  1473.                                 addDetail( validationContext.getReport(),
  1474.                                            "IMPLEMENTATION_PROPERTY_JAVA_TYPE_NAME_CONSTRAINT",
  1475.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1476.                                            "implementationPropertyJavaTypeNameConstraint", impl.getIdentifier(),
  1477.                                            moduleOfImpl.getName(), p.getName(),
  1478.                                            message != null && message.length() > 0 ? " " + message : "" );

  1479.                             }

  1480.                             try
  1481.                             {
  1482.                                 p.getJavaVariableName();
  1483.                             }
  1484.                             catch ( final ModelObjectException e )
  1485.                             {
  1486.                                 final String message = getMessage( e );

  1487.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1488.                                 {
  1489.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1490.                                 }

  1491.                                 addDetail( validationContext.getReport(),
  1492.                                            "IMPLEMENTATION_PROPERTY_JAVA_VARIABLE_NAME_CONSTRAINT",
  1493.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1494.                                            "implementationPropertyJavaVariableNameConstraint", impl.getIdentifier(),
  1495.                                            moduleOfImpl.getName(), p.getName(),
  1496.                                            message != null && message.length() > 0 ? " " + message : "" );

  1497.                             }

  1498.                             try
  1499.                             {
  1500.                                 p.getJavaValue( validationContext.getModelContext().getClassLoader() );
  1501.                             }
  1502.                             catch ( final ModelObjectException e )
  1503.                             {
  1504.                                 final String message = getMessage( e );

  1505.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  1506.                                 {
  1507.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  1508.                                 }

  1509.                                 addDetail( validationContext.getReport(),
  1510.                                            "IMPLEMENTATION_PROPERTY_JAVA_VALUE_CONSTRAINT",
  1511.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1512.                                            "implementationPropertyJavaValueConstraint", impl.getIdentifier(),
  1513.                                            moduleOfImpl.getName(), p.getName(),
  1514.                                            message != null && message.length() > 0 ? " " + message : "" );

  1515.                             }
  1516.                         }

  1517.                         final Set<InheritanceModel.Node<Property>> effProperties =
  1518.                             imodel.getPropertyNodes( impl.getIdentifier(), p.getName() );

  1519.                         for ( final InheritanceModel.Node<Property> effProperty : effProperties )
  1520.                         {
  1521.                             final Set<InheritanceModel.Node<Property>> overriddenProperties =
  1522.                                 modifiableSet( effProperty.getOverriddenNodes() );

  1523.                             if ( p.isOverride() && overriddenProperties.isEmpty() )
  1524.                             {
  1525.                                 addDetail( validationContext.getReport(), "IMPLEMENTATION_PROPERTY_OVERRIDE_CONSTRAINT",
  1526.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1527.                                            "implementationPropertyOverrideConstraint", impl.getIdentifier(),
  1528.                                            moduleOfImpl.getName(), p.getName() );

  1529.                             }

  1530.                             if ( !( p.isOverride() || overriddenProperties.isEmpty() ) )
  1531.                             {
  1532.                                 for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  1533.                                 {
  1534.                                     if ( overriddenProperty.getSpecification() != null )
  1535.                                     {
  1536.                                         final Module moduleOfProperty =
  1537.                                             validationContext.getModuleOfSpecification(
  1538.                                                 overriddenProperty.getSpecification().getIdentifier() );

  1539.                                         addDetail( validationContext.getReport(),
  1540.                                                    "IMPLEMENTATION_PROPERTY_OVERRIDE_WARNING", Level.WARNING,
  1541.                                                    new ObjectFactory().createImplementation( impl ),
  1542.                                                    "implementationSpecificationPropertyOverrideWarning",
  1543.                                                    impl.getIdentifier(), moduleOfImpl.getName(), p.getName(),
  1544.                                                    overriddenProperty.getSpecification().getIdentifier(),
  1545.                                                    moduleOfProperty.getName(),
  1546.                                                    getNodePathString( overriddenProperty ) );

  1547.                                     }
  1548.                                     else
  1549.                                     {
  1550.                                         Implementation overriddenImplementation =
  1551.                                             overriddenProperty.getImplementation();

  1552.                                         if ( overriddenProperty.getClassDeclaration() != null )
  1553.                                         {
  1554.                                             overriddenImplementation = overriddenProperty.getClassDeclaration();
  1555.                                         }

  1556.                                         final Module moduleOfProperty =
  1557.                                             validationContext.getModuleOfImplementation(
  1558.                                                 overriddenImplementation.getIdentifier() );

  1559.                                         addDetail( validationContext.getReport(),
  1560.                                                    "IMPLEMENTATION_PROPERTY_OVERRIDE_WARNING", Level.WARNING,
  1561.                                                    new ObjectFactory().createImplementation( impl ),
  1562.                                                    "implementationPropertyOverrideWarning", impl.getIdentifier(),
  1563.                                                    moduleOfImpl.getName(), p.getName(),
  1564.                                                    overriddenImplementation.getIdentifier(),
  1565.                                                    moduleOfProperty.getName(),
  1566.                                                    getNodePathString( overriddenProperty ) );

  1567.                                     }
  1568.                                 }
  1569.                             }

  1570.                             retainFinalNodes( overriddenProperties );

  1571.                             for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  1572.                             {
  1573.                                 Implementation overriddenImplementation = overriddenProperty.getImplementation();
  1574.                                 if ( overriddenProperty.getClassDeclaration() != null )
  1575.                                 {
  1576.                                     overriddenImplementation = overriddenProperty.getClassDeclaration();
  1577.                                 }

  1578.                                 final Module moduleOfProperty =
  1579.                                     validationContext.getModuleOfImplementation(
  1580.                                         overriddenImplementation.getIdentifier() );

  1581.                                 addDetail( validationContext.getReport(),
  1582.                                            "IMPLEMENTATION_PROPERTY_INHERITANCE_CONSTRAINT",
  1583.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1584.                                            "implementationPropertyFinalConstraint", impl.getIdentifier(),
  1585.                                            moduleOfImpl.getName(), p.getName(),
  1586.                                            overriddenImplementation.getIdentifier(),
  1587.                                            moduleOfProperty.getName(), getNodePathString( overriddenProperty ) );

  1588.                             }
  1589.                         }
  1590.                     }

  1591.                     for ( int j = 0, s1 = impl.getProperties().getReference().size(); j < s1; j++ )
  1592.                     {
  1593.                         final PropertyReference r = impl.getProperties().getReference().get( j );

  1594.                         final Set<InheritanceModel.Node<Property>> effProperties =
  1595.                             imodel.getPropertyNodes( impl.getIdentifier(), r.getName() );

  1596.                         for ( final InheritanceModel.Node<Property> effProperty : effProperties )
  1597.                         {
  1598.                             final Set<InheritanceModel.Node<Property>> overriddenProperties =
  1599.                                 modifiableSet( effProperty.getOverriddenNodes() );

  1600.                             if ( r.isOverride() && overriddenProperties.isEmpty() )
  1601.                             {
  1602.                                 addDetail( validationContext.getReport(), "IMPLEMENTATION_PROPERTY_OVERRIDE_CONSTRAINT",
  1603.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1604.                                            "implementationPropertyOverrideConstraint", impl.getIdentifier(),
  1605.                                            moduleOfImpl.getName(), r.getName() );

  1606.                             }

  1607.                             if ( !( r.isOverride() || overriddenProperties.isEmpty() ) )
  1608.                             {
  1609.                                 for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  1610.                                 {
  1611.                                     Implementation overriddenImplementation = overriddenProperty.getImplementation();
  1612.                                     if ( overriddenProperty.getClassDeclaration() != null )
  1613.                                     {
  1614.                                         overriddenImplementation = overriddenProperty.getClassDeclaration();
  1615.                                     }

  1616.                                     final Module moduleOfProperty =
  1617.                                         validationContext.getModuleOfImplementation(
  1618.                                             overriddenImplementation.getIdentifier() );

  1619.                                     addDetail( validationContext.getReport(),
  1620.                                                "IMPLEMENTATION_PROPERTY_OVERRIDE_WARNING", Level.WARNING,
  1621.                                                new ObjectFactory().createImplementation( impl ),
  1622.                                                "implementationPropertyOverrideWarning", impl.getIdentifier(),
  1623.                                                moduleOfImpl.getName(), r.getName(),
  1624.                                                overriddenImplementation.getIdentifier(),
  1625.                                                moduleOfProperty.getName(), getNodePathString( overriddenProperty ) );

  1626.                                 }
  1627.                             }

  1628.                             retainFinalNodes( overriddenProperties );

  1629.                             for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  1630.                             {
  1631.                                 Implementation overriddenImplementation = overriddenProperty.getImplementation();
  1632.                                 if ( overriddenProperty.getClassDeclaration() != null )
  1633.                                 {
  1634.                                     overriddenImplementation = overriddenProperty.getClassDeclaration();
  1635.                                 }

  1636.                                 final Module moduleOfProperty =
  1637.                                     validationContext.getModuleOfImplementation(
  1638.                                         overriddenImplementation.getIdentifier() );

  1639.                                 addDetail( validationContext.getReport(),
  1640.                                            "IMPLEMENTATION_PROPERTY_INHERITANCE_CONSTRAINT",
  1641.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1642.                                            "implementationPropertyFinalConstraint", impl.getIdentifier(),
  1643.                                            moduleOfImpl.getName(), r.getName(),
  1644.                                            overriddenImplementation.getIdentifier(),
  1645.                                            moduleOfProperty.getName(), getNodePathString( overriddenProperty ) );

  1646.                             }
  1647.                         }
  1648.                     }
  1649.                 }

  1650.                 if ( impl.getSpecifications() != null )
  1651.                 {
  1652.                     for ( int j = 0, s1 = impl.getSpecifications().getSpecification().size(); j < s1; j++ )
  1653.                     {
  1654.                         final Specification s = impl.getSpecifications().getSpecification().get( j );

  1655.                         addDetail( validationContext.getReport(), "IMPLEMENTATION_SPECIFICATION_DECLARATION_CONSTRAINT",
  1656.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1657.                                    "implementationSpecificationDeclarationConstraint", impl.getIdentifier(),
  1658.                                    moduleOfImpl.getName(), s.getIdentifier() );

  1659.                     }

  1660.                     for ( int j = 0, s1 = impl.getSpecifications().getReference().size(); j < s1; j++ )
  1661.                     {
  1662.                         final SpecificationReference r = impl.getSpecifications().getReference().get( j );

  1663.                         final Set<InheritanceModel.Node<SpecificationReference>> effReferences =
  1664.                             imodel.getSpecificationReferenceNodes( impl.getIdentifier(), r.getIdentifier() );

  1665.                         for ( final InheritanceModel.Node<SpecificationReference> effReference : effReferences )
  1666.                         {
  1667.                             final Set<InheritanceModel.Node<SpecificationReference>> overriddenReferences =
  1668.                                 modifiableSet( effReference.getOverriddenNodes() );

  1669.                             if ( r.isOverride() && overriddenReferences.isEmpty() )
  1670.                             {
  1671.                                 addDetail( validationContext.getReport(),
  1672.                                            "IMPLEMENTATION_SPECIFICATION_OVERRIDE_CONSTRAINT", Level.SEVERE,
  1673.                                            new ObjectFactory().createImplementation( impl ),
  1674.                                            "implementationSpecificationOverrideConstraint", impl.getIdentifier(),
  1675.                                            moduleOfImpl.getName(), r.getIdentifier() );

  1676.                             }

  1677.                             if ( !( r.isOverride() || overriddenReferences.isEmpty() ) )
  1678.                             {
  1679.                                 for ( final InheritanceModel.Node<SpecificationReference> overriddenReference
  1680.                                           : overriddenReferences )
  1681.                                 {
  1682.                                     Implementation overriddenImplementation = overriddenReference.getImplementation();
  1683.                                     if ( overriddenReference.getClassDeclaration() != null )
  1684.                                     {
  1685.                                         overriddenImplementation = overriddenReference.getClassDeclaration();
  1686.                                     }

  1687.                                     final Module moduleOfReference =
  1688.                                         validationContext.getModuleOfImplementation(
  1689.                                             overriddenImplementation.getIdentifier() );

  1690.                                     addDetail( validationContext.getReport(),
  1691.                                                "IMPLEMENTATION_SPECIFICATION_REFERENCE_OVERRIDE_WARNING",
  1692.                                                Level.WARNING, new ObjectFactory().createImplementation( impl ),
  1693.                                                "implementationSpecificationOverrideWarning", impl.getIdentifier(),
  1694.                                                moduleOfImpl.getName(), r.getIdentifier(),
  1695.                                                overriddenImplementation.getIdentifier(),
  1696.                                                moduleOfReference.getName(), getNodePathString( overriddenReference ) );

  1697.                                 }
  1698.                             }

  1699.                             retainFinalNodes( overriddenReferences );

  1700.                             for ( final InheritanceModel.Node<SpecificationReference> overriddenReference
  1701.                                       : overriddenReferences )
  1702.                             {
  1703.                                 Implementation overriddenImplementation = overriddenReference.getImplementation();
  1704.                                 if ( overriddenReference.getClassDeclaration() != null )
  1705.                                 {
  1706.                                     overriddenImplementation = overriddenReference.getClassDeclaration();
  1707.                                 }

  1708.                                 final Module moduleOfReference =
  1709.                                     validationContext.getModuleOfImplementation(
  1710.                                         overriddenImplementation.getIdentifier() );

  1711.                                 addDetail( validationContext.getReport(),
  1712.                                            "IMPLEMENTATION_SPECIFICATION_INHERITANCE_CONSTRAINT", Level.SEVERE,
  1713.                                            new ObjectFactory().createImplementation( impl ),
  1714.                                            "implementationSpecificationFinalConstraint", impl.getIdentifier(),
  1715.                                            moduleOfImpl.getName(), r.getIdentifier(),
  1716.                                            overriddenImplementation.getIdentifier(),
  1717.                                            moduleOfReference.getName(), getNodePathString( overriddenReference ) );

  1718.                             }
  1719.                         }
  1720.                     }
  1721.                 }

  1722.                 if ( !impl.getAny().isEmpty() )
  1723.                 {
  1724.                     for ( int j = 0, s1 = impl.getAny().size(); j < s1; j++ )
  1725.                     {
  1726.                         final Object any = impl.getAny().get( j );

  1727.                         if ( any instanceof JAXBElement<?> )
  1728.                         {
  1729.                             final JAXBElement<?> jaxbElement = (JAXBElement<?>) any;
  1730.                             boolean overrideNode = false;

  1731.                             if ( jaxbElement.getValue() instanceof Inheritable )
  1732.                             {
  1733.                                 overrideNode = ( (Inheritable) jaxbElement.getValue() ).isOverride();
  1734.                             }

  1735.                             final Set<InheritanceModel.Node<JAXBElement<?>>> effElements =
  1736.                                 imodel.getJaxbElementNodes( impl.getIdentifier(), jaxbElement.getName() );

  1737.                             for ( final InheritanceModel.Node<JAXBElement<?>> effElement : effElements )
  1738.                             {
  1739.                                 final Set<InheritanceModel.Node<JAXBElement<?>>> overriddenElements =
  1740.                                     modifiableSet( effElement.getOverriddenNodes() );

  1741.                                 if ( overrideNode && overriddenElements.isEmpty() )
  1742.                                 {
  1743.                                     addDetail( validationContext.getReport(),
  1744.                                                "IMPLEMENTATION_JAXB_ELEMENT_OVERRIDE_CONSTRAINT",
  1745.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1746.                                                "implementationJaxbElementOverrideConstraint", impl.getIdentifier(),
  1747.                                                moduleOfImpl.getName(), jaxbElement.getName().toString() );

  1748.                                 }

  1749.                                 if ( !( overrideNode || overriddenElements.isEmpty() ) )
  1750.                                 {
  1751.                                     for ( final InheritanceModel.Node<JAXBElement<?>> overriddenElement
  1752.                                               : overriddenElements )
  1753.                                     {
  1754.                                         Implementation overriddenImplementation = overriddenElement.getImplementation();
  1755.                                         if ( overriddenElement.getClassDeclaration() != null )
  1756.                                         {
  1757.                                             overriddenImplementation = overriddenElement.getClassDeclaration();
  1758.                                         }

  1759.                                         final Module moduleOfElement =
  1760.                                             validationContext.getModuleOfImplementation(
  1761.                                                 overriddenElement.getImplementation().getIdentifier() );

  1762.                                         addDetail( validationContext.getReport(),
  1763.                                                    "IMPLEMENTATION_JAXB_ELEMENT_OVERRIDE_WARNING",
  1764.                                                    Level.WARNING, new ObjectFactory().createImplementation( impl ),
  1765.                                                    "implementationJaxbElementOverrideWarning", impl.getIdentifier(),
  1766.                                                    moduleOfImpl.getName(), jaxbElement.getName().toString(),
  1767.                                                    overriddenImplementation.getIdentifier(),
  1768.                                                    moduleOfElement.getName(), getNodePathString( overriddenElement ) );

  1769.                                     }
  1770.                                 }

  1771.                                 retainFinalNodes( overriddenElements );

  1772.                                 for ( final InheritanceModel.Node<JAXBElement<?>> overriddenElement : overriddenElements )
  1773.                                 {
  1774.                                     Implementation overriddenImplementation = overriddenElement.getImplementation();
  1775.                                     if ( overriddenElement.getClassDeclaration() != null )
  1776.                                     {
  1777.                                         overriddenImplementation = overriddenElement.getClassDeclaration();
  1778.                                     }

  1779.                                     final Module moduleOfElement =
  1780.                                         validationContext.getModuleOfImplementation(
  1781.                                             overriddenImplementation.getIdentifier() );

  1782.                                     addDetail( validationContext.getReport(),
  1783.                                                "IMPLEMENTATION_JAXB_ELEMENT_INHERITANCE_CONSTRAINT",
  1784.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1785.                                                "implementationJaxbElementFinalConstraint", impl.getIdentifier(),
  1786.                                                moduleOfImpl.getName(), jaxbElement.getName().toString(),
  1787.                                                overriddenImplementation.getIdentifier(),
  1788.                                                moduleOfElement.getName(), getNodePathString( overriddenElement ) );

  1789.                                 }
  1790.                             }
  1791.                         }
  1792.                     }
  1793.                 }

  1794.                 final Set<String> dependencyNames = imodel.getDependencyNames( impl.getIdentifier() );

  1795.                 final Map<JavaIdentifier, InheritanceModel.Node<Dependency>> dependencyJavaConstantNames =
  1796.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Dependency>>( dependencyNames.size() );

  1797.                 final Map<JavaIdentifier, InheritanceModel.Node<Dependency>> dependencyJavaGetterMethodNames =
  1798.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Dependency>>( dependencyNames.size() );

  1799.                 final Map<JavaIdentifier, InheritanceModel.Node<Dependency>> dependencyJavaSetterMethodNames =
  1800.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Dependency>>( dependencyNames.size() );

  1801.                 final Map<JavaIdentifier, InheritanceModel.Node<Dependency>> dependencyJavaVariableNames =
  1802.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Dependency>>( dependencyNames.size() );

  1803.                 for ( final String dependencyName : dependencyNames )
  1804.                 {
  1805.                     final Set<InheritanceModel.Node<Dependency>> dependencyNodes =
  1806.                         imodel.getDependencyNodes( impl.getIdentifier(), dependencyName );

  1807.                     if ( dependencyNodes.size() > 1 )
  1808.                     {
  1809.                         addDetail( validationContext.getReport(),
  1810.                                    "IMPLEMENTATION_DEPENDENCY_MULTIPLE_INHERITANCE_CONSTRAINT",
  1811.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1812.                                    "implementationMultipleInheritanceDependencyConstraint", impl.getIdentifier(),
  1813.                                    moduleOfImpl.getName(), dependencyName, getNodeListPathString( dependencyNodes ) );

  1814.                     }

  1815.                     if ( validationContext.isValidateJava() )
  1816.                     {
  1817.                         for ( final InheritanceModel.Node<Dependency> node : dependencyNodes )
  1818.                         {
  1819.                             try
  1820.                             {
  1821.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaConstantName();
  1822.                                 final InheritanceModel.Node<Dependency> existingNode =
  1823.                                     dependencyJavaConstantNames.get( javaIdentifier );

  1824.                                 if ( existingNode != null )
  1825.                                 {
  1826.                                     addDetail( validationContext.getReport(),
  1827.                                                "IMPLEMENTATION_DEPENDENCY_JAVA_CONSTANT_NAME_UNIQUENESS_CONSTRAINT",
  1828.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1829.                                                "implementationDependencyJavaConstantNameUniquenessConstraint",
  1830.                                                impl.getIdentifier(), moduleOfImpl.getName(), dependencyName,
  1831.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1832.                                                getNodePathString( existingNode ), javaIdentifier );

  1833.                                 }
  1834.                                 else
  1835.                                 {
  1836.                                     dependencyJavaConstantNames.put( javaIdentifier, node );
  1837.                                 }
  1838.                             }
  1839.                             catch ( final ModelObjectException e )
  1840.                             {
  1841.                                 // Validated above.
  1842.                             }

  1843.                             try
  1844.                             {
  1845.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaGetterMethodName();
  1846.                                 final InheritanceModel.Node<Dependency> existingNode =
  1847.                                     dependencyJavaGetterMethodNames.get( javaIdentifier );

  1848.                                 if ( existingNode != null )
  1849.                                 {
  1850.                                     addDetail( validationContext.getReport(),
  1851.                                                "IMPLEMENTATION_DEPENDENCY_JAVA_GETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  1852.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1853.                                                "implementationDependencyJavaGetterMethodNameUniquenessConstraint",
  1854.                                                impl.getIdentifier(), moduleOfImpl.getName(), dependencyName,
  1855.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1856.                                                getNodePathString( existingNode ), javaIdentifier );

  1857.                                 }
  1858.                                 else
  1859.                                 {
  1860.                                     dependencyJavaGetterMethodNames.put( javaIdentifier, node );
  1861.                                 }
  1862.                             }
  1863.                             catch ( final ModelObjectException e )
  1864.                             {
  1865.                                 // Validated above.
  1866.                             }

  1867.                             try
  1868.                             {
  1869.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  1870.                                 final InheritanceModel.Node<Dependency> existingNode =
  1871.                                     dependencyJavaSetterMethodNames.get( javaIdentifier );

  1872.                                 if ( existingNode != null )
  1873.                                 {
  1874.                                     addDetail( validationContext.getReport(),
  1875.                                                "IMPLEMENTATION_DEPENDENCY_JAVA_SETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  1876.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1877.                                                "implementationDependencyJavaSetterMethodNameUniquenessConstraint",
  1878.                                                impl.getIdentifier(), moduleOfImpl.getName(), dependencyName,
  1879.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1880.                                                getNodePathString( existingNode ), javaIdentifier );

  1881.                                 }
  1882.                                 else
  1883.                                 {
  1884.                                     dependencyJavaSetterMethodNames.put( javaIdentifier, node );
  1885.                                 }
  1886.                             }
  1887.                             catch ( final ModelObjectException e )
  1888.                             {
  1889.                                 // Validated above.
  1890.                             }

  1891.                             try
  1892.                             {
  1893.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  1894.                                 final InheritanceModel.Node<Dependency> existingNode =
  1895.                                     dependencyJavaVariableNames.get( javaIdentifier );

  1896.                                 if ( existingNode != null )
  1897.                                 {
  1898.                                     addDetail( validationContext.getReport(),
  1899.                                                "IMPLEMENTATION_DEPENDENCY_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  1900.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1901.                                                "implementationDependencyJavaVariableNameUniquenessConstraint",
  1902.                                                impl.getIdentifier(), moduleOfImpl.getName(), dependencyName,
  1903.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1904.                                                getNodePathString( existingNode ), javaIdentifier );

  1905.                                 }
  1906.                                 else
  1907.                                 {
  1908.                                     dependencyJavaVariableNames.put( javaIdentifier, node );
  1909.                                 }
  1910.                             }
  1911.                             catch ( final ModelObjectException e )
  1912.                             {
  1913.                                 // Validated above.
  1914.                             }
  1915.                         }
  1916.                     }
  1917.                 }

  1918.                 final Set<String> messageNames = imodel.getMessageNames( impl.getIdentifier() );

  1919.                 final Map<JavaIdentifier, InheritanceModel.Node<Message>> messageJavaConstantNames =
  1920.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Message>>( messageNames.size() );

  1921.                 final Map<JavaIdentifier, InheritanceModel.Node<Message>> messageJavaGetterMethodNames =
  1922.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Message>>( messageNames.size() );

  1923.                 final Map<JavaIdentifier, InheritanceModel.Node<Message>> messageJavaSetterMethodNames =
  1924.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Message>>( messageNames.size() );

  1925.                 final Map<JavaIdentifier, InheritanceModel.Node<Message>> messageJavaVariableNames =
  1926.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Message>>( messageNames.size() );

  1927.                 for ( final String messageName : messageNames )
  1928.                 {
  1929.                     final Set<InheritanceModel.Node<Message>> messageNodes =
  1930.                         imodel.getMessageNodes( impl.getIdentifier(), messageName );

  1931.                     if ( messageNodes.size() > 1 )
  1932.                     {
  1933.                         addDetail( validationContext.getReport(),
  1934.                                    "IMPLEMENTATION_MESSAGE_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE,
  1935.                                    new ObjectFactory().createImplementation( impl ),
  1936.                                    "implementationMultipleInheritanceMessageConstraint", impl.getIdentifier(),
  1937.                                    moduleOfImpl.getName(), messageName, getNodeListPathString( messageNodes ) );

  1938.                     }

  1939.                     if ( validationContext.isValidateJava() )
  1940.                     {
  1941.                         for ( final InheritanceModel.Node<Message> node : messageNodes )
  1942.                         {
  1943.                             try
  1944.                             {
  1945.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaConstantName();
  1946.                                 final InheritanceModel.Node<Message> existingNode =
  1947.                                     messageJavaConstantNames.get( javaIdentifier );

  1948.                                 if ( existingNode != null )
  1949.                                 {
  1950.                                     addDetail( validationContext.getReport(),
  1951.                                                "IMPLEMENTATION_MESSAGE_JAVA_CONSTANT_NAME_UNIQUENESS_CONSTRAINT",
  1952.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1953.                                                "implementationMessageJavaConstantNameUniquenessConstraint",
  1954.                                                impl.getIdentifier(), moduleOfImpl.getName(), messageName,
  1955.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1956.                                                getNodePathString( existingNode ), javaIdentifier );

  1957.                                 }
  1958.                                 else
  1959.                                 {
  1960.                                     messageJavaConstantNames.put( javaIdentifier, node );
  1961.                                 }
  1962.                             }
  1963.                             catch ( final ModelObjectException e )
  1964.                             {
  1965.                                 // Validated above.
  1966.                             }

  1967.                             try
  1968.                             {
  1969.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaGetterMethodName();
  1970.                                 final InheritanceModel.Node<Message> existingNode =
  1971.                                     messageJavaGetterMethodNames.get( javaIdentifier );

  1972.                                 if ( existingNode != null )
  1973.                                 {
  1974.                                     addDetail( validationContext.getReport(),
  1975.                                                "IMPLEMENTATION_MESSAGE_JAVA_GETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  1976.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  1977.                                                "implementationMessageJavaGetterMethodNameUniquenessConstraint",
  1978.                                                impl.getIdentifier(), moduleOfImpl.getName(), messageName,
  1979.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  1980.                                                getNodePathString( existingNode ), javaIdentifier );

  1981.                                 }
  1982.                                 else
  1983.                                 {
  1984.                                     messageJavaGetterMethodNames.put( javaIdentifier, node );
  1985.                                 }
  1986.                             }
  1987.                             catch ( final ModelObjectException e )
  1988.                             {
  1989.                                 // Validated above.
  1990.                             }

  1991.                             try
  1992.                             {
  1993.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  1994.                                 final InheritanceModel.Node<Message> existingNode =
  1995.                                     messageJavaSetterMethodNames.get( javaIdentifier );

  1996.                                 if ( existingNode != null )
  1997.                                 {
  1998.                                     addDetail( validationContext.getReport(),
  1999.                                                "IMPLEMENTATION_MESSAGE_JAVA_SETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  2000.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2001.                                                "implementationMessageJavaSetterMethodNameUniquenessConstraint",
  2002.                                                impl.getIdentifier(), moduleOfImpl.getName(), messageName,
  2003.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2004.                                                getNodePathString( existingNode ), javaIdentifier );

  2005.                                 }
  2006.                                 else
  2007.                                 {
  2008.                                     messageJavaSetterMethodNames.put( javaIdentifier, node );
  2009.                                 }
  2010.                             }
  2011.                             catch ( final ModelObjectException e )
  2012.                             {
  2013.                                 // Validated above.
  2014.                             }

  2015.                             try
  2016.                             {
  2017.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  2018.                                 final InheritanceModel.Node<Message> existingNode =
  2019.                                     messageJavaVariableNames.get( javaIdentifier );

  2020.                                 if ( existingNode != null )
  2021.                                 {
  2022.                                     addDetail( validationContext.getReport(),
  2023.                                                "IMPLEMENTATION_MESSAGE_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  2024.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2025.                                                "implementationMessageJavaVariableNameUniquenessConstraint",
  2026.                                                impl.getIdentifier(), moduleOfImpl.getName(), messageName,
  2027.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2028.                                                getNodePathString( existingNode ), javaIdentifier );

  2029.                                 }
  2030.                                 else
  2031.                                 {
  2032.                                     messageJavaVariableNames.put( javaIdentifier, node );
  2033.                                 }
  2034.                             }
  2035.                             catch ( final ModelObjectException e )
  2036.                             {
  2037.                                 // Validated above.
  2038.                             }
  2039.                         }
  2040.                     }
  2041.                 }

  2042.                 final Set<String> propertyNames = imodel.getPropertyNames( impl.getIdentifier() );

  2043.                 final Map<JavaIdentifier, InheritanceModel.Node<Property>> propertyJavaConstantNames =
  2044.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Property>>( messageNames.size() );

  2045.                 final Map<JavaIdentifier, InheritanceModel.Node<Property>> propertyJavaGetterMethodNames =
  2046.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Property>>( messageNames.size() );

  2047.                 final Map<JavaIdentifier, InheritanceModel.Node<Property>> propertyJavaSetterMethodNames =
  2048.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Property>>( messageNames.size() );

  2049.                 final Map<JavaIdentifier, InheritanceModel.Node<Property>> propertyJavaVariableNames =
  2050.                     new HashMap<JavaIdentifier, InheritanceModel.Node<Property>>( messageNames.size() );

  2051.                 for ( final String propertyName : propertyNames )
  2052.                 {
  2053.                     final Set<InheritanceModel.Node<Property>> propertyNodes =
  2054.                         imodel.getPropertyNodes( impl.getIdentifier(), propertyName );

  2055.                     if ( propertyNodes.size() > 1 )
  2056.                     {
  2057.                         addDetail( validationContext.getReport(),
  2058.                                    "IMPLEMENTATION_PROPERTY_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE,
  2059.                                    new ObjectFactory().createImplementation( impl ),
  2060.                                    "implementationMultipleInheritancePropertyConstraint", impl.getIdentifier(),
  2061.                                    moduleOfImpl.getName(), propertyName, getNodeListPathString( propertyNodes ) );

  2062.                     }

  2063.                     if ( validationContext.isValidateJava() )
  2064.                     {
  2065.                         for ( final InheritanceModel.Node<Property> node : propertyNodes )
  2066.                         {
  2067.                             try
  2068.                             {
  2069.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaConstantName();
  2070.                                 final InheritanceModel.Node<Property> existingNode =
  2071.                                     propertyJavaConstantNames.get( javaIdentifier );

  2072.                                 if ( existingNode != null )
  2073.                                 {
  2074.                                     addDetail( validationContext.getReport(),
  2075.                                                "IMPLEMENTATION_PROPERTY_JAVA_CONSTANT_NAME_UNIQUENESS_CONSTRAINT",
  2076.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2077.                                                "implementationPropertyJavaConstantNameUniquenessConstraint",
  2078.                                                impl.getIdentifier(), moduleOfImpl.getName(), propertyName,
  2079.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2080.                                                getNodePathString( existingNode ), javaIdentifier );

  2081.                                 }
  2082.                                 else
  2083.                                 {
  2084.                                     propertyJavaConstantNames.put( javaIdentifier, node );
  2085.                                 }
  2086.                             }
  2087.                             catch ( final ModelObjectException e )
  2088.                             {
  2089.                                 // Validated above.
  2090.                             }

  2091.                             try
  2092.                             {
  2093.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaGetterMethodName();
  2094.                                 final InheritanceModel.Node<Property> existingNode =
  2095.                                     propertyJavaGetterMethodNames.get( javaIdentifier );

  2096.                                 if ( existingNode != null )
  2097.                                 {
  2098.                                     addDetail( validationContext.getReport(),
  2099.                                                "IMPLEMENTATION_PROPERTY_JAVA_GETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  2100.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2101.                                                "implementationPropertyJavaGetterMethodNameUniquenessConstraint",
  2102.                                                impl.getIdentifier(), moduleOfImpl.getName(), propertyName,
  2103.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2104.                                                getNodePathString( existingNode ), javaIdentifier );

  2105.                                 }
  2106.                                 else
  2107.                                 {
  2108.                                     propertyJavaGetterMethodNames.put( javaIdentifier, node );
  2109.                                 }
  2110.                             }
  2111.                             catch ( final ModelObjectException e )
  2112.                             {
  2113.                                 // Validated above.
  2114.                             }

  2115.                             try
  2116.                             {
  2117.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  2118.                                 final InheritanceModel.Node<Property> existingNode =
  2119.                                     propertyJavaSetterMethodNames.get( javaIdentifier );

  2120.                                 if ( existingNode != null )
  2121.                                 {
  2122.                                     addDetail( validationContext.getReport(),
  2123.                                                "IMPLEMENTATION_PROPERTY_JAVA_SETTER_METHOD_NAME_UNIQUENESS_CONSTRAINT",
  2124.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2125.                                                "implementationPropertyJavaSetterMethodNameUniquenessConstraint",
  2126.                                                impl.getIdentifier(), moduleOfImpl.getName(), propertyName,
  2127.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2128.                                                getNodePathString( existingNode ), javaIdentifier );

  2129.                                 }
  2130.                                 else
  2131.                                 {
  2132.                                     propertyJavaSetterMethodNames.put( javaIdentifier, node );
  2133.                                 }
  2134.                             }
  2135.                             catch ( final ModelObjectException e )
  2136.                             {
  2137.                                 // Validated above.
  2138.                             }

  2139.                             try
  2140.                             {
  2141.                                 final JavaIdentifier javaIdentifier = node.getModelObject().getJavaSetterMethodName();
  2142.                                 final InheritanceModel.Node<Property> existingNode =
  2143.                                     propertyJavaVariableNames.get( javaIdentifier );

  2144.                                 if ( existingNode != null )
  2145.                                 {
  2146.                                     addDetail( validationContext.getReport(),
  2147.                                                "IMPLEMENTATION_PROPERTY_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  2148.                                                Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2149.                                                "implementationPropertyJavaVariableNameUniquenessConstraint",
  2150.                                                impl.getIdentifier(), moduleOfImpl.getName(), propertyName,
  2151.                                                getNodePathString( node ), existingNode.getModelObject().getName(),
  2152.                                                getNodePathString( existingNode ), javaIdentifier );

  2153.                                 }
  2154.                                 else
  2155.                                 {
  2156.                                     propertyJavaVariableNames.put( javaIdentifier, node );
  2157.                                 }
  2158.                             }
  2159.                             catch ( final ModelObjectException e )
  2160.                             {
  2161.                                 // Validated above.
  2162.                             }
  2163.                         }
  2164.                     }
  2165.                 }

  2166.                 final Set<String> specificationReferenceIdentifiers =
  2167.                     imodel.getSpecificationReferenceIdentifiers( impl.getIdentifier() );

  2168.                 for ( final String specificationRefereneIdentifier : specificationReferenceIdentifiers )
  2169.                 {
  2170.                     final Set<InheritanceModel.Node<SpecificationReference>> specificationReferenceNodes =
  2171.                         imodel.getSpecificationReferenceNodes( impl.getIdentifier(), specificationRefereneIdentifier );

  2172.                     if ( specificationReferenceNodes.size() > 1 )
  2173.                     {
  2174.                         addDetail( validationContext.getReport(),
  2175.                                    "IMPLEMENTATION_SPECIFICATION_MULTIPLE_INHERITANCE_CONSTRAINT",
  2176.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2177.                                    "implementationMultipleInheritanceSpecificationConstraint",
  2178.                                    impl.getIdentifier(), moduleOfImpl.getName(), specificationRefereneIdentifier,
  2179.                                    getNodeListPathString( specificationReferenceNodes ) );

  2180.                     }
  2181.                 }

  2182.                 final Set<QName> xmlElementNames = imodel.getXmlElementNames( impl.getIdentifier() );

  2183.                 for ( final QName xmlElementName : xmlElementNames )
  2184.                 {
  2185.                     final Set<InheritanceModel.Node<Element>> xmlElementNodes =
  2186.                         imodel.getXmlElementNodes( impl.getIdentifier(), xmlElementName );

  2187.                     if ( xmlElementNodes.size() > 1 )
  2188.                     {
  2189.                         addDetail( validationContext.getReport(),
  2190.                                    "IMPLEMENTATION_XML_ELEMENT_MULTIPLE_INHERITANCE_CONSTRAINT",
  2191.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2192.                                    "implementationMultipleInheritanceXmlElementConstraint",
  2193.                                    impl.getIdentifier(), moduleOfImpl.getName(), xmlElementName.toString(),
  2194.                                    getNodeListPathString( xmlElementNodes ) );

  2195.                     }
  2196.                 }

  2197.                 final Set<QName> jaxbElementNames = imodel.getJaxbElementNames( impl.getIdentifier() );

  2198.                 for ( final QName jaxbElementName : jaxbElementNames )
  2199.                 {
  2200.                     final Set<InheritanceModel.Node<JAXBElement<?>>> jaxbElementNodes =
  2201.                         imodel.getJaxbElementNodes( impl.getIdentifier(), jaxbElementName );

  2202.                     if ( jaxbElementNodes.size() > 1 )
  2203.                     {
  2204.                         addDetail( validationContext.getReport(),
  2205.                                    "IMPLEMENTATION_JAXB_ELEMENT_MULTIPLE_INHERITANCE_CONSTRAINT",
  2206.                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2207.                                    "implementationMultipleInheritanceJaxbElementConstraint",
  2208.                                    impl.getIdentifier(), moduleOfImpl.getName(), jaxbElementName.toString(),
  2209.                                    getNodeListPathString( jaxbElementNodes ) );

  2210.                     }
  2211.                 }

  2212.                 final Set<String> implementationReferenceIdentifiers =
  2213.                     imodel.getImplementationReferenceIdentifiers( impl.getIdentifier() );

  2214.                 for ( final String implementationReferenceIdentifier : implementationReferenceIdentifiers )
  2215.                 {
  2216.                     final Set<InheritanceModel.Node<ImplementationReference>> implementationReferenceNodes =
  2217.                         imodel.getImplementationReferenceNodes( impl.getIdentifier(),
  2218.                                                                 implementationReferenceIdentifier );

  2219.                     for ( final InheritanceModel.Node<ImplementationReference> node : implementationReferenceNodes )
  2220.                     {
  2221.                         final ImplementationReference r = node.getModelObject();

  2222.                         final Implementation referenced =
  2223.                             validationContext.getImplementation( r.getIdentifier() );

  2224.                         final Module moduleOfReferenced =
  2225.                             validationContext.getModuleOfImplementation( referenced.getIdentifier() );

  2226.                         if ( r.getVersion() != null && referenced != null )
  2227.                         {
  2228.                             if ( referenced.getVersion() == null )
  2229.                             {
  2230.                                 addDetail( validationContext.getReport(),
  2231.                                            "IMPLEMENTATION_IMPLEMENTATION_VERSIONING_CONSTRAINT", Level.SEVERE,
  2232.                                            new ObjectFactory().createImplementation( impl ),
  2233.                                            "implementationImplementationVersioningConstraint",
  2234.                                            impl.getIdentifier(), moduleOfImpl.getName(), r.getIdentifier(),
  2235.                                            moduleOfReferenced.getName() );

  2236.                             }
  2237.                             else
  2238.                             {
  2239.                                 try
  2240.                                 {
  2241.                                     if ( VersionParser.compare( r.getVersion(), referenced.getVersion() ) > 0 )
  2242.                                     {
  2243.                                         addDetail( validationContext.getReport(),
  2244.                                                    "IMPLEMENTATION_INHERITANCE_COMPATIBILITY_CONSTRAINT",
  2245.                                                    Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2246.                                                    "implementationInheritanceCompatibilityConstraint",
  2247.                                                    impl.getIdentifier(), moduleOfImpl.getName(),
  2248.                                                    referenced.getIdentifier(), moduleOfReferenced.getName(),
  2249.                                                    r.getVersion(), referenced.getVersion() );

  2250.                                     }
  2251.                                 }
  2252.                                 catch ( final ParseException ex )
  2253.                                 {
  2254.                                     final String message = getMessage( ex );

  2255.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2256.                                     {
  2257.                                         validationContext.getModelContext().log( Level.FINE, message, ex );
  2258.                                     }

  2259.                                     addDetail(
  2260.                                         validationContext.getReport(),
  2261.                                         "IMPLEMENTATION_INHERITANCE_COMPATIBILITY_VERSIONING_PARSE_EXCEPTION",
  2262.                                         Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2263.                                         "implementationInheritanceCompatibilityParseException",
  2264.                                         impl.getIdentifier(), moduleOfImpl.getName(), r.getIdentifier(),
  2265.                                         moduleOfReferenced.getName(), r.getVersion(),
  2266.                                         message != null && message.length() > 0 ? " " + message : "" );

  2267.                                 }
  2268.                                 catch ( final TokenMgrError ex )
  2269.                                 {
  2270.                                     final String message = getMessage( ex );

  2271.                                     if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2272.                                     {
  2273.                                         validationContext.getModelContext().log( Level.FINE, message, ex );
  2274.                                     }

  2275.                                     addDetail(
  2276.                                         validationContext.getReport(),
  2277.                                         "IMPLEMENTATION_INHERITANCE_COMPATIBILITY_VERSIONING_TOKEN_MANAGER_ERROR",
  2278.                                         Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2279.                                         "implementationInheritanceCompatiblityVersioningTokenManagerError",
  2280.                                         impl.getIdentifier(), moduleOfImpl.getName(), r.getIdentifier(),
  2281.                                         moduleOfReferenced.getName(), r.getVersion(),
  2282.                                         message != null && message.length() > 0 ? " " + message : "" );

  2283.                                 }
  2284.                             }
  2285.                         }
  2286.                     }
  2287.                 }

  2288.                 assertImplementationSpecificationCompatibility( validationContext, impl );
  2289.             }
  2290.         }
  2291.     }

  2292.     private static void assertSpecificationsValid( final ValidationContext validationContext )
  2293.     {
  2294.         final Specifications specifications = validationContext.getAllSpecifications();
  2295.         final Map<String, Specification> specificationClassDeclarations = new HashMap<String, Specification>();
  2296.         final Map<String, Specification> specificationJavaClassDeclarations =
  2297.             new HashMap<String, Specification>();

  2298.         if ( specifications != null )
  2299.         {
  2300.             for ( int i = 0, s0 = specifications.getSpecification().size(); i < s0; i++ )
  2301.             {
  2302.                 final Specification s = specifications.getSpecification().get( i );
  2303.                 final Implementations impls = validationContext.getImplementations( s.getIdentifier() );
  2304.                 final Module moduleOfS = validationContext.getModuleOfSpecification( s.getIdentifier() );

  2305.                 if ( validationContext.isValidateJava() )
  2306.                 {
  2307.                     try
  2308.                     {
  2309.                         s.getJavaTypeName();
  2310.                     }
  2311.                     catch ( final ModelObjectException e )
  2312.                     {
  2313.                         final String message = getMessage( e );

  2314.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2315.                         {
  2316.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2317.                         }

  2318.                         addDetail( validationContext.getReport(),
  2319.                                    "SPECIFICATION_JAVA_TYPE_NAME_CONSTRAINT",
  2320.                                    Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2321.                                    "specificationJavaTypeNameConstraint", s.getIdentifier(),
  2322.                                    moduleOfS.getName(), s.getClazz(),
  2323.                                    message != null && message.length() > 0 ? " " + message : "" );

  2324.                     }
  2325.                 }

  2326.                 if ( s.isClassDeclaration() )
  2327.                 {
  2328.                     if ( s.getClazz() == null )
  2329.                     {
  2330.                         addDetail( validationContext.getReport(), "SPECIFICATION_CLASS_CONSTRAINT", Level.SEVERE,
  2331.                                    new ObjectFactory().createSpecification( s ), "specificationClassConstraint",
  2332.                                    s.getIdentifier(), moduleOfS.getName() );

  2333.                     }
  2334.                     else
  2335.                     {
  2336.                         final Specification prev = specificationClassDeclarations.get( s.getClazz() );

  2337.                         if ( prev != null && !prev.getIdentifier().equals( s.getIdentifier() ) )
  2338.                         {
  2339.                             final Module moduleOfPrev =
  2340.                                 validationContext.getModuleOfSpecification( prev.getIdentifier() );

  2341.                             addDetail( validationContext.getReport(), "SPECIFICATION_CLASS_DECLARATION_CONSTRAINT",
  2342.                                        Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2343.                                        "specificationClassDeclarationConstraint", s.getIdentifier(),
  2344.                                        moduleOfS.getName(), s.getClazz(), prev.getIdentifier(),
  2345.                                        moduleOfPrev.getName() );

  2346.                         }
  2347.                         else
  2348.                         {
  2349.                             specificationClassDeclarations.put( s.getClazz(), s );
  2350.                         }

  2351.                         if ( validationContext.isValidateJava() )
  2352.                         {
  2353.                             try
  2354.                             {
  2355.                                 final Specification java =
  2356.                                     specificationJavaClassDeclarations.get( s.getJavaTypeName().getClassName() );

  2357.                                 if ( java != null && !java.getIdentifier().equals( s.getIdentifier() ) )
  2358.                                 {
  2359.                                     final Module moduleOfJava =
  2360.                                         validationContext.getModuleOfSpecification( java.getIdentifier() );

  2361.                                     addDetail( validationContext.getReport(),
  2362.                                                "SPECIFICATION_JAVA_CLASS_DECLARATION_CONSTRAINT",
  2363.                                                Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2364.                                                "specificationJavaClassDeclarationConstraint", s.getIdentifier(),
  2365.                                                moduleOfS.getName(), s.getJavaTypeName().getClassName(),
  2366.                                                java.getIdentifier(), moduleOfJava.getName() );

  2367.                                 }
  2368.                                 else
  2369.                                 {
  2370.                                     specificationJavaClassDeclarations.put( s.getJavaTypeName().getClassName(), s );
  2371.                                 }
  2372.                             }
  2373.                             catch ( final ModelObjectException e )
  2374.                             {
  2375.                                 // Already validated above.
  2376.                             }
  2377.                         }
  2378.                     }
  2379.                 }

  2380.                 if ( impls != null )
  2381.                 {
  2382.                     final Map<String, Implementations> map = new HashMap<String, Implementations>();

  2383.                     for ( int j = 0, s1 = impls.getImplementation().size(); j < s1; j++ )
  2384.                     {
  2385.                         final Implementation impl = impls.getImplementation().get( j );
  2386.                         Implementations implementations = map.get( impl.getName() );

  2387.                         if ( implementations == null )
  2388.                         {
  2389.                             implementations = new Implementations();
  2390.                             map.put( impl.getName(), implementations );
  2391.                         }

  2392.                         implementations.getImplementation().add( impl );
  2393.                     }

  2394.                     for ( final Map.Entry<String, Implementations> e : map.entrySet() )
  2395.                     {
  2396.                         if ( e.getValue().getImplementation().size() > 1 )
  2397.                         {
  2398.                             for ( int j = 0, s1 = e.getValue().getImplementation().size(); j < s1; j++ )
  2399.                             {
  2400.                                 final Implementation impl = e.getValue().getImplementation().get( j );
  2401.                                 final Module moduleOfImpl =
  2402.                                     validationContext.getModuleOfImplementation( impl.getIdentifier() );

  2403.                                 addDetail( validationContext.getReport(),
  2404.                                            "SPECIFICATION_IMPLEMENTATION_NAME_UNIQUENESS_CONSTRAINT",
  2405.                                            Level.SEVERE, new ObjectFactory().createImplementation( impl ),
  2406.                                            "specificationImplementationNameConstraint", impl.getIdentifier(),
  2407.                                            moduleOfImpl.getName(), s.getIdentifier(), moduleOfS.getName(),
  2408.                                            impl.getName() );

  2409.                             }
  2410.                         }
  2411.                     }

  2412.                     if ( s.getMultiplicity() == Multiplicity.ONE && impls.getImplementation().size() > 1 )
  2413.                     {
  2414.                         for ( int j = 0, s1 = impls.getImplementation().size(); j < s1; j++ )
  2415.                         {
  2416.                             final Implementation impl = impls.getImplementation().get( j );
  2417.                             final Module moduleOfImpl =
  2418.                                 validationContext.getModuleOfImplementation( impl.getIdentifier() );

  2419.                             addDetail( validationContext.getReport(),
  2420.                                        "SPECIFICATION_IMPLEMENTATION_MULTIPLICITY_CONSTRAINT", Level.SEVERE,
  2421.                                        new ObjectFactory().createImplementation( impl ),
  2422.                                        "specificationMultiplicityConstraint", impl.getIdentifier(),
  2423.                                        moduleOfImpl.getName(), s.getIdentifier(), moduleOfS.getName(),
  2424.                                        s.getMultiplicity() );

  2425.                         }
  2426.                     }
  2427.                 }

  2428.                 if ( s.getProperties() != null )
  2429.                 {
  2430.                     for ( int j = 0, s1 = s.getProperties().getProperty().size(); j < s1; j++ )
  2431.                     {
  2432.                         final Property p = s.getProperties().getProperty().get( j );

  2433.                         if ( p.getValue() != null && p.getAny() != null )
  2434.                         {
  2435.                             addDetail( validationContext.getReport(), "SPECIFICATION_PROPERTY_VALUE_CONSTRAINT",
  2436.                                        Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2437.                                        "specificationPropertyValueConstraint", s.getIdentifier(),
  2438.                                        moduleOfS.getName(), p.getName() );

  2439.                         }

  2440.                         if ( p.getAny() != null && p.getType() == null )
  2441.                         {
  2442.                             addDetail( validationContext.getReport(), "SPECIFICATION_PROPERTY_TYPE_CONSTRAINT",
  2443.                                        Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2444.                                        "specificationPropertyTypeConstraint", s.getIdentifier(),
  2445.                                        moduleOfS.getName(), p.getName() );

  2446.                         }

  2447.                         if ( validationContext.isValidateJava() )
  2448.                         {
  2449.                             try
  2450.                             {
  2451.                                 p.getJavaConstantName();
  2452.                             }
  2453.                             catch ( final ModelObjectException e )
  2454.                             {
  2455.                                 final String message = getMessage( e );

  2456.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2457.                                 {
  2458.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2459.                                 }

  2460.                                 addDetail( validationContext.getReport(),
  2461.                                            "SPECIFICATION_PROPERTY_JAVA_CONSTANT_NAME_CONSTRAINT",
  2462.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2463.                                            "specificationPropertyJavaConstantNameConstraint", s.getIdentifier(),
  2464.                                            moduleOfS.getName(), p.getName(),
  2465.                                            message != null && message.length() > 0 ? " " + message : "" );

  2466.                             }

  2467.                             try
  2468.                             {
  2469.                                 p.getJavaGetterMethodName();
  2470.                             }
  2471.                             catch ( final ModelObjectException e )
  2472.                             {
  2473.                                 final String message = getMessage( e );

  2474.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2475.                                 {
  2476.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2477.                                 }

  2478.                                 addDetail( validationContext.getReport(),
  2479.                                            "SPECIFICATION_PROPERTY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  2480.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2481.                                            "specificationPropertyJavaGetterMethodNameConstraint", s.getIdentifier(),
  2482.                                            moduleOfS.getName(), p.getName(),
  2483.                                            message != null && message.length() > 0 ? " " + message : "" );

  2484.                             }

  2485.                             try
  2486.                             {
  2487.                                 p.getJavaSetterMethodName();
  2488.                             }
  2489.                             catch ( final ModelObjectException e )
  2490.                             {
  2491.                                 final String message = getMessage( e );

  2492.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2493.                                 {
  2494.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2495.                                 }

  2496.                                 addDetail( validationContext.getReport(),
  2497.                                            "SPECIFICATION_PROPERTY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  2498.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2499.                                            "specificationPropertyJavaSetterMethodNameConstraint", s.getIdentifier(),
  2500.                                            moduleOfS.getName(), p.getName(),
  2501.                                            message != null && message.length() > 0 ? " " + message : "" );

  2502.                             }

  2503.                             try
  2504.                             {
  2505.                                 p.getJavaTypeName();
  2506.                             }
  2507.                             catch ( final ModelObjectException e )
  2508.                             {
  2509.                                 final String message = getMessage( e );

  2510.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2511.                                 {
  2512.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2513.                                 }

  2514.                                 addDetail( validationContext.getReport(),
  2515.                                            "SPECIFICATION_PROPERTY_JAVA_TYPE_NAME_CONSTRAINT",
  2516.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2517.                                            "specificationPropertyJavaTypeNameConstraint", s.getIdentifier(),
  2518.                                            moduleOfS.getName(), p.getName(),
  2519.                                            message != null && message.length() > 0 ? " " + message : "" );

  2520.                             }

  2521.                             try
  2522.                             {
  2523.                                 p.getJavaVariableName();
  2524.                             }
  2525.                             catch ( final ModelObjectException e )
  2526.                             {
  2527.                                 final String message = getMessage( e );

  2528.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2529.                                 {
  2530.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2531.                                 }

  2532.                                 addDetail( validationContext.getReport(),
  2533.                                            "SPECIFICATION_PROPERTY_JAVA_VARIABLE_NAME_CONSTRAINT",
  2534.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2535.                                            "specificationPropertyJavaVariableNameConstraint", s.getIdentifier(),
  2536.                                            moduleOfS.getName(), p.getName(),
  2537.                                            message != null && message.length() > 0 ? " " + message : "" );

  2538.                             }

  2539.                             try
  2540.                             {
  2541.                                 p.getJavaValue( validationContext.getModelContext().getClassLoader() );
  2542.                             }
  2543.                             catch ( final ModelObjectException e )
  2544.                             {
  2545.                                 final String message = getMessage( e );

  2546.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2547.                                 {
  2548.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2549.                                 }

  2550.                                 addDetail( validationContext.getReport(),
  2551.                                            "SPECIFICATION_PROPERTY_JAVA_VALUE_CONSTRAINT",
  2552.                                            Level.SEVERE, new ObjectFactory().createSpecification( s ),
  2553.                                            "specificationPropertyJavaValueConstraint", s.getIdentifier(),
  2554.                                            moduleOfS.getName(), p.getName(),
  2555.                                            message != null && message.length() > 0 ? " " + message : "" );

  2556.                             }
  2557.                         }
  2558.                     }

  2559.                     for ( int j = 0, s1 = s.getProperties().getReference().size(); j < s1; j++ )
  2560.                     {
  2561.                         final PropertyReference r = s.getProperties().getReference().get( j );

  2562.                         addDetail( validationContext.getReport(),
  2563.                                    "SPECIFICATION_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE,
  2564.                                    new ObjectFactory().createSpecification( s ),
  2565.                                    "specificationPropertyReferenceDeclarationConstraint", s.getIdentifier(),
  2566.                                    moduleOfS.getName(), r.getName() );

  2567.                     }
  2568.                 }
  2569.             }
  2570.         }
  2571.     }

  2572.     private static void assertDependencyValid( final ValidationContext validationContext,
  2573.                                                final Implementation implementation, final Dependency dependency )
  2574.     {
  2575.         final Specification s = validationContext.getSpecification( dependency.getIdentifier() );
  2576.         final Implementations available = validationContext.getImplementations( dependency.getIdentifier() );
  2577.         final Module moduleOfImpl =
  2578.             validationContext.getModuleOfImplementation( implementation.getIdentifier() );

  2579.         if ( !dependency.isOptional()
  2580.                  && ( available == null || available.getImplementation().isEmpty()
  2581.                       || ( dependency.getImplementationName() != null
  2582.                            && available.getImplementationByName( dependency.getImplementationName() ) == null ) ) )
  2583.         {
  2584.             addDetail( validationContext.getReport(), "IMPLEMENTATION_MANDATORY_DEPENDENCY_CONSTRAINT", Level.SEVERE,
  2585.                        new ObjectFactory().createImplementation( implementation ),
  2586.                        "implementationMandatoryDependencyConstraint", implementation.getIdentifier(),
  2587.                        moduleOfImpl.getName(), dependency.getName() );

  2588.         }

  2589.         if ( s != null )
  2590.         {
  2591.             final Module moduleOfS = validationContext.getModuleOfSpecification( s.getIdentifier() );

  2592.             if ( s.getClazz() == null )
  2593.             {
  2594.                 addDetail( validationContext.getReport(), "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_CLASS_CONSTRAINT",
  2595.                            Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2596.                            "implementationDependencySpecificationClassConstraint", implementation.getIdentifier(),
  2597.                            moduleOfImpl.getName(), dependency.getName(), dependency.getIdentifier(),
  2598.                            moduleOfS.getName() );

  2599.             }

  2600.             if ( dependency.getVersion() != null )
  2601.             {
  2602.                 if ( s.getVersion() == null )
  2603.                 {
  2604.                     addDetail( validationContext.getReport(),
  2605.                                "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_VERSIONING_CONSTRAINT", Level.SEVERE,
  2606.                                new ObjectFactory().createImplementation( implementation ),
  2607.                                "implementationDependencySpecificationVersioningConstraint",
  2608.                                implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2609.                                s.getIdentifier(), moduleOfS.getName() );

  2610.                 }
  2611.                 else
  2612.                 {
  2613.                     try
  2614.                     {
  2615.                         if ( VersionParser.compare( dependency.getVersion(), s.getVersion() ) > 0 )
  2616.                         {
  2617.                             addDetail( validationContext.getReport(),
  2618.                                        "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_COMPATIBILITY_CONSTRAINT",
  2619.                                        Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2620.                                        "implementationDependencySpecificationCompatibilityConstraint",
  2621.                                        implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  2622.                                        moduleOfS.getName(), dependency.getVersion(), s.getVersion() );

  2623.                         }
  2624.                     }
  2625.                     catch ( final ParseException e )
  2626.                     {
  2627.                         final String message = getMessage( e );

  2628.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2629.                         {
  2630.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2631.                         }

  2632.                         addDetail( validationContext.getReport(),
  2633.                                    "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_COMPATIBILITY_VERSIONING_PARSE_EXCEPTION",
  2634.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2635.                                    "implementationDependencySpecificationCompatibilityParseException",
  2636.                                    implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  2637.                                    moduleOfS.getName(), dependency.getVersion(),
  2638.                                    message != null && message.length() > 0 ? " " + message : "" );

  2639.                     }
  2640.                     catch ( final TokenMgrError e )
  2641.                     {
  2642.                         final String message = getMessage( e );

  2643.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2644.                         {
  2645.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2646.                         }

  2647.                         addDetail( validationContext.getReport(),
  2648.                                    "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_COMPATIBILITY_VERSIONING_TOKEN_MANAGER_ERROR",
  2649.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2650.                                    "implementationDependencySpecificationCompatibilityTokenMgrError",
  2651.                                    implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  2652.                                    moduleOfS.getName(), dependency.getVersion(),
  2653.                                    message != null && message.length() > 0 ? " " + message : "" );

  2654.                     }
  2655.                 }
  2656.             }

  2657.             if ( s.getScope() != null )
  2658.             {
  2659.                 if ( dependency.getDependencies() != null )
  2660.                 {
  2661.                     for ( int i = 0, s0 = dependency.getDependencies().getDependency().size(); i < s0; i++ )
  2662.                     {
  2663.                         final Dependency d = dependency.getDependencies().getDependency().get( i );

  2664.                         addDetail( validationContext.getReport(),
  2665.                                    "IMPLEMENTATION_DEPENDENCY_DEPENDENCIES_OVERRIDE_CONSTRAINT", Level.SEVERE,
  2666.                                    new ObjectFactory().createImplementation( implementation ),
  2667.                                    "implementationDependencyDependenciesOverrideConstraint",
  2668.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2669.                                    d.getName(), s.getIdentifier(), moduleOfS.getName(), s.getScope() );

  2670.                     }
  2671.                 }

  2672.                 if ( dependency.getMessages() != null )
  2673.                 {
  2674.                     for ( int i = 0, s0 = dependency.getMessages().getMessage().size(); i < s0; i++ )
  2675.                     {
  2676.                         final Message m = dependency.getMessages().getMessage().get( i );

  2677.                         addDetail( validationContext.getReport(),
  2678.                                    "IMPLEMENTATION_DEPENDENCY_MESSAGES_OVERRIDE_CONSTRAINT", Level.SEVERE,
  2679.                                    new ObjectFactory().createImplementation( implementation ),
  2680.                                    "implementationDependencyMessagesOverrideConstraint", implementation.getIdentifier(),
  2681.                                    moduleOfImpl.getName(), dependency.getName(), m.getName(), s.getIdentifier(),
  2682.                                    moduleOfS.getName(), s.getScope() );

  2683.                     }
  2684.                 }

  2685.                 if ( dependency.getProperties() != null )
  2686.                 {
  2687.                     for ( int i = 0, s0 = dependency.getProperties().getProperty().size(); i < s0; i++ )
  2688.                     {
  2689.                         final Property p = dependency.getProperties().getProperty().get( i );
  2690.                         addDetail( validationContext.getReport(),
  2691.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTIES_OVERRIDE_CONSTRAINT", Level.SEVERE,
  2692.                                    new ObjectFactory().createImplementation( implementation ),
  2693.                                    "implementationDependencyPropertiesOverrideConstraint",
  2694.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2695.                                    p.getName(), s.getIdentifier(), moduleOfS.getName(), s.getScope() );

  2696.                     }
  2697.                 }
  2698.             }
  2699.         }

  2700.         if ( dependency.getMessages() != null )
  2701.         {
  2702.             for ( int i = 0, s0 = dependency.getMessages().getMessage().size(); i < s0; i++ )
  2703.             {
  2704.                 final Message m = dependency.getMessages().getMessage().get( i );

  2705.                 if ( validationContext.isValidateJava() )
  2706.                 {
  2707.                     try
  2708.                     {
  2709.                         m.getJavaConstantName();
  2710.                     }
  2711.                     catch ( final ModelObjectException e )
  2712.                     {
  2713.                         final String message = getMessage( e );

  2714.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2715.                         {
  2716.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2717.                         }

  2718.                         addDetail( validationContext.getReport(),
  2719.                                    "IMPLEMENTATION_DEPENDENCY_MESSAGE_JAVA_CONSTANT_NAME_CONSTRAINT", Level.SEVERE,
  2720.                                    new ObjectFactory().createImplementation( implementation ),
  2721.                                    "implementationDependencyMessageJavaConstantNameConstraint",
  2722.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2723.                                    m.getName(), message != null && message.length() > 0 ? " " + message : "" );
  2724.                     }

  2725.                     try
  2726.                     {
  2727.                         m.getJavaGetterMethodName();
  2728.                     }
  2729.                     catch ( final ModelObjectException e )
  2730.                     {
  2731.                         final String message = getMessage( e );

  2732.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2733.                         {
  2734.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2735.                         }

  2736.                         addDetail( validationContext.getReport(),
  2737.                                    "IMPLEMENTATION_DEPENDENCY_MESSAGE_JAVA_GETTER_METHOD_NAME_CONSTRAINT", Level.SEVERE,
  2738.                                    new ObjectFactory().createImplementation( implementation ),
  2739.                                    "implementationDependencyMessageJavaGetterMethodNameConstraint",
  2740.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2741.                                    m.getName(), message != null && message.length() > 0 ? " " + message : "" );
  2742.                     }

  2743.                     try
  2744.                     {
  2745.                         m.getJavaSetterMethodName();
  2746.                     }
  2747.                     catch ( final ModelObjectException e )
  2748.                     {
  2749.                         final String message = getMessage( e );

  2750.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2751.                         {
  2752.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2753.                         }

  2754.                         addDetail( validationContext.getReport(),
  2755.                                    "IMPLEMENTATION_DEPENDENCY_MESSAGE_JAVA_SETTER_METHOD_NAME_CONSTRAINT", Level.SEVERE,
  2756.                                    new ObjectFactory().createImplementation( implementation ),
  2757.                                    "implementationDependencyMessageJavaSetterMethodNameConstraint",
  2758.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2759.                                    m.getName(), message != null && message.length() > 0 ? " " + message : "" );
  2760.                     }

  2761.                     try
  2762.                     {
  2763.                         m.getJavaVariableName();
  2764.                     }
  2765.                     catch ( final ModelObjectException e )
  2766.                     {
  2767.                         final String message = getMessage( e );

  2768.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2769.                         {
  2770.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2771.                         }

  2772.                         addDetail( validationContext.getReport(),
  2773.                                    "IMPLEMENTATION_DEPENDENCY_MESSAGE_JAVA_VARIABLE_NAME_CONSTRAINT", Level.SEVERE,
  2774.                                    new ObjectFactory().createImplementation( implementation ),
  2775.                                    "implementationDependencyMessageJavaVariableNameConstraint",
  2776.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2777.                                    m.getName(), message != null && message.length() > 0 ? " " + message : "" );
  2778.                     }
  2779.                 }

  2780.                 if ( m.getTemplate() != null )
  2781.                 {
  2782.                     for ( int j = 0, s1 = m.getTemplate().getText().size(); j < s1; j++ )
  2783.                     {
  2784.                         final Text t = m.getTemplate().getText().get( j );

  2785.                         try
  2786.                         {
  2787.                             t.getMimeType();
  2788.                         }
  2789.                         catch ( final ModelObjectException e )
  2790.                         {
  2791.                             final String message = getMessage( e );

  2792.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2793.                             {
  2794.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  2795.                             }

  2796.                             addDetail( validationContext.getReport(),
  2797.                                        "IMPLEMENTATION_DEPENDENCY_MESSAGE_TEMPLATE_MIME_TYPE_CONSTRAINT", Level.SEVERE,
  2798.                                        new ObjectFactory().createImplementation( implementation ),
  2799.                                        "implementationDependencyMessageTemplateMimeTypeConstraint",
  2800.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2801.                                        m.getName(), t.getLanguage(),
  2802.                                        message != null && message.length() > 0 ? " " + message : "" );

  2803.                         }

  2804.                         if ( validationContext.isValidateJava() )
  2805.                         {
  2806.                             try
  2807.                             {
  2808.                                 new MessageFormat( t.getValue(), new Locale( t.getLanguage() ) );
  2809.                             }
  2810.                             catch ( final IllegalArgumentException e )
  2811.                             {
  2812.                                 final String message = getMessage( e );

  2813.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2814.                                 {
  2815.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2816.                                 }

  2817.                                 addDetail( validationContext.getReport(),
  2818.                                            "IMPLEMENTATION_DEPENDENCY_MESSAGE_TEMPLATE_CONSTRAINT", Level.SEVERE,
  2819.                                            new ObjectFactory().createImplementation( implementation ),
  2820.                                            "implementationDependencyMessageTemplateConstraint",
  2821.                                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2822.                                            m.getName(), t.getLanguage(),
  2823.                                            message != null && message.length() > 0 ? " " + message : "" );

  2824.                             }
  2825.                         }
  2826.                     }
  2827.                 }

  2828.                 if ( m.getArguments() != null )
  2829.                 {
  2830.                     final Map<JavaIdentifier, Argument> javaVariableNames =
  2831.                         new HashMap<JavaIdentifier, Argument>( m.getArguments().getArgument().size() );

  2832.                     for ( int j = 0, s1 = m.getArguments().getArgument().size(); j < s1; j++ )
  2833.                     {
  2834.                         final Argument a = m.getArguments().getArgument().get( j );

  2835.                         if ( validationContext.isValidateJava() )
  2836.                         {
  2837.                             try
  2838.                             {
  2839.                                 a.getJavaTypeName();
  2840.                             }
  2841.                             catch ( final ModelObjectException e )
  2842.                             {
  2843.                                 final String message = getMessage( e );

  2844.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2845.                                 {
  2846.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2847.                                 }

  2848.                                 addDetail( validationContext.getReport(),
  2849.                                            "IMPLEMENTATION_DEPENDENCY_MESSAGE_ARGUMENT_JAVA_TYPE_NAME_CONSTRAINT",
  2850.                                            Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2851.                                            "implementationDependencyMessageArgumentJavaTypeNameConstraint",
  2852.                                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2853.                                            m.getName(), a.getName(),
  2854.                                            message != null && message.length() > 0 ? " " + message : "" );

  2855.                             }

  2856.                             try
  2857.                             {
  2858.                                 final JavaIdentifier javaIdentifier = a.getJavaVariableName();

  2859.                                 if ( javaVariableNames.containsKey( javaIdentifier ) )
  2860.                                 {
  2861.                                     addDetail( validationContext.getReport(),
  2862.                                                "IMPLEMENTATION_DEPENDENCY_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_UNIQUENESS_CONSTRAINT",
  2863.                                                Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2864.                                                "implementationDependencyMessageArgumentJavaVariableNameUniquenessConstraint",
  2865.                                                implementation.getIdentifier(), moduleOfImpl.getName(),
  2866.                                                dependency.getName(), m.getName(), a.getName(), javaIdentifier,
  2867.                                                javaVariableNames.get( javaIdentifier ).getName() );

  2868.                                 }
  2869.                                 else
  2870.                                 {
  2871.                                     javaVariableNames.put( javaIdentifier, a );
  2872.                                 }
  2873.                             }
  2874.                             catch ( final ModelObjectException e )
  2875.                             {
  2876.                                 final String message = getMessage( e );

  2877.                                 if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2878.                                 {
  2879.                                     validationContext.getModelContext().log( Level.FINE, message, e );
  2880.                                 }

  2881.                                 addDetail( validationContext.getReport(),
  2882.                                            "IMPLEMENTATION_DEPENDENCY_MESSAGE_ARGUMENT_JAVA_VARIABLE_NAME_CONSTRAINT",
  2883.                                            Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2884.                                            "implementationDependencyMessageArgumentJavaVariableNameConstraint",
  2885.                                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2886.                                            m.getName(), a.getIndex(),
  2887.                                            message != null && message.length() > 0 ? " " + message : "" );

  2888.                             }
  2889.                         }
  2890.                     }
  2891.                 }
  2892.             }

  2893.             for ( int i = 0, s0 = dependency.getMessages().getReference().size(); i < s0; i++ )
  2894.             {
  2895.                 final MessageReference r = dependency.getMessages().getReference().get( i );

  2896.                 addDetail( validationContext.getReport(),
  2897.                            "IMPLEMENTATION_DEPENDENCY_MESSAGE_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE,
  2898.                            new ObjectFactory().createImplementation( implementation ),
  2899.                            "implementationDependencyMessageReferenceDeclarationConstraint",
  2900.                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(), r.getName() );

  2901.             }
  2902.         }

  2903.         if ( dependency.getProperties() != null )
  2904.         {
  2905.             for ( int i = 0, s0 = dependency.getProperties().getProperty().size(); i < s0; i++ )
  2906.             {
  2907.                 final Property p = dependency.getProperties().getProperty().get( i );

  2908.                 if ( p.getValue() != null && p.getAny() != null )
  2909.                 {
  2910.                     addDetail( validationContext.getReport(), "IMPLEMENTATION_DEPENDENCY_PROPERTY_VALUE_CONSTRAINT",
  2911.                                Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2912.                                "implementationDependencyPropertyValueConstraint", implementation.getIdentifier(),
  2913.                                moduleOfImpl.getName(), dependency.getName(), p.getName() );

  2914.                 }

  2915.                 if ( p.getAny() != null && p.getType() == null )
  2916.                 {
  2917.                     addDetail( validationContext.getReport(), "IMPLEMENTATION_DEPENDENCY_PROPERTY_TYPE_CONSTRAINT",
  2918.                                Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2919.                                "implementationDependencyPropertyTypeConstraint", implementation.getIdentifier(),
  2920.                                moduleOfImpl.getName(), dependency.getName(), p.getName() );

  2921.                 }

  2922.                 if ( validationContext.isValidateJava() )
  2923.                 {
  2924.                     try
  2925.                     {
  2926.                         p.getJavaConstantName();
  2927.                     }
  2928.                     catch ( final ModelObjectException e )
  2929.                     {
  2930.                         final String message = getMessage( e );

  2931.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2932.                         {
  2933.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2934.                         }

  2935.                         addDetail( validationContext.getReport(),
  2936.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_CONSTANT_NAME_CONSTRAINT", Level.SEVERE,
  2937.                                    new ObjectFactory().createImplementation( implementation ),
  2938.                                    "implementationDependencyPropertyJavaConstantNameConstraint",
  2939.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2940.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  2941.                     }

  2942.                     try
  2943.                     {
  2944.                         p.getJavaGetterMethodName();
  2945.                     }
  2946.                     catch ( final ModelObjectException e )
  2947.                     {
  2948.                         final String message = getMessage( e );

  2949.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2950.                         {
  2951.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2952.                         }

  2953.                         addDetail( validationContext.getReport(),
  2954.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  2955.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2956.                                    "implementationDependencyPropertyJavaGetterMethodNameConstraint",
  2957.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2958.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  2959.                     }

  2960.                     try
  2961.                     {
  2962.                         p.getJavaSetterMethodName();
  2963.                     }
  2964.                     catch ( final ModelObjectException e )
  2965.                     {
  2966.                         final String message = getMessage( e );

  2967.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2968.                         {
  2969.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2970.                         }

  2971.                         addDetail( validationContext.getReport(),
  2972.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  2973.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2974.                                    "implementationDependencyPropertyJavaSetterMethodNameConstraint",
  2975.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2976.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  2977.                     }

  2978.                     try
  2979.                     {
  2980.                         p.getJavaTypeName();
  2981.                     }
  2982.                     catch ( final ModelObjectException e )
  2983.                     {
  2984.                         final String message = getMessage( e );

  2985.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  2986.                         {
  2987.                             validationContext.getModelContext().log( Level.FINE, message, e );
  2988.                         }

  2989.                         addDetail( validationContext.getReport(),
  2990.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_TYPE_NAME_CONSTRAINT",
  2991.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  2992.                                    "implementationDependencyPropertyJavaTypeNameConstraint",
  2993.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  2994.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  2995.                     }

  2996.                     try
  2997.                     {
  2998.                         p.getJavaVariableName();
  2999.                     }
  3000.                     catch ( final ModelObjectException e )
  3001.                     {
  3002.                         final String message = getMessage( e );

  3003.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3004.                         {
  3005.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3006.                         }

  3007.                         addDetail( validationContext.getReport(),
  3008.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_VARIABLE_NAME_CONSTRAINT",
  3009.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3010.                                    "implementationDependencyPropertyJavaVariableNameConstraint",
  3011.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3012.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3013.                     }

  3014.                     try
  3015.                     {
  3016.                         p.getJavaValue( validationContext.getModelContext().getClassLoader() );
  3017.                     }
  3018.                     catch ( final ModelObjectException e )
  3019.                     {
  3020.                         final String message = getMessage( e );

  3021.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3022.                         {
  3023.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3024.                         }

  3025.                         addDetail( validationContext.getReport(),
  3026.                                    "IMPLEMENTATION_DEPENDENCY_PROPERTY_JAVA_VALUE_CONSTRAINT", Level.SEVERE,
  3027.                                    new ObjectFactory().createImplementation( implementation ),
  3028.                                    "implementationDependencyPropertyJavaValueConstraint",
  3029.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3030.                                    p.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3031.                     }
  3032.                 }
  3033.             }

  3034.             for ( int i = 0, s0 = dependency.getProperties().getReference().size(); i < s0; i++ )
  3035.             {
  3036.                 final PropertyReference r = dependency.getProperties().getReference().get( i );

  3037.                 addDetail( validationContext.getReport(),
  3038.                            "IMPLEMENTATION_DEPENDENCY_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE,
  3039.                            new ObjectFactory().createImplementation( implementation ),
  3040.                            "implementationDependencyPropertyReferenceDeclarationConstraint",
  3041.                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(), r.getName() );

  3042.             }
  3043.         }

  3044.         if ( available != null )
  3045.         {
  3046.             for ( int i = 0, s0 = available.getImplementation().size(); i < s0; i++ )
  3047.             {
  3048.                 final Implementation a = available.getImplementation().get( i );

  3049.                 if ( dependency.getImplementationName() != null
  3050.                          && !dependency.getImplementationName().equals( a.getName() ) )
  3051.                 {
  3052.                     continue;
  3053.                 }

  3054.                 final InheritanceModel imodel = validationContext.getInheritanceModel();
  3055.                 final Module moduleOfA = validationContext.getModuleOfImplementation( a.getIdentifier() );

  3056.                 if ( dependency.getDependencies() != null )
  3057.                 {
  3058.                     for ( int j = 0, s1 = dependency.getDependencies().getDependency().size(); j < s1; j++ )
  3059.                     {
  3060.                         final Dependency override = dependency.getDependencies().getDependency().get( j );

  3061.                         final Set<InheritanceModel.Node<Dependency>> effDependencies =
  3062.                             imodel.getDependencyNodes( a.getIdentifier(), override.getName() );

  3063.                         final Set<InheritanceModel.Node<Dependency>> overriddenDependencies =
  3064.                             modifiableSet( effDependencies );

  3065.                         final boolean effectiveDependencyOverridden = !overriddenDependencies.isEmpty();

  3066.                         if ( override.isOverride() && overriddenDependencies.isEmpty() )
  3067.                         {
  3068.                             addDetail( validationContext.getReport(),
  3069.                                        "IMPLEMENTATION_DEPENDENCY_OVERRIDE_DEPENDENCY_CONSTRAINT",
  3070.                                        Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3071.                                        "implementationDependencyOverrideDependencyConstraint",
  3072.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3073.                                        override.getName(), a.getIdentifier(), moduleOfA.getName() );

  3074.                         }

  3075.                         if ( !( override.isOverride() || overriddenDependencies.isEmpty() ) )
  3076.                         {
  3077.                             for ( final InheritanceModel.Node<Dependency> overriddenDependency : overriddenDependencies )
  3078.                             {
  3079.                                 addDetail( validationContext.getReport(),
  3080.                                            "IMPLEMENTATION_DEPENDENCY_OVERRIDE_DEPENDENCY_WARNING",
  3081.                                            Level.WARNING, new ObjectFactory().createImplementation( implementation ),
  3082.                                            "implementationDependencyOverrideDependencyWarning",
  3083.                                            implementation.getIdentifier(), moduleOfImpl.getName(),
  3084.                                            dependency.getName(), override.getName(), a.getIdentifier(),
  3085.                                            moduleOfA.getName(), getNodePathString( overriddenDependency ) );

  3086.                             }
  3087.                         }

  3088.                         retainFinalNodes( overriddenDependencies );

  3089.                         for ( final InheritanceModel.Node<Dependency> overriddenDependency : overriddenDependencies )
  3090.                         {
  3091.                             addDetail( validationContext.getReport(),
  3092.                                        "IMPLEMENTATION_DEPENDENCY_FINAL_DEPENDENCY_CONSTRAINT",
  3093.                                        Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3094.                                        "implementationDependencyFinalDependencyConstraint",
  3095.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3096.                                        override.getName(), a.getIdentifier(), moduleOfA.getName(),
  3097.                                        getNodePathString( overriddenDependency ) );

  3098.                         }

  3099.                         if ( effectiveDependencyOverridden )
  3100.                         {
  3101.                             for ( final InheritanceModel.Node<Dependency> node : effDependencies )
  3102.                             {
  3103.                                 final Dependency overridden = node.getModelObject();

  3104.                                 final Specification overrideSpecification =
  3105.                                     validationContext.getSpecification( override.getIdentifier() );

  3106.                                 final Specification overriddenSpecification =
  3107.                                     validationContext.getSpecification( overridden.getIdentifier() );

  3108.                                 if ( overrideSpecification != null && overriddenSpecification != null )
  3109.                                 {
  3110.                                     if ( overrideSpecification.getMultiplicity()
  3111.                                              != overriddenSpecification.getMultiplicity() )
  3112.                                     {
  3113.                                         addDetail( validationContext.getReport(),
  3114.                                                    "IMPLEMENTATION_DEPENDENCY_MULTIPLICITY_CONSTRAINT",
  3115.                                                    Level.SEVERE,
  3116.                                                    new ObjectFactory().createImplementation( implementation ),
  3117.                                                    "implementationDependencyMultiplicityConstraint",
  3118.                                                    implementation.getIdentifier(), moduleOfImpl.getName(),
  3119.                                                    dependency.getName(), overridden.getName(),
  3120.                                                    a.getIdentifier(), moduleOfA.getName(),
  3121.                                                    overrideSpecification.getMultiplicity().value(),
  3122.                                                    overriddenSpecification.getMultiplicity().value() );

  3123.                                     }

  3124.                                     if ( overrideSpecification.getScope() != null
  3125.                                              ? !overrideSpecification.getScope().equals(
  3126.                                             overriddenSpecification.getScope() )
  3127.                                              : overriddenSpecification.getScope() != null )
  3128.                                     {
  3129.                                         addDetail( validationContext.getReport(),
  3130.                                                    "IMPLEMENTATION_DEPENDENCY_SCOPE_CONSTRAINT", Level.SEVERE,
  3131.                                                    new ObjectFactory().createImplementation( implementation ),
  3132.                                                    "implementationDependencyScopeConstraint",
  3133.                                                    implementation.getIdentifier(), moduleOfImpl.getName(),
  3134.                                                    dependency.getName(), override.getName(),
  3135.                                                    a.getIdentifier(), moduleOfA.getName(),
  3136.                                                    overrideSpecification.getScope() == null
  3137.                                                        ? "Multiton" : overrideSpecification.getScope(),
  3138.                                                    overriddenSpecification.getScope() == null
  3139.                                                        ? "Multiton" : overriddenSpecification.getScope() );

  3140.                                     }

  3141.                                     if ( overriddenSpecification.getMultiplicity() == Multiplicity.MANY )
  3142.                                     {
  3143.                                         if ( override.getImplementationName() == null
  3144.                                                  && overridden.getImplementationName() != null )
  3145.                                         {
  3146.                                             addDetail( validationContext.getReport(),
  3147.                                                        "IMPLEMENTATION_DEPENDENCY_NO_IMPLEMENTATION_NAME_CONSTRAINT",
  3148.                                                        Level.SEVERE,
  3149.                                                        new ObjectFactory().createImplementation( implementation ),
  3150.                                                        "implementationDependencyNoImplementationNameConstraint",
  3151.                                                        implementation.getIdentifier(), moduleOfImpl.getName(),
  3152.                                                        dependency.getName(), override.getName(),
  3153.                                                        a.getIdentifier(), moduleOfA.getName() );

  3154.                                         }

  3155.                                         if ( override.getImplementationName() != null
  3156.                                                  && overridden.getImplementationName() == null )
  3157.                                         {
  3158.                                             addDetail( validationContext.getReport(),
  3159.                                                        "IMPLEMENTATION_DEPENDENCY_IMPLEMENTATION_NAME_CONSTRAINT",
  3160.                                                        Level.SEVERE,
  3161.                                                        new ObjectFactory().createImplementation( implementation ),
  3162.                                                        "implementationDependencyImplementationNameConstraint",
  3163.                                                        implementation.getIdentifier(), moduleOfImpl.getName(),
  3164.                                                        dependency.getName(), overridden.getName(),
  3165.                                                        a.getIdentifier(), moduleOfA.getName(),
  3166.                                                        override.getImplementationName() );

  3167.                                         }
  3168.                                     }
  3169.                                 }

  3170.                                 if ( override.isOptional() != overridden.isOptional() )
  3171.                                 {
  3172.                                     addDetail( validationContext.getReport(),
  3173.                                                "IMPLEMENTATION_DEPENDENCY_OPTIONALITY_CONSTRAINT", Level.SEVERE,
  3174.                                                new ObjectFactory().createImplementation( implementation ),
  3175.                                                "implementationDependencyOptonalityConstraint",
  3176.                                                implementation.getIdentifier(), moduleOfImpl.getName(),
  3177.                                                dependency.getName(), overridden.getName(),
  3178.                                                a.getIdentifier(), moduleOfA.getName() );

  3179.                                 }
  3180.                             }
  3181.                         }
  3182.                     }
  3183.                 }

  3184.                 if ( dependency.getMessages() != null )
  3185.                 {
  3186.                     for ( int j = 0, s1 = dependency.getMessages().getMessage().size(); j < s1; j++ )
  3187.                     {
  3188.                         final Message override = dependency.getMessages().getMessage().get( j );

  3189.                         final Set<InheritanceModel.Node<Message>> overriddenMessages =
  3190.                             modifiableSet( imodel.getMessageNodes( a.getIdentifier(), override.getName() ) );

  3191.                         if ( override.isOverride() && overriddenMessages.isEmpty() )
  3192.                         {
  3193.                             addDetail( validationContext.getReport(),
  3194.                                        "IMPLEMENTATION_DEPENDENCY_OVERRIDE_MESSAGE_CONSTRAINT", Level.SEVERE,
  3195.                                        new ObjectFactory().createImplementation( implementation ),
  3196.                                        "implementationDependencyOverrideMessageConstraint",
  3197.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3198.                                        override.getName(), a.getIdentifier(), moduleOfA.getName() );

  3199.                         }

  3200.                         if ( !( override.isOverride() || overriddenMessages.isEmpty() ) )
  3201.                         {
  3202.                             for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  3203.                             {
  3204.                                 addDetail( validationContext.getReport(),
  3205.                                            "IMPLEMENTATION_DEPENDENCY_OVERRIDE_MESSAGE_WARNING", Level.WARNING,
  3206.                                            new ObjectFactory().createImplementation( implementation ),
  3207.                                            "implementationDependencyOverrideMessageWarning",
  3208.                                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3209.                                            override.getName(), a.getIdentifier(), moduleOfA.getName(),
  3210.                                            getNodePathString( overriddenMessage ) );

  3211.                             }
  3212.                         }

  3213.                         retainFinalNodes( overriddenMessages );

  3214.                         for ( final InheritanceModel.Node<Message> overriddenMessage : overriddenMessages )
  3215.                         {
  3216.                             addDetail( validationContext.getReport(),
  3217.                                        "IMPLEMENTATION_DEPENDENCY_FINAL_MESSAGE_CONSTRAINT", Level.SEVERE,
  3218.                                        new ObjectFactory().createImplementation( implementation ),
  3219.                                        "implementationDependencyFinalMessageConstraint",
  3220.                                        implementation.getIdentifier(), moduleOfImpl.getName(),
  3221.                                        dependency.getName(), override.getName(), a.getIdentifier(),
  3222.                                        moduleOfA.getName(), getNodePathString( overriddenMessage ) );

  3223.                         }
  3224.                     }
  3225.                 }

  3226.                 if ( dependency.getProperties() != null )
  3227.                 {
  3228.                     for ( int j = 0, s1 = dependency.getProperties().getProperty().size(); j < s1; j++ )
  3229.                     {
  3230.                         final Property override = dependency.getProperties().getProperty().get( j );

  3231.                         final Set<InheritanceModel.Node<Property>> overriddenProperties =
  3232.                             modifiableSet( imodel.getPropertyNodes( a.getIdentifier(), override.getName() ) );

  3233.                         if ( override.isOverride() && overriddenProperties.isEmpty() )
  3234.                         {
  3235.                             addDetail( validationContext.getReport(),
  3236.                                        "IMPLEMENTATION_DEPENDENCY_OVERRIDE_PROPERTY_CONSTRAINT", Level.SEVERE,
  3237.                                        new ObjectFactory().createImplementation( implementation ),
  3238.                                        "implementationDependencyOverridePropertyConstraint",
  3239.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3240.                                        override.getName(), a.getIdentifier(), moduleOfA.getName() );

  3241.                         }

  3242.                         if ( !( override.isOverride() || overriddenProperties.isEmpty() ) )
  3243.                         {
  3244.                             for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  3245.                             {
  3246.                                 addDetail( validationContext.getReport(),
  3247.                                            "IMPLEMENTATION_DEPENDENCY_OVERRIDE_PROPERTY_WARNING", Level.WARNING,
  3248.                                            new ObjectFactory().createImplementation( implementation ),
  3249.                                            "implementationDependencyOverridePropertyWarning",
  3250.                                            implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3251.                                            override.getName(), a.getIdentifier(), moduleOfA.getName(),
  3252.                                            getNodePathString( overriddenProperty ) );

  3253.                             }
  3254.                         }

  3255.                         retainFinalNodes( overriddenProperties );

  3256.                         for ( final InheritanceModel.Node<Property> overriddenProperty : overriddenProperties )
  3257.                         {
  3258.                             addDetail( validationContext.getReport(),
  3259.                                        "IMPLEMENTATION_DEPENDENCY_FINAL_PROPERTY_CONSTRAINT", Level.SEVERE,
  3260.                                        new ObjectFactory().createImplementation( implementation ),
  3261.                                        "implementationDependencyFinalPropertyConstraint",
  3262.                                        implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3263.                                        override.getName(), a.getIdentifier(), moduleOfA.getName(),
  3264.                                        getNodePathString( overriddenProperty ) );

  3265.                         }
  3266.                     }
  3267.                 }
  3268.             }
  3269.         }

  3270.         if ( dependency.getDependencies() != null )
  3271.         {
  3272.             for ( int i = 0, s0 = dependency.getDependencies().getDependency().size(); i < s0; i++ )
  3273.             {
  3274.                 final Dependency d = dependency.getDependencies().getDependency().get( i );

  3275.                 if ( validationContext.isValidateJava() )
  3276.                 {
  3277.                     try
  3278.                     {
  3279.                         d.getJavaConstantName();
  3280.                     }
  3281.                     catch ( final ModelObjectException e )
  3282.                     {
  3283.                         final String message = getMessage( e );

  3284.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3285.                         {
  3286.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3287.                         }

  3288.                         addDetail( validationContext.getReport(),
  3289.                                    "IMPLEMENTATION_DEPENDENCY_DEPENDENCY_JAVA_CONSTANT_NAME_CONSTRAINT", Level.SEVERE,
  3290.                                    new ObjectFactory().createImplementation( implementation ),
  3291.                                    "implementationDependencyDependencyJavaConstantNameConstraint",
  3292.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3293.                                    d.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3294.                     }

  3295.                     try
  3296.                     {
  3297.                         d.getJavaGetterMethodName();
  3298.                     }
  3299.                     catch ( final ModelObjectException e )
  3300.                     {
  3301.                         final String message = getMessage( e );

  3302.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3303.                         {
  3304.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3305.                         }

  3306.                         addDetail( validationContext.getReport(),
  3307.                                    "IMPLEMENTATION_DEPENDENCY_DEPENDENCY_JAVA_GETTER_METHOD_NAME_CONSTRAINT",
  3308.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3309.                                    "implementationDependencyDependencyJavaGetterMethodNameConstraint",
  3310.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3311.                                    d.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3312.                     }

  3313.                     try
  3314.                     {
  3315.                         d.getJavaSetterMethodName();
  3316.                     }
  3317.                     catch ( final ModelObjectException e )
  3318.                     {
  3319.                         final String message = getMessage( e );

  3320.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3321.                         {
  3322.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3323.                         }

  3324.                         addDetail( validationContext.getReport(),
  3325.                                    "IMPLEMENTATION_DEPENDENCY_DEPENDENCY_JAVA_SETTER_METHOD_NAME_CONSTRAINT",
  3326.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3327.                                    "implementationDependencyDependencyJavaSetterMethodNameConstraint",
  3328.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3329.                                    d.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3330.                     }

  3331.                     try
  3332.                     {
  3333.                         d.getJavaVariableName();
  3334.                     }
  3335.                     catch ( final ModelObjectException e )
  3336.                     {
  3337.                         final String message = getMessage( e );

  3338.                         if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3339.                         {
  3340.                             validationContext.getModelContext().log( Level.FINE, message, e );
  3341.                         }

  3342.                         addDetail( validationContext.getReport(),
  3343.                                    "IMPLEMENTATION_DEPENDENCY_DEPENDENCY_JAVA_VARIABLE_NAME_CONSTRAINT",
  3344.                                    Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3345.                                    "implementationDependencyDependencyJavaVariableNameConstraint",
  3346.                                    implementation.getIdentifier(), moduleOfImpl.getName(), dependency.getName(),
  3347.                                    d.getName(), message != null && message.length() > 0 ? " " + message : "" );

  3348.                     }
  3349.                 }

  3350.                 assertDependencyValid( validationContext, implementation, d );
  3351.             }
  3352.         }
  3353.     }

  3354.     private static void assertImplementationSpecificationCompatibility(
  3355.         final ValidationContext validationContext, final Implementation implementation )
  3356.     {
  3357.         final Specifications specs = validationContext.getSpecifications( implementation.getIdentifier() );
  3358.         final Module moduleOfImpl =
  3359.             validationContext.getModuleOfImplementation( implementation.getIdentifier() );

  3360.         if ( specs != null )
  3361.         {
  3362.             for ( int i = 0, s0 = specs.getReference().size(); i < s0; i++ )
  3363.             {
  3364.                 final SpecificationReference r = specs.getReference().get( i );
  3365.                 final Specification s = specs.getSpecification( r.getIdentifier() );

  3366.                 if ( s != null && r.getVersion() != null )
  3367.                 {
  3368.                     final Module moduleOfS =
  3369.                         validationContext.getModuleOfSpecification( s.getIdentifier() );

  3370.                     if ( s.getVersion() == null )
  3371.                     {
  3372.                         addDetail( validationContext.getReport(),
  3373.                                    "IMPLEMENTATION_SPECIFICATION_VERSIONING_CONSTRAINT", Level.SEVERE,
  3374.                                    new ObjectFactory().createImplementation( implementation ),
  3375.                                    "implementationSpecificationVersioningConstraint", implementation.getIdentifier(),
  3376.                                    moduleOfImpl.getName(), s.getIdentifier(), moduleOfS.getName() );

  3377.                     }
  3378.                     else
  3379.                     {
  3380.                         try
  3381.                         {
  3382.                             if ( VersionParser.compare( r.getVersion(), s.getVersion() ) != 0 )
  3383.                             {
  3384.                                 addDetail( validationContext.getReport(),
  3385.                                            "IMPLEMENTATION_SPECIFICATION_COMPATIBILITY_CONSTRAINT", Level.SEVERE,
  3386.                                            new ObjectFactory().createImplementation( implementation ),
  3387.                                            "implementationSpecificationCompatibilityConstraint",
  3388.                                            implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  3389.                                            moduleOfS.getName(), r.getVersion(), s.getVersion() );

  3390.                             }
  3391.                         }
  3392.                         catch ( final ParseException e )
  3393.                         {
  3394.                             final String message = getMessage( e );

  3395.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3396.                             {
  3397.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  3398.                             }

  3399.                             addDetail( validationContext.getReport(),
  3400.                                        "IMPLEMENTATION_SPECIFICATION_COMPATIBILITY_VERSIONING_PARSE_EXCEPTION",
  3401.                                        Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3402.                                        "implementationSpecificationCompatibilityVersioningParseException",
  3403.                                        implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  3404.                                        moduleOfS.getName(), r.getVersion(),
  3405.                                        message != null && message.length() > 0 ? " " + message : "" );

  3406.                         }
  3407.                         catch ( final TokenMgrError e )
  3408.                         {
  3409.                             final String message = getMessage( e );

  3410.                             if ( validationContext.getModelContext().isLoggable( Level.FINE ) )
  3411.                             {
  3412.                                 validationContext.getModelContext().log( Level.FINE, message, e );
  3413.                             }

  3414.                             addDetail( validationContext.getReport(),
  3415.                                        "IMPLEMENTATION_SPECIFICATION_COMPATIBILITY_VERSIONING_TOKEN_MANAGER_ERROR",
  3416.                                        Level.SEVERE, new ObjectFactory().createImplementation( implementation ),
  3417.                                        "implementationSpecificationCompatibilityVersioningTokenManagerError",
  3418.                                        implementation.getIdentifier(), moduleOfImpl.getName(), s.getIdentifier(),
  3419.                                        moduleOfS.getName(), r.getVersion(),
  3420.                                        message != null && message.length() > 0 ? " " + message : "" );

  3421.                         }
  3422.                     }
  3423.                 }
  3424.             }
  3425.         }
  3426.     }

  3427.     private static <T> String getNodePathString( final InheritanceModel.Node<T> node )
  3428.     {
  3429.         final StringBuilder b = new StringBuilder( node.getPath().size() * 50 );

  3430.         for ( int i = 0, s0 = node.getPath().size(); i < s0; i++ )
  3431.         {
  3432.             final InheritanceModel.Node<Implementation> pathNode = node.getPath().get( i );

  3433.             if ( pathNode.getClassDeclaration() != null )
  3434.             {
  3435.                 b.append( " -> [" ).append( pathNode.getClassDeclaration().getClazz() ).append( "] @ '" ).
  3436.                     append( pathNode.getImplementation().getIdentifier() ).append( "'" );

  3437.             }
  3438.             if ( pathNode.getSpecification() != null )
  3439.             {
  3440.                 b.append( " -> <" ).append( pathNode.getSpecification().getIdentifier() ).append( "> @ '" ).
  3441.                     append( pathNode.getImplementation().getIdentifier() ).append( "'" );

  3442.             }
  3443.             else
  3444.             {
  3445.                 b.append( " -> '" ).append( pathNode.getImplementation().getIdentifier() ).append( "'" );
  3446.             }
  3447.         }

  3448.         if ( node.getClassDeclaration() != null )
  3449.         {
  3450.             b.append( " -> [" ).append( node.getClassDeclaration().getClazz() ).append( "] @ '" ).
  3451.                 append( node.getImplementation().getIdentifier() ).append( "'" );

  3452.         }
  3453.         if ( node.getSpecification() != null )
  3454.         {
  3455.             b.append( " -> <" ).append( node.getSpecification().getIdentifier() ).append( "> @ '" ).
  3456.                 append( node.getImplementation().getIdentifier() ).append( "'" );

  3457.         }

  3458.         return b.length() > 0 ? b.substring( " -> ".length() ) : b.toString();
  3459.     }

  3460.     private static <T> String getNodeListPathString( final Collection<? extends InheritanceModel.Node<T>> nodes )
  3461.     {
  3462.         final StringBuilder path = new StringBuilder( nodes.size() * 255 );

  3463.         for ( final InheritanceModel.Node<T> node : nodes )
  3464.         {
  3465.             path.append( ", " ).append( getNodePathString( node ) );
  3466.         }

  3467.         return path.length() > 1 ? path.substring( 2 ) : path.toString();
  3468.     }

  3469.     private static <T> Set<InheritanceModel.Node<T>> retainFinalNodes( final Set<InheritanceModel.Node<T>> set )
  3470.     {
  3471.         if ( set != null )
  3472.         {
  3473.             for ( final Iterator<InheritanceModel.Node<T>> it = set.iterator(); it.hasNext(); )
  3474.             {
  3475.                 if ( !it.next().isFinal() )
  3476.                 {
  3477.                     it.remove();
  3478.                 }
  3479.             }
  3480.         }

  3481.         return set;
  3482.     }

  3483.     private static void addDetail(
  3484.         final ModelValidationReport report, final String identifier, final Level level,
  3485.         final JAXBElement<? extends ModelObject> element, final String messageKey, final Object... messageArguments )
  3486.     {
  3487.         report.getDetails().add( new ModelValidationReport.Detail(
  3488.             identifier, level, getMessage( messageKey, messageArguments ), element ) );

  3489.     }

  3490.     private static <T> Set<T> modifiableSet( final Collection<? extends T> col )
  3491.     {
  3492.         Set<T> set = Collections.emptySet();

  3493.         if ( col != null )
  3494.         {
  3495.             set = new HashSet<T>( col );
  3496.         }

  3497.         return set;
  3498.     }

  3499.     private static String getMessage( final String key, final Object... messageArguments )
  3500.     {
  3501.         return MessageFormat.format( ResourceBundle.getBundle(
  3502.             DefaultModelValidator.class.getName().replace( '.', '/' ),
  3503.             Locale.getDefault() ).getString( key ), messageArguments );

  3504.     }

  3505.     private static String getMessage( final Throwable t )
  3506.     {
  3507.         return t != null
  3508.                    ? t.getMessage() != null && t.getMessage().trim().length() > 0
  3509.                          ? t.getMessage()
  3510.                          : getMessage( t.getCause() )
  3511.                    : null;

  3512.     }

  3513.     /**
  3514.      * @since 1.2
  3515.      */
  3516.     private static final class ValidationContext
  3517.     {

  3518.         private final ModelContext modelContext;

  3519.         private final Modules modules;

  3520.         private final ModelValidationReport report;

  3521.         private final InheritanceModel inheritanceModel;

  3522.         private final boolean validateJava;

  3523.         private final Specifications allSpecifications;

  3524.         private final Implementations allImplementations;

  3525.         private final Map<String, Specification> specifications = new HashMap<String, Specification>();

  3526.         private final Map<String, Specifications> specificationsByImplementation =
  3527.             new HashMap<String, Specifications>();

  3528.         private final Map<String, Module> modulesOfSpecifications = new HashMap<String, Module>();

  3529.         private final Map<String, Implementation> implementations = new HashMap<String, Implementation>();

  3530.         private final Map<String, Implementations> implementationsBySpecification =
  3531.             new HashMap<String, Implementations>();

  3532.         private final Map<String, Module> modulesOfImplementations = new HashMap<String, Module>();

  3533.         private ValidationContext( final ModelContext modelContext, final Modules modules,
  3534.                                    final ModelValidationReport report, final boolean validateJava )
  3535.         {
  3536.             super();
  3537.             this.modelContext = modelContext;
  3538.             this.modules = modules;
  3539.             this.report = report;
  3540.             this.inheritanceModel = new InheritanceModel( modules );
  3541.             this.validateJava = validateJava;
  3542.             this.allImplementations = modules.getImplementations();
  3543.             this.allSpecifications = modules.getSpecifications();

  3544.             if ( this.allSpecifications != null )
  3545.             {
  3546.                 for ( final Specification s : this.allSpecifications.getSpecification() )
  3547.                 {
  3548.                     this.specifications.put( s.getIdentifier(), s );
  3549.                     this.implementationsBySpecification.put(
  3550.                         s.getIdentifier(), modules.getImplementations( s.getIdentifier() ) );

  3551.                     this.modulesOfSpecifications.put(
  3552.                         s.getIdentifier(), modules.getModuleOfSpecification( s.getIdentifier() ) );

  3553.                 }
  3554.             }

  3555.             if ( this.allImplementations != null )
  3556.             {
  3557.                 for ( final Implementation i : this.allImplementations.getImplementation() )
  3558.                 {
  3559.                     this.implementations.put( i.getIdentifier(), i );
  3560.                     this.specificationsByImplementation.put(
  3561.                         i.getIdentifier(), modules.getSpecifications( i.getIdentifier() ) );

  3562.                     this.modulesOfImplementations.put(
  3563.                         i.getIdentifier(), modules.getModuleOfImplementation( i.getIdentifier() ) );
  3564.                 }
  3565.             }
  3566.         }

  3567.         private ModelContext getModelContext()
  3568.         {
  3569.             return modelContext;
  3570.         }

  3571.         private Modules getModules()
  3572.         {
  3573.             return modules;
  3574.         }

  3575.         private ModelValidationReport getReport()
  3576.         {
  3577.             return report;
  3578.         }

  3579.         private InheritanceModel getInheritanceModel()
  3580.         {
  3581.             return this.inheritanceModel;
  3582.         }

  3583.         private boolean isValidateJava()
  3584.         {
  3585.             return this.validateJava;
  3586.         }

  3587.         private Specifications getAllSpecifications()
  3588.         {
  3589.             return this.allSpecifications;
  3590.         }

  3591.         private Implementations getAllImplementations()
  3592.         {
  3593.             return this.allImplementations;
  3594.         }

  3595.         private Specification getSpecification( final String identifier )
  3596.         {
  3597.             return this.specifications.get( identifier );
  3598.         }

  3599.         private Specifications getSpecifications( final String implementation )
  3600.         {
  3601.             return this.specificationsByImplementation.get( implementation );
  3602.         }

  3603.         private Implementation getImplementation( final String identifier )
  3604.         {
  3605.             return this.implementations.get( identifier );
  3606.         }

  3607.         private Implementations getImplementations( final String specification )
  3608.         {
  3609.             return this.implementationsBySpecification.get( specification );
  3610.         }

  3611.         private Module getModuleOfSpecification( final String identifier )
  3612.         {
  3613.             return this.modulesOfSpecifications.get( identifier );
  3614.         }

  3615.         private Module getModuleOfImplementation( final String identifier )
  3616.         {
  3617.             return this.modulesOfImplementations.get( identifier );
  3618.         }

  3619.     }

  3620. }