Skip to content

Commit

Permalink
Merge 72058bf into 9beb940
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszlenart committed Jan 29, 2018
2 parents 9beb940 + 72058bf commit 6e98c0e
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
Expand Down Expand Up @@ -129,7 +130,7 @@ public static String resolvePropertyName(Method method) {
}

/**
* Returns the annotation on the given class or the package of the class. This searchs up the
* Returns the annotation on the given class or the package of the class. This searches up the
* class hierarchy and the package hierarchy for the closest match.
*
* @param <T> class type
Expand All @@ -154,4 +155,33 @@ public static <T extends Annotation> T findAnnotation(Class<?> clazz, Class<T> a

return ann;
}

/**
* Returns a list of the annotation on the given class or the package of the class.
* This searches up the class hierarchy and the package hierarchy.
*
* @param <T> class type
* @param clazz The class to search for the annotation.
* @param annotationClass The Class of the annotation.
* @return List of the annotations or an empty list.
*/
public static <T extends Annotation> List<T> findAnnotations(Class<?> clazz, Class<T> annotationClass) {
List<T> anns = new ArrayList<>();

T ann = clazz.getAnnotation(annotationClass);
if (ann != null) {
anns.add(ann);
}

ann = clazz.getPackage().getAnnotation(annotationClass);
if (ann != null) {
anns.add(ann);
}

if (clazz.getSuperclass() != Object.class) {
anns.addAll(findAnnotations(clazz.getSuperclass(), annotationClass));
}

return anns;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,18 @@
package com.opensymphony.xwork2.util;

import com.opensymphony.xwork2.util.annotation.Dummy2Class;
import com.opensymphony.xwork2.util.annotation.Dummy3Class;
import com.opensymphony.xwork2.util.annotation.DummyClass;
import com.opensymphony.xwork2.util.annotation.MyAnnotation;

import com.opensymphony.xwork2.util.annotation.MyAnnotation2;
import junit.framework.TestCase;

/**
* @author Dan Oxlade, dan d0t oxlade at gmail d0t c0m
*/
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static org.fest.assertions.Assertions.assertThat;

public class AnnotationUtilsTest extends TestCase {

public void testFindAnnotationOnClass() {
Expand All @@ -41,4 +45,25 @@ public void testFindAnnotationOnPackage() {
assertEquals("package-test", ns.value());
}

public void testFindAnnotationOnParents() {
MyAnnotation2 ns = AnnotationUtils.findAnnotation(Dummy3Class.class, MyAnnotation2.class);
assertNotNull(ns);
assertEquals("abstract-abstract", ns.value());
}

public void testFindAnnotationsOnAll() {
List<MyAnnotation> annotations = AnnotationUtils.findAnnotations(DummyClass.class, MyAnnotation.class);

assertThat(annotations)
.isNotNull()
.isNotEmpty()
.hasSize(2);

Set<String> values = new HashSet<>();
for (MyAnnotation annotation : annotations) {
values.add(annotation.value());
}
assertThat(values).contains("class-test", "package-test");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* 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 com.opensymphony.xwork2.util.annotation;

import com.opensymphony.xwork2.util.annotation.pkg1.AbstractDummyAction;

public class Dummy3Class extends AbstractDummyAction{

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2 {

String value() default "";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* 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 com.opensymphony.xwork2.util.annotation.pkg1;

import com.opensymphony.xwork2.util.annotation.MyAnnotation2;

@MyAnnotation2("abstract-abstract")
public class AbstractAbstractDummyAction {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* 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 com.opensymphony.xwork2.util.annotation.pkg1;

public class AbstractDummyAction extends AbstractAbstractDummyAction {
}
Original file line number Diff line number Diff line change
Expand Up @@ -749,13 +749,13 @@ protected void buildConfiguration(Set<Class> classes) {
}

private Set<String> getAllowedMethods(Class<?> actionClass) {
AllowedMethods annotation = AnnotationUtils.findAnnotation(actionClass, AllowedMethods.class);
if (annotation == null) {
List<AllowedMethods> annotations = AnnotationUtils.findAnnotations(actionClass, AllowedMethods.class);
if (annotations == null || annotations.isEmpty()) {
return Collections.emptySet();
} else {
Set<String> methods = new HashSet<>();
for (String method : annotation.value()) {
methods.add(method);
for (AllowedMethods allowedMethods : annotations) {
methods.addAll(Arrays.asList(allowedMethods.value()));
}
return methods;
}
Expand Down Expand Up @@ -924,7 +924,7 @@ protected void createActionConfig(PackageConfig.Builder pkgCfg, Class<?> actionC
String actionMethod, Action annotation, Set<String> allowedMethods) {
String className = actionClass.getName();
if (annotation != null) {
actionName = annotation.value() != null && annotation.value().equals(Action.DEFAULT_VALUE) ? actionName : annotation.value();
actionName = annotation.value().equals(Action.DEFAULT_VALUE) ? actionName : annotation.value();
actionName = StringUtils.contains(actionName, "/") && !slashesInActionNames ? StringUtils.substringAfterLast(actionName, "/") : actionName;
if(!Action.DEFAULT_VALUE.equals(annotation.className())){
className = annotation.className();
Expand Down Expand Up @@ -960,7 +960,7 @@ protected void createActionConfig(PackageConfig.Builder pkgCfg, Class<?> actionC
actionConfig.addParams(StringTools.createParameterMap(annotation.params()));

//add exception mappings from annotation
if (annotation != null && annotation.exceptionMappings() != null)
if (annotation != null)
actionConfig.addExceptionMappings(buildExceptionMappings(annotation.exceptionMappings(), actionName));

//add exception mapping from class
Expand Down Expand Up @@ -997,8 +997,7 @@ protected List<ExceptionMappingConfig> buildExceptionMappings(ExceptionMapping[]
exceptionMapping.result(), actionName);
ExceptionMappingConfig.Builder builder = new ExceptionMappingConfig.Builder(null, exceptionMapping
.exception(), exceptionMapping.result());
if (exceptionMapping.params() != null)
builder.addParams(StringTools.createParameterMap(exceptionMapping.params()));
builder.addParams(StringTools.createParameterMap(exceptionMapping.params()));
exceptionMappings.add(builder.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -544,10 +544,14 @@ public Container getContainer() {
assertEquals("struts-default", pkgConfig.getParents().get(0).getName());

ActionConfig actionConfig = pkgConfig.getActionConfigs().get("class-level-allowed-methods");
assertEquals(actionConfig.getAllowedMethods().size(), 5);
assertEquals(7, actionConfig.getAllowedMethods().size());
assertTrue(actionConfig.getAllowedMethods().contains("execute"));
assertTrue(actionConfig.getAllowedMethods().contains("end"));
assertTrue(actionConfig.getAllowedMethods().contains("input"));
assertTrue(actionConfig.getAllowedMethods().contains("cancel"));
assertTrue(actionConfig.getAllowedMethods().contains("start"));
assertTrue(actionConfig.getAllowedMethods().contains("home"));
assertTrue(actionConfig.getAllowedMethods().contains("browse"));

/* org.apache.struts2.convention.actions.allowedmethods.sub package level */
pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods.sub#struts-default#/allowedmethods/sub");
Expand Down

0 comments on commit 6e98c0e

Please sign in to comment.