View Javadoc

1   /*
2    * DefaultObjectDescriptorRegistry.java
3    * Created on 29 Август 2005 г., 14:59
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 }