5454import com .igormaznitsa .jcp .context .CommentTextProcessor ;
5555import com .igormaznitsa .jcp .context .PreprocessingState ;
5656import com .igormaznitsa .jcp .context .PreprocessorContext ;
57+ import com .igormaznitsa .jcp .context .SpecialVariableProcessor ;
5758import com .igormaznitsa .jcp .directives .ExcludeIfDirectiveHandler ;
5859import com .igormaznitsa .jcp .exceptions .FilePositionInfo ;
5960import com .igormaznitsa .jcp .exceptions .PreprocessorException ;
8687 */
8788public final class JcpPreprocessor {
8889
89- private static final String PROPERTY_JCP_BASE_DIR = "jcp.base.dir" ;
90-
9190 static final CommandLineHandler [] COMMAND_LINE_HANDLERS = new CommandLineHandler [] {
9291 new HelpHandler (),
9392 new InCharsetHandler (),
@@ -113,6 +112,7 @@ public final class JcpPreprocessor {
113112 new AllowMergeBlockLineHandler (),
114113 new UnknownAsFalseHandler ()
115114 };
115+ private static final String PROPERTY_JCP_BASE_DIR = "jcp.base.dir" ;
116116 private final PreprocessorContext context ;
117117
118118 public JcpPreprocessor (final PreprocessorContext context ) {
@@ -224,41 +224,66 @@ public PreprocessorContext getContext() {
224224
225225
226226 public Statistics execute () throws IOException {
227- final long timeStart = System .currentTimeMillis ();
227+ this .context .getCommentTextProcessors ().forEach (x -> x .onContextStarted (this .context ));
228+ this .context .getMapVariableNameToSpecialVarProcessor ()
229+ .values ().forEach (x -> x .onContextStarted (this .context ));
228230
229- this .context .getActivatedConfigFiles ().addAll (processConfigFiles ());
231+ final long timeStart = System .currentTimeMillis ();
232+ Throwable throwable = null ;
233+ Statistics stat = null ;
234+ try {
235+ this .context .getActivatedConfigFiles ().addAll (processConfigFiles ());
230236
231- this .context .logInfo (String
232- .format ("File extensions: %s excluded %s" , this .context .getExtensions (),
233- this .context .getExcludeExtensions ()));
234- final List <PreprocessorContext .SourceFolder > srcFolders = this .context .getSources ();
235- this .context .logDebug ("Source folders: " + srcFolders );
237+ this .context .logInfo (String
238+ .format ("File extensions: %s excluded %s" , this .context .getExtensions (),
239+ this .context .getExcludeExtensions ()));
240+ final List <PreprocessorContext .SourceFolder > srcFolders = this .context .getSources ();
241+ this .context .logDebug ("Source folders: " + srcFolders );
236242
237- if (srcFolders .isEmpty ()) {
238- this .context .logWarning ("Source folder list is empty!" );
239- }
243+ if (srcFolders .isEmpty ()) {
244+ this .context .logWarning ("Source folder list is empty!" );
245+ }
240246
241- final Collection <FileInfoContainer > filesToBePreprocessed =
242- collectFilesToPreprocess (srcFolders , this .context .getExcludeFolders ());
243- this .context .addAllPreprocessedResources (filesToBePreprocessed );
247+ final Collection <FileInfoContainer > filesToBePreprocessed =
248+ collectFilesToPreprocess (srcFolders , this .context .getExcludeFolders ());
249+ this .context .addAllPreprocessedResources (filesToBePreprocessed );
244250
245- final List <PreprocessingState .ExcludeIfInfo > excludedIf =
246- processGlobalDirectives (filesToBePreprocessed );
251+ final List <PreprocessingState .ExcludeIfInfo > excludedIf =
252+ processGlobalDirectives (filesToBePreprocessed );
247253
248- processFileExclusion (excludedIf );
249- if (!this .context .isDryRun ()) {
250- createTargetFolder ();
251- } else {
252- this .context .logInfo ("Dry run mode is ON" );
254+ processFileExclusion (excludedIf );
255+ if (!this .context .isDryRun ()) {
256+ createTargetFolder ();
257+ } else {
258+ this .context .logInfo ("Dry run mode is ON" );
259+ }
260+ stat = preprocessFiles (filesToBePreprocessed );
261+ } catch (Throwable ex ) {
262+ throwable = ex ;
263+ if (ex instanceof IOException ) {
264+ throw (IOException ) ex ;
265+ }
266+ } finally {
267+ try {
268+ for (final CommentTextProcessor p : this .context .getCommentTextProcessors ()) {
269+ p .onContextStopped (this .context , throwable );
270+ }
271+ } finally {
272+ for (final SpecialVariableProcessor p : this .context .getMapVariableNameToSpecialVarProcessor ()
273+ .values ()) {
274+ p .onContextStopped (this .context , throwable );
275+ }
276+ }
277+ }
278+ if (stat != null ) {
279+ final long elapsedTime = System .currentTimeMillis () - timeStart ;
280+ this .context .logInfo ("-----------------------------------------------------------------" );
281+ this .context .logInfo (String
282+ .format ("Preprocessed %d files, copied %d files, ignored %d files, elapsed time %d ms" ,
283+ stat .getPreprocessed (), stat .getCopied (), stat .getExcluded (), elapsedTime ));
253284 }
254- final Statistics stat = preprocessFiles (filesToBePreprocessed );
255-
256- final long elapsedTime = System .currentTimeMillis () - timeStart ;
257- this .context .logInfo ("-----------------------------------------------------------------" );
258- this .context .logInfo (String
259- .format ("Preprocessed %d files, copied %d files, ignored %d files, elapsed time %d ms" ,
260- stat .getPreprocessed (), stat .getCopied (), stat .getExcluded (), elapsedTime ));
261285 return stat ;
286+
262287 }
263288
264289 private void processFileExclusion (final List <PreprocessingState .ExcludeIfInfo > foundExcludeIf ) {
0 commit comments