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 }