You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2009/12/06 01:59:47 UTC

svn commit: r887623 - in /openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/ container/openejb-core/src/test/java/org/apache/openejb/core/mdb/ examples/ examples/quartz-app/ examples/quartz-app/quartz-beans...

Author: dblevins
Date: Sun Dec  6 00:59:45 2009
New Revision: 887623

URL: http://svn.apache.org/viewvc?rev=887623&view=rev
Log:
OPENEJB-1115: Quartz Resource Adapter

Added:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java   (with props)
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java   (with props)
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java
      - copied, changed from r880936, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java
    openejb/trunk/openejb3/examples/quartz-app/
    openejb/trunk/openejb3/examples/quartz-app/pom.xml   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/
    openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml   (with props)
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/
    openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml   (with props)
Modified:
    openejb/trunk/openejb3/examples/pom.xml

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java Sun Dec  6 00:59:45 2009
@@ -0,0 +1,269 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.resource.quartz;
+
+import org.quartz.CronTrigger;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+
+import javax.resource.spi.ActivationSpec;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.InvalidPropertyException;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+import java.util.Date;
+
+/**
+ * @version $Rev$ $Date$
+*/
+public class JobSpec implements ActivationSpec {
+
+    private MessageEndpoint endpoint;
+    private ResourceAdapter resourceAdapter;
+    private final CronTrigger trigger;
+    private final JobDetail detail;
+    private InvalidPropertyException invalidProperty;
+
+    public JobSpec() {
+        int i = hashCode();
+
+        detail = new JobDetail();
+        trigger = new CronTrigger();
+
+        detail.setJobClass(QuartzResourceAdapter.JobEndpoint.class);
+        detail.getJobDataMap().setAllowsTransientData(true);
+
+        setVolatile(true);
+
+        setJobGroup(Scheduler.DEFAULT_GROUP);
+        setJobName("Job" + i);
+
+        setTriggerGroup(Scheduler.DEFAULT_GROUP);
+        setTriggerName("Trigger" + i);
+    }
+
+    public String getTriggerName() {
+        return trigger.getName();
+    }
+
+    public void setTriggerName(String s) {
+        trigger.setName(s);
+    }
+
+    public String getTriggerGroup() {
+        return trigger.getGroup();
+    }
+
+    public void setTriggerGroup(String s) {
+        trigger.setGroup(s);
+    }
+
+    // -- Job Name
+
+    public String getJobName() {
+        return detail.getName();
+    }
+
+    public void setJobName(String s) {
+        detail.setName(s);
+        trigger.setJobName(s);
+    }
+
+    // -- Job Group
+
+    public void setJobGroup(String s) {
+        detail.setGroup(s);
+        trigger.setJobGroup(s);
+    }
+
+    public String getJobGroup() {
+        return trigger.getJobGroup();
+    }
+
+    // -- Description
+
+    public String getDescription() {
+        return trigger.getDescription();
+    }
+
+    public void setDescription(String s) {
+        detail.setDescription(s);
+        trigger.setDescription(s);
+    }
+
+    // -- Volatility
+
+    public void setVolatile(boolean b) {
+        detail.setVolatility(b);
+        trigger.setVolatility(b);
+    }
+
+    public boolean isVolatile() {
+        return trigger.isVolatile();
+    }
+
+    // -- Recoverable
+
+    public void setRequestsRecovery(boolean b) {
+        detail.setRequestsRecovery(b);
+    }
+
+    public boolean isRequestsRecovery() {
+        return detail.requestsRecovery();
+    }
+
+    // -- Durability
+
+    public boolean isDurable() {
+        return detail.isDurable();
+    }
+
+    public void setDurable(boolean b) {
+        detail.setDurability(b);
+    }
+
+    // -- Calendar name
+
+    public void setCalendarName(String s) {
+        trigger.setCalendarName(s);
+    }
+
+    public String getCalendarName() {
+        return trigger.getCalendarName();
+    }
+
+    // -- Expression
+
+    public void setCronExpression(String s) {
+        try {
+            trigger.setCronExpression(s);
+        } catch (ParseException e) {
+            invalidProperty = new InvalidPropertyException("Invalid cron expression " + s, e);
+        }
+    }
+
+    public String getCronExpression() {
+        return trigger.getCronExpression();
+    }
+
+    /**
+     * An alias for CronExpression
+     *
+     * @param s
+     */
+    public void setCronTrigger(String s) {
+        setCronExpression(s);
+    }
+
+    // --
+
+    public void setTimeZone(String timeZone) {
+        trigger.setTimeZone(TimeZone.getTimeZone(timeZone));
+    }
+
+    // --
+
+    public void setStartTime(String startTime) {
+        Date date = parse(startTime);
+        if (date != null) {
+            trigger.setStartTime(date);
+        }
+    }
+
+    public void setEndTime(String endTime) {
+        Date date = parse(endTime);
+        if (date != null) {
+            trigger.setEndTime(date);
+        }
+    }
+
+
+    private Date parse(String value) {
+
+        String[] formats = {
+                "EEE MMM d HH:mm:ss z yyyy",
+                "EEE, d MMM yyyy HH:mm:ss Z",
+                "yyyy-MM-dd HH:mm:ss.S",
+                "yyyy-MM-dd HH:mm:ss.SZ",
+                "yyyy-MM-dd HH:mm:ss.S",
+                "yyyy-MM-dd HH:mm:ssZ",
+                "yyyy-MM-dd HH:mm:ss",
+                "yyyy-MM-dd HH:mmZ",
+                "yyyy-MM-dd HH:mm",
+                "yyyy-MM-dd'T'HH:mm:ss.SZ",
+                "yyyy-MM-dd'T'HH:mm:ss.S",
+                "yyyy-MM-dd'T'HH:mm:ssZ",
+                "yyyy-MM-dd'T'HH:mm:ss",
+                "yyyy-MM-dd'T'HH:mmZ",
+                "yyyy-MM-dd'T'HH:mm",
+                "yyyy-MM-dd",
+                "yyyyMMdd"
+        };
+
+        for (String format : formats) {
+            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+            try {
+                return dateFormat.parse(value);
+            } catch (ParseException e) {
+                invalidProperty = new InvalidPropertyException("Invalid time format " + value, e);
+            }
+
+        }
+
+        return null;
+    }
+
+    // -- ActivationSpec methods
+
+    public void validate() throws InvalidPropertyException {
+        if (invalidProperty != null) throw invalidProperty;
+
+        try {
+            detail.validate();
+            trigger.validate();
+        } catch (SchedulerException e) {
+            throw new InvalidPropertyException(e);
+        }
+    }
+
+    public ResourceAdapter getResourceAdapter() {
+        return resourceAdapter;
+    }
+
+    public void setResourceAdapter(ResourceAdapter resourceAdapter) {
+        this.resourceAdapter = resourceAdapter;
+    }
+
+    MessageEndpoint getEndpoint() {
+        return endpoint;
+    }
+
+    void setEndpoint(MessageEndpoint endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    CronTrigger getTrigger() {
+        return trigger;
+    }
+
+    JobDetail getDetail() {
+        return detail;
+    }
+}

Propchange: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java Sun Dec  6 00:59:45 2009
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.resource.quartz;
+
+import org.quartz.Scheduler;
+import org.quartz.SchedulerFactory;
+import org.quartz.SchedulerException;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.impl.StdSchedulerFactory;
+
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.ActivationSpec;
+import javax.resource.spi.endpoint.MessageEndpointFactory;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import javax.resource.ResourceException;
+import javax.transaction.xa.XAResource;
+import java.lang.reflect.Method;
+
+/**
+ * @version $Rev$ $Date$
+*/
+public class QuartzResourceAdapter implements javax.resource.spi.ResourceAdapter {
+
+    private Scheduler scheduler;
+
+    public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
+        try {
+            SchedulerFactory factory = new StdSchedulerFactory();
+            scheduler = factory.getScheduler();
+            scheduler.start();
+        } catch (SchedulerException e) {
+            throw new ResourceAdapterInternalException("Failed to create Quartz Scheduler", e);
+        }
+    }
+
+    public void stop() {
+        try {
+            scheduler.shutdown(true);
+        } catch (SchedulerException e) {
+            throw new IllegalStateException("Failed to shutdown Quartz Scheduler", e);
+        }
+    }
+
+    public void endpointActivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) throws ResourceException {
+        JobSpec spec = (JobSpec) activationSpec;
+
+        MessageEndpoint endpoint = messageEndpointFactory.createEndpoint(null);
+        spec.setEndpoint(endpoint);
+
+        Job job = (Job) endpoint;
+
+        JobDataMap jobDataMap = spec.getDetail().getJobDataMap();
+        jobDataMap.setAllowsTransientData(true);
+        jobDataMap.put(Data.class.getName(), new Data(job));
+
+        try {
+            scheduler.scheduleJob(spec.getDetail(), spec.getTrigger());
+        } catch (SchedulerException e) {
+            throw new ResourceException("Failed to schedule job", e);
+        }
+    }
+
+    public void endpointDeactivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) {
+        JobSpec spec = (JobSpec) activationSpec;
+
+        try {
+            scheduler.deleteJob(spec.getJobName(), spec.getJobGroup());
+        } catch (SchedulerException e) {
+            throw new IllegalStateException("Failed to delete job", e);
+        }
+
+        spec.getEndpoint().release();
+    }
+
+
+    public static class JobEndpoint implements Job {
+
+        public void execute(JobExecutionContext execution) throws JobExecutionException {
+
+            JobDataMap jobDataMap = execution.getJobDetail().getJobDataMap();
+
+            Data data = Data.class.cast(jobDataMap.get(Data.class.getName()));
+
+            Job job = data.job;
+
+            MessageEndpoint endpoint = (MessageEndpoint) job;
+
+            try {
+                Method method = Job.class.getMethod("execute", JobExecutionContext.class);
+
+                endpoint.beforeDelivery(method);
+
+                job.execute(execution);
+            } catch (NoSuchMethodException e) {
+                throw new IllegalStateException(e);
+            } catch (ResourceException e) {
+                throw new JobExecutionException(e);
+            } finally {
+                try {
+                    endpoint.afterDelivery();
+                } catch (ResourceException e) {
+                    throw new JobExecutionException(e);
+                }
+            }
+        }
+    }
+
+    /**
+     * A private inner class is used so the key and value are not publicly visible.
+     * This is standard OpenEJB practice for all "public storage" maps as it prevents
+     * outside code from becoming dependent on or tampering with the private data.
+     */
+    private static class Data {
+        private final Job job;
+
+        private Data(Job job) {
+            this.job = job;
+        }
+    }
+
+    public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException {
+        return new XAResource[0];
+    }
+}

Propchange: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java (from r880936, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java?p2=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java&p1=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java&r1=880936&r2=887623&rev=887623&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java Sun Dec  6 00:59:45 2009
@@ -35,9 +35,13 @@
 import org.apache.openejb.jee.MessageAdapter;
 import org.apache.openejb.jee.MessageListener;
 import org.apache.openejb.util.Join;
+import org.apache.openejb.resource.quartz.QuartzResourceAdapter;
+import org.apache.openejb.resource.quartz.JobSpec;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
 
 import javax.naming.InitialContext;
-import javax.jms.ConnectionFactory;
 import javax.annotation.Resource;
 import javax.annotation.PostConstruct;
 import javax.ejb.MessageDrivenContext;
@@ -60,11 +64,13 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.Condition;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @version $Rev$ $Date$
  */
-public class CustomMdbContainerTest extends TestCase {
+public class QuartzMdbContainerTest extends TestCase {
     public void test() throws Exception {
         System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
 
@@ -76,38 +82,30 @@
 
         // Setup the descriptor information
 
-        EmailBean.lifecycle.clear();
+        CronBean.lifecycle.clear();
 
 
         AppModule app = new AppModule(this.getClass().getClassLoader(), "testapp");
 
-        Connector connector = new Connector("email-ra");
-        ResourceAdapter adapter = connector.setResourceAdapter(new ResourceAdapter(EmailResourceAdapter.class));
+        Connector connector = new Connector("quartz");
+        ResourceAdapter adapter = connector.setResourceAdapter(new ResourceAdapter(QuartzResourceAdapter.class));
         InboundResource inbound = adapter.setInboundResourceAdapter(new InboundResource());
         MessageAdapter messageAdapter = inbound.setMessageAdapter(new MessageAdapter());
-        MessageListener listener = messageAdapter.addMessageListener(new MessageListener(EmailConsumer.class, EmailAccountInfo.class));
-        listener.getActivationSpec().addRequiredConfigProperty("address");
+        MessageListener listener = messageAdapter.addMessageListener(new MessageListener(Job.class, JobSpec.class));
+        listener.getActivationSpec().addRequiredConfigProperty("cronExpression");
         app.getResourceModules().add(new ConnectorModule(connector));
 
         EjbJar ejbJar = new EjbJar();
-        ejbJar.addEnterpriseBean(new MessageDrivenBean(EmailBean.class));
+        ejbJar.addEnterpriseBean(new MessageDrivenBean(CronBean.class));
         app.getEjbModules().add(new EjbModule(ejbJar));
 
         AppInfo appInfo = config.configureApplication(app);
         assembler.createApplication(appInfo);
 
-        InitialContext initialContext = new InitialContext();
 
-        EmailResourceAdapter ra = (EmailResourceAdapter) initialContext.lookup("java:openejb/Resource/email-raRA");
+        assertTrue(CronBean.latch.await(5, TimeUnit.SECONDS));
 
-        Properties headers = new Properties();
-        headers.put("To", "dblevins@apache.org");
-        headers.put("From", "dblevins@visi.com");
-        headers.put("Subject", "Hello");
-
-        ra.deliverEmail(headers, "How's it going?");
-
-        Stack<Lifecycle> lifecycle = EmailBean.lifecycle;
+        Stack<Lifecycle> lifecycle = CronBean.lifecycle;
 
         List expected = Arrays.asList(Lifecycle.values());
 
@@ -119,15 +117,14 @@
         CONSTRUCTOR, INJECTION, POST_CONSTRUCT, ON_MESSAGE
     }
 
-    @MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "address", propertyValue = "dblevins@apache.org")})
-    public static class EmailBean implements EmailConsumer {
+    @MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "cronExpression", propertyValue = "* * * * * ?" )})
+    public static class CronBean implements Job {
 
-        public static Lock lock = new ReentrantLock();
-        public static Condition messageRecieved = lock.newCondition();
+        public static CountDownLatch latch = new CountDownLatch(1);
 
         private static Stack<Lifecycle> lifecycle = new Stack<Lifecycle>();
 
-        public EmailBean() {
+        public CronBean() {
             lifecycle.push(Lifecycle.CONSTRUCTOR);
         }
 
@@ -141,83 +138,9 @@
             lifecycle.push(Lifecycle.POST_CONSTRUCT);
         }
 
-        public void receiveEmail(Properties headers, String body) {
+        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
             lifecycle.push(Lifecycle.ON_MESSAGE);
+            latch.countDown();
         }
     }
-
-    public static interface EmailConsumer {
-        public void receiveEmail(Properties headers, String body);
-    }
-
-    public static class EmailResourceAdapter implements javax.resource.spi.ResourceAdapter {
-        public boolean started;
-
-        private final Map<String, EmailConsumer> consumers = new HashMap<String, EmailConsumer>();
-
-        public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
-        }
-
-        public void stop() {
-        }
-
-        public void endpointActivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) throws ResourceException {
-            EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec;
-
-            EmailConsumer emailConsumer = (EmailConsumer) messageEndpointFactory.createEndpoint(null);
-            consumers.put(accountInfo.getAddress(), emailConsumer);
-        }
-
-        public void endpointDeactivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) {
-            EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec;
-
-            EmailConsumer emailConsumer = consumers.remove(accountInfo.getAddress());
-            MessageEndpoint endpoint = (MessageEndpoint) emailConsumer;
-            endpoint.release();
-        }
-
-        public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException {
-            return new XAResource[0];
-        }
-
-        public void deliverEmail(Properties headers, String body) throws Exception {
-            String to = headers.getProperty("To");
-
-            EmailConsumer emailConsumer = consumers.get(to);
-
-            if (emailConsumer == null) throw new Exception("No such account");
-
-            MessageEndpoint endpoint = (MessageEndpoint) emailConsumer;
-
-            endpoint.beforeDelivery(EmailConsumer.class.getMethod("receiveEmail", Properties.class, String.class));
-            emailConsumer.receiveEmail(headers, body);
-            endpoint.afterDelivery();
-        }
-    }
-
-    public static class EmailAccountInfo implements ActivationSpec {
-        private EmailResourceAdapter emailResourceAdapter;
-
-        private String address;
-
-        public void validate() throws InvalidPropertyException {
-        }
-
-        public String getAddress() {
-            return address;
-        }
-
-        public void setAddress(String address) {
-            this.address = address;
-        }
-
-        public EmailResourceAdapter getResourceAdapter() {
-            return emailResourceAdapter;
-        }
-
-        public void setResourceAdapter(javax.resource.spi.ResourceAdapter resourceAdapter) {
-            this.emailResourceAdapter = (EmailResourceAdapter) resourceAdapter;
-        }
-    }
-
-}
+}
\ No newline at end of file

Modified: openejb/trunk/openejb3/examples/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/pom.xml?rev=887623&r1=887622&r2=887623&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/pom.xml (original)
+++ openejb/trunk/openejb3/examples/pom.xml Sun Dec  6 00:59:45 2009
@@ -59,6 +59,7 @@
     <module>jpa-eclipselink</module>
     <module>spring-integration</module>
     <module>telephone-stateful</module>
+    <module>quartz-app</module>
     <module>webservice-attachments</module>
     <module>webapps</module>
     <module>webservice-security</module>

Added: openejb/trunk/openejb3/examples/quartz-app/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/pom.xml Sun Dec  6 00:59:45 2009
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.superbiz.quartz</groupId>
+  <artifactId>quartz-app</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <name>Quartz App</name>
+
+  <modules>
+    <module>quartz-ra</module>
+    <module>quartz-beans</module>
+  </modules>
+
+  <repositories>
+    <repository>
+      <id>apache-m2-snapshot</id>
+      <name>Apache Snapshot Repository</name>
+      <url>http://people.apache.org/repo/m2-snapshot-repository/</url>
+    </repository>
+  </repositories>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+	<groupId>quartz</groupId>
+	<artifactId>quartz</artifactId>
+	<version>1.5.2</version>
+      </dependency>
+      <dependency>
+	<groupId>org.apache.openejb</groupId>
+	<artifactId>openejb-core</artifactId>
+	<version>3.1.3-SNAPSHOT</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+	<plugin>
+	  <groupId>org.apache.maven.plugins</groupId>
+	  <artifactId>maven-compiler-plugin</artifactId>
+	  <version>2.0.2</version>
+	  <configuration>
+	    <source>1.5</source>
+	    <target>1.5</target>
+	  </configuration>
+	</plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>

Propchange: openejb/trunk/openejb3/examples/quartz-app/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml Sun Dec  6 00:59:45 2009
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.superbiz.quartz</groupId>
+    <artifactId>quartz-app</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>quartz-beans</artifactId>
+  <packaging>jar</packaging>
+  <name>Quartz Beans</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.superbiz.quartz</groupId>
+      <artifactId>quartz-ra</artifactId>
+      <version>${pom.version}</version>
+      <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>quartz</groupId>
+      <artifactId>quartz</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.4</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.15</version>
+      <exclusions>
+	<exclusion>
+	  <groupId>com.sun.jdmk</groupId>
+	  <artifactId>jmxtools</artifactId>
+	</exclusion>
+	<exclusion>
+	  <groupId>com.sun.jmx</groupId>
+	  <artifactId>jmxri</artifactId>
+	</exclusion>
+	<exclusion>
+	  <groupId>javax.jms</groupId>
+	  <artifactId>jms</artifactId>
+	</exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>javaee-api</artifactId>
+      <version>5.0-1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
\ No newline at end of file

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java Sun Dec  6 00:59:45 2009
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.superbiz.quartz;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.apache.log4j.Logger;
+
+import javax.ejb.ActivationConfigProperty;
+import javax.ejb.MessageDriven;
+
+@MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "cronExpression", propertyValue = "* * * * * ?")})
+public class QuartzMdb implements Job {
+
+    private Logger logger = Logger.getLogger(getClass());
+
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        System.out.println("Executing Job");
+    }
+}

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml Sun Dec  6 00:59:45 2009
@@ -0,0 +1 @@
+<ejb-jar/>
\ No newline at end of file

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java Sun Dec  6 00:59:45 2009
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.superbiz.quartz;
+
+import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+public class QuartzMdbTest extends TestCase {
+
+    public void test() throws Exception {
+
+        Properties properties = new Properties();
+        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
+
+        InitialContext initialContext = new InitialContext(properties);
+
+        // Sleep five seconds and give quartz a chance to execute our MDB
+        Thread.sleep(5000);
+    }
+
+
+}

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml Sun Dec  6 00:59:45 2009
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.superbiz.quartz</groupId>
+    <artifactId>quartz-app</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>quartz-ra</artifactId>
+  <packaging>jar</packaging>
+  <name>Quartz Resource Adapter</name>
+
+  <description>
+  Maven doesn't allow rar files in the test classpath for some reason,
+  so we have to pull this trick to get it in the classpath.
+  </description>
+
+  <dependencies>
+    <dependency>
+      <groupId>quartz</groupId>
+      <artifactId>quartz</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+    </dependency>
+  </dependencies>
+
+</project>
\ No newline at end of file

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml Sun Dec  6 00:59:45 2009
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+  -->
+<connector xmlns="http://java.sun.com/xml/ns/j2ee"
+	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+           http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
+	   version="1.5">
+
+   <description>Quartz ResourceAdapter</description>
+   <display-name>Quartz ResourceAdapter</display-name>
+
+   <vendor-name>Apache.org</vendor-name>
+   <eis-type>Quartz Adapter</eis-type>
+   <resourceadapter-version>1.0</resourceadapter-version>
+
+   <resourceadapter>
+      <resourceadapter-class>org.apache.openejb.resource.quartz.QuartzResourceAdapter</resourceadapter-class>
+
+      <inbound-resourceadapter>
+         <messageadapter>
+            <messagelistener>
+               <messagelistener-type>org.quartz.Job</messagelistener-type>
+               <activationspec>
+                  <activationspec-class>org.apache.openejb.resource.quartz.JobSpec</activationspec-class>
+               </activationspec>
+            </messagelistener>
+         </messageadapter>
+      </inbound-resourceadapter>
+
+   </resourceadapter>
+</connector>

Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml
------------------------------------------------------------------------------
    svn:eol-style = native