py.una.pol.karaku.test.util.TestUtils.java Source code

Java tutorial

Introduction

Here is the source code for py.una.pol.karaku.test.util.TestUtils.java

Source

/*-
 * Copyright (c)
 *
 *       2012-2014, Facultad Politcnica, Universidad Nacional de Asuncin.
 *       2012-2014, Facultad de Ciencias Mdicas, Universidad Nacional de Asuncin.
 *       2012-2013, Centro Nacional de Computacin, Universidad Nacional de Asuncin.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301  USA
 */
package py.una.pol.karaku.test.util;

import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.persistence.Entity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.GenericCollectionTypeResolver;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldCallback;
import org.springframework.util.ReflectionUtils.FieldFilter;
import py.una.pol.karaku.exception.KarakuRuntimeException;
import py.una.pol.karaku.test.test.util.layers.TestEntity;

/**
 * Provee utilidades para los test.
 * 
 * @author Arturo Volpe
 * @since 2.2
 * @version 1.0 Sep 10, 2013
 * 
 */
public class TestUtils {

    private static final Logger LOG = LoggerFactory.getLogger(TestUtils.class);

    /**
     * Retorna un vector de elementos a partir de una lista de los mismos.
     * 
     * @param elements
     *            de clase T
     * @return T[]
     */
    public static <T> T[] getAsArray(T... elements) {

        return elements;
    }

    /**
     * Retorna un vector de clases a partir de una lista de los mismos.
     * 
     * @param elements
     *            del tipo Class
     * @return Class<?>[]
     */
    public static Class<?>[] getAsClassArray(Class<?>... elements) {

        return elements;
    }

    /**
     * Retorna la lista de entidades relacionadas a una base.
     * 
     * @param base
     *            entidad base
     * @return array con todas las entidades que se pueden acceder desde base.
     */
    public static Class<?>[] getReferencedClasses(Class<?> base) {

        LOG.info("Scanning for classes with relations with '{}'", base.getName());
        Set<Class<?>> result = getReferencedClasses(base, new HashSet<Class<?>>(10));
        result.add(base);
        for (Class<?> c : result) {
            LOG.info("Found class {} ", c.getSimpleName());
        }
        LOG.info("Found '{}' classes with relations with '{}'", result.size(), base.getSimpleName());
        return result.toArray(new Class<?>[result.size()]);
    }

    /**
     * Verificacin de orden de una lista.
     * 
     * Determinan si una lista tiene las descripciones pasadas en el orden
     * adecuado.
     * 
     * @param list
     *            lista de entidades
     * @param descriptions
     *            descripciones, la entidad n debe tener la descripcin
     */
    public static void checkOrder(List<TestEntity> list, String... descriptions) {

        for (int i = 0; i < descriptions.length; i++) {
            assertEquals("Fail at index " + i, descriptions[i], list.get(i).getDescription());
        }
    }

    /**
     * Determina si dos colecciones son iguales.
     * 
     * <p>
     * Este mtodo es similar a {@link java.util.AbstractList#equals(Object)}
     * solamente que realiza una comparacin de longitud para ser ms rapido.
     * 
     * </p>
     * 
     * @param l1
     *            coleccin ejemplo
     * @param l2
     *            coleccin con la que comparar
     * @return <code>true</code> s y solamente s, tienen el mismo tamao,
     *         ambas son <code>null</code>, o todos sus elementos son iguales
     *         (de acuerdo al mtodo equals).
     */
    public static <T> boolean comparareCollections(Collection<T> l1, Collection<T> l2) {

        if ((l1 == null) && (l2 == null)) {
            return true;
        }
        if ((l1 == null) || (l2 == null)) {
            return false;
        }
        if (l1.size() != l2.size()) {
            return false;
        }
        Iterator<T> e1 = l1.iterator();
        Iterator<T> e2 = l2.iterator();
        while (e1.hasNext() && e2.hasNext()) {
            T o1 = e1.next();
            T o2 = e2.next();
            if (!(o1 == null ? o2 == null : o1.equals(o2))) {
                return false;
            }
        }
        return !(e1.hasNext() || e2.hasNext());
    }

    /**
     * Retorna la lista de entidades relacionadas a una base.
     * 
     * @param base
     *            entidad base
     * @return array con todas las entidades que se pueden acceder desde base.
     */
    public static Class<?>[] getReferencedClasses(Class<?>... base) {

        LOG.info("Scanning for classes with relations with '{}'", base);
        Set<Class<?>> result = new HashSet<Class<?>>(10);
        for (Class<?> clasz : base) {
            result.add(clasz);
            getReferencedClasses(clasz, result);
        }
        LOG.info("Found '{}' classes with relations with '{}'", result.size(), base);
        return result.toArray(new Class<?>[result.size()]);
    }

    private static Set<Class<?>> getReferencedClasses(Class<?> base, final Set<Class<?>> elements) {

        ReflectionUtils.doWithFields(base, new FieldCallback() {

            @Override
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {

                if (elements.add(getType(field))) {
                    getReferencedClasses(getType(field), elements);
                }
            }
        }, new FieldFilter() {

            @Override
            public boolean matches(Field field) {

                return AnnotationUtils.findAnnotation(getType(field), Entity.class) != null;
            }
        });

        return elements;
    }

    private static Class<?> getType(Field field) {

        Class<?> toRet = field.getType();
        // Si tenemos una lista, buscar el tipo de la lista.
        if (Collection.class.isAssignableFrom(toRet)) {
            toRet = GenericCollectionTypeResolver.getCollectionFieldType(field);
        }
        return toRet;
    }

    /**
     * Retorna el path de un recurso que existe, es hermano de la clase pasada o
     * es un path absoluto.
     * 
     * <p>
     * Si no existe se lanza una excepcin.
     * </p>
     * 
     * @param source
     *            Clase de dondese invoca
     * @param fileName
     *            nombre del archivo
     * @return ClassPath vlido
     * @throws KarakuRuntimeException
     *             si no se encuentra el archivo
     */
    public static String getSiblingResourceName(Class<?> source, String resourceName) {

        return getSiblingResource(source, resourceName).getPath();
    }

    /**
     * Retorna un recurso, que se supone esta en la misma ubicacin que la
     * clase.
     * 
     * @param source
     *            Clase de dondese invoca
     * @param fileName
     *            nombre del archivo
     * @return ClassPath vlido
     * @throws KarakuRuntimeException
     *             si no se encuentra el archivo
     */
    public static ClassPathResource getSiblingResource(Class<?> source, String resourceName) {

        ClassPathResource cpr = new ClassPathResource(resourceName);
        if (cpr.exists()) {
            return cpr;
        }

        String realPath = source.getPackage().getName().replaceAll("\\.", "/");
        realPath += "/" + resourceName;
        cpr = new ClassPathResource(realPath);

        if (!cpr.exists()) {
            throw new KarakuRuntimeException("File with name " + resourceName
                    + " can not be found. Paths tried: Absolute:" + resourceName + "; Relative: " + realPath);
        }
        return cpr;
    }
}