Skip to content

Commit

Permalink
ISPN-7073 Update XSDoc tool
Browse files Browse the repository at this point in the history
- support complexTypes with choice children
- update the Google Analytics tracking code
- generate docs only for the latest version of each namespace
- output using html format instead of XML to avoid corruption of empty tags
  • Loading branch information
tristantarrant authored and slaskawi committed Oct 6, 2016
1 parent 2d15a49 commit bd1772b
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 43 deletions.
107 changes: 76 additions & 31 deletions tools/src/main/java/org/infinispan/tools/xsd/XSDoc.java
@@ -1,32 +1,55 @@
package org.infinispan.tools.xsd;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import gnu.getopt.Getopt;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.LinkedHashMap;
import java.util.Map;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XSDoc {

import gnu.getopt.Getopt;
public class Schema {
final String namespace;
final String name;
final Document doc;
final int major;
final int minor;

public Schema(Document doc, String name) {
this.name = name;
this.doc = doc;
String versionedNamespace = getDocumentNamespace(doc);
int versionSeparator = versionedNamespace.lastIndexOf(':');
namespace = versionedNamespace.substring(0, versionSeparator);
String[] versionParts = versionedNamespace.substring(versionSeparator + 1).split("\\.");
major = Integer.parseInt(versionParts[0]);
minor = Integer.parseInt(versionParts[1]);
}

public boolean since(Schema schema) {
return (schema ==null) || (this.major > schema.major) || ((this.major == schema.major) && (this.minor >= schema.minor));
}
}

private final Map<String, Document> xmls = new LinkedHashMap<>();
private final Map<String, Schema> latestSchemas = new LinkedHashMap<>();

public class XSDoc {
private final Map<String, Document> xmls = new HashMap<String, Document>();
private final Transformer xslt;
private final DocumentBuilder docBuilder;
private final Document indexDoc;
Expand All @@ -35,15 +58,12 @@ public class XSDoc {

XSDoc() throws Exception {
factory = TransformerFactory.newInstance();
factory.setURIResolver(new URIResolver() {
@Override
public Source resolve(String href, String base) throws TransformerException {
Document doc = xmls.get(getBaseFileName(href));
if (doc != null) {
return new DOMSource(doc);
} else {
return null;
}
factory.setURIResolver((href, base) -> {
Document doc = xmls.get(getBaseFileName(href));
if (doc != null) {
return new DOMSource(doc);
} else {
return null;
}
});
ClassLoader cl = XSDoc.class.getClassLoader();
Expand All @@ -58,15 +78,40 @@ public Source resolve(String href, String base) throws TransformerException {
indexDoc.appendChild(indexRoot);
}

void transform(String fileName, File outputDir) throws Exception {
void load(String fileName) throws Exception {
Document doc = docBuilder.parse(new File(fileName));
String name = getBaseFileName(fileName);
xmls.put(name, doc);
xslt.transform(new DOMSource(doc), new StreamResult(new File(outputDir, name + ".html")));
Element item = indexDoc.createElement("file");
item.setAttribute("name", name + ".html");
item.setAttribute("ns", ((Element)doc.getFirstChild()).getAttribute("targetNamespace"));
indexRoot.appendChild(item);
Schema schema = new Schema(doc, name);
Schema current = latestSchemas.get(schema.namespace);
if (schema.since(current)) {
latestSchemas.put(schema.namespace, schema);
}
}

private void transform(String name, Document doc, File outputDir) {
try {
xslt.transform(new DOMSource(doc), new StreamResult(new File(outputDir, name + ".html")));
Element item = indexDoc.createElement("file");
item.setAttribute("name", name + ".html");
String ns = getDocumentNamespace(doc);
item.setAttribute("ns", ns);
indexRoot.appendChild(item);
} catch (TransformerException e) {
throw new RuntimeException(e);
}
}

public static String getDocumentNamespace(Document doc) {
Node child = doc.getFirstChild();
while (!(child instanceof Element)) child = child.getNextSibling();
return ((Element)child).getAttribute("targetNamespace");
}

void transformAll(File outputDir) {
latestSchemas.values().forEach(schema -> {
transform(schema.name, schema.doc, outputDir);
});
}

private void generateIndex(File outputDir) throws Exception {
Expand Down Expand Up @@ -111,9 +156,9 @@ public static void main(String argv[]) throws Exception {
File outDir = new File(outputDir);
outDir.mkdirs();
for (int i = opts.getOptind(); i < argv.length; i++) {
xsDoc.transform(argv[i], outDir);
xsDoc.load(argv[i]);
}

xsDoc.transformAll(outDir);
xsDoc.generateIndex(outDir);
}

Expand Down
14 changes: 12 additions & 2 deletions tools/src/main/resources/xsd/index.xslt
Expand Up @@ -8,17 +8,27 @@
<title>
Infinispan Configuration Schemas
</title>
<meta charset="UTF-8" />
<style>
body { font-family: 'sans-serif'; }
a { text-decoration: none; color: #4477aa; }
a:hover { color: white; background: #4477aa; }
</style>
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-8601422-4', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<h1>
Infinispan Configuration Schemas
</h1>

<ul>
<xsl:apply-templates select="file" />
</ul>
Expand All @@ -34,4 +44,4 @@
</a>
</li>
</xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>
43 changes: 33 additions & 10 deletions tools/src/main/resources/xsd/xsdoc.xslt
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" exclude-result-prefixes="xs html">
<xsl:output method="xml" encoding="ISO-8859-1" standalone="yes" version="1.0" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" />
<xsl:output method="html" encoding="ISO-8859-1" standalone="yes" version="1.0" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" />

<xsl:key name="simpleTypes" match="/xs:schema/xs:simpleType" use="@name"/>
<xsl:key name="complexTypes" match="/xs:schema/xs:complexType" use="@name"/>
Expand Down Expand Up @@ -41,8 +41,16 @@
padding: 0.5em;
}
</style>
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-8601422-4', 'auto');
ga('send', 'pageview');
</script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js">
//
</script>
<script type="text/javascript">
$(document).ready(function() {
Expand Down Expand Up @@ -79,8 +87,17 @@
<p><xsl:apply-templates select="xs:annotation" /></p>
<xsl:choose>
<xsl:when test="@type">
<xsl:variable name="ref" select="substring-after(string(@type), ':')" />
<xsl:apply-templates select="key('complexTypes',$ref)" />
<xsl:variable name="ref">
<xsl:choose>
<xsl:when test="contains(string(@type), ':')">
<xsl:value-of select="substring-after(string(@type), ':')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="string(@type)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:apply-templates select="key('complexTypes', $ref)" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="xs:complexType" />
Expand All @@ -104,8 +121,8 @@
<xsl:apply-templates select="xs:attribute" />
</table>
</xsl:if>
<xsl:if test="xs:all | xs:sequence | xs:complexContent">
<xsl:apply-templates select="xs:all | xs:sequence | xs:complexContent" />
<xsl:if test="xs:all | xs:sequence | xs:complexContent | xs:choice">
<xsl:apply-templates select="xs:all | xs:sequence | xs:complexContent | xs:choice" />
</xsl:if>
</xsl:template>

Expand All @@ -130,8 +147,6 @@
<xsl:if test="xs:all | xs:sequence | xs:complexContent">
<xsl:apply-templates select="xs:all | xs:sequence | xs:complexContent" />
</xsl:if>
<xsl:variable name="ns" select="substring-before(string(@base), ':')" />
<xsl:variable name="ref" select="substring-after(string(@base), ':')" />
<div>
<xsl:apply-templates select="/xs:schema" mode="lookup-type">
<xsl:with-param name="type" select="string(@base)" />
Expand All @@ -141,8 +156,16 @@

<xsl:template match="xs:schema" mode="lookup-type">
<xsl:param name="type" />
<xsl:variable name="ns" select="substring-before(string($type), ':')" />
<xsl:variable name="ref" select="substring-after(string($type), ':')" />
<xsl:variable name="ref">
<xsl:choose>
<xsl:when test="contains(string($type), ':')">
<xsl:value-of select="substring-after(string($type), ':')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="string($type)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="key('complexTypes',$ref)">
<xsl:apply-templates select="key('complexTypes',$ref)" />
Expand Down

0 comments on commit bd1772b

Please sign in to comment.