package org.tigris.juxy.verifier; 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.FileSet; import org.apache.xml.resolver.CatalogManager; import org.apache.xml.resolver.tools.CatalogResolver; import org.tigris.juxy.Version; import javax.xml.transform.URIResolver; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * @author Pavel Sher */ public class VerifierTask extends MatchingTask implements ErrorReporter { private boolean failOnError = true; private Catalog catalog; private Factory factory; public void execute() throws BuildException { info("XSLT Verifier version " + Version.VERSION + " by Pavel Sher (pavelsher@tigris.org)"); List files = findFiles(); Verifier verifier = new VerifierImpl(); verifier.setFiles(files); verifier.setErrorReporter(this); if (catalog != null) verifier.setURIResolver(createCatalogResolver()); if (factory != null) verifier.setTransformerFactory(factory.getFactoryClassName()); if (!verifier.verify(failOnError) && failOnError) throw new BuildException("Verification failed"); int notVerifiedNum = verifier.getNumberOfNotVerifiedFiles(); if (notVerifiedNum > 0) info(notVerifiedNum + " stylesheet(s) were not verified due to errors"); } private URIResolver createCatalogResolver() { String catalogs = catalog.getCatalogFiles(); CatalogManager cm = CatalogManager.getStaticManager(); cm.setCatalogFiles(toResolverFileList(catalogs)); cm.setIgnoreMissingProperties(true); //cm.setVerbosity(10); return new CatalogResolver(cm); } private String toResolverFileList(String catalogs) { StringBuffer catalogFiles = new StringBuffer(100); StringTokenizer st = new StringTokenizer(catalogs, ","); while (st.hasMoreTokens()) { catalogFiles.append(st.nextToken().trim()).append(";"); } return catalogFiles.toString(); } private List findFiles() { List files = new ArrayList(20); DirectoryScanner scanner = getDirectoryScanner(); scanner.scan(); String[] filesPaths = scanner.getIncludedFiles(); for (int i = 0; i < filesPaths.length; i++) { files.add(new File(scanner.getBasedir(), filesPaths[i])); } return files; } public void setFailOnError(boolean failOnError) { this.failOnError = failOnError; } private DirectoryScanner getDirectoryScanner() { return fileset.getDirectoryScanner(getProject()); } public void setDir(String dir) { this.fileset.setDir(new File(getProject().getBaseDir(), dir)); } public void addFileSet(FileSet fs) { this.fileset = fs; } public void addConfiguredCatalog(Catalog catalog) { if (catalog.getCatalogFiles() == null || catalog.getCatalogFiles().length() == 0) throw new BuildException("Attribute catalogfiles is required for catalog"); this.catalog = catalog; } public void addConfiguredFactory(Factory factory) { if (factory.getFactoryClassName() == null || factory.getFactoryClassName().length() == 0) throw new BuildException("Attribute name is required for factory"); this.factory = factory; } public void info(String message) { log(message); } public void error(String message) { log("ERROR: " + message); } public void warning(String message) { log("WARNING: " + message); } }