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

Reply via email to