You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2016/01/12 14:42:00 UTC
svn commit: r1724229 - in /aries/trunk/blueprint/blueprint-maven-plugin/src:
main/java/org/apache/aries/blueprint/plugin/model/
test/java/org/apache/aries/blueprint/plugin/bad/
test/java/org/apache/aries/blueprint/plugin/model/
test/java/org/apache/ari...
Author: cschneider
Date: Tue Jan 12 13:42:00 2016
New Revision: 1724229
URL: http://svn.apache.org/viewvc?rev=1724229&view=rev
Log:
[ARIES-1474] Fix init/destroy method inheritence.
Added:
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean1.java
- copied, changed from r1724022, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean2.java
- copied, changed from r1724022, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
Modified:
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1724229&r1=1724228&r2=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java Tue Jan 12 13:42:00 2016
@@ -34,6 +34,9 @@ import javax.persistence.PersistenceUnit
import org.springframework.stereotype.Component;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+
public class Bean extends BeanRef {
public String initMethod;
public String destroyMethod;
@@ -45,15 +48,16 @@ public class Bean extends BeanRef {
public Bean(Class<?> clazz) {
super(clazz, BeanRef.getBeanName(clazz));
- for (Method method : clazz.getDeclaredMethods()) {
- PostConstruct postConstruct = getEffectiveAnnotation(method, PostConstruct.class);
- if (postConstruct != null) {
- this.initMethod = method.getName();
- }
- PreDestroy preDestroy = getEffectiveAnnotation(method, PreDestroy.class);
- if (preDestroy != null) {
- this.destroyMethod = method.getName();
- }
+ // Init method
+ Method initMethod = getMethodWithAnnotation(clazz, PostConstruct.class);
+ if (initMethod != null) {
+ this.initMethod = initMethod.getName();
+ }
+
+ // Destroy method
+ Method destroyMethod = getMethodWithAnnotation(clazz, PreDestroy.class);
+ if (destroyMethod != null) {
+ this.destroyMethod = destroyMethod.getName();
}
this.isPrototype = isPrototype(clazz);
this.persistenceFields = getPersistenceFields();
@@ -81,7 +85,7 @@ public class Bean extends BeanRef {
}
return persistenceFields.toArray(new Field[]{});
}
-
+
public void resolve(Matcher matcher) {
Class<?> curClass = this.clazz;
while (curClass != null && curClass != Object.class) {
@@ -89,7 +93,7 @@ public class Bean extends BeanRef {
curClass = curClass.getSuperclass();
}
}
-
+
private void resolveProperties(Matcher matcher, Class<?> curClass) {
for (Field field : curClass.getDeclaredFields()) {
Property prop = Property.create(matcher, field);
@@ -99,46 +103,27 @@ public class Bean extends BeanRef {
}
}
- private static <T extends Annotation> T getEffectiveAnnotation(Method method, Class<T> annotationClass) {
- final Class<?> methodClass = method.getDeclaringClass();
- final String name = method.getName();
- final Class<?>[] params = method.getParameterTypes();
-
- // 1. Current class
- final T rootAnnotation = method.getAnnotation(annotationClass);
- if (rootAnnotation != null) {
- return rootAnnotation;
- }
-
- // 2. Superclass
- final Class<?> superclass = methodClass.getSuperclass();
- if (superclass != null) {
- final T annotation = getMethodAnnotation(superclass, name, params, annotationClass);
- if (annotation != null)
- return annotation;
- }
-
- // 3. Interfaces
- for (final Class<?> intfs : methodClass.getInterfaces()) {
- final T annotation = getMethodAnnotation(intfs, name, params, annotationClass);
- if (annotation != null)
- return annotation;
- }
-
- return null;
- }
-
- private static <T extends Annotation> T getMethodAnnotation(Class<?> searchClass, String name, Class<?>[] params,
- Class<T> annotationClass) {
- try {
- Method method = searchClass.getMethod(name, params);
- return getEffectiveAnnotation(method, annotationClass);
- } catch (NoSuchMethodException e) {
- return null;
+ private static <T extends Annotation> Method getMethodWithAnnotation(Class<?> classToSearch,
+ Class<T> annotationClass) {
+ List<Method> methods = getMethodsWithAnnotation(classToSearch, annotationClass);
+ Preconditions.checkArgument(methods.size() <= 1,
+ "Found %d methods annotated with %s in class %s, but only 1 allowed",
+ methods.size(), annotationClass.getName(), classToSearch.getName());
+ return Iterables.getOnlyElement(methods, null);
+ }
+
+ private static <T extends Annotation> List<Method> getMethodsWithAnnotation(Class<?> classToSearch,
+ Class<T> annotationClass) {
+ List<Method> methods = new ArrayList<>();
+ for (Method method : classToSearch.getMethods()) {
+ T annotation = method.getAnnotation(annotationClass);
+ if (annotation != null) {
+ methods.add(method);
+ }
}
+ return methods;
}
-
@Override
public int hashCode() {
final int prime = 31;
@@ -158,5 +143,5 @@ public class Bean extends BeanRef {
writer.writeProperty(property);
}
}
-
+
}
Copied: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean1.java (from r1724022, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean1.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean1.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java&r1=1724022&r2=1724229&rev=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean1.java Tue Jan 12 13:42:00 2016
@@ -16,18 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.aries.blueprint.plugin.test;
+package org.apache.aries.blueprint.plugin.bad;
import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import javax.inject.Singleton;
-public class ParentBean {
+import org.apache.aries.blueprint.plugin.test.ParentBean;
+@Singleton
+public class BadBean1 extends ParentBean
+{
@PostConstruct
- public void init() {
- }
-
- @PreDestroy
- public void destroy() {
+ public void secondInit() {
+
}
}
Copied: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean2.java (from r1724022, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean2.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean2.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java&r1=1724022&r2=1724229&rev=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean2.java Tue Jan 12 13:42:00 2016
@@ -16,18 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.aries.blueprint.plugin.test;
+package org.apache.aries.blueprint.plugin.bad;
-import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
+import javax.inject.Singleton;
-public class ParentBean {
+import org.apache.aries.blueprint.plugin.test.ParentBean;
- @PostConstruct
- public void init() {
- }
-
+@Singleton
+public class BadBean2 extends ParentBean
+{
@PreDestroy
- public void destroy() {
+ public void secondDestroy() {
+
}
}
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java?rev=1724229&r1=1724228&r2=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java Tue Jan 12 13:42:00 2016
@@ -25,6 +25,8 @@ import static org.junit.Assert.assertTru
import javax.inject.Named;
+import org.apache.aries.blueprint.plugin.bad.BadBean1;
+import org.apache.aries.blueprint.plugin.bad.BadBean2;
import org.apache.aries.blueprint.plugin.test.MyBean1;
import org.apache.aries.blueprint.plugin.test.MyBean3;
import org.apache.aries.blueprint.plugin.test.MyBean4;
@@ -34,7 +36,7 @@ import org.junit.Test;
public class BeanTest {
-
+
@Test
public void testParseMyBean1() {
Bean bean = new Bean(MyBean1.class);
@@ -54,7 +56,7 @@ public class BeanTest {
assertEquals("bean2", prop.name);
assertEquals("serviceA", prop.ref);
}
-
+
@Test
public void testParseMyBean3() {
Bean bean = new Bean(MyBean3.class);
@@ -69,7 +71,7 @@ public class BeanTest {
assertEquals(5, bean.properties.size());
assertTrue(bean.isPrototype);
}
-
+
@Test
public void testParseNamedBean() {
Bean bean = new Bean(ServiceAImpl1.class);
@@ -84,7 +86,7 @@ public class BeanTest {
assertEquals("There should be no properties", 0, bean.properties.size());
assertTrue(bean.isPrototype);
}
-
+
@Test
public void testBlueprintBundleContext() {
Bean bean = new Bean(MyBean4.class);
@@ -95,4 +97,13 @@ public class BeanTest {
assertFalse(bean.isPrototype);
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testMultipleInitMethods() {
+ new Bean(BadBean1.class);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testMultipleDestroyMethods() {
+ new Bean(BadBean2.class);
+ }
}
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java?rev=1724229&r1=1724228&r2=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java Tue Jan 12 13:42:00 2016
@@ -18,6 +18,7 @@
*/
package org.apache.aries.blueprint.plugin.test;
+import javax.annotation.PostConstruct;
import javax.inject.Singleton;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@@ -33,20 +34,23 @@ public class MyBean1 extends ParentBean
@Autowired
ServiceA bean2;
-
+
@PersistenceContext(unitName="person")
EntityManager em;
-
+
@PersistenceUnit(unitName="person")
EntityManager emf;
-
- public void init() {
+
+ public void overridenInit() {
+ // By overriding the method and removing the annotation, this method has lost its
+ // @PostConstruct method because it isn't @Inherited
}
-
- public void destroy() {
+
+ @PostConstruct
+ public void init() {
}
public void saveData() {
-
+
}
}
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java?rev=1724229&r1=1724228&r2=1724229&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java Tue Jan 12 13:42:00 2016
@@ -24,9 +24,9 @@ import javax.annotation.PreDestroy;
public class ParentBean {
@PostConstruct
- public void init() {
+ public void overridenInit() {
}
-
+
@PreDestroy
public void destroy() {
}