001/**
002 * Copyright 2005-2016 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.krad.datadictionary.validation.processor;
017
018import org.kuali.rice.core.api.uif.DataType;
019import org.kuali.rice.core.api.util.RiceKeyConstants;
020import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
021import org.kuali.rice.krad.datadictionary.validation.AttributeValueReader;
022import org.kuali.rice.krad.datadictionary.validation.ValidationUtils;
023import org.kuali.rice.krad.datadictionary.validation.constraint.Constraint;
024import org.kuali.rice.krad.datadictionary.validation.constraint.DataTypeConstraint;
025import org.kuali.rice.krad.datadictionary.validation.result.ConstraintValidationResult;
026import org.kuali.rice.krad.datadictionary.validation.result.DictionaryValidationResult;
027import org.kuali.rice.krad.datadictionary.validation.result.ProcessorResult;
028
029/**
030 * 
031 * @author Kuali Rice Team (rice.collab@kuali.org) 
032 */
033public class DataTypeConstraintProcessor extends MandatoryElementConstraintProcessor<DataTypeConstraint> {
034
035        private static final String CONSTRAINT_NAME = "data type constraint";
036        
037        /**
038         * @see org.kuali.rice.krad.datadictionary.validation.processor.ConstraintProcessor#process(DictionaryValidationResult, Object, org.kuali.rice.krad.datadictionary.validation.capability.Constrainable, org.kuali.rice.krad.datadictionary.validation.AttributeValueReader)
039         */
040        @Override
041        public ProcessorResult process(DictionaryValidationResult result, Object value, DataTypeConstraint constraint, AttributeValueReader attributeValueReader)
042                        throws AttributeValidationException {
043
044                DataType dataType = constraint.getDataType();
045                
046                return new ProcessorResult(processDataTypeConstraint(result, dataType, value, attributeValueReader));
047        }
048        
049        @Override 
050        public String getName() {
051                return CONSTRAINT_NAME;
052        }
053
054        /**
055         * @see org.kuali.rice.krad.datadictionary.validation.processor.ConstraintProcessor#getConstraintType()
056         */
057        @Override
058        public Class<? extends Constraint> getConstraintType() {
059                return DataTypeConstraint.class;
060        }
061        
062        protected ConstraintValidationResult processDataTypeConstraint(DictionaryValidationResult result, DataType dataType, Object value, AttributeValueReader attributeValueReader) {
063                if (dataType == null)
064                        return result.addNoConstraint(attributeValueReader, CONSTRAINT_NAME);
065                
066                if (ValidationUtils.isNullOrEmpty(value))
067                        return result.addSkipped(attributeValueReader, CONSTRAINT_NAME);
068                
069                try {
070                        ValidationUtils.convertToDataType(value, dataType, dateTimeService);
071                } catch (Exception e) {         
072                        switch (dataType) {
073                        case BOOLEAN:
074                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_BOOLEAN);
075                        case INTEGER:
076                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_INTEGER);
077                        case LONG:
078                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_LONG);
079                        case DOUBLE:
080                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_BIG_DECIMAL);
081                        case FLOAT:
082                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_BIG_DECIMAL);
083                        case TRUNCATED_DATE:
084                        case DATE:
085                                return result.addError(attributeValueReader, CONSTRAINT_NAME, RiceKeyConstants.ERROR_BIG_DECIMAL);
086                        case STRING:
087                        }
088                }
089                
090                // If we get here then it was a success!
091                return result.addSuccess(attributeValueReader, CONSTRAINT_NAME);
092        }
093        
094}