1 21 package com.db4o.cs; 22 23 import com.db4o.foundation.Hashtable4; 24 import com.db4o.reflect.ReflectClass; 25 import com.db4o.reflect.ReflectField; 26 import com.db4o.reflect.generic.GenericClass; 27 import com.db4o.reflect.generic.GenericField; 28 import com.db4o.reflect.generic.GenericReflector; 29 30 public class ClassMetaHelper { 31 32 private Hashtable4 _classMetaTable = new Hashtable4(); 33 34 private Hashtable4 _genericClassTable = new Hashtable4(); 35 36 public ClassMeta getClassMeta(ReflectClass claxx) { 37 38 String className = claxx.getName(); 39 if (isSystemClass(className)) { 40 return ClassMeta.newSystemClass(className); 41 } 42 43 ClassMeta existing = lookupClassMeta(className); 44 if (existing != null) { 45 return existing; 46 } 47 48 return newUserClassMeta(claxx); 49 } 50 51 private ClassMeta newUserClassMeta(ReflectClass claxx) { 52 53 ClassMeta classMeta = ClassMeta.newUserClass(claxx.getName()); 54 classMeta.setSuperClass(mapSuperclass(claxx)); 55 56 registerClassMeta(claxx.getName(), classMeta); 57 58 classMeta.setFields(mapFields(claxx.getDeclaredFields())); 59 return classMeta; 60 } 61 62 private ClassMeta mapSuperclass(ReflectClass claxx) { 63 ReflectClass superClass = claxx.getSuperclass(); 64 if (superClass != null) { 65 return getClassMeta(superClass); 66 } 67 return null; 68 } 69 70 private FieldMeta[] mapFields(ReflectField[] fields) { 71 FieldMeta[] fieldsMeta = new FieldMeta[fields.length]; 72 for (int i = 0; i < fields.length; ++i) { 73 final ReflectField field = fields[i]; 74 boolean isArray = field.getFieldType().isArray(); 75 ReflectClass fieldClass = isArray ? field.getFieldType().getComponentType() : field.getFieldType(); 76 boolean isPrimitive = fieldClass.isPrimitive(); 77 fieldsMeta[i] = new FieldMeta(field.getName(), getClassMeta(fieldClass), isPrimitive, isArray, false); 79 } 80 return fieldsMeta; 81 } 82 83 private static boolean isSystemClass(String className) { 84 return className.startsWith("java"); 90 } 91 92 private ClassMeta lookupClassMeta(String className) { 93 return (ClassMeta) _classMetaTable.get(className); 94 } 95 96 private void registerClassMeta(String className, ClassMeta classMeta) { 97 _classMetaTable.put(className, classMeta); 98 } 99 100 public GenericClass classMetaToGenericClass(GenericReflector reflector, 101 ClassMeta classMeta) { 102 if (classMeta.isSystemClass()) { 103 return (GenericClass) reflector.forName(classMeta.getClassName()); 104 } 105 106 String className = classMeta.getClassName(); 107 GenericClass genericClass = lookupGenericClass(className); 109 if (genericClass != null) { 110 return genericClass; 111 } 112 113 GenericClass genericSuperClass = null; 114 ClassMeta superClassMeta = classMeta.getSuperClass(); 115 if (superClassMeta != null) { 116 genericSuperClass = classMetaToGenericClass(reflector, 117 superClassMeta); 118 } 119 120 genericClass = new GenericClass(reflector, null, className, 121 genericSuperClass); 122 registerGenericClass(className, genericClass); 123 124 FieldMeta[] fields = classMeta.getFields(); 125 GenericField[] genericFields = new GenericField[fields.length]; 126 127 for (int i = 0; i < fields.length; ++i) { 128 ClassMeta fieldClassMeta = fields[i].getFieldClass(); 129 String fieldName = fields[i].getFieldName(); 130 GenericClass genericFieldClass = classMetaToGenericClass(reflector, 131 fieldClassMeta); 132 genericFields[i] = new GenericField(fieldName, genericFieldClass, 133 fields[i]._isPrimitive, fields[i]._isArray, fields[i]._isNArray); 134 } 135 136 genericClass.initFields(genericFields); 137 return genericClass; 138 } 139 140 private GenericClass lookupGenericClass(String className) { 141 return (GenericClass) _genericClassTable.get(className); 142 } 143 144 private void registerGenericClass(String className, GenericClass classMeta) { 145 _genericClassTable.put(className, classMeta); 146 } 147 148 } 149 | Popular Tags |