1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 package org.jomc.ant;
32
33 import java.io.File;
34 import java.io.IOException;
35 import java.util.logging.Level;
36 import javax.xml.bind.JAXBContext;
37 import javax.xml.bind.JAXBException;
38 import javax.xml.bind.util.JAXBSource;
39 import javax.xml.transform.Source;
40 import org.apache.tools.ant.BuildException;
41 import org.jomc.model.Implementation;
42 import org.jomc.model.Module;
43 import org.jomc.model.Specification;
44 import org.jomc.modlet.Model;
45 import org.jomc.modlet.ModelContext;
46 import org.jomc.modlet.ModelException;
47 import org.jomc.modlet.ModelValidationReport;
48 import org.jomc.modlet.ObjectFactory;
49 import org.jomc.tools.ClassFileProcessor;
50
51
52
53
54
55
56
57 public final class ValidateClassesTask extends ClassFileProcessorTask
58 {
59
60
61 private File classesDirectory;
62
63
64 public ValidateClassesTask()
65 {
66 super();
67 }
68
69
70
71
72
73
74
75
76 public File getClassesDirectory()
77 {
78 return this.classesDirectory;
79 }
80
81
82
83
84
85
86
87
88 public void setClassesDirectory( final File value )
89 {
90 this.classesDirectory = value;
91 }
92
93
94 @Override
95 public void preExecuteTask() throws BuildException
96 {
97 super.preExecuteTask();
98
99 this.assertNotNull( "classesDirectory", this.getClassesDirectory() );
100 }
101
102
103
104
105
106
107 @Override
108 public void processClassFiles() throws BuildException
109 {
110 ProjectClassLoader classLoader = null;
111 boolean suppressExceptionOnClose = true;
112
113 try
114 {
115 this.log( Messages.getMessage( "validatingModelObjects", this.getModel() ) );
116
117 classLoader = this.newProjectClassLoader();
118 final ModelContext context = this.newModelContext( classLoader );
119 final ClassFileProcessor tool = this.newClassFileProcessor();
120 final JAXBContext jaxbContext = context.createContext( this.getModel() );
121 final Model model = this.getModel( context );
122 final Source source = new JAXBSource( jaxbContext, new ObjectFactory().createModel( model ) );
123 ModelValidationReport validationReport = context.validateModel( this.getModel(), source );
124
125 this.logValidationReport( context, validationReport );
126 tool.setModel( model );
127
128 if ( validationReport.isModelValid() )
129 {
130 final Specification s = this.getSpecification( model );
131 final Implementation i = this.getImplementation( model );
132 final Module m = this.getModule( model );
133
134 if ( s != null )
135 {
136 validationReport = tool.validateModelObjects( s, context, this.getClassesDirectory() );
137
138 if ( validationReport != null )
139 {
140 this.logValidationReport( context, validationReport );
141
142 if ( !validationReport.isModelValid() )
143 {
144 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
145 }
146 }
147 }
148
149 if ( i != null )
150 {
151 validationReport = tool.validateModelObjects( i, context, this.getClassesDirectory() );
152
153 if ( validationReport != null )
154 {
155 this.logValidationReport( context, validationReport );
156
157 if ( !validationReport.isModelValid() )
158 {
159 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
160 }
161 }
162 }
163
164 if ( m != null )
165 {
166 validationReport = tool.validateModelObjects( m, context, this.getClassesDirectory() );
167
168 if ( validationReport != null )
169 {
170 this.logValidationReport( context, validationReport );
171
172 if ( !validationReport.isModelValid() )
173 {
174 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
175 }
176 }
177 }
178
179 if ( this.isModulesProcessingRequested() )
180 {
181 validationReport = tool.validateModelObjects( context, this.getClassesDirectory() );
182
183 if ( validationReport != null )
184 {
185 this.logValidationReport( context, validationReport );
186
187 if ( !validationReport.isModelValid() )
188 {
189 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
190 }
191 }
192 }
193
194 suppressExceptionOnClose = false;
195 }
196 else
197 {
198 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
199 }
200 }
201 catch ( final IOException e )
202 {
203 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
204 }
205 catch ( final JAXBException e )
206 {
207 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
208 }
209 catch ( final ModelException e )
210 {
211 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
212 }
213 finally
214 {
215 try
216 {
217 if ( classLoader != null )
218 {
219 classLoader.close();
220 }
221 }
222 catch ( final IOException e )
223 {
224 if ( suppressExceptionOnClose )
225 {
226 this.logMessage( Level.SEVERE, Messages.getMessage( e ), e );
227 }
228 else
229 {
230 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
231 }
232 }
233 }
234 }
235
236
237 @Override
238 public ValidateClassesTask clone()
239 {
240 final ValidateClassesTask clone = (ValidateClassesTask) super.clone();
241 clone.classesDirectory =
242 this.classesDirectory != null ? new File( this.classesDirectory.getAbsolutePath() ) : null;
243
244 return clone;
245 }
246
247 }