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 }