br.gov.frameworkdemoiselle.util.contrib.Reflections.java Source code

Java tutorial

Introduction

Here is the source code for br.gov.frameworkdemoiselle.util.contrib.Reflections.java

Source

/*
 * Demoiselle Framework
 * Copyright (C) 2010 SERPRO
 * ----------------------------------------------------------------------------
 * This file is part of Demoiselle Framework.
 * 
 * Demoiselle Framework is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License version 3
 * as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License version 3
 * along with this program; if not,  see <http://www.gnu.org/licenses/>
 * or write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA  02110-1301, USA.
 * ----------------------------------------------------------------------------
 * Este arquivo  parte do Framework Demoiselle.
 * 
 * O Framework Demoiselle  um software livre; voc pode redistribu-lo e/ou
 * modific-lo dentro dos termos da GNU LGPL verso 3 como publicada pela Fundao
 * do Software Livre (FSF).
 * 
 * Este programa  distribudo na esperana que possa ser til, mas SEM NENHUMA
 * GARANTIA; sem uma garantia implcita de ADEQUAO a qualquer MERCADO ou
 * APLICAO EM PARTICULAR. Veja a Licena Pblica Geral GNU/LGPL em portugus
 * para maiores detalhes.
 * 
 * Voc deve ter recebido uma cpia da GNU LGPL verso 3, sob o ttulo
 * "LICENCA.txt", junto com esse programa. Se no, acesse <http://www.gnu.org/licenses/>
 * ou escreva para a Fundao do Software Livre (FSF) Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
 */
package br.gov.frameworkdemoiselle.util.contrib;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Collection;

import org.apache.commons.lang.ArrayUtils;

public class Reflections {

    /**
     * Build a array of super classes fields
     * 
     * @return Array of Super Classes Fields
     */
    public static Field[] getSuperClassesFields(Class<?> entryClass) {
        Field[] fieldArray = null;
        fieldArray = (Field[]) ArrayUtils.addAll(fieldArray, entryClass.getDeclaredFields());
        Class<?> superClazz = entryClass.getSuperclass();
        while (superClazz != null && !"java.lang.Object".equals(superClazz.getName())) {
            fieldArray = (Field[]) ArrayUtils.addAll(fieldArray, superClazz.getDeclaredFields());
            superClazz = superClazz.getSuperclass();
        }
        return fieldArray;
    }

    @SuppressWarnings("unchecked")
    public static <T> T[] getAnnotatedValues(Collection<?> collection, Class<? extends Annotation> aclazz,
            Class<T> T) {
        T[] values = null;
        if (collection != null)
            for (Object item : collection)
                try {
                    values = (T[]) ArrayUtils.add(values, (T) getAnnotatedValue(item, aclazz, true));
                } catch (Exception e) {
                }
        return values;
    }

    public static Object getAnnotatedValue(Object entry, Class<? extends Annotation> aclazz, boolean required)
            throws Exception {
        Field field = getAnnotatedField(entry.getClass(), aclazz, required);
        if (field != null)
            return getFieldValue(field, entry);
        return null;
    }

    public static Field getAnnotatedField(Class<?> clazz, Class<? extends Annotation> aclazz, boolean required)
            throws Exception {
        for (Field field : getSuperClassesFields(clazz))
            if (field.isAnnotationPresent(aclazz))
                return field;
        if (required)
            throw new Exception(
                    "Field with @" + aclazz.getSimpleName() + " not found on class " + clazz.getSimpleName());
        else
            return null;
    }

    public static Object getFieldValue(Field field, Object object) {
        return br.gov.frameworkdemoiselle.util.Reflections.getFieldValue(field, object);
    }

}