sylvain     2004/03/11 07:38:31

  Modified:    src/blocks/cron/java/org/apache/cocoon/components/cron
                        QuartzJobScheduler.java TestCronJob.java
                        QuartzJobExecutor.java
                        AbstractPipelineCallingCronJob.java
               src/blocks/cron/java/org/apache/cocoon/environment/background
                        BackgroundEnvironment.java
  Log:
  Refactor job launching to setup an environment that allows normal use of the 
sourceresolver, including "cocoon:" protocol
  
  Revision  Changes    Path
  1.11      +99 -81    
cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/QuartzJobScheduler.java
  
  Index: QuartzJobScheduler.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/QuartzJobScheduler.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- QuartzJobScheduler.java   8 Mar 2004 13:43:42 -0000       1.10
  +++ QuartzJobScheduler.java   11 Mar 2004 15:38:31 -0000      1.11
  @@ -23,6 +23,7 @@
   
   import org.apache.avalon.framework.CascadingException;
   import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.activity.Startable;
   import org.apache.avalon.framework.component.Component;
   import org.apache.avalon.framework.configuration.Configurable;
  @@ -38,6 +39,7 @@
   import org.apache.avalon.framework.service.Serviceable;
   import org.apache.avalon.framework.thread.ThreadSafe;
   import org.apache.cocoon.Constants;
  +import org.apache.cocoon.environment.background.BackgroundEnvironment;
   import org.quartz.CronTrigger;
   import org.quartz.Job;
   import org.quartz.JobDataMap;
  @@ -46,9 +48,7 @@
   import org.quartz.SchedulerException;
   import org.quartz.SimpleTrigger;
   import org.quartz.Trigger;
  -
   import org.quartz.impl.DirectSchedulerFactory;
  -
   import org.quartz.simpl.RAMJobStore;
   
   import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
  @@ -66,8 +66,11 @@
    */
   public class QuartzJobScheduler
   extends AbstractLogEnabled
  -implements JobScheduler, Component, ThreadSafe, Serviceable, Configurable, 
Startable, Disposable, Contextualizable {
  -    /** ThreadPool policy RUN */
  +implements JobScheduler, Component, ThreadSafe, Serviceable, Configurable, 
Startable, Disposable,
  +    Contextualizable, Initializable {
  +     private org.apache.cocoon.environment.Context environmentContext;
  +
  +     /** ThreadPool policy RUN */
       private static final String POLICY_RUN = "RUN";
   
       /** ThreadPool policy WAIT */
  @@ -93,6 +96,9 @@
   
       /** Map key for the service manager */
       static final String DATA_MAP_MANAGER = 
"QuartzJobScheduler.ServiceManager";
  +    
  +    /** Map key for the environment context (needed by 
BackgroundEnvironment) */
  +    static final String DATA_MAP_ENV_CONTEXT = 
"QuartzJobScheduler.EnvironmentContext";
   
       /** Map key for the logger */
       static final String DATA_MAP_LOGGER = "QuartzJobScheduler.Logger";
  @@ -116,23 +122,29 @@
       static final String DEFAULT_QUARTZ_SCHEDULER_NAME = "Cocoon";
   
       /** The PooledExecutor instance */
  -    private PooledExecutor m_executor;
  +    private PooledExecutor executor;
   
       /** The quartz scheduler */
  -    private Scheduler m_scheduler;
  +    private Scheduler scheduler;
   
       /** The ServiceManager instance */
  -    private ServiceManager m_manager;
  +    private ServiceManager manager;
  +    
  +    /** The configuration, parsed in initialize() */
  +    private Configuration config;
   
       /** Should we wait for running jobs to terminate on shutdown ? */
       private boolean m_shutdownGraceful;
   
  +     /** The Cocoon enviroment in which jobs will operate */
  +     private BackgroundEnvironment jobEnvironment;
  +
       /* (non-Javadoc)
        * @see org.apache.cocoon.components.cron.JobScheduler#getJobNames()
        */
       public String[] getJobNames() {
           try {
  -            final String[] names = 
m_scheduler.getJobNames(DEFAULT_QUARTZ_JOB_GROUP);
  +            final String[] names = 
scheduler.getJobNames(DEFAULT_QUARTZ_JOB_GROUP);
               Arrays.sort(names);
   
               return names;
  @@ -148,7 +160,7 @@
        */
       public JobSchedulerEntry getJobSchedulerEntry(String jobname) {
           try {
  -            return new QuartzJobSchedulerEntry(jobname, m_scheduler);
  +            return new QuartzJobSchedulerEntry(jobname, scheduler);
           } catch (final Exception e) {
               getLogger().error("cannot create QuartzJobSchedulerEntry", e);
           }
  @@ -260,25 +272,7 @@
        */
       public void configure(final Configuration config)
       throws ConfigurationException {
  -        try {
  -            // If cocoon reloads (or is it the container that reload us?) 
  -            // we cannot create the same scheduler again
  -            final String runID = new Date().toString().replace(' ', '_');
  -            final ThreadPool pool = 
createThreadPool(config.getChild("thread-pool"));
  -            
DirectSchedulerFactory.getInstance().createScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME,
 runID, pool,
  -                                                                 new 
RAMJobStore());
  -            // m_scheduler = 
DirectSchedulerFactory.getInstance().getScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME,
 runID);
  -            m_scheduler = 
DirectSchedulerFactory.getInstance().getScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME);
  -        } catch (final SchedulerException se) {
  -            throw new ConfigurationException("cannot create a quartz 
scheduler", se);
  -        }
  -
  -        final Configuration[] triggers = 
config.getChild("triggers").getChildren("trigger");
  -        createTriggers(triggers);
  -
  -        if (getLogger().isDebugEnabled() && (triggers.length == 0)) {
  -            getLogger().debug("no triggers configured at startup");
  -        }
  +     this.config = config;
       }
   
       /* (non-Javadoc)
  @@ -292,22 +286,49 @@
                                     : "immediately (killing running jobs)"));
               }
   
  -            m_scheduler.shutdown(m_shutdownGraceful);
  -            m_scheduler = null;
  +            scheduler.shutdown(m_shutdownGraceful);
  +            scheduler = null;
           } catch (final SchedulerException se) {
               getLogger().error("failure during scheduler shutdown", se);
           }
   
  -        m_executor = null;
  +        this.executor = null;
       }
   
        /* (non-Javadoc)
         * @see 
org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
         */
        public void contextualize(Context context) throws ContextException {
  -             org.apache.cocoon.environment.Context c = 
(org.apache.cocoon.environment.Context)context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
  -             System.out.println("context: " + c.getRealPath("/") );
  -     }    
  +             this.environmentContext = 
(org.apache.cocoon.environment.Context)context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
  +     }
  +     
  +     public void initialize() throws Exception {
  +             try {
  +                     // If cocoon reloads (or is it the container that 
reload us?) 
  +                     // we cannot create the same scheduler again
  +                     final String runID = new Date().toString().replace(' ', 
'_');
  +                     final ThreadPool pool = 
createThreadPool(this.config.getChild("thread-pool"));
  +                     
DirectSchedulerFactory.getInstance().createScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME,
 runID, pool,
  +                                                                             
                                                 new RAMJobStore());
  +                     // scheduler = 
DirectSchedulerFactory.getInstance().getScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME,
 runID);
  +                     scheduler = 
DirectSchedulerFactory.getInstance().getScheduler(DEFAULT_QUARTZ_SCHEDULER_NAME);
  +             } catch (final SchedulerException se) {
  +                     throw new ConfigurationException("cannot create a 
quartz scheduler", se);
  +             }
  +
  +             this.jobEnvironment = new BackgroundEnvironment(getLogger(), 
this.environmentContext, this.manager);
  +
  +             final Configuration[] triggers = 
this.config.getChild("triggers").getChildren("trigger");
  +             createTriggers(triggers);
  +             
  +             // We're finished with the configuration
  +             this.config = null;
  +
  +             if (getLogger().isDebugEnabled() && (triggers.length == 0)) {
  +                     getLogger().debug("no triggers configured at startup");
  +             }
  +
  +     }
   
       /* (non-Javadoc)
        * @see 
org.apache.cocoon.components.cron.JobScheduler#fireTarget(java.lang.Object)
  @@ -323,13 +344,13 @@
           Object job = null;
   
           try {
  -            job = m_manager.lookup(jobrole);
  +            job = manager.lookup(jobrole);
   
               return fireJob(jobrole, job);
           } catch (final ServiceException se) {
               getLogger().error("cannot fire job " + jobrole, se);
           } finally {
  -            m_manager.release(job);
  +            manager.release(job);
           }
   
           return false;
  @@ -355,7 +376,7 @@
           Object job = null;
   
           try {
  -            job = m_manager.lookup(jobrole);
  +            job = manager.lookup(jobrole);
   
               if (job instanceof ConfigurableCronJob) {
                   ((ConfigurableCronJob)job).setup(params, objects);
  @@ -365,7 +386,7 @@
           } catch (final ServiceException se) {
               getLogger().error("cannot fire job " + jobrole, se);
           } finally {
  -            m_manager.release(job);
  +            manager.release(job);
           }
   
           return false;
  @@ -415,7 +436,7 @@
       public void removeJob(final String name)
       throws NoSuchElementException {
           try {
  -            if (m_scheduler.deleteJob(name, DEFAULT_QUARTZ_JOB_GROUP)) {
  +            if (scheduler.deleteJob(name, DEFAULT_QUARTZ_JOB_GROUP)) {
                   getLogger().info("job " + name + " removed by request");
               } else {
                   getLogger().error("couldn't remove requested job " + name);
  @@ -431,7 +452,7 @@
        */
       public void service(final ServiceManager manager)
       throws ServiceException {
  -        m_manager = manager;
  +        this.manager = manager;
       }
   
       /* (non-Javadoc)
  @@ -439,7 +460,7 @@
        */
       public void start()
       throws Exception {
  -        m_scheduler.start();
  +        scheduler.start();
       }
   
       /* (non-Javadoc)
  @@ -447,7 +468,7 @@
        */
       public void stop()
       throws Exception {
  -        m_scheduler.pause();
  +        scheduler.pause();
       }
   
       /**
  @@ -511,7 +532,7 @@
                           final boolean canRunConcurrently, final Parameters 
params, final Map objects)
       throws CascadingException {
           try {
  -            final JobDetail jobdetail = m_scheduler.getJobDetail(name, 
DEFAULT_QUARTZ_JOB_GROUP);
  +            final JobDetail jobdetail = scheduler.getJobDetail(name, 
DEFAULT_QUARTZ_JOB_GROUP);
   
               if (jobdetail != null) {
                   removeJob(name);
  @@ -521,8 +542,9 @@
   
           jobDataMap.put(DATA_MAP_NAME, name);
           jobDataMap.put(DATA_MAP_LOGGER, getLogger());
  -        jobDataMap.put(DATA_MAP_MANAGER, m_manager);
  +        jobDataMap.put(DATA_MAP_MANAGER, manager);
           jobDataMap.put(DATA_MAP_RUN_CONCURRENT, new 
Boolean(canRunConcurrently));
  +        jobDataMap.put(DATA_MAP_ENV_CONTEXT, this.environmentContext);
   
           if (null != params) {
               jobDataMap.put(DATA_MAP_PARAMETERS, params);
  @@ -540,7 +562,7 @@
           }
   
           try {
  -            m_scheduler.scheduleJob(detail, trigger);
  +            scheduler.scheduleJob(detail, trigger);
           } catch (final SchedulerException se) {
               throw new CascadingException(se.getMessage(), se);
           }
  @@ -567,51 +589,51 @@
   
           if (useQueueing) {
               if (queueSize > 0) {
  -                m_executor = new PooledExecutor(new 
BoundedBuffer(queueSize));
  +                this.executor = new PooledExecutor(new 
BoundedBuffer(queueSize));
               } else {
  -                m_executor = new PooledExecutor(new LinkedQueue());
  +                this.executor = new PooledExecutor(new LinkedQueue());
               }
           } else {
  -            m_executor = new PooledExecutor();
  +            this.executor = new PooledExecutor();
           }
   
           final int maxPoolSize = 
poolConfig.getChild("max-pool-size").getValueAsInteger(-1);
   
           if (maxPoolSize > 0) {
  -            m_executor.setMaximumPoolSize(maxPoolSize);
  +            this.executor.setMaximumPoolSize(maxPoolSize);
           } else {
  -            
m_executor.setMaximumPoolSize(PooledExecutor.DEFAULT_MAXIMUMPOOLSIZE);
  +            
this.executor.setMaximumPoolSize(PooledExecutor.DEFAULT_MAXIMUMPOOLSIZE);
           }
   
           final int minPoolSize = 
poolConfig.getChild("min-pool-size").getValueAsInteger(-1);
   
           if (minPoolSize > 0) {
  -            m_executor.setMinimumPoolSize(minPoolSize);
  +            this.executor.setMinimumPoolSize(minPoolSize);
           } else {
  -            
m_executor.setMinimumPoolSize(PooledExecutor.DEFAULT_MINIMUMPOOLSIZE);
  +            
this.executor.setMinimumPoolSize(PooledExecutor.DEFAULT_MINIMUMPOOLSIZE);
           }
   
           final int keepAliveTimeMs = 
poolConfig.getChild("keep-alive-time-ms").getValueAsInteger(-1);
   
           if (keepAliveTimeMs > 0) {
  -            m_executor.setKeepAliveTime(keepAliveTimeMs);
  +            this.executor.setKeepAliveTime(keepAliveTimeMs);
           } else {
  -            
m_executor.setKeepAliveTime(PooledExecutor.DEFAULT_KEEPALIVETIME);
  +            
this.executor.setKeepAliveTime(PooledExecutor.DEFAULT_KEEPALIVETIME);
           }
   
           final String blockPolicy = 
poolConfig.getChild("block-policy").getValue(null);
   
           if (blockPolicy != null) {
               if (blockPolicy.equalsIgnoreCase(POLICY_ABORT)) {
  -                m_executor.abortWhenBlocked();
  +                this.executor.abortWhenBlocked();
               } else if (blockPolicy.equalsIgnoreCase(POLICY_DISCARD)) {
  -                m_executor.discardWhenBlocked();
  +                this.executor.discardWhenBlocked();
               } else if (blockPolicy.equalsIgnoreCase(POLICY_DISCARD_OLDEST)) {
  -                m_executor.discardOldestWhenBlocked();
  +                this.executor.discardOldestWhenBlocked();
               } else if (blockPolicy.equalsIgnoreCase(POLICY_RUN)) {
  -                m_executor.runWhenBlocked();
  +                this.executor.runWhenBlocked();
               } else if (blockPolicy.equalsIgnoreCase(POLICY_WAIT)) {
  -                m_executor.waitWhenBlocked();
  +                this.executor.waitWhenBlocked();
               } else {
                   getLogger().warn("Unknown block-policy configuration '" + 
blockPolicy + "'. Should be one of '" +
                                    POLICY_ABORT + "','" + POLICY_DISCARD + 
"','" + POLICY_DISCARD_OLDEST + "','" +
  @@ -622,14 +644,14 @@
           m_shutdownGraceful = 
poolConfig.getChild("shutdown-graceful").getValueAsBoolean(true);
   
           final int shutdownWaitTimeMs = 
poolConfig.getChild("shutdown-wait-time-ms").getValueAsInteger(-1);
  -        final ThreadPool pool = new ThreadPool(m_executor, 
shutdownWaitTimeMs);
  +        final ThreadPool pool = new ThreadPool(this.executor, 
shutdownWaitTimeMs);
           pool.enableLogging(getLogger());
   
           if (getLogger().isInfoEnabled()) {
               getLogger().info("using a PooledExecutor as ThreadPool with 
queueing=" + useQueueing +
                                (useQueueing ? (",queue-size=" + ((queueSize > 
0) ? ("" + queueSize) : "default")) : "") +
  -                             ",max-pool-size=" + 
m_executor.getMaximumPoolSize() + ",min-pool-size=" +
  -                             m_executor.getMinimumPoolSize() + 
",keep-alive-time-ms=" + m_executor.getKeepAliveTime() +
  +                             ",max-pool-size=" + 
this.executor.getMaximumPoolSize() + ",min-pool-size=" +
  +                             this.executor.getMinimumPoolSize() + 
",keep-alive-time-ms=" + this.executor.getKeepAliveTime() +
                                ",block-policy='" + blockPolicy + 
"',shutdown-wait-time-ms=" +
                                ((shutdownWaitTimeMs > 0) ? ("" + 
shutdownWaitTimeMs) : "default"));
           }
  @@ -676,13 +698,13 @@
       private boolean fireJob(final String name, final Object job) {
           try {
               if (job instanceof CronJob) {
  -                m_executor.execute(new Runnable() {
  +                this.executor.execute(new Runnable() {
                           public void run() {
                               ((CronJob)job).execute(name);
                           }
                       });
               } else if (job instanceof Runnable) {
  -                m_executor.execute((Runnable)job);
  +                this.executor.execute((Runnable)job);
               } else {
                   getLogger().error("job named '" + name + "' is of invalid 
class: " + job.getClass().getName());
   
  @@ -703,11 +725,9 @@
        * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a>
        * @version CVS $Id$
        */
  -    private static class ThreadPool
  -    extends AbstractLogEnabled
  -    implements org.quartz.spi.ThreadPool {
  +    private static class ThreadPool extends AbstractLogEnabled implements 
org.quartz.spi.ThreadPool {
           /** Our executor thread pool */
  -        private PooledExecutor m_executor;
  +        private PooledExecutor executor;
   
           /** How long to wait for running jobs to terminate on disposition */
           private int m_shutdownWaitTimeMs;
  @@ -717,7 +737,7 @@
            */
           public ThreadPool(final PooledExecutor executor, final int 
shutownWaitTimeMs) {
               super();
  -            m_executor = executor;
  +            this.executor = executor;
               m_shutdownWaitTimeMs = shutownWaitTimeMs;
           }
   
  @@ -725,7 +745,7 @@
            * @see org.quartz.spi.ThreadPool#getPoolSize()
            */
           public int getPoolSize() {
  -            return m_executor.getMaximumPoolSize();
  +            return this.executor.getMaximumPoolSize();
           }
   
           /* (non-Javadoc)
  @@ -739,7 +759,7 @@
            */
           public boolean runInThread(final Runnable job) {
               try {
  -                m_executor.execute(job);
  +                this.executor.execute(job);
               } catch (final InterruptedException ie) {
                   getLogger().error("Cronjob failed", ie);
               }
  @@ -752,27 +772,25 @@
            */
           public void shutdown(final boolean waitForJobsToComplete) {
               if (waitForJobsToComplete) {
  -                m_executor.shutdownAfterProcessingCurrentlyQueuedTasks();
  +                this.executor.shutdownAfterProcessingCurrentlyQueuedTasks();
               } else {
  -                m_executor.shutdownNow();
  +                this.executor.shutdownNow();
               }
   
               try {
                   if (m_shutdownWaitTimeMs > 0) {
  -                    if 
(!m_executor.awaitTerminationAfterShutdown(m_shutdownWaitTimeMs)) {
  +                    if 
(!this.executor.awaitTerminationAfterShutdown(m_shutdownWaitTimeMs)) {
                           getLogger().warn("scheduled cron jobs are not 
terminating within " + m_shutdownWaitTimeMs +
                                            "ms, Will shut them down by 
interruption");
  -                        m_executor.interruptAll();
  -                        m_executor.shutdownNow();
  +                        this.executor.interruptAll();
  +                        this.executor.shutdownNow();
                       }
                   }
   
  -                m_executor.awaitTerminationAfterShutdown();
  +                this.executor.awaitTerminationAfterShutdown();
               } catch (final InterruptedException ie) {
                   getLogger().error("cannot shutdown Executor", ie);
               }
           }
       }
  -
  -
   }
  
  
  
  1.6       +52 -44    
cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/TestCronJob.java
  
  Index: TestCronJob.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/TestCronJob.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestCronJob.java  5 Mar 2004 13:01:49 -0000       1.5
  +++ TestCronJob.java  11 Mar 2004 15:38:31 -0000      1.6
  @@ -15,16 +15,20 @@
    */
   package org.apache.cocoon.components.cron;
   
  -import java.io.IOException;
   import java.io.InputStream;
   import java.io.InputStreamReader;
   import java.util.Date;
   import java.util.Map;
   
  +import org.apache.avalon.framework.CascadingRuntimeException;
   import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.framework.configuration.ConfigurationException;
   import org.apache.avalon.framework.parameters.Parameters;
  +import org.apache.avalon.framework.service.ServiceManager;
  +import org.apache.avalon.framework.service.Serviceable;
  +import org.apache.excalibur.source.Source;
  +import org.apache.excalibur.source.SourceResolver;
   
   
   /**
  @@ -36,8 +40,8 @@
    *
    * @since 2.1.1
    */
  -public class TestCronJob extends AbstractPipelineCallingCronJob
  -    implements CronJob, Configurable, ConfigurableCronJob {
  +public class TestCronJob extends ServiceableCronJob
  +    implements CronJob, Configurable, ConfigurableCronJob, Serviceable {
       
       /** Parameter key for the message */
       public static final String PARAMETER_MESSAGE = 
"TestCronJob.Parameter.Message";
  @@ -56,6 +60,9 @@
       
       /** The pipeline to be called */
       private String pipeline = null;
  +    
  +    /** The service manager */
  +    private ServiceManager manager;
   
       /* (non-Javadoc)
        * @see 
org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
  @@ -66,44 +73,48 @@
           m_sleep = config.getChild("sleep").getValueAsInteger(11000);
           pipeline = 
config.getChild("pipeline").getValue("samples/hello-world/hello.xhtml");
       }
  -
  -    /* (non-Javadoc)
  -     * @see 
org.apache.cocoon.components.cron.CronJob#execute(java.lang.String)
  -     */
  +    
  +    public void service(ServiceManager manager) {
  +     this.manager = manager;
  +    }
  +    
       public void execute(String name) {
  -        getLogger().info("CronJob " + name + " launched at " + new Date() + 
" with message '" + m_msg +
  -                         "' and sleep timeout of " + m_sleep + "ms");
  -        
  -        InputStream is = null;
  -        try {
  -            is = process(pipeline);
  -        } catch (Exception e) {
  -            getLogger().error("error in execution of TestCronJob", e);
  -        } 
  -        StringBuffer sb = new StringBuffer();
  -        try {        
  -            InputStreamReader reader = new InputStreamReader(is);
  -            sb = new StringBuffer();
  -            char[] b = new char[8192];
  -            int n;
  -
  -            while((n = reader.read(b)) > 0) {
  -                sb.append(b, 0, n); 
  -            } 
  -        } catch( IOException ioe ) {
  -            getLogger().error("error trying to read the InputStream returned 
by the Pipeline processor");
  -        }
  -        getLogger().info("Cronjob " + name + " called pipeline " + pipeline 
+ 
  -            " and received following content:\n" + sb.toString() );
  +             getLogger().info("CronJob " + name + " launched at " + new 
Date() + " with message '" + m_msg +
  +                                              "' and sleep timeout of " + 
m_sleep + "ms");
  +             
  +             try {
  +                     SourceResolver resolver = 
(SourceResolver)this.manager.lookup(SourceResolver.ROLE);
  +                     Source src = resolver.resolveURI("cocoon://" + 
pipeline);
  +                     InputStream is = src.getInputStream();
  +                     
  +                     InputStreamReader reader = new InputStreamReader(is);
  +                     StringBuffer sb = new StringBuffer();
  +                     char[] b = new char[8192];
  +                     int n;
  +
  +                     while((n = reader.read(b)) > 0) {
  +                             sb.append(b, 0, n); 
  +                     }
  +                     
  +                     reader.close();
  +                     resolver.release(src);
  +                     manager.release(resolver);
  +                     
  +                     getLogger().info("Cronjob " + name + " called pipeline 
" + pipeline + 
  +                             " and received following content:\n" + 
sb.toString() );
          
  -        try {
  -            Thread.sleep(m_sleep);
  -        } catch (final InterruptedException ie) {
  -            //getLogger().error("CronJob " + name + " interrupted", ie);
  -        }
  -
  -        getLogger().info("CronJob " + name + " finished at " + new Date() + 
" with message '" + m_msg +
  -                         "' and sleep timeout of " + m_sleep + "ms");
  +                     try {
  +                             Thread.sleep(m_sleep);
  +                     } catch (final InterruptedException ie) {
  +                             //getLogger().error("CronJob " + name + " 
interrupted", ie);
  +                     }
  +
  +                     getLogger().info("CronJob " + name + " finished at " + 
new Date() + " with message '" + m_msg +
  +                                                      "' and sleep timeout 
of " + m_sleep + "ms");
  +                     
  +             } catch(Exception e) {
  +                 throw new CascadingRuntimeException("CronJob " + name + " 
raised an exception", e);
  +             }
       }
   
       /* (non-Javadoc)
  @@ -116,8 +127,5 @@
               pipeline = params.getParameter(PARAMETER_PIPELINE, pipeline );
               
           }
  -    }
  -
  -
  -    
  +    }    
   }
  
  
  
  1.6       +23 -3     
cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/QuartzJobExecutor.java
  
  Index: QuartzJobExecutor.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/QuartzJobExecutor.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- QuartzJobExecutor.java    5 Mar 2004 13:01:49 -0000       1.5
  +++ QuartzJobExecutor.java    11 Mar 2004 15:38:31 -0000      1.6
  @@ -15,11 +15,16 @@
    */
   package org.apache.cocoon.components.cron;
   
  +import java.io.OutputStream;
  +import java.net.MalformedURLException;
   import java.util.Map;
   
   import org.apache.avalon.framework.logger.Logger;
   import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.avalon.framework.service.ServiceManager;
  +import org.apache.cocoon.components.CocoonComponentManager;
  +import org.apache.cocoon.environment.background.BackgroundEnvironment;
  +import org.apache.cocoon.util.NullOutputStream;
   import org.quartz.Job;
   import org.quartz.JobDataMap;
   import org.quartz.JobExecutionContext;
  @@ -38,6 +43,9 @@
   implements Job {
       /** Map key for the run status */
       static final String DATA_MAP_KEY_ISRUNNING = 
"QuartzJobExecutor.isRunning";
  +    
  +    /** Shared instance (no state, as it does nothing) */
  +    static final OutputStream NULL_OUTPUT = new NullOutputStream();
   
       /* (non-Javadoc)
        * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
  @@ -69,7 +77,18 @@
   
           Object job = null;
           String jobrole = null;
  -        ServiceManager manager = null;
  +        
  +        ServiceManager manager = 
(ServiceManager)data.get(QuartzJobScheduler.DATA_MAP_MANAGER);
  +             org.apache.cocoon.environment.Context envContext =
  +                     
(org.apache.cocoon.environment.Context)data.get(QuartzJobScheduler.DATA_MAP_ENV_CONTEXT);
  +        BackgroundEnvironment env;
  +             try {
  +                     env = new BackgroundEnvironment(logger, envContext, 
manager);
  +             } catch (MalformedURLException mue) {
  +                     // Unlikely to happen
  +                     throw new JobExecutionException(mue);
  +             }
  +        CocoonComponentManager.enterEnvironment(env, env.getManager(), 
env.getProcessor());
   
           try {
               jobrole = (String)data.get(QuartzJobScheduler.DATA_MAP_ROLE);
  @@ -77,7 +96,6 @@
               if (null == jobrole) {
                   job = data.get(QuartzJobScheduler.DATA_MAP_OBJECT);
               } else {
  -                manager = 
(ServiceManager)data.get(QuartzJobScheduler.DATA_MAP_MANAGER);
                   job = manager.lookup(jobrole);
               }
   
  @@ -106,6 +124,8 @@
               }
           } finally {
               data.put(DATA_MAP_KEY_ISRUNNING, Boolean.FALSE);
  +            
  +            CocoonComponentManager.leaveEnvironment();
   
               if (null != manager) {
                   manager.release(job);
  
  
  
  1.3       +6 -2      
cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/AbstractPipelineCallingCronJob.java
  
  Index: AbstractPipelineCallingCronJob.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/components/cron/AbstractPipelineCallingCronJob.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractPipelineCallingCronJob.java       5 Mar 2004 13:01:49 -0000       
1.2
  +++ AbstractPipelineCallingCronJob.java       11 Mar 2004 15:38:31 -0000      
1.3
  @@ -34,8 +34,12 @@
    * method which calls a Cocoon pipeline internally. It uses the 
    * 
<code>org.apache.cocoon.environment.background.BackgroundEnvironment</code>
    * to avoid an external call.
  + * <p>
  + * Some enhancements have been made on the scheduler that make this class now
  + * useless as the regular sourceresolver mechanism can be used.
    *
  - * @author <a href="http://apache.org/~reinhard";>Reinhard Poetz</a> 
  + * @author <a href="http://apache.org/~reinhard";>Reinhard Poetz</a>
  + * @deprecated Use the usual sourceresolver mechanism with a "cocoon://" URI
    * @version CVS $Id$
    *
    * @since 2.1.4
  
  
  
  1.3       +61 -3     
cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/environment/background/BackgroundEnvironment.java
  
  Index: BackgroundEnvironment.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/cron/java/org/apache/cocoon/environment/background/BackgroundEnvironment.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BackgroundEnvironment.java        5 Mar 2004 13:01:50 -0000       1.2
  +++ BackgroundEnvironment.java        11 Mar 2004 15:38:31 -0000      1.3
  @@ -19,14 +19,23 @@
   import java.io.IOException;
   import java.io.OutputStream;
   import java.net.MalformedURLException;
  +import java.util.Map;
   
  +import org.apache.avalon.framework.component.ComponentManager;
  +import org.apache.avalon.framework.component.WrapperComponentManager;
   import org.apache.avalon.framework.logger.Logger;
  +import org.apache.avalon.framework.service.ServiceManager;
  +import org.apache.cocoon.Processor;
  +import org.apache.cocoon.components.pipeline.ProcessingPipeline;
   import org.apache.cocoon.environment.AbstractEnvironment;
  +import org.apache.cocoon.environment.Context;
  +import org.apache.cocoon.environment.Environment;
   import org.apache.cocoon.environment.ObjectModelHelper;
   import org.apache.cocoon.environment.Request;
   import org.apache.cocoon.environment.commandline.CommandLineContext;
   import org.apache.cocoon.environment.commandline.CommandLineRequest;
   import org.apache.cocoon.environment.commandline.CommandLineResponse;
  +import org.apache.cocoon.util.NullOutputStream;
   
   /**
    * A simple implementation of 
<code>org.apache.cocoon.environment.Environment</code>
  @@ -38,7 +47,36 @@
    * @since 2.1.4
    */
   public class BackgroundEnvironment extends AbstractEnvironment {
  -
  +     
  +     private ComponentManager manager;
  +     
  +     public BackgroundEnvironment(Logger logger, Context ctx, ServiceManager 
manager) throws MalformedURLException {
  +             super("", null, new File(ctx.getRealPath("/")), null);
  +             
  +             this.enableLogging(logger);
  +             
  +             this.manager = new WrapperComponentManager(manager);
  +             
  +             this.outputStream = new NullOutputStream();    
  +     
  +             // TODO Would special Background*-objects have advantages?
  +             Request request = new CommandLineRequest(this, "", "", null, 
null, null);
  +             this.objectModel.put(ObjectModelHelper.REQUEST_OBJECT, 
request);  
  +             this.objectModel.put(ObjectModelHelper.RESPONSE_OBJECT,
  +                                                      new 
CommandLineResponse());
  +             this.objectModel.put(ObjectModelHelper.CONTEXT_OBJECT, ctx);
  +     }
  +     
  +     /** Needed by CocoonComponentManager.enterEnvironment */
  +     public ComponentManager getManager() {
  +             return this.manager;
  +     }
  +     
  +     /** Needed by CocoonComponentManager.enterEnvironment */
  +     public Processor getProcessor() {
  +             return NullProcessor.INSTANCE;
  +     }
  +     
       /**
        * @param uri
        * @param view
  @@ -100,5 +138,25 @@
       public boolean isExternal() {
           return false;
       }
  -
  +    
  +    /** Dumb implementation needed by 
CocoonComponentManager.enterEnvironment() */
  +    public static class NullProcessor implements Processor {
  +     
  +     public static final Processor INSTANCE = new NullProcessor();
  +
  +             public boolean process(Environment environment) throws 
Exception {
  +                     throw new UnsupportedOperationException();
  +             }
  +             public ProcessingPipeline buildPipeline(Environment 
environment) throws Exception {
  +                     throw new UnsupportedOperationException();
  +             }
  +
  +             public Map getComponentConfigurations() {
  +                     throw new UnsupportedOperationException();
  +             }
  +
  +             public Processor getRootProcessor() {
  +                     throw new UnsupportedOperationException();
  +             }
  +    }
   }
  
  
  

Reply via email to