I made a few tweaks to your code in bold font below - hope those come through - 
otherwise just compare to your original code. In case you find a typo, this is 
OTOH without code-completion .....

HTH, Kieran

PS. Look at the BackgroundTasks presentation from WOWODC and you will see the 
pattern of EO handling below explained there and will also see how to use a 
different OSC for your background task.

On Aug 11, 2012, at 10:03 AM, Theodore Petrosky <[email protected]> wrote:

> 
> I was playing around with Kieran's framework and I wanted to create a 
> JasperReport from an EO. So, I created a new class that creates a 
> 'reportTask' from an EO.
> 
> This is the first time I am attempting to alter for add to a someone else's 
> framework. Could you look this over? The only caveat that I can find is that 
> I must create a local instance in a new EC of the EO before passing it into 
> the class. I think Kieran mentions that in his comments in: 
> ERJRFetchSpecificationReportTask.
> 
> I am calling it with:
> 
> public static Callable<File> 
> createMeetingCheckListReportTaskFromEO(MeetingChecklist checklist) {
> 
>     String reportDescription = "Printed Meeting Checklist";
>         
>     HashMap<String, Object> parameters = new HashMap<String, Object>();
>     parameters.put("reportDescription", reportDescription);
>     parameters.put("userName", "User From session");
> 
>     ERJRReportTaskFromEO reportTask = new ERJRReportTaskFromEO(checklist, 
> jasperMCLCompiledReportFileName, parameters);
> 
> return reportTask;
> 
> }
> 
> it works, but should the creation of the new editing context be in the class 
> ERJasperReportTaskFromEO?
> 
> 
> here is my new class:
> 
> package er.jasperreports;
> 
> import java.io.File;
> import java.util.HashMap;
> import java.util.Map;
> import java.util.concurrent.Callable;
> 
> import org.apache.commons.lang.exception.NestableRuntimeException;
> import org.apache.log4j.Logger;
> 
> import er.jasperreports.ERJRFoundationDataSource;
> import er.jasperreports.ERJRUtilities;
> 
> import com.webobjects.eoaccess.EOEntity;
> import com.webobjects.eocontrol.EOEditingContext;
> import com.webobjects.eocontrol.EOEnterpriseObject;
> import com.webobjects.eocontrol.EOFetchSpecification;
> import com.webobjects.eocontrol.EOQualifier;
> import com.webobjects.foundation.NSArray;
> import com.webobjects.foundation.NSLog;
> 
> import er.extensions.appserver.ERXApplication;
> import er.extensions.concurrency.ERXTaskPercentComplete;
> import er.extensions.eof.ERXEC;
> import er.extensions.eof.ERXEOAccessUtilities;
> import er.extensions.foundation.ERXAssert;
> 
> /**
> * A background task class that creates a JasperReports report in the context
> * of a WebObjects application. Sensible defaults are used. It creates the 
> JasperReport
> * after passing in a EO.
> * 
> * @author Ted P
> *
> */
> public class ERJRReportTaskFromEO implements Callable<File>, 
> ERXTaskPercentComplete {
>     private static final Logger log = 
> Logger.getLogger(ERJRReportTaskFromEO.class);
>     
>     private File reportFile;
>     private final String frameworkName;
>     private final String jasperCompiledReportFileName;
>     private Map<String, Object> parameters;
>     
>     private EOGlobalID theObjectGID;    // Use threadsafe global IDs for 
> background task ivars
> 
>     // iVar so we can get percentage complete
>     private ERJRFoundationDataSource jrDataSource;
>     
>     public ERJRReportTaskFromEO(EOEnterpriseObject theObject, String 
> jasperCompiledReportFileName) {
>         this(theObject, jasperCompiledReportFileName, null, null);
>     }
>     
>     public ERJRReportTaskFromEO(EOEnterpriseObject theObject, String 
> jasperCompiledReportFileName, HashMap<String, Object> parameters) {
>         this(theObject, jasperCompiledReportFileName, null, parameters);
>     }
> 
>     public ERJRReportTaskFromEO(EOEnterpriseObject theObject, String 
> jasperCompiledReportFileName, String frameworkName, HashMap<String, Object> 
> parameters) {
>         
>         ERXAssert.PRE.notNull(theObject);
>         ERXAssert.PRE.notNull(jasperCompiledReportFileName);
> 
>         this.jasperCompiledReportFileName = jasperCompiledReportFileName;
>         this.frameworkName = frameworkName;
>         this.parameters = parameters;
          // grab the global ID in the constructor. The constructor executes in 
the thread that creates the task instance
>         this.theObjectGID = theObject.globalID() // or use 
> theObject.editingContext().globalIDForObject( theObject );
>         ERXAssert.PRE.notNull(theObjectGID);  // If the object is new, this 
> will be null. test and throw.
> 
>         if (this.parameters == null) {
>             this.parameters = new HashMap<String, Object>();
>         }
>     }
> 
> 
>     /**
>      * Callable interface implementation
>      * 
>      * @throws Exception
>      */
>     public File call() throws Exception {
> 
>         ERXApplication._startRequest();
>         try {
>             return _call();
>         } catch (Exception e) {
>             log.error("Error in JR task", e);
>             throw e;
>         } finally {
>             // Unlocks any locked editing contexts
>             ERXApplication._endRequest();
>         }
> 
>     }
> 
>     private File _call() {
>         // If development
>         if (ERXApplication.isDevelopmentModeSafe()) {
>             parameters.put("_isDevelopmentMode", Boolean.TRUE);
>         } else {
>             parameters.put("_isDevelopmentMode", Boolean.FALSE );
>         }
>         
>         reportFile = null;
>         
>         if (log.isDebugEnabled())
>             log.debug("Starting JasperReportTask: " + this.toString());
>         EOEditingContext ec = ERXEC.newEditingContext();
          ec.lock();
>         try {
>             EOEnterpriseObject theObject = ec.faultForGlobalID( theObjectGID, 
> ec);
>             jrDataSource = new ERJRFoundationDataSource(new 
> NSArray<EOEnterpriseObject>(theObject));
> 
>             if (jasperCompiledReportFileName != null) {
>                 reportFile = 
> ERJRUtilities.runCompiledReportToPDFFile(jasperCompiledReportFileName, 
> frameworkName, parameters, jrDataSource);
>             }
> 
>         } catch (Exception e) {
>             throw new NestableRuntimeException(e);
>         } finally {
> //            ec.unlock();
>         }
> 
>         return reportFile;
>     }
> 
>     public File file() {
>         return reportFile;
>     }
> 
>     /* (non-Javadoc)
>      * @see wk.foundation.concurrent.TaskPercentComplete#percentComplete()
>      * 
>      * Some whacky logic just so the user can be comfortable that we are 
> making some progress.
>      */
>     public Double percentComplete() {
>         if (jrDataSource == null) {
>             return Double.valueOf(0.1);
>         } else {
>             double percent = 0.1 + jrDataSource.percentProcessed() * 0.8;
>             return Double.valueOf(percent);
>         }
>     }
> 
> }
> 
> 
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      ([email protected])
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/webobjects-dev/kelleherk%40gmail.com
> 
> This email sent to [email protected]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to