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