View Javadoc

1   package org.sourceforge.jemm.client;
2   
3   import java.lang.reflect.Field;
4   import java.util.ArrayList;
5   import java.util.Arrays;
6   import java.util.HashSet;
7   import java.util.List;
8   import java.util.Set;
9   
10  import org.sourceforge.jemm.database.ClassInfo;
11  import org.sourceforge.jemm.database.FieldInfo;
12  import org.sourceforge.jemm.database.FieldType;
13  import org.sourceforge.jemm.util.JEMMObject;
14  
15  /**
16   * Extracts meta data structure out of a JEMMObject.
17   * 
18   * @author Paul Keeble
19   *
20   */
21  public class ClassMetadata {
22  	Class<?> clazz;
23  	
24  	public ClassMetadata(JEMMObject obj) {
25  		this.clazz = obj.getClass();
26  	}
27  	
28  	public ClassMetadata(Class<?> clazz) {
29  		this.clazz = clazz;
30  	}
31  
32  	/**
33  	 * Returns the FieldInfo for any named field.
34  	 * 
35  	 * @param fieldName
36  	 * @return
37  	 * @throws NoSuchFieldException
38  	 * @throws SecurityException
39  	 */
40  	public FieldInfo getFieldInfo(String name) {
41  		return getFieldInfo(getObjectClass(), name);
42  	}
43  	
44  	/**
45  	 * Determines the Objects Class.
46  	 * 
47  	 * @return The Objects class
48  	 */
49  	public Class<?> getObjectClass() {
50  		return clazz;
51  	}
52  
53  	/**
54  	 * 
55  	 * @param c
56  	 * @param name
57  	 * @return
58  	 */
59  	FieldInfo getFieldInfo(Class<?> c, String name) {
60  		try {
61  			Field f = c.getDeclaredField(name);
62  			f.setAccessible(true);
63  
64  			return new FieldInfo(name, c.getName(), FieldType.convert(f
65  					.getType()));
66  		} catch (Exception e) {
67  			throw new RuntimeException(e);
68  		}
69  	}
70  	
71  	/**
72  	 * Iterates all the Fields within the class of the object referenced and
73  	 * filters out any JEMM enhanced added ones.
74  	 * 
75  	 * @return The Info for the Fields.
76  	 */
77  	public FieldInfo[] getStoredFields() {
78  		return getStoredFields(getObjectClass());
79  	}
80  
81  	FieldInfo[] getStoredFields(Class<?> c) {
82  		FieldIterator fi = new FieldIterator(c,new AllStoredFieldsFilter());
83  		List<FieldInfo> fieldInfos = new ArrayList<FieldInfo>();
84  		for(Field f : fi) {
85  			fieldInfos.add(convertField(f));
86  		}
87  		
88  		return fieldInfos.toArray(new FieldInfo[fieldInfos.size()]);
89  	}
90  	
91  	private FieldInfo convertField(Field field) {
92  		Class<?> fieldClass = field.getType();
93  		Class<?> declaringClass = field.getDeclaringClass();
94  		return new FieldInfo(field.getName(), declaringClass.getName(),
95  				FieldType.convert(fieldClass));
96  	}
97  
98  	/**
99  	 * Gathers together all the Class data on its active fields and 
100 	 * produces an overall meta structure summary.
101 	 * 
102 	 * @return The classInfo for the class of the object referenced.
103 	 */
104 	public ClassInfo getClassInfo() {
105 		FieldInfo[] fields = getStoredFields();
106 		Set<FieldInfo> fieldsSet = new HashSet<FieldInfo>(Arrays.asList(fields));
107 		ClassInfo ci = new ClassInfo(getObjectClass().getName(), fieldsSet);
108 		return ci;
109 	}
110 }