/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.verifier.doc; import java.awt.Color; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Vector; import org.drools.verifier.misc.DrlPackageParser; import org.drools.verifier.misc.DrlRuleParser; 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 INDENTATION_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 newDescription(String description) throws DocumentException { if ( description == null || "".equals( description ) ) { description = " - "; } Table table = newTable(); Cell headerCell = newHeaderCell( "Description", CATEGORIES_TEXT ); table.addCell( headerCell ); table.addCell( newCell( description ) ); return table; } private static Table newTable() throws BadElementException { Table table = new Table( 1 ); table.setBorderWidthTop( 1 ); table.setBorderWidthLeft( 1 ); table.setBorderWidthRight( 1 ); table.setBorderWidthBottom( 0 ); table.setWidth( 100 ); 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( newTable( key, other.get( key ) ) ); } } public static Table newRuleTable(DrlRuleParser drl) throws BadElementException, DocumentException { Table table = newTable(); Cell headerCell = newHeaderCell( "Attributes", CATEGORIES_TEXT ); table.addCell( headerCell ); for ( String s : drl.getHeader() ) { table.addCell( newCell( INDENT + s.trim() ) ); } table.addCell( newHeaderCell( INDENT + "WHEN", BODY_TEXT ) ); for ( String s : drl.getLhs() ) { table.addCell( newCell( INDENT + INDENT + s.trim() ) ); } table.addCell( newHeaderCell( INDENT + "THEN", BODY_TEXT ) ); for ( String s : drl.getRhs() ) { table.addCell( newCell( INDENT + INDENT + s.trim() ) ); } // table.addCell( newEmptyWhenThenCell( "END" ) ); return table; } public static Table newTable(final String topic, Collection<String> items) throws BadElementException, DocumentException { Table table = newTable(); Cell headerCell = newHeaderCell( topic, CATEGORIES_TEXT ); table.addCell( headerCell ); if ( items.isEmpty() ) { table.addCell( newCell( " - " ) ); } else { for ( String s : items ) { table.addCell( newCell( s ) ); } } return table; } public static List createContents(java.util.List<DrlRuleParser> rules) { List index = new List( true ); for ( DrlRuleParser drlRuleData : rules ) { Chunk chunk = new Chunk( drlRuleData.getName() ); // chunk.setLocalGoto( item.getName() ); ListItem listItem = new ListItem( chunk ); index.add( listItem ); } return index; } private static Cell newHeaderCell(String text, Font font) throws BadElementException { Cell c = new Cell( new Phrase( text, font ) ); c.setBackgroundColor( Color.decode( "#CCCCFF" ) ); c.setLeading( 10 ); c.setBorder( 1 ); return c; } private static Cell newCell(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; } private static String[] splitFirst(String source, String splitter) { Vector rv = new Vector(); int last = 0; int next = 0; next = source.indexOf(splitter, last); if (next != -1) { rv.add(source.substring(last, next)); last = next + splitter.length(); } if (last < source.length()) { rv.add(source.substring(last, source.length())); } return (String[]) rv.toArray(new String[rv.size()]); } public static void newRulePage(Document document, String packageName, DrlRuleParser drlData) throws DocumentException { document.add( new Paragraph( packageName, PACKAGE_NAME ) ); document.add( new Paragraph( "Rule " + drlData.getName(), CHAPTER_TITLE ) ); // Extends int index = drlData.getName().lastIndexOf( "extends" ); if ( index > 0 ) { document.add( new Paragraph( "Extends:", BODY_TEXT ) ); Paragraph ext = new Paragraph( drlData.getName().substring( "extends".length() + index ), BODY_TEXT ); ext.setIndentationLeft(INDENTATION_LEFT); document.add( ext ); } // if the data came from guvnor, this will be empty if(drlData.getDescription() != null && drlData.getDescription().trim().equals("")) { Iterator<String> iter = drlData.getMetadata().iterator(); while(iter.hasNext()) { String nextDesc = iter.next(); if(nextDesc.startsWith("Description")) { String[] parts = splitFirst(nextDesc, ":"); // no description if(parts.length == 1) { // guvnor did not have it document.add( newDescription( drlData.getDescription() ) ); } else { document.add(newDescription(parts[1])); } } } } else { document.add( newDescription( drlData.getDescription() ) ); } // DRL document.add( newRuleTable( drlData ) ); // Meta data document.add( newTable( "Metadata", drlData.getMetadata() ) ); // Other createOtherItems( document, drlData.getOtherInformation() ); document.newPage(); } public static void createFirstPage(Document document, String currentDate, DrlPackageParser packageData) throws DocumentException { Paragraph title = new Paragraph( "\n\n\n\n\n" + packageData.getName().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\n" + packageData.getDescription(), BODY_TEXT ) ); document.add( newTable( "Metadata ", packageData.getMetadata() ) ); document.add( newTable( "Globals ", packageData.getGlobals() ) ); createOtherItems( document, packageData.getOtherInformation() ); } } 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 ); } } }