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.krms.api.repository;
017    
018    import java.io.Serializable;
019    import java.util.Collection;
020    
021    import javax.xml.bind.annotation.XmlAnyElement;
022    import javax.xml.bind.annotation.XmlElement;
023    import javax.xml.bind.annotation.XmlTransient;
024    
025    import org.apache.commons.lang.StringUtils;
026    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
027    import org.kuali.rice.core.api.mo.ModelBuilder;
028    import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition;
029    
030    /**
031     * abstract base model object for KRMS Attribute immutables. 
032     *
033     * @see BaseAttributeContract
034     */
035    @XmlTransient
036    public abstract class BaseAttribute extends AbstractDataTransferObject implements BaseAttributeContract {
037            private static final long serialVersionUID = -6126133049308968098L;
038            
039            @XmlElement(name = Elements.ID, required=true)
040            private final String id;
041    
042            @XmlElement(name = Elements.ATTR_DEFN_ID, required=false)
043            private final String attributeDefinitionId;
044    
045            @XmlElement(name = Elements.VALUE, required=false)
046            private final String value;
047            
048            @XmlElement(name = Elements.ATTR_DEFN, required=false)
049            private final KrmsAttributeDefinition attributeDefinition;
050            
051        @SuppressWarnings("unused")
052            @XmlAnyElement
053            private final Collection<org.w3c.dom.Element> _futureElements = null;
054            
055             /** 
056         * This constructor should only be called by the private default constructor of subclasses,
057         * which should only be used by JAXB and never invoked directly.
058         */
059        protected BaseAttribute() {
060            this.id = null;
061            this.attributeDefinitionId = null;
062            this.value = null;
063            this.attributeDefinition = null;
064        }
065        
066        /**
067             * Constructs a BaseAttribute from the given builder.  
068             * This constructor is protected and should only ever be invoked from the builder.
069             * 
070             * @param builder the Builder from which to construct the BaseAttribute
071             */
072        protected BaseAttribute(Builder builder) {
073            this.id = builder.getId();
074            this.attributeDefinitionId = builder.getAttributeDefinitionId();
075            this.value = builder.getValue();
076            if (builder.getAttributeDefinition() != null) {
077                    this.attributeDefinition = builder.getAttributeDefinition().build();
078            } else {
079                    this.attributeDefinition = null;
080            }
081        }
082        
083            @Override
084            public String getId() {
085                    return this.id;
086            }
087            
088            @Override
089            public String getAttributeDefinitionId() {
090                    return this.attributeDefinitionId;
091            }
092    
093            @Override
094            public String getValue() {
095                    return this.value;
096            }
097            
098            @Override
099            public KrmsAttributeDefinition getAttributeDefinition() {
100                    return this.attributeDefinition;
101            }
102            
103            /**
104         * This builder is used to construct the fields that {@link BaseAttribute} is responsible for.  It is abstract,
105         * and intended to be subclassed by extenders of {@link BaseAttribute}.
106         */
107        public abstract static class Builder implements BaseAttributeContract, ModelBuilder, Serializable {         
108                    private static final long serialVersionUID = 5799994031051731535L;
109    
110                    private String id;
111            private String attributeDefinitionId;
112            private String value;
113            private KrmsAttributeDefinition.Builder attributeDefinition;
114            
115                    /**
116                     * Private constructor for creating a builder with all of it's required attributes.
117                     */
118            protected Builder(String id, String attributeDefinitionId, String value) {
119                setId(id);
120                setAttributeDefinitionId(attributeDefinitionId);
121                setValue(value);
122            }
123    
124            protected Builder(BaseAttributeContract attr) {
125                    this (attr.getId(), attr.getAttributeDefinitionId(), attr.getValue());
126            }
127    
128                    /**
129                     * Sets the value of the id on this builder to the given value.
130                     * 
131                     * @param id the id value to set, may be null if attribute has not yet
132             * been stored in the repository
133                     */
134            public void setId(String id) {
135    //            if (StringUtils.isBlank(id)) {
136    //                throw new IllegalArgumentException("id is blank");
137    //            }
138                this.id = id;
139            }
140    
141            /**
142             * Sets the attibuteDefinitionId value.
143             * @param attributeDefinitionId; must not be null or blank
144             * @throws IllegalArgumentException if the id is null or blank
145             */
146                    public void setAttributeDefinitionId(String attributeDefinitionId) {
147                if (StringUtils.isBlank(attributeDefinitionId)) {
148                    throw new IllegalArgumentException("the attribute definition id is blank");
149                }
150                            this.attributeDefinitionId = attributeDefinitionId;
151                    }
152    
153            /**
154             * Sets the value of the attribute
155             * @param value a String representing the value of the attribute
156             */
157                    public void setValue(String value) {
158                            this.value = value;
159                    }
160    
161            /**
162             * Sets the attributeDefinition object related to the attribute.
163             * @param attributeDefinition the attribute definition
164             */
165                    public void setAttributeDefinition(KrmsAttributeDefinition.Builder attributeDefinition) {
166                            this.attributeDefinition = attributeDefinition;
167                    }
168                    
169                    @Override
170                    public String getId() {
171                            return id;
172                    }
173    
174                    @Override
175                    public String getAttributeDefinitionId() {
176                            return attributeDefinitionId;
177                    }
178                    
179                    @Override
180                    public String getValue() {
181                            return value;
182                    }
183    
184                    @Override
185                    public KrmsAttributeDefinition.Builder getAttributeDefinition() {
186                            return attributeDefinition;
187                    }
188    
189        }
190            
191            /**
192             * A protected class which exposes constants which define the XML element names to use
193             * when this object is marshalled to XML.
194             */
195            public static class Elements {
196                    public final static String ID = "id";
197                    public final static String ATTR_DEFN_ID = "attributeDefinitionId";
198                    public final static String VALUE = "value";
199                    public final static String ATTR_DEFN = "attributeDefinition";
200            }
201    }