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.util;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.core.api.uif.RemotableAttributeField;
020import org.kuali.rice.krad.uif.container.Container;
021import org.kuali.rice.krad.uif.view.View;
022import org.kuali.rice.krad.web.form.InquiryForm;
023import org.kuali.rice.krad.web.form.MaintenanceForm;
024import org.kuali.rice.krms.api.repository.type.KrmsTypeDefinition;
025import org.kuali.rice.krms.framework.type.ActionTypeService;
026import org.kuali.rice.krms.framework.type.AgendaTypeService;
027import org.kuali.rice.krms.framework.type.RuleTypeService;
028import org.kuali.rice.krms.impl.repository.KrmsRepositoryServiceLocator;
029import org.kuali.rice.krms.impl.type.ActionTypeServiceBase;
030import org.kuali.rice.krms.impl.type.AgendaTypeServiceBase;
031import org.kuali.rice.krms.impl.type.RuleTypeServiceBase;
032import org.kuali.rice.krms.impl.ui.AgendaEditor;
033
034import java.util.ArrayList;
035import java.util.List;
036
037/**
038 * KRMS utilility class for retrieving KRMS objects for {@link org.kuali.rice.krms.impl.ui.AgendaEditorMaintainable} and
039 * {@link org.kuali.rice.krms.impl.repository.AgendaInquiryHelperServiceImpl}
040 *
041 * @author Kuali Rice Team (rice.collab@kuali.org)
042 */
043public class KrmsRetriever {
044
045    private static final long serialVersionUID = 1L;
046
047    /**
048     * This only supports a single action within a rule.
049     * @param agendaEditor
050     * @return List<RemotableAttributeField>
051     */
052    public List<RemotableAttributeField> retrieveRuleActionCustomAttributes(AgendaEditor agendaEditor) {
053        List<RemotableAttributeField> results = new ArrayList<RemotableAttributeField>();
054        // if we have an rule action w/ a typeId set on it
055        if (agendaEditor != null && agendaEditor.getAgendaItemLineRuleAction() != null
056                &&!StringUtils.isBlank(agendaEditor.getAgendaItemLineRuleAction().getTypeId())) {
057            ActionTypeService actionTypeService = getActionTypeService(agendaEditor.getAgendaItemLineRuleAction().getTypeId());
058            results.addAll(actionTypeService.getAttributeFields(agendaEditor.getAgendaItemLineRuleAction().getTypeId()));
059        }
060
061        return results;
062    }
063
064    /**
065     * Get the AgendaEditor out of the MaintenanceForm's newMaintainableObject
066     * @param model the MaintenanceForm
067     * @return the AgendaEditor
068     */
069    private AgendaEditor getAgendaEditor(Object model) {
070        MaintenanceForm maintenanceForm = (MaintenanceForm)model;
071        return (AgendaEditor)maintenanceForm.getDocument().getNewMaintainableObject().getDataObject();
072    }
073
074    private ActionTypeService getActionTypeService(String krmsTypeId) {
075        //
076        // Get the ActionTypeService by hook or by crook
077        //
078
079        KrmsTypeDefinition krmsType = KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService().getTypeById(krmsTypeId);
080
081        ActionTypeService actionTypeService = null;
082
083        if (!StringUtils.isBlank(krmsTypeId)) {
084            String serviceName = krmsType.getServiceName();
085
086            if (!StringUtils.isBlank(serviceName)) {
087                actionTypeService = KrmsRepositoryServiceLocator.getService(serviceName);
088            }
089        }
090        if (actionTypeService == null) {
091            actionTypeService = ActionTypeServiceBase.defaultActionTypeService;
092        }
093
094        //        if (actionTypeService == null) { actionTypeService = AgendaTypeServiceBase.defaultAgendaTypeService; }
095
096        return actionTypeService;
097    }
098
099    /**
100     *
101     * @param agendaEditor
102     * @return List<RemotableAttributeField>
103     */
104    public List<RemotableAttributeField> retrieveAgendaCustomAttributes(AgendaEditor agendaEditor) {
105        List<RemotableAttributeField> results = new ArrayList<RemotableAttributeField>();
106        // if we have an agenda w/ a typeId set on it
107        if (agendaEditor != null && agendaEditor.getAgenda() != null
108                && !StringUtils.isBlank(agendaEditor.getAgenda().getTypeId())) {
109
110            String krmsTypeId = agendaEditor.getAgenda().getTypeId();
111
112            AgendaTypeService agendaTypeService = getAgendaTypeService(krmsTypeId);
113            results.addAll(agendaTypeService.getAttributeFields(krmsTypeId));
114        }
115
116        return results;
117    }
118
119    private AgendaTypeService getAgendaTypeService(String krmsTypeId) {
120        //
121        // Get the AgendaTypeService by hook or by crook
122        //
123
124        KrmsTypeDefinition krmsType =
125                KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService().
126                        getTypeById(krmsTypeId);
127
128        AgendaTypeService agendaTypeService = null;
129
130        if (!StringUtils.isBlank(krmsTypeId)) {
131            String serviceName = krmsType.getServiceName();
132
133            if (!StringUtils.isBlank(serviceName)) {
134                agendaTypeService = KrmsRepositoryServiceLocator.getService(serviceName);
135            }
136        }
137
138        if (agendaTypeService == null) { agendaTypeService = AgendaTypeServiceBase.defaultAgendaTypeService; }
139
140        return agendaTypeService;
141    }
142
143    public List<RemotableAttributeField> retrieveRuleCustomAttributes(AgendaEditor agendaEditor) {
144        List<RemotableAttributeField> results = new ArrayList<RemotableAttributeField>();
145        // if we have an rule w/ a typeId set on it
146        if (agendaEditor != null && agendaEditor.getAgendaItemLine() != null && agendaEditor.getAgendaItemLine().getRule() != null
147                && !StringUtils.isBlank(agendaEditor.getAgendaItemLine().getRule().getTypeId())) {
148
149            String krmsTypeId = agendaEditor.getAgendaItemLine().getRule().getTypeId();
150
151            RuleTypeService ruleTypeService = getRuleTypeService(krmsTypeId);
152            results.addAll(ruleTypeService.getAttributeFields(krmsTypeId));
153        }
154
155        return results;
156    }
157
158
159    private RuleTypeService getRuleTypeService(String krmsTypeId) {
160        RuleTypeService ruleTypeService = null;
161        String serviceName = getRuleTypeServiceName(krmsTypeId);
162
163        if (!StringUtils.isBlank(serviceName)) {
164            ruleTypeService = KrmsRepositoryServiceLocator.getService(serviceName);
165        }
166        if (ruleTypeService == null) {
167            ruleTypeService = RuleTypeServiceBase.defaultRuleTypeService;
168        }
169        return ruleTypeService;
170    }
171
172    private String getRuleTypeServiceName(String krmsTypeId) {
173        String serviceName = null;
174        KrmsTypeDefinition krmsType =
175                KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService().
176                        getTypeById(krmsTypeId);
177
178        if (!StringUtils.isBlank(krmsTypeId)) {
179            serviceName = krmsType.getServiceName();
180        }
181        return serviceName;
182    }
183}