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.kim.api.common.template;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.core.api.CoreConstants;
020import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021import org.kuali.rice.core.api.mo.ModelBuilder;
022import org.kuali.rice.kim.api.KimConstants;
023import org.w3c.dom.Element;
024
025import javax.xml.bind.annotation.XmlAccessType;
026import javax.xml.bind.annotation.XmlAccessorType;
027import javax.xml.bind.annotation.XmlAnyElement;
028import javax.xml.bind.annotation.XmlElement;
029import javax.xml.bind.annotation.XmlRootElement;
030import javax.xml.bind.annotation.XmlType;
031import java.io.Serializable;
032import 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})
052public 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}