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.location.api.country;
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.location.api.LocationConstants;
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 * POJO implementation of CountryContract that is immutable. Instances of Country can be (un)marshalled to and from XML.
036 *
037 * @see CountryContract
038 * @author Kuali Rice Team (rice.collab@kuali.org)
039 */
040 @XmlRootElement(name = Country.Constants.ROOT_ELEMENT_NAME)
041 @XmlAccessorType(XmlAccessType.NONE)
042 @XmlType(name = Country.Constants.TYPE_NAME, propOrder = {
043 Country.Elements.CODE,
044 Country.Elements.ALTERNATE_CODE,
045 Country.Elements.NAME,
046 Country.Elements.RESTRICTED,
047 Country.Elements.ACTIVE,
048 CoreConstants.CommonElements.VERSION_NUMBER,
049 CoreConstants.CommonElements.FUTURE_ELEMENTS
050 })
051 public final class Country extends AbstractDataTransferObject implements CountryContract {
052 private static final long serialVersionUID = -8975392777320033940L;
053
054 @XmlElement(name = Elements.CODE, required = true)
055 private final String code;
056
057 @XmlElement(name = Elements.ALTERNATE_CODE, required = false)
058 private final String alternateCode;
059
060 @XmlElement(name = Elements.NAME, required = false)
061 private final String name;
062
063 @XmlElement(name = Elements.RESTRICTED, required = true)
064 private final boolean restricted;
065
066 @XmlElement(name = Elements.ACTIVE, required = true)
067 private final boolean active;
068
069 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
070 private final Long versionNumber;
071
072 @SuppressWarnings("unused")
073 @XmlAnyElement
074 private final Collection<Element> _futureElements = null;
075
076 /**
077 * This constructor should never be called except during JAXB unmarshalling.
078 */
079 @SuppressWarnings("unused")
080 private Country() {
081 this.code = null;
082 this.alternateCode = null;
083 this.name = null;
084 this.restricted = false;
085 this.active = false;
086 this.versionNumber = null;
087 }
088
089 private Country(Builder builder) {
090 this.code = builder.getCode();
091 this.alternateCode = builder.getAlternateCode();
092 this.name = builder.getName();
093 this.restricted = builder.isRestricted();
094 this.active = builder.isActive();
095 this.versionNumber = builder.getVersionNumber();
096 }
097
098 /** {@inheritDoc} */
099 @Override
100 public String getCode() {
101 return this.code;
102 }
103
104 /** {@inheritDoc} */
105 @Override
106 public String getAlternateCode() {
107 return this.alternateCode;
108 }
109
110 /** {@inheritDoc} */
111 @Override
112 public String getName() {
113 return this.name;
114 }
115
116 /** {@inheritDoc} */
117 @Override
118 public boolean isActive() {
119 return this.active;
120 }
121
122 /** {@inheritDoc} */
123 @Override
124 public boolean isRestricted() {
125 return this.restricted;
126 }
127
128 /** {@inheritDoc} */
129 @Override
130 public Long getVersionNumber() {
131 return this.versionNumber;
132 }
133
134 /**
135 * Builder for immutable Country objects.
136 */
137 public static class Builder implements CountryContract, ModelBuilder, Serializable {
138 private static final long serialVersionUID = -4786917485397379322L;
139
140 private String code;
141 private String alternateCode;
142 private String name;
143 private boolean restricted;
144 private boolean active;
145 private Long versionNumber;
146
147 private Builder(String code, String alternateCode, String name,
148 boolean restricted, boolean active) {
149 this.setCode(code);
150 this.setAlternateCode(alternateCode);
151 this.setName(name);
152 this.setRestricted(restricted);
153 this.setActive(active);
154 }
155
156 public static Builder create(String code, String name) {
157 return new Builder(code, null, name, false, true);
158 }
159
160 public static Builder create(String code, String alternatePostalCode, String name,
161 boolean restricted, boolean active) {
162 return new Builder(code, alternatePostalCode, name, restricted, active);
163 }
164
165 public static Builder create(CountryContract cc) {
166 Builder builder = new Builder(cc.getCode(), cc.getAlternateCode(),
167 cc.getName(), cc.isRestricted(), cc.isActive());
168 builder.setVersionNumber(cc.getVersionNumber());
169 return builder;
170 }
171
172 @Override
173 public Country build() {
174 return new Country(this);
175 }
176
177 /**
178 * Sets code property.
179 *
180 * @param code required to be not null and not empty.
181 */
182 public void setCode(String code) {
183 if (StringUtils.isBlank(code)) {
184 throw new IllegalArgumentException("code cannot be blank or null");
185 }
186 this.code = code;
187 }
188
189 @Override
190 public String getCode() {
191 return this.code;
192 }
193
194 /**
195 * Sets the optional alternatePostalCode property
196 *
197 * @param alternatePostalCode
198 */
199 public void setAlternateCode(String alternatePostalCode) {
200 this.alternateCode = alternatePostalCode;
201 }
202
203 @Override
204 public String getAlternateCode() {
205 return this.alternateCode;
206 }
207
208 /**
209 * Sets the optional name property.
210 *
211 * @param name
212 */
213 public void setName(String name) {
214 this.name = name;
215 }
216
217 @Override
218 public String getName() {
219 return this.name;
220 }
221
222 /**
223 * Sets the active property.
224 *
225 * @param active
226 */
227 public void setActive(boolean active) {
228 this.active = active;
229 }
230
231 @Override
232 public boolean isActive() {
233 return this.active;
234 }
235
236 /**
237 * Sets the versionNumber property.
238 *
239 * @param versionNumber
240 */
241 public void setVersionNumber(Long versionNumber) {
242 this.versionNumber = versionNumber;
243 }
244
245 @Override
246 public Long getVersionNumber() {
247 return this.versionNumber;
248 }
249
250 /**
251 * Sets the restrictedProperty
252 *
253 * @param restricted
254 */
255 public void setRestricted(boolean restricted) {
256 this.restricted = restricted;
257 }
258
259 @Override
260 public boolean isRestricted() {
261 return this.restricted;
262 }
263 }
264
265 /**
266 * A private class which exposes constants which define the XML element names to use
267 * when this object is marshalled to XML.
268 */
269 static class Elements {
270 final static String CODE = "code";
271 final static String ALTERNATE_CODE = "alternateCode";
272 final static String NAME = "name";
273 final static String RESTRICTED = "restricted";
274 final static String ACTIVE = "active";
275 }
276
277 /**
278 * Defines some internal constants used on this class.
279 */
280 static class Constants {
281 final static String ROOT_ELEMENT_NAME = "country";
282 final static String TYPE_NAME = "CountryType";
283 }
284
285 public static class Cache {
286 public static final String NAME = LocationConstants.Namespaces.LOCATION_NAMESPACE_2_0 + "/" + Country.Constants.TYPE_NAME;
287 }
288 }