From bd09bac0b027affbd57ecc5f8700a80d0d538cbc Mon Sep 17 00:00:00 2001 From: Musachy Barroso Date: Sun, 12 Apr 2009 18:16:43 +0000 Subject: [PATCH] WW-3083 fix how packages and actions are scanned for annotations git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@764310 13f79535-47bb-0310-9956-ffa450edef68 --- .../annotation/AnnotationTools.java | 4 ++- .../PackageBasedActionConfigBuilderTest.java | 22 ++++++++++++++ .../ClassLevelParentPackageChildAction.java | 29 +++++++++++++++++++ .../PackageLevelParentPackageChildAction.java | 29 +++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/ClassLevelParentPackageChildAction.java create mode 100644 plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/PackageLevelParentPackageChildAction.java diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AnnotationTools.java b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AnnotationTools.java index cab649fb0..d22bf9d08 100644 --- a/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AnnotationTools.java +++ b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AnnotationTools.java @@ -40,7 +40,9 @@ public class AnnotationTools { public static T findAnnotation(Class klass, Class annotationClass) { T ann = klass.getAnnotation(annotationClass); while (ann == null && klass != null) { - ann = klass.getPackage().getAnnotation(annotationClass); + ann = klass.getAnnotation(annotationClass); + if (ann == null) + ann = klass.getPackage().getAnnotation(annotationClass); if (ann == null) { klass = klass.getSuperclass(); } diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java index c71d5d7a8..515a560eb 100644 --- a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java @@ -56,6 +56,8 @@ import org.apache.struts2.convention.actions.namespace4.ActionAndPackageLevelNam import org.apache.struts2.convention.actions.params.ActionParamsMethodLevelAction; import org.apache.struts2.convention.actions.parentpackage.ClassLevelParentPackageAction; import org.apache.struts2.convention.actions.parentpackage.PackageLevelParentPackageAction; +import org.apache.struts2.convention.actions.parentpackage.sub.ClassLevelParentPackageChildAction; +import org.apache.struts2.convention.actions.parentpackage.sub.PackageLevelParentPackageChildAction; import org.apache.struts2.convention.actions.result.ActionLevelResultAction; import org.apache.struts2.convention.actions.result.ActionLevelResultsAction; import org.apache.struts2.convention.actions.result.ClassLevelResultAction; @@ -148,8 +150,12 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { "/interceptor", strutsDefault, null); PackageConfig packageLevelPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage#package-level#/parentpackage", "/parentpackage", packageLevelParentPkg, null); + PackageConfig packageLevelSubPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#package-level#/parentpackage/sub", + "/parentpackage/sub", packageLevelParentPkg, null); PackageConfig differentPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage#class-level#/parentpackage", "/parentpackage", classLevelParentPkg, null); + PackageConfig differentSubPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#class-level#/parentpackage/sub", + "/parentpackage/sub", classLevelParentPkg, null); PackageConfig pkgLevelNamespacePkg = makePackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/package-level", "/package-level", strutsDefault, null); PackageConfig classLevelNamespacePkg = makePackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/class-level", @@ -234,7 +240,9 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { /* org.apache.struts2.convention.actions.parentpackage */ expect(resultMapBuilder.build(PackageLevelParentPackageAction.class, null, "package-level-parent-package", packageLevelPkg)).andReturn(results); + expect(resultMapBuilder.build(PackageLevelParentPackageChildAction.class, null, "package-level-parent-package-child", packageLevelSubPkg)).andReturn(results); expect(resultMapBuilder.build(ClassLevelParentPackageAction.class, null, "class-level-parent-package", differentPkg)).andReturn(results); + expect(resultMapBuilder.build(ClassLevelParentPackageChildAction.class, null, "class-level-parent-package-child", differentSubPkg)).andReturn(results); /* org.apache.struts2.convention.actions.result */ expect(resultMapBuilder.build(ClassLevelResultAction.class, null, "class-level-result", resultPkg)).andReturn(results); @@ -443,12 +451,26 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { assertEquals(1, pkgConfig.getActionConfigs().size()); verifyActionConfig(pkgConfig, "class-level-parent-package", ClassLevelParentPackageAction.class, "execute", pkgConfig.getName()); + /* org.apache.struts2.convention.actions.parentpackage.sub class level */ + pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#class-level#/parentpackage/sub"); + assertNotNull(pkgConfig); + assertEquals(1, pkgConfig.getActionConfigs().size()); + verifyActionConfig(pkgConfig, "class-level-parent-package-child", ClassLevelParentPackageChildAction.class, "execute", pkgConfig.getName()); + assertEquals("class-level", pkgConfig.getParents().get(0).getName()); + /* org.apache.struts2.convention.actions.parentpackage package level */ pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.parentpackage#package-level#/parentpackage"); assertNotNull(pkgConfig); assertEquals(1, pkgConfig.getActionConfigs().size()); verifyActionConfig(pkgConfig, "package-level-parent-package", PackageLevelParentPackageAction.class, "execute", pkgConfig.getName()); + /* org.apache.struts2.convention.actions.parentpackage.sub package level */ + pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#package-level#/parentpackage/sub"); + assertNotNull(pkgConfig); + assertEquals(1, pkgConfig.getActionConfigs().size()); + verifyActionConfig(pkgConfig, "package-level-parent-package-child", PackageLevelParentPackageChildAction.class, "execute", pkgConfig.getName()); + assertEquals("package-level", pkgConfig.getParents().get(0).getName()); + /* org.apache.struts2.convention.actions.result */ pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result"); assertNotNull(pkgConfig); diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/ClassLevelParentPackageChildAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/ClassLevelParentPackageChildAction.java new file mode 100644 index 000000000..0aca0cc48 --- /dev/null +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/ClassLevelParentPackageChildAction.java @@ -0,0 +1,29 @@ +/* + * $Id: ClassLevelParentPackageAction.java 655902 2008-05-13 15:15:12Z bpontarelli $ + * + * 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.struts2.convention.actions.parentpackage.sub; + +import org.apache.struts2.convention.actions.parentpackage.ClassLevelParentPackageAction; + +/** + * Extends an action that hass a @ParentPackage at the class level + */ +public class ClassLevelParentPackageChildAction extends ClassLevelParentPackageAction { +} diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/PackageLevelParentPackageChildAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/PackageLevelParentPackageChildAction.java new file mode 100644 index 000000000..fd9d2f7ef --- /dev/null +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/parentpackage/sub/PackageLevelParentPackageChildAction.java @@ -0,0 +1,29 @@ +/* + * $Id: ClassLevelParentPackageAction.java 655902 2008-05-13 15:15:12Z bpontarelli $ + * + * 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.struts2.convention.actions.parentpackage.sub; + +import org.apache.struts2.convention.actions.parentpackage.PackageLevelParentPackageAction; + +/** + * Extends a class the has a @ParentPackage at the package level + */ +public class PackageLevelParentPackageChildAction extends PackageLevelParentPackageAction { +}