001 package org.kuali.student.common.dictionary.service.impl;
002
003
004 import java.beans.BeanInfo;
005 import java.beans.IntrospectionException;
006 import java.beans.Introspector;
007 import java.beans.PropertyDescriptor;
008 import java.lang.reflect.ParameterizedType;
009 import java.util.Date;
010 import java.util.LinkedHashSet;
011 import java.util.List;
012 import java.util.Set;
013
014 import org.kuali.student.common.dto.MetaInfo;
015
016 public class ComplexSubstructuresHelper
017 {
018
019
020 public Set<String> getComplexStructures (String className)
021 {
022 Set<String> complexStructures = new LinkedHashSet<String> ();
023 loadComplexStructures (className, complexStructures);
024 return complexStructures;
025 }
026
027 private void loadComplexStructures (String className,
028 Set<String> complexStructures)
029 {
030 if ( ! complexStructures.add (className))
031 {
032 return;
033 }
034 BeanInfo beanInfo;
035 Class<?> clazz;
036 try
037 {
038 clazz = Class.forName (className);
039 }
040 catch (ClassNotFoundException ex)
041 {
042 System.out.println ("ComplexSubstructuresHelper: Could not process because the class must be a freestanding object: " + className);
043 return;
044 }
045 try
046 {
047 beanInfo = Introspector.getBeanInfo (clazz);
048 }
049 catch (IntrospectionException ex)
050 {
051 throw new RuntimeException (ex);
052 }
053 for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors ())
054 {
055 Class<?> subClass = pd.getPropertyType ();
056 if (List.class.equals (subClass))
057 {
058 try
059 {
060 subClass =
061 (Class<?>) ((ParameterizedType) clazz.getDeclaredField (
062 pd.getName ()).getGenericType ()).getActualTypeArguments ()[0];
063 }
064 catch (NoSuchFieldException ex)
065 {
066 throw new RuntimeException (ex);
067 }
068 catch (SecurityException ex)
069 {
070 throw new RuntimeException (ex);
071 }
072 }
073 if ( ! MetaInfo.class.equals (subClass)
074 && ! Class.class.equals (subClass)
075 && ! String.class.equals (subClass)
076 && ! Integer.class.equals (subClass)
077 && ! Long.class.equals (subClass)
078 && ! Boolean.class.equals (subClass)
079 && ! boolean.class.equals (subClass)
080 && ! int.class.equals (subClass)
081 && ! long.class.equals (subClass)
082 && ! Double.class.equals (subClass)
083 && ! Float.class.equals (subClass)
084 && ! Date.class.equals (subClass)
085 && ! DictionaryConstants.ATTRIBUTES.equals (pd.getName ())
086 && ! Enum.class.isAssignableFrom (subClass)
087 && ! Object.class.equals (subClass))
088 {
089 loadComplexStructures (subClass.getName (), complexStructures);
090 }
091 }
092 }
093
094
095 }