You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/12/28 19:08:29 UTC

svn commit: r607304 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map: EntityListenerFactory.java EntityResolver.java

Author: aadamchik
Date: Fri Dec 28 10:08:29 2007
New Revision: 607304

URL: http://svn.apache.org/viewvc?rev=607304&view=rev
Log:
CAY-949 Factory for lifecycle listeners

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityListenerFactory.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityListenerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityListenerFactory.java?rev=607304&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityListenerFactory.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityListenerFactory.java Fri Dec 28 10:08:29 2007
@@ -0,0 +1,39 @@
+/*****************************************************************
+ *   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.cayenne.map;
+
+/**
+ * A factory used to create entity listeners. By default listeners are created using a
+ * noop constructor on the listener class, however if a user needs to customize listener
+ * creation process (e.g. perform dependency injection, etc.), a custom factory can be
+ * installed on the EntityResolver. EntityListenerFactory also supposrt defining listener
+ * intrerfaces, not just classes).
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public interface EntityListenerFactory {
+
+    /**
+     * Creates an instance of entity listener of a given class. "entity" parameter denotes
+     * ObjEntity for which the listener is installed. It is null if this is a default
+     * listener.
+     */
+    <T> T createListener(Class<T> listenerClass, ObjEntity entity);
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java?rev=607304&r1=607303&r2=607304&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java Fri Dec 28 10:08:29 2007
@@ -79,6 +79,8 @@
     // callbacks are not serializable
     protected transient LifecycleCallbackRegistry callbackRegistry;
 
+    protected EntityListenerFactory entityListenerFactory;
+
     /**
      * Creates new EntityResolver.
      */
@@ -202,7 +204,7 @@
             for (DataMap map : maps) {
 
                 for (EntityListener listener : map.getDefaultEntityListeners()) {
-                    Object listenerInstance = createListener(listener);
+                    Object listenerInstance = createListener(listener, null);
 
                     CallbackDescriptor[] callbacks = listener
                             .getCallbackMap()
@@ -225,7 +227,7 @@
 
                 // external listeners go first, entity's own callbacks go next
                 for (EntityListener listener : entity.getEntityListeners()) {
-                    Object listenerInstance = createListener(listener);
+                    Object listenerInstance = createListener(listener, entity);
 
                     CallbackDescriptor[] callbacks = listener
                             .getCallbackMap()
@@ -262,7 +264,7 @@
     /**
      * Creates a listener instance.
      */
-    private Object createListener(EntityListener listener) {
+    private Object createListener(EntityListener listener, ObjEntity entity) {
         Class<?> listenerClass;
 
         try {
@@ -273,6 +275,10 @@
                     + listener.getClassName(), e);
         }
 
+        if (entityListenerFactory != null) {
+            return entityListenerFactory.createListener(listenerClass, entity);
+        }
+
         try {
             return listenerClass.newInstance();
         }
@@ -842,5 +848,17 @@
         }
 
         return classDescriptorMap;
+    }
+
+    /**
+     * Sets an optional {@link EntityListenerFactory} that should be used to create entity
+     * listeners. Note that changing the factory does not affect already created
+     * listeners. So refresh the existing listners, call "setCallbackRegistry(null)" after
+     * setting the listener.
+     * 
+     * @since 3.0
+     */
+    public void setEntityListenerFactory(EntityListenerFactory entityListenerFactory) {
+        this.entityListenerFactory = entityListenerFactory;
     }
 }