001/** 002 * Copyright 2005-2015 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.KrmsConstants; 033import 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}) 060public 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 setVersionNumber(0L); 237 } 238 239 /** 240 * Create a builder with the given parameters. 241 * 242 * @param id 243 * @param agendaId 244 * @return Builder 245 */ 246 public static Builder create(String id, String agendaId){ 247 return new Builder(id, agendaId); 248 } 249 250 /** 251 * Creates a builder by populating it with data from the given {@link AgendaItemDefinitionContract}. 252 * 253 * @param contract the contract from which to populate this builder 254 * @return an instance of the builder populated with data from the contract 255 * @throws IllegalArgumentException if the contract is null 256 */ 257 public static Builder create(AgendaItemDefinitionContract contract) { 258 if (contract == null) { 259 throw new IllegalArgumentException("contract is null"); 260 } 261 Builder builder = new Builder(contract.getId(), contract.getAgendaId()); 262 builder.setRuleId(contract.getRuleId()); 263 builder.setSubAgendaId(contract.getSubAgendaId()); 264 builder.setWhenTrueId(contract.getWhenTrueId()); 265 builder.setWhenFalseId(contract.getWhenFalseId()); 266 builder.setAlwaysId(contract.getAlwaysId()); 267 268 if (contract.getRule() != null){ 269 builder.setRule(RuleDefinition.Builder.create( contract.getRule() )); 270 } 271 if (contract.getSubAgenda() != null){ 272 builder.setSubAgenda( AgendaDefinition.Builder.create( contract.getSubAgenda())); 273 } 274 if (contract.getWhenTrue() != null){ 275 builder.setWhenTrue( AgendaItemDefinition.Builder.create( contract.getWhenTrue())); 276 } 277 if (contract.getWhenFalse() != null){ 278 builder.setWhenFalse( AgendaItemDefinition.Builder.create( contract.getWhenFalse())); 279 } 280 if (contract.getAlways() != null){ 281 builder.setAlways( AgendaItemDefinition.Builder.create( contract.getAlways())); 282 } 283 builder.setVersionNumber(contract.getVersionNumber()); 284 return builder; 285 } 286 287 /** 288 * Sets the value of the id on this builder to the given value. 289 * 290 * @param agendaItemId the agenda item id to set, may be null, must not be blank 291 * <p>The agenda item id is generated by the system. For new agenda items (not yet persisted) this field is null. 292 * For existing agenda items this field is the generated id.</p> 293 * @throws IllegalArgumentException if the id is blank 294 */ 295 public void setId(String agendaItemId) { 296 if (agendaItemId != null && StringUtils.isBlank(agendaItemId)) { 297 throw new IllegalArgumentException("agendaItemId must be null or non-blank"); 298 } 299 this.id = agendaItemId; 300 } 301 302 /** 303 * Set the value of the agenda id on this builder to the given value. 304 * 305 * @param agendaId the agenda id of the agenda item to set, must not be null or blank 306 * @throws IllegalArgumentException if the agenda id is null or blank 307 */ 308 public void setAgendaId(String agendaId) { 309 if (StringUtils.isBlank(agendaId)) { 310 throw new IllegalArgumentException("agendaId is blank"); 311 } 312 this.agendaId = agendaId; 313 } 314 315 /** 316 * Set the value of the rule id on this builder to the given value. 317 * @param ruleId the rule id of the agenda item to set 318 */ 319 public void setRuleId(String ruleId) { 320 this.ruleId = ruleId; 321 } 322 323 /** 324 * Set the value of the sub agenda id on this builder to the given value. 325 * @param subAgendaId the sub agenda id of the agenda item to set 326 */ 327 public void setSubAgendaId(String subAgendaId) { 328 this.subAgendaId = subAgendaId; 329 } 330 331 /** 332 * Set the value of the agenda item id for the "when true" condition on this builder to the given value. 333 * @param whenTrueId the agenda item id for the "when true" condition of the agenda item to set 334 */ 335 public void setWhenTrueId(String whenTrueId) { 336 this.whenTrueId = whenTrueId; 337 } 338 339 /** 340 * Set the value of the agenda item id for the "when false" condition on this builder to the given value. 341 * @param whenFalseId the agenda item id for the "when false" condition of the agenda item to set 342 */ 343 public void setWhenFalseId(String whenFalseId) { 344 this.whenFalseId = whenFalseId; 345 } 346 347 /** 348 * Set the value of the agenda item id for the "always" condition on this builder to the given value. 349 * @param alwaysId the agenda item id for the "always" condition of the agenda item to set 350 */ 351 public void setAlwaysId(String alwaysId) { 352 this.alwaysId = alwaysId; 353 } 354 355 /** 356 * Set the value of the rule on this builder to the given value. 357 * @param rule the rule of the agenda item to set 358 */ 359 public void setRule(RuleDefinition.Builder rule) { 360 this.rule = rule; 361 } 362 363 /** 364 * Set the value of the sub agenda on this builder to the given value. 365 * @param subAgenda the sub agenda of the agenda item to set 366 */ 367 public void setSubAgenda(AgendaDefinition.Builder subAgenda) { 368 this.subAgenda = subAgenda; 369 } 370 371 /** 372 * Set the value of the agenda item for the "when true" condition on this builder to the given value. 373 * Has the additional side effect of setting whenTrueId to the ID value of the {{whenTrue}} argument. 374 * @param whenTrue the agenda item for the "when true" condition of the agenda item to set 375 */ 376 public void setWhenTrue(AgendaItemDefinition.Builder whenTrue) { 377 this.whenTrue = whenTrue; 378 this.whenTrueId = (whenTrue != null) ? whenTrue.getId() : null; 379 } 380 381 /** 382 * Set the value of the agenda item for the "when false" condition on this builder to the given value. 383 * Has the additional side effect of setting whenTrueId to the ID value of the {{whenFalse}} argument. 384 * @param whenFalse the agenda item for the "when false" condition of the agenda item to set 385 */ 386 public void setWhenFalse(AgendaItemDefinition.Builder whenFalse) { 387 this.whenFalse = whenFalse; 388 this.whenFalseId = (whenFalse != null) ? whenFalse.getId() : null; 389 } 390 391 /** 392 * Set the value of the agenda item for the "always" condition on this builder to the given value. 393 * Has the additional side effect of setting {{whenTrueId}} to the ID value of the always argument. 394 * @param always the agenda item for the "always" condition of the agenda item to set 395 */ 396 public void setAlways(AgendaItemDefinition.Builder always) { 397 this.always = always; 398 this.alwaysId = (always != null) ? always.getId() : null; 399 } 400 401 /** 402 * Set the value of the version number on this builder to the given value. 403 * @param versionNumber the version number set 404 */ 405 public void setVersionNumber(Long versionNumber){ 406 this.versionNumber = versionNumber; 407 } 408 409 @Override 410 public String getId() { 411 return id; 412 } 413 414 @Override 415 public String getAgendaId() { 416 return agendaId; 417 } 418 419 @Override 420 public String getRuleId() { 421 return ruleId; 422 } 423 424 @Override 425 public String getSubAgendaId() { 426 return subAgendaId; 427 } 428 429 @Override 430 public String getWhenTrueId() { 431 return whenTrueId; 432 } 433 434 @Override 435 public String getWhenFalseId() { 436 return whenFalseId; 437 } 438 439 @Override 440 public String getAlwaysId() { 441 return alwaysId; 442 } 443 444 @Override 445 public RuleDefinition.Builder getRule() { 446 return rule; 447 } 448 449 @Override 450 public AgendaDefinition.Builder getSubAgenda() { 451 return subAgenda; 452 } 453 454 @Override 455 public AgendaItemDefinition.Builder getWhenTrue() { 456 return whenTrue; 457 } 458 459 @Override 460 public AgendaItemDefinition.Builder getWhenFalse() { 461 return whenFalse; 462 } 463 464 @Override 465 public AgendaItemDefinition.Builder getAlways() { 466 return always; 467 } 468 469 @Override 470 public Long getVersionNumber() { 471 return versionNumber; 472 } 473 474 /** 475 * Builds an instance of a AgendaItemDefinition based on the current state of the builder. 476 * 477 * @return the fully-constructed AgendaItemDefinition 478 */ 479 @Override 480 public AgendaItemDefinition build() { 481 return new AgendaItemDefinition(this); 482 } 483 484 } 485 486 /** 487 * Defines some internal constants used on this class. 488 */ 489 static class Constants { 490 final static String ROOT_ELEMENT_NAME = "AgendaItemDefinition"; 491 final static String TYPE_NAME = "AgendaItemType"; 492 } 493 494 /** 495 * A private class which exposes constants which define the XML element names to use 496 * when this object is marshalled to XML. 497 */ 498 public static class Elements { 499 final static String ID = "id"; 500 final static String AGENDA_ID = "agendaId"; 501 final static String RULE_ID = "ruleId"; 502 final static String SUB_AGENDA_ID = "subAgendaId"; 503 final static String WHEN_TRUE_ID = "whenTrueId"; 504 final static String WHEN_FALSE_ID = "whenFalseId"; 505 final static String ALWAYS_ID = "alwaysId"; 506 507 final static String RULE = "rule"; 508 final static String SUB_AGENDA = "subAgenda"; 509 final static String WHEN_TRUE = "whenTrue"; 510 final static String WHEN_FALSE = "whenFalse"; 511 final static String ALWAYS = "always"; 512 } 513 514 public static class Cache { 515 public static final String NAME = KrmsConstants.Namespaces.KRMS_NAMESPACE_2_0 + "/" + AgendaItemDefinition.Constants.TYPE_NAME; 516 } 517}