/**
* SchemaDocumenter.java
*
* @author Charles Groves
*/
package edu.sc.seis.sod.validator.documenter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.BasicConfigurator;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.validator.ModelWalker;
import edu.sc.seis.sod.validator.model.Definition;
import edu.sc.seis.sod.validator.model.Form;
import edu.sc.seis.sod.validator.model.StAXModelBuilder;
import edu.sc.seis.sod.validator.tour.DepthAwareGuide;
import edu.sc.seis.sod.validator.tour.HTMLOutlineTourist;
public class SchemaDocumenter {
public static void main(String[] args) throws Exception {
BasicConfigurator.configure();
if (args.length != 3) {
System.err.println("Usage: schemaDocumenter rng basedir outputdir");
System.err.print(" ");
for (int i = 0; i < args.length; i++) {
System.err.print(args[i]+" ");
}
System.err.println();
return;
}
String sod_rng = args[0];
base = args[1];
if (base.length() != 0 && ! base.endsWith("/")) { base += "/"; }
outputdir = args[2];
if (outputdir.length() != 0 && ! outputdir.endsWith("/")) { outputdir += "/"; }
StAXModelBuilder handler = new StAXModelBuilder(sod_rng);
//Setup velocity
VelocityEngine ve = new VelocityEngine();
ve.setProperty("file.resource.loader.path", base + "site");
ve.setProperty("runtime.log.logsystem.log4j.logger", "schemaDocumenter");
ve.init();
VelocityContext c = new VelocityContext();
walker = new ModelWalker(handler.getRoot());
c.put("root", handler.getRoot());
c.put("walker", walker);
c.put("util", new SodUtil());
c.put("helper", new VelocityModelHelper());
c.put("doc", new SchemaDocumenter());
Collection<Definition> defs = StAXModelBuilder.getAllDefinitions();
List<Definition> sortedDefs = new ArrayList<Definition>();
sortedDefs.addAll(defs);
Collections.sort(sortedDefs, new Comparator<Definition>() {
@Override
public int compare(Definition o1, Definition o2) {
return o1.getName().compareTo(o2.getName());
}
});
Iterator<Definition> it = sortedDefs.iterator();
while(it.hasNext()) {
Definition def = it.next();
// if(!def.getName().equals("eventArea")){
// continue;
// }
render(c, ve, def);
System.out.print('.');
}
System.out.println();
System.out.println("Finish successfully");
}
public static void render(VelocityContext c,
VelocityEngine ve,
Definition def) throws Exception {
String path = makePath(def);
File velFile = new File(outputdir + path + ".vm");
velFile.getParentFile().mkdirs();
Writer w = new BufferedWriter(new FileWriter(velFile));
c.put("def", def);
HTMLOutlineTourist tourist = new HTMLOutlineTourist(makePath(def));
DepthAwareGuide guide = new DepthAwareGuide(def.getForm());
guide.lead(tourist);
c.put("contained", tourist.getResult());
ve.mergeTemplate("elementPage.vm", new VelocityContext(c), w);
w.close();
}
public static Definition getNearestDef(Form f) {
if(f.isFromDef()) {
return f.getDef();
}
return getNearestDef(f.getParent());
}
public static String makePath(Form f) {
return makePath(getNearestDef(f));
}
public static String makePath(Definition def) {
String rngLoc = def.getGrammar().getLoc();
// System.out.println("SchemaDocumenter.makePath: "+rngLoc+" "+def.getForm().getXPath());
String path = rngLoc.substring(rngLoc.indexOf("relax") + 6,
rngLoc.length() - 4);
//path += "/" + def.getName();
path = "/" + def.getName();
if(def.getName().equals("")) {
path += "start";
}
return path;
}
static ModelWalker walker;
static String base, outputdir;
}