001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.location.api.county;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.core.api.CoreConstants;
020import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021import org.kuali.rice.core.api.mo.ModelBuilder;
022import org.kuali.rice.location.api.LocationConstants;
023import org.w3c.dom.Element;
024
025import javax.xml.bind.annotation.XmlAccessType;
026import javax.xml.bind.annotation.XmlAccessorType;
027import javax.xml.bind.annotation.XmlAnyElement;
028import javax.xml.bind.annotation.XmlElement;
029import javax.xml.bind.annotation.XmlRootElement;
030import javax.xml.bind.annotation.XmlType;
031import java.io.Serializable;
032import java.util.Collection;
033
034/**
035 * An immutable representation of a {@link CountyContract}.
036 *
037 * <p>To construct an instance of a County, use the {@link County.Builder} class.
038 *
039 * @see CountyContract
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 */
042@XmlRootElement(name = County.Constants.ROOT_ELEMENT_NAME)
043@XmlAccessorType(XmlAccessType.NONE)
044@XmlType(name = County.Constants.TYPE_NAME, propOrder = {
045        County.Elements.CODE,
046        County.Elements.NAME,
047        County.Elements.COUNTRY_CODE,
048        County.Elements.STATE_CODE,
049        County.Elements.ACTIVE,
050        CoreConstants.CommonElements.VERSION_NUMBER,
051        CoreConstants.CommonElements.FUTURE_ELEMENTS
052})
053public final class County extends AbstractDataTransferObject implements CountyContract {
054
055    private static final long serialVersionUID = 6097498602725305353L;
056
057    @XmlElement(name = Elements.CODE, required = true)
058    private final String code;
059
060    @XmlElement(name = Elements.NAME, required = true)
061    private final String name;
062
063    @XmlElement(name = Elements.COUNTRY_CODE, required = true)
064    private final String countryCode;
065
066    @XmlElement(name = Elements.STATE_CODE, required = true)
067    private final String stateCode;
068
069    @XmlElement(name = Elements.ACTIVE, required = true)
070    private final boolean active;
071
072    @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
073    private final Long versionNumber;
074
075    @SuppressWarnings("unused")
076    @XmlAnyElement
077    private final Collection<Element> _futureElements = null;
078
079    /**
080     * This constructor should never be called except during JAXB unmarshalling.
081     */
082    @SuppressWarnings("unused")
083    private County() {
084        this.code = null;
085        this.name = null;
086        this.countryCode = null;
087        this.stateCode = null;
088        this.active = false;
089        this.versionNumber = null;
090    }
091
092    private County(Builder builder) {
093        code = builder.getCode();
094        name = builder.getName();
095        countryCode = builder.getCountryCode();
096        stateCode = builder.getStateCode();
097        active = builder.isActive();
098        versionNumber = builder.getVersionNumber();
099    }
100
101    /** {@inheritDoc} */
102    @Override
103    public String getCode() {
104        return code;
105    }
106
107    /** {@inheritDoc} */
108    @Override
109    public String getName() {
110        return name;
111    }
112
113    /** {@inheritDoc} */
114    @Override
115    public String getCountryCode() {
116        return countryCode;
117    }
118
119    /** {@inheritDoc} */
120    @Override
121    public String getStateCode() {
122        return stateCode;
123    }
124
125    /** {@inheritDoc} */
126    @Override
127    public boolean isActive() {
128        return active;
129    }
130
131    /** {@inheritDoc} */
132    @Override
133    public Long getVersionNumber() {
134        return versionNumber;
135    }
136
137    /**
138     * This builder constructs an County enforcing the constraints of the {@link CountyContract}.
139     */
140    public static class Builder implements CountyContract, ModelBuilder, Serializable {
141
142        private static final long serialVersionUID = 7077484401017765844L;
143
144        private String code;
145        private String name;
146        private String countryCode;
147        private String stateCode;
148        private boolean active;
149        private Long versionNumber;
150
151        private Builder(String code, String name, String countryCode, String stateCode) {
152            setCode(code);
153            setName(name);
154            setCountryCode(countryCode);
155            setStateCode(stateCode);
156            setVersionNumber(versionNumber);
157        }
158
159        /**
160         * creates a County Builder with the required fields.
161         */
162        public static Builder create(String code, String name, String countryCode, String stateCode) {
163            final Builder builder = new Builder(code, name, countryCode, stateCode);
164            builder.setActive(true);
165            return builder;
166        }
167
168        /**
169         * creates a County Builder from an existing {@link CountyContract}.
170         */
171        public static Builder create(CountyContract contract) {
172            final Builder builder = new Builder(contract.getCode(), contract.getName(), contract.getCountryCode(), contract.getStateCode());
173            builder.setActive(contract.isActive());
174            builder.setVersionNumber(contract.getVersionNumber());
175            return builder;
176        }
177
178        @Override
179        public String getCode() {
180            return code;
181        }
182
183        /**
184         * Sets the code to be used for the County created from this Builder.
185         * @param code String code for a County
186         * @throws IllegalArgumentException if the passed in code is null or a blank String.
187         */
188        public void setCode(String code) {
189            if (StringUtils.isBlank(code)) {
190                throw new IllegalArgumentException("code is blank");
191            }
192
193            this.code = code;
194        }
195
196        @Override
197        public String getName() {
198            return name;
199        }
200
201        /**
202         * Sets the full name of the County created from this Builder.
203         * @param name String representing the full name for the County
204         * @throws IllegalArgumentException if the passed in name is null or a blank String.
205         */
206        public void setName(String name) {
207            if (StringUtils.isBlank(name)) {
208                throw new IllegalArgumentException("name is blank");
209            }
210
211            this.name = name;
212        }
213
214        @Override
215        public String getCountryCode() {
216            return countryCode;
217        }
218
219        /**
220         * Sets the Country code to be associated with the County created from this Builder.
221         * @param countryCode String representing the Country Code
222         * @throws IllegalArgumentException if the passed in countryCode is null or a blank String.
223         * @see org.kuali.rice.location.api.country.CountryContract
224         */
225        public void setCountryCode(String countryCode) {
226            if (StringUtils.isBlank(countryCode)) {
227                throw new IllegalArgumentException("countryCode is blank");
228            }
229
230            this.countryCode = countryCode;
231        }
232
233        @Override
234        public String getStateCode() {
235            return stateCode;
236        }
237
238        /**
239         * Sets the State code to be associated with the County created from this Builder.
240         * @param stateCode String representing the State code
241         * @throws  IllegalArgumentException if the passed in statecode is null or a blank String.
242         * @see org.kuali.rice.location.api.state.StateContract
243         */
244        public void setStateCode(String stateCode) {
245            if (StringUtils.isBlank(stateCode)) {
246                throw new IllegalArgumentException("stateCode is blank");
247            }
248
249            this.stateCode = stateCode;
250        }
251
252        @Override
253        public boolean isActive() {
254            return active;
255        }
256
257        /**
258         * Sets the active flag for the County created from this Builder.
259         * @param active
260         */
261        public void setActive(boolean active) {
262            this.active = active;
263        }
264
265        @Override
266        public Long getVersionNumber() {
267            return versionNumber;
268        }
269
270        public void setVersionNumber(Long versionNumber) {
271            this.versionNumber = versionNumber;
272        }
273
274        @Override
275        public County build() {
276            return new County(this);
277        }
278    }
279
280    /**
281     * Defines some internal constants used on this class.
282     */
283    static class Constants {
284        final static String ROOT_ELEMENT_NAME = "county";
285        final static String TYPE_NAME = "CountyType";
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        final static String CODE = "code";
294        final static String NAME = "name";
295        final static String COUNTRY_CODE = "countryCode";
296        final static String STATE_CODE = "stateCode";
297        final static String ACTIVE = "active";
298    }
299
300    public static class Cache {
301        public static final String NAME = LocationConstants.Namespaces.LOCATION_NAMESPACE_2_0 + "/" + County.Constants.TYPE_NAME;
302    }
303}