KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > cs > ClassMetaHelper


1 /* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com
2
3 This file is part of the db4o open source object database.
4
5 db4o is free software; you can redistribute it and/or modify it under
6 the terms of version 2 of the GNU General Public License as published
7 by the Free Software Foundation and as clarified by db4objects' GPL
8 interpretation policy, available at
9 http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
10 Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
11 Suite 350, San Mateo, CA 94403, USA.
12
13 db4o is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

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 JavaDoc 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             // TODO: need to handle NArray, currently it ignores NArray and alway sets NArray flag false.
78
fieldsMeta[i] = new FieldMeta(field.getName(), getClassMeta(fieldClass), isPrimitive, isArray, false);
79         }
80         return fieldsMeta;
81     }
82
83     private static boolean isSystemClass(String JavaDoc className) {
84         // TODO: We should send the whole class meta if we'd like to support
85
// java and .net communication (We have this request in our user forum
86
// http://developer.db4o.com/forums/thread/31504.aspx). If we only want
87
// to support java & .net platform separately, then this method should
88
// be moved to Platform4.
89
return className.startsWith("java");
90     }
91
92     private ClassMeta lookupClassMeta(String JavaDoc className) {
93         return (ClassMeta) _classMetaTable.get(className);
94     }
95
96     private void registerClassMeta(String JavaDoc 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 JavaDoc className = classMeta.getClassName();
107         // look up from generic class table.
108
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 JavaDoc 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 JavaDoc className) {
141         return (GenericClass) _genericClassTable.get(className);
142     }
143
144     private void registerGenericClass(String JavaDoc className, GenericClass classMeta) {
145         _genericClassTable.put(className, classMeta);
146     }
147
148 }
149
Popular Tags