Author: sshafroi
Date: 2008-03-27 14:11:22 +0100 (Thu, 27 Mar 2008)
New Revision: 6280
Added:
branches/2.16/mojo/src/main/java/no/sesat/mojo/ModesRestrictionsGenerator.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/Builder.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAbstract.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAttribute.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigElement.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateDTD.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateFile.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateRelaxNG.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateXSD.java
branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/NameFilter.java
Modified:
branches/2.16/mojo/pom.xml
Log:
Added DTD, XML Schema and Relax NG generator for modes.xml files. This
generator is based on JavaDoc.
Modified: branches/2.16/mojo/pom.xml
===================================================================
--- branches/2.16/mojo/pom.xml 2008-03-27 12:04:40 UTC (rev 6279)
+++ branches/2.16/mojo/pom.xml 2008-03-27 13:11:22 UTC (rev 6280)
@@ -91,4 +91,25 @@
<scope>compile</scope>
</dependency>
</dependencies>
+
+ <profiles>
+ <profile>
+ <id>default-tools.jar</id>
+ <activation>
+ <property>
+ <name>java.vendor</name>
+ <value>Sun Microsystems Inc.</value>
+ </property>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>com.sun</groupId>
+ <artifactId>tools</artifactId>
+ <version>1.5</version>
+ <scope>system</scope>
+ <systemPath>${java.home}/../lib/tools.jar</systemPath>
+ </dependency>
+ </dependencies>
+ </profile>
+ </profiles>
</project>
Added:
branches/2.16/mojo/src/main/java/no/sesat/mojo/ModesRestrictionsGenerator.java
===================================================================
---
branches/2.16/mojo/src/main/java/no/sesat/mojo/ModesRestrictionsGenerator.java
(rev 0)
+++
branches/2.16/mojo/src/main/java/no/sesat/mojo/ModesRestrictionsGenerator.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,83 @@
+package no.sesat.mojo;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import no.sesat.mojo.modes.Builder;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * @goal modesRestrictionsGenerator
+ */
+public class ModesRestrictionsGenerator extends AbstractMojo {
+
+ /**
+ * The maven project.
+ *
+ * @parameter expression="${project}"
+ * @required
+ * @readonly
+ * @description "the maven project to use"
+ */
+ private MavenProject project;
+
+ /**
+ * Classpath
+ *
+ * @parameter
+ */
+ private List<String> classpaths;
+
+ /**
+ * Output directory
+ *
+ * @parameter
+ */
+ private String outputDir;
+
+ public void execute() throws MojoExecutionException {
+ getLog().info(this.getClass().getName());
+
+ if (classpaths == null)
+ getLog().error("classpaths variable must be spesified");
+
+ if (outputDir == null)
+ getLog().error("outputDir variable must be spesified");
+
+ String classpath = "";
+ for (Iterator<String> iterator = classpaths.iterator();
iterator.hasNext();) {
+ String name = (String) iterator.next();
+ File file = new File(name);
+ if (!file.isAbsolute()) {
+ file = new File(project.getBasedir(), name);
+ }
+ if (file.exists()) {
+ try {
+ classpath += file.getCanonicalPath() +
File.separator;
+ } catch (IOException e) {
+ getLog().warn(e);
+ }
+ if (iterator.hasNext())
+ classpath += File.pathSeparator;
+ } else {
+ getLog().warn("Classpath not found : " +
file.getAbsolutePath());
+ }
+ }
+
+ File outputDirFile = new File(outputDir);
+ if (!outputDirFile.isAbsolute())
+ outputDirFile = new File(project.getBasedir(),
outputDir);
+
+ outputDir = outputDirFile.getAbsolutePath();
+
+ getLog().info("Using: classpath = " + classpath);
+ getLog().info("Using: outputDir = " + outputDir);
+
+ Builder.Build(classpath, outputDir);
+ }
+}
\ No newline at end of file
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/Builder.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/Builder.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/Builder.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,226 @@
+package no.sesat.mojo.modes;
+
+import static com.sun.tools.javac.code.Flags.PROTECTED;
+import static com.sun.tools.javac.code.Flags.PUBLIC;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import com.sun.javadoc.ClassDoc;
+import com.sun.javadoc.RootDoc;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.ListBuffer;
+import com.sun.tools.javac.util.Options;
+import com.sun.tools.javadoc.JavadocTool;
+import com.sun.tools.javadoc.Messager;
+import com.sun.tools.javadoc.ModifierFilter;
+import com.sun.tools.javadoc.RootDocImpl;
+
+public class Builder {
+
+ private static String outputDir = "";
+
+ // testing
+ public static void main(String args[]) {
+ List<String> classpaths = new Vector<String>();
+
classpaths.add("/home/haavard/dev/trunk/genericno.sesam.no/search-command-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/genericno.sesam.no/query-transform-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/genericno.sesam.no/result-handler-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat-kernel/generic.sesam/search-command-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat.kernel/generic.sesam/query-transform-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat-kernel/generic.sesam/result-handler-config/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat-kernel/query-transform-config-spi/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat-kernel/result-handler-config-spi/src/main/java/");
+
classpaths.add("/home/haavard/dev/trunk/sesat-kernel/search-command-config-spi/src/main/java/");
+
+ String classpath = "";
+ for (Iterator<String> iterator = classpaths.iterator();
iterator.hasNext();) {
+ classpath += (String) iterator.next();
+ if (iterator.hasNext())
+ classpath += File.pathSeparator;
+ }
+
+ Build(classpath, "/home/haavard/wonk");
+ }
+
+ public static void Build(String classpath, String outputDir) {
+ Builder.outputDir = new File(outputDir).getAbsolutePath() +
File.separator;
+
+ // hack to supress javadoc's warnings.
+ PrintStream out = System.out;
+ PrintStream err = System.err;
+ System.setOut(new PrintStream(new ByteArrayOutputStream()));
+ System.setErr(new PrintStream(new ByteArrayOutputStream()));
+
+ Context context = new Context();
+ Messager.preRegister(context, "Builder");
+ JavadocTool comp = JavadocTool.make0(context);
+
+ ListBuffer<String> subPackages = new ListBuffer<String>();
+ subPackages.append("no");
+ ListBuffer<String> xcludePackages = new ListBuffer<String>();
+ ListBuffer<String> javaNames = new ListBuffer<String>();
+ ListBuffer<String[]> options = new ListBuffer<String[]>();
+
+ Options compOpts = Options.instance(context);
+ compOpts.put("-classpath", classpath);
+
+ RootDocImpl root = null;
+ try {
+ root = comp.getRootDocImpl("", "", new
ModifierFilter(PUBLIC | PROTECTED), javaNames.toList(), options.toList(),
false, subPackages.toList(),
+ xcludePackages.toList(), false, false,
false);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ System.setOut(out);
+ System.setErr(err);
+
+ if (root != null)
+ start(root);
+ }
+
+ /**
+ * This is the entry point for a doclet.
+ *
+ * @param root
+ * @return
+ */
+ public static boolean start(RootDoc root) {
+
+ ConfigElement defaultConvert = new
ConfigElement("default-convert");
+ defaultConvert.attributes.add(new ConfigAttribute("name"));
+ defaultConvert.attributes.add(new ConfigAttribute("prefix"));
+ defaultConvert.attributes.add(new ConfigAttribute("postfix"));
+
+ Vector<ConfigElement> commands = new Vector<ConfigElement>();
+ Vector<ConfigElement> resultHandlers = new
Vector<ConfigElement>();
+ Vector<ConfigElement> queryTransformers = new
Vector<ConfigElement>();
+ {
+ ClassDoc[] classes = root.classes();
+ for (int i = 0; i < classes.length; i++) {
+ String name = classes[i].name();
+ if (name.endsWith("Config") &&
!classes[i].isAbstract()) {
+ ConfigElement element = new
ConfigElement(classes[i]);
+
+ if (name.endsWith("CommandConfig")) {
+ element.applyNameFilter(new
NameFilter() {
+ public String
filter(String name) {
+ name =
name.substring(0, name.lastIndexOf("Config"));
+ String res =
toXmlName(name);
+ return res;
+ }
+ });
+ commands.add(element);
+ } else if
(name.endsWith("ResultHandlerConfig")) {
+ element.applyNameFilter(new
NameFilter() {
+ public String
filter(String name) {
+ name =
name.substring(0, name.lastIndexOf("ResultHandlerConfig"));
+ String res =
toXmlName(name);
+ return res;
+ }
+ });
+ if (!element.name.isEmpty())
+
resultHandlers.add(element);
+ } else if
(name.endsWith("QueryTransformer") ||
(name.endsWith("QueryTransformerConfig"))) {
+ element.applyNameFilter(new
NameFilter() {
+ public String
filter(String name) {
+ name =
name.substring(0, name.lastIndexOf("QueryTransformer"));
+ String res =
toXmlName(name);
+ return res;
+ }
+ });
+
+ if
(name.equals("NewsCaseQueryTransformerConfig")) {
+
element.addChild(defaultConvert);
+ }
+
+ queryTransformers.add(element);
+ } else {
+ System.out.println("Lost: " +
element.name);
+ }
+ }
+ }
+ }
+
+ ConfigElement modes = new ConfigElement("modes");
+ modes.attributes.add(new ConfigAttribute("template-prefix"));
+
+ ConfigElement mode = new ConfigElement("mode");
+ mode.attributes.add(new ConfigAttribute("id"));
+ mode.attributes.add(new ConfigAttribute("inherit"));
+ mode.attributes.add(new ConfigAttribute("analysis"));
+
+ mode.addChildren(commands);
+ modes.addChild(mode);
+
+ ConfigElement resultHandler = new
ConfigElement("result-handlers");
+ resultHandler.addChildren(resultHandlers);
+
+ ConfigElement queryTransform = new
ConfigElement("query-transformers");
+ queryTransform.addChildren(queryTransformers);
+
+ ConfigElement navigators = new ConfigElement("navigators");
+ ConfigElement navigator = new ConfigElement("navigator");
+ navigator.attributes.add(new ConfigAttribute("id", null, true));
+ navigator.attributes.add(new ConfigAttribute("name", null,
true));
+ navigator.attributes.add(new ConfigAttribute("field", null,
true));
+ navigator.attributes.add(new ConfigAttribute("display-name",
null, true));
+ navigator.attributes.add(new ConfigAttribute("sort", null,
false));
+ navigator.attributes.add(new ConfigAttribute("boundary-match"));
+
+ // only for fast commands
+ navigators.addChild(navigator);
+
+ for (ConfigElement command : commands) {
+ command.addChild(resultHandler);
+ command.addChild(queryTransform);
+ command.addChild(navigators);
+ }
+
+ Runnable jobs[] = { new GenerateRelaxNG(modes, outputDir +
"modes.rnc"), new GenerateXSD(modes, outputDir + "modes.xsd"),
+ new GenerateDTD(modes, outputDir + "modes.dtd")
};
+ int jobCount = 5;
+ for (int i = 0; i < (jobs.length + jobCount - 1); i++) {
+
+ if (i < jobs.length) {
+ // System.out.println("start job: " + i);
+ Thread thread = new Thread(jobs[i]);
+ thread.start();
+ jobs[i] = thread;
+ }
+ if (i >= (jobCount - 1)) {
+ try {
+ ((Thread) jobs[i - jobCount +
1]).join();
+ // System.out.println("job done: " + (i
- jobCount + 1));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ System.out.println("commands : " + commands.size());
+ System.out.println("result handlers : " +
resultHandlers.size());
+ System.out.println("query transformers : " +
queryTransformers.size());
+
+ return true;
+ }
+
+ public static String toXmlName(final String beanName) {
+ final StringBuilder xmlName = new StringBuilder(beanName);
+ for (int i = 0; i < xmlName.length(); ++i) {
+ final char c = xmlName.charAt(i);
+ if (Character.isUpperCase(c)) {
+ xmlName.replace(i, i + 1, (i == 0 ? "" : "-") +
Character.toLowerCase(c));
+ ++i;
+ }
+ }
+ return xmlName.toString();
+ }
+}
\ No newline at end of file
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAbstract.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAbstract.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAbstract.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,10 @@
+package no.sesat.mojo.modes;
+
+public class ConfigAbstract {
+ protected String doc;
+ protected String name;
+
+ public boolean hasDoc() {
+ return (doc != null && doc.trim().isEmpty() == false);
+ }
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAttribute.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAttribute.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigAttribute.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,41 @@
+package no.sesat.mojo.modes;
+
+import com.sun.javadoc.MethodDoc;
+
+public class ConfigAttribute extends ConfigAbstract {
+ protected String type = "CDATA";
+ protected boolean required = false;
+
+ public ConfigAttribute(MethodDoc method) {
+ doc = parseDoc(method);
+
+ name = Builder.toXmlName(method.name()).substring(4);
+ type = "CDATA"; // method.parameters()[0].toString();
+ }
+
+ protected ConfigAttribute(String name) {
+ this.name = name;
+ }
+
+ protected ConfigAttribute(String name, String doc) {
+ this.name = name;
+ this.doc = doc;
+ }
+
+ protected ConfigAttribute(String name, String doc, boolean required) {
+ this.name = name;
+ this.doc = doc;
+ this.required = required;
+ }
+
+ private String parseDoc(MethodDoc method) {
+ if (method == null)
+ return null;
+ if (method.commentText().contains("[EMAIL PROTECTED]"))
+ return parseDoc(method.overriddenMethod());
+ else
+ return method.commentText();
+
+ }
+
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigElement.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigElement.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/ConfigElement.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,72 @@
+package no.sesat.mojo.modes;
+
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import com.sun.javadoc.ClassDoc;
+import com.sun.javadoc.MethodDoc;
+import com.sun.javadoc.Parameter;
+
+public class ConfigElement extends ConfigAbstract {
+
+ final protected List<ConfigAttribute> attributes = new
Vector<ConfigAttribute>();
+ final private Set<String> attribNames = new TreeSet<String>();
+ final protected int id;
+ private static int idCounter = 0;
+
+ protected List<ConfigElement> children = new Vector<ConfigElement>();
+
+ public ConfigElement(String name) {
+ id = ++idCounter;
+ this.name = name;
+ }
+
+ public ConfigElement(ClassDoc klass) {
+ this(klass.name());
+
+ doc = klass.commentText();
+
+ // some fake attributes
+ attributes.add(new ConfigAttribute("id", "fix doc", true));
+ attributes.add(new ConfigAttribute("inherit"));
+ attributes.add(new ConfigAttribute("result-fields"));
+ attributes.add(new ConfigAttribute("field-filters"));
+ attributes.add(new ConfigAttribute("collections"));
+ build(klass);
+ }
+
+ public void applyNameFilter(NameFilter filter) {
+ name = filter.filter(name);
+ }
+
+ public void addChildren(List<ConfigElement> children) {
+ this.children.addAll(children);
+ }
+
+ public void addChild(ConfigElement child) {
+ this.children.add(child);
+ }
+
+ private void build(ClassDoc klass) {
+
+ if (klass != null) {
+ MethodDoc[] methods = klass.methods();
+ for (int i = 0; i < methods.length; i++) {
+
+ MethodDoc methodDoc = methods[i];
+
+ if (!attribNames.contains(methodDoc.name()) &&
methodDoc.name().startsWith("set")) {
+ Parameter parameters[] =
methodDoc.parameters();
+ if (parameters.length == 1) {
+
attribNames.add(methodDoc.name());
+ attributes.add(new
ConfigAttribute(methodDoc));
+
+ }
+ }
+ }
+ build(klass.superclass());
+ }
+ }
+}
\ No newline at end of file
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateDTD.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateDTD.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateDTD.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,77 @@
+package no.sesat.mojo.modes;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class GenerateDTD extends GenerateFile implements Runnable {
+
+ private final ConfigElement root;
+ private final String fileName;
+ private Set<String> written = new TreeSet<String>();
+
+ public GenerateDTD(ConfigElement element, String name) {
+ fileName = name;
+ root = element;
+ }
+
+ public void run() {
+ init(fileName);
+ println("<?xml version='1.0' encoding='UTF-8'?>\n");
+ generate(root);
+ done();
+ }
+
+ private void generate(ConfigElement element) {
+ if (written.add(element.name)) {
+
+ if (element.hasDoc())
+ println("<!-- " + element.doc + " -->");
+
+ print("<!ELEMENT " + element.name);
+ if (element.children.isEmpty())
+ print(" EMPTY");
+ else {
+ print(" (");
+ for (int i = 0; i < element.children.size();
i++) {
+ if (i > 0)
+ print("|");
+ print(element.children.get(i).name);
+ ;
+ }
+ print(")*");
+ }
+ println(">");
+
+ generate(element.attributes);
+ printlnI("<!ATTLIST " + element.name + " ");
+ for (Iterator<ConfigAttribute> iterator =
element.attributes.iterator(); iterator.hasNext();) {
+ ConfigAttribute attrib = (ConfigAttribute)
iterator.next();
+ print(attrib.name + " ");
+ generate(attrib);
+ }
+ printlnU(">");
+
+ for (int i = 0; i < element.children.size(); i++) {
+ generate(element.children.get(i));
+ }
+ }
+ }
+
+ private void generate(ConfigAttribute attrib) {
+ println(attrib.type + " " + (attrib.required ? "#REQUIRED" :
"#IMPLIED"));
+ }
+
+ private void generate(List<ConfigAttribute> attributes) {
+ println("<!--");
+ for (Iterator<ConfigAttribute> iterator =
attributes.iterator(); iterator.hasNext();) {
+ ConfigAttribute attrib = (ConfigAttribute)
iterator.next();
+ print(" @attr " + attrib.name);
+ if (attrib.hasDoc())
+ print(" " + attrib.doc);
+ println("");
+ }
+ println("-->");
+ }
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateFile.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateFile.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateFile.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,65 @@
+package no.sesat.mojo.modes;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+
+public abstract class GenerateFile {
+
+ private PrintStream stream;
+ private int depth = 0;
+ private boolean indent = true;
+
+ private File file;
+
+ protected void init(String name) {
+ file = new File(name);
+
+ try {
+ stream = new PrintStream(file);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void indent() {
+ depth++;
+ }
+
+ protected void unindent() {
+ depth--;
+ if (depth < 0)
+ throw new RuntimeException("Indenting below zero");
+ }
+
+ protected void printlnI(String string) {
+ println(string);
+ depth++;
+ }
+
+ protected void printlnU(String string) {
+ depth--;
+ println(string);
+ }
+
+ protected void print(String string) {
+ if (indent)
+ for (int i = 1; i <= depth; i++) {
+ stream.print(" ");
+ }
+ stream.print(string);
+ indent = false;
+ }
+
+ protected void println(String string) {
+ print(string += "\n");
+ indent = true;
+ }
+
+ protected void done() {
+ if (depth != 0)
+ throw new RuntimeException("Indenting not balanced.");
+
+ System.out.println("Written file: " + file);
+ }
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateRelaxNG.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateRelaxNG.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateRelaxNG.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,72 @@
+package no.sesat.mojo.modes;
+
+import java.util.Iterator;
+
+public class GenerateRelaxNG extends GenerateFile implements Runnable {
+
+ private final ConfigElement root;
+ private final String fileName;
+
+ public GenerateRelaxNG(ConfigElement element, String name) {
+ fileName = name;
+ root = element;
+ }
+
+ public void run() {
+ init(fileName);
+ generate(root);
+ done();
+ }
+
+ private void generate(ConfigElement element) {
+
+ if (element.hasDoc()) {
+ String[] docArray = element.doc.split("\n");
+ for (int i = 0; i < docArray.length; i++) {
+ println("## " + docArray[i]);
+ }
+ }
+
+ println("element " + element.name + " {");
+ indent();
+ if (element.attributes.isEmpty() && element.children.isEmpty())
{
+ print(" empty ");
+ } else {
+ for (Iterator<ConfigAttribute> iterator =
element.attributes.iterator(); iterator.hasNext();) {
+ ConfigAttribute attrib = (ConfigAttribute)
iterator.next();
+
+ generate(attrib);
+ if (iterator.hasNext() ||
!element.children.isEmpty()) {
+ println(",");
+ } else {
+ println("");
+ }
+ }
+ }
+
+ if (!element.children.isEmpty()) {
+ println("(");
+ for (int i = 0; i < element.children.size(); i++) {
+ if (i > 0) {
+ println("|");
+ }
+ generate(element.children.get(i));
+ }
+ println(")*");
+ }
+ unindent();
+ println("}*");
+
+ }
+
+ private void generate(ConfigAttribute attrib) {
+ if (attrib.hasDoc()) {
+ String[] docArray = attrib.doc.split("\n");
+ for (int i = 0; i < docArray.length; i++) {
+ println("## " + docArray[i]);
+ }
+ }
+ print("attribute " + attrib.name + " { text }" +
(attrib.required ? "" : "?"));
+ }
+
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateXSD.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateXSD.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/GenerateXSD.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,71 @@
+package no.sesat.mojo.modes;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class GenerateXSD extends GenerateFile implements Runnable {
+
+ private final ConfigElement root;
+ private final String fileName;
+ private Set<String> written = new TreeSet<String>();
+
+ public GenerateXSD(ConfigElement element, String name) {
+ fileName = name;
+ root = element;
+ }
+
+ public void run() {
+ init(fileName);
+
+ println("<?xml version='1.0'?>");
+ println("<xsd:schema
xmlns:xsd='http://www.w3.org/2001/XMLSchema'>");
+ indent();
+ println("<xsd:element name='" + root.name + "' type='" +
root.name + "'/>");
+ generate(root);
+ unindent();
+ print("</xsd:schema>");
+
+ done();
+ }
+
+ private void generate(ConfigElement element) {
+ if (written.add(element.name)) {
+ printlnI("<xsd:complexType name='" + element.name +
"'>");
+ if (element.hasDoc()) {
+ printlnI("<xsd:annotation>");
+ printlnI("<xsd:documentation>");
+ println("<![CDATA[" + element.doc + "]]>)");
+ printlnU("</xsd:documentation>");
+ printlnU("</xsd:annotation>");
+ }
+
+ printlnI("<xsd:choice minOccurs='0'
maxOccurs='unbounded'>");
+ for (int i = 0; i < element.children.size(); i++) {
+ ConfigElement child = element.children.get(i);
+ println("<xsd:element name='" + child.name + "'
type='" + child.name + "'/>");
+ }
+ printlnU("</xsd:choice>");
+
+ for (Iterator<ConfigAttribute> iterator =
element.attributes.iterator(); iterator.hasNext();) {
+ ConfigAttribute attrib = (ConfigAttribute)
iterator.next();
+ if (attrib.hasDoc()) {
+ printlnI("<xsd:attribute name='" +
attrib.name + "'>");
+ printlnI("<xsd:annotation>");
+ printlnI("<xsd:documentation>");
+ println("<![CDATA[" + attrib.doc +
"]]>)");
+ printlnU("</xsd:documentation>");
+ printlnU("</xsd:annotation>");
+ printlnU("</xsd:attribute>");
+ } else {
+ println("<xsd:attribute name='" +
attrib.name + "'/>");
+ }
+ }
+ printlnU("</xsd:complexType>");
+
+ }
+ for (ConfigElement child : element.children) {
+ generate(child);
+ }
+ }
+}
Added: branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/NameFilter.java
===================================================================
--- branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/NameFilter.java
(rev 0)
+++ branches/2.16/mojo/src/main/java/no/sesat/mojo/modes/NameFilter.java
2008-03-27 13:11:22 UTC (rev 6280)
@@ -0,0 +1,5 @@
+package no.sesat.mojo.modes;
+
+public interface NameFilter {
+ public String filter(String string);
+}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits