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.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
52
53
54
55
56 public final class ValidateClasspathTask extends ClassFileProcessorTask
57 {
58
59
60 public ValidateClasspathTask()
61 {
62 super();
63 }
64
65
66
67
68
69
70 @Override
71 public void processClassFiles() throws BuildException
72 {
73 ProjectClassLoader classLoader = null;
74 boolean suppressExceptionOnClose = true;
75
76 try
77 {
78 this.log( Messages.getMessage( "validatingClasspath", this.getModel() ) );
79
80 classLoader = this.newProjectClassLoader();
81 final ModelContext context = this.newModelContext( classLoader );
82 final ClassFileProcessor tool = this.newClassFileProcessor();
83 final JAXBContext jaxbContext = context.createContext( this.getModel() );
84 final Model model = this.getModel( context );
85 final Source source = new JAXBSource( jaxbContext, new ObjectFactory().createModel( model ) );
86 ModelValidationReport validationReport = context.validateModel( this.getModel(), source );
87
88 this.logValidationReport( context, validationReport );
89 tool.setModel( model );
90
91 if ( validationReport.isModelValid() )
92 {
93 final Specification s = this.getSpecification( model );
94 final Implementation i = this.getImplementation( model );
95 final Module m = this.getModule( model );
96
97 if ( s != null )
98 {
99 validationReport = tool.validateModelObjects( s, context );
100 this.logValidationReport( context, validationReport );
101
102 if ( !validationReport.isModelValid() )
103 {
104 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
105 }
106 }
107
108 if ( i != null )
109 {
110 validationReport = tool.validateModelObjects( i, context );
111 this.logValidationReport( context, validationReport );
112
113 if ( !validationReport.isModelValid() )
114 {
115 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
116 }
117 }
118
119 if ( m != null )
120 {
121 validationReport = tool.validateModelObjects( m, context );
122 this.logValidationReport( context, validationReport );
123
124 if ( !validationReport.isModelValid() )
125 {
126 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
127 }
128 }
129
130 if ( this.isModulesProcessingRequested() )
131 {
132 validationReport = tool.validateModelObjects( context );
133 this.logValidationReport( context, validationReport );
134
135 if ( !validationReport.isModelValid() )
136 {
137 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
138 }
139 }
140
141 suppressExceptionOnClose = false;
142 }
143 else
144 {
145 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
146 }
147 }
148 catch ( final IOException e )
149 {
150 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
151 }
152 catch ( final JAXBException e )
153 {
154 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
155 }
156 catch ( final ModelException e )
157 {
158 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
159 }
160 finally
161 {
162 try
163 {
164 if ( classLoader != null )
165 {
166 classLoader.close();
167 }
168 }
169 catch ( final IOException e )
170 {
171 if ( suppressExceptionOnClose )
172 {
173 this.logMessage( Level.SEVERE, Messages.getMessage( e ), e );
174 }
175 else
176 {
177 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
178 }
179 }
180 }
181 }
182
183
184 @Override
185 public ValidateClasspathTask clone()
186 {
187 return (ValidateClasspathTask) super.clone();
188 }
189
190 }