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;
}
}