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.term;
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.BuilderUtils.Transformer;
033
034 /**
035 * Immutable DTO for TermParameters. An instance represents a single parameter on a Term.
036 * Construction must be done via the {@link Builder} inner class.
037 *
038 * @author Kuali Rice Team (rice.collab@kuali.org)
039 *
040 */
041 @XmlRootElement(name = TermParameterDefinition.Constants.ROOT_ELEMENT_NAME)
042 @XmlAccessorType(XmlAccessType.NONE)
043 @XmlType(name = TermParameterDefinition.Constants.TYPE_NAME, propOrder = {
044 TermParameterDefinition.Elements.ID,
045 TermParameterDefinition.Elements.NAME,
046 TermParameterDefinition.Elements.VALUE,
047 CoreConstants.CommonElements.VERSION_NUMBER,
048 CoreConstants.CommonElements.FUTURE_ELEMENTS
049 })
050 public final class TermParameterDefinition extends AbstractDataTransferObject implements TermParameterDefinitionContract {
051
052 private static final long serialVersionUID = 1L;
053
054 @XmlElement(name = Elements.ID, required=true)
055 private final String id;
056
057 private final String termId;
058
059 @XmlElement(name = Elements.NAME, required=true)
060 private final String name;
061
062 @XmlElement(name = Elements.VALUE)
063 private final String value;
064
065 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
066 private final Long versionNumber;
067
068 @SuppressWarnings("unused")
069 @XmlAnyElement
070 private final Collection<org.w3c.dom.Element> _futureElements = null;
071
072 // For JAXB use only, shouldn't be invoked directly
073 private TermParameterDefinition() {
074 id = null;
075 termId = null;
076 name = null;
077 value = null;
078 versionNumber = null;
079 }
080
081 private TermParameterDefinition(Builder builder) {
082 id = builder.getId();
083 termId = builder.getTermId();
084 name = builder.getName();
085 value = builder.getValue();
086 versionNumber = builder.getVersionNumber();
087 }
088
089 public static class Builder implements TermParameterDefinitionContract, ModelBuilder, Serializable {
090
091 private static final long serialVersionUID = 1L;
092
093 private String id;
094 private String termId;
095 private String name;
096 private String value;
097 private Long versionNumber;
098
099 private static final String NON_NULL_NON_EMPTY_ERROR =
100 " must be non-null and must contain non-whitespace chars";
101
102 public static final Transformer<TermParameterDefinitionContract, TermParameterDefinition.Builder> toBuilder =
103 new Transformer<TermParameterDefinitionContract, TermParameterDefinition.Builder>() {
104 public Builder transform(TermParameterDefinitionContract input) {
105 return Builder.create(input);
106 };
107 };
108
109 private Builder(String id, String termId, String name, String value) {
110 setId(id);
111 setTermId(termId);
112 setName(name);
113 setValue(value);
114 }
115
116 /**
117 * static factory to create a {@link Builder} from fields
118 *
119 * @param id must be null, or contain non-whitespace
120 * @param termId must be null, or contain non-whitespace
121 * @param name must be non-null
122 * @param value
123 */
124 public static Builder create(String id, String termId, String name, String value) {
125 return new Builder(id, termId, name, value);
126 }
127
128 /**
129 * static factory to create a {@link Builder} from a {@link TermParameterDefinitionContract}
130 *
131 * @param termParameterDefinition
132 */
133 public static Builder create(TermParameterDefinitionContract termParameterDefinition) {
134 Builder builder = new Builder(termParameterDefinition.getId(),
135 termParameterDefinition.getTermId(),
136 termParameterDefinition.getName(),
137 termParameterDefinition.getValue());
138 builder.setVersionNumber(termParameterDefinition.getVersionNumber());
139 return builder;
140 }
141
142 // Setters:
143
144 /**
145 * @param id the id to set. for {@link TermParameterDefinition}s used in creational
146 * service methods, it must be null. Otherwise, it must be non-null and contain non-whitespace chars.
147 * @throws IllegalArgumentException if id is all whitespace chars
148 */
149 public void setId(String id) {
150 if (id != null && StringUtils.isBlank(id)) {
151 throw new IllegalArgumentException("id must contain non-whitespace chars");
152 }
153 this.id = id;
154 }
155
156 /**
157 * @param termId the termId to set
158 */
159 public void setTermId(String termId) {
160 if (termId != null && StringUtils.isBlank(termId)) {
161 throw new IllegalArgumentException("termId must contain non-whitespace chars");
162 }
163 this.termId = termId;
164 }
165
166 /**
167 * @param name the name to set. Must be non-null and contain non-whitespace chars.
168 * @throws IllegalArgumentException if name is null or is all whitespace chars
169 */
170 public void setName(String name) {
171 if (StringUtils.isBlank(name)) {
172 throw new IllegalArgumentException("name" + NON_NULL_NON_EMPTY_ERROR);
173 }
174 this.name = name;
175 }
176
177 /**
178 * @param value the value to set. May be null or empty.
179 */
180 public void setValue(String value) {
181 this.value = value;
182 }
183
184 /**
185 * @param versionNumber the versionNumber to set. May be null.
186 */
187 public void setVersionNumber(Long versionNumber){
188 this.versionNumber = versionNumber;
189 }
190
191 // Getters:
192
193 /**
194 * @return the id
195 */
196 @Override
197 public String getId() {
198 return this.id;
199 }
200
201 /**
202 * @return the termId
203 */
204 @Override
205 public String getTermId() {
206 return this.termId;
207 }
208
209 /**
210 * @return the name
211 */
212 @Override
213 public String getName() {
214 return this.name;
215 }
216
217 /**
218 * @return the value
219 */
220 @Override
221 public String getValue() {
222 return this.value;
223 }
224
225 /**
226 * @return the version number
227 */
228 @Override
229 public Long getVersionNumber() {
230 return this.versionNumber;
231 }
232
233 /**
234 * return a {@link TermParameterDefinition} instance constructed from this {@link Builder}
235 * @see org.kuali.rice.core.api.mo.ModelBuilder#build()
236 */
237 @Override
238 public TermParameterDefinition build() {
239 return new TermParameterDefinition(this);
240 }
241
242 }
243
244
245 /**
246 * @return the id
247 */
248 @Override
249 public String getId() {
250 return this.id;
251 }
252 /**
253 * @return the termId
254 */
255 @Override
256 public String getTermId() {
257 return termId;
258 }
259 /**
260 * @return the name
261 */
262 @Override
263 public String getName() {
264 return this.name;
265 }
266 /**
267 * @return the value
268 */
269 @Override
270 public String getValue() {
271 return this.value;
272 }
273
274 /**
275 * @see org.kuali.rice.core.api.mo.common.Versioned#getVersionNumber()
276 */
277 @Override
278 public Long getVersionNumber() {
279 return versionNumber;
280 }
281
282 public static class Constants {
283 public static final String ROOT_ELEMENT_NAME = "TermParameterDefinition";
284 public static final String TYPE_NAME = "TermParameterDefinitionType";
285 }
286
287 public static class Elements {
288 public static final String ID = "id";
289 public static final String TERM_ID = "termId";
290 public static final String NAME = "name";
291 public static final String VALUE = "value";
292 }
293 }