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     */
016    package org.kuali.rice.krms.api.repository.agenda;
017    
018    import java.io.Serializable;
019    import java.util.Collection;
020    
021    import javax.xml.bind.annotation.XmlAccessType;
022    import javax.xml.bind.annotation.XmlAccessorType;
023    import javax.xml.bind.annotation.XmlAnyElement;
024    import javax.xml.bind.annotation.XmlElement;
025    import javax.xml.bind.annotation.XmlRootElement;
026    import javax.xml.bind.annotation.XmlType;
027    
028    import org.apache.commons.lang.StringUtils;
029    import org.kuali.rice.core.api.CoreConstants;
030    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
031    import org.kuali.rice.core.api.mo.ModelBuilder;
032    import 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    })
059    public 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    }