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.kim.api.identity.address;
017    
018    import java.io.Serializable;
019    import java.util.Collection;
020    import javax.xml.bind.annotation.XmlAccessType;
021    import javax.xml.bind.annotation.XmlAccessorType;
022    import javax.xml.bind.annotation.XmlAnyElement;
023    import javax.xml.bind.annotation.XmlElement;
024    import javax.xml.bind.annotation.XmlRootElement;
025    import javax.xml.bind.annotation.XmlType;
026    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
027    
028    import org.apache.commons.lang.StringUtils;
029    import org.joda.time.DateTime;
030    import org.kuali.rice.core.api.CoreConstants;
031    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
032    import org.kuali.rice.core.api.mo.ModelBuilder;
033    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
034    import org.kuali.rice.kim.api.KimApiConstants;
035    import org.kuali.rice.kim.api.identity.CodedAttribute;
036    import org.w3c.dom.Element;
037    
038    @XmlRootElement(name = EntityAddress.Constants.ROOT_ELEMENT_NAME)
039    @XmlAccessorType(XmlAccessType.NONE)
040    @XmlType(name = EntityAddress.Constants.TYPE_NAME, propOrder = {
041        EntityAddress.Elements.ID,
042        EntityAddress.Elements.ENTITY_TYPE_CODE,
043        EntityAddress.Elements.ENTITY_ID,
044        EntityAddress.Elements.ADDRESS_TYPE,
045        EntityAddress.Elements.ATTENTION_LINE,
046        EntityAddress.Elements.LINE1,
047        EntityAddress.Elements.LINE2,
048        EntityAddress.Elements.LINE3,
049        EntityAddress.Elements.CITY,
050        EntityAddress.Elements.STATE_PROVINCE_CODE,
051        EntityAddress.Elements.POSTAL_CODE,
052        EntityAddress.Elements.COUNTRY_CODE,
053        EntityAddress.Elements.ATTENTION_LINE_UNMASKED,
054        EntityAddress.Elements.LINE1_UNMASKED,
055        EntityAddress.Elements.LINE2_UNMASKED,
056        EntityAddress.Elements.LINE3_UNMASKED,
057        EntityAddress.Elements.CITY_UNMASKED,
058        EntityAddress.Elements.STATE_PROVINCE_CODE_UNMASKED,
059        EntityAddress.Elements.POSTAL_CODE_UNMASKED,
060        EntityAddress.Elements.COUNTRY_CODE_UNMASKED,
061        EntityAddress.Elements.ADDRESS_FORMAT,
062        EntityAddress.Elements.MODIFIED_DATE,
063        EntityAddress.Elements.VALIDATED_DATE,
064        EntityAddress.Elements.VALIDATED,
065        EntityAddress.Elements.NOTE_MESSAGE,
066        EntityAddress.Elements.SUPPRESS_ADDRESS,
067        EntityAddress.Elements.DEFAULT_VALUE,
068        EntityAddress.Elements.ACTIVE,
069        CoreConstants.CommonElements.VERSION_NUMBER,
070        CoreConstants.CommonElements.OBJECT_ID,
071        CoreConstants.CommonElements.FUTURE_ELEMENTS
072    })
073    public final class EntityAddress extends AbstractDataTransferObject
074        implements EntityAddressContract
075    {
076        @XmlElement(name = Elements.ID, required = false)
077        private final String id;
078        @XmlElement(name = Elements.ENTITY_TYPE_CODE, required = false)
079        private final String entityTypeCode;
080        @XmlElement(name = Elements.ENTITY_ID, required = false)
081        private final String entityId;
082        @XmlElement(name = Elements.ADDRESS_TYPE, required = false)
083        private final CodedAttribute addressType;
084        @XmlElement(name = Elements.ATTENTION_LINE, required = false)
085        private final String attentionLine;
086        @XmlElement(name = Elements.LINE1, required = false)
087        private final String line1;
088        @XmlElement(name = Elements.LINE2, required = false)
089        private final String line2;
090        @XmlElement(name = Elements.LINE3, required = false)
091        private final String line3;
092        @XmlElement(name = Elements.CITY, required = false)
093        private final String city;
094        @XmlElement(name = Elements.STATE_PROVINCE_CODE, required = false)
095        private final String stateProvinceCode;
096        @XmlElement(name = Elements.POSTAL_CODE, required = false)
097        private final String postalCode;
098        @XmlElement(name = Elements.COUNTRY_CODE, required = false)
099        private final String countryCode;
100        @XmlElement(name = Elements.ATTENTION_LINE_UNMASKED, required = false)
101        private final String attentionLineUnmasked;
102        @XmlElement(name = Elements.LINE1_UNMASKED, required = false)
103        private final String line1Unmasked;
104        @XmlElement(name = Elements.LINE2_UNMASKED, required = false)
105        private final String line2Unmasked;
106        @XmlElement(name = Elements.LINE3_UNMASKED, required = false)
107        private final String line3Unmasked;
108        @XmlElement(name = Elements.CITY_UNMASKED, required = false)
109        private final String cityUnmasked;
110        @XmlElement(name = Elements.STATE_PROVINCE_CODE_UNMASKED, required = false)
111        private final String stateProvinceCodeUnmasked;
112        @XmlElement(name = Elements.POSTAL_CODE_UNMASKED, required = false)
113        private final String postalCodeUnmasked;
114        @XmlElement(name = Elements.COUNTRY_CODE_UNMASKED, required = false)
115        private final String countryCodeUnmasked;
116        @XmlElement(name = Elements.ADDRESS_FORMAT, required = false)
117        private final String addressFormat;
118        @XmlElement(name = Elements.MODIFIED_DATE, required = false)
119        @XmlJavaTypeAdapter(DateTimeAdapter.class)
120        private final DateTime modifiedDate;
121        @XmlElement(name = Elements.VALIDATED_DATE, required = false)
122        @XmlJavaTypeAdapter(DateTimeAdapter.class)
123        private final DateTime validatedDate;
124        @XmlElement(name = Elements.VALIDATED, required = false)
125        private final boolean validated;
126        @XmlElement(name = Elements.NOTE_MESSAGE, required = false)
127        private final String noteMessage;
128        @XmlElement(name = Elements.SUPPRESS_ADDRESS, required = false)
129        private final boolean suppressAddress;
130        @XmlElement(name = Elements.DEFAULT_VALUE, required = false)
131        private final boolean defaultValue;
132        @XmlElement(name = Elements.ACTIVE, required = false)
133        private final boolean active;
134        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
135        private final Long versionNumber;
136        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
137        private final String objectId;
138        @SuppressWarnings("unused")
139        @XmlAnyElement
140        private final Collection<Element> _futureElements = null;
141    
142        /**
143         * Private constructor used only by JAXB.
144         * 
145         */
146        private EntityAddress() {
147            this.entityId = null;
148            this.entityTypeCode = null;
149            this.addressType = null;
150            this.attentionLine = null;
151            this.line1 = null;
152            this.line2 = null;
153            this.line3 = null;
154            this.city = null;
155            this.stateProvinceCode = null;
156            this.postalCode = null;
157            this.countryCode = null;
158            this.attentionLineUnmasked = null;
159            this.line1Unmasked = null;
160            this.line2Unmasked = null;
161            this.line3Unmasked = null;
162            this.cityUnmasked = null;
163            this.stateProvinceCodeUnmasked = null;
164            this.postalCodeUnmasked = null;
165            this.countryCodeUnmasked = null;
166            this.addressFormat = null;
167            this.modifiedDate = null;
168            this.validatedDate = null;
169            this.validated = true; // assume it's valid?
170            this.noteMessage = null;
171            this.suppressAddress = false;
172            this.defaultValue = false;
173            this.versionNumber = null;
174            this.objectId = null;
175            this.active = false;
176            this.id = null;
177        }
178    
179        private EntityAddress(Builder builder) {
180            this.entityId = builder.getEntityId();
181            this.entityTypeCode = builder.getEntityTypeCode();
182    
183            this.addressType = (builder.getAddressType() != null) ? builder.getAddressType().build() : null;
184            this.attentionLine = builder.getAttentionLine();
185            this.line1 = builder.getLine1();
186            this.line2 = builder.getLine2();
187            this.line3 = builder.getLine3();
188            this.city = builder.getCity();
189            this.stateProvinceCode = builder.getStateProvinceCode();
190            this.postalCode = builder.getPostalCode();
191            this.countryCode = builder.getCountryCode();
192            this.attentionLineUnmasked = builder.getAttentionLineUnmasked();
193            this.line1Unmasked = builder.getLine1Unmasked();
194            this.line2Unmasked = builder.getLine2Unmasked();
195            this.line3Unmasked = builder.getLine3Unmasked();
196            this.cityUnmasked = builder.getCityUnmasked();
197            this.stateProvinceCodeUnmasked = builder.getStateProvinceCodeUnmasked();
198            this.postalCodeUnmasked = builder.getPostalCodeUnmasked();
199            this.countryCodeUnmasked = builder.getCountryCodeUnmasked();
200            this.addressFormat = builder.getAddressFormat();
201            this.modifiedDate = builder.getModifiedDate();
202            this.validatedDate = builder.getValidatedDate();
203            this.validated = builder.isValidated();
204            this.noteMessage = builder.getNoteMessage();
205            this.suppressAddress = builder.isSuppressAddress();
206            this.defaultValue = builder.isDefaultValue();
207            this.versionNumber = builder.getVersionNumber();
208            this.objectId = builder.getObjectId();
209            this.active = builder.isActive();
210            this.id = builder.getId();
211        }
212    
213        @Override
214        public String getEntityId() {
215            return this.entityId;
216        }
217    
218        @Override
219        public String getEntityTypeCode() {
220            return this.entityTypeCode;
221        }
222    
223        @Override
224        public CodedAttribute getAddressType() {
225            return this.addressType;
226        }
227    
228        @Override
229        public String getAttentionLine() {
230            return this.attentionLine;
231        }
232    
233        @Override
234        public String getLine1() {
235            return this.line1;
236        }
237    
238        @Override
239        public String getLine2() {
240            return this.line2;
241        }
242    
243        @Override
244        public String getLine3() {
245            return this.line3;
246        }
247    
248        @Override
249        public String getCity() {
250            return this.city;
251        }
252    
253        @Override
254        public String getStateProvinceCode() {
255            return this.stateProvinceCode;
256        }
257    
258        @Override
259        public String getPostalCode() {
260            return this.postalCode;
261        }
262    
263        @Override
264        public String getCountryCode() {
265            return this.countryCode;
266        }
267    
268        @Override
269        public String getAttentionLineUnmasked() {
270            return this.attentionLineUnmasked;
271        }
272    
273        @Override
274        public String getLine1Unmasked() {
275            return this.line1Unmasked;
276        }
277    
278        @Override
279        public String getLine2Unmasked() {
280            return this.line2Unmasked;
281        }
282    
283        @Override
284        public String getLine3Unmasked() {
285            return this.line3Unmasked;
286        }
287    
288        @Override
289        public String getCityUnmasked() {
290            return this.cityUnmasked;
291        }
292    
293        @Override
294        public String getStateProvinceCodeUnmasked() {
295            return this.stateProvinceCodeUnmasked;
296        }
297    
298        @Override
299        public String getPostalCodeUnmasked() {
300            return this.postalCodeUnmasked;
301        }
302    
303        @Override
304        public String getCountryCodeUnmasked() {
305            return this.countryCodeUnmasked;
306        }
307    
308        @Override
309        public String getAddressFormat() {
310            return this.addressFormat;
311        }
312    
313        @Override
314        public DateTime getModifiedDate() {
315            return modifiedDate;
316        }
317    
318        @Override
319        public DateTime getValidatedDate() {
320            return validatedDate;
321        }
322    
323        @Override
324        public boolean isValidated() {
325            return validated;
326        }
327    
328        @Override
329        public String getNoteMessage() {
330            return noteMessage;
331        }
332    
333        @Override
334        public boolean isSuppressAddress() {
335            return this.suppressAddress;
336        }
337    
338        @Override
339        public boolean isDefaultValue() {
340            return this.defaultValue;
341        }
342    
343        @Override
344        public Long getVersionNumber() {
345            return this.versionNumber;
346        }
347    
348        @Override
349        public String getObjectId() {
350            return this.objectId;
351        }
352    
353        @Override
354        public boolean isActive() {
355            return this.active;
356        }
357    
358        @Override
359        public String getId() {
360            return this.id;
361        }
362    
363        /**
364         * A builder which can be used to construct {@link EntityAddress} instances.  Enforces the constraints of the {@link EntityAddressContract}.
365         * 
366         */
367        public final static class Builder
368            implements Serializable, ModelBuilder, EntityAddressContract
369        {
370    
371            private String entityId;
372            private String entityTypeCode;
373            private CodedAttribute.Builder addressType;
374            private String attentionLineUnmasked;
375            private String line1Unmasked;
376            private String line2Unmasked;
377            private String line3Unmasked;
378            private String cityUnmasked;
379            private String stateProvinceCodeUnmasked;
380            private String postalCodeUnmasked;
381            private String countryCodeUnmasked;
382            private String addressFormat;
383            private DateTime modifiedDate;
384            private DateTime validatedDate;
385            private boolean validated;
386            private String noteMessage;
387            private boolean suppressAddress;
388            private boolean defaultValue;
389            private Long versionNumber;
390            private String objectId;
391            private boolean active;
392            private String id;
393    
394            private Builder() {}
395    
396            public static Builder create() {
397                return new Builder();
398            }
399    
400            public static Builder create(EntityAddressContract contract) {
401                if (contract == null) {
402                    throw new IllegalArgumentException("contract was null");
403                }
404                Builder builder = create();
405                builder.setEntityId(contract.getEntityId());
406                builder.setSuppressAddress(contract.isSuppressAddress());
407                builder.setEntityTypeCode(contract.getEntityTypeCode());
408                if (contract.getAddressType() != null) {
409                    builder.setAddressType(CodedAttribute.Builder.create(contract.getAddressType()));
410                }
411                builder.setAttentionLine(contract.getAttentionLineUnmasked());
412                builder.setLine1(contract.getLine1Unmasked());
413                builder.setLine2(contract.getLine2Unmasked());
414                builder.setLine3(contract.getLine3Unmasked());
415                builder.setCity(contract.getCityUnmasked());
416                builder.setStateProvinceCode(contract.getStateProvinceCodeUnmasked());
417                builder.setPostalCode(contract.getPostalCodeUnmasked());
418                builder.setCountryCode(contract.getCountryCodeUnmasked());
419                builder.setAddressFormat(contract.getAddressFormat());
420                builder.setModifiedDate(contract.getModifiedDate());
421                builder.setValidatedDate(contract.getValidatedDate());
422                builder.setValidated(contract.isValidated());
423                builder.setNoteMessage(contract.getNoteMessage());
424                builder.setDefaultValue(contract.isDefaultValue());
425                builder.setVersionNumber(contract.getVersionNumber());
426                builder.setObjectId(contract.getObjectId());
427                builder.setActive(contract.isActive());
428                builder.setId(contract.getId());
429                return builder;
430            }
431    
432            public EntityAddress build() {
433                return new EntityAddress(this);
434            }
435    
436            @Override
437            public String getEntityId() {
438                return this.entityId;
439            }
440    
441            @Override
442            public String getEntityTypeCode() {
443                return this.entityTypeCode;
444            }
445    
446            @Override
447            public CodedAttribute.Builder getAddressType() {
448                return this.addressType;
449            }
450    
451            @Override
452            public String getAttentionLine() {
453                if (isSuppressAddress()) {
454                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK;
455                }
456                return this.attentionLineUnmasked;
457    
458            }
459    
460            @Override
461            public String getLine1() {
462                if (isSuppressAddress()) {
463                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK;
464                }
465                return this.line1Unmasked;
466    
467            }
468    
469            @Override
470            public String getLine2() {
471                if (isSuppressAddress()) {
472                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK;
473                }
474                return this.line2Unmasked;
475            }
476    
477            @Override
478            public String getLine3() {
479                if (isSuppressAddress()) {
480                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK;
481                }
482                return this.line3Unmasked;
483            }
484    
485            @Override
486            public String getCity() {
487                if (isSuppressAddress()) {
488                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK;
489                }
490                return this.cityUnmasked;
491            }
492    
493            @Override
494            public String getStateProvinceCode() {
495                if (isSuppressAddress()) {
496                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK_CODE;
497                }
498                return this.stateProvinceCodeUnmasked;
499            }
500    
501            @Override
502            public String getPostalCode() {
503                if (isSuppressAddress()) {
504                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK_ZIP;
505                }
506                return this.postalCodeUnmasked;
507            }
508    
509            @Override
510            public String getCountryCode() {
511                if (isSuppressAddress()) {
512                    return KimApiConstants.RestrictedMasks.RESTRICTED_DATA_MASK_CODE;
513                }
514                return this.countryCodeUnmasked;
515            }
516    
517            @Override
518            public String getAttentionLineUnmasked() {
519                return this.attentionLineUnmasked;
520            }
521    
522            @Override
523            public String getLine1Unmasked() {
524                return this.line1Unmasked;
525            }
526    
527            @Override
528            public String getLine2Unmasked() {
529                return this.line2Unmasked;
530            }
531    
532            @Override
533            public String getLine3Unmasked() {
534                return this.line3Unmasked;
535            }
536    
537            @Override
538            public String getCityUnmasked() {
539                return this.cityUnmasked;
540            }
541    
542            @Override
543            public String getStateProvinceCodeUnmasked() {
544                return this.stateProvinceCodeUnmasked;
545            }
546    
547            @Override
548            public String getPostalCodeUnmasked() {
549                return this.postalCodeUnmasked;
550            }
551    
552            @Override
553            public String getCountryCodeUnmasked() {
554                return this.countryCodeUnmasked;
555            }
556    
557            @Override
558            public String getAddressFormat() {
559                return this.addressFormat;
560            }
561    
562            @Override
563            public DateTime getModifiedDate() {
564                return modifiedDate;
565            }
566    
567            @Override
568            public DateTime getValidatedDate() {
569                return validatedDate;
570            }
571    
572            @Override
573            public boolean isValidated() {
574                return validated;
575            }
576    
577            @Override
578            public String getNoteMessage() {
579                return noteMessage;
580            }
581    
582            @Override
583            public boolean isSuppressAddress() {
584                return this.suppressAddress;
585            }
586    
587            @Override
588            public boolean isDefaultValue() {
589                return this.defaultValue;
590            }
591    
592            @Override
593            public Long getVersionNumber() {
594                return this.versionNumber;
595            }
596    
597            @Override
598            public String getObjectId() {
599                return this.objectId;
600            }
601    
602            @Override
603            public boolean isActive() {
604                return this.active;
605            }
606    
607            @Override
608            public String getId() {
609                return this.id;
610            }
611    
612            public void setEntityId(String entityId) {
613                this.entityId = entityId;
614            }
615    
616            public void setEntityTypeCode(String entityTypeCode) {
617                this.entityTypeCode = entityTypeCode;
618            }
619    
620            public void setAddressType(CodedAttribute.Builder addressType) {
621                this.addressType = addressType;
622            }
623    
624            public void setAttentionLine(String attnLine) {
625                this.attentionLineUnmasked = attnLine;
626            }
627    
628            public void setLine1(String line1) {
629                this.line1Unmasked = line1;
630            }
631    
632            public void setLine2(String line2) {
633                this.line2Unmasked = line2;
634            }
635    
636            public void setLine3(String line3) {
637                this.line3Unmasked = line3;
638            }
639    
640            public void setCity(String city) {
641                this.cityUnmasked = city;
642            }
643    
644            public void setStateProvinceCode(String stateProvinceCode) {
645                this.stateProvinceCodeUnmasked = stateProvinceCode;
646            }
647    
648            public void setPostalCode(String postalCode) {
649                this.postalCodeUnmasked = postalCode;
650            }
651    
652            public void setCountryCode(String countryCode) {
653                this.countryCodeUnmasked = countryCode;
654            }
655    
656            public void setAddressFormat(String addressFormat) {
657                this.addressFormat = addressFormat;
658            }
659    
660            public void setModifiedDate(DateTime modifiedDate) {
661                this.modifiedDate = modifiedDate;
662            }
663    
664            public void setValidatedDate(DateTime validatedDate) {
665                this.validatedDate = validatedDate;
666            }
667    
668            public void setValidated(boolean validated) {
669                this.validated = validated;
670            }
671    
672            public void setNoteMessage(String noteMessage) {
673                this.noteMessage = noteMessage;
674            }
675    
676            private void setSuppressAddress(boolean suppressAddress) {
677                this.suppressAddress = suppressAddress;
678            }
679    
680            public void setDefaultValue(boolean defaultValue) {
681                this.defaultValue = defaultValue;
682            }
683    
684            public void setVersionNumber(Long versionNumber) {
685                this.versionNumber = versionNumber;
686            }
687    
688            public void setObjectId(String objectId) {
689                this.objectId = objectId;
690            }
691    
692            public void setActive(boolean active) {
693                this.active = active;
694            }
695    
696            public void setId(String id) {
697                if (StringUtils.isWhitespace(id)) {
698                    throw new IllegalArgumentException("id is blank");
699                }
700                this.id = id;
701            }
702    
703        }
704    
705    
706        /**
707         * Defines some internal constants used on this class.
708         * 
709         */
710        static class Constants {
711    
712            final static String ROOT_ELEMENT_NAME = "entityAddress";
713            final static String TYPE_NAME = "EntityAddressType";
714        }
715    
716    
717        /**
718         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
719         * 
720         */
721        static class Elements {
722    
723            final static String ENTITY_ID = "entityId";
724            final static String ENTITY_TYPE_CODE = "entityTypeCode";
725            final static String ADDRESS_TYPE = "addressType";
726            final static String ATTENTION_LINE = "attentionLine";
727            final static String LINE1 = "line1";
728            final static String LINE2 = "line2";
729            final static String LINE3 = "line3";
730            final static String CITY = "city";
731            final static String STATE_PROVINCE_CODE = "stateProvinceCode";
732            final static String POSTAL_CODE = "postalCode";
733            final static String COUNTRY_CODE = "countryCode";
734            final static String ATTENTION_LINE_UNMASKED = "attentionLineUnmasked";
735            final static String LINE1_UNMASKED = "line1Unmasked";
736            final static String LINE2_UNMASKED = "line2Unmasked";
737            final static String LINE3_UNMASKED = "line3Unmasked";
738            final static String CITY_UNMASKED = "cityUnmasked";
739            final static String STATE_PROVINCE_CODE_UNMASKED = "stateProvinceCodeUnmasked";
740            final static String POSTAL_CODE_UNMASKED = "postalCodeUnmasked";
741            final static String COUNTRY_CODE_UNMASKED = "countryCodeUnmasked";
742            final static String ADDRESS_FORMAT= "addressFormat";
743            final static String MODIFIED_DATE = "modifiedDate";
744            final static String VALIDATED_DATE = "validatedDate";
745            final static String VALIDATED = "validated";
746            final static String NOTE_MESSAGE = "noteMessage";
747            final static String SUPPRESS_ADDRESS = "suppressAddress";
748            final static String DEFAULT_VALUE = "defaultValue";
749            final static String ACTIVE = "active";
750            final static String ID = "id";
751    
752        }
753    
754    }