You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/07/15 09:52:30 UTC

svn commit: r794169 - in /sling/trunk/bundles/extensions/event: ./ src/main/java/org/apache/sling/event/ src/main/java/org/apache/sling/event/impl/

Author: cziegeler
Date: Wed Jul 15 07:52:30 2009
New Revision: 794169

URL: http://svn.apache.org/viewvc?rev=794169&view=rev
Log:
SLING-1046 : Use commons class loader instead of dynamic import package *.

Modified:
    sling/trunk/bundles/extensions/event/pom.xml
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobBlockingQueue.java

Modified: sling/trunk/bundles/extensions/event/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/pom.xml?rev=794169&r1=794168&r2=794169&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/pom.xml (original)
+++ sling/trunk/bundles/extensions/event/pom.xml Wed Jul 15 07:52:30 2009
@@ -61,8 +61,6 @@
                             org.apache.sling.event.impl,
                             org.apache.jackrabbit.util
                         </Private-Package>
-                        <!-- We need the dynamic import as events can contain any classes -->
-                        <DynamicImport-Package>*</DynamicImport-Package>
                         <Sling-Nodetypes>
                             SLING-INF/nodetypes/event.cnd
                         </Sling-Nodetypes>
@@ -131,6 +129,11 @@
             <version>2.0.2-incubator</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.classloader</artifactId>
+            <version>0.9.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java?rev=794169&r1=794168&r2=794169&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java Wed Jul 15 07:52:30 2009
@@ -21,7 +21,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.ObjectInputStream;
+import java.io.InputStream;
 import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -612,4 +612,29 @@
         buffer.append("]");
         return buffer.toString();
     }
-}
+
+    /**
+     * This is an extended version of the object input stream which uses the
+     * thread context class loader.
+     */
+    private static class ObjectInputStream extends java.io.ObjectInputStream {
+
+        private ClassLoader classloader;
+
+        public ObjectInputStream(InputStream in) throws IOException {
+            super(in);
+            this.classloader = Thread.currentThread().getContextClassLoader();
+        }
+
+        /**
+         * @see java.io.ObjectInputStream#resolveClass(java.io.ObjectStreamClass)
+         */
+        @Override
+        protected Class<?> resolveClass(java.io.ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
+            if ( this.classloader != null ) {
+                return Class.forName(classDesc.getName(), true, this.classloader);
+            }
+            return super.resolveClass(classDesc);
+        }
+    }
+}
\ No newline at end of file

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java?rev=794169&r1=794168&r2=794169&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java Wed Jul 15 07:52:30 2009
@@ -29,6 +29,7 @@
 import javax.jcr.Session;
 import javax.jcr.observation.EventListener;
 
+import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.apache.sling.commons.osgi.OsgiUtil;
 import org.apache.sling.engine.SlingSettingsService;
 import org.apache.sling.event.EventPropertiesMap;
@@ -78,7 +79,7 @@
     protected String repositoryPath;
 
     /** Is the background task still running? */
-    protected boolean running;
+    protected volatile boolean running;
 
     /** A local queue for serialising the event processing. */
     protected final BlockingQueue<EventInfo> queue = new LinkedBlockingQueue<EventInfo>();
@@ -86,6 +87,9 @@
     /** A local queue for writing received events into the repository. */
     protected final BlockingQueue<Event> writeQueue = new LinkedBlockingQueue<Event>();
 
+    /** @scr.reference */
+    protected DynamicClassLoaderManager classLoaderManager;
+
     /**
      * Our thread pool.
      * @scr.reference */
@@ -288,20 +292,26 @@
      */
     protected Event readEvent(Node eventNode)
     throws RepositoryException, ClassNotFoundException {
-        final String topic = eventNode.getProperty(EventHelper.NODE_PROPERTY_TOPIC).getString();
-        final EventPropertiesMap eventProps = EventUtil.readProperties(eventNode,
-                EventHelper.NODE_PROPERTY_PROPERTIES,
-                IGNORE_PREFIXES);
-
-        eventProps.put(JobStatusProvider.PROPERTY_EVENT_ID, eventNode.getPath());
-        this.addEventProperties(eventNode, eventProps);
+        final ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
         try {
-            final Event event = new Event(topic, eventProps);
-            return event;
-        } catch (IllegalArgumentException iae) {
-            // this exception occurs if the topic is not correct (it should never happen,
-            // but you never know)
-            throw new RepositoryException("Unable to read event: " + iae.getMessage(), iae);
+            Thread.currentThread().setContextClassLoader(this.classLoaderManager.getDynamicClassLoader());
+            final String topic = eventNode.getProperty(EventHelper.NODE_PROPERTY_TOPIC).getString();
+            final EventPropertiesMap eventProps = EventUtil.readProperties(eventNode,
+                    EventHelper.NODE_PROPERTY_PROPERTIES,
+                    IGNORE_PREFIXES);
+
+            eventProps.put(JobStatusProvider.PROPERTY_EVENT_ID, eventNode.getPath());
+            this.addEventProperties(eventNode, eventProps);
+            try {
+                final Event event = new Event(topic, eventProps);
+                return event;
+            } catch (IllegalArgumentException iae) {
+                // this exception occurs if the topic is not correct (it should never happen,
+                // but you never know)
+                throw new RepositoryException("Unable to read event: " + iae.getMessage(), iae);
+            }
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCL);
         }
     }
 

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobBlockingQueue.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobBlockingQueue.java?rev=794169&r1=794168&r2=794169&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobBlockingQueue.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobBlockingQueue.java Wed Jul 15 07:52:30 2009
@@ -28,20 +28,20 @@
  */
 public final class JobBlockingQueue extends LinkedBlockingQueue<EventInfo> {
 
-    private EventInfo eventInfo;
+    private volatile EventInfo eventInfo;
 
     private final Object lock = new Object();
 
-    private boolean isWaiting = false;
+    private volatile boolean isWaiting = false;
 
-    private boolean markForCleanUp = false;
+    private volatile boolean markForCleanUp = false;
 
-    private boolean finished = false;
+    private volatile boolean finished = false;
 
-    private boolean isSleeping = false;
+    private volatile boolean isSleeping = false;
 
-    private String schedulerJobName;
-    private Thread sleepingThread;
+    private volatile String schedulerJobName;
+    private volatile Thread sleepingThread;
 
     public EventInfo waitForFinish() throws InterruptedException {
         this.isWaiting = true;