Coverage Report - org.kuali.rice.krad.datadictionary.validation.DictionaryObjectAttributeValueReader
 
Classes in this File Line Coverage Branch Coverage Complexity
DictionaryObjectAttributeValueReader
55%
22/40
37%
6/16
2.182
 
 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  35
         public DictionaryObjectAttributeValueReader(Object object, String entryName, DataDictionaryEntry entry) {
 47  35
                 this.object = object;
 48  35
                 this.entry = entry;
 49  35
                 this.entryName = entryName;
 50  
 
 51  35
                 if (object != null){
 52  35
                         beanWrapper = new BeanWrapperImpl(object);
 53  
                 }                
 54  35
         }
 55  
         
 56  
         public DictionaryObjectAttributeValueReader(Object object, String entryName, DataDictionaryEntry entry, String attributePath) {
 57  0
                 this(object, entryName, entry);
 58  0
                 this.attributePath = attributePath;
 59  0
         }
 60  
         
 61  
         @Override
 62  
         public Constrainable getDefinition(String attrName) {
 63  6
                 return entry != null ? entry.getAttributeDefinition(attrName) : null;
 64  
         }
 65  
         
 66  
         @Override
 67  
         public List<Constrainable> getDefinitions() {
 68  0
                 if (entry instanceof DataDictionaryEntryBase) {
 69  0
                         DataDictionaryEntryBase entryBase = (DataDictionaryEntryBase)entry;
 70  0
                         List<Constrainable> definitions = new ArrayList<Constrainable>();
 71  0
                         List<AttributeDefinition> attributeDefinitions = entryBase.getAttributes();
 72  0
                         definitions.addAll(attributeDefinitions);
 73  0
                         return definitions;
 74  
                 }
 75  
                 
 76  0
                 return null;
 77  
         }
 78  
         
 79  
         @Override
 80  
         public Constrainable getEntry() {
 81  0
                 if (entry instanceof Constrainable)
 82  0
                         return (Constrainable) entry;
 83  
                         
 84  0
                 return null;
 85  
         }
 86  
         
 87  
         @Override
 88  
         public String getLabel(String attrName) {
 89  9
                 AttributeDefinition attributeDefinition = entry != null ? entry.getAttributeDefinition(attrName) : null;
 90  9
                 return attributeDefinition != null ? attributeDefinition.getLabel()  : attrName;
 91  
         }
 92  
 
 93  
         @Override
 94  
         public Object getObject() {
 95  0
                 return this.object;
 96  
         }
 97  
         
 98  
         @Override
 99  
         public String getPath() {
 100  24
                 String path = ValidationUtils.buildPath(attributePath, attributeName);
 101  24
                 return path != null ? path : "";
 102  
         }
 103  
 
 104  
         @Override
 105  
         public Class<?> getType(String attrName) {
 106  4
                 PropertyDescriptor propertyDescriptor = beanWrapper.getPropertyDescriptor(attrName);
 107  
                 
 108  4
                 return propertyDescriptor.getPropertyType();
 109  
         }
 110  
         
 111  
         @SuppressWarnings("unchecked")
 112  
         @Override
 113  
         public <X> X getValue() throws AttributeValidationException {
 114  32
                 Object value = getValue(attributeName);
 115  32
                 return (X) value;
 116  
         }
 117  
         
 118  
         @SuppressWarnings("unchecked")
 119  
         @Override
 120  
         public <X> X getValue(String attrName) throws AttributeValidationException {
 121  52
                 X attributeValue = null;
 122  
                 
 123  52
                 Exception e = null;
 124  
                 try {
 125  52
                         attributeValue = (X) beanWrapper.getPropertyValue(attrName);
 126  
 
 127  0
                 } catch (IllegalArgumentException iae) {
 128  0
                         e = iae;
 129  0
                 } catch (NullValueInNestedPathException nvinp){
 130  
                         //just return null
 131  52
                 }
 132  
                 
 133  52
                 if (e != null)
 134  0
                         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  52
                 return attributeValue;
 146  
         }
 147  
 }