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.proposition;
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
033 /**
034 * Concrete model object implementation of KRMS Proposition Parameter
035 * immutable.
036 * Instances of PropositionParameter can be (un)marshalled to and from XML.
037 *
038 * @see PropositionParameterContract
039 */
040 @XmlRootElement(name = PropositionParameter.Constants.ROOT_ELEMENT_NAME)
041 @XmlAccessorType(XmlAccessType.NONE)
042 @XmlType(name = PropositionParameter.Constants.TYPE_NAME, propOrder = {
043 PropositionParameter.Elements.ID,
044 PropositionParameter.Elements.PROP_ID,
045 PropositionParameter.Elements.VALUE,
046 PropositionParameter.Elements.PARM_TYPE,
047 PropositionParameter.Elements.SEQUENCE,
048 CoreConstants.CommonElements.VERSION_NUMBER,
049 CoreConstants.CommonElements.FUTURE_ELEMENTS
050 })
051 public final class PropositionParameter extends AbstractDataTransferObject implements PropositionParameterContract {
052 private static final long serialVersionUID = 2783959459503209577L;
053
054 @XmlElement(name = Elements.ID, required=true)
055 private String id;
056 @XmlElement(name = Elements.PROP_ID, required=true)
057 private String propId;
058 @XmlElement(name = Elements.VALUE, required=true)
059 private String value;
060 @XmlElement(name = Elements.PARM_TYPE, required=true)
061 private String parameterType;
062 @XmlElement(name = Elements.SEQUENCE, required=true)
063 private Integer sequenceNumber;
064 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
065 private final Long versionNumber;
066
067 @SuppressWarnings("unused")
068 @XmlAnyElement
069 private final Collection<org.w3c.dom.Element> _futureElements = null;
070
071 /**
072 * This constructor should never be called.
073 * It is only present for use during JAXB unmarshalling.
074 */
075 private PropositionParameter() {
076 this.id = null;
077 this.propId = null;
078 this.value = null;
079 this.parameterType = null;
080 this.sequenceNumber = null;
081 this.versionNumber = null;
082 }
083
084 /**
085 * Constructs a PropositionParameter from the given builder.
086 * This constructor is private and should only ever be invoked from the builder.
087 *
088 * @param builder the Builder from which to construct the PropositionParameter
089 */
090 private PropositionParameter(Builder builder) {
091 this.id = builder.getId();
092 this.propId = builder.getPropId();
093 this.value = builder.getValue();
094 this.parameterType = builder.getParameterType();
095 this.sequenceNumber = builder.getSequenceNumber();
096 this.versionNumber = builder.getVersionNumber();
097 }
098
099 @Override
100 public String getId() {
101 return this.id;
102 }
103
104 @Override
105 public String getPropId() {
106 return this.propId;
107 }
108
109 @Override
110 public String getValue() {
111 return this.value;
112 }
113
114 @Override
115 public String getParameterType() {
116 return this.parameterType;
117 }
118 @Override
119 public Integer getSequenceNumber() {
120 return this.sequenceNumber;
121 }
122
123 @Override
124 public Long getVersionNumber() {
125 return versionNumber;
126 }
127
128 /**
129 * This builder is used to construct instances of PropositionParameter.
130 * It enforces the constraints of the {@link PropositionParameterContract}.
131 */
132 public static class Builder implements PropositionParameterContract, ModelBuilder, Serializable {
133 private static final long serialVersionUID = -6889320709850568900L;
134
135 private String id;
136 private String propId;
137 private String value;
138 private String parameterType;
139 private Integer sequenceNumber;
140 private Long versionNumber;
141 private PropositionDefinition.Builder proposition;
142
143 /**
144 * Private constructor for creating a builder with all of it's required attributes.
145 * @param id the id value to set, must not be null or blank
146 * @param propId the propId value to set, must not be null or blank
147 * @param value the value value to set, must not be null or blank
148 * @param parameterType the value parameterType to set, must not be null or blank
149 * @param sequenceNumber the value sequenceNumber to set, must not be null or blank
150 */
151 private Builder(String id, String propId, String value, String parameterType, Integer sequenceNumber) {
152 setId(id);
153 setPropId(propId);
154 setValue(value);
155 setParameterType(parameterType);
156 setSequenceNumber(sequenceNumber);
157 }
158
159 /**
160 * Create a builder using the given values
161 * @param id the id value to set, must not be null or blank
162 * @param propId the propId value to set, must not be null or blank
163 * @param value the value value to set, must not be null or blank
164 * @param parameterType the value parameterType to set, must not be null or blank
165 * @param sequenceNumber the value sequenceNumber to set, must not be null or blank
166 * @return Builder with the given values set
167 */
168 public static Builder create(String id, String propId, String value, String parameterType, Integer sequenceNumber) {
169 return new Builder(id, propId, value, parameterType, sequenceNumber);
170 }
171
172 /**
173 * Creates a builder by populating it with data from the given {@link PropositionParameterContract}.
174 *
175 * @param contract the contract from which to populate this builder
176 * @return an instance of the builder populated with data from the contract
177 */
178 public static Builder create(PropositionParameterContract contract) {
179 if (contract == null) {
180 throw new IllegalArgumentException("contract is null");
181 }
182 Builder builder = new Builder(contract.getId(), contract.getPropId(), contract.getValue(), contract.getParameterType(), contract.getSequenceNumber());
183 builder.setVersionNumber(contract.getVersionNumber());
184 return builder;
185 }
186
187 /**
188 * Sets the value of the id on this builder to the given value.
189 *
190 * @param id the id value to set, must not be null or blank
191 * @throws IllegalArgumentException if the id is null or blank
192 */
193 public void setId(String id) {
194 if (id != null && StringUtils.isBlank(id)) {
195 throw new IllegalArgumentException("id must not be null or blank");
196 }
197 this.id = id;
198 }
199
200 /**
201 * Sets the value of the propId on this builder to the given value.
202 *
203 * @param propId the propId value to set, must not be null or blank
204 * @throws IllegalArgumentException if the propId is null or blank
205 */
206 public void setPropId(String propId) {
207 // have to be able to create it with a null propId for chicken/egg reasons.
208 if (null != propId && StringUtils.isBlank(propId)) {
209 throw new IllegalArgumentException("propId must be not be null or blank");
210 }
211 this.propId = propId;
212 }
213
214 /**
215 * Sets the value of the value on this builder to the given value.
216 *
217 * @param value the value value to set, must not be null or blank
218 * @throws IllegalArgumentException if the value is null or blank
219 */
220 public void setValue(String value) {
221 if (StringUtils.isBlank(value)) {
222 throw new IllegalArgumentException("value must not be null or blank");
223 }
224 this.value = value;
225 }
226
227 /**
228 * Sets the value of the parameterType on this builder to the given value.
229 *
230 * @param parameterType the value parameterType to set, must not be null or blank
231 * @throws IllegalArgumentException if the parameterType is null, blank, or invalid
232 */
233 public void setParameterType(String parameterType) {
234 if (StringUtils.isBlank(parameterType)){
235 throw new IllegalArgumentException("parameter type is null or blank");
236 }
237 if (!PropositionParameterType.VALID_TYPE_CODES.contains(parameterType)){
238 throw new IllegalArgumentException("parameter type is invalid");
239 }
240 // TODO: check against valid values
241 this.parameterType = parameterType;
242 }
243
244 /**
245 * Sets the value of the sequenceNumber on this builder to the given value.
246 *
247 * @param sequenceNumber the value sequenceNumber to set, must not be null or blank
248 * @throws IllegalArgumentException if the sequenceNumber is null, blank, or invalid
249 */
250 public void setSequenceNumber(Integer sequenceNumber) {
251 if (sequenceNumber == null) {
252 throw new IllegalArgumentException("sequenceNumber type is blank");
253 }
254 this.sequenceNumber = sequenceNumber;
255 }
256
257 /**
258 * Sets the value of the proposition on this builder to the given value.
259 *
260 * @param proposition the value proposition to set
261 */
262 public void setProposition(PropositionDefinition.Builder proposition) {
263 if (proposition != null && !StringUtils.isBlank(proposition.getId())) {
264 setPropId(proposition.getId());
265 }
266 this.proposition = proposition;
267 }
268
269 /**
270 * Sets the value of the versionNumber on this builder to the given value.
271 *
272 * @param versionNumber the value versionNumber to set
273 */
274 public void setVersionNumber(Long versionNumber){
275 this.versionNumber = versionNumber;
276 }
277
278 @Override
279 public String getId() {
280 return id;
281 }
282
283 @Override
284 public String getPropId() {
285 return propId;
286 }
287
288 @Override
289 public String getValue() {
290 return value;
291 }
292
293 @Override
294 public String getParameterType() {
295 return parameterType;
296 }
297
298 @Override
299 public Integer getSequenceNumber() {
300 return sequenceNumber;
301 }
302
303 @Override
304 public Long getVersionNumber() {
305 return versionNumber;
306 }
307
308 /**
309 * Builds an instance of a PropositionParameter based on the current state of the builder.
310 *
311 * @return the fully-constructed PropositionParameter
312 */
313 @Override
314 public PropositionParameter build() {
315 if (proposition == null && StringUtils.isBlank(propId)) {
316 throw new IllegalStateException("either proposition must be non-null or propId must be non-blank");
317 }
318 return new PropositionParameter(this);
319 }
320
321 }
322
323 /**
324 * Defines some internal constants used on this class.
325 */
326 static class Constants {
327 final static String ROOT_ELEMENT_NAME = "PropositionParameter";
328 final static String TYPE_NAME = "PropositionParameterType";
329 }
330
331 /**
332 * A private class which exposes constants which define the XML element names to use
333 * when this object is marshalled to XML.
334 */
335 public static class Elements {
336 final static String ID = "id";
337 final static String PROP_ID = "propId";
338 final static String VALUE = "value";
339 final static String PARM_TYPE = "parameterType";
340 final static String SEQUENCE = "sequenceNumber";
341 }
342
343 }