1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kim.document.rule;
17
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22
23 import org.apache.commons.lang.StringUtils;
24 import org.apache.log4j.Logger;
25 import org.kuali.rice.core.api.criteria.QueryByCriteria;
26 import org.kuali.rice.core.api.uif.RemotableAttributeError;
27 import org.kuali.rice.core.impl.services.CoreImplServiceLocator;
28 import org.kuali.rice.kim.api.common.attribute.KimAttribute;
29 import org.kuali.rice.kim.api.type.KimTypeAttribute;
30 import org.kuali.rice.kim.bo.ui.KimDocumentAttributeDataBusinessObjectBase;
31 import org.kuali.rice.kim.impl.common.attribute.KimAttributeBo;
32 import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
33 import org.kuali.rice.krad.data.KradDataServiceLocator;
34 import org.kuali.rice.krad.util.GlobalVariables;
35 import org.kuali.rice.krad.util.KRADConstants;
36 import org.kuali.rice.krad.util.KRADPropertyConstants;
37 import org.springframework.cache.Cache;
38 import org.springframework.cache.Cache.ValueWrapper;
39 import org.springframework.cache.CacheManager;
40
41
42
43
44
45
46
47 public class AttributeValidationHelper {
48 private static final Logger LOG = Logger.getLogger(AttributeValidationHelper.class);
49
50 private static final String DOCUMENT_PROPERTY_PREFIX = KRADConstants.DOCUMENT_PROPERTY_NAME + ".";
51
52
53
54
55
56 protected KimAttribute getAttributeDefinitionById( String id ) {
57 CacheManager cm = CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagerByCacheName(KimAttribute.Cache.NAME);
58 Cache cache = cm.getCache(KimAttribute.Cache.NAME);
59 String cacheKey = "id=" + id;
60 ValueWrapper valueWrapper = cache.get( cacheKey );
61
62 if ( valueWrapper != null ) {
63 return (KimAttribute) valueWrapper.get();
64 }
65
66 KimAttributeBo attributeImpl = KradDataServiceLocator.getDataObjectService().find( KimAttributeBo.class, id );
67 KimAttribute attribute = KimAttributeBo.to(attributeImpl);
68 cache.put( cacheKey, attribute );
69
70 return attribute;
71 }
72
73 protected KimAttribute getAttributeDefinitionByName( String attributeName ) {
74 CacheManager cm = CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagerByCacheName(KimAttribute.Cache.NAME);
75 Cache cache = cm.getCache(KimAttribute.Cache.NAME);
76 String cacheKey = "name=" + attributeName;
77 ValueWrapper valueWrapper = cache.get( cacheKey );
78
79 if ( valueWrapper != null ) {
80 return (KimAttribute) valueWrapper.get();
81 }
82
83 List<KimAttributeBo> attributeImpls = KradDataServiceLocator.getDataObjectService().findMatching( KimAttributeBo.class, QueryByCriteria.Builder.forAttribute(KRADPropertyConstants.ATTRIBUTE_NAME, attributeName).build()).getResults();
84 KimAttribute attribute = null;
85 if ( !attributeImpls.isEmpty() ) {
86 attribute = KimAttributeBo.to(attributeImpls.get(0));
87 }
88
89 cache.put( cacheKey, attribute );
90
91 return attribute;
92 }
93
94 public Map<String, String> convertAttributesToMap(List<? extends KimAttributeDataBo> attributes) {
95 Map<String, String> m = new HashMap<String, String>();
96 for(KimAttributeDataBo data: attributes) {
97 KimAttribute attrib = getAttributeDefinitionById(data.getKimAttributeId());
98 if(attrib != null){
99 m.put(attrib.getAttributeName(), data.getAttributeValue());
100 } else {
101 LOG.error("Unable to get attribute name for ID:" + data.getKimAttributeId());
102 }
103 }
104 return m;
105 }
106
107 public Map<String, String> convertQualifiersToMap( List<? extends KimDocumentAttributeDataBusinessObjectBase> qualifiers ) {
108 Map<String, String> m = new HashMap<String, String>();
109 for ( KimDocumentAttributeDataBusinessObjectBase data : qualifiers ) {
110 KimAttribute attrib = getAttributeDefinitionById( data.getKimAttrDefnId() );
111 if ( attrib != null ) {
112 m.put( attrib.getAttributeName(), data.getAttrVal() );
113 } else {
114 LOG.error("Unable to get attribute name for ID:" + data.getKimAttrDefnId() );
115 }
116 }
117 return m;
118 }
119
120 public Map<String, String> getBlankValueQualifiersMap(List<KimTypeAttribute> attributes) {
121 Map<String, String> m = new HashMap<String, String>();
122 for(KimTypeAttribute attribute: attributes){
123 KimAttribute attrib = getAttributeDefinitionById(attribute.getKimAttribute().getId());
124 if ( attrib != null ) {
125 m.put( attrib.getAttributeName(), "" );
126 } else {
127 LOG.error("Unable to get attribute name for ID:" + attribute.getId());
128 }
129 }
130 return m;
131 }
132
133 public Map<String, String> convertQualifiersToAttrIdxMap( List<? extends KimDocumentAttributeDataBusinessObjectBase> qualifiers ) {
134 Map<String, String> m = new HashMap<String, String>();
135 int i = 0;
136 for ( KimDocumentAttributeDataBusinessObjectBase data : qualifiers ) {
137 KimAttribute attrib = getAttributeDefinitionById( data.getKimAttrDefnId() );
138 if ( attrib != null ) {
139 m.put( attrib.getAttributeName(), Integer.toString(i) );
140 } else {
141 LOG.error("Unable to get attribute name for ID:" + data.getKimAttrDefnId() );
142 }
143 i++;
144 }
145 return m;
146 }
147
148 public void moveValidationErrorsToErrorMap(List<RemotableAttributeError> validationErrors) {
149
150 for ( RemotableAttributeError error : validationErrors) {
151 for (String errMsg : error.getErrors()) {
152 String[] splitMsg = StringUtils.split(errMsg, ":");
153
154
155 if (error.getAttributeName().startsWith(DOCUMENT_PROPERTY_PREFIX)) {
156 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath( error.getAttributeName(), splitMsg[0], splitMsg.length > 1 ? StringUtils.split(splitMsg[1], ";") : new String[] {} );
157 } else {
158 GlobalVariables.getMessageMap().putError( error.getAttributeName(), splitMsg[0], splitMsg.length > 1 ? StringUtils.split(splitMsg[1], ";") : new String[] {} );
159 }
160 }
161 }
162 }
163
164 public List<RemotableAttributeError> convertErrorsForMappedFields(String errorPath, List<RemotableAttributeError> localErrors) {
165 List<RemotableAttributeError> errors = new ArrayList<RemotableAttributeError>();
166 if (errorPath == null) {
167 errorPath = KRADConstants.EMPTY_STRING;
168 }
169 else if (StringUtils.isNotEmpty(errorPath)) {
170 errorPath = errorPath + ".";
171 }
172 for ( RemotableAttributeError error : localErrors) {
173 KimAttribute attribute = getAttributeDefinitionByName(error.getAttributeName());
174 String attributeDefnId = attribute==null?"":attribute.getId();
175 errors.add(RemotableAttributeError.Builder.create(errorPath+"qualifier("+attributeDefnId+").attrVal", error.getErrors()).build());
176 }
177 return errors;
178 }
179
180 public List<RemotableAttributeError> convertErrors(String errorPath, Map<String, String> attrIdxMap, List<RemotableAttributeError> localErrors) {
181 List<RemotableAttributeError> errors = new ArrayList<RemotableAttributeError>();
182 if (errorPath == null) {
183 errorPath = KRADConstants.EMPTY_STRING;
184 }
185 else if (StringUtils.isNotEmpty(errorPath)) {
186 errorPath = errorPath + ".";
187 }
188 for ( RemotableAttributeError error : localErrors ) {
189 for (String errMsg : error.getErrors()) {
190 errors.add(RemotableAttributeError.Builder.create(errorPath+"qualifiers["+attrIdxMap.get(error.getAttributeName())+"].attrVal", errMsg).build());
191 }
192 }
193 return errors;
194 }
195 }