1
2
3
4
5
6 package org.weda.property.impl;
7
8 import java.lang.annotation.Annotation;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12 import org.apache.commons.logging.Log;
13 import org.weda.converter.ValueTypeConverter;
14 import org.weda.enhance.InjectMessages;
15 import org.weda.message.Messages;
16 import org.weda.property.ConstraintsFactory;
17 import org.weda.property.ObjectDescriptorRegistryException;
18 import org.weda.property.PropertyDescriptor;
19 import org.weda.property.ObjectDescriptorRegistry;
20
21 /**
22 *
23 * @author tim
24 */
25 public class ObjectDescriptorRegistryImpl implements ObjectDescriptorRegistry {
26 private Log log;
27 private ValueTypeConverter converter;
28 private Map<Class, ObjectDescriptor> descriptors =
29 new HashMap<Class, ObjectDescriptor>();
30
31 @InjectMessages private Messages messages;
32
33 public void init() throws ObjectDescriptorRegistryException{
34 try{
35 for (ObjectDescriptor descriptor: descriptors.values())
36 initObjectDescriptor(descriptor);
37 } catch (Exception ex) {
38 throw new ObjectDescriptorRegistryException(
39 "Can't initialize object descriptor registry"
40 , ex);
41 }
42 }
43
44 private void initObjectDescriptor(ObjectDescriptor desc)
45 throws ObjectDescriptorException
46 {
47 desc.init();
48 }
49
50 public void setDescriptors(Map<Class, ObjectDescriptor> descriptors){
51 this.descriptors.putAll(descriptors);
52 }
53
54 public ObjectDescriptor get(Class objectClass)
55 throws ObjectDescriptorRegistryException
56 {
57 try {
58 ObjectDescriptor desc = descriptors.get(objectClass);
59 if (desc == null){
60 desc = new ObjectDescriptor();
61 desc.setObjectClass(objectClass);
62 initObjectDescriptor(desc);
63 descriptors.put(objectClass, desc);
64 }
65 return desc;
66 } catch (ObjectDescriptorException ex) {
67 throw new ObjectDescriptorRegistryException(
68 String.format(
69 "Can't get object descriptor for class (%s)"
70 , objectClass.getName())
71 , ex);
72 }
73 }
74
75 public void setLog(Log log) {
76 this.log = log;
77 }
78
79 public PropertyDescriptor getPropertyDescriptor (
80 Class baseClass, String propertyPath)
81 throws ObjectDescriptorRegistryException
82 {
83 try {
84 String[] propertyNames = propertyPath.split("\\.");
85 ObjectDescriptor desc = get(baseClass);
86 for (int i=0; i<propertyNames.length-1; i++){
87 String name=propertyNames[i];
88 PropertyDescriptor pdesc = desc.getPropertyDescriptor(name);
89 desc=get(desc.getPropertyDescriptor(name).getPropertyClass());
90 }
91 return desc.getPropertyDescriptor(
92 propertyNames[propertyNames.length-1]);
93 } catch (Exception ex) {
94 throw new ObjectDescriptorRegistryException(
95 String.format(
96 "Can't get property descriptor for property path (%s) " +
97 "and base class (%s)"
98 , propertyPath, baseClass.getName())
99 , ex);
100 }
101 }
102
103 }