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}