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.ArrayList; 020 import java.util.Collection; 021 import java.util.Collections; 022 import java.util.List; 023 024 import javax.xml.bind.annotation.XmlAccessType; 025 import javax.xml.bind.annotation.XmlAccessorType; 026 import javax.xml.bind.annotation.XmlAnyElement; 027 import javax.xml.bind.annotation.XmlElement; 028 import javax.xml.bind.annotation.XmlElements; 029 import javax.xml.bind.annotation.XmlRootElement; 030 import javax.xml.bind.annotation.XmlType; 031 032 import org.apache.commons.lang.StringUtils; 033 import org.kuali.rice.core.api.CoreConstants; 034 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 035 import org.kuali.rice.core.api.mo.ModelBuilder; 036 037 /** 038 * Concrete model object implementation of KRMS Repository AgendaTreeDefinition 039 * immutable. 040 * Instances of Agenda can be (un)marshalled to and from XML. 041 * 042 * @see AgendaDefinitionContract 043 * 044 * @author Kuali Rice Team (rice.collab@kuali.org) 045 */ 046 @XmlRootElement(name = AgendaTreeDefinition.Constants.ROOT_ELEMENT_NAME) 047 @XmlAccessorType(XmlAccessType.NONE) 048 @XmlType(name = AgendaTreeDefinition.Constants.TYPE_NAME, propOrder = { 049 AgendaTreeDefinition.Elements.AGENDA_ID, 050 AgendaTreeDefinition.Elements.ENTRIES, 051 CoreConstants.CommonElements.FUTURE_ELEMENTS 052 }) 053 public final class AgendaTreeDefinition extends AbstractDataTransferObject { 054 055 private static final long serialVersionUID = 3355519740298280591L; 056 057 @XmlElement(name = Elements.AGENDA_ID, required = false) 058 private final String agendaId; 059 060 @XmlElements(value = { 061 @XmlElement(name = Elements.RULE, type = AgendaTreeRuleEntry.class, required = false), 062 @XmlElement(name = Elements.SUB_AGENDA, type = AgendaTreeSubAgendaEntry.class, required = false) 063 }) 064 private final List<AgendaTreeEntryDefinitionContract> entries; 065 066 @SuppressWarnings("unused") 067 @XmlAnyElement 068 private final Collection<org.w3c.dom.Element> _futureElements = null; 069 070 /** 071 * This constructor should never be called. 072 * It is only present for use during JAXB unmarshalling. 073 */ 074 private AgendaTreeDefinition() { 075 this.agendaId = null; 076 this.entries = null; 077 } 078 079 /** 080 * Constructs a AgendaTreeDefinition from the given builder. 081 * This constructor is private and should only ever be invoked from the builder. 082 * 083 * @param builder the Builder from which to construct the AgendaTreeDefinition 084 */ 085 private AgendaTreeDefinition(Builder builder) { 086 this.agendaId = builder.getAgendaId(); 087 this.entries = builder.getEntries(); 088 } 089 090 /** 091 * Returns the agendaId 092 * @return agendaId of the AgendaTreeDefinition 093 */ 094 public String getAgendaId() { 095 return agendaId; 096 } 097 098 /** 099 * Returns the {@link AgendaTreeEntryDefinitionContract}s 100 * @return List<{@link AgendaTreeEntryDefinitionContract}>s 101 */ 102 public List<AgendaTreeEntryDefinitionContract> getEntries() { 103 if (entries == null){ 104 return Collections.emptyList(); 105 } 106 return Collections.unmodifiableList(entries); 107 } 108 109 110 /** 111 * This builder is used to construct instances of AgendaTreeDefinition. 112 */ 113 public static class Builder implements ModelBuilder, Serializable { 114 115 private static final long serialVersionUID = 7981215392039022620L; 116 117 private String agendaId; 118 private List<AgendaTreeEntryDefinitionContract> entries; 119 120 /** 121 * Private constructor for creating a builder with all of it's required attributes. 122 */ 123 private Builder() { 124 this.entries = new ArrayList<AgendaTreeEntryDefinitionContract>(); 125 } 126 127 /** 128 * Create a new Builder 129 * @return a new Builder 130 */ 131 public static Builder create(){ 132 return new Builder(); 133 } 134 135 /** 136 * Sets the agendaId to the given parameter 137 * @param agendaId to set the apendaId value to, must not be null or blank 138 * @thows IllegalArgumentException if the agendaId is null or blank 139 */ 140 public void setAgendaId(String agendaId) { 141 if (StringUtils.isBlank(agendaId)) { 142 throw new IllegalArgumentException("agendaItemId was null or blank"); 143 } 144 this.agendaId = agendaId; 145 } 146 147 /** 148 * Adds the given {@link AgendaTreeRuleEntry} to the entries. 149 * @param ruleEntry {@link AgendaTreeRuleEntry} to be added to the entries, must not be null 150 * @thows IllegalArgumentException if the ruleEntry is null 151 */ 152 public void addRuleEntry(AgendaTreeRuleEntry ruleEntry) { 153 if (ruleEntry == null) { 154 throw new IllegalArgumentException("ruleEntry was null"); 155 } 156 entries.add(ruleEntry); 157 } 158 159 /** 160 * Adds the given {@link AgendaTreeSubAgendaEntry} to the entries. 161 * @param subAgendaEntry {@link AgendaTreeSubAgendaEntry} to add to the entries, must not be null 162 * @thows IllegalArgumentException if the subAgendaEntry is null 163 */ 164 public void addSubAgendaEntry(AgendaTreeSubAgendaEntry subAgendaEntry) { 165 if (subAgendaEntry == null) { 166 throw new IllegalArgumentException("subAgendaEntry was null"); 167 } 168 entries.add(subAgendaEntry); 169 } 170 171 /** 172 * Returns the agendaId 173 * @return agendaId 174 */ 175 public String getAgendaId() { 176 return this.agendaId; 177 } 178 179 /** 180 * Returns the list of {@link AgendaTreeEntryDefinitionContract}s entries 181 * @return List<{@link AgendaTreeEntryDefinitionContract}> of entries 182 */ 183 public List<AgendaTreeEntryDefinitionContract> getEntries() { 184 return this.entries; 185 } 186 187 @Override 188 public AgendaTreeDefinition build() { 189 return new AgendaTreeDefinition(this); 190 } 191 192 } 193 194 /** 195 * Defines some internal constants used on this class. 196 */ 197 static class Constants { 198 final static String ROOT_ELEMENT_NAME = "agendaTreeDefinition"; 199 final static String TYPE_NAME = "AgendaTreeDefinition"; 200 } 201 202 /** 203 * A private class which exposes constants which define the XML element names to use 204 * when this object is marshalled to XML. 205 */ 206 static class Elements { 207 final static String AGENDA_ID = "agendaId"; 208 final static String ENTRIES = "entries"; 209 final static String RULE = "rule"; 210 final static String SUB_AGENDA = "subAgenda"; 211 } 212 213 }