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.kuali.rice.kim.api.type.KimType;
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    @XmlRootElement(name = KimAttributeData.Constants.ROOT_ELEMENT_NAME)
036    @XmlAccessorType(XmlAccessType.NONE)
037    @XmlType(name = KimAttributeData.Constants.TYPE_NAME, propOrder = {
038            KimAttributeData.Elements.ID,
039            KimAttributeData.Elements.ASSIGNED_TO_ID,
040            KimAttributeData.Elements.KIM_TYPE_ID,
041            KimAttributeData.Elements.KIM_TYPE,
042            KimAttributeData.Elements.KIM_ATTRIBUTE,
043            KimAttributeData.Elements.ATTRIBUTE_VALUE,
044            CoreConstants.CommonElements.VERSION_NUMBER,
045            CoreConstants.CommonElements.OBJECT_ID,
046            CoreConstants.CommonElements.FUTURE_ELEMENTS
047    })
048    public final class KimAttributeData extends AbstractDataTransferObject implements KimAttributeDataContract {
049        @XmlElement(name = Elements.ID, required = false)
050        private final String id;
051    
052        @XmlElement(name = Elements.ASSIGNED_TO_ID, required = false)
053        private final String assignedToId;
054    
055        @XmlElement(name = Elements.KIM_TYPE_ID, required = true)
056        private final String kimTypeId;
057    
058        @XmlElement(name = Elements.KIM_TYPE, required = false)
059        private final KimType kimType;
060    
061        @XmlElement(name = Elements.KIM_ATTRIBUTE, required = false)
062        private final KimAttribute kimAttribute;
063    
064        @XmlElement(name = Elements.ATTRIBUTE_VALUE, required = false)
065        private final String attributeValue;
066    
067        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
068        private final Long versionNumber;
069    
070        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
071        private final String objectId;
072    
073        @SuppressWarnings("unused")
074        @XmlAnyElement
075        private final Collection<Element> _futureElements = null;
076    
077        @SuppressWarnings("unused")
078        private KimAttributeData() {
079            this.id = null;
080            this.assignedToId = null;
081            this.kimTypeId = null;
082            this.kimType = null;
083            this.kimAttribute = null;
084            this.attributeValue = null;
085            this.versionNumber = null;
086            this.objectId = null;
087        }
088    
089        private KimAttributeData(Builder builder) {
090            this.id = builder.getId();
091            this.assignedToId = builder.getAssignedToId();
092            this.kimTypeId = builder.getKimTypeId();
093            this.kimType =
094                    builder.getKimType() != null ? builder.getKimType().build() : null;
095            this.kimAttribute =
096                    builder.getKimAttribute() != null ? builder.getKimAttribute().build() : null;
097            this.attributeValue = builder.getAttributeValue();
098            this.versionNumber = builder.getVersionNumber();
099            this.objectId = builder.getObjectId();
100        }
101    
102        @Override
103        public String getId() {
104            return id;
105        }
106    
107        @Override
108        public String getAssignedToId() {
109            return assignedToId;
110        }
111    
112        @Override
113        public String getKimTypeId() {
114            return kimTypeId;
115        }
116    
117        @Override
118        public KimType getKimType() {
119            return kimType;
120        }
121    
122        @Override
123        public KimAttribute getKimAttribute() {
124            return kimAttribute;
125        }
126    
127        @Override
128        public String getAttributeValue() {
129            return attributeValue;
130        }
131    
132        @Override
133        public Long getVersionNumber() {
134            return versionNumber;
135        }
136    
137        @Override
138        public String getObjectId() {
139            return objectId;
140        }
141    
142        public static final class Builder implements KimAttributeDataContract, ModelBuilder, Serializable {
143            private String id;
144            private String assignedToId;
145            private String kimTypeId;
146            private KimType.Builder kimType;
147            private KimAttribute.Builder kimAttribute;
148            private String attributeValue;
149            private Long versionNumber;
150            private String objectId;
151    
152            private Builder(String kimTypeId) {
153                setKimTypeId(kimTypeId);
154            }
155    
156            /**
157             * creates a Parameter with the required fields.
158             */
159            public static Builder create(String kimTypeId) {
160                return new Builder(kimTypeId);
161            }
162    
163            /**
164             * creates a KimAttributeData from an existing {@link org.kuali.rice.kim.api.common.attribute.KimAttributeContract}
165             */
166            public static Builder create(KimAttributeDataContract contract) {
167                Builder builder = new Builder(contract.getKimTypeId());
168                builder.setAssignedToId(contract.getAssignedToId());
169    
170                builder.setId(contract.getId());
171                if (contract.getKimAttribute() != null) {
172                    builder.setKimAttribute(KimAttribute.Builder.create(contract.getKimAttribute()));
173                }
174                if (contract.getKimType() != null) {
175                    builder.setKimType(KimType.Builder.create(contract.getKimType()));
176                }
177                builder.setValue(contract.getAttributeValue());
178                builder.setVersionNumber(contract.getVersionNumber());
179                builder.setObjectId(contract.getObjectId());
180                return builder;
181            }
182    
183            @Override
184            public String getId() {
185                return id;
186            }
187    
188            public void setId(final String id) {
189                if (StringUtils.isWhitespace(id)) {
190                    throw new IllegalArgumentException("id is whitespace");
191                }
192                this.id = id;
193            }
194    
195            @Override
196            public String getAssignedToId() {
197                return assignedToId;
198            }
199    
200            public void setAssignedToId(final String assignedToId) {
201                this.assignedToId = assignedToId;
202            }
203    
204            @Override
205            public String getKimTypeId(){
206                return kimTypeId;
207            }
208    
209            public void setKimTypeId(String kimTypeId) {
210                this.kimTypeId = kimTypeId;
211            }
212    
213            @Override
214            public KimType.Builder getKimType() {
215                return kimType;
216            }
217    
218            public void setKimType(final KimType.Builder kimType) {
219                this.kimType = kimType;
220            }
221    
222            @Override
223            public KimAttribute.Builder getKimAttribute() {
224                return kimAttribute;
225            }
226    
227            public void setKimAttribute(final KimAttribute.Builder kimAttribute) {
228                this.kimAttribute = kimAttribute;
229            }
230    
231            @Override
232            public String getAttributeValue() {
233                return attributeValue;
234            }
235    
236            public void setValue(final String attributeValue) {
237                this.attributeValue = attributeValue;
238            }
239    
240            @Override
241            public Long getVersionNumber() {
242                return versionNumber;
243            }
244    
245            public void setVersionNumber(Long versionNumber) {
246                this.versionNumber = versionNumber;
247            }
248    
249            @Override
250            public String getObjectId() {
251                return objectId;
252            }
253    
254            public void setObjectId(final String objectId) {
255                this.objectId = objectId;
256            }
257    
258            @Override
259            public KimAttributeData build() {
260                return new KimAttributeData(this);
261            }
262        }
263    
264        /**
265         * Defines some internal constants used on this class.
266         */
267        static class Constants {
268            final static String ROOT_ELEMENT_NAME = "kimAttributeData";
269            final static String TYPE_NAME = "KimAttributeDataType";
270        }
271    
272        /**
273         * A private class which exposes constants which define the XML element names to use
274         * when this object is marshalled to XML.
275         */
276        static class Elements {
277            final static String ID = "id";
278            final static String ASSIGNED_TO_ID = "assignedToId";
279            final static String KIM_TYPE_ID = "kimTypeId";
280            final static String KIM_TYPE = "kimType";
281            final static String KIM_ATTRIBUTE = "kimAttribute";
282            final static String ATTRIBUTE_VALUE = "attributeValue";
283        }
284    }