You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/05/21 16:04:43 UTC

svn commit: r1484813 - in /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer: EjbTimerServiceImpl.java quartz/ quartz/PatchedStdJDBCDelegate.java quartz/QuartzObjectInputStream.java

Author: rmannibucau
Date: Tue May 21 14:04:42 2013
New Revision: 1484813

URL: http://svn.apache.org/r1484813
Log:
TOMEE-944 replacing StdJDBCDelegate by PatchedStdJDBCDelegate to use a correct loader

Added:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/PatchedStdJDBCDelegate.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/QuartzObjectInputStream.java
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?rev=1484813&r1=1484812&r2=1484813&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java Tue May 21 14:04:42 2013
@@ -22,6 +22,7 @@ import org.apache.openejb.OpenEJBExcepti
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.RpcContainer;
 import org.apache.openejb.core.BaseContext;
+import org.apache.openejb.core.timer.quartz.PatchedStdJDBCDelegate;
 import org.apache.openejb.core.transaction.TransactionType;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.monitoring.LocalMBeanServer;
@@ -38,6 +39,7 @@ import org.quartz.SchedulerException;
 import org.quartz.Trigger;
 import org.quartz.TriggerKey;
 import org.quartz.impl.StdSchedulerFactory;
+import org.quartz.impl.jdbcjobstore.StdJDBCDelegate;
 import org.quartz.impl.triggers.AbstractTrigger;
 import org.quartz.listeners.SchedulerListenerSupport;
 import org.quartz.simpl.RAMJobStore;
@@ -239,6 +241,13 @@ public class EjbTimerServiceImpl impleme
             }
         }
 
+        final String driverDelegate = properties.getProperty("org.quartz.jobStore.driverDelegateClass");
+        if (driverDelegate != null && StdJDBCDelegate.class.getName().equals(driverDelegate)) {
+            properties.put("org.quartz.jobStore.driverDelegateClass", PatchedStdJDBCDelegate.class.getName());
+        } else if (driverDelegate != null) {
+            log.info("You use " + driverDelegate + " driver delegate with quartz, ensure it doesn't use ObjectInputStream otherwise your custom TimerData can induce some issues");
+        }
+
         // adding our custom persister
         if (properties.containsKey("org.quartz.jobStore.class") && !properties.containsKey("org.quartz.jobStore.driverDelegateInitString")) {
             properties.put("org.quartz.jobStore.driverDelegateInitString",

Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/PatchedStdJDBCDelegate.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/PatchedStdJDBCDelegate.java?rev=1484813&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/PatchedStdJDBCDelegate.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/PatchedStdJDBCDelegate.java Tue May 21 14:04:42 2013
@@ -0,0 +1,67 @@
+/*
+ * 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.core.timer.quartz;
+
+import org.quartz.impl.jdbcjobstore.StdJDBCDelegate;
+import org.quartz.spi.ClassLoadHelper;
+import org.slf4j.Logger;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.sql.Blob;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class PatchedStdJDBCDelegate extends StdJDBCDelegate {
+    public PatchedStdJDBCDelegate(final Logger logger, final String tablePrefix, final String schedName, final String instanceId, final ClassLoadHelper classLoadHelper) {
+        super(logger, tablePrefix, schedName, instanceId, classLoadHelper);
+    }
+
+    public PatchedStdJDBCDelegate(final Logger logger, final String tablePrefix, final String schedName, final String instanceId, final ClassLoadHelper classLoadHelper, final Boolean useProperties) {
+        super(logger, tablePrefix, schedName, instanceId, classLoadHelper, useProperties);
+    }
+
+    @Override
+    protected Object getObjectFromBlob(final ResultSet rs, final String colName)
+            throws ClassNotFoundException, IOException, SQLException {
+        Object obj = null;
+
+        Blob blobLocator = rs.getBlob(colName);
+        if (blobLocator != null && blobLocator.length() != 0) {
+            InputStream binaryInput = blobLocator.getBinaryStream();
+
+            if (null != binaryInput) {
+                if (binaryInput instanceof ByteArrayInputStream
+                        && ((ByteArrayInputStream) binaryInput).available() == 0 ) {
+                    //do nothing
+                } else {
+                    ObjectInputStream in = new QuartzObjectInputStream(binaryInput, classLoadHelper);
+                    try {
+                        obj = in.readObject();
+                    } finally {
+                        in.close();
+                    }
+                }
+            }
+
+        }
+        return obj;
+    }
+}
+

Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/QuartzObjectInputStream.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/QuartzObjectInputStream.java?rev=1484813&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/QuartzObjectInputStream.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/quartz/QuartzObjectInputStream.java Tue May 21 14:04:42 2013
@@ -0,0 +1,38 @@
+/*
+ * 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.core.timer.quartz;
+
+import org.quartz.spi.ClassLoadHelper;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+
+public class QuartzObjectInputStream extends ObjectInputStream {
+    private final ClassLoadHelper loader;
+
+    public QuartzObjectInputStream(final InputStream binaryInput, final ClassLoadHelper classLoadHelper) throws IOException {
+        super(binaryInput);
+        this.loader = classLoadHelper;
+    }
+
+    @Override
+    protected Class<?> resolveClass(final ObjectStreamClass desc) throws ClassNotFoundException, IOException {
+        return loader.loadClass(desc.getName());
+    }
+}