[overlord-commits] Overlord SVN: r868 - in report-server/trunk: core/src/main/java/org/jboss/bpm/report/util and 1 other directories.

overlord-commits at lists.jboss.org overlord-commits at lists.jboss.org
Fri Oct 30 08:57:18 EDT 2009


Author: heiko.braun at jboss.com
Date: 2009-10-30 08:57:18 -0400 (Fri, 30 Oct 2009)
New Revision: 868

Modified:
   report-server/trunk/core/src/main/java/org/jboss/bpm/report/BirtService.java
   report-server/trunk/core/src/main/java/org/jboss/bpm/report/RenderMetaData.java
   report-server/trunk/core/src/main/java/org/jboss/bpm/report/ReportFacade.java
   report-server/trunk/core/src/main/java/org/jboss/bpm/report/util/BirtUtil.java
   report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportParameter.java
   report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportReference.java
Log:
Split render and view report operations

Modified: report-server/trunk/core/src/main/java/org/jboss/bpm/report/BirtService.java
===================================================================
--- report-server/trunk/core/src/main/java/org/jboss/bpm/report/BirtService.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/core/src/main/java/org/jboss/bpm/report/BirtService.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -25,13 +25,14 @@
 import org.apache.commons.logging.LogFactory;
 import org.eclipse.birt.core.framework.Platform;
 import org.eclipse.birt.report.engine.api.*;
+import org.jboss.bpm.report.model.ReportParameter;
 import org.jboss.bpm.report.model.ReportReference;
-import org.jboss.bpm.report.model.ReportParameter;
 import org.jboss.bpm.report.util.BirtUtil;
 
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -71,28 +72,34 @@
   /* blocking call*/
   public void create()
   {
-    this.engine = BirtEngineFactory.newInstance(iConfig);
+    if(currentState!=State.NONE)
+      throw new IllegalStateException("Service already in state " + currentState);
 
-    // parse template config
-    File workDir = new File(iConfig.getReportDir());
-    if(!workDir.exists())
-      throw new IllegalStateException("Working directory "+iConfig.getReportDir()+" cannot be found!");
+    synchronized(reports)
+    {
+      this.engine = BirtEngineFactory.newInstance(iConfig);
 
-    try
-    {
-      loadReportNames();
-      extractParameterNames();
+      // parse template config
+      File workDir = new File(iConfig.getReportDir());
+      if(!workDir.exists())
+        throw new IllegalStateException("Working directory "+iConfig.getReportDir()+" cannot be found!");
+
+      try
+      {
+        loadReports();
+        extractParameterMetaData();
+      }
+      catch (Exception e)
+      {
+        throw new RuntimeException("Failed to load reports", e);
+      }
+
+      log.info("Service created: " +this.engine);
+      currentState = State.CREATED;
     }
-    catch (Exception e)
-    {
-      throw new RuntimeException("Failed to parse config", e);
-    }
-
-    log.info("Service created: " +this.engine);
-    currentState = State.CREATED;
   }
 
-  private void loadReportNames()
+  private void loadReports()
   {
     File workDir = new File(iConfig.getReportDir());
     assert workDir.isDirectory();
@@ -113,7 +120,7 @@
     }
   }
 
-  private void extractParameterNames() throws EngineException
+  private void extractParameterMetaData() throws EngineException
   {
     Iterator<String> templateNames = reports.keySet().iterator();
     while(templateNames.hasNext())
@@ -178,6 +185,8 @@
           paramRef.setPromptText((String)map.get("Prompt Text"));
           ref.getParameterMetaData().add(paramRef);
         }
+
+        task.close();
       }
     }
 
@@ -203,6 +212,7 @@
         }
     );
 
+    t.setName("BirtService-Init");
     t.start();
   }
 
@@ -231,6 +241,89 @@
     currentState = State.DESTROYED;
   }
 
+  public String render(RenderMetaData metaData)
+  {
+    if( (currentState==State.CREATED || currentState==State.STARTED) == false)
+      throw new IllegalStateException("Cannot render in state " + currentState);
+
+    if(!reports.keySet().contains(metaData.getReportName()))
+      throw new IllegalArgumentException("No such report template: "+metaData.getReportName());
+
+    String outputFileName = null;
+
+    log.debug("Render " + metaData);
+
+    IRunTask task = null;
+
+    try
+    {
+      //Open a (cached) report design
+      IReportRunnable design = openCached(metaData.getReportName());
+
+      //Create runRenderTask to run and render the report,
+      task = engine.createRunTask(design);
+
+      // outputfilename
+      outputFileName = metaData.getReportName()+".rptdocument";
+
+      //Set parent classloader for engine
+      task.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, metaData.getClassloader());
+      task.setParameterValues(unmarshalParameters(metaData));
+      task.run(iConfig.getOutputDir()+outputFileName);
+
+    }
+    catch (EngineException e)
+    {
+      throw new RuntimeException("Failed to render report: "+e.getMessage(), e);
+    }
+    finally
+    {
+      if(task!=null)
+        task.close();
+    }
+
+    return outputFileName;
+  }
+
+  private Map<String,Object> unmarshalParameters(RenderMetaData metaData)
+  {
+    Map<String, Object> results = new HashMap<String,Object>();
+    for(String paramName : metaData.getParameters().keySet())
+    {
+      try
+      {
+        ReportReference reportRef = reports.get(metaData.getReportName());
+        ReportParameter reportParam = reportRef.getParameter(paramName);
+        if(null==paramName)
+          throw new IllegalArgumentException("No such param "+paramName);
+
+        String paramValue = metaData.getParameters().get(paramName);
+
+        switch(reportParam.getDataType()) 
+        {
+          case DATETIME:
+            results.put(paramName,
+                new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(paramValue).getTime()
+                ));
+            break;
+          case NUMBER:
+            results.put(paramName, Long.valueOf(paramValue));
+            break;
+          case BOOLEAN:
+            results.put(paramName, Boolean.valueOf(paramValue));
+            break;
+          default:
+            results.put(paramName, paramValue);
+        }
+      }
+      catch (Exception e)
+      {
+        throw new RuntimeException("Failed to unmarshall report parameter", e);
+      }
+    }
+    return results;
+  }
+
   /**
    * Render a report based on render meta data.
    * this routin simply return the output filename.
@@ -242,28 +335,33 @@
    * @param metaData render instruction like the template name
    * @return output filename
    */
-  public String render(RenderMetaData metaData)
+  public String view(RenderMetaData metaData)
   {
     if( (currentState==State.CREATED || currentState==State.STARTED) == false)
-      throw new IllegalStateException("Cannot render in state " + currentState);
+      throw new IllegalStateException("Cannot renderTask in state " + currentState);
 
     if(!reports.keySet().contains(metaData.getReportName()))
       throw new IllegalArgumentException("No such report template: "+metaData.getReportName());
 
     String outputFileName = null;
 
-    log.debug("Render " + metaData);
+    log.debug("View " + metaData);
 
+    IRenderTask renderTask = null;
+
     try
     {
       //Open a (cached) report design
-      IReportRunnable design = openCached(metaData.getReportName());
+      IReportDocument document = engine.openReportDocument(
+          iConfig.getOutputDir()+metaData.getReportName()+".rptdocument"
+      );
 
-      //Create runRenderTask to run and render the report,
-      IRunAndRenderTask runRenderTask = engine.createRunAndRenderTask(design);
+      //Create renderTask to run and renderTask the report,
+      renderTask = engine.createRenderTask(document);
+
       //Set parent classloader for engine
-      runRenderTask.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, metaData.getClassloader());
-      runRenderTask.setParameterValues(metaData.getParameters());
+      renderTask.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, metaData.getClassloader());
+      renderTask.setParameterValues(metaData.getParameters());
 
       // ------------------
 
@@ -293,27 +391,32 @@
         htmlOptions.setHtmlRtLFlag(false);
         //Setting this to true removes html and body tags
         htmlOptions.setEmbeddable(false);
-        runRenderTask.setRenderOption(htmlOptions);
+        renderTask.setRenderOption(htmlOptions);
       }
       else if( options.getOutputFormat().equalsIgnoreCase("pdf") ){
 
         PDFRenderOption pdfOptions = new PDFRenderOption( options );
         pdfOptions.setOption( IPDFRenderOption.FIT_TO_PAGE, new Boolean(true) );
         pdfOptions.setOption( IPDFRenderOption.PAGEBREAK_PAGINATION_ONLY, new Boolean(true) );
-        runRenderTask.setRenderOption(pdfOptions);
+        renderTask.setRenderOption(pdfOptions);
       }
 
       // ------------------
-      if(runRenderTask.getRenderOption()==null)
-        runRenderTask.setRenderOption(options);
+      if(renderTask.getRenderOption()==null)
+        renderTask.setRenderOption(options);
 
-      runRenderTask.run();
-      runRenderTask.close();
+      renderTask.render();
+
     }
     catch (EngineException e)
     {
-      throw new RuntimeException("Failed to render report: "+e.getMessage(), e);
+      throw new RuntimeException("Failed to renderTask report: "+e.getMessage(), e);
     }
+    finally
+    {
+      if(renderTask !=null)
+        renderTask.close();
+    }
 
     return outputFileName;
   }

Modified: report-server/trunk/core/src/main/java/org/jboss/bpm/report/RenderMetaData.java
===================================================================
--- report-server/trunk/core/src/main/java/org/jboss/bpm/report/RenderMetaData.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/core/src/main/java/org/jboss/bpm/report/RenderMetaData.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -36,7 +36,7 @@
   private ClassLoader classloader;
   private String reportName;
   private Format format;
-  private Map parameters = new HashMap();
+  private Map<String,String> parameters = new HashMap<String,String>();
   private String imageBaseUrl;
 
   public RenderMetaData()
@@ -97,7 +97,7 @@
     return "RenderMetaData {reportName="+reportName+", format="+format+"}";
   }
 
-  public Map getParameters()
+  public Map<String,String> getParameters()
   {
     return parameters;
   }

Modified: report-server/trunk/core/src/main/java/org/jboss/bpm/report/ReportFacade.java
===================================================================
--- report-server/trunk/core/src/main/java/org/jboss/bpm/report/ReportFacade.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/core/src/main/java/org/jboss/bpm/report/ReportFacade.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -21,25 +21,23 @@
  */
 package org.jboss.bpm.report;
 
+import com.google.gson.GsonBuilder;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.report.model.ReportReference;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
+import java.io.BufferedReader;
 import java.io.File;
-import java.util.Enumeration;
+import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import java.util.List;
+import java.util.StringTokenizer;
 
-import com.google.gson.GsonBuilder;
-
 /**
  * BIRT integration facade.<p>
  *
@@ -79,7 +77,7 @@
   }
 
   public void initBirtService()
-    throws BirtInitException
+      throws BirtInitException
   {
     if(!isInitialized)
     {
@@ -105,7 +103,7 @@
       iConfig.setBirtHome(defaultBirtHome);
       iConfig.setOutputDir( birtOutputDir );
       iConfig.setReportDir( birtDataDir );
-      
+
       log.info("BIRT home: " +iConfig.getBirtHome());
       log.info("Output dir: " +iConfig.getOutputDir());
       log.info("Report dir: " +iConfig.getReportDir());
@@ -124,52 +122,59 @@
     }
   }
 
-  private String buildImageUrl(HttpServletRequest request)
-  {
-    StringBuffer sb = new StringBuffer();
-    sb.append("http://");
-    sb.append(request.getServerName()).append(":");
-    sb.append(request.getServerPort());
-    sb.append(request.getContextPath());
-    sb.append(request.getServletPath());
-    sb.append("/report/view/image");
-    return sb.toString();
-  }
-
   @GET
-  @Path("view/{fileName}")
+  @Path("render/{fileName}")
   @Produces("text/html")
   public Response viewReportHtml(
       @PathParam("fileName")
       String fileName,
-      @Context HttpServletRequest
-          request
+      @Context HttpServletRequest request
   )
   {
     try
-    {     
-      Map queryParams = convertRequestParametersToMap(request);
+    {
+      RenderMetaData renderMeta = defaultRenderMetaData(fileName, request);
 
-      RenderMetaData renderMeta = new RenderMetaData();
-      renderMeta.setReportName(fileName);
-      renderMeta.setFormat(RenderMetaData.Format.HTML);
-      renderMeta.setClassloader(Thread.currentThread().getContextClassLoader());
-      renderMeta.setImageBaseUrl(buildImageUrl(request));
-      renderMeta.getParameters().putAll(queryParams);
-
-      String outputFileName = birtService.render(renderMeta);
+      String outputFileName = birtService.view(renderMeta);
       String absoluteFile = birtService.getIntegrationConfig().getOutputDir() + outputFileName;
-      log.info("Render " + absoluteFile);
+      log.debug("View " + absoluteFile);
 
       File reportFile = new File(absoluteFile);
       return Response.ok(reportFile).type("text/html").build();
-    }   
+    }
     catch(Throwable e1)
     {
       return gracefulException(e1);
     }
   }
 
+  @POST
+  @Path("render/{fileName}")
+  @Produces("text/html")
+  public Response renderReportHtml(
+      @PathParam("fileName")
+      String fileName,
+      @Context HttpServletRequest request
+  )
+  {
+    try
+    {
+      RenderMetaData renderMeta = defaultRenderMetaData(fileName, request);
+      Map<String,String> postParams = convertRequestParametersToMap(request);
+      renderMeta.getParameters().putAll(postParams);
+      
+      String outputFileName = birtService.render(renderMeta);
+      String absoluteFile = birtService.getIntegrationConfig().getOutputDir() + outputFileName;
+      log.debug("Render " + absoluteFile);
+      
+      return Response.ok().type("text/html").build();
+    }
+    catch(Throwable e1)
+    {
+      return gracefulException(e1);
+    }
+  }
+
   @GET
   @Path("view/image/{fileName}")
   public Response getImage(
@@ -186,28 +191,69 @@
       throw new IllegalArgumentException("Image " +absName+" doesn't exist");
     return Response.ok(imageFile).build();
   }
+  
+  private RenderMetaData defaultRenderMetaData(String fileName, HttpServletRequest request)
+  {
+    RenderMetaData renderMeta = new RenderMetaData();
+    renderMeta.setReportName(fileName);
+    renderMeta.setFormat(RenderMetaData.Format.HTML);
+    renderMeta.setClassloader(Thread.currentThread().getContextClassLoader());
+    renderMeta.setImageBaseUrl(buildImageUrl(request));
+    return renderMeta;
+  }
 
+  private String buildImageUrl(HttpServletRequest request)
+  {
+    StringBuffer sb = new StringBuffer();
+    sb.append("http://");
+    sb.append(request.getServerName()).append(":");
+    sb.append(request.getServerPort());
+    sb.append(request.getContextPath());
+    sb.append(request.getServletPath());
+    sb.append("/report/view/image");
+    return sb.toString();
+  }
+
   private Response gracefulException(Throwable e)
   {
-    log.error(e);
+    log.error("Error processing report", e);
 
     StringBuffer sb = new StringBuffer();
     sb.append("<div style='font-family:sans-serif; padding:10px;'>");
     sb.append("<h3>Unable to process report").append("</h3>");
     sb.append(e.getMessage());
     sb.append("</div>");
-    return Response.ok(sb.toString()).build();
+    return Response.ok(sb.toString()).status(400).build();
   }
-  
+
   static public Map<String, String> convertRequestParametersToMap(HttpServletRequest request){
-    Enumeration<?> initParameters=request.getParameterNames();
     HashMap<String, String> parameterMap = new HashMap<String, String>();
-    while (initParameters.hasMoreElements()) {
-      String param = (String) initParameters.nextElement();
-      String value = request.getParameter(param);
-      if (param != null & value != null)
-        parameterMap.put(param, value);
+    try
+    {
+
+      BufferedReader br = request.getReader();
+      String line;
+      while ((line = br.readLine()) != null)
+      {
+        StringTokenizer st = new StringTokenizer(line, ";");
+        while(st.hasMoreTokens())
+        {
+          String s = st.nextToken();
+          if(s.indexOf("=")!=-1)
+          {
+            String[] tuple = s.split("=");
+            parameterMap.put(tuple[0], tuple[1]);
+          }
+        }
+      }
+
+      br.close();
     }
+    catch (IOException e)
+    {
+      log.error("", e);
+    }
+
     return parameterMap;
   }
 

Modified: report-server/trunk/core/src/main/java/org/jboss/bpm/report/util/BirtUtil.java
===================================================================
--- report-server/trunk/core/src/main/java/org/jboss/bpm/report/util/BirtUtil.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/core/src/main/java/org/jboss/bpm/report/util/BirtUtil.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -25,6 +25,9 @@
 import org.eclipse.birt.report.model.api.ReportDesignHandle;
 import org.eclipse.birt.report.model.api.ScalarParameterHandle;
 import org.eclipse.birt.report.model.api.CascadingParameterGroupHandle;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.bpm.report.BirtService;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -37,6 +40,8 @@
  */
 public class BirtUtil
 {
+  private static final Log log = LogFactory.getLog(BirtService.class);
+  
   //Function to load parameter details in a map.
   public static HashMap<String, Serializable> loadParameterDetails(
       IGetParameterDefinitionTask task,
@@ -138,7 +143,7 @@
 
             Object value = sI.getValue( );
             Object label = sI.getLabel( );
-            System.out.println( label + "--" + value);
+            log.debug( label + "--" + value);
             dynamicList.put(value,(String) label);
 
           }
@@ -160,7 +165,7 @@
 
             Object value = selectionItem.getValue( );
             String label = selectionItem.getLabel( );
-            //System.out.println( label + "--" + value);
+            //log.debug( label + "--" + value);
             dynamicList.put(value,label);
 
           }
@@ -173,7 +178,7 @@
 
     //Print out results
     Iterator iter = parameter.keySet().iterator();
-    System.out.println("======================Parameter =" + scalar.getName());
+    log.debug("======================Parameter =" + scalar.getName());
     while (iter.hasNext()) {
       String name = (String) iter.next();
       if( name.equals("Selection List")){
@@ -181,11 +186,11 @@
         Iterator selIter = selList.keySet().iterator();
         while (selIter.hasNext()) {
           Object lbl = selIter.next();
-          System.out.println( "Selection List Entry ===== Key = " + lbl + " Value = " + selList.get(lbl));
+          log.debug( "Selection List Entry ===== Key = " + lbl + " Value = " + selList.get(lbl));
         }
 
       }else{
-        System.out.println( name + " = " + parameter.get(name));
+        log.debug( name + " = " + parameter.get(name));
       }
     }
     return parameter;

Modified: report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportParameter.java
===================================================================
--- report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportParameter.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportParameter.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -81,4 +81,28 @@
   {
     this.dataType = dataType;
   }
+
+
+  public boolean equals(Object o)
+  {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    ReportParameter that = (ReportParameter) o;
+
+    if (dataType != that.dataType) return false;
+    if (name != null ? !name.equals(that.name) : that.name != null) return false;
+    if (type != that.type) return false;
+
+    return true;
+  }
+
+  public int hashCode()
+  {
+    int result;
+    result = (name != null ? name.hashCode() : 0);
+    result = 31 * result + (type != null ? type.hashCode() : 0);
+    result = 31 * result + (dataType != null ? dataType.hashCode() : 0);
+    return result;
+  }
 }

Modified: report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportReference.java
===================================================================
--- report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportReference.java	2009-10-30 12:55:48 UTC (rev 867)
+++ report-server/trunk/shared/src/main/java/org/jboss/bpm/report/model/ReportReference.java	2009-10-30 12:57:18 UTC (rev 868)
@@ -21,10 +21,7 @@
  */
 package org.jboss.bpm.report.model;
 
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
+import java.util.*;
 
 /**
  * @author Heiko.Braun <heiko.braun at jboss.com>
@@ -34,9 +31,8 @@
   private String title;
   private String description;
   private String reportFileName;
-  private Set<ReportParameter> parameterMetaData = new HashSet<ReportParameter>();
+  private List<ReportParameter> parameterMetaData = new LinkedList<ReportParameter>();
 
-
   public ReportReference(String reportFileName)
   {
     this.reportFileName = reportFileName;
@@ -67,8 +63,48 @@
     return reportFileName;
   }
 
-  public Set<ReportParameter> getParameterMetaData()
+  public List<ReportParameter> getParameterMetaData()
   {
     return parameterMetaData;
   }
+
+  public ReportParameter getParameter(String name)
+  {
+    ReportParameter match = null;
+    for(ReportParameter p : parameterMetaData)
+    {
+      if(p.getName().equals(name))
+      {
+        match = p;
+        break;
+      }
+    }
+
+    return match;    
+  }
+
+  public boolean equals(Object o)
+  {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    ReportReference that = (ReportReference) o;
+
+    if (parameterMetaData != null ? !parameterMetaData.equals(that.parameterMetaData) : that.parameterMetaData != null)
+      return false;
+    if (reportFileName != null ? !reportFileName.equals(that.reportFileName) : that.reportFileName != null)
+      return false;
+    if (title != null ? !title.equals(that.title) : that.title != null) return false;
+
+    return true;
+  }
+
+  public int hashCode()
+  {
+    int result;
+    result = (title != null ? title.hashCode() : 0);
+    result = 31 * result + (reportFileName != null ? reportFileName.hashCode() : 0);
+    result = 31 * result + (parameterMetaData != null ? parameterMetaData.hashCode() : 0);
+    return result;
+  }
 }



More information about the overlord-commits mailing list