1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.datadictionary.validation;
17
18 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
19 import org.kuali.rice.krad.datadictionary.DataDictionaryEntry;
20 import org.kuali.rice.krad.datadictionary.DataDictionaryEntryBase;
21 import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
22 import org.kuali.rice.krad.datadictionary.validation.capability.Constrainable;
23 import org.springframework.beans.BeanWrapper;
24 import org.springframework.beans.BeanWrapperImpl;
25 import org.springframework.beans.NullValueInNestedPathException;
26
27 import java.beans.PropertyDescriptor;
28 import java.util.ArrayList;
29 import java.util.List;
30
31
32
33
34
35
36
37 public class DictionaryObjectAttributeValueReader extends BaseAttributeValueReader {
38
39 protected Object object;
40 protected DataDictionaryEntry entry;
41
42 protected BeanWrapper beanWrapper;
43
44 private String attributePath;
45
46 public DictionaryObjectAttributeValueReader(Object object, String entryName, DataDictionaryEntry entry) {
47 this.object = object;
48 this.entry = entry;
49 this.entryName = entryName;
50
51 if (object != null){
52 beanWrapper = new BeanWrapperImpl(object);
53 }
54 }
55
56 public DictionaryObjectAttributeValueReader(Object object, String entryName, DataDictionaryEntry entry, String attributePath) {
57 this(object, entryName, entry);
58 this.attributePath = attributePath;
59 }
60
61 @Override
62 public Constrainable getDefinition(String attrName) {
63 return entry != null ? entry.getAttributeDefinition(attrName) : null;
64 }
65
66 @Override
67 public List<Constrainable> getDefinitions() {
68 if (entry instanceof DataDictionaryEntryBase) {
69 DataDictionaryEntryBase entryBase = (DataDictionaryEntryBase)entry;
70 List<Constrainable> definitions = new ArrayList<Constrainable>();
71 List<AttributeDefinition> attributeDefinitions = entryBase.getAttributes();
72 definitions.addAll(attributeDefinitions);
73 return definitions;
74 }
75
76 return null;
77 }
78
79 @Override
80 public Constrainable getEntry() {
81 if (entry instanceof Constrainable)
82 return (Constrainable) entry;
83
84 return null;
85 }
86
87 @Override
88 public String getLabel(String attrName) {
89 AttributeDefinition attributeDefinition = entry != null ? entry.getAttributeDefinition(attrName) : null;
90 return attributeDefinition != null ? attributeDefinition.getLabel() : attrName;
91 }
92
93 @Override
94 public Object getObject() {
95 return this.object;
96 }
97
98 @Override
99 public String getPath() {
100 String path = ValidationUtils.buildPath(attributePath, attributeName);
101 return path != null ? path : "";
102 }
103
104 @Override
105 public Class<?> getType(String attrName) {
106 PropertyDescriptor propertyDescriptor = beanWrapper.getPropertyDescriptor(attrName);
107
108 return propertyDescriptor.getPropertyType();
109 }
110
111 @SuppressWarnings("unchecked")
112 @Override
113 public <X> X getValue() throws AttributeValidationException {
114 Object value = getValue(attributeName);
115 return (X) value;
116 }
117
118 @SuppressWarnings("unchecked")
119 @Override
120 public <X> X getValue(String attrName) throws AttributeValidationException {
121 X attributeValue = null;
122
123 Exception e = null;
124 try {
125 attributeValue = (X) beanWrapper.getPropertyValue(attrName);
126
127 } catch (IllegalArgumentException iae) {
128 e = iae;
129 } catch (NullValueInNestedPathException nvinp){
130
131 }
132
133 if (e != null)
134 throw new AttributeValidationException("Unable to lookup attribute value by name (" + attrName + ") using introspection", e);
135
136
137
138
139
140
141
142
143
144
145 return attributeValue;
146 }
147 }