[jboss-svn-commits] JBL Code SVN: r29362 - in labs/jbossrules/trunk: drools-doc and 20 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Sep 16 02:56:47 EDT 2009


Author: Rikkola
Date: 2009-09-16 02:56:47 -0400 (Wed, 16 Sep 2009)
New Revision: 29362

Added:
   labs/jbossrules/trunk/drools-doc/
   labs/jbossrules/trunk/drools-doc/.classpath
   labs/jbossrules/trunk/drools-doc/.project
   labs/jbossrules/trunk/drools-doc/.settings/
   labs/jbossrules/trunk/drools-doc/.settings/org.eclipse.jdt.core.prefs
   labs/jbossrules/trunk/drools-doc/pom.xml
   labs/jbossrules/trunk/drools-doc/src/
   labs/jbossrules/trunk/drools-doc/src/main/
   labs/jbossrules/trunk/drools-doc/src/main/java/
   labs/jbossrules/trunk/drools-doc/src/main/java/org/
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlPackageData.java
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlRuleData.java
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsBuilder.java
   labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsComponentFactory.java
   labs/jbossrules/trunk/drools-doc/src/main/resources/
   labs/jbossrules/trunk/drools-doc/src/main/resources/org/
   labs/jbossrules/trunk/drools-doc/src/main/resources/org/drools/
   labs/jbossrules/trunk/drools-doc/src/test/
   labs/jbossrules/trunk/drools-doc/src/test/java/
   labs/jbossrules/trunk/drools-doc/src/test/java/org/
   labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/
   labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/
   labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlPackageDataTest.java
   labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlRuleDataTest.java
   labs/jbossrules/trunk/drools-doc/src/test/resources/
   labs/jbossrules/trunk/drools-doc/src/test/resources/org/
   labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/
   labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/doc/
   labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/doc/simple.drl
   labs/jbossrules/trunk/drools-doc/target/
   labs/jbossrules/trunk/drools-doc/target/classes/
   labs/jbossrules/trunk/drools-doc/target/drools-doc-sources.jar
   labs/jbossrules/trunk/drools-doc/target/drools-doc-test-sources.jar
   labs/jbossrules/trunk/drools-doc/target/drools-doc.jar
   labs/jbossrules/trunk/drools-doc/target/maven-archiver/
   labs/jbossrules/trunk/drools-doc/target/maven-archiver/pom.properties
   labs/jbossrules/trunk/drools-doc/target/test-classes/
Log:
GUVNOR-96 : Documentation generation for all rules in a package
- DroolsDoc project

Added: labs/jbossrules/trunk/drools-doc/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-doc/.classpath	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/.classpath	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,18 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" including="**" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/bouncycastle/bcmail-jdk14/138/bcmail-jdk14-138.jar"/>
+  <classpathentry kind="var" path="M2_REPO/bouncycastle/bcprov-jdk14/138/bcprov-jdk14-138.jar"/>
+  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/lowagie/itext/2.1.2/itext-2.1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.6/junit-4.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
+</classpath>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-doc/.project
===================================================================
--- labs/jbossrules/trunk/drools-doc/.project	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/.project	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>drools-doc</name>
+  <comment>A rule production system</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-doc/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- labs/jbossrules/trunk/drools-doc/.settings/org.eclipse.jdt.core.prefs	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/.settings/org.eclipse.jdt.core.prefs	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,5 @@
+#Wed Aug 26 09:49:52 EEST 2009
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5

Added: labs/jbossrules/trunk/drools-doc/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-doc/pom.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/pom.xml	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/maven-v4_0_0.xsd">
+  
+<modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>drools</artifactId>
+    <groupId>org.drools</groupId>
+    <version>5.1.0.SNAPSHOT</version>
+  </parent>
+
+  <artifactId>drools-doc</artifactId>
+  <packaging>jar</packaging>
+  <name>Drools :: DroolsDoc</name>
+
+  <build>
+    <finalName>drools-doc</finalName>
+    <!-- Need Java 5 source enabled -->
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.0.1</version>
+          <configuration>
+            <source>1.5</source>
+            <target>1.5</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>    
+  </build>
+
+  <dependencies>
+  
+    <dependency>
+	    <groupId>com.lowagie</groupId>
+	    <artifactId>itext</artifactId>
+	    <version>2.1.2</version>
+	</dependency> 
+
+  </dependencies>
+</project>

Added: labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlPackageData.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlPackageData.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlPackageData.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,104 @@
+package org.drools.doc;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DrlPackageData {
+    private static final String            packageExpr  = "(^\\s*#.*?\\n)?(^\\s*package.*?$)(.*?)";
+    private static final Pattern           finder       = Pattern.compile( packageExpr,
+                                                                           Pattern.DOTALL | Pattern.MULTILINE );
+
+    private static final Pattern           globalFinder = Pattern.compile( "(^\\s*global.*?$)",
+                                                                           Pattern.DOTALL | Pattern.MULTILINE );
+
+    final String                           packageName;
+    final List<DrlRuleData>                rules;
+    final String                           description;
+
+    public final List<String>              metadata;
+
+    public final Map<String, List<String>> otherInformation;
+    public final List<String>              globals;
+
+    public DrlPackageData(String packageName,
+                          String description,
+                          List<DrlRuleData> rules,
+                          List<String> globals,
+                          List<String> metadata,
+                          Map<String, List<String>> otherInformation) {
+        this.packageName = packageName;
+        this.description = description;
+        this.rules = rules;
+        this.globals = globals;
+        this.metadata = metadata;
+        this.otherInformation = otherInformation;
+    }
+
+    public static DrlPackageData findPackageDataFromDrl(String drl) {
+
+        final Matcher m = finder.matcher( drl );
+        m.find();
+
+        String packageNameRow = m.group( 2 );
+
+        int indexOfPackage = packageNameRow.indexOf( "package" );
+        String packageName = packageNameRow.substring( indexOfPackage + "package".length() ).trim();
+
+        Comment comment = DrlRuleData.processComment( m.group( 1 ) );
+
+        return new DrlPackageData( packageName,
+                                   comment.description,
+                                   DrlRuleData.findRulesDataFromDrl( drl ),
+                                   findGlobals( drl ),
+                                   comment.metadata,
+                                   new HashMap<String, List<String>>() );
+    }
+
+    public static List<String> findGlobals(String drl) {
+        List<String> globals = new ArrayList<String>();
+        Matcher gm = globalFinder.matcher( drl );
+
+        while ( gm.find() ) {
+            String row = gm.group();
+            globals.add( row.substring( row.indexOf( "global" ) + "global".length() ).trim() );
+        }
+
+        return globals;
+    }
+
+    static Comment processComment(String text) {
+        Comment comment = new Comment();
+
+        if ( text == null ) {
+            comment.description = "";
+            comment.metadata = new ArrayList<String>();
+
+            return comment;
+        }
+
+        comment.description = text.replaceAll( "#",
+                                               "" ).trim();
+        comment.metadata = findMetaData( text );
+
+        return comment;
+    }
+
+    private static List<String> findMetaData(String text) {
+        List<String> list = new ArrayList<String>();
+
+        while ( text.contains( "@" ) ) {
+            int start = text.indexOf( '@' );
+            text = text.substring( start + 1 );
+            int end = text.indexOf( "\n" );
+            list.add( text.substring( 0,
+                                      end ) );
+            text = text.substring( end );
+        }
+
+        return list;
+    }
+}

Added: labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlRuleData.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlRuleData.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DrlRuleData.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,127 @@
+package org.drools.doc;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DrlRuleData {
+    private static final String            rulesExpr = "(^\\s*#.*?\\n)?(^\\s*rule.*?$)(.*?)(when)(.*?)(then)(.*?)(^\\s*end)";
+
+    private static final Pattern           finder    = Pattern.compile( rulesExpr,
+                                                                        Pattern.DOTALL | Pattern.MULTILINE );
+
+    public final Collection<String>        header;
+    public final Collection<String>        lhs;
+    public final Collection<String>        rhs;
+
+    public final String                    ruleName;
+
+    public final String                    description;
+
+    public final Collection<String>        metadata;
+
+    public final Map<String, List<String>> otherInformation;
+
+    private DrlRuleData(String ruleName,
+                        String header,
+                        String lhs,
+                        String rhs,
+                        String description,
+                        List<String> metadata,
+                        Map<String, List<String>> otherInformation) {
+        this.ruleName = ruleName;
+        this.header = asList( header.split( "\n" ) );
+        this.lhs = asList( lhs.split( "\n" ) );
+        this.rhs = asList( rhs.split( "\n" ) );
+        this.description = description;
+        this.metadata = metadata;
+        this.otherInformation = otherInformation;
+    }
+
+    private Collection<String> asList(String[] array) {
+        Collection<String> list = new ArrayList<String>();
+
+        for ( int i = 0; i < array.length; i++ ) {
+            String string = array[i];
+            if ( !string.trim().equals( "" ) ) {
+                list.add( string );
+            }
+        }
+
+        return list;
+    }
+
+    public static List<DrlRuleData> findRulesDataFromDrl(String drl) {
+        final Matcher m = finder.matcher( drl );
+        final List<DrlRuleData> list = new ArrayList<DrlRuleData>();
+
+        while ( m.find() ) {
+
+            //            System.out.println( "1 " + m.group( 1 ) );
+            //            System.out.println( "2 " + m.group( 2 ) );
+            //            System.out.println( "3 " + m.group( 3 ) );
+            //            System.out.println( "4 " + m.group( 4 ) );
+            //            System.out.println( "5 " + m.group( 5 ) );
+            //            System.out.println( "6 " + m.group( 6 ) );
+            //            System.out.println( "7 " + m.group( 7 ) );
+
+            Comment comment = processComment( m.group( 1 ) );
+
+            String ruleName = m.group( 2 );
+
+            ruleName = ruleName.substring( ruleName.indexOf( "rule" ) + "rule".length() ).trim();
+
+            list.add( new DrlRuleData( ruleName,
+                                       m.group( 3 ),
+                                       m.group( 5 ),
+                                       m.group( 7 ),
+                                       comment.description,
+                                       comment.metadata,
+                                       new HashMap<String, List<String>>() ) );
+        }
+
+        return list;
+    }
+
+    static Comment processComment(String text) {
+        Comment comment = new Comment();
+
+        if ( text == null ) {
+            comment.description = "";
+            comment.metadata = new ArrayList<String>();
+
+            return comment;
+        }
+
+        comment.description = text.replaceAll( "#",
+                                               "" ).trim();
+        comment.metadata = findMetaData( text );
+
+        return comment;
+    }
+
+    private static List<String> findMetaData(String text) {
+        List<String> list = new ArrayList<String>();
+
+        while ( text.contains( "@" ) ) {
+            int start = text.indexOf( '@' );
+            text = text.substring( start + 1 );
+            int end = text.indexOf( "\n" );
+            list.add( text.substring( 0,
+                                      end ) );
+            text = text.substring( end );
+        }
+
+        return list;
+    }
+}
+
+class Comment {
+    String       description;
+    List<String> metadata;
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsBuilder.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,95 @@
+package org.drools.doc;
+
+import java.io.OutputStream;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.pdf.PdfWriter;
+
+/**
+ * 
+ * @author Toni Rikkola
+ *
+ */
+public class DroolsDocsBuilder {
+
+    protected final String currentDate = getFormatter().format( new Date() );
+
+    protected static Format getFormatter() {
+        return new SimpleDateFormat( getDateFormatMask() );
+    }
+
+    private final DrlPackageData packageData;
+
+    protected DroolsDocsBuilder(String packageDrl) {
+        this.packageData = DrlPackageData.findPackageDataFromDrl( packageDrl );
+    }
+
+    protected DroolsDocsBuilder(DrlPackageData packageData) {
+        this.packageData = packageData;
+    }
+
+    public static DroolsDocsBuilder getInstance(String packageDrl) {
+        return new DroolsDocsBuilder( packageDrl );
+    }
+
+    public static DroolsDocsBuilder getInstance(DrlPackageData packageData) {
+        return new DroolsDocsBuilder( packageData );
+    }
+
+    public void writePDF(OutputStream out) {
+
+        // TODO: Use i18n!
+
+        Document document = new Document();
+
+        try {
+            PdfWriter.getInstance( document,
+                                   out );
+
+            HeaderFooter footer = DroolsDocsComponentFactory.createFooter( packageData.packageName );
+
+            document.setFooter( footer );
+
+            document.addTitle( packageData.packageName.toUpperCase() );
+            document.open();
+
+            // First page, documentation info.            
+            DroolsDocsComponentFactory.createFirstPage( document,
+                                                        currentDate,
+                                                        packageData );
+
+            document.newPage();
+
+            // List index of the rules            
+            document.add( new Phrase( "Contents" ) );
+            document.add( DroolsDocsComponentFactory.createContents( packageData.rules ) );
+
+            document.newPage();
+
+            for ( DrlRuleData ruleData : packageData.rules ) {
+                DroolsDocsComponentFactory.createRulePage( document,
+                                                           packageData.packageName,
+                                                           ruleData );
+            }
+
+        } catch ( DocumentException de ) {
+            System.err.println( de.getMessage() );
+        }
+
+        document.close();
+    }
+
+    public static String getDateFormatMask() {
+        String fmt = System.getProperty( "drools.dateformat" );
+        if ( fmt == null ) {
+            fmt = "dd-MMM-yyyy";
+        }
+        return fmt;
+    }
+}

Added: labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsComponentFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsComponentFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/main/java/org/drools/doc/DroolsDocsComponentFactory.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,289 @@
+package org.drools.doc;
+
+import java.awt.Color;
+import java.util.Collection;
+import java.util.Map;
+
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Cell;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Image;
+import com.lowagie.text.List;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Table;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfPageEventHelper;
+import com.lowagie.text.pdf.PdfWriter;
+
+public class DroolsDocsComponentFactory {
+
+    private static final int    INTENTATION_LEFT   = 20;
+
+    private static final String INDENT             = "    ";
+
+    private static final Font   CHAPTER_TITLE      = FontFactory.getFont( FontFactory.TIMES,
+                                                                          20,
+                                                                          Font.BOLD );
+    private static final Font   PACKAGE_NAME       = FontFactory.getFont( FontFactory.TIMES,
+                                                                          10,
+                                                                          Font.BOLD );
+    private static final Font   RULE_PACKAGE_TITLE = FontFactory.getFont( FontFactory.TIMES,
+                                                                          24,
+                                                                          Font.BOLD );
+    private static final Font   CATEGORIES_TEXT    = FontFactory.getFont( FontFactory.TIMES,
+                                                                          12 );
+    private static final Font   BODY_TEXT          = FontFactory.getFont( FontFactory.TIMES,
+                                                                          10 );
+    static final Font           HEADER_FOOTER_TEXT = FontFactory.getFont( FontFactory.TIMES,
+                                                                          8 );
+
+    public static Table createDescription(String description) throws DocumentException {
+        Table table = createEmptyTable();
+
+        Cell headerCell = newEmptyHeaderCell( "Description" );
+        table.addCell( headerCell );
+
+        table.addCell( newEmptyCell( INDENT + description ) );
+
+        return table;
+    }
+
+    private static Table createEmptyTable() throws BadElementException {
+        Table table = new Table( 1 );
+        table.setBorderWidthTop( 1 );
+        table.setBorderWidthLeft( 1 );
+        table.setBorderWidthRight( 1 );
+        table.setBorderWidthBottom( 0 );
+        table.setPadding( 3 );
+        table.setAlignment( Table.ALIGN_LEFT );
+        return table;
+    }
+
+    public static void createOtherItems(Document document,
+                                        Map<String, java.util.List<String>> other) throws DocumentException {
+
+        for ( String key : other.keySet() ) {
+            document.add( createTable( key,
+                                       other.get( key ) ) );
+        }
+    }
+
+    public static Table createRuleTable(DrlRuleData drl) throws BadElementException,
+                                                        DocumentException {
+        Table table = createEmptyTable();
+
+        Cell headerCell = newEmptyWhenThenCell( "Attributes" );
+        table.addCell( headerCell );
+
+        for ( String s : drl.header ) {
+            table.addCell( newEmptyCell( INDENT + s.trim() ) );
+        }
+
+        table.addCell( newEmptyWhenThenCell( INDENT + "WHEN" ) );
+        for ( String s : drl.lhs ) {
+            table.addCell( newEmptyCell( INDENT + INDENT + s.trim() ) );
+        }
+
+        table.addCell( newEmptyWhenThenCell( INDENT + "THEN" ) );
+        for ( String s : drl.rhs ) {
+            table.addCell( newEmptyCell( INDENT + INDENT + s.trim() ) );
+        }
+        //        table.addCell( newEmptyWhenThenCell( "END" ) );
+
+        return table;
+    }
+
+    public static Table createTable(final String topic,
+                                    Collection<String> items) throws BadElementException,
+                                                             DocumentException {
+        Table metadata = createEmptyTable();
+
+        Cell headerCell = newEmptyHeaderCell( topic );
+        metadata.addCell( headerCell );
+
+        for ( String s : items ) {
+            metadata.addCell( newEmptyCell( s ) );
+        }
+
+        return metadata;
+    }
+
+    public static Table createMetaDataTable(Collection<String> metadatas) throws BadElementException,
+                                                                         DocumentException {
+        Table metadata = createEmptyTable();
+
+        Cell headerCell = newEmptyHeaderCell( "META DATA" );
+        metadata.addCell( headerCell );
+
+        for ( String s : metadatas ) {
+            metadata.addCell( newEmptyCell( INDENT + s ) );
+        }
+
+        return metadata;
+    }
+
+    public static List createContents(java.util.List<DrlRuleData> rules) {
+        List index = new List( true );
+
+        for ( DrlRuleData drlRuleData : rules ) {
+            Chunk chunk = new Chunk( drlRuleData.ruleName );
+            //                chunk.setLocalGoto( item.getName() );
+            ListItem listItem = new ListItem( chunk );
+            index.add( listItem );
+        }
+        return index;
+    }
+
+    private static Cell newEmptyWhenThenCell(String text) throws BadElementException {
+        Cell c = new Cell( new Phrase( text,
+                                       BODY_TEXT ) );
+        c.setBackgroundColor( Color.decode( "#CCCCFF" ) );
+        c.setLeading( 10 );
+        c.setBorder( 1 );
+        return c;
+    }
+
+    private static Cell newEmptyHeaderCell(String text) throws BadElementException {
+        Cell c = new Cell( new Phrase( text,
+                                       CATEGORIES_TEXT ) );
+        c.setBackgroundColor( Color.decode( "#CCCCFF" ) );
+        c.setLeading( 10 );
+        c.setBorder( 0 );
+        c.setBorderWidthBottom( 1 );
+        return c;
+    }
+
+    private static Cell newEmptyCell(String text) throws BadElementException {
+        Cell c = new Cell( new Phrase( text,
+                                       BODY_TEXT ) );
+        c.setLeading( 10 );
+        c.setBorder( 0 );
+        c.setBorderWidthBottom( 1 );
+        return c;
+    }
+
+    public static HeaderFooter createFooter(String packageName) {
+        HeaderFooter footer = new HeaderFooter( new Phrase( packageName + "-",
+                                                            HEADER_FOOTER_TEXT ),
+                                                true );
+        footer.setBorder( 1 );
+        footer.setAlignment( Element.ALIGN_RIGHT );
+
+        return footer;
+    }
+
+    public static void createRulePage(Document document,
+                                      String packageName,
+                                      DrlRuleData drlData) throws DocumentException {
+
+        document.add( new Paragraph( packageName,
+                                     PACKAGE_NAME ) );
+        document.add( new Paragraph( "Rule " + drlData.ruleName,
+                                     CHAPTER_TITLE ) );
+
+        // Extends
+        int index = drlData.ruleName.lastIndexOf( "extends" );
+        if ( index > 0 ) {
+            document.add( new Paragraph( "Extends:",
+                                         BODY_TEXT ) );
+
+            Paragraph ext = new Paragraph( drlData.ruleName.substring( "extends".length() + index ),
+                                           BODY_TEXT );
+            ext.setIndentationLeft( INTENTATION_LEFT );
+            document.add( ext );
+        }
+
+        // Description
+        document.add( createDescription( drlData.description ) );
+
+        // DRL
+        document.add( createRuleTable( drlData ) );
+
+        // Meta data
+        document.add( createMetaDataTable( drlData.metadata ) );
+
+        // Other
+        createOtherItems( document,
+                          drlData.otherInformation );
+
+        document.newPage();
+    }
+
+    public static void createFirstPage(Document document,
+                                       String currentDate,
+                                       DrlPackageData packageData) throws DocumentException {
+        Paragraph title = new Paragraph( "\n\n\n\n\n" + packageData.packageName.toUpperCase(),
+                                         RULE_PACKAGE_TITLE );
+        title.setAlignment( Element.ALIGN_CENTER );
+        document.add( title );
+
+        Paragraph date = new Paragraph( "Documentation created: " + currentDate,
+                                        BODY_TEXT );
+        date.setAlignment( Element.ALIGN_CENTER );
+        document.add( date );
+
+        document.add( new Paragraph( "\n\n\n\n\nDescription: " + packageData.description,
+                                     BODY_TEXT ) );
+        document.add( createTable( "Metadata: ",
+                                   packageData.metadata ) );
+        document.add( createTable( "Globals: ",
+                                   packageData.globals ) );
+        createOtherItems( document,
+                          packageData.otherInformation );
+    }
+}
+
+class EndPage extends PdfPageEventHelper {
+    private final String currentDate;
+
+    public EndPage(String currentDate) {
+        this.currentDate = currentDate;
+    }
+
+    public void onEndPage(PdfWriter writer,
+                          Document document) {
+
+        try {
+            Image image = Image.getInstance( DroolsDocsBuilder.class.getResource( "drools-guvnor.png" ) );
+            image.setAlignment( Image.RIGHT );
+            image.scaleAbsolute( 100,
+                                 30 );
+            Rectangle page = document.getPageSize();
+            PdfPTable head = new PdfPTable( 2 );
+
+            PdfPCell cell1 = new PdfPCell( image );
+            cell1.setHorizontalAlignment( Element.ALIGN_LEFT );
+            cell1.setBorder( 0 );
+
+            head.addCell( cell1 );
+
+            PdfPCell cell2 = new PdfPCell( new Phrase( currentDate,
+                                                       DroolsDocsComponentFactory.HEADER_FOOTER_TEXT ) );
+            cell2.setHorizontalAlignment( Element.ALIGN_RIGHT );
+            cell2.setBorder( 0 );
+
+            head.addCell( cell2 );
+
+            head.setTotalWidth( page.getWidth() - document.leftMargin() - document.rightMargin() );
+            head.writeSelectedRows( 0,
+                                    -1,
+                                    document.leftMargin(),
+                                    page.getHeight() - document.topMargin() + head.getTotalHeight(),
+                                    writer.getDirectContent() );
+
+        } catch ( Exception e ) {
+            throw new ExceptionConverter( e );
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlPackageDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlPackageDataTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlPackageDataTest.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,84 @@
+package org.drools.doc;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class DrlPackageDataTest extends TestCase {
+    public void testHandleDrl() {
+
+        String rule1 = "";
+        rule1 += "package org.drools.test\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule rule1\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+        rule1 += "rule rule2\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+
+        DrlPackageData s = DrlPackageData.findPackageDataFromDrl( rule1 );
+
+        assertEquals( "org.drools.test",
+                      s.packageName );
+        assertEquals( 2,
+                      s.rules.size() );
+        assertEquals( "",
+                      s.description );
+
+    }
+
+    public void testHandleDrlWithComments() {
+
+        String rule1 = "";
+        rule1 += "# important information\n";
+        rule1 += "# about this package\n";
+        rule1 += "# it contains some rules\n";
+        rule1 += "package org.drools.test\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule rule1\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+        rule1 += "rule rule2\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+
+        DrlPackageData data = DrlPackageData.findPackageDataFromDrl( rule1 );
+
+        assertEquals( "org.drools.test",
+                      data.packageName );
+        assertEquals( 2,
+                      data.rules.size() );
+        assertEquals( "rule1",
+                      data.rules.get( 0 ).ruleName );
+        assertEquals( "rule2",
+                      data.rules.get( 1 ).ruleName );
+        assertEquals( 1,
+                      data.globals.size() );
+        assertEquals( "java.util.List list",
+                      data.globals.get( 0 ) );
+        assertEquals( "important information\n about this package\n it contains some rules",
+                      data.description );
+    }
+
+    public void testfindGlobals() {
+
+        String header = "global LoanApplication gg";
+
+        List<String> globals = DrlPackageData.findGlobals( header );
+
+        assertEquals( 1,
+                      globals.size() );
+        assertEquals( "LoanApplication gg",
+                      globals.get( 0 ) );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlRuleDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlRuleDataTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/test/java/org/drools/doc/DrlRuleDataTest.java	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,155 @@
+package org.drools.doc;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class DrlRuleDataTest extends TestCase {
+    public void testHandleDrl() {
+        String drl = 
+            "rule \"Something\" \n " + 
+            "dialect \"Java\" \n " + 
+            "when \n " + 
+            "Person() \n " + 
+            "Cheesery() \n " + 
+            "then \n " + 
+            "insert( new Person()) \n " + 
+            "insert( new Car()) \n " + 
+            "insert( new Cheese()) \n " + 
+            "end ";
+        
+        DrlRuleData s = DrlRuleData.findRulesDataFromDrl( drl ).get( 0 );
+
+        assertEquals( 1,
+                      s.header.size() );
+        assertEquals( 2,
+                      s.lhs.size() );
+        assertEquals( 3,
+                      s.rhs.size() );
+        assertEquals( "",
+                      s.description );
+        
+    }
+    
+    public void testHandleDrlNoLineBreaks() {
+        String drl = 
+            "rule \"CreditScoreApproval\" \n" + 
+               "dialect \"mvel\" \n" +
+               "when    then" +
+                   "applicant.setApproved(true) \n" +
+                   "applicant.setName( \"Toni\" ) \n" +
+                   "applicant.setAge( 10 ) \n" +
+            "end";
+        DrlRuleData s = DrlRuleData.findRulesDataFromDrl( drl ).get( 0 );
+
+        assertNotNull( s );
+
+        assertEquals( 1,
+                      s.header.size() );
+        assertEquals( 0,
+                      s.lhs.size() );
+        assertEquals( 3,
+                      s.rhs.size() );
+        assertEquals( "",
+                      s.description );
+        
+    }
+
+    public void testHandleDrlWithComment() {
+        String drl = 
+            "# Really important information about this rule \n" + 
+            "# Another line because one was not enough \n" + 
+            "#  \n" + 
+            "# @author: trikkola \n" + 
+            "rule \"First\" \n" + 
+            "dialect \"mvel\" \n" +
+            "when \n " + 
+            "Person() \n " + 
+            "Cheesery() \n " + 
+            "then \n " + 
+            "applicant.setApproved(true) \n" +
+            "applicant.setName( \"Toni\" ) \n" +
+            "applicant.setAge( 10 ) \n" +
+            "end \n" +
+            "\n" +
+            "# Really important information about this rule \n" + 
+            "# Another line because one was not enough \n" + 
+            "#  \n" + 
+            "# @author: trikkola \n" + 
+            "# @created: 29.12.2001 \n" + 
+            "# @edited: 5.5.2005 \n" + 
+            "rule \"Second\" \n" + 
+            "dialect \"mvel\" \n" +
+            "when \n " + 
+            "Person() \n " + 
+            "Cheesery() \n " + 
+            "then \n " + 
+            "applicant.setApproved(true) \n" +
+            "applicant.setName( \"Toni\" ) \n" +
+            "applicant.setAge( 10 ) \n" +
+            "end" +
+            "\n" +
+            "rule \"Third\" \n" + 
+            "dialect \"mvel\" \n" +
+            "when \n " + 
+            "Person() \n " + 
+            "Cheesery() \n " + 
+            "then \n " + 
+            "applicant.setApproved(true) \n" +
+            "applicant.setName( \"Toni\" ) \n" +
+            "applicant.setAge( 10 ) \n" +
+            "end";
+        
+        
+        List<DrlRuleData> list = DrlRuleData.findRulesDataFromDrl( drl );
+
+        assertEquals( 3,
+                      list.size() );
+
+        DrlRuleData rd = list.get( 0 );
+
+        assertNotNull( rd );
+
+        assertEquals( 1,
+                      rd.header.size() );
+        assertEquals( 2,
+                      rd.lhs.size() );
+        assertEquals( 3,
+                      rd.rhs.size() );
+        assertEquals( 1,
+                      rd.metadata.size() );
+        assertNotNull( rd.description );
+        assertNotSame( "",
+                       rd.description );
+        
+        DrlRuleData rd2 = list.get( 1 );
+
+        assertNotNull( rd2 );
+
+        assertEquals( 1,
+                      rd2.header.size() );
+        assertEquals( 2,
+                      rd2.lhs.size() );
+        assertEquals( 3,
+                      rd2.rhs.size() );
+        assertEquals( 3,
+                      rd2.metadata.size() );
+        assertNotNull( rd2.description );
+        assertNotSame( "",
+                       rd2.description );
+
+        DrlRuleData rd3 = list.get( 2 );
+
+        assertNotNull( rd3 );
+
+        assertEquals( 1,
+                      rd3.header.size() );
+        assertEquals( 2,
+                      rd3.lhs.size() );
+        assertEquals( 3,
+                      rd3.rhs.size() );
+        assertNotNull( rd3.description );
+        assertEquals( "",
+                       rd3.description );
+    }
+}

Added: labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/doc/simple.drl
===================================================================
--- labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/doc/simple.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/src/test/resources/org/drools/doc/simple.drl	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,29 @@
+#created on: 12-Sep-2009
+package org.drools.doc
+
+#list any import classes here.
+
+
+
+#declare any global variables here
+
+
+
+
+rule "Your First Rule"
+	
+	when
+		#conditions
+	then 
+		#actions
+		
+end
+
+rule "Your Second Rule"
+	#include attributes such as "salience" here...
+	when
+		#conditions
+	then 
+		#actions
+		
+end

Added: labs/jbossrules/trunk/drools-doc/target/drools-doc-sources.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-doc/target/drools-doc-sources.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-doc/target/drools-doc-test-sources.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-doc/target/drools-doc-test-sources.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-doc/target/drools-doc.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-doc/target/drools-doc.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-doc/target/maven-archiver/pom.properties
===================================================================
--- labs/jbossrules/trunk/drools-doc/target/maven-archiver/pom.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-doc/target/maven-archiver/pom.properties	2009-09-16 06:56:47 UTC (rev 29362)
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Mon Sep 14 13:05:52 EEST 2009
+version=5.1.0.SNAPSHOT
+groupId=org.drools
+artifactId=drools-doc



More information about the jboss-svn-commits mailing list