001/** 002 * Copyright 2005-2017 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.krms.impl.validation; 017 018import java.util.ArrayList; 019import java.util.List; 020import java.util.Map; 021import java.util.TreeMap; 022 023import javax.jws.WebParam; 024 025import org.apache.commons.collections.CollectionUtils; 026import org.apache.commons.lang.StringUtils; 027import org.kuali.rice.core.api.data.DataType; 028import org.kuali.rice.core.api.exception.RiceIllegalArgumentException; 029import org.kuali.rice.core.api.uif.RemotableAttributeField; 030import org.kuali.rice.core.api.uif.RemotableTextarea; 031import org.kuali.rice.krms.api.repository.action.ActionDefinition; 032import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition; 033import org.kuali.rice.krms.api.repository.type.KrmsTypeAttribute; 034import org.kuali.rice.krms.api.repository.type.KrmsTypeDefinition; 035import org.kuali.rice.krms.api.repository.type.KrmsTypeRepositoryService; 036import org.kuali.rice.krms.framework.engine.Action; 037import org.kuali.rice.krms.framework.type.ActionTypeService; 038import org.kuali.rice.krms.framework.type.ValidationActionService; 039import org.kuali.rice.krms.framework.type.ValidationActionType; 040import org.kuali.rice.krms.framework.type.ValidationActionTypeService; 041import org.kuali.rice.krms.impl.repository.KrmsRepositoryServiceLocator; 042import org.kuali.rice.krms.impl.type.KrmsTypeServiceBase; 043 044/** 045 * {@link ValidationActionTypeService} implementation 046 * 047 * @author Kuali Rice Team (rice.collab@kuali.org). 048 */ 049public class ValidationActionTypeServiceImpl extends KrmsTypeServiceBase implements ValidationActionTypeService { 050 051 private ValidationActionService validationService; 052 053 private ValidationActionTypeServiceImpl() {} 054 055 /** 056 * Factory method for getting a {@link ActionTypeService} 057 * @return a {@link ActionTypeService} 058 */ 059 public static ActionTypeService getInstance() { 060 return new ValidationActionTypeServiceImpl(); 061 } 062 063 @Override 064 public Action loadAction(ActionDefinition validationActionDefinition) { 065 066 if (validationActionDefinition == null) { throw new RiceIllegalArgumentException("validationActionDefinition must not be null"); } 067 if (validationActionDefinition.getAttributes() == null) { throw new RiceIllegalArgumentException("validationActionDefinition must not be null");} 068 069 // TypeCode 070 if (!validationActionDefinition.getAttributes().containsKey(ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE)) { 071 throw new RiceIllegalArgumentException("validationActionDefinition does not contain an " + 072 ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE + " attribute"); 073 } 074 String validationActionTypeCode = validationActionDefinition.getAttributes().get(ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE); 075 if (StringUtils.isBlank(validationActionTypeCode)) { 076 throw new RiceIllegalArgumentException(ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE + " attribute must not be null or blank"); 077 } 078 079 // Message 080 if (!validationActionDefinition.getAttributes().containsKey(VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE)) { 081 throw new RiceIllegalArgumentException("validationActionDefinition does not contain an " + 082 VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE + " attribute"); 083 } 084 String validationMessage = validationActionDefinition.getAttributes().get(VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE); 085 if (StringUtils.isBlank(validationMessage)) { 086 throw new RiceIllegalArgumentException(VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE + " attribute must not be null or blank"); 087 } 088 089 if (ValidationActionType.WARNING.getCode().equals(validationActionTypeCode)) { 090 return new ValidationAction(ValidationActionType.WARNING, validationMessage); 091 } 092 if (ValidationActionType.ERROR.getCode().equals(validationActionTypeCode)) { 093 return new ValidationAction(ValidationActionType.ERROR, validationMessage); 094 } 095 return null; 096 } 097 098 /** 099 * 100 * @return List<RemotableAttributeField> for Validation Actions 101 * @throws RiceIllegalArgumentException if krmsType is null (krmsTypeId lookup returns null) 102 */ 103 @Override 104 public List<RemotableAttributeField> getAttributeFields(@WebParam(name = "krmsTypeId") String krmsTypeId) throws RiceIllegalArgumentException { 105 106 List<RemotableAttributeField> results = new ArrayList<RemotableAttributeField>(); 107 108 KrmsTypeDefinition krmsType = 109 KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService().getTypeById(krmsTypeId); 110 111 if (krmsType == null) { 112 throw new RiceIllegalArgumentException("krmsTypeId must be a valid id of a KRMS type"); 113 } else { 114 List<KrmsTypeAttribute> typeAttributes = krmsType.getAttributes(); 115 Map<String, Integer> attribDefIdSequenceNumbers = new TreeMap<String, Integer>(); 116 Map<String, String> unsortedIdLables = new TreeMap<String, String>(); 117 if (!CollectionUtils.isEmpty(typeAttributes)) { 118 // translate the attribute and store the sort code in our map 119 Map<String, String> keyLabels = new TreeMap<String, String>(); 120 keyLabels.put(ValidationActionType.WARNING.getCode(), "Warning Action"); 121 keyLabels.put(ValidationActionType.ERROR.getCode(), "Error Action"); 122 123 KrmsTypeRepositoryService typeRepositoryService = KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService(); 124 KrmsAttributeDefinition attributeDefinition = null; 125 RadioButtonTypeServiceUtil util = new RadioButtonTypeServiceUtil(); 126 127 for (KrmsTypeAttribute typeAttribute : typeAttributes) { 128 129 attributeDefinition = typeRepositoryService.getAttributeDefinitionById(typeAttribute.getAttributeDefinitionId()); 130 131 if (VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE.equals(attributeDefinition.getName())) { 132 RemotableAttributeField attributeField = util.translateTypeAttribute(attributeDefinition, keyLabels); 133 results.add(attributeField); 134 } 135 136 if (VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE.equals(attributeDefinition.getName())) { 137 RemotableAttributeField attributeField = createMessageField(attributeDefinition); 138 results.add(attributeField); 139 } 140 } 141 } 142 } 143 return results; 144 } 145 146 /** 147 * Create the Message RemotableAttributeField 148 * @param krmsAttributeDefinition of the Message field 149 * @return RemotableAttributeField for the Message field 150 */ 151 private RemotableAttributeField createMessageField(KrmsAttributeDefinition krmsAttributeDefinition) { 152 153 RemotableTextarea.Builder controlBuilder = RemotableTextarea.Builder.create(); 154 controlBuilder = RemotableTextarea.Builder.create(); 155 controlBuilder.setRows(Integer.valueOf(2)); 156 controlBuilder.setCols(Integer.valueOf(30)); 157 controlBuilder.setWatermark("Enter a Validation Action Message"); 158 159 RemotableAttributeField.Builder builder = RemotableAttributeField.Builder.create(krmsAttributeDefinition.getName()); 160 builder.setRequired(true); 161 builder.setDataType(DataType.STRING); 162 builder.setControl(controlBuilder); 163 builder.setLongLabel(krmsAttributeDefinition.getLabel()); 164 builder.setShortLabel("Message"); 165 builder.setMinLength(Integer.valueOf(1)); 166 builder.setMaxLength(Integer.valueOf(400)); 167 168 return builder.build(); 169 } 170 171 172 @Override 173 public void setValidationService(ValidationActionService mockValidationService) { 174 if (mockValidationService == null) { 175 throw new RiceIllegalArgumentException("validationService must not be null"); 176 } 177 this.validationService = mockValidationService; 178 } 179}