blob: cf49c2787cf56d5bcd79f6b39d5063ab2da521d0 [file] [log] [blame]
/**
*
* Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.xbean.spring.generator;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
/**
* @author Dain Sundstrom
* @version $Id$
* @since 1.0
*/
public class DocumentationGenerator implements GeneratorPlugin {
private final File destFile;
private final LogFacade log;
public DocumentationGenerator(LogFacade log, File destFile) {
this.destFile = destFile;
this.log = log;
}
public void generate(NamespaceMapping namespaceMapping) throws IOException {
String namespace = namespaceMapping.getNamespace();
// TODO can only handle 1 schema document so far...
File file = new File(destFile.getParentFile(), destFile.getName() + ".html");
log.log("Generating HTML documentation file: " + file + " for namespace: " + namespace);
PrintWriter out = new PrintWriter(new FileWriter(file));
try {
generateDocumentation(out, namespaceMapping);
} finally {
out.close();
}
}
private void generateDocumentation(PrintWriter out, NamespaceMapping namespaceMapping) {
String namespace = namespaceMapping.getNamespace();
out.println("<!-- NOTE: this file is autogenerated by XBeans -->");
out.println("<html>");
out.println("<head>");
out.println("<title>Schema for namespace: " + namespace + "</title>");
out.println("<link rel='stylesheet' href='style.css' type='text/css'>");
out.println("<link rel='stylesheet' href='http://activemq.org/style.css' type='text/css'>");
out.println("<link rel='stylesheet' href='http://activemq.org/style-xb.css' type='text/css'>");
out.println("</head>");
out.println();
out.println("<body>");
out.println();
generateRootElement(out, namespaceMapping);
generateElementsSummary(out, namespaceMapping);
out.println();
out.println();
generateElementsDetail(out, namespaceMapping);
out.println();
out.println("</body>");
out.println("</html>");
}
private void generateRootElement(PrintWriter out, NamespaceMapping namespaceMapping) {
ElementMapping rootElement = namespaceMapping.getRootElement();
if (rootElement != null) {
out.println("<h1>Root Element</h1>");
out.println("<table>");
out.println(" <tr><th>Element</th><th>Description</th><th>Class</th>");
generateElementSummary(out, rootElement);
out.println("</table>");
out.println();
}
}
private void generateElementsSummary(PrintWriter out, NamespaceMapping namespaceMapping) {
out.println("<h1>Element Summary</h1>");
out.println("<table>");
out.println(" <tr><th>Element</th><th>Description</th><th>Class</th>");
for (Iterator iter = namespaceMapping.getElements().iterator(); iter.hasNext();) {
ElementMapping element = (ElementMapping) iter.next();
generateElementSummary(out, element);
}
out.println("</table>");
}
private void generateElementSummary(PrintWriter out, ElementMapping element) {
out.println(" <tr>" +
"<td><a href='#" + element.getElementName() + "'>" + element.getElementName() + "</a></td>" +
"<td>" + element.getDescription() + "</td>" +
"<td>" + element.getClassName() + "</td></tr>");
}
private void generateElementsDetail(PrintWriter out, NamespaceMapping namespaceMapping) {
out.println("<h1>Element Detail</h1>");
for (Iterator iter = namespaceMapping.getElements().iterator(); iter.hasNext();) {
ElementMapping element = (ElementMapping) iter.next();
generateHtmlElementDetail(out, namespaceMapping, element);
}
}
private void generateHtmlElementDetail(PrintWriter out, NamespaceMapping namespaceMapping, ElementMapping element) {
out.println("<h2>Element: <a name='" + element.getElementName() + "'>" + element.getElementName() + "</a></h2>");
boolean hasAttributes = false;
boolean hasElements = false;
for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext() && (!hasAttributes || !hasElements);) {
AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
Type type = attributeMapping.getType();
if (Utils.isSimpleType(type)) {
hasAttributes = true;
} else {
hasElements = true;
}
}
if (hasAttributes) {
out.println("<table>");
out.println(" <tr><th>Attribute</th><th>Type</th><th>Description</th>");
for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext();) {
AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
Type type = attributeMapping.getType();
if (Utils.isSimpleType(type)) {
out.println(" <tr><td>" + attributeMapping.getAttributeName() + "</td><td>" + Utils.getXsdType(type)
+ "</td><td>" + attributeMapping.getDescription() + "</td></tr>");
}
}
out.println("</table>");
}
if (hasElements) {
out.println("<table>");
out.println(" <tr><th>Element</th><th>Type</th><th>Description</th>");
for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext();) {
AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
Type type = attributeMapping.getType();
if (!Utils.isSimpleType(type)) {
out.print(" <tr><td>" + attributeMapping.getAttributeName() + "</td><td>");
printComplexPropertyTypeDocumentation(out, namespaceMapping, type);
out.println("</td><td>" + attributeMapping.getDescription() + "</td></tr>");
}
}
out.println("</table>");
}
}
private void printComplexPropertyTypeDocumentation(PrintWriter out, NamespaceMapping namespaceMapping, Type type) {
if (type.isCollection()) {
out.print("(");
}
List types;
if (type.isCollection()) {
types = Utils.findImplementationsOf(namespaceMapping, type.getNestedType());
} else {
types = Utils.findImplementationsOf(namespaceMapping, type);
}
for (Iterator iterator = types.iterator(); iterator.hasNext();) {
ElementMapping element = (ElementMapping) iterator.next();
out.print("<a href='#" + element.getElementName() + "'>" + element.getElementName() + "</a>");
if (iterator.hasNext()) {
out.print(" | ");
}
}
if (types.size() == 0) {
out.print("&lt;spring:bean/&gt;");
}
if (type.isCollection()) {
out.print(")*");
}
}
}