/** * Returns list of mapped files, that should be transformed. Files can by specified via attributes * (srcFile, srcDir) or resources (FileSet, FileList, DirSet, etc). Mapped file represents input * and output file for transformation. * * @return list of mapped files */ public List<MappedFile> getMappedFiles() { mappedFiles.clear(); // one src file if (getSrcFile() != null) { addMappedFile(getSrcFile()); } if (getSrcDir() != null) { addMappedFile(getSrcDir()); } Iterator element = resources.iterator(); while (element.hasNext()) { ResourceCollection rc = (ResourceCollection) element.next(); if (rc instanceof FileSet && rc.isFilesystemOnly()) { FileSet fs = (FileSet) rc; File fromDir = fs.getDir(getProject()); DirectoryScanner ds; try { ds = fs.getDirectoryScanner(getProject()); } catch (BuildException ex) { log("Could not scan directory " + fromDir, ex, Project.MSG_ERR); continue; } for (String f : ds.getIncludedFiles()) { addMappedFile(new File(fromDir + System.getProperty("file.separator") + f), fromDir); } } else { if (!rc.isFilesystemOnly()) { log("Only filesystem resources are supported", Project.MSG_WARN); continue; } Iterator rcIt = rc.iterator(); while (rcIt.hasNext()) { Resource r = (Resource) rcIt.next(); if (!r.isExists()) { log("Could not find resource " + r.toLongString(), Project.MSG_VERBOSE); continue; } if (r instanceof FileResource) { FileResource fr = (FileResource) r; addMappedFile(fr.getFile(), fr.getBaseDir()); } else { log( "Only file resources are supported (" + r.getClass().getSimpleName() + " found)", Project.MSG_WARN); continue; } } } } return mappedFiles; }
/** * Protected method for simplyfied addinng of mapped files * * @param file file to add * @param baseDir base directory for file */ protected void addMappedFile(File file, File baseDir) { if (file.isFile()) { if (baseDir == null) { baseDir = file.getParentFile(); } MappedFile mappedFile = new MappedFile(); mappedFile.setFrom(file); String filename = file.getName(); String[] names = getMapper().mapFileName(filename); // we don't use original filename if no mapping is available if (names == null || names.length == 0) { return; } File newFile = new File(file.getParent() + System.getProperty("file.separator") + names[0]); if (getDestDir() != null) { try { newFile = new File( newFile .getCanonicalPath() .replace(baseDir.getCanonicalPath(), getDestDir().getCanonicalPath())); } catch (IOException ex) { log("Couldn't map file", ex, Project.MSG_WARN); return; } } mappedFile.setTo(newFile); mappedFiles.add(mappedFile); } else if (file.isDirectory()) { if (baseDir == null) { baseDir = file; } DirectoryScanner ds = new DirectoryScanner(); ds.setBasedir(file); ds.scan(); for (String fileName : ds.getIncludedFiles()) { addMappedFile(new File(file + System.getProperty("file.separator") + fileName), baseDir); } } }
/** * Add resource collection * * @param rc resource collection to add */ public void add(ResourceCollection rc) { resources.add(rc); }
/** * Main entry point for this task. It creates transformation specified by classname attribute, * passes all parameters and executes it. * * @throws BuildException if an error occured */ @Override public void execute() throws BuildException { if (getClassname() == null) { throw new BuildException("Classname of transformation is not set."); } if (getSrcFile() != null && getSrcDir() != null) { throw new BuildException("Both srcFile and srcDir were set."); } if (getDestFile() != null && getDestDir() != null) { throw new BuildException("Both destFile and destDir were set."); } if (!resources.isEmpty() && (getSrcFile() != null || getSrcDir() != null)) { throw new BuildException("Resources can't be combined with srcFile or srcDir."); } initClassloader(); try { TransformationLoader loader = new TransformationLoader(Thread.currentThread().getContextClassLoader()); Transformation transObj = null; try { transObj = loader.getInstance(getClassname()); } catch (InstantiationException ex) { throw new BuildException("Transformation couldn't be instanciated", ex); } catch (IllegalAccessException ex) { throw new BuildException("Transformation couldn't be accessed", ex); } if (transObj == null) { throw new BuildException("Transformation " + getClassname() + " couldn't be loaded"); } List<MappedFile> files = getMappedFiles(); if (files.isEmpty()) { log( "No files specified, " + transObj.getClass().getSimpleName() + " skipped", Project.MSG_INFO); return; } for (MappedFile mf : files) { log("Mapped file " + mf.getFrom() + " to " + mf.getTo(), Project.MSG_VERBOSE); } transObj.setParam("baseDir", getProject().getBaseDir().getPath()); transObj.setMappedFiles(files); transObj.setParams(parameters); for (String key : parameters.keySet()) log( "Parsed parameter " + key + " = " + parameters.get(key) + " (" + parameters.get(key).getClass().getName() + ")", Project.MSG_VERBOSE); try { log( "Executing transformation " + transObj.getClass().getSimpleName() + " on " + mappedFiles.size() + " files"); transObj.execute(); } catch (TransformationException ex) { log("Transformation has failed", ex, Project.MSG_ERR); if (isFailonerror()) { throw new BuildException("Transformation has failed.", ex); } } } finally { restoreClassloader(); } }