View Javadoc

1   /*
2    * Copyright 2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 1.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl1.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * This class allows a dictionary object to expose information about its fields / attributes, including the values of
33   * those fields, with some guidance from the DataDictionaryEntry object. 
34   * 
35   * @author Kuali Rice Team (rice.collab@kuali.org) 
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 			//just return null
131 		}
132 		
133 		if (e != null)
134 			throw new AttributeValidationException("Unable to lookup attribute value by name (" + attrName + ") using introspection", e);
135 		
136 		
137 		//			JLR : KS has code to handle dynamic attributes -- not sure whether this is really needed anymore if we're actually relying on types
138 		//            // Extract dynamic attributes
139 		//            if(DYNAMIC_ATTRIBUTE.equals(propName)) {
140 		//                dataMap.putAll((Map<String, String>)value);
141 		//            } else {
142 		//				dataMap.put(propName, value);
143 		//            }
144 		
145 		return attributeValue;
146 	}
147 }