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.attribute;
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.w3c.dom.Element;
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.XmlRootElement;
029    import javax.xml.bind.annotation.XmlType;
030    import java.io.Serializable;
031    import java.util.Collection;
032    
033    /**
034     * An immutable representation of a {@link KimAttributeContract}.
035     *
036     * <p>To construct an instance of a KimAttribute, use the {@link KimAttribute.Builder} class.<p/>
037     *
038     * @see KimAttributeContract
039     */
040    @XmlRootElement(name = KimAttribute.Constants.ROOT_ELEMENT_NAME)
041    @XmlAccessorType(XmlAccessType.NONE)
042    @XmlType(name = KimAttribute.Constants.TYPE_NAME, propOrder = {
043            KimAttribute.Elements.ID,
044            KimAttribute.Elements.COMPONENT_NAME,
045            KimAttribute.Elements.ATTRIBUTE_NAME,
046            KimAttribute.Elements.NAMESPACE_CODE,
047            KimAttribute.Elements.ATTRIBUTE_LABEL,
048            KimAttribute.Elements.ACTIVE,
049            CoreConstants.CommonElements.VERSION_NUMBER,
050            CoreConstants.CommonElements.OBJECT_ID,
051            CoreConstants.CommonElements.FUTURE_ELEMENTS
052    })
053    public final class KimAttribute extends AbstractDataTransferObject implements KimAttributeContract {
054        private static final long serialVersionUID = 1L;
055    
056        @XmlElement(name = KimAttribute.Elements.ID, required = false)
057        private final String id;
058    
059        @XmlElement(name = KimAttribute.Elements.COMPONENT_NAME, required = false)
060        private final String componentName;
061    
062        @XmlElement(name = KimAttribute.Elements.ATTRIBUTE_NAME, required = true)
063        private final String attributeName;
064    
065        @XmlElement(name = KimAttribute.Elements.NAMESPACE_CODE, required = true)
066        private final String namespaceCode;
067    
068        @XmlElement(name = KimAttribute.Elements.ATTRIBUTE_LABEL, required = false)
069        private final String attributeLabel;
070    
071        @XmlElement(name = KimAttribute.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         * This constructor should never be called except during JAXB unmarshalling.
086         */
087        private KimAttribute() {
088            this.id = null;
089            this.componentName = null;
090            this.attributeName = null;
091            this.namespaceCode = null;
092            this.attributeLabel = null;
093            this.active = false;
094            this.versionNumber = Long.valueOf(1L);
095            this.objectId = null;
096        }
097    
098        private KimAttribute(Builder builder) {
099            this.id = builder.getId();
100            this.componentName = builder.getComponentName();
101            this.attributeName = builder.getAttributeName();
102            this.namespaceCode = builder.getNamespaceCode();
103            this.attributeLabel = builder.getAttributeLabel();
104            this.active = builder.isActive();
105            this.versionNumber = builder.getVersionNumber();
106            this.objectId = builder.getObjectId();
107        }
108    
109        @Override
110        public String getId() {
111            return id;
112        }
113    
114        @Override
115        public String getComponentName() {
116            return componentName;
117        }
118    
119        @Override
120        public String getAttributeName() {
121            return attributeName;
122        }
123    
124        @Override
125        public String getNamespaceCode() {
126            return namespaceCode;
127        }
128    
129        @Override
130        public String getAttributeLabel() {
131            return attributeLabel;
132        }
133    
134        @Override
135        public Long getVersionNumber() {
136            return versionNumber;
137        }
138    
139        @Override
140        public boolean isActive() {
141            return active;
142        }
143    
144        @Override
145        public String getObjectId() {
146            return objectId;
147        }
148    
149        /**
150         * This builder constructs an KimAttribute enforcing the constraints of the {@link KimAttributeContract}.
151         */
152        public static final class Builder implements KimAttributeContract, ModelBuilder, Serializable {
153            private String id;
154            private String componentName;
155            private String attributeName;
156            private String namespaceCode;
157            private String attributeLabel;
158            private boolean active;
159            private Long versionNumber = 1L;
160            private String objectId;
161    
162            private Builder(String componentName, String attributeName, String namespaceCode) {
163                setComponentName(componentName);
164                setAttributeName(attributeName);
165                setNamespaceCode(namespaceCode);
166            }
167    
168            /**
169             * creates a KimAttribute with the required fields.
170             */
171            public static Builder create(String componentName, String attributeName, String namespaceCode) {
172                return new Builder(componentName, attributeName, namespaceCode);
173            }
174    
175            /**
176             * creates a KimAttribute from an existing {@link KimAttributeContract}.
177             */
178            public static Builder create(KimAttributeContract contract) {
179                Builder builder = new Builder(contract.getComponentName(), contract.getAttributeName(), contract.getNamespaceCode());
180                builder.setId(contract.getId());
181                builder.setAttributeLabel(contract.getAttributeLabel());
182                builder.setActive(contract.isActive());
183                builder.setVersionNumber(contract.getVersionNumber());
184                builder.setObjectId(contract.getObjectId());
185                return builder;
186            }
187    
188    
189            @Override
190            public String getId() {
191                return id;
192            }
193    
194            public void setId(final String id) {
195                this.id = id;
196            }
197    
198            @Override
199            public String getComponentName() {
200                return componentName;
201            }
202    
203            public void setComponentName(final String componentName) {
204                this.componentName = componentName;
205            }
206    
207            @Override
208            public String getAttributeName() {
209                return attributeName;
210            }
211    
212            public void setAttributeName(final String attributeName) {
213                if (StringUtils.isBlank(attributeName)) {
214                    throw new IllegalArgumentException("attributeName is blank");
215                }
216    
217                this.attributeName = attributeName;
218            }
219    
220            @Override
221            public String getNamespaceCode() {
222                return namespaceCode;
223            }
224    
225            public void setNamespaceCode(final String namespaceCode) {
226                if (StringUtils.isBlank(namespaceCode)) {
227                    throw new IllegalArgumentException("namespaceCode is blank");
228                }
229    
230                this.namespaceCode = namespaceCode;
231            }
232    
233            @Override
234            public String getAttributeLabel() {
235                return attributeLabel;
236            }
237    
238            public void setAttributeLabel(final String attributeLabel) {
239                this.attributeLabel = attributeLabel;
240            }
241    
242            @Override
243            public boolean isActive() {
244                return active;
245            }
246    
247            public void setActive(final boolean active) {
248                this.active = active;
249            }
250    
251            @Override
252            public Long getVersionNumber() {
253                return versionNumber;
254            }
255    
256            public void setVersionNumber(final Long versionNumber) {
257                if (versionNumber <= 0) {
258                    throw new IllegalArgumentException("versionNumber is invalid");
259                }
260    
261                this.versionNumber = versionNumber;
262            }
263    
264            @Override
265            public String getObjectId() {
266                return objectId;
267            }
268    
269            public void setObjectId(final String objectId) {
270                this.objectId = objectId;
271            }
272    
273            @Override
274            public KimAttribute build() {
275                return new KimAttribute(this);
276            }
277        }
278    
279    
280        /**
281         * Defines some internal constants used on this class.
282         */
283        static class Constants {
284            static final String ROOT_ELEMENT_NAME = "kimAttribute";
285            static final String TYPE_NAME = "KimAttributeType";
286        }
287    
288        /**
289         * A private class which exposes constants which define the XML element names to use
290         * when this object is marshalled to XML.
291         */
292        static class Elements {
293            static final String ID = "id";
294            static final String COMPONENT_NAME = "componentName";
295            static final String ATTRIBUTE_NAME = "attributeName";
296            static final String NAMESPACE_CODE = "namespaceCode";
297            static final String ATTRIBUTE_LABEL = "attributeLabel";
298            static final String ACTIVE = "active";
299        }
300    
301    }