package org.objectstyle.wolips.eomodeler.doc; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.util.HashSet; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.RuntimeServices; import org.apache.velocity.runtime.log.LogSystem; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import org.apache.velocity.runtime.resource.loader.FileResourceLoader; import org.objectstyle.wolips.eomodeler.core.model.EOEntity; import org.objectstyle.wolips.eomodeler.core.model.EOModel; import org.objectstyle.wolips.eomodeler.core.model.EOModelGroup; import org.objectstyle.wolips.eomodeler.core.model.EOModelVerificationFailure; import org.objectstyle.wolips.eomodeler.core.model.EOStoredProcedure; public class EOModelDocGenerator { public static class ConsoleLogger implements LogSystem { public void init(RuntimeServices runtimeservices) throws Exception { // DO NOTHING } public void logVelocityMessage(int i, String s) { System.out.println("ConsoleLogger.logVelocityMessage: " + i + ", " + s); } } public static void generate(EOModelGroup modelGroup, File outputFolder, File templatePath, String entityURLTemplate) throws Exception { Thread thread = Thread.currentThread(); ClassLoader loader = thread.getContextClassLoader(); thread.setContextClassLoader(modelGroup.getClass().getClassLoader()); try { VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, org.apache.velocity.runtime.log.NullLogSystem.class.getName()); // velocityEngine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, // ConsoleLogger.class.getName()); StringBuffer templatePaths = new StringBuffer(); templatePaths.append("."); if (templatePath != null) { templatePaths.append(","); templatePaths.append(templatePath.getAbsolutePath()); } velocityEngine.setProperty("resource.loader", "file,class"); velocityEngine.setProperty("file.resource.loader.class", FileResourceLoader.class.getName()); velocityEngine.setProperty("file.resource.loader.path", templatePaths.toString()); velocityEngine.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName()); velocityEngine.init(); VelocityContext context = new VelocityContext(); context.put("modelGroup", modelGroup); EOModelDocGenerator.writeTemplate(velocityEngine, context, "eomodeldoc.css.vm", new File(outputFolder, "eomodeldoc.css")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "eomodeldoc.js.vm", new File(outputFolder, "eomodeldoc.js")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "prototype.js.vm", new File(outputFolder, "prototype.js")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "index.html.vm", new File(outputFolder, "index.html")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "indexContent.html.vm", new File(outputFolder, "content.html")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "indexOverview.html.vm", new File(outputFolder, "overview.html")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "indexModels.html.vm", new File(outputFolder, "models.html")); for (EOModel model : modelGroup.getModels()) { System.out.println("Generating " + model.getName() + " ..."); context.put("model", model); EOModelDocGenerator.writeTemplate(velocityEngine, context, "modelOverview.html.vm", new File(outputFolder, model.getName() + "/overview.html")); EOModelDocGenerator.writeTemplate(velocityEngine, context, "modelContent.html.vm", new File(outputFolder, model.getName() + "/content.html")); for (EOEntity entity : model.getEntities()) { System.out.println("Generating " + model.getName() + "." + entity.getName() + " ..."); context.put("entity", entity); if (entityURLTemplate != null) { String className = entity.getClassName(); if (className != null && className.length() > 0) { StringWriter entityURLWriter = new StringWriter(); VelocityContext entityURLContext = new VelocityContext(); entityURLContext.put("entity", entity); entityURLContext.put("model", model); Velocity.evaluate(entityURLContext, entityURLWriter, "entityURL", entityURLTemplate); context.put("entityURL", entityURLWriter.toString()); } } EOModelDocGenerator.writeTemplate(velocityEngine, context, "entityContent.html.vm", new File(outputFolder, model.getName() + "/entities/" + entity.getName() + ".html")); } for (EOStoredProcedure storedProcedure : model.getStoredProcedures()) { System.out.println("Generating " + model.getName() + "." + storedProcedure.getName() + " ..."); context.put("storedProcedure", storedProcedure); EOModelDocGenerator.writeTemplate(velocityEngine, context, "storedProcedureContent.html.vm", new File(outputFolder, model.getName() + "/storedProcedures/" + storedProcedure.getName() + ".html")); } } } finally { thread.setContextClassLoader(loader); } System.out.println("Done: " + new File(outputFolder, "index.html")); } public static void main(String[] args) throws Exception { // String userHomeWOLipsPath = System.getProperty("user.home") + // File.separator + "Library" + File.separator + "TBLips"; // URL url = null; // url = FileLocator.resolve(Activator.getDefault().getBundle().); // String templatePaths = userHomeWOLipsPath + ", "; // Path path = new Path(url.getPath()); // templatePaths = templatePaths + // path.append("templates").toOSString(); // velocityEngine.setProperty("resource.loader", "wolips"); // velocityEngine.setProperty("wolips.resource.loader.class", // org.objectstyle.wolips.thirdparty.velocity.resourceloader.ResourceLoader.class.getName()); // velocityEngine.setProperty("wolips.resource.loader.bundle", // Activator.getDefault().getBundle()); // velocityEngine.setProperty("jar.resource.loader.path", "jar:" + // TemplateEnginePlugin.getDefault().getBundle().getResource("plugin.xml").getFile()); EOModelGroup modelGroup = new EOModelGroup(); modelGroup.loadModelFromURL(new File("/Users/mschrag/Documents/workspace/ERPrototypes/Resources/erprototypes.eomodeld").toURL()); modelGroup.loadModelFromURL(new File("/Users/mschrag/Documents/workspace/MDTAccounting/MDTAccounting.eomodeld").toURL()); modelGroup.loadModelFromURL(new File("/Users/mschrag/Documents/workspace/MDTask/MDTask.eomodeld").toURL()); modelGroup.resolve(new HashSet<EOModelVerificationFailure>()); File outputFolder = new File("/tmp/eomodeldoc"); EOModelDocGenerator.generate(modelGroup, outputFolder, null, null); } public static void writeTemplate(VelocityEngine engine, VelocityContext context, String templateName, File outputFile) throws Exception { try { Template template = engine.getTemplate(templateName, "UTF-8"); if (!outputFile.getParentFile().exists()) { if (!outputFile.getParentFile().mkdirs()) { throw new IOException("Unable to create the folder " + outputFile.getParentFile() + "."); } } Writer outputWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8")); try { template.merge(context, outputWriter); } finally { outputWriter.close(); } } catch (Exception e) { throw new Exception("Failed to generate '" + outputFile + "' with template '" + templateName + "'.", e); } } }