Author: heiko.braun(a)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(a)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;
+ }
}