001/**
002 * Copyright 2005-2012 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.api.repository.agenda;
017
018import java.io.Serializable;
019import java.util.Collection;
020
021import javax.xml.bind.annotation.XmlAccessType;
022import javax.xml.bind.annotation.XmlAccessorType;
023import javax.xml.bind.annotation.XmlAnyElement;
024import javax.xml.bind.annotation.XmlElement;
025import javax.xml.bind.annotation.XmlRootElement;
026import javax.xml.bind.annotation.XmlType;
027
028import org.apache.commons.lang.StringUtils;
029import org.kuali.rice.core.api.CoreConstants;
030import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
031import org.kuali.rice.core.api.mo.ModelBuilder;
032import org.kuali.rice.krms.api.repository.rule.RuleDefinition;
033
034/**
035 * Concrete model object implementation of KRMS Repository AgendaItemDefinition
036 * immutable. 
037 * Instances of AgendaItemDefinition can be (un)marshalled to and from XML.
038 *
039 * @see AgendaItemDefinitionContract
040 */
041@XmlRootElement(name = AgendaItemDefinition.Constants.ROOT_ELEMENT_NAME)
042@XmlAccessorType(XmlAccessType.NONE)
043@XmlType(name = AgendaItemDefinition.Constants.TYPE_NAME, propOrder = {
044                AgendaItemDefinition.Elements.ID,
045                AgendaItemDefinition.Elements.AGENDA_ID,
046                AgendaItemDefinition.Elements.RULE_ID,
047                AgendaItemDefinition.Elements.SUB_AGENDA_ID,
048                AgendaItemDefinition.Elements.WHEN_TRUE_ID,
049                AgendaItemDefinition.Elements.WHEN_FALSE_ID,
050                AgendaItemDefinition.Elements.ALWAYS_ID,
051                AgendaItemDefinition.Elements.RULE,
052                AgendaItemDefinition.Elements.SUB_AGENDA,
053                AgendaItemDefinition.Elements.WHEN_TRUE,
054                AgendaItemDefinition.Elements.WHEN_FALSE,
055                AgendaItemDefinition.Elements.ALWAYS,
056        CoreConstants.CommonElements.VERSION_NUMBER,
057                CoreConstants.CommonElements.FUTURE_ELEMENTS
058})
059public final class AgendaItemDefinition extends AbstractDataTransferObject implements AgendaItemDefinitionContract {
060        private static final long serialVersionUID = 2783959459503209577L;
061
062        @XmlElement(name = Elements.ID, required=true)
063        private String id;
064        @XmlElement(name = Elements.AGENDA_ID, required=true)
065        private String agendaId;
066        @XmlElement(name = Elements.RULE_ID, required=false)
067        private String ruleId;
068        @XmlElement(name = Elements.SUB_AGENDA_ID, required=false)
069        private String subAgendaId;
070        @XmlElement(name = Elements.WHEN_TRUE_ID, required=false)
071        private String whenTrueId;
072        @XmlElement(name = Elements.WHEN_FALSE_ID, required=false)
073        private String whenFalseId;
074        @XmlElement(name = Elements.ALWAYS_ID, required=false)
075        private String alwaysId;
076        
077        @XmlElement(name = Elements.RULE, required=false)
078        private RuleDefinition rule;;
079        @XmlElement(name = Elements.SUB_AGENDA, required=false)
080        private AgendaDefinition subAgenda;
081        @XmlElement(name = Elements.WHEN_TRUE, required=false)
082        private AgendaItemDefinition whenTrue;
083        @XmlElement(name = Elements.WHEN_FALSE, required=false)
084        private AgendaItemDefinition whenFalse;
085        @XmlElement(name = Elements.ALWAYS, required=false)
086        private AgendaItemDefinition always;
087        
088    @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
089    private final Long versionNumber;
090        
091        @SuppressWarnings("unused")
092    @XmlAnyElement
093    private final Collection<org.w3c.dom.Element> _futureElements = null;
094        
095        
096         /** 
097     * This constructor should never be called.  
098     * It is only present for use during JAXB unmarshalling. 
099     */
100    private AgendaItemDefinition() {
101        this.id = null;
102        this.agendaId = null;
103        this.ruleId = null;
104        this.subAgendaId = null;
105        this.whenTrueId = null;
106        this.whenFalseId = null;
107        this.alwaysId = null;
108        
109        this.rule = null;
110        this.subAgenda = null;
111        
112        this.whenTrue = null;
113        this.whenFalse = null;
114        this.always = null;
115        
116        this.versionNumber = null;
117    }
118    
119    /**
120         * Constructs a KRMS Repository AgendaItemDefinition object from the given builder.
121         * This constructor is private and should only ever be invoked from the builder.
122         * 
123         * @param builder the Builder from which to construct the AgendaItemDefinition
124         */
125    private AgendaItemDefinition(Builder builder) {
126        this.id = builder.getId();
127        this.agendaId = builder.getAgendaId();
128        this.ruleId = builder.getRuleId();
129        this.subAgendaId = builder.getSubAgendaId();
130        this.whenTrueId = builder.getWhenTrueId();
131        this.whenFalseId = builder.getWhenFalseId();
132        this.alwaysId = builder.getAlwaysId();
133        this.versionNumber = builder.getVersionNumber();
134
135        if (builder.getRule() != null) { this.rule = builder.getRule().build(); }
136        if (builder.getSubAgenda() != null) { this.subAgenda = builder.getSubAgenda().build(); }
137        if (builder.getWhenTrue() != null) { this.whenTrue  = builder.getWhenTrue().build(); }
138        if (builder.getWhenFalse() != null) { this.whenFalse = builder.getWhenFalse().build(); }
139        if (builder.getAlways() != null) { this.always = builder.getAlways().build(); }
140    }
141
142        @Override
143        public String getId() {
144                return this.id;
145        }
146
147        @Override
148        public String getAgendaId() {
149                return this.agendaId;
150        }
151
152        @Override
153        public String getRuleId() {
154                return this.ruleId;
155        }
156
157        @Override
158        public String getSubAgendaId() {
159                return this.subAgendaId;
160        }
161
162        @Override
163        public String getWhenTrueId() {
164                return this.whenTrueId;
165        }
166
167        @Override
168        public String getWhenFalseId() {
169                return this.whenFalseId;
170        }
171
172        @Override
173        public String getAlwaysId() {
174                return this.alwaysId;
175        }
176
177        @Override
178        public RuleDefinition getRule() {
179                return this.rule; 
180        }
181
182        @Override
183        public AgendaDefinition getSubAgenda() {
184                return this.subAgenda; 
185        }
186
187        @Override
188        public AgendaItemDefinition getWhenTrue() {
189                return this.whenTrue; 
190        }
191
192        @Override
193        public AgendaItemDefinition getWhenFalse() {
194                return this.whenFalse; 
195        }
196
197        @Override
198        public AgendaItemDefinition getAlways() {
199                return this.always; 
200        }
201
202    @Override
203    public Long getVersionNumber() {
204        return versionNumber;
205    }
206        
207        /**
208     * This builder is used to construct instances of KRMS Repository AgendaItemDefinition.  It enforces the constraints of the {@link AgendaItemDefinitionContract}.
209     */
210    public static class Builder implements AgendaItemDefinitionContract, ModelBuilder, Serializable {
211                
212        private String id;
213        private String agendaId;
214        private String ruleId;
215        private String subAgendaId;
216        private String whenTrueId;
217        private String whenFalseId;
218        private String alwaysId;
219        private Long versionNumber;
220        
221        private RuleDefinition.Builder rule;
222        private AgendaDefinition.Builder subAgenda;
223        
224        private AgendaItemDefinition.Builder whenTrue;
225        private AgendaItemDefinition.Builder whenFalse;
226        private AgendaItemDefinition.Builder always;
227        
228
229                /**
230                 * Private constructor for creating a builder with all of it's required attributes.
231                 */
232        private Builder(String id, String agendaId) {
233                setId(id);
234                setAgendaId(agendaId);
235        }
236
237        /**
238         * Create a builder with the given parameters.
239         *
240         * @param id
241         * @param agendaId
242         * @return Builder
243         */
244        public static Builder create(String id, String agendaId){
245                return new Builder(id, agendaId);
246        }
247
248        /**
249         * Creates a builder by populating it with data from the given {@link AgendaItemDefinitionContract}.
250         * 
251         * @param contract the contract from which to populate this builder
252         * @return an instance of the builder populated with data from the contract
253         * @throws IllegalArgumentException if the contract is null
254         */
255        public static Builder create(AgendaItemDefinitionContract contract) {
256                if (contract == null) {
257                throw new IllegalArgumentException("contract is null");
258                }
259                Builder builder =  new Builder(contract.getId(), contract.getAgendaId());
260                builder.setRuleId(contract.getRuleId());
261                builder.setSubAgendaId(contract.getSubAgendaId());
262                builder.setWhenTrueId(contract.getWhenTrueId());
263                builder.setWhenFalseId(contract.getWhenFalseId());
264                builder.setAlwaysId(contract.getAlwaysId());
265                
266                if (contract.getRule() != null){
267                        builder.setRule(RuleDefinition.Builder.create( contract.getRule() ));
268                }
269                if (contract.getSubAgenda() != null){
270                        builder.setSubAgenda( AgendaDefinition.Builder.create( contract.getSubAgenda()));
271                }
272                if (contract.getWhenTrue() != null){
273                        builder.setWhenTrue( AgendaItemDefinition.Builder.create( contract.getWhenTrue()));
274                }
275                if (contract.getWhenFalse() != null){
276                        builder.setWhenFalse( AgendaItemDefinition.Builder.create( contract.getWhenFalse()));
277                }
278                if (contract.getAlways() != null){
279                        builder.setAlways( AgendaItemDefinition.Builder.create( contract.getAlways()));
280                }
281            builder.setVersionNumber(contract.getVersionNumber());
282                return builder;
283        }
284
285                /**
286                 * Sets the value of the id on this builder to the given value.
287                 * 
288                 * @param agendaItemId the agenda item id to set, may be null, must not be blank
289         * <p>The agenda item id is generated by the system.  For new agenda items (not yet persisted) this field is null.
290         *    For existing agenda items this field is the generated id.</p>
291                 * @throws IllegalArgumentException if the id is blank
292                 */
293        public void setId(String agendaItemId) {
294            if (id != null && StringUtils.isBlank(agendaItemId)) {
295                throw new IllegalArgumentException("agendaItemId must be null or non-blank");
296            }
297                        this.id = agendaItemId;
298                }
299
300        /**
301         * Set the value of the agenda id on this builder to the given value.
302         *
303         * @param agendaId the agenda id of the agenda item to set, must not be null or blank
304         * @throws IllegalArgumentException if the agenda id is null or blank
305         */
306        public void setAgendaId(String agendaId) {
307            if (StringUtils.isBlank(agendaId)) {
308                throw new IllegalArgumentException("agendaId is blank");
309            }
310                        this.agendaId = agendaId;
311                }
312
313        /**
314         * Set the value of the rule id on this builder to the given value.
315         * @param ruleId the rule id of the agenda item to set
316         */
317                public void setRuleId(String ruleId) {
318                        this.ruleId = ruleId;
319                }
320
321        /**
322         * Set the value of the sub agenda id on this builder to the given value.
323         * @param subAgendaId the sub agenda id of the agenda item to set
324         */
325                public void setSubAgendaId(String subAgendaId) {
326                        this.subAgendaId = subAgendaId;
327                }
328
329        /**
330         * Set the value of the agenda item id for the "when true" condition on this builder to the given value.
331         * @param whenTrueId the agenda item id for the "when true" condition of the agenda item to set
332         */
333                public void setWhenTrueId(String whenTrueId) {
334                        this.whenTrueId = whenTrueId;
335                }
336
337        /**
338         * Set the value of the agenda item id for the "when false" condition on this builder to the given value.
339         * @param whenFalseId the agenda item id for the "when false" condition of the agenda item to set
340         */
341                public void setWhenFalseId(String whenFalseId) {
342                        this.whenFalseId = whenFalseId;
343                }
344
345        /**
346         * Set the value of the agenda item id for the "always" condition on this builder to the given value.
347         * @param alwaysId the agenda item id for the "always" condition of the agenda item to set
348         */
349                public void setAlwaysId(String alwaysId) {
350                        this.alwaysId = alwaysId;
351                }
352
353        /**
354         * Set the value of the rule on this builder to the given value.
355         * @param rule the rule of the agenda item to set
356         */
357                public void setRule(RuleDefinition.Builder rule) {
358                        this.rule = rule;
359                }
360
361        /**
362         * Set the value of the sub agenda on this builder to the given value.
363         * @param subAgenda the sub agenda of the agenda item to set
364         */
365                public void setSubAgenda(AgendaDefinition.Builder subAgenda) {
366                        this.subAgenda = subAgenda;
367                }
368
369        /**
370         * Set the value of the agenda item for the "when true" condition on this builder to the given value.
371         * @param whenTrue the agenda item for the "when true" condition of the agenda item to set
372         */
373                public void setWhenTrue(AgendaItemDefinition.Builder whenTrue) {
374                        this.whenTrue = whenTrue;
375                }
376
377        /**
378         * Set the value of the agenda item for the "when false" condition on this builder to the given value.
379         * @param whenFalse the agenda item for the "when false" condition of the agenda item to set
380         */
381                public void setWhenFalse(AgendaItemDefinition.Builder whenFalse) {
382                        this.whenTrue = whenFalse;
383                }
384
385        /**
386         * Set the value of the agenda item for the "always" condition on this builder to the given value.
387         * @param always the agenda item for the "always" condition of the agenda item to set
388         */
389                public void setAlways(AgendaItemDefinition.Builder always) {
390                        this.always = always;
391                }
392
393        /**
394         * Set the value of the version number on this builder to the given value.
395         * @param versionNumber the version number set
396         */
397                public void setVersionNumber(Long versionNumber){
398            this.versionNumber = versionNumber;
399        }
400                        
401                @Override
402                public String getId() {
403                        return id;
404                }
405
406                @Override
407                public String getAgendaId() {
408                        return agendaId;
409                }
410
411                @Override
412                public String getRuleId() {
413                        return ruleId;
414                }
415
416                @Override
417                public String getSubAgendaId() {
418                        return subAgendaId;
419                }
420
421                @Override
422                public String getWhenTrueId() {
423                        return whenTrueId;
424                }
425
426                @Override
427                public String getWhenFalseId() {
428                        return whenFalseId;
429                }
430
431                @Override
432                public String getAlwaysId() {
433                        return alwaysId;
434                }
435
436                @Override
437                public RuleDefinition.Builder getRule() {
438                        return rule;
439                }
440
441                @Override
442                public AgendaDefinition.Builder getSubAgenda() {
443                        return subAgenda;
444                }
445
446                @Override
447                public AgendaItemDefinition.Builder getWhenTrue() {
448                        return whenTrue;
449                }
450
451                @Override
452                public AgendaItemDefinition.Builder getWhenFalse() {
453                        return whenFalse;
454                }
455
456                @Override
457                public AgendaItemDefinition.Builder getAlways() {
458                        return always;
459                }
460
461        @Override
462        public Long getVersionNumber() {
463            return versionNumber;
464        }
465
466                /**
467                 * Builds an instance of a AgendaItemDefinition based on the current state of the builder.
468                 * 
469                 * @return the fully-constructed AgendaItemDefinition
470                 */
471        @Override
472        public AgendaItemDefinition build() {
473            return new AgendaItemDefinition(this);
474        }
475                
476    }
477        
478        /**
479         * Defines some internal constants used on this class.
480         */
481        static class Constants {
482                final static String ROOT_ELEMENT_NAME = "AgendaItemDefinition";
483                final static String TYPE_NAME = "AgendaItemType";
484        }
485        
486        /**
487         * A private class which exposes constants which define the XML element names to use
488         * when this object is marshalled to XML.
489         */
490        public static class Elements {
491                final static String ID = "id";
492                final static String AGENDA_ID = "agendaId";
493                final static String RULE_ID = "ruleId";
494                final static String SUB_AGENDA_ID = "subAgendaId";
495                final static String WHEN_TRUE_ID = "whenTrueId";
496                final static String WHEN_FALSE_ID = "whenFalseId";
497                final static String ALWAYS_ID = "alwaysId";
498
499                final static String RULE = "rule";
500                final static String SUB_AGENDA = "subAgenda";
501                final static String WHEN_TRUE = "whenTrue";
502                final static String WHEN_FALSE = "whenFalse";
503                final static String ALWAYS = "always";
504        }
505
506}