[infinispan-commits] Infinispan SVN: r409 - in trunk: core/src/main/java/org/infinispan/jmx and 14 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Wed Jun 3 20:28:21 EDT 2009


Author: manik.surtani at jboss.com
Date: 2009-06-03 20:28:21 -0400 (Wed, 03 Jun 2009)
New Revision: 409

Added:
   trunk/tools/
   trunk/tools/pom.xml
   trunk/tools/src/
   trunk/tools/src/main/
   trunk/tools/src/main/java/
   trunk/tools/src/main/java/org/
   trunk/tools/src/main/java/org/infinispan/
   trunk/tools/src/main/java/org/infinispan/tools/
   trunk/tools/src/main/java/org/infinispan/tools/doclet/
   trunk/tools/src/main/java/org/infinispan/tools/doclet/html/
   trunk/tools/src/main/java/org/infinispan/tools/doclet/html/HtmlGenerator.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/html/JmxHtmlGenerator.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxComponent.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxDoclet.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanAttribute.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanComponent.java
   trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanOperation.java
Modified:
   trunk/core/src/main/java/org/infinispan/jmx/ResourceDMBean.java
   trunk/core/src/main/java/org/infinispan/jmx/annotations/MBean.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java
   trunk/parent/pom.xml
   trunk/pom.xml
   trunk/src/main/resources/assemblies/all.xml
   trunk/src/main/resources/assemblies/bin.xml
   trunk/src/main/resources/assemblies/single_jar.xml
Log:
Added tools to generate JMX documentation

Modified: trunk/core/src/main/java/org/infinispan/jmx/ResourceDMBean.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/jmx/ResourceDMBean.java	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/core/src/main/java/org/infinispan/jmx/ResourceDMBean.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -357,7 +357,7 @@
                   }
                }
             }
-         } else if (method.isAnnotationPresent(ManagedOperation.class) || isMBeanAnnotationPresentWithExposeAll()) {
+         } else if (method.isAnnotationPresent(ManagedOperation.class)) {
             ManagedOperation op = method.getAnnotation(ManagedOperation.class);
             String attName = method.getName();
             if (isSetMethod(method) || isGetMethod(method)) {
@@ -493,11 +493,6 @@
       }
    }
 
-   private boolean isMBeanAnnotationPresentWithExposeAll() {
-      Class<?> c = getObject().getClass();
-      return c.isAnnotationPresent(MBean.class) && c.getAnnotation(MBean.class).exposeAll();
-   }
-
    private class MethodAttributeEntry implements AttributeEntry {
 
       final MBeanAttributeInfo info;

Modified: trunk/core/src/main/java/org/infinispan/jmx/annotations/MBean.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/jmx/annotations/MBean.java	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/core/src/main/java/org/infinispan/jmx/annotations/MBean.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -41,7 +41,5 @@
 public @interface MBean {
    String objectName() default "";
 
-   boolean exposeAll() default false;
-
    String description() default "";
 }

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -51,7 +51,7 @@
  * @author Manik Surtani (<a href="mailto:manik at jboss.org">manik at jboss.org</a>)
  * @since 4.0
  */
- at MBean(objectName = "MvccLockManager")
+ at MBean(objectName = "MvccLockManager", description = "Manager that handles MVCC locks for entries")
 public class LockManagerImpl implements LockManager {
    protected Configuration configuration;
    LockContainer lockContainer;

Modified: trunk/parent/pom.xml
===================================================================
--- trunk/parent/pom.xml	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/parent/pom.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -205,40 +205,77 @@
                </execution>
             </executions>
          </plugin>
+
+         <!--<plugin>-->
+         <!--<groupId>org.apache.maven.plugins</groupId>-->
+         <!--<artifactId>maven-javadoc-plugin</artifactId>-->
+         <!--<executions>-->
+         <!--<execution>-->
+         <!--<id>javadoc</id>-->
+         <!--<phase>package</phase>-->
+         <!--<goals>-->
+         <!--<goal>jar</goal>-->
+         <!--</goals>-->
+         <!--<configuration>-->
+         <!--<quiet>true</quiet>-->
+         <!--<links>-->
+         <!--<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>-->
+         <!--<link>http://java.sun.com/javaee/5/docs/api/</link>-->
+         <!--</links>-->
+         <!--<footer><![CDATA[-->
+         <!--Google Analytics -->
+         <!--<script type='text/javascript'>-->
+         <!--var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");-->
+         <!--document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));-->
+         <!--</script>-->
+         <!--<script type='text/javascript'>-->
+         <!--try {-->
+         <!--var pageTracker = _gat._getTracker("UA-8601422-4");-->
+         <!--pageTracker._trackPageview();-->
+         <!--} catch(err) {}</script>-->
+         <!--]]></footer>-->
+         <!--</configuration>-->
+         <!--</execution>-->
+         <!--</executions>-->
+         <!--</plugin>-->
+
+         <!--<plugin>-->
+         <!--<groupId>org.apache.maven.plugins</groupId>-->
+         <!--<artifactId>maven-javadoc-plugin</artifactId>-->
+         <!--<configuration>-->
+         <!--<doclet>org.infinispan.tools.doclet.jmx.JmxDoclet</doclet>-->
+         <!--<docletArtifact>-->
+         <!--<groupId>org.infinispan</groupId>-->
+         <!--<artifactId>infinispan-tools</artifactId>-->
+         <!--<version>4.0.0-SNAPSHOT</version>-->
+         <!--</docletArtifact>-->
+         <!--<footer><![CDATA[-->
+         <!--Google Analytics -->
+         <!--<script type='text/javascript'>-->
+         <!--var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");-->
+         <!--document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));-->
+         <!--</script>-->
+         <!--<script type='text/javascript'>-->
+         <!--try {-->
+         <!--var pageTracker = _gat._getTracker("UA-8601422-4");-->
+         <!--pageTracker._trackPageview();-->
+         <!--} catch(err) {}</script>-->
+         <!--]]></footer>-->
+         <!--</configuration>-->
+         <!--<executions>-->
+         <!--<execution>-->
+         <!--<id>javadoc</id>-->
+         <!--<phase>package</phase>-->
+         <!--<goals>-->
+         <!--<goal>jar</goal>-->
+         <!--</goals>-->
+         <!--</execution>-->
+         <!--</executions>-->
+         <!--</plugin>-->
+
+
          <plugin>
             <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <executions>
-               <execution>
-                  <id>javadoc</id>
-                  <phase>package</phase>
-                  <goals>
-                     <goal>jar</goal>
-                  </goals>
-                  <configuration>
-                     <quiet>true</quiet>
-                     <links>
-                        <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
-                        <link>http://java.sun.com/javaee/5/docs/api/</link>
-                     </links>
-                     <footer><![CDATA[
-                     <!-- Google Analytics -->
-<script type='text/javascript'>
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type='text/javascript'>
-try {
-var pageTracker = _gat._getTracker("UA-8601422-4");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-                     ]]></footer>
-                  </configuration>
-               </execution>
-            </executions>
-         </plugin>
-         <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
             <configuration>
                <archive>
@@ -382,5 +419,6 @@
             <protocol.stack>tcp</protocol.stack>
          </properties>
       </profile>
+
    </profiles>
 </project>

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/pom.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -29,6 +29,7 @@
       <module>cachestore/jdbm</module>
       <module>jopr-plugin</module>
       <module>gui-demo</module>
+      <module>tools</module>
    </modules>
 
    <profiles>
@@ -42,14 +43,21 @@
                <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-javadoc-plugin</artifactId>
-                  <configuration>
-                     <quiet>true</quiet>
-                     <links>
-                        <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
-                        <link>http://java.sun.com/javaee/5/docs/api/</link>
-                     </links>
-                     <footer><![CDATA[
-                     <!-- Google Analytics -->
+                  <executions>
+                     <execution>
+                        <id>javadoc</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                           <goal>aggregate</goal>
+                        </goals>
+                        <configuration>
+                           <quiet>true</quiet>
+                           <links>
+                              <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
+                              <link>http://java.sun.com/javaee/5/docs/api/</link>
+                           </links>
+                           <footer><![CDATA[
+                      Google Analytics
 <script type='text/javascript'>
 var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
 document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
@@ -60,17 +68,11 @@
 pageTracker._trackPageview();
 } catch(err) {}</script>
                      ]]></footer>
-                  </configuration>
-                  <executions>
-                     <execution>
-                        <id>javadoc</id>
-                        <phase>package</phase>
-                        <goals>
-                           <goal>aggregate</goal>
-                        </goals>
+                        </configuration>
                      </execution>
                   </executions>
                </plugin>
+
                <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-antrun-plugin</artifactId>
@@ -159,5 +161,47 @@
             </plugins>
          </build>
       </profile>
+
+      <profile>
+         <!-- TODO somehow combine this with the 'distribution' profile so all docs are built together -->
+         <id>jmxdoc</id>
+         <build>
+            <plugins>
+               <plugin>
+                  <groupId>org.apache.maven.plugins</groupId>
+                  <artifactId>maven-javadoc-plugin</artifactId>
+                  <configuration>
+                     <doclet>org.infinispan.tools.doclet.jmx.JmxDoclet</doclet>
+                     <docletArtifact>
+                        <groupId>org.infinispan</groupId>
+                        <artifactId>infinispan-tools</artifactId>
+                        <version>4.0.0-SNAPSHOT</version>
+                     </docletArtifact>
+                     <footer><![CDATA[
+                Google Analytics
+<script type='text/javascript'>
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type='text/javascript'>
+try {
+var pageTracker = _gat._getTracker("UA-8601422-4");
+pageTracker._trackPageview();
+} catch(err) {}</script>
+               ]]></footer>
+                  </configuration>
+                  <executions>
+                     <execution>
+                        <id>javadoc</id>
+                        <phase>package</phase>
+                        <goals>
+                           <goal>aggregate</goal>
+                        </goals>
+                     </execution>
+                  </executions>
+               </plugin>
+            </plugins>
+         </build>
+      </profile>
    </profiles>
 </project>

Modified: trunk/src/main/resources/assemblies/all.xml
===================================================================
--- trunk/src/main/resources/assemblies/all.xml	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/src/main/resources/assemblies/all.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -32,9 +32,12 @@
    </formats>
 
    <moduleSets>
+
       <moduleSet>
          <includeSubModules>false</includeSubModules>
-
+         <excludes>
+            <exclude>org.infinispan:infinispan-tools</exclude>
+         </excludes>
          <sources>
             <includeModuleDirectory>false</includeModuleDirectory>
 
@@ -110,6 +113,9 @@
 
       <moduleSet>
          <includeSubModules>false</includeSubModules>
+         <excludes>
+            <exclude>org.infinispan:infinispan-tools</exclude>
+         </excludes>
          <binaries>
             <attachmentClassifier>tests</attachmentClassifier>
             <outputDirectory>test/modules/${module.basedir.name}</outputDirectory>

Modified: trunk/src/main/resources/assemblies/bin.xml
===================================================================
--- trunk/src/main/resources/assemblies/bin.xml	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/src/main/resources/assemblies/bin.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -28,7 +28,9 @@
    <moduleSets>
       <moduleSet>
          <includeSubModules>false</includeSubModules>
-
+         <excludes>
+            <exclude>org.infinispan:infinispan-tools</exclude>
+         </excludes>
          <sources>
             <includeModuleDirectory>false</includeModuleDirectory>
 
@@ -40,7 +42,7 @@
                   <outputDirectory>etc</outputDirectory>
                   <excludes>
                      <exclude>**/*.sh</exclude>
-  		     <exclude>**/*.bat</exclude>
+                     <exclude>**/*.bat</exclude>
                      <exclude>**/*.cmd</exclude>
                      <exclude>**/*.py</exclude>
                   </excludes>

Modified: trunk/src/main/resources/assemblies/single_jar.xml
===================================================================
--- trunk/src/main/resources/assemblies/single_jar.xml	2009-06-03 17:28:06 UTC (rev 408)
+++ trunk/src/main/resources/assemblies/single_jar.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -23,6 +23,10 @@
    <moduleSets>
       <moduleSet>
          <includeSubModules>false</includeSubModules>
+         <excludes>
+            <exclude>org.infinispan:infinispan-tools</exclude>
+            <exclude>org.infinispan:infinispan-jopr-plugin</exclude>
+         </excludes>
 
          <sources>
             <includeModuleDirectory>false</includeModuleDirectory>

Added: trunk/tools/pom.xml
===================================================================
--- trunk/tools/pom.xml	                        (rev 0)
+++ trunk/tools/pom.xml	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.infinispan</groupId>
+      <artifactId>infinispan-parent</artifactId>
+      <version>4.0.0-SNAPSHOT</version>
+      <relativePath>../parent/pom.xml</relativePath>
+   </parent>
+
+   <groupId>org.infinispan</groupId>
+   <artifactId>infinispan-tools</artifactId>
+   <version>4.0.0-SNAPSHOT</version>
+   <name>Infinispan Tools</name>
+   <description>Infinispan - Tools for project</description>
+   <dependencies>
+      <dependency>
+         <groupId>org.infinispan</groupId>
+         <artifactId>infinispan-core</artifactId>
+         <version>4.0.0-SNAPSHOT</version>
+      </dependency>
+   </dependencies>
+</project>


Property changes on: trunk/tools/pom.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/html/HtmlGenerator.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/html/HtmlGenerator.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/html/HtmlGenerator.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,83 @@
+package org.infinispan.tools.doclet.html;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.List;
+
+/**
+ * Generates HTML documents
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public abstract class HtmlGenerator {
+   String encoding, title, bottom, footer, header, metaDescription;
+   List<String> metaKeywords;
+
+   public HtmlGenerator(String encoding, String title, String bottom, String footer, String header, String metaDescription, List<String> metaKeywords) {
+      this.encoding = encoding;
+      this.title = title;
+      this.footer = footer;
+      this.header = header;
+      this.bottom = bottom;
+      this.metaDescription = metaDescription;
+      this.metaKeywords = metaKeywords;
+   }
+
+   public void generateHtml(String fileName) throws IOException {
+      FileOutputStream fos = new FileOutputStream(fileName);
+      OutputStreamWriter osw = isValid(encoding) ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos);
+      PrintWriter writer = new PrintWriter(osw);
+      try {
+         writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n" +
+               "\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+         writer.println("<HTML xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">");
+         writer.println("<HEAD>");
+         if (isValid(metaDescription))
+            writer.println("<META NAME=\"description\" content=\"" + metaDescription + "\" />");
+         if (metaKeywords != null && !metaKeywords.isEmpty()) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("<META NAME=\"keywords\" content=\"");
+            for (String keyword : metaKeywords) sb.append(keyword).append(", ");
+            sb.append("\" />");
+         }
+         writer.println("<TITLE>");
+         writer.println(title);
+         writer.println("</TITLE>");
+         writer.println("<LINK REL=\"stylesheet\" HREF=\"stylesheet.css\" TYPE=\"text/css\"/>");
+
+         writer.println("</HEAD>");
+         writer.println("<BODY>");
+
+         if (isValid(header)) {
+            writer.println(header);
+            writer.println("<HR />");
+         }
+
+         writer.println(generateContents());
+
+         if (isValid(bottom)) {
+            writer.println("<HR />");
+            writer.println(bottom);
+         }
+
+         if (isValid(footer)) writer.println(footer);
+
+
+         writer.println("</BODY>");
+         writer.println("</HTML>");
+      } finally {
+         writer.close();
+         osw.close();
+         fos.close();
+      }
+   }
+
+   protected abstract String generateContents();
+
+   protected boolean isValid(String s) {
+      return s != null && !s.trim().equals("");
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/html/HtmlGenerator.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/html/JmxHtmlGenerator.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/html/JmxHtmlGenerator.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/html/JmxHtmlGenerator.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,100 @@
+package org.infinispan.tools.doclet.html;
+
+import org.infinispan.tools.doclet.jmx.MBeanAttribute;
+import org.infinispan.tools.doclet.jmx.MBeanComponent;
+import org.infinispan.tools.doclet.jmx.MBeanOperation;
+
+import java.util.List;
+
+public class JmxHtmlGenerator extends HtmlGenerator {
+   List<MBeanComponent> components;
+
+   public JmxHtmlGenerator(String encoding, String title, String bottom, String footer, String header, String metaDescription, List<String> metaKeywords, List<MBeanComponent> components) {
+      super(encoding, title, bottom, footer, header, metaDescription, metaKeywords);
+      this.components = components;
+   }
+
+   protected String generateContents() {
+      StringBuilder sb = new StringBuilder();
+      // index of components
+      sb.append("<h2>JMX Components available</h2><br />");
+      sb.append("<UL>");
+      for (MBeanComponent mbean : components) {
+         sb.append("<LI><A HREF=\"#").append(mbean.name).append("\">").append(mbean.name).append("</A>");
+         if (isValid(mbean.desc)) sb.append(" <I>(").append(mbean.desc).append(")</I>");
+         sb.append("</LI>\n");
+      }
+      sb.append("</UL>");
+      sb.append("<BR /><BR /><HR /><BR />");
+
+      // a table for each component.
+      for (MBeanComponent mbean : components) {
+         sb.append("<A NAME=\"").append(mbean.name).append("\">\n");
+         sb.append("<TABLE WIDTH=\"100%\" CELLSPACING=\"1\" CELLPADDING=\"0\" BORDER=\"1\">\n");
+         sb.append("<TR CLASS=\"TableHeadingColor\"><TH ALIGN=\"LEFT\"><b>Component <tt>").append(mbean.name).append("</tt></b>  (Class <TT><A HREF=\"")
+               .append(toURL(mbean.className)).append("\">").append(mbean.className).append("</A></TT>)");
+         if (isValid(mbean.desc)) sb.append("<br /><I>").append(mbean.desc).append("</I>\n");
+         sb.append("</TH></TR>\n");
+
+         if (!mbean.attributes.isEmpty()) {
+            // Attributes
+            sb.append("<TR CLASS=\"TableSubHeadingColor\"><TH ALIGN=\"LEFT\"><strong><i>Attributes</i></strong></TH></TR>\n");
+            sb.append("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\"><TD ALIGN=\"CENTER\"><TABLE WIDTH=\"100%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\">\n");
+            sb.append("<TR CLASS=\"TableSubHeadingColor\"><TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><strong>Name</strong></TD>\n");
+            sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\" WIDTH=\"40%\"><strong>Description</strong></TD>\n");
+            sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><strong>Type</strong></TD>\n");
+            sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><strong>Writable</strong></TD></TR>\n");
+            for (MBeanAttribute attr : mbean.attributes) {
+               sb.append("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><tt>").append(attr.name).append("</tt></TD>");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\">").append(attr.desc).append("</TD>");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><tt>").append(attr.type).append("</tt></TD>");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\">").append(attr.writable).append("</TD>");
+               sb.append("</TR>");
+            }
+            sb.append("</TABLE></TD></TR>");
+         }
+
+         if (!mbean.operations.isEmpty()) {
+            // Operations
+            sb.append("<TR CLASS=\"TableSubHeadingColor\"><TH ALIGN=\"LEFT\"><strong><i>Operations</i></strong></TH></TR>\n");
+            sb.append("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\"><TD ALIGN=\"CENTER\"><TABLE WIDTH=\"100%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\">\n");
+            sb.append("<TR CLASS=\"TableSubHeadingColor\"><TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><strong>Name</strong></TD>\n");
+            sb.append("<TD ALIGN=\"LEFT\" WIDTH=\"50%\" VALIGN=\"TOP\"><strong>Description</strong></TD>\n");
+            sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><strong>Signature</strong></TD></TR>\n");
+            for (MBeanOperation operation : mbean.operations) {
+               sb.append("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><tt>").append(operation.name).append("</tt></TD>");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\">").append(operation.desc).append("</TD>");
+               sb.append("<TD ALIGN=\"LEFT\" VALIGN=\"TOP\"><tt>").append(generateSignature(operation)).append("</tt></TD>");
+               sb.append("</TR>");
+            }
+            sb.append("</TABLE></TD></TR>");
+         }
+
+         sb.append("</TABLE><BR /><BR />");
+      }
+
+      return sb.toString();
+   }
+
+   private String toURL(String fqcn) {
+      return fqcn.replace(".", "/") + ".html";
+   }
+
+   private String generateSignature(MBeanOperation op) {
+      // <retType> <name>(<args>)
+      StringBuilder sb = new StringBuilder();
+      if (isValid(op.returnType))
+         sb.append(op.returnType);
+      else
+         sb.append("void");
+
+      sb.append(" ").append(op.name);
+      if (isValid(op.signature))
+         sb.append("(").append(op.signature).append(")");
+      else
+         sb.append("()");
+      return sb.toString();
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/html/JmxHtmlGenerator.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxComponent.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxComponent.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxComponent.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,33 @@
+package org.infinispan.tools.doclet.jmx;
+
+/**
+ * A JMX Component
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public abstract class JmxComponent implements Comparable<JmxComponent> {
+   public String name;
+   public String desc = "";
+
+   public int compareTo(JmxComponent other) {
+      return name.compareTo(other.name);
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      JmxComponent that = (JmxComponent) o;
+
+      if (name != null ? !name.equals(that.name) : that.name != null) return false;
+
+      return true;
+   }
+
+   @Override
+   public int hashCode() {
+      return name != null ? name.hashCode() : 0;
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxComponent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxDoclet.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxDoclet.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxDoclet.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,185 @@
+package org.infinispan.tools.doclet.jmx;
+
+import com.sun.javadoc.AnnotationDesc;
+import com.sun.javadoc.AnnotationTypeDoc;
+import com.sun.javadoc.ClassDoc;
+import com.sun.javadoc.DocErrorReporter;
+import com.sun.javadoc.FieldDoc;
+import com.sun.javadoc.MethodDoc;
+import com.sun.javadoc.Parameter;
+import com.sun.javadoc.RootDoc;
+import com.sun.tools.doclets.formats.html.ConfigurationImpl;
+import org.infinispan.jmx.annotations.MBean;
+import org.infinispan.jmx.annotations.ManagedAttribute;
+import org.infinispan.jmx.annotations.ManagedOperation;
+import org.infinispan.tools.doclet.html.HtmlGenerator;
+import org.infinispan.tools.doclet.html.JmxHtmlGenerator;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * A Doclet that generates a guide to all JMX components exposed by Infinispan
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public class JmxDoclet {
+   static String outputDirectory = ".";
+   static String header, footer, encoding, title, bottom;
+
+   public static boolean start(RootDoc root) throws IOException {
+      ClassDoc[] classes = root.classes();
+
+      List<MBeanComponent> mbeans = new LinkedList<MBeanComponent>();
+
+      for (ClassDoc cd : classes) {
+         MBeanComponent mbean = toJmxComponent(cd);
+         if (mbean != null) mbeans.add(mbean);
+      }
+
+      // sort components alphabetically
+      Collections.sort(mbeans);
+
+      HtmlGenerator generator = new JmxHtmlGenerator(encoding, jmxTitle(), bottom, footer, header, "JMX components exposed by Infinispan",
+                                                     Arrays.asList("JMX", "Infinispan", "Data Grids", "Documentation", "Reference", "MBeans", "Management", "Console"),
+                                                     mbeans);
+      generator.generateHtml(outputDirectory + File.separator + "jmxComponents.html");
+
+      return true;
+   }
+
+   private static String jmxTitle() {
+      String s = "JMX Components";
+      if (title == null || title.equals(""))
+         return s;
+      else {
+         s += " (" + title + ")";
+         return s;
+      }
+   }
+
+   public static int optionLength(String option) {
+      return (ConfigurationImpl.getInstance()).optionLength(option);
+   }
+
+   public static boolean validOptions(String options[][], DocErrorReporter reporter) {
+      for (String[] option : options) {
+//         System.out.println("  >> Option " + Arrays.toString(option));
+         if (option[0].equals("-d")) outputDirectory = option[1];
+         else if (option[0].equals("-encoding")) encoding = option[1];
+         else if (option[0].equals("-bottom")) bottom = option[1];
+         else if (option[0].equals("-footer")) footer = option[1];
+         else if (option[0].equals("-header")) header = option[1];
+         else if (option[0].equals("-doctitle")) title = option[1];
+      }
+      return (ConfigurationImpl.getInstance()).validOptions(options, reporter);
+   }
+
+   private static MBeanComponent toJmxComponent(ClassDoc cd) {
+      boolean isMBean = false;
+      MBeanComponent mbc = new MBeanComponent();
+      mbc.className = cd.qualifiedTypeName();
+      mbc.name = cd.typeName();
+
+      for (AnnotationDesc a : cd.annotations()) {
+         AnnotationTypeDoc atd = a.annotationType();
+         String annotationName = atd.qualifiedTypeName();
+
+         if (annotationName.equals(MBean.class.getName())) {
+            isMBean = true;
+            setNameDesc(a.elementValues(), mbc);
+         }
+      }
+
+      // now to test method level annotations
+      for (MethodDoc method : cd.methods()) {
+         for (AnnotationDesc a : method.annotations()) {
+            String annotationName = a.annotationType().qualifiedTypeName();
+            if (annotationName.equals(ManagedOperation.class.getName())) {
+               isMBean = true;
+               MBeanOperation o = new MBeanOperation();
+               o.name = method.name();
+               setNameDesc(a.elementValues(), o);
+               o.returnType = method.returnType().simpleTypeName();
+               for (Parameter p : method.parameters()) o.addParam(p.type().simpleTypeName());
+               mbc.operations.add(o);
+
+
+            } else if (annotationName.equals(ManagedAttribute.class.getName())) {
+               isMBean = true;
+               MBeanAttribute attr = new MBeanAttribute();
+
+               // if this is a getter, look at the return type
+               if (method.name().startsWith("get")) {
+                  attr.type = method.returnType().simpleTypeName();
+               } else if (method.parameters().length > 0) {
+                  attr.type = method.parameters()[0].type().simpleTypeName();
+               }
+
+               attr.name = fromBeanConvention(method.name());
+               setNameDesc(a.elementValues(), attr);
+               setWritable(a.elementValues(), attr);
+               mbc.attributes.add(attr);
+            }
+         }
+      }
+
+      // and field level annotations
+      for (FieldDoc field : cd.fields()) {
+         for (AnnotationDesc a : field.annotations()) {
+            String annotationName = a.annotationType().qualifiedTypeName();
+            if (annotationName.equals(ManagedAttribute.class.getName())) {
+               isMBean = true;
+               MBeanAttribute attr = new MBeanAttribute();
+               attr.name = field.name();
+               attr.type = field.type().simpleTypeName();
+               setNameDesc(a.elementValues(), attr);
+               setWritable(a.elementValues(), attr);
+               mbc.attributes.add(attr);
+            }
+         }
+      }
+
+      if (isMBean) {
+         Collections.sort(mbc.attributes);
+         Collections.sort(mbc.operations);
+         return mbc;
+      } else {
+         return null;
+      }
+   }
+
+   private static String fromBeanConvention(String getterOrSetter) {
+      if (getterOrSetter.startsWith("get") || getterOrSetter.startsWith("set")) {
+         String withoutGet = getterOrSetter.substring(4);
+         return Character.toLowerCase(getterOrSetter.charAt(3)) + withoutGet;
+      }
+      return getterOrSetter;
+   }
+
+   private static void setNameDesc(AnnotationDesc.ElementValuePair[] evps, JmxComponent mbc) {
+      for (AnnotationDesc.ElementValuePair evp : evps) {
+         if (evp.element().name().equals("objectName")) {
+            mbc.name = evp.value().value().toString();
+         } else if (evp.element().name().equals("name")) {
+            mbc.name = evp.value().value().toString();
+         } else if (evp.element().name().equals("description")) {
+            mbc.desc = evp.value().value().toString();
+         }
+      }
+   }
+
+   private static void setWritable(AnnotationDesc.ElementValuePair[] evps, MBeanAttribute attr) {
+      for (AnnotationDesc.ElementValuePair evp : evps) {
+         if (evp.element().name().equals("writable")) {
+            attr.writable = (Boolean) evp.value().value();
+         }
+      }
+   }
+}
+


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/JmxDoclet.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanAttribute.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanAttribute.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanAttribute.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,17 @@
+package org.infinispan.tools.doclet.jmx;
+
+/**
+ * An MBean attribute
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public class MBeanAttribute extends JmxComponent {
+   public boolean writable;
+   public String type;
+
+   @Override
+   public String toString() {
+      return "Attribute(name = " + name + ", writable = " + writable + ", type = " + type + ", desc = " + desc + ")";
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanAttribute.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanComponent.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanComponent.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanComponent.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,21 @@
+package org.infinispan.tools.doclet.jmx;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * * An MBean component
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public class MBeanComponent extends JmxComponent {
+   public String className;
+   public List<MBeanOperation> operations = new LinkedList<MBeanOperation>();
+   public List<MBeanAttribute> attributes = new LinkedList<MBeanAttribute>();
+
+   @Override
+   public String toString() {
+      return "MBean component " + name + " (class " + className + ") op = " + operations + " attr = " + attributes;
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanComponent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanOperation.java
===================================================================
--- trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanOperation.java	                        (rev 0)
+++ trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanOperation.java	2009-06-04 00:28:21 UTC (rev 409)
@@ -0,0 +1,23 @@
+package org.infinispan.tools.doclet.jmx;
+
+/**
+ * An MBean operation
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public class MBeanOperation extends JmxComponent {
+   public String returnType = "void";
+   public String signature = "";
+   int n = 0;
+
+   @Override
+   public String toString() {
+      return "Operation(name = " + name + ", desc = " + desc + ", sig = " + signature + ", retType = " + returnType + ")";
+   }
+
+   void addParam(String paramType) {
+      if (!signature.equals("")) signature += ", ";
+      signature += paramType + " p" + n++;
+   }
+}


Property changes on: trunk/tools/src/main/java/org/infinispan/tools/doclet/jmx/MBeanOperation.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF




More information about the infinispan-commits mailing list