001 /**
002 * Copyright 2005-2013 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.kim.api.common.template;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.core.api.CoreConstants;
020 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021 import org.kuali.rice.core.api.mo.ModelBuilder;
022 import org.kuali.rice.kim.api.KimConstants;
023 import org.w3c.dom.Element;
024
025 import javax.xml.bind.annotation.XmlAccessType;
026 import javax.xml.bind.annotation.XmlAccessorType;
027 import javax.xml.bind.annotation.XmlAnyElement;
028 import javax.xml.bind.annotation.XmlElement;
029 import javax.xml.bind.annotation.XmlRootElement;
030 import javax.xml.bind.annotation.XmlType;
031 import java.io.Serializable;
032 import java.util.Collection;
033
034 /**
035 * An immutable representation of a {@link TemplateContract}.
036 *
037 * <p>To construct an instance of a Template, use the {@link Template.Builder} class.<p/>
038 */
039 @XmlRootElement(name = Template.Constants.ROOT_ELEMENT_NAME)
040 @XmlAccessorType(XmlAccessType.NONE)
041 @XmlType(name = Template.Constants.TYPE_NAME, propOrder = {
042 Template.Elements.ID,
043 Template.Elements.NAMESPACE_CODE,
044 Template.Elements.NAME,
045 Template.Elements.DESCRIPTION,
046 Template.Elements.KIM_TYPE_ID,
047 Template.Elements.ACTIVE,
048 CoreConstants.CommonElements.VERSION_NUMBER,
049 CoreConstants.CommonElements.OBJECT_ID,
050 CoreConstants.CommonElements.FUTURE_ELEMENTS
051 })
052 public final class Template extends AbstractDataTransferObject implements TemplateContract {
053
054 private static final long serialVersionUID = 1L;
055
056 @XmlElement(name = Template.Elements.ID, required = false)
057 private final String id;
058
059 @XmlElement(name = Template.Elements.NAMESPACE_CODE, required = true)
060 private final String namespaceCode;
061
062 @XmlElement(name = Template.Elements.NAME, required = true)
063 private final String name;
064
065 @XmlElement(name = Template.Elements.DESCRIPTION, required = false)
066 private final String description;
067
068 @XmlElement(name = Template.Elements.KIM_TYPE_ID, required = true)
069 private final String kimTypeId;
070
071 @XmlElement(name = Template.Elements.ACTIVE, required = false)
072 private final boolean active;
073
074 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
075 private final Long versionNumber;
076
077 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
078 private final String objectId;
079
080 @SuppressWarnings("unused")
081 @XmlAnyElement
082 private final Collection<Element> _futureElements = null;
083
084 /**
085 * A constructor to be used only by JAXB unmarshalling.
086 *
087 */
088 private Template() {
089 this.id = null;
090 this.namespaceCode = null;
091 this.name = null;
092 this.description = null;
093 this.kimTypeId = null;
094 this.active = false;
095 this.versionNumber = Long.valueOf(1L);
096 this.objectId = null;
097 }
098
099 /**
100 * A constructor using the Builder.
101 *
102 * @param builder
103 */
104 private Template(Builder builder) {
105 this.id = builder.getId();
106 this.namespaceCode = builder.getNamespaceCode();
107 this.name = builder.getName();
108 this.description = builder.getDescription();
109 this.kimTypeId = builder.getKimTypeId();
110
111 this.active = builder.isActive();
112 this.versionNumber = builder.getVersionNumber();
113 this.objectId = builder.getObjectId();
114 }
115
116 /**
117 * @see TemplateContract#getId()
118 */
119 @Override
120 public String getId() {
121 return id;
122 }
123
124 /**
125 * @see TemplateContract#getNamespaceCode()
126 */
127 @Override
128 public String getNamespaceCode() {
129 return namespaceCode;
130 }
131
132 /**
133 * @see TemplateContract#getName()
134 */
135 @Override
136 public String getName() {
137 return name;
138 }
139
140 /**
141 * @see TemplateContract#getDescription()
142 */
143 @Override
144 public String getDescription() {
145 return description;
146 }
147
148 /**
149 * @see TemplateContract#getKimTypeId()
150 */
151 @Override
152 public String getKimTypeId() {
153 return kimTypeId;
154 }
155
156 /**
157 * @see TemplateContract#isActive()
158 */
159 @Override
160 public boolean isActive() {
161 return active;
162 }
163
164 /**
165 * @see org.kuali.rice.core.api.mo.common.Versioned#getVersionNumber()
166 */
167 @Override
168 public Long getVersionNumber() {
169 return versionNumber;
170 }
171
172 /**
173 * @see org.kuali.rice.core.api.mo.common.GloballyUnique#getObjectId()
174 */
175 @Override
176 public String getObjectId() {
177 return objectId;
178 }
179
180 /**
181 * This builder constructs a Template enforcing the constraints of the {@link TemplateContract}.
182 */
183 public static final class Builder implements TemplateContract, ModelBuilder, Serializable {
184 private String id;
185 private String namespaceCode;
186 private String name;
187 private String description;
188 private String kimTypeId;
189 private Long versionNumber = 1L;
190 private String objectId;
191 private boolean active;
192
193 private Builder(String namespaceCode, String name, String kimTypeId) {
194 setNamespaceCode(namespaceCode);
195 setName(name);
196 setKimTypeId(kimTypeId);
197 }
198
199 /**
200 * creates a KimPermission with the required fields.
201 */
202 public static Builder create(String namespaceCode, String name, String kimTypeId) {
203 return new Builder(namespaceCode, name, kimTypeId);
204 }
205
206 /**
207 * creates a KimPermission from an existing {@link TemplateContract}.
208 */
209 public static Builder create(TemplateContract contract) {
210 Builder builder = new Builder(contract.getNamespaceCode(), contract.getName(), contract.getKimTypeId());
211 builder.setId(contract.getId());
212 builder.setDescription(contract.getDescription());
213
214 builder.setActive(contract.isActive());
215 builder.setVersionNumber(contract.getVersionNumber());
216 builder.setObjectId(contract.getObjectId());
217
218 return builder;
219 }
220
221 @Override
222 public String getId() {
223 return id;
224 }
225
226 public void setId(final String id) {
227 this.id = id;
228 }
229
230 @Override
231 public String getNamespaceCode() {
232 return namespaceCode;
233 }
234
235 public void setNamespaceCode(final String namespaceCode) {
236 if (StringUtils.isEmpty(namespaceCode)) {
237 throw new IllegalArgumentException("namespaceCode is blank");
238 }
239 this.namespaceCode = namespaceCode;
240 }
241
242 @Override
243 public String getName() {
244 return name;
245 }
246
247 public void setName(final String name) {
248 if (StringUtils.isEmpty(name)) {
249 throw new IllegalArgumentException("name is blank");
250 }
251 this.name = name;
252 }
253
254 @Override
255 public String getDescription() {
256 return description;
257 }
258
259 public void setDescription(final String description) {
260 this.description = description;
261 }
262
263 @Override
264 public String getKimTypeId() {
265 if (StringUtils.isEmpty(kimTypeId)) {
266 throw new IllegalArgumentException("kimTypeId is blank");
267 }
268 return kimTypeId;
269 }
270
271 public void setKimTypeId(final String kimTypeId) {
272 this.kimTypeId = kimTypeId;
273 }
274
275 @Override
276 public boolean isActive() {
277 return active;
278 }
279
280 public void setActive(final boolean active) {
281 this.active = active;
282 }
283
284 @Override
285 public Long getVersionNumber() {
286 return versionNumber;
287 }
288
289 public void setVersionNumber(final Long versionNumber) {
290 if (versionNumber <= 0) {
291 throw new IllegalArgumentException("versionNumber is invalid");
292 }
293 this.versionNumber = versionNumber;
294 }
295
296 @Override
297 public String getObjectId() {
298 return objectId;
299 }
300
301 public void setObjectId(final String objectId) {
302 this.objectId = objectId;
303 }
304
305 @Override
306 public Template build() {
307 return new Template(this);
308 }
309 }
310
311 /**
312 * Defines some internal constants used on this class.
313 */
314 static class Constants {
315 static final String ROOT_ELEMENT_NAME = "template";
316 static final String TYPE_NAME = "TemplateType";
317 }
318
319 /**
320 * A private class which exposes constants which define the XML element names to use
321 * when this object is marshalled to XML.
322 */
323 static class Elements {
324 static final String ID = "id";
325 static final String NAMESPACE_CODE = "namespaceCode";
326 static final String NAME = "name";
327 static final String DESCRIPTION = "description";
328 static final String KIM_TYPE_ID = "kimTypeId";
329 static final String ACTIVE = "active";
330 }
331
332 public static class Cache {
333 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + Template.Constants.TYPE_NAME;
334 }
335 }