1 21 package com.db4o.config.annotations.reflect; 22 23 import java.lang.annotation.Annotation ; 24 import java.lang.reflect.AnnotatedElement ; 25 import java.lang.reflect.Field ; 26 import java.util.HashMap ; 27 import java.util.Map ; 28 29 import com.db4o.Config4Class; 30 import com.db4o.config.Configuration; 31 import com.db4o.config.annotations.CalledConstructor; 32 import com.db4o.config.annotations.GeneratedUUIDs; 33 import com.db4o.config.annotations.GeneratedVersionNumbers; 34 import com.db4o.config.annotations.Indexed; 35 import com.db4o.config.annotations.PersistedStaticFieldValues; 36 import com.db4o.config.annotations.StoredTransientFields; 37 import com.db4o.config.annotations.UpdatedDepth; 38 39 44 public class ConfigurationIntrospector { 45 46 Map <Class <? extends Annotation >, Db4oConfiguratorFactory> _configurators; 47 48 Config4Class _classConfig; 49 50 Class _clazz; 51 52 Configuration _config; 53 54 public ConfigurationIntrospector(Class clazz, Configuration config, 55 Config4Class classConfig) throws Exception { 56 this._classConfig = classConfig; 57 this._clazz = clazz; 58 this._config = config; 59 60 initMap(); 61 } 62 63 private void initMap() throws NoSuchMethodException { 64 _configurators = new HashMap <Class <? extends Annotation >, Db4oConfiguratorFactory>(); 65 _configurators.put(UpdatedDepth.class, new UpdatedDepthFactory()); 66 _configurators.put(Indexed.class, new NoArgsFieldConfiguratorFactory( 67 IndexedConfigurator.class)); 68 _configurators.put(CalledConstructor.class, new CalledConstructorFactory()); 69 _configurators.put(GeneratedUUIDs.class, 70 new GeneratedUUIDsFactory()); 71 _configurators.put(GeneratedVersionNumbers.class, 72 new GeneratedVersionNumbersFactory()); 73 _configurators.put(StoredTransientFields.class, 74 new StoredTransientFieldsFactory()); 75 _configurators.put(PersistedStaticFieldValues.class, 76 new PersistedStaticFieldValuesFactory()); 77 } 78 79 87 public Config4Class apply() { 88 try { 89 reflectClass(); 90 reflectFields(); 91 92 } catch (SecurityException e) { 93 e.printStackTrace(); 94 } 95 return _classConfig; 96 } 97 98 private void reflectClass() { 99 Annotation [] annotations = _clazz.getAnnotations(); 100 for (Annotation a : annotations) { 101 applyAnnotation(_clazz, a); 102 } 103 } 104 105 private void reflectFields() { 106 107 Field [] declaredFields; 108 try { 109 declaredFields = _clazz.getDeclaredFields(); 110 for (Field f : declaredFields) { 111 for (Annotation a : f.getAnnotations()) { 112 applyAnnotation(f, a); 113 } 114 } 115 } catch (SecurityException e) { 116 e.printStackTrace(); 117 } 118 } 119 120 private void applyAnnotation(AnnotatedElement element, Annotation a) { 121 if (_configurators.containsKey(a.annotationType())) { 122 Db4oConfigurator configurator = _configurators.get( 123 a.annotationType()).configuratorFor(element, a); 124 _classConfig = (Config4Class) configurator.configure(_config); 125 } 126 } 127 } 128 | Popular Tags |