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.ui;
017
018import org.kuali.rice.core.api.util.tree.Node;
019import org.kuali.rice.core.api.util.tree.Tree;
020import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
021import org.kuali.rice.krms.impl.repository.ActionBo;
022import org.kuali.rice.krms.impl.repository.AgendaBo;
023import org.kuali.rice.krms.impl.repository.AgendaItemBo;
024import org.kuali.rice.krms.impl.repository.ContextBo;
025
026import java.util.HashMap;
027import java.util.List;
028import java.util.Map;
029
030/**
031 * synthetic (not directly persisted) BO for the KRMS agenda editor
032 * 
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 *
035 */
036public class AgendaEditor extends PersistableBusinessObjectBase {
037        
038        private static final long serialVersionUID = 1L;
039        
040        private ContextBo context;
041    private String namespace;
042        private AgendaBo agenda;
043    private String contextName;
044        private AgendaItemBo agendaItemLine;
045    private ActionBo agendaItemLineRuleAction;
046    private String selectedAgendaItemId;
047    private String cutAgendaItemId;
048    private String selectedPropositionId;
049    private String cutPropositionId;
050    private String copyRuleName;
051    private String oldContextId;
052    private String ruleEditorMessage;
053    private boolean addRuleInProgress = false;
054    private Map<String, String> customAttributesMap = new HashMap<String, String>();
055    private Map<String, String> customRuleAttributesMap = new HashMap<String, String>();
056    private Map<String, String> customRuleActionAttributesMap = new HashMap<String, String>();
057
058    public AgendaEditor() {
059        agenda = new AgendaBo();
060        // ToDo: Determine proper default values of agenda's typeId
061        agenda.setTypeId("");
062        agendaItemLine = new AgendaItemBo();
063        agendaItemLineRuleAction = new ActionBo();
064    }
065
066        private void addAgendaItemAndChildren(Node<AgendaTreeNode, String> parent, AgendaItemBo agendaItem) {
067            Node<AgendaTreeNode, String> child = new Node<AgendaTreeNode, String>();
068            child.setNodeLabel(agendaItem.getRuleText());
069            child.setNodeType("agendaNode ruleNode");
070            child.setData(new AgendaTreeRuleNode(agendaItem));
071            parent.getChildren().add(child);
072            
073            // deal with peer nodes:
074            if (agendaItem.getAlways() != null) addAgendaItemAndChildren(parent, agendaItem.getAlways());
075            
076            // deal with child nodes:
077            if (agendaItem.getWhenTrue() != null) {
078                Node<AgendaTreeNode, String> whenTrue = new Node<AgendaTreeNode, String>();
079                whenTrue.setNodeLabel("When TRUE");
080                whenTrue.setNodeType("agendaNode logicNode whenTrueNode");
081                whenTrue.setData(new AgendaTreeLogicNode());
082                child.getChildren().add(whenTrue);
083                
084                addAgendaItemAndChildren(whenTrue, agendaItem.getWhenTrue());
085            }
086        if (agendaItem.getWhenFalse() != null) {
087            Node<AgendaTreeNode, String> whenFalse = new Node<AgendaTreeNode, String>();
088            whenFalse.setNodeLabel("When FALSE");
089            whenFalse.setNodeType("agendaNode logicNode whenFalseNode");
090            whenFalse.setData(new AgendaTreeLogicNode());
091            child.getChildren().add(whenFalse);
092            
093            addAgendaItemAndChildren(whenFalse, agendaItem.getWhenFalse());
094        }
095        }
096        
097    public Tree<? extends AgendaTreeNode, String> getAgendaRuleTree() {
098        Tree<AgendaTreeNode, String> agendaTree = new Tree<AgendaTreeNode, String>();
099
100        Node<AgendaTreeNode, String> rootNode = new Node<AgendaTreeNode, String>();
101        agendaTree.setRootElement(rootNode);
102        
103        if (agenda != null) {
104            String firstItemId = agenda.getFirstItemId();
105            List<AgendaItemBo> items = agenda.getItems();
106            AgendaItemBo firstItem = null;
107
108            if (items != null && firstItemId != null) {
109                for (AgendaItemBo item : items) {
110                    if (firstItemId.equals(item.getId())) {
111                        firstItem = item;
112                        break;
113                    }
114                }
115            }
116
117            if (firstItem != null) addAgendaItemAndChildren(rootNode, firstItem);
118        } 
119        
120        return agendaTree;
121    }   
122        
123        /**
124     * @return the agendaItemLine
125     */
126    public AgendaItemBo getAgendaItemLine() {
127        return this.agendaItemLine;
128    }
129
130    /**
131     * @param agendaItemLine the agendaItemLine to set
132     */
133    public void setAgendaItemLine(AgendaItemBo agendaItemLine) {
134        this.agendaItemLine = agendaItemLine;
135    }
136
137    public ActionBo getAgendaItemLineRuleAction() {
138        return agendaItemLineRuleAction;
139    }
140
141    public void setAgendaItemLineRuleAction(ActionBo actionBo) {
142        this.agendaItemLineRuleAction = actionBo;
143    }
144
145    /**
146     * @return the selectedAgendaItemId
147     */
148    public String getSelectedAgendaItemId() {
149        return this.selectedAgendaItemId;
150    }
151
152    /**
153     * @param selectedAgendaItemId the selectedAgendaItemId to set
154     */
155    public void setSelectedAgendaItemId(String selectedAgendaItemId) {
156        this.selectedAgendaItemId = selectedAgendaItemId;
157    }
158
159    /**
160     * @return the cutAgendaItemId
161     */
162    public String getCutAgendaItemId() {
163        return this.cutAgendaItemId;
164    }
165
166    /**
167     * @param cutAgendaItemId the cutAgendaItemId to set
168     */
169    public void setCutAgendaItemId(String cutAgendaItemId) {
170        this.cutAgendaItemId = cutAgendaItemId;
171    }
172
173    /**
174         * @return the context
175         */
176        public ContextBo getContext() {
177                return this.context;
178        }
179
180        /**
181         * @param context the context to set
182         */
183        public void setContext(ContextBo context) {
184                this.context = context;
185        }
186
187        /**
188         * @return the agenda
189         */
190        public AgendaBo getAgenda() {
191                return this.agenda;
192        }
193
194        /**
195         * @param agenda the agenda to set
196         */
197        public void setAgenda(AgendaBo agenda) {
198                this.agenda = agenda;
199        }
200
201    public Map<String, String> getCustomAttributesMap() {
202        return customAttributesMap;
203    }
204
205    public void setCustomAttributesMap(Map<String, String> customAttributesMap) {
206        this.customAttributesMap = customAttributesMap;
207    }
208
209    public Map<String, String> getCustomRuleAttributesMap() {
210        return customRuleAttributesMap;
211    }
212
213    public void setCustomRuleAttributesMap(Map<String, String> customRuleAttributesMap) {
214        this.customRuleAttributesMap = customRuleAttributesMap;
215    }
216
217    public Map<String, String> getCustomRuleActionAttributesMap() {
218        return customRuleActionAttributesMap;
219    }
220
221    public void setCustomRuleActionAttributesMap(Map<String, String> customRuleActionAttributesMap) {
222        this.customRuleActionAttributesMap = customRuleActionAttributesMap;
223    }
224
225    /**
226     * @param copyRuleName the rule name from which to copy
227     */
228    public void setCopyRuleName(String copyRuleName) {
229        this.copyRuleName = copyRuleName;
230    }
231
232    /**
233     * @return the rule name from which to copy
234     */
235    public String getCopyRuleName() {
236        return copyRuleName;
237    }
238
239    /**
240     * @param oldContextId the contextId that the agenda currently has (i.e. before the next context change)
241     */
242    public void setOldContextId(String oldContextId) {
243        this.oldContextId = oldContextId;
244    }
245
246    /**
247     * @return the contextId that the agenda had before the context change
248     */
249    public String getOldContextId() {
250        return oldContextId;
251    }
252
253    /**
254     * @return the selectedPropositionId
255     */
256    public String getSelectedPropositionId() {
257        return this.selectedPropositionId;
258    }
259
260    /**
261     * @param selectedPropositionId the selectedPropositionId to set
262     */
263    public void setSelectedPropositionId(String selectedPropositionId) {
264        this.selectedPropositionId = selectedPropositionId;
265    }
266
267
268    /**
269     * @return the cutPropositionId
270     */
271    public String getCutPropositionId() {
272        return cutPropositionId;
273    }
274
275    public String getContextName() {
276        return contextName;
277    }
278
279    public void setContextName(String contextName) {
280        this.contextName = contextName;
281    }
282
283    public String getNamespace() {
284        return namespace;
285    }
286
287    public void setNamespace(String namespace) {
288        this.namespace = namespace;
289    }
290
291    public String getRuleEditorMessage() {
292        return this.ruleEditorMessage;
293    }
294
295    public void setRuleEditorMessage(String message) {
296        this.ruleEditorMessage = message;
297    }
298
299    public boolean isAddRuleInProgress() {
300        return addRuleInProgress;
301    }
302
303    public void setAddRuleInProgress(boolean addRuleInProgress) {
304        this.addRuleInProgress = addRuleInProgress;
305    }
306
307    /**
308     * @param cutPropositionId the cutPropositionId to set
309     */
310    public void setCutPropositionId(String cutPropositionId) {
311        this.cutPropositionId = cutPropositionId;
312    }
313
314    // Need to override this method since the actual persistable BO is wrapped inside dataObject.
315    @Override
316    public void refreshNonUpdateableReferences() {
317        getPersistenceService().refreshAllNonUpdatingReferences(this.getAgenda());
318    }
319
320}