001/**
002 * Copyright 2005-2018 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kns.datadictionary.validation;
017
018import org.apache.commons.beanutils.PropertyUtils;
019import org.apache.commons.lang.StringUtils;
020import org.apache.log4j.Logger;
021import org.kuali.rice.core.api.util.type.TypeUtils;
022import org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition;
023import org.kuali.rice.kns.datadictionary.MaintainableItemDefinition;
024import org.kuali.rice.kns.datadictionary.MaintainableSectionDefinition;
025import org.kuali.rice.kns.datadictionary.MaintenanceDocumentEntry;
026import org.kuali.rice.krad.datadictionary.AttributeDefinition;
027import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
028import org.kuali.rice.krad.datadictionary.validation.DictionaryObjectAttributeValueReader;
029import org.kuali.rice.krad.datadictionary.validation.capability.Constrainable;
030import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
031import org.kuali.rice.krad.service.PersistenceStructureService;
032import org.kuali.rice.krad.util.ObjectUtils;
033
034import java.lang.reflect.InvocationTargetException;
035import java.util.HashMap;
036import java.util.LinkedList;
037import java.util.List;
038import java.util.Map;
039
040/**
041 * This class provides legacy processing for maintenance documents in the dictionary validation service implementation. 
042 * 
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 * @deprecated As of release 2.0
045 */
046@Deprecated
047public class MaintenanceDocumentAttributeValueReader extends DictionaryObjectAttributeValueReader {
048
049        protected Map<String, Class<?>> attributeTypeMap;
050        protected Map<String, Object> attributeValueMap;
051        //protected Map<String, PropertyDescriptor> beanInfo;
052        
053        private final static Logger LOG = Logger.getLogger(MaintenanceDocumentAttributeValueReader.class);
054        
055        private List<Constrainable> attributeDefinitions;
056        private Map<String, AttributeDefinition> attributeDefinitionMap;
057        
058        public MaintenanceDocumentAttributeValueReader(Object object, String entryName, MaintenanceDocumentEntry entry, PersistenceStructureService persistenceStructureService) {
059                super(object, entryName, entry);
060                
061                //if (object != null)
062                //      this.beanInfo = getBeanInfo(object.getClass());
063                
064                this.attributeTypeMap = new HashMap<String, Class<?>>();
065                this.attributeValueMap = new HashMap<String, Object>();         
066                
067                this.attributeDefinitions = new LinkedList<Constrainable>();
068                this.attributeDefinitionMap = new HashMap<String, AttributeDefinition>();
069                for (MaintainableSectionDefinition sectionDefinition : entry.getMaintainableSections()) {
070                        List<? extends MaintainableItemDefinition> itemDefinitions = sectionDefinition.getMaintainableItems();
071                        
072                        for (MaintainableItemDefinition itemDefinition : itemDefinitions) {
073                                if (itemDefinition instanceof MaintainableFieldDefinition) {
074                                        String itemDefinitionName = itemDefinition.getName();
075                                        AttributeDefinition attributeDefinition = KRADServiceLocatorWeb.getDataDictionaryService().getAttributeDefinition(object.getClass().getName(), itemDefinitionName);
076                                                
077                                                //entry.getAttributeDefinition(attributeName);
078                                        boolean isAttributeDefined = attributeDefinition != null;
079                                                //getDataDictionaryService().isAttributeDefined(businessObject.getClass(), itemDefinition.getName());
080                                if (isAttributeDefined) {
081                                        attributeDefinitions.add(attributeDefinition);
082                                        attributeDefinitionMap.put(itemDefinitionName, attributeDefinition);
083                        LOG.info("itemDefName: " + itemDefinitionName);
084
085                                                try {
086                            Object  attributeValue = PropertyUtils.getNestedProperty(object, itemDefinitionName);
087
088                                                        if (attributeValue != null && StringUtils.isNotBlank(attributeValue.toString())) {
089                                                        Class<?> propertyType = ObjectUtils.getPropertyType(object, itemDefinitionName, persistenceStructureService);
090                                                        attributeTypeMap.put(itemDefinitionName, propertyType);
091                                if (TypeUtils.isStringClass(propertyType) || TypeUtils.isIntegralClass(propertyType) ||
092                                        TypeUtils.isDecimalClass(propertyType) ||
093                                        TypeUtils.isTemporalClass(propertyType) ||
094                                        TypeUtils.isBooleanClass(propertyType)) {
095                                    // check value format against dictionary
096                                    if (!TypeUtils.isTemporalClass(propertyType)) {
097                                        attributeValueMap.put(itemDefinitionName, attributeValue);
098                                    }
099                                }
100                                                }
101                                                } catch (IllegalArgumentException e) {
102                                                        LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e);
103                                                } catch (IllegalAccessException e) {
104                                                        LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e);
105                                                } catch (InvocationTargetException e) {
106                                                        LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e);                                         
107                                        } catch (NoSuchMethodException e) {
108                            LOG.warn("Failed to find property description on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e);
109                        }
110                                        
111                                }
112                                }
113                        }
114                }
115        }
116        
117        /**
118         * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getDefinition(java.lang.String)
119         */
120        @Override
121        public Constrainable getDefinition(String attributeName) {
122                return attributeDefinitionMap != null ? attributeDefinitionMap.get(attributeName) : null;
123        }
124
125        /**
126         * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getDefinitions()
127         */
128        @Override
129        public List<Constrainable> getDefinitions() {
130                return attributeDefinitions;
131        }
132
133        @Override
134        public String getLabel(String attributeName) {
135                AttributeDefinition attributeDefinition = attributeDefinitionMap != null ? attributeDefinitionMap.get(attributeName) : null;
136                return attributeDefinition != null ? attributeDefinition.getLabel()  : attributeName;
137        }
138        
139        /**
140         * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getType(java.lang.String)
141         */
142        @Override
143        public Class<?> getType(String attributeName) {
144                return attributeTypeMap != null ? attributeTypeMap.get(attributeName) : null;
145        }
146
147        /**
148         * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getValue(java.lang.String)
149         */
150        @Override
151        public <X> X getValue(String attributeName) throws AttributeValidationException {
152                return (X) attributeValueMap.get(attributeName);
153        }
154
155        //private Map<String, PropertyDescriptor> getBeanInfo(Class<?> clazz) {
156        //      final Map<String, PropertyDescriptor> properties = new HashMap<String, PropertyDescriptor>();
157        //      for (PropertyDescriptor propertyDescriptor : PropertyUtils.getPropertyDescriptors(clazz)) {
158        //              properties.put(propertyDescriptor.getName(), propertyDescriptor);
159        //      }
160        //      return properties;
161        //}
162        
163}