com.opensymphony.xwork2.util.AnnotationUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xwork Show documentation
Show all versions of xwork Show documentation
XWork is an command-pattern framework that is used to power WebWork
as well as other applications. XWork provides an Inversion of Control
container, a powerful expression language, data type conversion,
validation, and pluggable configuration.
/*
* Copyright (c) 2002-2006 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.xwork2.util;
import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* AnnotationUtils
*
* Various utility methods dealing with annotations
*
* @author Rainer Hermanns
* @author Zsolt Szasz, zsolt at lorecraft dot com
* @version $Id: AnnotationUtils.java 1209 2006-11-17 07:53:04Z mrdon $
*/
public class AnnotationUtils {
private static final Pattern SETTER_PATTERN = Pattern.compile("set([A-Z][A-Za-z0-9]*)$");
private static final Pattern GETTER_PATTERN = Pattern.compile("(get|is|has)([A-Z][A-Za-z0-9]*)$");
/**
* Adds all fields with the specified Annotation of class clazz and its superclasses to allFields
*
* @param annotationClass
* @param clazz
* @param allFields
*/
public static void addAllFields(Class annotationClass, Class clazz, List allFields) {
if (clazz == null) {
return;
}
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Annotation ann = field.getAnnotation(annotationClass);
if (ann!=null) {
allFields.add(field);
}
}
addAllFields(annotationClass, clazz.getSuperclass(), allFields);
}
/**
* Adds all methods with the specified Annotation of class clazz and its superclasses to allFields
*
* @param annotationClass
* @param clazz
* @param allMethods
*/
public static void addAllMethods(Class annotationClass, Class clazz, List allMethods) {
if (clazz == null) {
return;
}
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
Annotation ann = method.getAnnotation(annotationClass);
if (ann!=null) {
allMethods.add(method);
}
}
addAllMethods(annotationClass, clazz.getSuperclass(), allMethods);
}
/**
*
* @param clazz
* @param allInterfaces
*/
public static void addAllInterfaces(Class clazz, List allInterfaces) {
if (clazz == null) {
return;
}
Class[] interfaces = clazz.getInterfaces();
allInterfaces.addAll(Arrays.asList(interfaces));
addAllInterfaces(clazz.getSuperclass(), allInterfaces);
}
public static List findAnnotatedMethods(Class clazz, Class extends Annotation> annotationClass) {
List methods = new ArrayList();
findRecursively(clazz, annotationClass, methods);
return methods;
}
public static void findRecursively(Class clazz, Class extends Annotation> annotationClass, List methods) {
for (Method m : clazz.getDeclaredMethods()) {
if (m.getAnnotation(annotationClass) != null) { methods.add(0, m); }
}
if (clazz.getSuperclass() != Object.class) {
findRecursively(clazz.getSuperclass(), annotationClass, methods);
}
}
/**
* Returns the property name for a method.
* This method is independant from property fields.
*
* @param method The method to get the property name for.
* @return the property name for given method; null if non could be resolved.
*/
public static String resolvePropertyName(Method method) {
Matcher matcher = SETTER_PATTERN.matcher(method.getName());
if (matcher.matches() && method.getParameterTypes().length == 1) {
String raw = matcher.group(1);
return raw.substring(0, 1).toLowerCase() + raw.substring(1);
}
matcher = GETTER_PATTERN.matcher(method.getName());
if (matcher.matches() && method.getParameterTypes().length == 0) {
String raw = matcher.group(2);
return raw.substring(0, 1).toLowerCase() + raw.substring(1);
}
return null;
}
/**
* Retrieves all classes within a packages.
* TODO: this currently does not work with jars.
*
* @param pckgname
* @return Array of full qualified class names from this package.
*/
public static String[] find(Class clazz, final String pckgname) {
List classes = new ArrayList();
String name = new String(pckgname);
if (!name.startsWith("/")) {
name = "/" + name;
}
name = name.replace('.', File.separatorChar);
final URL url = clazz.getResource(name);
final File directory = new File(url.getFile());
if (directory.exists()) {
final String[] files = directory.list();
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".class")) {
classes.add(pckgname + "." + files[i].substring(0, files[i].length() - 6));
}
}
}
return classes.toArray(new String[classes.size()]);
}
}