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