You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by am...@apache.org on 2006/06/12 02:03:24 UTC
svn commit: r413549 - in /geronimo/sandbox/plugins: ./ quartz-deployer/
quartz-deployer/branches/ quartz-deployer/tags/ quartz-deployer/trunk/
quartz-deployer/trunk/src/ quartz-deployer/trunk/src/conf/
quartz-deployer/trunk/src/java/ quartz-deployer/tr...
Author: ammulder
Date: Sun Jun 11 17:03:22 2006
New Revision: 413549
URL: http://svn.apache.org/viewvc?rev=413549&view=rev
Log:
Add initial Quartz plugins
Added:
geronimo/sandbox/plugins/
geronimo/sandbox/plugins/quartz-deployer/
geronimo/sandbox/plugins/quartz-deployer/branches/
geronimo/sandbox/plugins/quartz-deployer/tags/
geronimo/sandbox/plugins/quartz-deployer/trunk/
geronimo/sandbox/plugins/quartz-deployer/trunk/pom.xml
geronimo/sandbox/plugins/quartz-deployer/trunk/src/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/geronimo-plugin.xml
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/QuartzJobDeployer.java
geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/geronimo-service.xml
geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/geronimo-quartz-0.1.xsd
geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/xmlconfig.xml
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/geronimo-quartz.xml
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/
geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/TestJob.java
geronimo/sandbox/plugins/quartz-scheduler/
geronimo/sandbox/plugins/quartz-scheduler/branches/
geronimo/sandbox/plugins/quartz-scheduler/tags/
geronimo/sandbox/plugins/quartz-scheduler/trunk/
geronimo/sandbox/plugins/quartz-scheduler/trunk/pom.xml
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/geronimo-plugin.xml
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJob.java
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJobGBean.java
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzScheduler.java
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzSchedulerGBean.java
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzThreadPool.java
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/
geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/geronimo-service.xml
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/pom.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/pom.xml (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/pom.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,120 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-deployer</artifactId>
+ <version>0.1</version>
+ <name>Geronimo Quartz Deployer</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>xmlbeans-maven-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>xmlbeans</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <download>true</download>
+ <sourceSchemas>geronimo-quartz-0.1.xsd</sourceSchemas>
+ <schemaDirectory>src/schema</schemaDirectory>
+ <xmlConfigs>
+ <xmlConfig implementation="java.io.File">src/schema/xmlconfig.xml</xmlConfig>
+ </xmlConfigs>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>src/java</sourceDirectory>
+ <testSourceDirectory>src/test</testSourceDirectory>
+ <resources>
+ <resource>
+ <directory>src/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>src/test-resources</directory>
+ </testResource>
+ </testResources>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-scheduler</artifactId>
+ <version>0.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>xmlbeans</groupId>
+ <artifactId>xbean</artifactId>
+ <version>2.0.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax-api</artifactId>
+ <version>1.0</version>
+ </dependency>
+
+ <!-- XMLBeans complains about these two JARs, but they're not in the repo,
+ and the XMLBeans code generation worked OK. What's with that?
+ <dependency>
+ <groupId>xmlbeans</groupId>
+ <artifactId>xmlbeans-jsr173-api</artifactId>
+ <version>2.0-dev</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax</artifactId>
+ <version>1.1.1</version>
+ <scope>provided</scope>
+ </dependency>
+ -->
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-kernel</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-deployment</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-service-builder</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-common</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>opensymphony</groupId>
+ <artifactId>quartz</artifactId>
+ <version>1.5.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/geronimo-plugin.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/geronimo-plugin.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/geronimo-plugin.xml (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/conf/geronimo-plugin.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<geronimo-plugin xmlns="http://geronimo.apache.org/xml/ns/plugins-1.1">
+ <name>Quartz Job Deployer</name>
+ <module-id>gplugins/quartz-deployer/0.1/car</module-id>
+ <category>Scheduling</category>
+ <description>This plugin lets you deploy Quartz jobs as Geronimo
+modules. In other words, you can create a JAR containing the job
+classes, with a Geronimo deployment plan providing the module ID,
+classpath, and execution schedule for the job. Then you can pack
+that plan in the JAR at META-INF/geronimo-quartz.xml or you can
+keep it outside the JAR.
+
+When you've done this, you can use the normal Geronimo deployment
+tools to deploy, start, stop, and undeploy Quartz jobs. That
+includes the command-line deploy tool, the console, the Maven
+deployment plugin, etc. So for example, "java -jar bin/deployer.jar
+deploy my-job.jar" would schedule a job, while "java -jar
+bin/deployer.jar stop MyJob" would suspend it.
+
+This plugin depends on the quartz-scheduler plugin that integrates
+the Quartz scheduler into Geronimo. There's a separate plugin
+available that allows you to manage the Quartz scheduler and jobs
+with the Geronimo admin console.</description>
+ <url>http://geronimo.apache.org/</url>
+ <author>The Apache Geronimo development team</author>
+ <license osi-approved="true">BSD -- Apache Software License (ASL) 2.0</license>
+ <geronimo-version>1.1-SNAPSHOT</geronimo-version>
+ <dependency>geronimo/geronimo-gbean-deployer//car</dependency>
+ <dependency>gplugins/quartz-scheduler//car</dependency>
+ <obsoletes>gplugins/quartz-deployer//car</obsoletes>
+ <source-repository>http://geronimoplugins.com/repository/geronimo-1.1/</source-repository>
+ <source-repository>http://www.ibiblio.org/maven2/</source-repository>
+ <config-xml-content>
+ <gbean name="QuartzDeployer" xmlns="http://geronimo.apache.org/xml/ns/attributes-1.1">
+ <attribute name="schedulerName">?name=QuartzScheduler</attribute>
+ </gbean>
+ </config-xml-content>
+</geronimo-plugin>
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/QuartzJobDeployer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/QuartzJobDeployer.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/QuartzJobDeployer.java (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/java/org/gplugins/quartz/deployment/QuartzJobDeployer.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,257 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz.deployment;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.jar.JarFile;
+import javax.xml.namespace.QName;
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.ConfigurationBuilder;
+import org.apache.geronimo.deployment.DeploymentContext;
+import org.apache.geronimo.deployment.ModuleIDBuilder;
+import org.apache.geronimo.deployment.service.EnvironmentBuilder;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
+import org.apache.geronimo.deployment.xbeans.ArtifactType;
+import org.apache.geronimo.deployment.xbeans.EnvironmentType;
+import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.Naming;
+import org.apache.geronimo.kernel.config.ConfigurationAlreadyExistsException;
+import org.apache.geronimo.kernel.config.ConfigurationManager;
+import org.apache.geronimo.kernel.config.ConfigurationModuleType;
+import org.apache.geronimo.kernel.config.ConfigurationStore;
+import org.apache.geronimo.kernel.config.ConfigurationUtil;
+import org.apache.geronimo.kernel.config.SimpleConfigurationManager;
+import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.ArtifactResolver;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+import org.gplugins.quartz.QuartzJobGBean;
+import org.gplugins.quartz.deployment.xbeans.JobType;
+import org.gplugins.quartz.deployment.xbeans.JobsDocument;
+import org.gplugins.quartz.deployment.xbeans.JobsType;
+
+/**
+ * Deploys Quartz jobs at runtime
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public class QuartzJobDeployer implements ConfigurationBuilder {
+ private static final QName SERVICE_QNAME = JobsDocument.type.getDocumentElementName();
+
+ private final Environment defaultEnvironment;
+ private final Collection repositories;
+ private final Naming naming;
+ private final ConfigurationManager configurationManager;
+ private final AbstractNameQuery schedulerName;
+
+ public QuartzJobDeployer(Environment defaultEnvironment, Collection repositories, AbstractNameQuery schedulerName, Kernel kernel) {
+ this.defaultEnvironment = defaultEnvironment;
+ this.repositories = repositories;
+ this.schedulerName = schedulerName;
+ naming = kernel.getNaming();
+ configurationManager = ConfigurationUtil.getConfigurationManager(kernel);
+ }
+
+ public Object getDeploymentPlan(File planFile, JarFile jarFile, ModuleIDBuilder idBuilder) throws DeploymentException {
+ if (planFile == null && jarFile == null) {
+ return null;
+ }
+
+ try {
+ XmlObject xmlObject;
+ if (planFile != null) {
+ xmlObject = XmlBeansUtil.parse(planFile.toURL());
+ } else {
+ URL path = DeploymentUtil.createJarURL(jarFile, "META-INF/geronimo-quartz.xml");
+ try {
+ xmlObject = XmlBeansUtil.parse(path);
+ } catch (FileNotFoundException e) {
+ // It has a JAR but no plan, and nothing at META-INF/geronimo-quartz.xml,
+ // therefore it's not a quartz job deployment
+ return null;
+ }
+ }
+ if (xmlObject == null) {
+ return null;
+ }
+
+ XmlCursor cursor = xmlObject.newCursor();
+ try {
+ cursor.toFirstChild();
+ if (!SERVICE_QNAME.equals(cursor.getName())) {
+ return null;
+ }
+ } finally {
+ cursor.dispose();
+ }
+ JobsDocument moduleDoc;
+ if (xmlObject instanceof JobsDocument) {
+ moduleDoc = (JobsDocument) xmlObject;
+ } else {
+ moduleDoc = (JobsDocument) xmlObject.changeType(JobsDocument.type);
+ }
+ Collection errors = new ArrayList();
+ if (!moduleDoc.validate(XmlBeansUtil.createXmlOptions(errors))) {
+ throw new DeploymentException("Invalid deployment descriptor: " + errors + "\nDescriptor: " + moduleDoc.toString());
+ }
+ // If there's no artifact ID and we won't be able to figure one out later, use the plan file name. Bit of a hack.
+ if (jarFile == null && (moduleDoc.getJobs().getEnvironment() == null ||
+ moduleDoc.getJobs().getEnvironment().getModuleId() == null ||
+ moduleDoc.getJobs().getEnvironment().getModuleId().getArtifactId() == null)) {
+ if (moduleDoc.getJobs().getEnvironment() == null) {
+ moduleDoc.getJobs().addNewEnvironment();
+ }
+ if (moduleDoc.getJobs().getEnvironment().getModuleId() == null) {
+ moduleDoc.getJobs().getEnvironment().addNewModuleId();
+ }
+ String name = planFile.getName();
+ int pos = name.lastIndexOf('.');
+ if (pos > -1) {
+ name = name.substring(0, pos);
+ }
+ moduleDoc.getJobs().getEnvironment().getModuleId().setArtifactId(name);
+ }
+ return moduleDoc.getJobs();
+ } catch (XmlException e) {
+ throw new DeploymentException("Could not parse xml in plan", e);
+ } catch (IOException e) {
+ throw new DeploymentException("no plan at " + planFile, e);
+ }
+ }
+
+ public Artifact getConfigurationID(Object plan, JarFile module, ModuleIDBuilder idBuilder) throws IOException, DeploymentException {
+ JobsType configType = (JobsType) plan;
+ EnvironmentType environmentType = configType.getEnvironment();
+ Environment environment = EnvironmentBuilder.buildEnvironment(environmentType, defaultEnvironment);
+ idBuilder.resolve(environment, module == null ? "" : new File(module.getName()).getName(), "car");
+ if(!environment.getConfigId().isResolved()) {
+ throw new IllegalStateException("Module ID is not fully populated ("+environment.getConfigId()+")");
+ }
+ return environment.getConfigId();
+ }
+
+ public DeploymentContext buildConfiguration(boolean inPlaceDeployment, Artifact configId, Object plan, JarFile jar, Collection configurationStores, ArtifactResolver artifactResolver, ConfigurationStore targetConfigurationStore) throws IOException, DeploymentException {
+ JobsType configType = (JobsType) plan;
+
+ return buildConfiguration(inPlaceDeployment, configId, configType, jar, configurationStores, artifactResolver, targetConfigurationStore);
+ }
+
+ public DeploymentContext buildConfiguration(boolean inPlaceDeployment, Artifact configId, JobsType moduleType, JarFile jar, Collection configurationStores, ArtifactResolver artifactResolver, ConfigurationStore targetConfigurationStore) throws DeploymentException, IOException {
+ ArtifactType type = moduleType.getEnvironment().isSetModuleId() ? moduleType.getEnvironment().getModuleId() : moduleType.getEnvironment().addNewModuleId();
+ type.setArtifactId(configId.getArtifactId());
+ type.setGroupId(configId.getGroupId());
+ type.setType(configId.getType());
+ type.setVersion(configId.getVersion().toString());
+ Environment environment = EnvironmentBuilder.buildEnvironment(moduleType.getEnvironment(), defaultEnvironment);
+ if(!environment.getConfigId().isResolved()) {
+ throw new IllegalStateException("Module ID should be fully resolved by now (not "+environment.getConfigId()+")");
+ }
+ File outfile;
+ try {
+ outfile = targetConfigurationStore.createNewConfigurationDir(configId);
+ } catch (ConfigurationAlreadyExistsException e) {
+ throw new DeploymentException(e);
+ }
+
+ ConfigurationManager configurationManager = this.configurationManager;
+ if (configurationManager == null) {
+ configurationManager = new SimpleConfigurationManager(configurationStores, artifactResolver, repositories);
+ }
+ DeploymentContext context = new DeploymentContext(outfile,
+ inPlaceDeployment && null != jar ? DeploymentUtil.toFile(jar) : null,
+ environment,
+ ConfigurationModuleType.SERVICE,
+ naming,
+ configurationManager,
+ repositories
+ );
+ if(jar != null) {
+ File file = new File(jar.getName());
+ context.addIncludeAsPackedJar(URI.create(file.getName()), jar);
+ }
+ try {
+ ClassLoader cl = context.getClassLoader();
+
+
+ AbstractName moduleName = naming.createRootName(configId, configId.toString(), "ServiceModule");
+
+ addJobs(moduleType.getJobArray(), cl, moduleName, context);
+ return context;
+ } catch (RuntimeException t) {
+ context.close();
+ throw t;
+ } catch (Error e) {
+ context.close();
+ throw e;
+ }
+ }
+
+ private void addJobs(JobType[] jobs, ClassLoader cl, AbstractName moduleName, DeploymentContext context) throws DeploymentException {
+ for (int i = 0; i < jobs.length; i++) {
+ JobType job = jobs[i];
+ GBeanInfo gBeanInfo = GBeanInfo.getGBeanInfo(QuartzJobGBean.class.getName(), cl);
+ String namePart = job.getJobName();
+ AbstractName abstractName = context.getNaming().createChildName(moduleName, namePart, "GBean");
+ GBeanData data = new GBeanData(abstractName, gBeanInfo);
+ data.setReferencePattern("QuartzScheduler", schedulerName);
+ data.setAttribute("name", job.getJobName());
+ data.setAttribute("jobClass", job.getJobClass());
+ data.setAttribute("cronExpression", job.getCronExpression());
+ try {
+ context.addGBean(data);
+ } catch (GBeanAlreadyExistsException e) {
+ throw new DeploymentException("Cannot add Quartz job '"+job.getJobName()+"' for module "+moduleName+"; a job with that name already exists.");
+ }
+ }
+ }
+
+ public static final GBeanInfo GBEAN_INFO;
+
+ static {
+ GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Quartz Deployer", QuartzJobDeployer.class, "ConfigBuilder");
+
+ infoFactory.addInterface(ConfigurationBuilder.class);
+
+ infoFactory.addAttribute("defaultEnvironment", Environment.class, true);
+ infoFactory.addAttribute("schedulerName", AbstractNameQuery.class, true, true);
+ infoFactory.addAttribute("kernel", Kernel.class, false, false);
+ infoFactory.addReference("Repository", Repository.class, "Repository");
+
+ infoFactory.setConstructor(new String[]{"defaultEnvironment", "Repository", "schedulerName", "kernel"});
+
+ GBEAN_INFO = infoFactory.getBeanInfo();
+ }
+
+ public static GBeanInfo getGBeanInfo() {
+ return GBEAN_INFO;
+ }
+}
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/geronimo-service.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/geronimo-service.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/geronimo-service.xml (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/resources/META-INF/geronimo-service.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1">
+ <environment>
+ <moduleId>
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-deployer</artifactId>
+ <version>0.1</version>
+ <type>car</type>
+ </moduleId>
+ <dependencies>
+ <dependency>
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-scheduler</artifactId>
+ <version>0.1</version>
+ <type>car</type>
+ </dependency>
+
+ <dependency>
+ <groupId>geronimo</groupId>
+ <artifactId>geronimo-gbean-deployer</artifactId>
+ <type>car</type>
+ </dependency>
+ </dependencies>
+ </environment>
+ <gbean name="QuartzDeployer" class="org.gplugins.quartz.deployment.QuartzJobDeployer">
+ <reference name="Repository"/>
+ <attribute name="schedulerName">?name=QuartzScheduler</attribute>
+ <xml-attribute name="defaultEnvironment">
+ <environment>
+ <dependencies>
+ <dependency>
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-scheduler</artifactId>
+ <type>car</type>
+ </dependency>
+ </dependencies>
+ </environment>
+ </xml-attribute>
+ </gbean>
+</module>
\ No newline at end of file
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/geronimo-quartz-0.1.xsd
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/geronimo-quartz-0.1.xsd?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/geronimo-quartz-0.1.xsd (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/geronimo-quartz-0.1.xsd Sun Jun 11 17:03:22 2006
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed 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.
+-->
+
+<xs:schema
+ targetNamespace="http://geronimo.apache.org/xml/ns/plugins/quartz-0.1"
+ xmlns:job="http://geronimo.apache.org/xml/ns/plugins/quartz-0.1"
+ xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ >
+
+ <xs:annotation>
+ <xs:documentation>
+ Schema for a Quartz scheduled job.
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://geronimo.apache.org/xml/ns/deployment-1.1" schemaLocation="geronimo-module-1.1.xsd"/>
+
+ <!-- Top-level elements -->
+
+ <xs:element name="jobs" type="job:jobsType">
+ <xs:annotation>
+ <xs:documentation>
+ A list of jobs to schedule with Quartz
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="jobsType">
+ <xs:sequence>
+ <xs:element ref="sys:environment"/>
+ <xs:element name="job" type="job:jobType" minOccurs="1" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>
+ A job to schedule with Quartz
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="jobType">
+ <xs:sequence>
+ <xs:element name="job-name" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ A unique name used to identify the Quartz job
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="job-class" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ The fully-qualified class name of the Quartz job
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:choice>
+ <xs:element name="cron-expression" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ A CRON-formatted expression for when the job should run
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
+
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/xmlconfig.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/xmlconfig.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/xmlconfig.xml (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/schema/xmlconfig.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,7 @@
+<xb:config xmlns:xb="http://www.bea.com/2002/09/xbean/config">
+
+ <xb:namespace uri="http://geronimo.apache.org/xml/ns/plugins/quartz-0.1">
+ <xb:package>org.gplugins.quartz.deployment.xbeans</xb:package>
+ </xb:namespace>
+
+</xb:config>
\ No newline at end of file
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/geronimo-quartz.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/geronimo-quartz.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/geronimo-quartz.xml (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/test-resources/META-INF/geronimo-quartz.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jobs xmlns="http://geronimo.apache.org/xml/ns/plugins/quartz-0.1">
+ <environment xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1">
+ <moduleId>
+ <artifactId>TestJob</artifactId>
+ </moduleId>
+ </environment>
+ <job>
+ <job-name>Test 1</job-name>
+ <job-class>org.gplugins.quartz.jobs.TestJob</job-class>
+ <cron-expression>0/15 * * * * ?</cron-expression>
+ </job>
+</jobs>
\ No newline at end of file
Added: geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/TestJob.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/TestJob.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/TestJob.java (added)
+++ geronimo/sandbox/plugins/quartz-deployer/trunk/src/test/org/gplugins/quartz/jobs/TestJob.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,35 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz.jobs;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+/**
+ * A sample Quartz job
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public class TestJob implements Job {
+ private final SimpleDateFormat sdf = new SimpleDateFormat("EEEE HH:mm:ss");
+
+ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+ System.out.println("TEST JOB RUNNING at "+sdf.format(new Date()));
+ }
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/pom.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/pom.xml (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/pom.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,68 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-scheduler</artifactId>
+ <version>0.1</version>
+ <name>Quartz Scheduler for Geronimo</name>
+ <build>
+ <sourceDirectory>src/java</sourceDirectory>
+ <testSourceDirectory>src/test</testSourceDirectory>
+ <resources>
+ <resource>
+ <directory>src/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>src/test-resources</directory>
+ </testResource>
+ </testResources>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-kernel</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-deployment</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.modules</groupId>
+ <artifactId>geronimo-system</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>mx4j</groupId>
+ <artifactId>mx4j</artifactId>
+ <version>3.0.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>opensymphony</groupId>
+ <artifactId>quartz</artifactId>
+ <version>1.5.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.0.4</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/geronimo-plugin.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/geronimo-plugin.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/geronimo-plugin.xml (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/conf/geronimo-plugin.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<geronimo-plugin xmlns="http://geronimo.apache.org/xml/ns/plugins-1.1">
+ <name>Quartz Scheduler Integration</name>
+ <module-id>gplugins/quartz-scheduler/0.1/car</module-id>
+ <category>Scheduling</category>
+ <description>This plugin adds a Quartz scheduler to Geronimo. It provides
+Geronimo components representing the scheduler and scheduled jobs, which
+can be used by other applications as well as other Geronimo modules.
+
+To use the scheduler from an application, add a gbean-ref to the Geronimo
+deployment plan for the application with ref-type org.gplugins.quartz.QuartzScheduler
+and pattern/name QuartzScheduler. From the QuartzScheduler, you can schedule
+and delete jobs, pause and resume, inspect and edit individual jobs, etc.
+
+Note there are related plugins allowing you to deploy Quartz jobs as a JAR
+with XML plan defining the job schdule, and allowing you to manage the
+Quartz scheduler and jobs with the Geronimo admin console.</description>
+ <url>http://geronimo.apache.org/</url>
+ <author>The Apache Geronimo development team</author>
+ <license osi-approved="true">BSD -- Apache Software License (ASL) 2.0</license>
+ <geronimo-version>1.1-SNAPSHOT</geronimo-version>
+ <dependency>geronimo/rmi-naming//car</dependency>
+ <dependency>opensymphony/quartz//jar</dependency>
+ <obsoletes>gplugins/quartz-scheduler//car</obsoletes>
+ <source-repository>http://geronimoplugins.com/repository/geronimo-1.1/</source-repository>
+ <source-repository>http://www.ibiblio.org/maven2/</source-repository>
+ <config-xml-content>
+ <gbean name="QuartzScheduler" xmlns="http://geronimo.apache.org/xml/ns/attributes-1.1">
+ <reference name="ThreadPool">
+ <pattern>
+ <name>DefaultThreadPool</name>
+ </pattern>
+ </reference>
+ </gbean>
+ </config-xml-content>
+</geronimo-plugin>
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJob.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJob.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJob.java (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJob.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,43 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz;
+
+import org.quartz.SchedulerException;
+
+/**
+ * Management interface for a Quartz schedule job
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public interface QuartzJob {
+ String getCronExpression();
+
+ void setCronExpression(String cronExpression) throws SchedulerException;
+
+ String getJobClass();
+
+ void setJobClass(String jobClass);
+
+ String getName();
+
+ void setName(String name);
+
+ void pause() throws SchedulerException;
+
+ void resume() throws SchedulerException;
+
+ void execute() throws SchedulerException;
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJobGBean.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJobGBean.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJobGBean.java (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzJobGBean.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,140 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz;
+
+import java.text.ParseException;
+import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.quartz.JobDetail;
+import org.quartz.CronTrigger;
+import org.quartz.SchedulerException;
+
+/**
+ * Represents a Quartz job.
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public class QuartzJobGBean implements GBeanLifecycle, QuartzJob {
+ private final static Log log = LogFactory.getLog(QuartzJobGBean.class);
+ private final QuartzScheduler scheduler;
+ private final ClassLoader loader;
+ private String name;
+ private String jobClass;
+ private String cronExpression;
+ boolean running;
+
+ public QuartzJobGBean(QuartzScheduler scheduler, String jobClass, String name, ClassLoader loader) {
+ this.jobClass = jobClass;
+ this.name = name;
+ this.scheduler = scheduler;
+ this.loader = loader;
+ }
+
+ public String getCronExpression() {
+ return cronExpression;
+ }
+
+ public void setCronExpression(String cronExpression) throws SchedulerException {
+ this.cronExpression = cronExpression;
+ if(running) {
+ try {
+ scheduler.rescheduleJob(name, createTrigger());
+ } catch (ParseException e) {
+ throw new SchedulerException("Unable to schedule; invalid cron expression '"+cronExpression+"'", e);
+ }
+ }
+ }
+
+ public String getJobClass() {
+ return jobClass;
+ }
+
+ public void setJobClass(String jobClass) {
+ this.jobClass = jobClass;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void pause() throws SchedulerException {
+ if(running) {
+ scheduler.pauseJob(name);
+ }
+ }
+
+ public void resume() throws SchedulerException {
+ if(running) {
+ scheduler.resumeJob(name);
+ }
+ }
+
+ public void execute() throws SchedulerException {
+ if(running) {
+ scheduler.executeImmediately(name);
+ }
+ }
+
+ public void doStart() throws Exception {
+ log.info("Scheduling job '"+name+"'");
+ Class cls = loader.loadClass(jobClass);
+ JobDetail jd = new JobDetail(name, QuartzSchedulerGBean.GROUP_NAME, cls);
+ CronTrigger cronTrigger = createTrigger();
+ scheduler.scheduleJob(jd, cronTrigger);
+ running = true;
+ }
+
+ public void doStop() throws Exception {
+ running = false;
+ scheduler.deleteJob(name);
+ }
+
+ public void doFail() {
+ running = false;
+ }
+
+ private CronTrigger createTrigger() throws ParseException {
+ CronTrigger cronTrigger = new CronTrigger(name+" Trigger", QuartzSchedulerGBean.GROUP_NAME);
+ cronTrigger.setCronExpression(cronExpression);
+ return cronTrigger;
+ }
+
+ public static final GBeanInfo GBEAN_INFO;
+
+ static {
+ GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Quartz Job", QuartzJobGBean.class);
+ infoFactory.addAttribute("classLoader", ClassLoader.class, false);
+ infoFactory.addReference("QuartzScheduler", QuartzScheduler.class, "GBean");
+ infoFactory.addInterface(QuartzJob.class, new String[]{"cronExpression", "jobClass","name"},
+ new String[]{"cronExpression", "jobClass","name"});
+
+ infoFactory.setConstructor(new String[]{"QuartzScheduler", "jobClass", "name", "classLoader"});
+
+ GBEAN_INFO = infoFactory.getBeanInfo();
+ }
+
+ public static GBeanInfo getGBeanInfo() {
+ return GBEAN_INFO;
+ }
+
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzScheduler.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzScheduler.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzScheduler.java (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzScheduler.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,74 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz;
+
+import java.util.Map;
+import org.quartz.JobDetail;
+import org.quartz.Trigger;
+import org.quartz.SchedulerException;
+
+/**
+ * Management interface for the Quartz scheduler
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public interface QuartzScheduler {
+ /**
+ * Schedules a Quartz job.
+ *
+ * Note that any jobs scheduled through this mechanism must have the group
+ * name "Geronimo Quartz". The scheduler will overwrite it to be that if
+ * necessary.
+ */
+ void scheduleJob(JobDetail detail, Trigger trigger) throws SchedulerException;
+
+ /**
+ * Deletes a scheduled job. Assumes the group "Geronimo Quartz".
+ */
+ void deleteJob(String jobName) throws SchedulerException;
+
+ /**
+ * Returns a Map with keys of type JobDetail and values of type Trigger
+ * for all jobs scheduled with group "Geronimo Quartz".
+ */
+ Map getScheduledJobs() throws SchedulerException;
+
+ /**
+ * Sets a new Trigger for an existing job (which must be in the group
+ * "Geronimo Quartz").
+ */
+ void rescheduleJob(String jobName, Trigger trigger) throws SchedulerException;
+
+ /**
+ * Pauses an existing job (which must be in the group "Geronimo Quartz".
+ */
+ void pauseJob(String jobName) throws SchedulerException;
+
+ /**
+ * Resumes an existing job (which must be in the group "Geronimo Quartz".
+ */
+ void resumeJob(String jobName) throws SchedulerException;
+
+ /**
+ * Triggers a job (in the "Geronimo Quartz" group) to start right away.
+ */
+ void executeImmediately(String jobName) throws SchedulerException;
+
+ /**
+ * Gets the job GBean for a job in the "Geronimo Quartz" group.
+ */
+ QuartzJob getJob(String jobName);
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzSchedulerGBean.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzSchedulerGBean.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzSchedulerGBean.java (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzSchedulerGBean.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,164 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz;
+
+import java.util.Properties;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+import java.util.Set;
+import java.io.InputStream;
+import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.system.threads.ThreadPool;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.JobDetail;
+import org.quartz.Trigger;
+import org.quartz.impl.StdSchedulerFactory;
+
+/**
+ * A GBean that starts and stops the Quartz scheduler.
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public class QuartzSchedulerGBean implements GBeanLifecycle, QuartzScheduler {
+ private final static Log log = LogFactory.getLog(QuartzSchedulerGBean.class);
+ final static String GROUP_NAME="Geronimo Quartz";
+ private final Kernel kernel;
+ private String threadPoolKey;
+ private Scheduler scheduler;
+
+ public QuartzSchedulerGBean(ThreadPool pool, Kernel kernel) {
+ this.kernel = kernel;
+ if(pool != null) {
+ threadPoolKey = QuartzThreadPool.addPool(pool);
+ }
+ }
+
+ public void scheduleJob(JobDetail detail, Trigger trigger) throws SchedulerException {
+ detail.setGroup(GROUP_NAME);
+ scheduler.scheduleJob(detail, trigger);
+ }
+
+ public void deleteJob(String jobName) throws SchedulerException {
+ scheduler.deleteJob(jobName, GROUP_NAME);
+ }
+
+ public Map getScheduledJobs() throws SchedulerException {
+ String[] names = scheduler.getJobNames(GROUP_NAME);
+ Map map = new HashMap();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ JobDetail detail = scheduler.getJobDetail(name, GROUP_NAME);
+ Trigger[] triggers = scheduler.getTriggersOfJob(name, GROUP_NAME);
+ if(triggers.length == 1) {
+ map.put(detail, triggers[0]);
+ } else {
+ map.put(detail, null);
+ }
+ }
+ return map;
+ }
+
+ public void rescheduleJob(String jobName, Trigger trigger) throws SchedulerException {
+ Trigger[] triggers = scheduler.getTriggersOfJob(jobName, GROUP_NAME);
+ for (int i = 0; i < triggers.length; i++) {
+ Trigger old = triggers[i];
+ scheduler.unscheduleJob(old.getName(), old.getGroup());
+ }
+ trigger.setJobName(jobName);
+ trigger.setJobGroup(GROUP_NAME);
+ scheduler.scheduleJob(trigger);
+ }
+
+ public void executeImmediately(String jobName) throws SchedulerException {
+ scheduler.triggerJob(jobName, GROUP_NAME);
+ }
+
+ public void pauseJob(String jobName) throws SchedulerException {
+ scheduler.pauseJob(jobName, GROUP_NAME);
+ }
+
+ public void resumeJob(String jobName) throws SchedulerException {
+ scheduler.resumeJob(jobName, GROUP_NAME);
+ }
+
+ public QuartzJob getJob(String jobName) {
+ Set results = kernel.listGBeans(new AbstractNameQuery(null, Collections.singletonMap("name", jobName), QuartzJob.class.getName()));
+ if(results.size() == 0) {
+ return null;
+ }
+ return (QuartzJob) kernel.getProxyManager().createProxy((AbstractName) results.iterator().next(), QuartzJob.class);
+ }
+
+ public void doStart() throws Exception {
+ StdSchedulerFactory factory = new StdSchedulerFactory();
+ if(threadPoolKey != null) {
+ Properties props = new Properties();
+ InputStream in = Scheduler.class.getResourceAsStream("quartz.properties");
+ props.load(in);
+ in.close();
+ for (Iterator it = props.keySet().iterator(); it.hasNext();) {
+ String key = (String) it.next();
+ if(key.startsWith("org.quartz.threadPool.")) {
+ log.info("Ignoring thread property '"+key+"'");
+ it.remove();
+ }
+ }
+ props.put("org.quartz.threadPool.class", "org.gplugins.quartz.QuartzThreadPool");
+ props.put("org.quartz.threadPool.poolID", threadPoolKey);
+ factory.initialize(props);
+ }
+ scheduler = factory.getScheduler();
+ scheduler.start();
+ }
+
+ public void doStop() throws Exception {
+ try {
+ scheduler.shutdown();
+ } catch (SchedulerException e) {
+ log.error("Quartz scheduler shutdown error", e);
+ }
+ }
+
+ public void doFail() {
+ }
+
+
+ public static final GBeanInfo GBEAN_INFO;
+
+ static {
+ GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Quartz Scheduler", QuartzSchedulerGBean.class);
+ infoFactory.addAttribute("kernel", Kernel.class, false, false);
+ infoFactory.addReference("ThreadPool", ThreadPool.class, "GBean");
+ infoFactory.addInterface(QuartzScheduler.class);
+ infoFactory.setConstructor(new String[]{"ThreadPool", "kernel"});
+ GBEAN_INFO = infoFactory.getBeanInfo();
+ }
+
+ public static GBeanInfo getGBeanInfo() {
+ return GBEAN_INFO;
+ }
+
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzThreadPool.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzThreadPool.java?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzThreadPool.java (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/java/org/gplugins/quartz/QuartzThreadPool.java Sun Jun 11 17:03:22 2006
@@ -0,0 +1,80 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.gplugins.quartz;
+
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.geronimo.system.threads.ThreadPool;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.quartz.SchedulerConfigException;
+
+
+/**
+ * A wrapper around a Geronimo thread pool for usage by Quartz.
+ *
+ * @version $Rev: 355877 $ $Date: 2005-12-10 21:48:27 -0500 (Sat, 10 Dec 2005) $
+ */
+public class QuartzThreadPool implements org.quartz.spi.ThreadPool {
+ private final static Log log = LogFactory.getLog(QuartzThreadPool.class);
+ static Map geronimoPools = new HashMap();
+
+ static String addPool(ThreadPool pool) {
+ synchronized(QuartzThreadPool.class) {
+ int count = geronimoPools.size();
+ String key = Integer.toString(count);
+ geronimoPools.put(key, pool);
+ return key;
+ }
+ }
+
+ private ThreadPool geronimoPool;
+ private String poolID;
+
+ public int getPoolSize() {
+ return geronimoPool.getPoolSize();
+ }
+
+ public void initialize() throws SchedulerConfigException {
+ log.info("Geronimo Quartz thread pool starting with Pool ID "+poolID);
+ geronimoPool = (ThreadPool) geronimoPools.get(poolID);
+ if(geronimoPool == null) {
+ throw new SchedulerConfigException("No Geronimo thread pool available ("+poolID+")!");
+ }
+ }
+
+ public boolean runInThread(Runnable runnable) {
+ try {
+ geronimoPool.execute("Quartz Scheduled Job", runnable);
+ } catch (InterruptedException e) {
+ log.error("Unable to complete schedule job", e);
+ return false;
+ }
+ return true;
+ }
+
+ public void shutdown(boolean b) {
+ geronimoPools.remove(poolID);
+ }
+
+ public String getPoolID() {
+ return poolID;
+ }
+
+ public void setPoolID(String poolID) {
+ this.poolID = poolID;
+ }
+}
Added: geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/geronimo-service.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/geronimo-service.xml?rev=413549&view=auto
==============================================================================
--- geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/geronimo-service.xml (added)
+++ geronimo/sandbox/plugins/quartz-scheduler/trunk/src/resources/META-INF/geronimo-service.xml Sun Jun 11 17:03:22 2006
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1">
+ <environment>
+ <moduleId>
+ <groupId>gplugins</groupId>
+ <artifactId>quartz-scheduler</artifactId>
+ <version>0.1</version>
+ <type>car</type>
+ </moduleId>
+ <dependencies>
+ <dependency>
+ <groupId>geronimo</groupId>
+ <artifactId>rmi-naming</artifactId>
+ <type>car</type>
+ </dependency>
+ <dependency>
+ <groupId>opensymphony</groupId>
+ <artifactId>quartz</artifactId>
+ <type>jar</type>
+ </dependency>
+ </dependencies>
+ </environment>
+ <gbean name="QuartzScheduler" class="org.gplugins.quartz.QuartzSchedulerGBean">
+ <reference name="ThreadPool">
+ <name>DefaultThreadPool</name>
+ </reference>
+ </gbean>
+</module>
\ No newline at end of file