package org.drools.contrib; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.drools.builder.ResourceType; import org.drools.compiler.DroolsParserException; import org.drools.io.ResourceFactory; import org.drools.verifier.Verifier; import org.drools.verifier.builder.VerifierBuilderFactory; import org.drools.verifier.data.VerifierReport; import org.drools.verifier.report.VerifierReportWriter; import org.drools.verifier.report.VerifierReportWriterFactory; public class DroolsVerifierAntTask extends MatchingTask { public static final String DRLFILEEXTENSION = ".drl"; private File srcdir; private File toFile; private Path classpath; /** * Source directory to read DRL files from * * @param directory */ public void setSrcDir(File directory) { this.srcdir = directory; } /** * File to serialize the rulebase to * * @param toFile */ public void setToFile(File toFile) { this.toFile = toFile; } /** * The classpath to use when compiling the rulebase * * @param classpath */ public void setClasspath(Path classpath) { createClasspath().append( classpath ); } /** * Classpath to use, by reference, when compiling the rulebase * * @param r * a reference to an existing classpath */ public void setClasspathref(Reference r) { createClasspath().setRefid( r ); } /** * Adds a path to the classpath. * * @return created classpath */ public Path createClasspath() { if ( this.classpath == null ) { this.classpath = new Path( getProject() ); } return this.classpath.createPath(); } /** * Task's main method */ public void execute() throws BuildException { super.execute(); // checking parameters are set if ( toFile == null ) { throw new BuildException( "Destination rulebase file does not specified." ); } // checking parameters are set if ( srcdir == null ) { throw new BuildException( "Source directory not specified." ); } if ( !srcdir.exists() ) { throw new BuildException( "Source directory does not exists." + srcdir.getAbsolutePath() ); } try { // create a specialized classloader Verifier droolsanalyzer = VerifierBuilderFactory.newVerifierBuilder().newVerifier(); // get the list of files to be added to the rulebase String[] fileNames = getFileList(); for ( int i = 0; i < fileNames.length; i++ ) { compileAndAnalyzeFile( droolsanalyzer, fileNames[i] ); } droolsanalyzer.fireAnalysis(); VerifierReport result = droolsanalyzer.getResult(); VerifierReportWriter vReportWriter = VerifierReportWriterFactory.newHTMLReportWriter(); File path = new File( toFile, "report.zip" ); OutputStream out = new FileOutputStream( path ); vReportWriter.writeReport( out, result ); System.out.println( "Writing verifier report to " + path ); } catch ( Exception e ) { System.out.println( e.getMessage() ); throw new BuildException( "RuleBaseTask failed: " + e.getMessage(), e ); } } private void compileAndAnalyzeFile(Verifier droolsVerifier, String filename) throws DroolsParserException { // Verifier just works with drl files if ( !filename.endsWith( DroolsVerifierAntTask.DRLFILEEXTENSION ) ) { throw new UnsupportedOperationException(); } droolsVerifier.addResourcesToVerify( ResourceFactory.newFileResource( new File( srcdir.getAbsolutePath(), filename ) ), ResourceType.DRL ); } /** * Returns the list of files to be added into the rulebase * * @return */ private String[] getFileList() { // scan source directory for rule files DirectoryScanner directoryScanner = getDirectoryScanner( srcdir ); String[] fileNames = directoryScanner.getIncludedFiles(); if ( fileNames == null || fileNames.length <= 0 ) { throw new BuildException( "No rule files found in include directory." ); } return fileNames; } }