/**
*
*/
//org.ajax4jsf.builder.xml;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* This class must read XML file from input stream and can extract body of root
* element for include into target in generation.
*
* @author shura
*
*/
public class XMLBody {
private Document xmlDocument;
private Element rootElement;
/**
* Load XML document and parse it into DOM.
*
* @param input
* @throws ParsingException
*/
public void loadXML(InputStream input) throws Exception {
try {
// Create Document Builder Factory
DocumentBuilderFactory docFactory = DocumentBuilderFactory
.newInstance();
docFactory.setValidating(false);
// Create Document Builder
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
docBuilder.isValidating();
// Disable loading of external Entityes
docBuilder.setEntityResolver(new EntityResolver() {
// Dummi resolver - alvays do nothing
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
return new InputSource(new StringReader(""));
}
});
// open and parse XML-file
xmlDocument = docBuilder.parse(input);
// Get Root xmlElement
rootElement = xmlDocument.getDocumentElement();
} catch (Exception e) {
throw new Exception("Error load XML ", e);
}
}
/**
* Check name of root element is as expected.
*
* @param name
* @return
*/
public boolean isRootName(String name) {
return rootElement.getNodeName().equals(name);
}
public String getDoctype() {
DocumentType doctype = xmlDocument.getDoctype();
if (null != doctype) {
return doctype.getName();
}
return null;
}
public String getPiblicId() {
DocumentType doctype = xmlDocument.getDoctype();
if (null != doctype) {
return doctype.getPublicId();
}
return null;
}
public String getRootTypeName() {
return rootElement.getSchemaTypeInfo().getTypeName();
}
public String getContent() throws Exception {
NodeList childNodes = rootElement.getChildNodes();
return serializeNodes(childNodes);
}
private String serializeNodes(NodeList childNodes) throws Exception {
DocumentFragment fragment = xmlDocument.createDocumentFragment();
for (int i = 0; i < childNodes.getLength(); i++) {
fragment.appendChild(childNodes.item(i).cloneNode(true));
}
try {
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty("omit-xml-declaration", "yes");
StringWriter out = new StringWriter();
StreamResult result = new StreamResult(out);
transformer.transform(new DOMSource(fragment), result);
return out.toString();
} catch (Exception e) {
throw new Exception(e);
}
}
public String getContent(String xpath) throws Exception{
XPath path = XPathFactory.newInstance().newXPath();
NodeList childNodes;
try {
childNodes = (NodeList) path.evaluate(xpath, xmlDocument,XPathConstants.NODESET);
} catch (XPathExpressionException e) {
throw new Exception("Error evaluate xpath",e);
}
return serializeNodes(childNodes);
}
}