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.IOException;
34 import java.io.InputStream;
35 import java.net.HttpURLConnection;
36 import java.net.SocketTimeoutException;
37 import java.net.URISyntaxException;
38 import java.net.URL;
39 import java.net.URLConnection;
40 import java.util.HashSet;
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.Unmarshaller;
46 import javax.xml.transform.Source;
47 import javax.xml.transform.stream.StreamSource;
48 import org.apache.tools.ant.BuildException;
49 import org.apache.tools.ant.Project;
50 import org.jomc.ant.types.KeyValueType;
51 import org.jomc.ant.types.ModuleResourceType;
52 import org.jomc.ant.types.ResourceType;
53 import org.jomc.model.Module;
54 import org.jomc.model.Modules;
55 import org.jomc.model.modlet.DefaultModelProcessor;
56 import org.jomc.model.modlet.DefaultModelProvider;
57 import org.jomc.model.modlet.DefaultModelValidator;
58 import org.jomc.model.modlet.ModelHelper;
59 import org.jomc.modlet.Model;
60 import org.jomc.modlet.ModelContext;
61 import org.jomc.modlet.ModelException;
62 import org.jomc.tools.modlet.ToolsModelProcessor;
63 import org.jomc.tools.modlet.ToolsModelProvider;
64
65
66
67
68
69
70
71 public class JomcModelTask extends JomcTask
72 {
73
74
75
76
77 private boolean modelObjectClasspathResolutionEnabled = true;
78
79
80
81
82 private String moduleLocation;
83
84
85
86
87 private String transformerLocation;
88
89
90
91
92 private Set<ModuleResourceType> moduleResources;
93
94
95
96
97 private boolean modelResourceValidationEnabled = true;
98
99
100
101
102 private boolean javaValidationEnabled = true;
103
104
105
106
107 public JomcModelTask()
108 {
109 super();
110 }
111
112
113
114
115
116
117
118
119 public final String getModuleLocation()
120 {
121 return this.moduleLocation;
122 }
123
124
125
126
127
128
129
130
131 public final void setModuleLocation( final String value )
132 {
133 this.moduleLocation = value;
134 }
135
136
137
138
139
140
141
142
143 public final String getTransformerLocation()
144 {
145 return this.transformerLocation;
146 }
147
148
149
150
151
152
153
154
155 public final void setTransformerLocation( final String value )
156 {
157 this.transformerLocation = value;
158 }
159
160
161
162
163
164
165
166
167 public final boolean isModelObjectClasspathResolutionEnabled()
168 {
169 return this.modelObjectClasspathResolutionEnabled;
170 }
171
172
173
174
175
176
177
178
179
180 public final void setModelObjectClasspathResolutionEnabled( final boolean value )
181 {
182 this.modelObjectClasspathResolutionEnabled = value;
183 }
184
185
186
187
188
189
190
191
192
193
194
195
196
197 public Set<ModuleResourceType> getModuleResources()
198 {
199 if ( this.moduleResources == null )
200 {
201 this.moduleResources = new HashSet<ModuleResourceType>();
202 }
203
204 return this.moduleResources;
205 }
206
207
208
209
210
211
212
213
214 public ModuleResourceType createModuleResource()
215 {
216 final ModuleResourceType moduleResource = new ModuleResourceType();
217 this.getModuleResources().add( moduleResource );
218 return moduleResource;
219 }
220
221
222
223
224
225
226
227
228 public final boolean isModelResourceValidationEnabled()
229 {
230 return this.modelResourceValidationEnabled;
231 }
232
233
234
235
236
237
238
239
240
241 public final void setModelResourceValidationEnabled( final boolean value )
242 {
243 this.modelResourceValidationEnabled = value;
244 }
245
246
247
248
249
250
251
252
253
254
255 public final boolean isJavaValidationEnabled()
256 {
257 return this.javaValidationEnabled;
258 }
259
260
261
262
263
264
265
266
267
268
269 public final void setJavaValidationEnabled( final boolean value )
270 {
271 this.javaValidationEnabled = value;
272 }
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 @Override
290 public Model getModel( final ModelContext context ) throws BuildException, ModelException
291 {
292 if ( context == null )
293 {
294 throw new NullPointerException( "context" );
295 }
296
297 Model model = new Model();
298 model.setIdentifier( this.getModel() );
299 Modules modules = new Modules();
300 ModelHelper.setModules( model, modules );
301 Unmarshaller unmarshaller = null;
302
303 for ( final ResourceType resource : this.getModuleResources() )
304 {
305 final URL[] urls = this.getResources( context, resource.getLocation() );
306
307 if ( urls.length == 0 )
308 {
309 if ( resource.isOptional() )
310 {
311 this.logMessage( Level.WARNING, Messages.getMessage( "moduleResourceNotFound",
312 resource.getLocation() ) );
313
314 }
315 else
316 {
317 throw new BuildException( Messages.getMessage( "moduleResourceNotFound", resource.getLocation() ),
318 this.getLocation() );
319
320 }
321 }
322
323 for ( int i = urls.length - 1; i >= 0; i-- )
324 {
325 URLConnection con = null;
326 InputStream in = null;
327
328 try
329 {
330 this.logMessage( Level.FINEST, Messages.getMessage( "reading", urls[i].toExternalForm() ) );
331
332 con = urls[i].openConnection();
333 con.setConnectTimeout( resource.getConnectTimeout() );
334 con.setReadTimeout( resource.getReadTimeout() );
335 con.connect();
336 in = con.getInputStream();
337
338 final Source source = new StreamSource( in, urls[i].toURI().toASCIIString() );
339
340 if ( unmarshaller == null )
341 {
342 unmarshaller = context.createUnmarshaller( this.getModel() );
343 if ( this.isModelResourceValidationEnabled() )
344 {
345 unmarshaller.setSchema( context.createSchema( this.getModel() ) );
346 }
347 }
348
349 Object o = unmarshaller.unmarshal( source );
350 if ( o instanceof JAXBElement<?> )
351 {
352 o = ( (JAXBElement<?>) o ).getValue();
353 }
354
355 if ( o instanceof Module )
356 {
357 modules.getModule().add( (Module) o );
358 }
359 else
360 {
361 this.log( Messages.getMessage( "unsupportedModuleResource", urls[i].toExternalForm() ),
362 Project.MSG_WARN );
363
364 }
365
366 in.close();
367 in = null;
368 }
369 catch ( final SocketTimeoutException e )
370 {
371 String message = Messages.getMessage( e );
372 message = Messages.getMessage( "resourceTimeout", message != null ? " " + message : "" );
373
374 if ( resource.isOptional() )
375 {
376 this.getProject().log( message, e, Project.MSG_WARN );
377 }
378 else
379 {
380 throw new BuildException( message, e, this.getLocation() );
381 }
382 }
383 catch ( final IOException e )
384 {
385 String message = Messages.getMessage( e );
386 message = Messages.getMessage( "resourceFailure", message != null ? " " + message : "" );
387
388 if ( resource.isOptional() )
389 {
390 this.getProject().log( message, e, Project.MSG_WARN );
391 }
392 else
393 {
394 throw new BuildException( message, e, this.getLocation() );
395 }
396 }
397 catch ( final URISyntaxException e )
398 {
399 throw new BuildException( Messages.getMessage( e ), e, this.getLocation() );
400 }
401 catch ( final JAXBException e )
402 {
403 String message = Messages.getMessage( e );
404 if ( message == null )
405 {
406 message = Messages.getMessage( e.getLinkedException() );
407 }
408
409 throw new BuildException( message, e, this.getLocation() );
410 }
411 finally
412 {
413 try
414 {
415 if ( in != null )
416 {
417 in.close();
418 }
419 }
420 catch ( final IOException e )
421 {
422 this.logMessage( Level.SEVERE, Messages.getMessage( e ), e );
423 }
424 finally
425 {
426 if ( con instanceof HttpURLConnection )
427 {
428 ( (HttpURLConnection) con ).disconnect();
429 }
430 }
431 }
432 }
433 }
434
435 model = context.findModel( model );
436 modules = ModelHelper.getModules( model );
437
438 if ( modules != null && this.isModelObjectClasspathResolutionEnabled() )
439 {
440 final Module classpathModule =
441 modules.getClasspathModule( Modules.getDefaultClasspathModuleName(), context.getClassLoader() );
442
443 if ( classpathModule != null && modules.getModule( Modules.getDefaultClasspathModuleName() ) == null )
444 {
445 modules.getModule().add( classpathModule );
446 }
447 }
448
449 if ( this.isModelProcessingEnabled() )
450 {
451 model = context.processModel( model );
452 }
453
454 return model;
455 }
456
457
458
459
460 @Override
461 public void preExecuteTask() throws BuildException
462 {
463 super.preExecuteTask();
464 this.assertLocationsNotNull( this.getModuleResources() );
465 }
466
467
468
469
470 @Override
471 public ModelContext newModelContext( final ClassLoader classLoader ) throws ModelException
472 {
473 final ModelContext modelContext = super.newModelContext( classLoader );
474
475 if ( this.getTransformerLocation() != null )
476 {
477 modelContext.setAttribute( DefaultModelProcessor.TRANSFORMER_LOCATION_ATTRIBUTE_NAME,
478 this.getTransformerLocation() );
479
480 }
481
482 if ( this.getModuleLocation() != null )
483 {
484 modelContext.setAttribute( DefaultModelProvider.MODULE_LOCATION_ATTRIBUTE_NAME, this.getModuleLocation() );
485 }
486
487 modelContext.setAttribute( ToolsModelProvider.MODEL_OBJECT_CLASSPATH_RESOLUTION_ENABLED_ATTRIBUTE_NAME,
488 this.isModelObjectClasspathResolutionEnabled() );
489
490 modelContext.setAttribute( ToolsModelProcessor.MODEL_OBJECT_CLASSPATH_RESOLUTION_ENABLED_ATTRIBUTE_NAME,
491 this.isModelObjectClasspathResolutionEnabled() );
492
493 modelContext.setAttribute( DefaultModelProvider.VALIDATING_ATTRIBUTE_NAME,
494 this.isModelResourceValidationEnabled() );
495
496 modelContext.setAttribute( DefaultModelValidator.VALIDATE_JAVA_ATTRIBUTE_NAME, this.isJavaValidationEnabled() );
497
498 for ( int i = 0, s0 = this.getModelContextAttributes().size(); i < s0; i++ )
499 {
500 final KeyValueType kv = this.getModelContextAttributes().get( i );
501 final Object object = kv.getObject( this.getLocation() );
502
503 if ( object != null )
504 {
505 modelContext.setAttribute( kv.getKey(), object );
506 }
507 else
508 {
509 modelContext.clearAttribute( kv.getKey() );
510 }
511 }
512
513 return modelContext;
514 }
515
516
517
518
519 @Override
520 public JomcModelTask clone()
521 {
522 final JomcModelTask clone = (JomcModelTask) super.clone();
523
524 if ( this.moduleResources != null )
525 {
526 clone.moduleResources = new HashSet<ModuleResourceType>( this.moduleResources.size() );
527 for ( final ModuleResourceType e : this.moduleResources )
528 {
529 clone.moduleResources.add( e.clone() );
530 }
531 }
532
533 return clone;
534 }
535
536 }