package org.jboss.seam.maven.helper; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import org.apache.maven.plugin.logging.Log; import org.w3c.dom.Element; /** * * Generates JSF taglib descriptor for all FacesConverter annotated classes * * @author Rafael Benevides <https://community.jboss.org/people/rafabene> * @author Marek Novotny <https://community.jboss.org/people/manaRH> * */ public class ConverterGenerator { private List<File> converterSources = new ArrayList<File>(); private Log log; private String sourceDirectory; private String targetDirectory; public ConverterGenerator(String sourceDirectory, String targetDirectory, Log log) { this.sourceDirectory = sourceDirectory; this.targetDirectory = targetDirectory; this.log = log; } public void addFile(File file) throws FileNotFoundException { if (fileIsConverterSource(file)) { converterSources.add(file); } } private boolean fileIsConverterSource(File file) throws FileNotFoundException { if (file.getName().endsWith(".java")) { Scanner scanner = new Scanner(file); String find = scanner.findWithinHorizon("@FacesConverter", 0); if (find != null) { log.info("Identified " + file.getName() + " as Converter source code"); return true; } } return false; } public void generateConverters() throws Exception { log.info("Generating Converters"); XMLGenerator xmlGenerator = new XMLGenerator(log); File outXML = new File(targetDirectory + "/generated-sources/main/resources/META-INF", "s.taglib.xml"); List<Element> tagsToAdd = new ArrayList<Element>(); for (File source : converterSources) { String classFromSource = source.getAbsolutePath().replace(sourceDirectory, "").replace(File.separatorChar, '.').replace(".java", "").substring(1); File facesConfigXML = findCorrespondentConfig(classFromSource); if (facesConfigXML != null) { Element tag = xmlGenerator.getFaceletsTagElementFromFacesconfig(facesConfigXML, facesConfigXML.getName().replace(".xml", ""), "converter"); tagsToAdd.add(tag); } } xmlGenerator.updateFile(outXML, tagsToAdd); } private File findCorrespondentConfig(String classFromSource) throws FileNotFoundException { String whereToFind = sourceDirectory.replace("/java", "/config/component"); log.debug("Searching correspondent config for " + classFromSource + " in " + whereToFind); File componentFolder = new File(whereToFind); for (File f : componentFolder.listFiles()) { // Search only files if (f.isFile()) { Scanner scanner = new Scanner(f); String find = scanner.findWithinHorizon(classFromSource, 0); if (find != null) { return f; } } } return null; } }