Project: arquillian-extension-spring
/**
 * JBoss, Home of Professional Open Source 
 * Copyright 2012, Red Hat Middleware LLC, and individual contributors 
 * by the @authors tag. See the copyright.txt in the distribution for a 
 * full listing of individual contributors. 
 * 
 * Licensed 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.jboss.arquillian.warp.extension.spring.container; 
 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Field; 
import java.security.AccessController; 
import java.security.PrivilegedAction; 
import java.util.ArrayList; 
import java.util.List; 
 
/**
 * <p>Defines a set of utility methods that need to be executed in secured context.</p> 
 * 
 * @author <a href="mailto:[email protected]">Jakub Narloch</a> 
 */
 
final class SecurityActions { 
 
    /**
     * <p>Retrieves the list of annotated fields for the given type.</p> 
     * 
     * @param source          the type that will be scanned for fields annotated with given type 
     * @param annotationClass the annotation type 
     * 
     * @return list of fields of the given glass that are annotated with specific annotation, may be empty 
     */
 
    static List<Field> getFieldsWithAnnotation(final Class<?> source, final Class<? extends Annotation> annotationClass) { 
        List<Field> declaredAccessableFields = AccessController.doPrivileged(new PrivilegedAction<List<Field>>() { 
            public List<Field> run() { 
                List<Field> foundFields = new ArrayList<Field>(); 
                Class<?> nextSource = source; 
                while (nextSource != Object.class) { 
                    for (Field field : nextSource.getDeclaredFields()) { 
                        if (field.isAnnotationPresent(annotationClass)) { 
                            if (!field.isAccessible()) { 
                                field.setAccessible(true); 
                            } 
                            foundFields.add(field); 
                        } 
                    } 
                    nextSource = nextSource.getSuperclass(); 
                } 
                return foundFields; 
            } 
        }); 
        return declaredAccessableFields; 
    } 
}