View Javadoc
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: ValidateClasspathTask.java 5043 2015-05-27 07:03:39Z schulte $
29   *
30   */
31  package org.jomc.ant;
32  
33  import java.io.IOException;
34  import java.util.logging.Level;
35  import javax.xml.bind.JAXBContext;
36  import javax.xml.bind.JAXBException;
37  import javax.xml.bind.util.JAXBSource;
38  import javax.xml.transform.Source;
39  import org.apache.tools.ant.BuildException;
40  import org.jomc.model.Implementation;
41  import org.jomc.model.Module;
42  import org.jomc.model.Specification;
43  import org.jomc.modlet.Model;
44  import org.jomc.modlet.ModelContext;
45  import org.jomc.modlet.ModelException;
46  import org.jomc.modlet.ModelValidationReport;
47  import org.jomc.modlet.ObjectFactory;
48  import org.jomc.tools.ClassFileProcessor;
49  
50  /**
51   * Task for validating class path model objects.
52   *
53   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
54   * @version $JOMC: ValidateClasspathTask.java 5043 2015-05-27 07:03:39Z schulte $
55   */
56  public final class ValidateClasspathTask extends ClassFileProcessorTask
57  {
58  
59      /**
60       * Creates a new {@code ValidateClasspathTask} instance.
61       */
62      public ValidateClasspathTask()
63      {
64          super();
65      }
66  
67      /**
68       * Validates class file model objects.
69       *
70       * @throws BuildException if validating class file model objects fails.
71       */
72      @Override
73      public void processClassFiles() throws BuildException
74      {
75          ProjectClassLoader classLoader = null;
76          boolean suppressExceptionOnClose = true;
77  
78          try
79          {
80              this.log( Messages.getMessage( "validatingClasspath", this.getModel() ) );
81  
82              classLoader = this.newProjectClassLoader();
83              final ModelContext context = this.newModelContext( classLoader );
84              final ClassFileProcessor tool = this.newClassFileProcessor();
85              final JAXBContext jaxbContext = context.createContext( this.getModel() );
86              final Model model = this.getModel( context );
87              final Source source = new JAXBSource( jaxbContext, new ObjectFactory().createModel( model ) );
88              ModelValidationReport validationReport = context.validateModel( this.getModel(), source );
89  
90              this.logValidationReport( context, validationReport );
91              tool.setModel( model );
92  
93              if ( validationReport.isModelValid() )
94              {
95                  final Specification s = this.getSpecification( model );
96                  final Implementation i = this.getImplementation( model );
97                  final Module m = this.getModule( model );
98  
99                  if ( s != null )
100                 {
101                     validationReport = tool.validateModelObjects( s, context );
102 
103                     if ( validationReport != null )
104                     {
105                         this.logValidationReport( context, validationReport );
106 
107                         if ( !validationReport.isModelValid() )
108                         {
109                             throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
110                         }
111                     }
112                 }
113 
114                 if ( i != null )
115                 {
116                     validationReport = tool.validateModelObjects( i, context );
117 
118                     if ( validationReport != null )
119                     {
120                         this.logValidationReport( context, validationReport );
121 
122                         if ( !validationReport.isModelValid() )
123                         {
124                             throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
125                         }
126                     }
127                 }
128 
129                 if ( m != null )
130                 {
131                     validationReport = tool.validateModelObjects( m, context );
132 
133                     if ( validationReport != null )
134                     {
135                         this.logValidationReport( context, validationReport );
136 
137                         if ( !validationReport.isModelValid() )
138                         {
139                             throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
140                         }
141                     }
142                 }
143 
144                 if ( this.isModulesProcessingRequested() )
145                 {
146                     validationReport = tool.validateModelObjects( context );
147 
148                     if ( validationReport != null )
149                     {
150                         this.logValidationReport( context, validationReport );
151 
152                         if ( !validationReport.isModelValid() )
153                         {
154                             throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
155                         }
156                     }
157                 }
158 
159                 suppressExceptionOnClose = false;
160             }
161             else
162             {
163                 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
164             }
165         }
166         catch ( final IOException e )
167         {
168             throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
169         }
170         catch ( final JAXBException e )
171         {
172             throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
173         }
174         catch ( final ModelException e )
175         {
176             throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
177         }
178         finally
179         {
180             try
181             {
182                 if ( classLoader != null )
183                 {
184                     classLoader.close();
185                 }
186             }
187             catch ( final IOException e )
188             {
189                 if ( suppressExceptionOnClose )
190                 {
191                     this.logMessage( Level.SEVERE, Messages.getMessage( e ), e );
192                 }
193                 else
194                 {
195                     throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
196                 }
197             }
198         }
199     }
200 
201     /**
202      * {@inheritDoc}
203      */
204     @Override
205     public ValidateClasspathTask clone()
206     {
207         return (ValidateClasspathTask) super.clone();
208     }
209 
210 }