You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/06/18 00:23:26 UTC

svn commit: r1137053 [1/3] - in /openejb/trunk/sandbox/tools: ./ src/main/java/org/apache/openejb/tools/ src/main/java/org/apache/openejb/tools/examples/ src/main/resources/generate-index/ src/main/resources/generate-index/css/ src/main/resources/gener...

Author: rmannibucau
Date: Fri Jun 17 22:23:25 2011
New Revision: 1137053

URL: http://svn.apache.org/viewvc?rev=1137053&view=rev
Log:
refactoring generate index source to manage templates (with velocity) to be able to maintain views more easily

Added:
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/ListBuilder.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/MapBuilder.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/OpenEJBTemplate.java
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/config.properties
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/openejb-examples.css
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/prettify.css
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/glossary.js
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/jquery-latest.js
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/jquery.query.js
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/openejb-examples.js
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/prettify.js
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/example.vm
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/external.vm
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/footer.vm
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/glossary.vm
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/header.vm
    openejb/trunk/sandbox/tools/src/main/resources/generate-index/velocity/index.vm
Modified:
    openejb/trunk/sandbox/tools/pom.xml
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/Daily.java
    openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/GenerateIndex.java

Modified: openejb/trunk/sandbox/tools/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/pom.xml?rev=1137053&r1=1137052&r2=1137053&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/pom.xml (original)
+++ openejb/trunk/sandbox/tools/pom.xml Fri Jun 17 22:23:25 2011
@@ -136,6 +136,11 @@
       <artifactId>commons-io</artifactId>
       <version>1.3.2</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity</artifactId>
+      <version>1.7</version>
+    </dependency>
   </dependencies>
 </project>
 

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/Daily.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/Daily.java?rev=1137053&r1=1137052&r2=1137053&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/Daily.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/Daily.java Fri Jun 17 22:23:25 2011
@@ -32,5 +32,6 @@ public class Daily {
 
     public static void main(String[] args) {
         GenerateIndex.main(args); // "/tmp/examples.zip" "/tmp/openejb" for example
+        // GenerateIndex.main(new String[] { "/tmp/examples.zip", "/tmp/openejb"});
     }
 }

Modified: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/GenerateIndex.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/GenerateIndex.java?rev=1137053&r1=1137052&r2=1137053&view=diff
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/GenerateIndex.java (original)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/GenerateIndex.java Fri Jun 17 22:23:25 2011
@@ -23,7 +23,6 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -33,12 +32,17 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 
+import static org.apache.openejb.tools.examples.ListBuilder.newList;
+import static org.apache.openejb.tools.examples.MapBuilder.newMap;
+
 /**
  * Most the examples do not have any documentation.
  * <p/>
@@ -65,33 +69,37 @@ import org.apache.log4j.Logger;
  */
 public class GenerateIndex {
     private static final Logger LOGGER = Logger.getLogger(GenerateIndex.class);
+
     private static final int BUFFER_SIZE = 1024;
+
     private static final String EXTRACTED_EXAMPLES = "extracted";
     private static final String GENERATED_EXAMPLES = "generated";
-    private static final String README_MD = "README.md";
-    private static final String POM_XML = "pom.xml";
     private static final String INDEX_HTML = "index.html";
     private static final String GLOSSARY_HTML = "glossary.html";
-    private static final String HEAD = getTemplate("head.frag.html");
-    private static final String FOOT = getTemplate("foot.frag.html");
-    private static final String HEAD_MAIN = getTemplate("main-head.frag.html");
-    private static final String FOOT_MAIN = getTemplate("main-foot.frag.html");
-    private static final String TITLE = "TITLE";
-    private static final String JAVAX_PREFIX = "javax.";
-    private static final String IMPORT_START = "import ";
-    private static final MarkdownProcessor PROCESSOR = new MarkdownProcessor();
+    private static final String README_MD = "README.md";
+    private static final String POM_XML = "pom.xml";
+
     private static final List<String> EXCLUDED_FOLDERS = new ArrayList<String>() {{
         add("examples");
         add(".svn");
+        add("target");
+        add(".git");
+        add(".settings");
     }};
 
-    // A couple possible markdown processors in Java
-    //   http://code.google.com/p/markdownj/wiki/Maven
-    //   http://code.google.com/p/doxia-module-markdown/wiki/Usage
+    private static final String JAVAX_PREFIX = "javax.";
+    private static final String IMPORT_START = "import ";
+
+    private static final MarkdownProcessor PROCESSOR = new MarkdownProcessor();
 
+    private static final String TEMPLATE_COMMON_PROPERTIES = "generate-index/config.properties";
+    private static final String MAIN_TEMPLATE = "index.vm";
+    private static final String DEFAULT_EXAMPLE_TEMPLATE = "example.vm";
+    private static final String EXTERNALE_TEMPLATE = "external.vm";
+    private static final String GLOSSARY_TEMPLATE = "glossary.vm";
 
-    // Syntax highlighting can be done with this:
-    //   http://code.google.com/p/google-code-prettify
+    private static final String TITLE = "title";
+    private static final String BASE = "base";
 
     /**
      * Can be run in an IDE or via Maven like so:
@@ -102,17 +110,30 @@ public class GenerateIndex {
      */
     public static void main(String[] args) {
         if (args.length < 2) {
-            LOGGER.info("Usage: <main> <examples-zip-location> <output-folder>");
+            LOGGER.info("Usage: <main> <examples-zip-location> <work-folder>");
             return;
         }
 
+        Properties properties = new Properties();
+        URL propertiesUrl = Thread.currentThread().getContextClassLoader().getResource(TEMPLATE_COMMON_PROPERTIES);
+        try {
+            properties.load(propertiesUrl.openStream());
+        } catch (IOException e) {
+            LOGGER.error("can't read common properties, please put a " + TEMPLATE_COMMON_PROPERTIES + " file");
+        }
+
+        // will be used everywhere so keep it here
+        String base = properties.getProperty(BASE);
+
+        // working folder
         File extractedDir = new File(args[1], EXTRACTED_EXAMPLES);
         File generatedDir = new File(args[1], GENERATED_EXAMPLES);
 
         // crack open the examples zip file
         extract(args[0], extractedDir.getPath());
 
-        Map<String, Set<String>> exampleLinksByKeyword = new HashMap<String, Set<String>>();
+        Map<String, Set<String>> exampleLinksByKeyword = new TreeMap<String, Set<String>>();
+        Map<String, String> nameByLink = new TreeMap<String, String>();
         Collection<File> examples = listFolders(extractedDir, POM_XML);
         List<File> generatedIndexHtml = new ArrayList<File>();
         for (File example : examples) {
@@ -126,154 +147,116 @@ public class GenerateIndex {
                 // use the README.md markdown file to generate an index.html page
                 try {
                     html = PROCESSOR.markdown(FileUtils.readFileToString(readme));
-
-                    // if readme keeps small it will be ok
-                    html = html.replace("<code>", "<code class=\"prettyprint\">");
-                    html = new StringBuilder(HEAD.replace(TITLE, example.getName() + " example"))
-                        .append(html).append(FOOT).toString();
                 } catch (IOException e) {
                     LOGGER.warn("can't read readme file for example " + example.getName());
                 }
             }
 
             File index = new File(generated, INDEX_HTML);
+            generatedIndexHtml.add(index);
+            nameByLink.put(getLink(generatedDir, index), example.getName());
 
             List<File> javaFiles = listFilesEndingWith(example, ".java");
-            Collections.sort(javaFiles);
-            Map<String, Integer> apiCount = new HashMap<String, Integer>();
-            for (File file : javaFiles) {
-                try {
-                    Set<String> imports = getImports(file);
-                    if (imports != null) {
-                        for (String name : imports) {
-                            if (name.startsWith(JAVAX_PREFIX)) {
-                                if (!exampleLinksByKeyword.containsKey(name)) {
-                                    exampleLinksByKeyword.put(name, new HashSet<String>());
-                                }
-                                exampleLinksByKeyword.get(name).add(getLink(generatedDir, index));
-                            }
-                            if (!apiCount.containsKey(name)) {
-                                apiCount.put(name, 1);
-                            } else {
-                                apiCount.put(name, apiCount.get(name) + 1);
-                            }
-                        }
-                    }
-                } catch (IOException e) {
-                    LOGGER.error("can't read " + file.getPath());
-                }
-            }
+            Map<String, Integer> apiCount = getAndUpdateApis(javaFiles, exampleLinksByKeyword, generatedDir, index);
 
             if (html.isEmpty()) {
-                // If there is no README.md we should just generate a basic page
-                // maybe something that includes the FooTest.java code and shows
-                // shows that with links to other classes in the example
                 LOGGER.warn("no " + README_MD + " for example " + example.getName() + " [" + example.getPath() + "]");
 
-                html = new StringBuilder(HEAD.replace(TITLE, example.getName() + " example"))
-                    .append(getDefaultExampleContent(example.getName(), extractedDir, javaFiles, apiCount)).append(FOOT).toString();
-            }
-
-            try {
-                FileUtils.writeStringToFile(index, html);
-                generatedIndexHtml.add(index);
-            } catch (IOException e) {
-                LOGGER.error("can't write index file for example " + example.getName());
+                tpl(DEFAULT_EXAMPLE_TEMPLATE,
+                    newMap()
+                        .add(TITLE, example.getName() + " example")
+                        .add(BASE, base)
+                        .add("apis", apiCount)
+                        .add("files", removePrefix(extractedDir, javaFiles))
+                        .map(),
+                    index.getPath());
+            } else {
+                tpl(EXTERNALE_TEMPLATE,
+                    newMap()
+                        .add(TITLE, example.getName() + " example")
+                        .add(BASE, base)
+                        .add("content", html)
+                        .map(),
+                    index.getPath());
             }
         }
 
-        // create a glossary page
-        StringBuilder glossaryContent = new StringBuilder(HEAD.replace(TITLE, "OpenEJB Example Glossary"));
-        glossaryContent.append(getGlossaryContent(exampleLinksByKeyword));
-        glossaryContent.append(FOOT);
-        File glossary;
-        try {
-            glossary = new File(generatedDir, GLOSSARY_HTML);
-            FileUtils.writeStringToFile(glossary, glossaryContent.toString());
-        } catch (IOException e) {
-            LOGGER.error("can't write glossary file");
-        }
+        Map<String, String> exampleLinks = getExampleLinks(generatedIndexHtml, generatedDir);
 
+        // create a glossary page
+        tpl(GLOSSARY_TEMPLATE,
+            newMap()
+                .add(TITLE, "OpenEJB Example Glossary")
+                .add(BASE, base)
+                .add("javascripts", newList().add("glossary.js").list())
+                .add("links", nameByLink)
+                .add("classes", getClassesByApi(exampleLinksByKeyword))
+                .add("exampleByKeyword", exampleLinksByKeyword)
+                .add("examples", exampleLinks)
+                .add("aggregateClasses", getAggregateClasses(new ArrayList<String>(exampleLinks.keySet()), exampleLinksByKeyword))
+                .map(),
+            new File(generatedDir, GLOSSARY_HTML).getPath());
 
         // create an index for all example directories
-        StringBuilder mainIndex = new StringBuilder(HEAD.replace(TITLE, "OpenEJB Example"));
-        mainIndex.append(HEAD_MAIN);
-        mainIndex.append(getMainContent(generatedIndexHtml, generatedDir));
-        mainIndex.append(FOOT_MAIN).append(FOOT);
-        try {
-            FileUtils.writeStringToFile(new File(generatedDir, INDEX_HTML), mainIndex.toString());
-        } catch (IOException e) {
-            LOGGER.error("can't write main index file.");
+        tpl(MAIN_TEMPLATE,
+            newMap()
+                .add(TITLE, "OpenEJB Example")
+                .add(BASE, base)
+                .add("examples", exampleLinks)
+                .map(),
+            new File(generatedDir, INDEX_HTML).getPath());
+    }
+
+    private static Map<String, String> getAggregateClasses(List<String> links, Map<String, Set<String>> exampleLinksByKeyword) {
+        Map<String, String> classes = new HashMap<String, String>();
+        for (String link: links) {
+            classes.put(link, getHTMLClass(exampleLinksByKeyword, link));
         }
+        return classes;
     }
 
-    private static String getGlossaryContent(Map<String, Set<String>> exampleLinksByKeyword) {
-        StringBuilder glossaryContent = new StringBuilder("<h2>Glossary</h2>\n");
+    private static Map<String, String> getClassesByApi(Map<String, Set<String>> exampleLinksByKeyword) {
+        Map<String, String> classes = new HashMap<String, String>();
+        for (String api : exampleLinksByKeyword.keySet()) {
+            classes.put(api, api.replace(".", "-"));
+        }
+        return classes;
+    }
 
-        glossaryContent.append(getTemplate("js.glossary.frag.html"));
+    private static List<String> removePrefix(File path, List<File> files) {
+        List<String> processed = new ArrayList<String>();
+        for (File file : files) {
+            processed.add(getLink(path, file));
+        }
+        return processed;
+    }
 
-        // checkboxes
-        glossaryContent.append("<div id=\"checkboxes\">\n")
-            .append("<div id=\"checkboxes-button\"><ul>\n")
-            .append("<li><input type=\"button\" value=\"Aggregate\"")
-                    .append(" onclick=\"javascript:aggregate(this)\" ></li>")
-            .append("<li><input type=\"button\" value=\"Hide APIs\" id=\"showCheckboxes\"")
-                    .append(" onclick=\"javascript:showCheckboxes()\" ></li>")
-            .append("<li><input type=\"button\" value=\"Select All\"")
-                    .append(" onclick=\"javascript:selectCheckboxes(true)\" ></li>")
-            .append("<li><input type=\"button\" value=\"Select None\"")
-                .append(" onclick=\"javascript:selectCheckboxes(false)\" ></li>")
-            .append("</div></ul>\n")
-            .append("<div class=\"clear\" />\n")
-            .append("<div id=\"checkboxes-check\"><ul>\n");
-
-        List<String> apis = new ArrayList<String>(exampleLinksByKeyword.keySet());
-        Collections.sort(apis);
-        for (String api : apis) {
-            glossaryContent.append("<li>")
-                    .append("<input type=\"checkbox\" id=\"").append(api.replace('.', '-')) // . means class in css
-                        .append("\" checked=\"true\" onclick=\"javascript:checkBoxClicked(this.id, this.checked)\" >")
-                    .append(api)
-                .append("</li>\n");
-        }
-        glossaryContent.append("</ul></div>\n</div>\n");
-
-        StringBuilder aggregated = new StringBuilder("<div id=\"aggregate\">\n<ul>");
-        glossaryContent.append("<div id=\"list\">\n<ul>\n");
-
-        Map<String, String> linkByExample = new HashMap<String, String>();
-
-        for (String api : apis) {
-            glossaryContent.append("<li class=\"").append(api.replace('.', '-')).append("\">")
-                .append(api).append("\n<ul>\n");
-            List<String> sortedExamples = new ArrayList<String>(exampleLinksByKeyword.get(api));
-            Collections.sort(sortedExamples);
-            for (String link : sortedExamples) {
-                String name = link;
-                int idx = name.lastIndexOf('/');
-                int idxBefore = name.lastIndexOf('/', idx - 1);
-                if (idx >= 0 && idxBefore >= 0) {
-                    name = name.substring(idxBefore + 1, idx);
-                }
-                if (!linkByExample.containsKey(name)) {
-                    linkByExample.put(link, name);
+    private static Map<String, Integer> getAndUpdateApis(List<File> javaFiles, Map<String, Set<String>> exampleLinksByKeyword, File generatedDir, File index) {
+        Map<String, Integer> apiCount = new TreeMap<String, Integer>();
+        Collections.sort(javaFiles);
+        for (File file : javaFiles) {
+            try {
+                Set<String> imports = getImports(file);
+                if (imports != null) {
+                    for (String name : imports) {
+                        if (name.startsWith(JAVAX_PREFIX)) {
+                            if (!exampleLinksByKeyword.containsKey(name)) {
+                                exampleLinksByKeyword.put(name, new HashSet<String>());
+                            }
+                            exampleLinksByKeyword.get(name).add(getLink(generatedDir, index));
+                        }
+                        if (!apiCount.containsKey(name)) {
+                            apiCount.put(name, 1);
+                        } else {
+                            apiCount.put(name, apiCount.get(name) + 1);
+                        }
+                    }
                 }
-                glossaryContent.append("<li><a href=\"").append(link).append("\">").append(name).append("</a></li>");
+            } catch (IOException e) {
+                LOGGER.error("can't read " + file.getPath());
             }
-            glossaryContent.append("</ul>");
-        }
-        glossaryContent.append("</ul></li></div>\n");
-
-        List<String> links = new ArrayList<String>(linkByExample.keySet());
-        Collections.sort(links);
-        for (String link : links) {
-            String exampleLink = linkByExample.get(link);
-            aggregated.append("<li class=\"").append(getHTMLClass(exampleLinksByKeyword, link)).append("\">")
-                .append("<a href=\"").append(link).append("\">").append(exampleLink).append("</a>")
-                .append("</li>\n");
         }
-        aggregated.append("</ul></div>\n");
-        return glossaryContent.append(aggregated).toString();
+        return apiCount;
     }
 
     private static String getHTMLClass(Map<String, Set<String>> exampleLinksByKeyword, String value) {
@@ -289,45 +272,16 @@ public class GenerateIndex {
         return clazz.toString();
     }
 
-    private static String getMainContent(List<File> generatedIndexHtml, File generatedDir) {
+    private static Map<String, String> getExampleLinks(List<File> generatedIndexHtml, File generatedDir) {
         // list of all examples
-        StringBuilder mainIndex = new StringBuilder("<div id=\"examples\"><ul><li><a href=\"")
-            .append(GLOSSARY_HTML).append("\">").append("Glossary").append("</a></li></ul>");
-        mainIndex.append("    <ul>\n");
+        Map<String, String> links = new TreeMap<String, String>();
         Collections.sort(generatedIndexHtml);
         for (File example : generatedIndexHtml) {
             String link = getLink(generatedDir, example);
             String exampleName = example.getParentFile().getName();
-            mainIndex.append("      <li class=\"").append(exampleName).append("\">\n")
-                .append("        <a href=\"").append(link)
-                .append("\">").append(exampleName).append("</a>\n")
-                .append("      </li>\n");
-        }
-        mainIndex.append("    </ul>\n</div>\n");
-
-        return mainIndex.toString();
-    }
-
-    private static String getDefaultExampleContent(String name, File prefix, List<File> javaFiles, Map<String, Integer> apiCount) {
-        StringBuilder builder = new StringBuilder("<h2>").append(name).append("</h2>\n")
-            .append("<div id=\"javaFiles\">\n")
-            .append("<ul>Files:\n");
-        for (File f : javaFiles) {
-            String path = f.getPath().replace(prefix.getPath(), "");
-            if (path.startsWith("/")) {
-                path = path.substring(1);
-            }
-            builder.append("<li>").append(path).append("</li>\n");
-        }
-        builder.append("</ul>\n").append("</div>\n");
-
-        builder.append("<div id=\"api\">\n").append("<ul>API used:\n");
-        for (Map.Entry<String, Integer> api : apiCount.entrySet()) {
-            builder.append("<li>").append(api.getKey()).append(": ").append(api.getValue()).append(" times</li>\n");
+            links.put(link, exampleName);
         }
-        builder.append("</ul>\n").append("</div>\n");
-
-        return builder.toString();
+        return links;
     }
 
     private static Set<String> getImports(File file) throws IOException {
@@ -346,7 +300,7 @@ public class GenerateIndex {
 
     private static String getLink(File generatedDir, File example) {
         return example.getPath().replace(generatedDir.getPath(), "")
-                        .replace(File.separator, "/").replaceFirst("/", "");
+            .replace(File.separator, "/").replaceFirst("/", "");
     }
 
     private static Collection<File> listFolders(File extractedDir, String name) {
@@ -390,7 +344,7 @@ public class GenerateIndex {
                     File file = new File(output + File.separator + entry.getName());
                     FileOutputStream fos = new FileOutputStream(file);
                     while ((count = zip.read(buf, 0, BUFFER_SIZE)) != -1) {
-                       fos.write(buf, 0, count);
+                        fos.write(buf, 0, count);
                     }
                     fos.flush();
                     fos.close();
@@ -410,16 +364,8 @@ public class GenerateIndex {
         }
     }
 
-    private static String getTemplate(String file) {
-        URL url = Thread.currentThread().getContextClassLoader().getResource("generate-index/" + file);
-        try {
-            File f = new File(url.toURI());
-            return FileUtils.readFileToString(f);
-        } catch (URISyntaxException e) {
-            LOGGER.error("can't get template " + file);
-        } catch (IOException e) {
-            LOGGER.error("can't read template " + file);
-        }
-        return "";
+    // just a shortcut
+    private static void tpl(String template, Map<String, Object> mapContext, String path) {
+        OpenEJBTemplate.get().apply(template, mapContext, path);
     }
 }

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/ListBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/ListBuilder.java?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/ListBuilder.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/ListBuilder.java Fri Jun 17 22:23:25 2011
@@ -0,0 +1,30 @@
+package org.apache.openejb.tools.examples;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public final class ListBuilder {
+    private List<Object> internal = new ArrayList<Object>();
+
+    private ListBuilder() {
+        // no-op
+    }
+
+    public static ListBuilder newList() {
+        return new ListBuilder();
+    }
+
+    public ListBuilder add(Object value) {
+        internal.add(value);
+        return this;
+    }
+
+    public List<Object> list() {
+        return internal;
+    }
+}

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/MapBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/MapBuilder.java?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/MapBuilder.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/MapBuilder.java Fri Jun 17 22:23:25 2011
@@ -0,0 +1,28 @@
+package org.apache.openejb.tools.examples;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public final class MapBuilder {
+    private Map<String, Object> internal = new HashMap<String, Object>();
+
+    private MapBuilder() {
+        // no-op
+    }
+
+    public static MapBuilder newMap() {
+        return new MapBuilder();
+    }
+
+    public MapBuilder add(String key, Object value) {
+        internal.put(key, value);
+        return this;
+    }
+
+    public Map<String, Object> map() {
+        return internal;
+    }
+}

Added: openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/OpenEJBTemplate.java
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/OpenEJBTemplate.java?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/OpenEJBTemplate.java (added)
+++ openejb/trunk/sandbox/tools/src/main/java/org/apache/openejb/tools/examples/OpenEJBTemplate.java Fri Jun 17 22:23:25 2011
@@ -0,0 +1,101 @@
+package org.apache.openejb.tools.examples;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Writer;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.apache.log4j.Logger;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.runtime.log.CommonsLogLogChute;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public final class OpenEJBTemplate {
+    private static final Logger LOGGER = Logger.getLogger(OpenEJBTemplate.class);
+
+    private static final OpenEJBTemplate INSTANCE = new OpenEJBTemplate();
+    private static final String LOG_TAG = OpenEJBTemplate.class.getName();
+    private static final String PREFIX = "generate-index/velocity/";
+
+    private VelocityEngine engine;
+    private Map<String, URL> resources = new HashMap<String, URL>();
+
+    private OpenEJBTemplate() {
+        // no-op
+    }
+
+    public synchronized void init() {
+        if (engine != null) {
+            return;
+        }
+
+        engine = new VelocityEngine();
+
+        Properties properties = new Properties();
+        properties.setProperty("file.resource.loader.cache", "true");
+        properties.setProperty("resource.loader", "file, class");
+        properties.setProperty("class.resource.loader.description", "Velocity Classpath Resource Loader");
+        properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+        properties.setProperty("runtime.log.logsystem.class", CommonsLogLogChute.class.getName());
+        properties.setProperty("runtime.log.logsystem.commons.logging.name", LOG_TAG);
+        engine.init(properties);
+    }
+
+    private void evaluate(String template, Map<String, Object> mapContext, Writer writer) throws IOException {
+        if (engine == null) {
+            init();
+        }
+
+        if (!resources.containsKey(template)) {
+            URL resource = Thread.currentThread().getContextClassLoader().getResource(PREFIX + template);
+            resources.put(template, resource);
+        }
+
+        URL url = resources.get(template);
+        if (url == null) {
+            LOGGER.error("can't find template " + template);
+            return;
+        }
+
+        VelocityContext context = new VelocityContext(mapContext);
+        engine.evaluate(context, writer, LOG_TAG, new InputStreamReader(url.openStream()));
+    }
+
+    /**
+     * generate a file from a velocity template.
+     *
+     * In error case (template not found...), only log with error level will be done (no exception).
+     *
+     * @param template the template path in PREFIX resource folder
+     * @param mapContext the parameters of the template
+     * @param path the output path
+     */
+    public void apply(String template, Map<String, Object> mapContext, String path) {
+        FileWriter writer = null;
+        try {
+            writer = new FileWriter(path);
+            evaluate(template, mapContext, writer);
+        } catch (IOException ioe) {
+            LOGGER.error("can't apply template " + template, ioe);
+        } finally {
+            if (writer != null) {
+                try {
+                    writer.flush();
+                    writer.close();
+                } catch (IOException e) {
+                    LOGGER.error("can't flush file " + path, e);
+                }
+            }
+        }
+    }
+
+    public static OpenEJBTemplate get() {
+        return INSTANCE;
+    }
+}

Added: openejb/trunk/sandbox/tools/src/main/resources/generate-index/config.properties
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/resources/generate-index/config.properties?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/resources/generate-index/config.properties (added)
+++ openejb/trunk/sandbox/tools/src/main/resources/generate-index/config.properties Fri Jun 17 22:23:25 2011
@@ -0,0 +1,2 @@
+# should be a public_html in reality but for testing purpose it is ok
+base=/home/rmannibucau/Development/openejb/tools/src/main/resources/generate-index

Added: openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/openejb-examples.css
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/openejb-examples.css?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/openejb-examples.css (added)
+++ openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/openejb-examples.css Fri Jun 17 22:23:25 2011
@@ -0,0 +1,67 @@
+body {
+    overflow: hidden;
+    margin-bottom: 1em;
+}
+
+#content {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+}
+
+#list, #aggregate {
+    width: 600px;
+    float: left;
+}
+
+.clear {
+    clear: both;
+}
+
+#checkboxes-check {
+    margin-right: 0;
+    float: right;
+    width: 400px;
+}
+
+#checkboxes ul {
+    list-style-type:none;
+}
+
+#checkboxes-button ul li {
+    float:left;
+}
+
+#floatingbar {
+    overflow: hidden;
+    width: 80%;
+    margin-right: 10%;
+    margin-left: 10%;
+    height: 1.1em;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    font-family: Arial;
+    font-weight: bold;
+    background-color: #5A5CB8;
+}
+
+#floatingbar ul {
+    list-style-type:none;
+}
+#floatingbar ul li {
+    float:left;
+    color:#666;
+    margin-top: -1.1em;
+}
+#floatingbar ul li a {
+    text-decoration:none;
+    color:#000;
+    padding-left: 10px;
+    font-size:12px;
+    font-weight:normal;
+    font-family:Arial;
+}
+#floatingbar ul li a:hover {
+    color:#000033;
+}

Added: openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/prettify.css
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/prettify.css?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/prettify.css (added)
+++ openejb/trunk/sandbox/tools/src/main/resources/generate-index/css/prettify.css Fri Jun 17 22:23:25 2011
@@ -0,0 +1,52 @@
+/* Pretty printing styles. Used with prettify.js. */
+
+/* SPAN elements with the classes below are added by prettyprint. */
+.pln { color: #000 }  /* plain text */
+
+@media screen {
+  .str { color: #080 }  /* string content */
+  .kwd { color: #008 }  /* a keyword */
+  .com { color: #800 }  /* a comment */
+  .typ { color: #606 }  /* a type name */
+  .lit { color: #066 }  /* a literal value */
+  /* punctuation, lisp open bracket, lisp close bracket */
+  .pun, .opn, .clo { color: #660 }
+  .tag { color: #008 }  /* a markup tag name */
+  .atn { color: #606 }  /* a markup attribute name */
+  .atv { color: #080 }  /* a markup attribute value */
+  .dec, .var { color: #606 }  /* a declaration; a variable name */
+  .fun { color: red }  /* a function name */
+}
+
+/* Use higher contrast and text-weight for printable form. */
+@media print, projection {
+  .str { color: #060 }
+  .kwd { color: #006; font-weight: bold }
+  .com { color: #600; font-style: italic }
+  .typ { color: #404; font-weight: bold }
+  .lit { color: #044 }
+  .pun, .opn, .clo { color: #440 }
+  .tag { color: #006; font-weight: bold }
+  .atn { color: #404 }
+  .atv { color: #060 }
+}
+
+/* Put a border around prettyprinted code snippets. */
+pre.prettyprint { padding: 2px; border: 1px solid #888 }
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L5,
+li.L6,
+li.L7,
+li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,
+li.L3,
+li.L5,
+li.L7,
+li.L9 { background: #eee }

Added: openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/glossary.js
URL: http://svn.apache.org/viewvc/openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/glossary.js?rev=1137053&view=auto
==============================================================================
--- openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/glossary.js (added)
+++ openejb/trunk/sandbox/tools/src/main/resources/generate-index/javascript/glossary.js Fri Jun 17 22:23:25 2011
@@ -0,0 +1,50 @@
+$(document).ready(function() {
+  $('#aggregate').hide();
+});
+
+function checkBoxClicked(id, b) {
+   $('.' + id).each(function(i, val) {
+     if (b) {
+       $(val).show('slow');
+     } else {
+       $(val).hide();
+     }
+     $(val).attr('checked', b);
+   });
+}
+
+function selectCheckboxes(b) {
+  $('input[type=checkbox]').each(function(i, val) {
+      checkBoxClicked($(val).attr('id'), b);
+      $(val).attr('checked', b);
+  });
+}
+
+function showCheckboxes() {
+    if ($('#checkboxes-check').is(':visible')) {
+        $('#checkboxes-check').hide();
+        $('#showCheckboxes').attr('value', 'Show API');
+    } else {
+        $('#checkboxes-check').show();
+        $('#showCheckboxes').attr('value', 'Hide API');
+    }
+}
+
+function aggregate(button) {
+  if (button.value == 'Aggregate') {
+    button.value = 'Split';
+    $('#list').hide();
+    $('#aggregate').show('slow');
+  } else {
+    button.value = 'Aggregate';
+    $('#list').show('slow');
+    $('#aggregate').hide();
+  }
+  // order to show selected whic are in non slected too
+  $('input[type=checkbox,checked=false]').each(function(i, val) {
+      checkBoxClicked($(val).attr('id'), false);
+  });
+  $('input[type=checkbox,checked=true]').each(function(i, val) {
+      checkBoxClicked($(val).attr('id'), true);
+  });
+}