You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2010/03/10 21:05:10 UTC
svn commit: r921538 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/conf/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/
openjpa-persistence-jdbc/src/test/resources/META-INF/
openjpa-persistence/sr...
Author: faywang
Date: Wed Mar 10 20:05:09 2010
New Revision: 921538
URL: http://svn.apache.org/viewvc?rev=921538&view=rev
Log:
OPENJPA-1505: allow duplicate entity listeners to be configurable
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java (with props)
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/CallbackOptions.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/listener-orm.xml
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/CallbackOptions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/CallbackOptions.java?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/CallbackOptions.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/CallbackOptions.java Wed Mar 10 20:05:09 2010
@@ -28,6 +28,7 @@ import java.io.Serializable;
public class CallbackOptions implements Serializable {
private boolean _isPostPersistCallbackImmediate = false;
private boolean _allowsMultipleMethodsForSameCallback = false;
+ private boolean _allowsDuplicateListener = true;
/**
* Affirms if the post-persist callback is invoked as soon as a new instance
@@ -64,4 +65,22 @@ public class CallbackOptions implements
public void setAllowsMultipleMethodsForSameCallback(boolean flag) {
_allowsMultipleMethodsForSameCallback = flag;
}
+
+ /**
+ * Flags if duplicate listeners are allowed to handle the same
+ * callback event.
+ * Defaults to true.
+ */
+ public boolean getAllowsDuplicateListener() {
+ return _allowsDuplicateListener;
+ }
+
+ /**
+ * Flags if duplicate listeners are allowed to handle the same
+ * callback event.
+ */
+ public void setAllowsDuplicateListener(boolean flag) {
+ _allowsDuplicateListener = flag;
+ }
+
}
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java?rev=921538&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java Wed Mar 10 20:05:09 2010
@@ -0,0 +1,49 @@
+/*
+ * 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.openjpa.persistence.callbacks;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.EntityListeners;
+
+@Entity
+@EntityListeners(value = {ListenerImpl.class, ListenerImpl.class})
+public class DuplicateListenerEntity implements ListenerTestEntity {
+ @Id @GeneratedValue
+ private long id;
+
+ private int value;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/DuplicateListenerEntity.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java Wed Mar 10 20:05:09 2010
@@ -23,6 +23,10 @@ import org.apache.openjpa.persistence.Op
public class TestEntityListeners extends SingleEMFTestCase {
+ private static final int ENTITY_LISTENER_ENTITY = 1;
+ private static final int GLOBAL_LISTENER_ENTITY = 2;
+ private static final int DUPLICATE_LISTENER_ENTITY = 3;
+
public void setUp() {
setUp(CLEAR_TABLES);
ListenerImpl.prePersistCount = 0;
@@ -40,22 +44,38 @@ public class TestEntityListeners extends
}
public void testEntityListeners() {
- helper(true);
+ helper(ENTITY_LISTENER_ENTITY);
}
public void testGlobalListeners() {
- helper(false);
+ helper(GLOBAL_LISTENER_ENTITY);
+ }
+
+ public void testDuplicateListeners() {
+ super.setUp(CLEAR_TABLES, DuplicateListenerEntity.class,
+ "openjpa.Callbacks", "AllowsDuplicateListener=false");
+ assertFalse(emf.getConfiguration().getCallbackOptionsInstance()
+ .getAllowsDuplicateListener());
+ helper(DUPLICATE_LISTENER_ENTITY);
}
- public void helper(boolean entityListeners) {
+ public void helper(int entityListeners) {
OpenJPAEntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
- ListenerTestEntity o;
- if (entityListeners)
+ ListenerTestEntity o = null;
+ switch (entityListeners) {
+ case ENTITY_LISTENER_ENTITY:
o = new EntityListenerEntity();
- else
+ break;
+ case GLOBAL_LISTENER_ENTITY:
o = new GlobalListenerEntity();
+ break;
+ case DUPLICATE_LISTENER_ENTITY:
+ o = new DuplicateListenerEntity();
+ break;
+
+ }
em.persist(o);
assertStatus(1, 0, 0, 0, 0, 0, 0);
@@ -68,11 +88,18 @@ public class TestEntityListeners extends
em = emf.createEntityManager();
em.getTransaction().begin();
- if (entityListeners)
+ switch (entityListeners) {
+ case ENTITY_LISTENER_ENTITY:
o = em.find(EntityListenerEntity.class, id);
- else
+ break;
+ case GLOBAL_LISTENER_ENTITY:
o = em.find(GlobalListenerEntity.class, id);
-
+ break;
+ case DUPLICATE_LISTENER_ENTITY:
+ o = em.find(DuplicateListenerEntity.class, id);
+ break;
+
+ }
assertNotNull(o);
assertStatus(1, 1, 0, 0, 0, 0, 1);
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/listener-orm.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/listener-orm.xml?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/listener-orm.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/listener-orm.xml Wed Mar 10 20:05:09 2010
@@ -34,6 +34,9 @@
<entity class="EntityListenerEntity">
<exclude-default-listeners/>
</entity>
+ <entity class="DuplicateListenerEntity">
+ <exclude-default-listeners/>
+ </entity>
<entity class="Message">
<exclude-default-listeners/>
</entity>
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml Wed Mar 10 20:05:09 2010
@@ -100,6 +100,7 @@
<mapping-file>META-INF/listener-orm.xml</mapping-file>
<class>org.apache.openjpa.persistence.callbacks.EntityListenerEntity</class>
<class>org.apache.openjpa.persistence.callbacks.GlobalListenerEntity</class>
+ <class>org.apache.openjpa.persistence.callbacks.DuplicateListenerEntity</class>
<class>org.apache.openjpa.persistence.callbacks.Message</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java Wed Mar 10 20:05:09 2010
@@ -855,10 +855,20 @@ public class AnnotationPersistenceMetaDa
private Collection<LifecycleCallbacks>[] parseEntityListeners
(ClassMetaData meta, EntityListeners listeners) {
Class<?>[] classes = listeners.value();
+ Collection<Class<?>> listenerColl = null;
Collection<LifecycleCallbacks>[] parsed = null;
- for (Class<?> cls : classes)
+ for (Class<?> cls : classes) {
+ if (!_conf.getCallbackOptionsInstance().getAllowsDuplicateListener()) {
+ if (listenerColl == null)
+ listenerColl = new ArrayList<Class<?>>();
+ if (listenerColl.contains(cls))
+ continue;
+ listenerColl.add(cls);
+ }
+
parsed = parseCallbackMethods(cls, parsed, true, true,
getRepository());
+ }
return parsed;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=921538&r1=921537&r2=921538&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Wed Mar 10 20:05:09 2010
@@ -208,6 +208,7 @@ public class XMLPersistenceMetaDataParse
private Class<?> _listener = null;
private Collection<LifecycleCallbacks>[] _callbacks = null;
+ private Collection<Class<?>> _listeners = null;
private int[] _highs = null;
private boolean _isXMLMappingMetaDataComplete = false;
@@ -1831,6 +1832,14 @@ public class XMLPersistenceMetaDataParse
private boolean startEntityListener(Attributes attrs)
throws SAXException {
_listener = classForName(attrs.getValue("class"));
+ if (!_conf.getCallbackOptionsInstance().getAllowsDuplicateListener()) {
+ if (_listeners == null)
+ _listeners = new ArrayList<Class<?>>();
+ if (_listeners.contains(_listener))
+ return true;
+ _listeners.add(_listener);
+ }
+
boolean system = currentElement() == null;
Collection<LifecycleCallbacks>[] parsed =
AnnotationPersistenceMetaDataParser.parseCallbackMethods(_listener,