/** * Copyright (C) 2010 Michael Mosmann <michael@mosmann.de> * * 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 de.flapdoodle.mongoom.mapping.converter.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import de.flapdoodle.mongoom.annotations.MappedSuperclass; import de.flapdoodle.mongoom.exceptions.MappingException; public class ClassInformation { private ClassInformation() { } public static <Bean> Bean newInstance(Class<Bean> viewClass) { try { Constructor<Bean> defaultConstrutor = getConstructor(viewClass); return defaultConstrutor.newInstance(); } catch (InstantiationException e) { throw new MappingException(viewClass, e); } catch (IllegalAccessException e) { throw new MappingException(viewClass, e); } catch (SecurityException e) { throw new MappingException(viewClass, e); } catch (IllegalArgumentException e) { throw new MappingException(viewClass, e); } catch (InvocationTargetException e) { throw new MappingException(viewClass, e); } } public static <T> Constructor<T> getConstructor(Class<T> entityClass) { try { for (Constructor c : entityClass.getDeclaredConstructors()) { if (c.getParameterTypes().length == 0) { c.setAccessible(true); return c; } } } catch (SecurityException e) { throw new MappingException(entityClass, "getConstructor()", e); } throw new MappingException(entityClass, "No default Constuctor"); } public static List<Field> getFields(Class<?> entityClass) { return getFields(entityClass, null); } public static Map<String, Field> getFieldMap(List<Field> fields) { LinkedHashMap<String, Field> ret = Maps.newLinkedHashMap(); for (Field f : fields) { ret.put(f.getName(), f); } return ret; } public static List<Field> getFields(Class<?> entityClass, Set<String> filter) { List<Field> ret = Lists.newArrayList(); Class<?> superclass = entityClass.getSuperclass(); if ((superclass!=null) && (superclass.getAnnotation(MappedSuperclass.class) != null)) { ret.addAll(getFields(superclass, filter)); } Field[] declaredFields = entityClass.getDeclaredFields(); for (Field f : declaredFields) { if ((filter == null) || (filter.contains(f.getName()))) { int modifier = f.getModifiers(); if (!Modifier.isStatic(modifier)) { ret.add(f); } } } return ret; } public static <T> List<Method> getMethods(Class<? super T> entityClass) { List<Method> ret = Lists.newArrayList(); Class<? super T> superclass = entityClass.getSuperclass(); if (superclass.getAnnotation(MappedSuperclass.class) != null) { ret.addAll(getMethods(superclass)); } Method[] declaredFields = entityClass.getDeclaredMethods(); for (Method f : declaredFields) { int modifier = f.getModifiers(); if (!Modifier.isStatic(modifier)) { ret.add(f); } } return ret; } }