001    /**
002     * Copyright 2005-2013 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     */
016    package org.kuali.rice.krms.impl.ui;
017    
018    import org.kuali.rice.core.api.util.tree.Node;
019    import org.kuali.rice.core.api.util.tree.Tree;
020    import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
021    import org.kuali.rice.krms.impl.repository.ActionBo;
022    import org.kuali.rice.krms.impl.repository.AgendaBo;
023    import org.kuali.rice.krms.impl.repository.AgendaItemBo;
024    import org.kuali.rice.krms.impl.repository.ContextBo;
025    
026    import java.util.HashMap;
027    import java.util.List;
028    import 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     */
036    public 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    }