001    package ezvcard.types;
002    
003    import java.util.List;
004    
005    import ezvcard.VCard;
006    import ezvcard.VCardSubTypes;
007    import ezvcard.VCardVersion;
008    import ezvcard.io.CompatibilityMode;
009    import ezvcard.parameters.AddressTypeParameter;
010    import ezvcard.util.HCardElement;
011    import ezvcard.util.VCardStringUtils;
012    
013    /*
014     Copyright (c) 2012, Michael Angstadt
015     All rights reserved.
016    
017     Redistribution and use in source and binary forms, with or without
018     modification, are permitted provided that the following conditions are met: 
019    
020     1. Redistributions of source code must retain the above copyright notice, this
021     list of conditions and the following disclaimer. 
022     2. Redistributions in binary form must reproduce the above copyright notice,
023     this list of conditions and the following disclaimer in the documentation
024     and/or other materials provided with the distribution. 
025    
026     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
027     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
028     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
029     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
030     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
031     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
032     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
033     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
034     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036    
037     The views and conclusions contained in the software and documentation are those
038     of the authors and should not be interpreted as representing official policies, 
039     either expressed or implied, of the FreeBSD Project.
040     */
041    
042    /**
043     * <p>
044     * Defines the exact text to put on the mailing label when mailing a package or
045     * letter to the person.
046     * </p>
047     * 
048     * <p>
049     * The LABEL type is not supported in 4.0. Instead, labels are included as a
050     * parameter to their corresponding ADR. When marshalling a vCard, EZ-vCard will
051     * use either the LABEL type or the LABEL parameter, depending on the requested
052     * vCard version.
053     * </p>
054     * 
055     * <p>
056     * To add a label to a vCard, the {@link AddressType#setLabel} method should be
057     * used.
058     * </p>
059     * 
060     * <pre>
061     * VCard vcard = new VCard();
062     * AddressType adr = new AddressType();
063     * adr.setStreetAddress(&quot;123 Main St.&quot;);
064     * adr.setLocality(&quot;Austin&quot;);
065     * adr.setRegion(&quot;TX&quot;);
066     * adr.setPostalCode(&quot;12345&quot;);
067     * adr.setLabel(&quot;123 Main St.\nAustin, TX 12345&quot;); //newlines are allowed
068     * vcard.addAddress(adr);
069     * </pre>
070     * 
071     * <p>
072     * The {@link VCard#addOrphanedLabel} method adds a LABEL type to the vCard.
073     * However, use of this method is discouraged because it creates a LABEL type
074     * that's not associated with an address. Also, orphaned LABELs are ignored when
075     * creating version 4.0 vCards because the LABEL type is not supported by vCard
076     * 4.0.
077     * </p>
078     * 
079     * <p>
080     * The {@link VCard#getOrphanedLabels} method can be used after parsing a
081     * version 2.1 or 3.0 vCard to retrieve any LABEL types which the parser could
082     * not assign to an address (ADR type). A LABEL is assigned to an ADR if the
083     * LABEL's list of TYPE parameters is identical to the ADR's list of TYPE
084     * parameters.
085     * </p>
086     * 
087     * <pre>
088     * VCard vcard = ...
089     * for (LabelType label : vcard.getOrphanedLabels()) {
090     *      System.out.println(label.getValue());
091     * }
092     * </pre>
093     * 
094     * <p>
095     * vCard property name: LABEL
096     * </p>
097     * <p>
098     * vCard versions: 2.1, 3.0
099     * </p>
100     * @author Michael Angstadt
101     */
102    public class LabelType extends MultiValuedTypeParameterType<AddressTypeParameter> {
103            public static final String NAME = "LABEL";
104    
105            private String value;
106    
107            public LabelType() {
108                    this(null);
109            }
110    
111            /**
112             * @param label the label value
113             */
114            public LabelType(String label) {
115                    super(NAME);
116                    setValue(label);
117            }
118    
119            @Override
120            protected AddressTypeParameter buildTypeObj(String type) {
121                    AddressTypeParameter param = AddressTypeParameter.valueOf(type);
122                    if (param == null) {
123                            param = new AddressTypeParameter(type);
124                    }
125                    return param;
126            }
127    
128            /**
129             * Gets the label value.
130             * @return the label value
131             */
132            public String getValue() {
133                    return value;
134            }
135    
136            /**
137             * Sets the label value.
138             * @param value the label value
139             */
140            public void setValue(String value) {
141                    this.value = value;
142            }
143    
144            /**
145             * Gets the language the note is written in.
146             * @return the language or null if not set
147             * @see VCardSubTypes#getLanguage
148             */
149            public String getLanguage() {
150                    return subTypes.getLanguage();
151            }
152    
153            /**
154             * Sets the language that the note is written in.
155             * @param language the language or null to remove
156             * @see VCardSubTypes#setLanguage
157             */
158            public void setLanguage(String language) {
159                    subTypes.setLanguage(language);
160            }
161    
162            @Override
163            public VCardVersion[] getSupportedVersions() {
164                    return new VCardVersion[] { VCardVersion.V2_1, VCardVersion.V3_0 };
165            }
166    
167            @Override
168            protected void doMarshalText(StringBuilder sb, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
169                    sb.append(VCardStringUtils.escape(value));
170            }
171    
172            @Override
173            protected void doUnmarshalText(String value, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
174                    setValue(VCardStringUtils.unescape(value));
175            }
176    
177            @Override
178            protected void doUnmarshalHtml(HCardElement element, List<String> warnings) {
179                    List<String> types = element.types();
180                    for (String type : types) {
181                            subTypes.addType(type);
182                    }
183    
184                    setValue(element.value());
185            }
186    }