in maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFaceletsTaglibsMojo.java [75:223]
public void execute() throws MojoExecutionException
{
try
{
// always add resources directory to project resource root
addResourceRoot(project, generatedResourcesDirectory.getCanonicalPath());
processIndex(project, resourcePath);
// taglibs map syntax requires distinct shortNames,
// which is a Good Thing!
for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
{
Map.Entry entry = (Map.Entry)i.next();
String shortName = (String)entry.getKey();
String namespaceURI = (String)entry.getValue();
FacesConfigBean facesConfig = getFacesConfig();
Iterator components = facesConfig.components();
components = new FilteredIterator(components, new SkipFilter());
components = new FilteredIterator(components, new ComponentTagLibraryFilter(namespaceURI, false));
Iterator validators = facesConfig.validators();
validators = new FilteredIterator(validators, new ValidatorTagLibraryFilter(namespaceURI, false));
Iterator converters = facesConfig.converters();
converters = new FilteredIterator(converters, new ConverterTagLibraryFilter(namespaceURI, false));
String targetPath = "META-INF/" + shortName + ".taglib.xml";
File targetFile = new File(generatedResourcesDirectory, targetPath);
String configPath = "META-INF/" + shortName + "-base.taglib.xml";
File configFile = new File(configSourceDirectory, configPath);
targetFile.delete();
if ((components.hasNext()||validators.hasNext()||converters.hasNext())
&& configFile.exists())
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
_writeStartTagLibrary(stream, _XINCLUDE_FACELETS_TAG_LIBRARY_DTD);
// base goes first
stream.writeStartElement("xi", "include",
XIncludeFilter.XINCLUDE_NAMESPACE);
stream.writeNamespace("xi", XIncludeFilter.XINCLUDE_NAMESPACE);
stream.writeAttribute("href", configFile.toURL().toExternalForm());
stream.writeAttribute("xpointer", "/facelet-taglib/*");
stream.writeEndElement();
_writeTags(components, validators, converters, stream);
_writeEndTagLibrary(stream);
stream.close();
InputStream mergedStream = new ByteArrayInputStream(out.toByteArray());
// expand all the xi:include elements
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
saxFactory.setNamespaceAware(true);
saxFactory.setValidating(false);
SAXParser saxParser = saxFactory.newSAXParser();
XMLReader mergedReader = saxParser.getXMLReader();
mergedReader = new XIncludeFilter(mergedReader, configFile.toURL());
// even with validating=false, DTD is still downloaded so that
// any entities contained in the document can be expanded.
// the following disables that behavior, also saving the time
// spent to parse the DTD
mergedReader.setEntityResolver(new EntityResolver()
{
public InputSource resolveEntity(
String publicId,
String systemId)
{
return new InputSource(new ByteArrayInputStream(new byte[0]));
}
});
InputSource mergedInput = new InputSource(mergedStream);
Source mergedSource = new SAXSource(mergedReader, mergedInput);
targetFile.delete();
targetFile.getParentFile().mkdirs();
Result mergedResult = new StreamResult(targetFile);
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer identity = transFactory.newTransformer();
identity.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
_FACELETS_TAG_LIBRARY_DOCTYPE_PUBLIC);
identity.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
_FACELETS_TAG_LIBRARY_DOCTYPE_SYSTEM);
identity.transform(mergedSource, mergedResult);
targetFile.setReadOnly();
}
else if (components.hasNext()||validators.hasNext()||converters.hasNext())
{
targetFile.getParentFile().mkdirs();
OutputStream out = new FileOutputStream(targetFile);
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
_writeStartTagLibrary(stream, _FACELETS_TAG_LIBRARY_DTD);
stream.writeCharacters("\n ");
stream.writeStartElement("namespace");
stream.writeCharacters(namespaceURI);
stream.writeEndElement();
_writeTags(components, validators, converters, stream);
_writeEndTagLibrary(stream);
stream.close();
}
else if (configFile.exists())
{
// copy if newer
if (configFile.lastModified() > targetFile.lastModified())
{
targetFile.delete();
targetFile.getParentFile().mkdirs();
FileUtils.copyFile(configFile, targetFile);
targetFile.setReadOnly();
}
}
getLog().info("Generated " + targetPath);
}
}
catch (XMLStreamException e)
{
throw new MojoExecutionException("Error during generation", e);
}
catch (SAXException e)
{
throw new MojoExecutionException("Error during generation", e);
}
catch (TransformerException e)
{
throw new MojoExecutionException("Error during generation", e);
}
catch (ParserConfigurationException e)
{
throw new MojoExecutionException("Error during generation", e);
}
catch (IOException e)
{
throw new MojoExecutionException("Error during generation", e);
}
}