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 this.logValidationReport( context, validationReport );
138
139 if ( !validationReport.isModelValid() )
140 {
141 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
142 }
143 }
144
145 if ( i != null )
146 {
147 validationReport = tool.validateModelObjects( i, context, this.getClassesDirectory() );
148 this.logValidationReport( context, validationReport );
149
150 if ( !validationReport.isModelValid() )
151 {
152 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
153 }
154 }
155
156
157 if ( m != null )
158 {
159 validationReport = tool.validateModelObjects( m, context, this.getClassesDirectory() );
160 this.logValidationReport( context, validationReport );
161
162 if ( !validationReport.isModelValid() )
163 {
164 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
165 }
166 }
167
168 if ( this.isModulesProcessingRequested() )
169 {
170 validationReport = tool.validateModelObjects( context, this.getClassesDirectory() );
171 this.logValidationReport( context, validationReport );
172
173 if ( !validationReport.isModelValid() )
174 {
175 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
176 }
177 }
178
179 suppressExceptionOnClose = false;
180 }
181 else
182 {
183 throw new ModelException( Messages.getMessage( "invalidModel", this.getModel() ) );
184 }
185 }
186 catch ( final IOException e )
187 {
188 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
189 }
190 catch ( final JAXBException e )
191 {
192 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
193 }
194 catch ( final ModelException e )
195 {
196 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
197 }
198 finally
199 {
200 try
201 {
202 if ( classLoader != null )
203 {
204 classLoader.close();
205 }
206 }
207 catch ( final IOException e )
208 {
209 if ( suppressExceptionOnClose )
210 {
211 this.logMessage( Level.SEVERE, Messages.getMessage( e ), e );
212 }
213 else
214 {
215 throw new ClassProcessingException( Messages.getMessage( e ), e, this.getLocation() );
216 }
217 }
218 }
219 }
220
221
222 @Override
223 public ValidateClassesTask clone()
224 {
225 final ValidateClassesTask clone = (ValidateClassesTask) super.clone();
226 clone.classesDirectory =
227 this.classesDirectory != null ? new File( this.classesDirectory.getAbsolutePath() ) : null;
228
229 return clone;
230 }
231
232 }