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}