/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki.util; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.jboss.seam.deployment.AbstractDeploymentHandler; import org.jboss.seam.deployment.DeploymentMetadata; import org.jboss.seam.deployment.FileDescriptor; import org.jboss.seam.util.DTDEntityResolver; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Map; import java.net.UnknownHostException; /** * Seam deployment handler, can be configured in seam-deployment.properties. * <p> * Supports scanning of files with <tt>getExtension()</tt>, returns them as dom4j * <tt>Element</tt> (the root element of each XML file). Override the * <tt>isSchemaValidating()</tt> method to force DTD/schema validation. * </p> * * @author Christian Bauer */ public abstract class XmlDeploymentHandler extends AbstractDeploymentHandler { Map<String, Element> elements; private DeploymentMetadata deploymentMetadata; public XmlDeploymentHandler() { deploymentMetadata = new DeploymentMetadata() { public String getFileNameSuffix() { return ".plugin.xml"; } }; } public DeploymentMetadata getMetadata() { return deploymentMetadata; } public abstract String getExtension(); public boolean isSchemaValidating() { return false; } public Map<String, Element> getDescriptorsAsXmlElements() { // Lazy access to streams if (elements == null) { elements = new HashMap<String, Element>(); for (FileDescriptor fileDescriptor : getResources()) { try { SAXReader saxReader = new SAXReader(); saxReader.setMergeAdjacentText(true); if (isSchemaValidating()) { saxReader.setEntityResolver(new DTDEntityResolver()); saxReader.setValidation(true); saxReader.setFeature("http://apache.org/xml/features/validation/schema",true); } elements.put(fileDescriptor.getName(), saxReader.read(fileDescriptor.getUrl().openStream()).getRootElement()); } catch (DocumentException dex) { Throwable nested = dex.getNestedException(); if (nested != null) { if (nested instanceof FileNotFoundException) { throw new RuntimeException( "Can't find schema/DTD reference for file: " + fileDescriptor.getName() + "': " + nested.getMessage(), dex ); } else if (nested instanceof UnknownHostException) { throw new RuntimeException( "Cannot connect to host from schema/DTD reference: " + nested.getMessage() + " - check that your schema/DTD reference is current", dex ); } } throw new RuntimeException("Could not parse XML file: " + fileDescriptor.getName() ,dex); } catch (Exception ex) { throw new RuntimeException("Could not parse XML file: " + fileDescriptor.getName() ,ex); } } } return elements; } }