/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com
This file is part of the sharpen open source java to c# translator.
sharpen is free software; you can redistribute it and/or modify it under
the terms of version 2 of the GNU General Public License as published
by the Free Software Foundation and as clarified by db4objects' GPL
interpretation policy, available at
http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
Suite 350, San Mateo, CA 94403, USA.
sharpen is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
package sharpen.core;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.w3c.dom.ls.*;
public class XmlDocumentationOverlay implements DocumentationOverlay {
private Document _document;
private LSSerializer _serializer;
private XPath _xpath;
public XmlDocumentationOverlay(String uri) {
_document = loadXML(uri);
}
public String forType(String fullName) {
return forXPath("/doc/type[@name='" + fullName + "']/doc");
}
public String forMember(String fullTypeName, String signature) {
return forXPath("/doc/type[@name='" + fullTypeName + "']/member[@name='" + signature + "']/doc");
}
private String forXPath(String xpath) {
Element found = selectElement(xpath);
if (null == found) return null;
return serializeContent(found);
}
private String serializeContent(Element e) {
return stripFirstAndLastLines(serializer().writeToString(e));
}
private String stripFirstAndLastLines(String s) {
int firstLineFeed = s.indexOf("\n");
int lastLineFeed = s.lastIndexOf("\n");
return s.substring(firstLineFeed+1, lastLineFeed);
}
private LSSerializer serializer() {
if (null != _serializer) return _serializer;
return _serializer = newSerializer();
}
private LSSerializer newSerializer() {
LSSerializer serializer = ((DOMImplementationLS)_document.getImplementation()).createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", Boolean.FALSE);
serializer.getDomConfig().setParameter("well-formed", Boolean.FALSE);
return serializer;
}
protected Element selectElement(String xpath) {
try {
return (Element)xpath().evaluate(xpath, _document, XPathConstants.NODE);
} catch (XPathExpressionException e) {
throw new RuntimeException(e);
}
}
private XPath xpath() {
if (null != _xpath) return _xpath;
return _xpath = newXPath();
}
private XPath newXPath() {
return XPathFactory.newInstance().newXPath();
}
private static Document loadXML(String uri) {
try {
return builderFactory().newDocumentBuilder().parse(uri);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static DocumentBuilderFactory builderFactory() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setNamespaceAware(true);
factory.setXIncludeAware(true);
return factory;
}
}