001 /**
002 * Copyright 2005-2014 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 */
016 package org.kuali.rice.kim.document.rule;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.apache.log4j.Logger;
020 import org.kuali.rice.core.api.uif.RemotableAttributeError;
021 import org.kuali.rice.kim.api.KimConstants;
022 import org.kuali.rice.kim.api.type.KimTypeAttribute;
023 import org.kuali.rice.kim.bo.ui.KimDocumentAttributeDataBusinessObjectBase;
024 import org.kuali.rice.kim.impl.common.attribute.KimAttributeBo;
025 import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
026 import org.kuali.rice.krad.service.BusinessObjectService;
027 import org.kuali.rice.krad.service.KRADServiceLocator;
028 import org.kuali.rice.krad.util.GlobalVariables;
029 import org.kuali.rice.krad.util.KRADConstants;
030 import org.kuali.rice.krad.util.KRADPropertyConstants;
031
032 import java.util.ArrayList;
033 import java.util.HashMap;
034 import java.util.List;
035 import java.util.Map;
036
037 /**
038 * This is a description of what this class does - wliang don't forget to fill this in.
039 *
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 *
042 */
043 public class AttributeValidationHelper {
044 private static final Logger LOG = Logger.getLogger(AttributeValidationHelper.class);
045
046 private static final String DOCUMENT_PROPERTY_PREFIX = KRADConstants.DOCUMENT_PROPERTY_NAME + ".";
047
048 protected BusinessObjectService businessObjectService;
049 protected Map<String,KimAttributeBo> attributeDefinitionMap = new HashMap<String,KimAttributeBo>();
050
051 protected KimAttributeBo getAttributeDefinition( String id ) {
052 KimAttributeBo attributeImpl = attributeDefinitionMap.get( id );
053
054 if ( attributeImpl == null ) {
055 Map<String,String> criteria = new HashMap<String,String>();
056 criteria.put( KimConstants.PrimaryKeyConstants.KIM_ATTRIBUTE_ID, id );
057 attributeImpl = (KimAttributeBo)getBusinessObjectService().findByPrimaryKey( KimAttributeBo.class, criteria );
058 attributeDefinitionMap.put( id, attributeImpl );
059 }
060 return attributeImpl;
061 }
062
063 public Map<String, String> convertAttributesToMap(List<? extends KimAttributeDataBo> attributes) {
064 Map<String, String> m = new HashMap<String, String>();
065 for(KimAttributeDataBo data: attributes) {
066 KimAttributeBo attrib = getAttributeDefinition(data.getKimAttributeId());
067 if(attrib != null){
068 m.put(attrib.getAttributeName(), data.getAttributeValue());
069 } else {
070 LOG.error("Unable to get attribute name for ID:" + data.getKimAttributeId());
071 }
072 }
073 return m;
074 }
075
076 public Map<String, String> convertQualifiersToMap( List<? extends KimDocumentAttributeDataBusinessObjectBase> qualifiers ) {
077 Map<String, String> m = new HashMap<String, String>();
078 for ( KimDocumentAttributeDataBusinessObjectBase data : qualifiers ) {
079 KimAttributeBo attrib = getAttributeDefinition( data.getKimAttrDefnId() );
080 if ( attrib != null ) {
081 m.put( attrib.getAttributeName(), data.getAttrVal() );
082 } else {
083 LOG.error("Unable to get attribute name for ID:" + data.getKimAttrDefnId() );
084 }
085 }
086 return m;
087 }
088
089 public Map<String, String> getBlankValueQualifiersMap(List<KimTypeAttribute> attributes) {
090 Map<String, String> m = new HashMap<String, String>();
091 for(KimTypeAttribute attribute: attributes){
092 KimAttributeBo attrib = getAttributeDefinition(attribute.getKimAttribute().getId());
093 if ( attrib != null ) {
094 m.put( attrib.getAttributeName(), "" );
095 } else {
096 LOG.error("Unable to get attribute name for ID:" + attribute.getId());
097 }
098 }
099 return m;
100 }
101
102 public Map<String, String> convertQualifiersToAttrIdxMap( List<? extends KimDocumentAttributeDataBusinessObjectBase> qualifiers ) {
103 Map<String, String> m = new HashMap<String, String>();
104 int i = 0;
105 for ( KimDocumentAttributeDataBusinessObjectBase data : qualifiers ) {
106 KimAttributeBo attrib = getAttributeDefinition( data.getKimAttrDefnId() );
107 if ( attrib != null ) {
108 m.put( attrib.getAttributeName(), Integer.toString(i) );
109 } else {
110 LOG.error("Unable to get attribute name for ID:" + data.getKimAttrDefnId() );
111 }
112 i++;
113 }
114 return m;
115 }
116
117 public BusinessObjectService getBusinessObjectService() {
118 if(businessObjectService == null){
119 businessObjectService = KRADServiceLocator.getBusinessObjectService();
120 }
121 return businessObjectService;
122 }
123
124 public void moveValidationErrorsToErrorMap(List<RemotableAttributeError> validationErrors) {
125 // FIXME: the above code would overwrite messages on the same attributes (namespaceCode) but on different rows
126 for ( RemotableAttributeError error : validationErrors) {
127 for (String errMsg : error.getErrors()) {
128 String[] splitMsg = StringUtils.split(errMsg, ":");
129
130 // if the property name starts with "document." then don't prefix with the error path
131 if (error.getAttributeName().startsWith(DOCUMENT_PROPERTY_PREFIX)) {
132 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath( error.getAttributeName(), splitMsg[0], splitMsg.length > 1 ? StringUtils.split(splitMsg[1], ";") : new String[] {} );
133 } else {
134 GlobalVariables.getMessageMap().putError( error.getAttributeName(), splitMsg[0], splitMsg.length > 1 ? StringUtils.split(splitMsg[1], ";") : new String[] {} );
135 }
136 }
137 }
138 }
139
140 public List<RemotableAttributeError> convertErrorsForMappedFields(String errorPath, List<RemotableAttributeError> localErrors) {
141 List<RemotableAttributeError> errors = new ArrayList<RemotableAttributeError>();
142 if (errorPath == null) {
143 errorPath = KRADConstants.EMPTY_STRING;
144 }
145 else if (StringUtils.isNotEmpty(errorPath)) {
146 errorPath = errorPath + ".";
147 }
148 for ( RemotableAttributeError error : localErrors) {
149 Map<String,String> criteria = new HashMap<String,String>();
150 criteria.put(KRADPropertyConstants.ATTRIBUTE_NAME, error.getAttributeName());
151 KimAttributeBo attribute = getBusinessObjectService().findByPrimaryKey(KimAttributeBo.class, criteria);
152 String attributeDefnId = attribute==null?"":attribute.getId();
153 errors.add(RemotableAttributeError.Builder.create(errorPath+"qualifier("+attributeDefnId+").attrVal", error.getErrors()).build());
154 }
155 return errors;
156 }
157
158 public List<RemotableAttributeError> convertErrors(String errorPath, Map<String, String> attrIdxMap, List<RemotableAttributeError> localErrors) {
159 List<RemotableAttributeError> errors = new ArrayList<RemotableAttributeError>();
160 if (errorPath == null) {
161 errorPath = KRADConstants.EMPTY_STRING;
162 }
163 else if (StringUtils.isNotEmpty(errorPath)) {
164 errorPath = errorPath + ".";
165 }
166 for ( RemotableAttributeError error : localErrors ) {
167 for (String errMsg : error.getErrors()) {
168 errors.add(RemotableAttributeError.Builder.create(errorPath+"qualifiers["+attrIdxMap.get(error.getAttributeName())+"].attrVal", errMsg).build());
169 }
170 }
171 return errors;
172 }
173 }