Author: pzf
Date: Tue Aug  7 09:09:05 2007
New Revision: 563541

URL: http://svn.apache.org/viewvc?view=rev&rev=563541
Log:
added SimpleQuartz startup, factory, synapse Job Interface and a simple 
MessageInjector job

Added:
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java?view=auto&rev=563541
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
 Tue Aug  7 09:09:05 2007
@@ -0,0 +1,61 @@
+package org.apache.synapse.startup.jobs;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.ManagedLifecycle;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.startup.Job;
+import org.apache.synapse.util.PayloadHelper;
+
+public class MessageInjector implements Job, ManagedLifecycle {
+       private Log log = LogFactory.getLog(MessageInjector.class);
+
+       private OMElement message;
+
+       String to;
+
+       private SynapseEnvironment synapseEnvironment;
+
+       public void setMessage(OMElement el) {
+               log.debug("set message " + el.toString());
+               message = el;
+       }
+
+       public void setTo(String url) {
+               to = url;
+       }
+
+       public void execute() {
+               log.debug("execute");
+               if (synapseEnvironment == null) {
+                       log.error("Synapse Environment not set");
+                       return;
+               }
+               if (message == null) {
+                       log.error("message not set");
+                       return;
+
+               }
+               if (to == null) {
+                       log.error("to address not set");
+                       return;
+
+               }
+               MessageContext mc = synapseEnvironment.createMessageContext();
+               mc.setTo(new EndpointReference(to));
+               PayloadHelper.setXMLPayload(mc, message.cloneOMElement());
+               synapseEnvironment.injectMessage(mc);
+
+       }
+
+       public void destroy() {
+       }
+
+       public void init(SynapseEnvironment se) {
+               synapseEnvironment = se;
+       }
+
+}

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java?view=auto&rev=563541
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
 Tue Aug  7 09:09:05 2007
@@ -0,0 +1,153 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+import org.quartz.CronTrigger;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.quartz.TriggerUtils;
+import org.quartz.impl.DirectSchedulerFactory;
+
+/*
+ * This class is instantiated by SimpleQuartzFactory (or by hand)
+ * When it is initialized it creates a Quartz Scheduler with a job and a 
trigger
+ * The class it starts is always an instance of SimpleQuartzJob
+ * SimpleQuartzJob is there to set the properties and start the actual 
business-logic class
+ * It wraps up any properties that the job needs as in the JobDetail and JDMap
+ */
+public class SimpleQuartz implements Startup {
+       private static final Log log = LogFactory.getLog(SimpleQuartz.class);
+       private static final int THREADPOOLSIZE = 5;
+
+       private String cron;
+
+       private int repeatCount;
+
+       private long repeatInterval;
+
+       private boolean simple; // true means use repeat, false means use cron
+
+       private String className;
+
+//     private SynapseEnvironment synapseEnvironment;
+
+       private Scheduler sch;
+
+       Set xmlProperties = new HashSet();
+
+       public QName getTagQName() {
+               return SimpleQuartzFactory.JOB;
+       }
+
+       public void destroy() {
+               if (sch != null) {
+                       try {
+                               sch.shutdown();
+                       } catch (SchedulerException e) {
+                               throw new SynapseException(e);
+                       }
+               }
+
+       }
+
+       public void init(SynapseEnvironment synapseEnvironment) {
+               
+               //this.synapseEnvironment = synapseEnvironment;
+               try {
+                       
DirectSchedulerFactory.getInstance().createVolatileScheduler(
+                                       THREADPOOLSIZE);
+                       sch = 
DirectSchedulerFactory.getInstance().getScheduler();
+                       Trigger trigger = null;
+                       if (simple) {
+                               
+                               trigger = 
TriggerUtils.makeImmediateTrigger(repeatCount, repeatInterval);
+                       } else {
+                               CronTrigger cronTrig = new CronTrigger();
+                               cronTrig.setCronExpression(cron);
+                               trigger = cronTrig;
+                       }
+                       // give the trigger a random name
+                       trigger.setName("Trigger"+String.valueOf((new 
Random()).nextLong()));
+                       trigger.setGroup("synapse.simple.quartz");
+                       trigger.setVolatility(true);
+                       JobDetail jobDetail = new JobDetail();
+                       // Give the job a random name 
+                       jobDetail.setName("Job"+String.valueOf((new 
Random()).nextLong()));
+                       jobDetail.setGroup("synapse.simple.quartz");
+                       jobDetail.setJobClass(SimpleQuartzJob.class);
+                       JobDataMap jdm = new JobDataMap();
+                       jdm.put(SimpleQuartzJob.SYNAPSEENVIRONMENT, 
synapseEnvironment);
+                       jdm.put(SimpleQuartzJob.CLASSNAME, className);
+                       jdm.put(SimpleQuartzJob.PROPERTIES, xmlProperties);
+                       jobDetail.setJobDataMap(jdm);
+                       sch.scheduleJob(jobDetail, trigger);
+                       sch.start();
+                       log.info("Scheduled job "+jobDetail.getFullName()+" for 
class "+className);
+
+               } catch (Exception e) {
+                       throw new SynapseException("Problem with startup of 
Scheduler ", e);
+               }
+
+       }
+
+       public String getJobClass() {
+               return className;
+       }
+       
+       public void setJobClass(String attributeValue) {
+               className = attributeValue;
+
+       }
+
+       public void setSimple(boolean b) {
+               simple = b;
+       }
+       
+       public boolean isSimple() {
+               return simple;
+       }
+
+       public void setInterval(long l) {
+               repeatInterval = l;
+
+       }
+       public long getInterval() {
+               return repeatInterval;
+       }
+
+       public void setCount(int i) {
+               repeatCount = i;
+       }
+       public int getCount() {
+               return repeatCount;
+       }
+
+       public void addProperty(OMElement prop) {
+               xmlProperties.add(prop);
+       }
+       public Set getProperties() {
+               return xmlProperties;
+       }
+
+       public void setCron(String attributeValue) {
+               cron = attributeValue;
+
+       }
+       public String getCron() {
+               return cron;
+       }
+
+}

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java?view=auto&rev=563541
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
 Tue Aug  7 09:09:05 2007
@@ -0,0 +1,167 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.config.xml.Constants;
+import org.apache.synapse.config.xml.PropertyHelper;
+import org.apache.synapse.config.xml.StartupFactory;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+
+/*
+ * Namespace = synapse namespace
+ * 
+ *  <job class="org.my.synapse.job">
+ *  <property name="stringProp" value="String"/>
+ *  <property name="xmlProp">
+ *  %lt;somexml>config</somexml>
+ *  &lt;/property>
+ *  &lt;simpletrigger forever="true" count="10" interval="1000"/> 
+ *  &lt;!-- forever or count not both -->
+ *  &lt;crontrigger expression="0 * 1 * * ?" />
+ *  &lt;/job>
+ * 
+ */
+
+public class SimpleQuartzFactory implements StartupFactory {
+       public  final static QName JOB = new QName(Constants.SYNAPSE_NAMESPACE,
+                       "job");
+
+       private final static QName SIMPLE = new 
QName(Constants.SYNAPSE_NAMESPACE,
+                       "simpletrigger");
+
+       private final static QName CRON = new QName(Constants.SYNAPSE_NAMESPACE,
+                       "crontrigger");
+
+       private final static QName PROPERTY = new QName(
+                       Constants.SYNAPSE_NAMESPACE, "property");
+
+       private final static Log log = 
LogFactory.getLog(SimpleQuartzFactory.class);
+
+       public Startup createStartup(OMElement el) {
+               if (log.isDebugEnabled())
+                       log.debug("Creating SimpleQuartz startup");
+               if (el.getQName().equals(JOB)) {
+                       SimpleQuartz q = new SimpleQuartz();
+                       OMAttribute classAttr = el.getAttribute(new 
QName("class"));
+                       if (classAttr == null) {
+                               log.error("No class attribute on element. It is 
required");
+                               throw new SynapseException(
+                                               "Cannot create Quartz Startup - 
no class attribute");
+                       }
+                       // test if we can create the job?
+                       String classname =classAttr.getAttributeValue();
+                       
+                       // if no package specified then prepend 
"org.apache.synapse.startup.jobs"
+                       if (classname.indexOf('.')==-1) {
+                               classname = 
"org.apache.synapse.startup.jobs."+classname;
+                       }
+                       try {
+                               
getClass().getClassLoader().loadClass(classname).newInstance();
+                       }
+                       catch (Exception e) {
+                               throw new SynapseException("Failed to load job 
class "+ classname, e);
+                       }
+                       q.setJobClass(classname);
+                       // next sort out the property children
+
+                       Iterator it = el.getChildrenWithName(PROPERTY);
+                       while (it.hasNext()) {
+                               // simply store the properties for now - they 
will be loaded when the job is actually run 
+                               OMElement prop = (OMElement) it.next();
+                               if (PropertyHelper.isStaticProperty(prop)) {
+                                       q.addProperty(prop);
+
+                               } else {
+                                       throw new SynapseException(
+                                                       "job does not support 
dynamic properties");
+                               }
+                       }
+
+                       /* try to handle the simpletrigger approach */
+                       OMElement trigger = el.getFirstChildWithName(SIMPLE);
+                       if (trigger != null) {
+                               q.setSimple(true);
+                               OMAttribute repeatInterval = 
trigger.getAttribute(new QName(
+                                               "interval"));
+                               if (repeatInterval == null) {
+                                       log.error("interval attribute must be 
specified");
+                                       throw new SynapseException(
+                                                       "No interval attribute 
specified");
+                               }
+                               try {
+                                       
q.setInterval(Long.parseLong(repeatInterval
+                                                       .getAttributeValue()));
+                               } catch (Exception e) {
+                                       throw new SynapseException(
+                                                       "Failed to parse 
interval as long");
+                               }
+                               OMAttribute count = trigger.getAttribute(new 
QName("count"));
+                               if (count == null) {
+                                       // if no count set then forever must be 
set and set to true
+                                       OMAttribute forever = 
trigger.getAttribute(new QName(
+                                                       "forever"));
+
+                                       if (forever != null) {
+                                               String fValue = 
forever.getAttributeValue();
+                                               if 
(fValue.toLowerCase().charAt(0) == 't'
+                                                               || 
fValue.toLowerCase().charAt(0) == '1') {
+                                                       q.setCount(-1);
+                                               } else {
+                                                       throw new 
SynapseException(
+                                                                       "count 
must be set or forever='true'");
+                                               }
+                                       } else {
+                                               throw new SynapseException(
+                                                               "count must be 
set or forever='true'");
+                                       }
+                               } // else count is set
+                               else {
+                                       try {
+                                               
q.setCount(Integer.parseInt(count.getAttributeValue()));
+                                       } catch (Exception e) {
+                                               throw new SynapseException(
+                                                               "Failed to 
parse count as integer");
+                                       }
+                               }
+
+                       } else // should be cron trigger 
+                       {
+                               trigger = el.getFirstChildWithName(CRON);
+                               if (trigger == null ) {
+                                       log.error("neither cron nor 
simpletrigger are set");
+                                       throw new SynapseException("neither 
crontrigger nor simpletrigger child elements exist");
+                               }
+                               q.setSimple(false); // cron trigger
+                               OMAttribute expr = trigger.getAttribute(new 
QName("expression"));
+                               if (expr==null){ 
+                                       log.error("crontrigger element must 
have expression attribute");
+                                       throw new SynapseException("crontrigger 
element must have expression attribute");
+                               }
+                               q.setCron(expr.getAttributeValue());
+                       }
+
+                       return q;
+               } else {
+                       log.error("wrong QName!");
+                       return null;
+               }
+
+       }
+
+       public Class getSerializerClass() {
+               return SimpleQuartzSerializer.class;
+       }
+
+       public QName getTagQName() {
+
+               return JOB;
+       }
+
+}

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java?view=auto&rev=563541
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
 Tue Aug  7 09:09:05 2007
@@ -0,0 +1,50 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.ManagedLifecycle;
+import org.apache.synapse.config.xml.PropertyHelper;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+public class SimpleQuartzJob implements Job{
+       public static final String SYNAPSEENVIRONMENT= "SynapseEnvironment", 
CLASSNAME="ClassName", PROPERTIES = "Properties";
+       private static final Log log = LogFactory.getLog(SimpleQuartzJob.class);
+       public void execute(JobExecutionContext ctx) throws 
JobExecutionException {
+               log.debug("executing job "+ctx.getJobDetail().getFullName());
+               JobDataMap jdm = ctx.getMergedJobDataMap();
+               String jobClassName = (String)jdm.get(CLASSNAME);
+               if (jobClassName==null) {
+                       throw new JobExecutionException("No "+CLASSNAME+" in 
JobDetails");
+               }
+               org.apache.synapse.startup.Job job =null;
+               try {
+                       job = 
(org.apache.synapse.startup.Job)getClass().getClassLoader().loadClass(jobClassName).newInstance();
+               } catch (Exception e) {
+                       throw new JobExecutionException("Cannot instantiate job 
"+jobClassName, e);
+               }
+               Set properties = (Set)jdm.get(PROPERTIES);
+               Iterator it = properties.iterator();
+               while (it.hasNext()) {
+                       OMElement prop = (OMElement)it.next();
+                       log.debug("found Property"+prop.toString());
+                       PropertyHelper.setStaticProperty(prop, job);
+               }
+               SynapseEnvironment se = 
(SynapseEnvironment)jdm.get("SynapseEnvironment");
+               if (job instanceof ManagedLifecycle) {
+                       if (se!=null) {
+                               ((ManagedLifecycle)job).init(se); 
+                       }
+               }
+               job.execute();
+               
+       }
+
+}

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java?view=auto&rev=563541
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
 Tue Aug  7 09:09:05 2007
@@ -0,0 +1,44 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.synapse.config.xml.Constants;
+import org.apache.synapse.config.xml.StartupSerializer;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+
+public class SimpleQuartzSerializer implements StartupSerializer {
+       
+       public void serializeStartup(OMElement parent, Startup s) {
+               if (!(s instanceof SimpleQuartz)) throw new 
SynapseException("called SimpleQuartzSerializer on some other kind of 
startup"+s.getClass().getName());
+               SimpleQuartz sq = (SimpleQuartz)s;
+               OMFactory fac = parent.getOMFactory();
+               OMNamespace nullNS = fac.createOMNamespace("", "");
+               OMElement job = fac.createOMElement(SimpleQuartzFactory.JOB,  
parent);
+               job.addAttribute("class", sq.getJobClass(), nullNS);
+               if (sq.isSimple()) {
+                       OMElement el = fac.createOMElement(new 
QName(Constants.SYNAPSE_NAMESPACE,"simpletrigger"), job);
+                       if (sq.getCount()==-1) {
+                               el.addAttribute("forever","true",nullNS);
+                       } else {
+                               
el.addAttribute("count",Integer.toString(sq.getCount()),nullNS);
+                       }
+                       el.addAttribute("interval", 
Long.toString(sq.getInterval()), nullNS);
+               } else {
+                       OMElement el = fac.createOMElement(new 
QName(Constants.SYNAPSE_NAMESPACE,"crontrigger"), job);
+                       el.addAttribute("expression", sq.getCron(), nullNS);
+               }
+               Iterator it = sq.getProperties().iterator();
+               while (it.hasNext()) {
+                       OMElement prop = (OMElement)it.next();
+                       job.addChild(prop.cloneOMElement());
+               }
+               
+       }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to