/******************************************************************************* * Copyright 2013 SAP AG * * 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 com.sap.core.odata.testutil.helper; import java.io.File; import java.io.FileFilter; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * @author SAP AG */ public class ClassHelper { public static final FileFilter JAVA_FILE_FILTER = new FileFilter() { @Override public boolean accept(final File path) { return path.isFile() && path.getName().toLowerCase(Locale.ROOT).endsWith("class"); } }; public static final String CLASS_FILE_ENDING = ".class"; private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0]; private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; /** * * @param exClasses */ public static <T> List<T> getClassInstances(final List<Class<T>> exClasses) { return getClassInstances(exClasses, EMPTY_CLASS_ARRAY, EMPTY_OBJECT_ARRAY); } /** * * @param exClasses * @param ctorParameters */ public static <T> List<T> getClassInstances(final List<Class<T>> exClasses, final Object... ctorParameters) { final List<Class<?>> ctorParameterClasses = new ArrayList<Class<?>>(); for (final Object object : ctorParameters) { ctorParameterClasses.add(object.getClass()); } return getClassInstances(exClasses, ctorParameterClasses.toArray(new Class<?>[0]), ctorParameters); } /** * @param exClasses * @param ctorParameterClasses * @param ctorParameters */ public static <T> List<T> getClassInstances(final List<Class<T>> exClasses, final Class<?>[] ctorParameterClasses, final Object[] ctorParameters) { final List<T> toTestExceptions = new ArrayList<T>(); for (final Class<T> clazz : exClasses) { if (isNotAbstractOrInterface(clazz)) { Constructor<T> ctor; try { ctor = clazz.getConstructor(ctorParameterClasses); final T ex = ctor.newInstance(ctorParameters); toTestExceptions.add(ex); } catch (final SecurityException e) { continue; } catch (final NoSuchMethodException e) { continue; } catch (final IllegalArgumentException e) { continue; } catch (final InstantiationException e) { continue; } catch (final IllegalAccessException e) { continue; } catch (final InvocationTargetException e) { continue; } } } return toTestExceptions; } /** * @param clazz */ public static boolean isNotAbstractOrInterface(final Class<?> clazz) { return !Modifier.isAbstract(clazz.getModifiers()) && !Modifier.isInterface(clazz.getModifiers()); } /** * @param packageName * @param assignableToClass */ public static <T> List<Class<T>> getAssignableClasses(final String packageName, final Class<T> assignableToClass) { final List<Class<T>> foundClasses = new ArrayList<Class<T>>(); final URL url = Thread.currentThread().getContextClassLoader().getResource(packageName.replace(".", "/")); final File path = new File(url.getPath()); if (path.exists()) { final File[] javaFiles = path.listFiles(JAVA_FILE_FILTER); for (final File file : javaFiles) { final Class<T> clazz = getClass(file, packageName, assignableToClass); if (clazz != null) { foundClasses.add(clazz); } } } return foundClasses; } /** * @param file * @param packageName * @param clazz */ public static <T> Class<T> getClass(final File file, final String packageName, final Class<T> clazz) { String className = file.getName(); if (className.endsWith(CLASS_FILE_ENDING)) { className = className.substring(0, className.length() - CLASS_FILE_ENDING.length()); } return getClass(packageName + "." + className, clazz); } /** * @param className * @param clazz */ @SuppressWarnings("unchecked") public static <T> Class<T> getClass(final String className, final Class<T> clazz) { try { final Class<?> clazzForName = Class.forName(className); if (clazz.isAssignableFrom(clazzForName)) { return (Class<T>) clazzForName; } } catch (final ClassNotFoundException e) { return null; } return null; } }