001    package ezvcard.property;
002    
003    import java.util.HashSet;
004    import java.util.List;
005    import java.util.Set;
006    
007    import ezvcard.VCard;
008    import ezvcard.VCardVersion;
009    import ezvcard.Warning;
010    import ezvcard.parameter.TelephoneType;
011    import ezvcard.util.TelUri;
012    
013    /*
014     Copyright (c) 2013, 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     * A telephone number.
044     * 
045     * <p>
046     * <b>Code sample</b>
047     * </p>
048     * 
049     * <pre class="brush:java">
050     * VCard vcard = new VCard();
051     * Telephone tel = new Telephone(&quot;(123) 555-6789&quot;);
052     * tel.addType(TelephoneType.HOME);
053     * tel.setPref(2); //the second-most preferred
054     * vcard.addTelephoneNumber(tel);
055     * 
056     * TelUri uri = new TelUri.Builder(&quot;+1-800-555-9876&quot;).extension(&quot;111&quot;).build();
057     * tel = new Telephone(uri);
058     * tel.addType(TelephoneType.WORK);
059     * tel.setPref(1); //the most preferred
060     * vcard.addTelephoneNumber(tel);
061     * </pre>
062     * 
063     * <p>
064     * <b>Property name:</b> {@code TEL}
065     * </p>
066     * <p>
067     * <b>Supported versions:</b> {@code 2.1, 3.0, 4.0}
068     * </p>
069     * @author Michael Angstadt
070     */
071    public class Telephone extends VCardProperty implements HasAltId {
072            private String text;
073            private TelUri uri;
074    
075            /**
076             * Creates a telephone property.
077             * @param text the telephone number (e.g. "(123) 555-6789")
078             */
079            public Telephone(String text) {
080                    setText(text);
081            }
082    
083            /**
084             * Creates a telephone property.
085             * @param uri a "tel" URI representing the telephone number (vCard 4.0 only)
086             */
087            public Telephone(TelUri uri) {
088                    setUri(uri);
089            }
090    
091            /**
092             * Gets the telephone number as a text value.
093             * @return the telephone number or null if the text value is not set
094             */
095            public String getText() {
096                    return text;
097            }
098    
099            /**
100             * Sets the telephone number as a text value.
101             * @param text the telephone number
102             */
103            public void setText(String text) {
104                    this.text = text;
105                    uri = null;
106            }
107    
108            /**
109             * Gets a "tel" URI representing the phone number.
110             * <p>
111             * <b>Supported versions:</b> {@code 4.0}
112             * </p>
113             * @return the "tel" URI or null if it is not set
114             */
115            public TelUri getUri() {
116                    return uri;
117            }
118    
119            /**
120             * Sets a "tel" URI representing the phone number.
121             * <p>
122             * <b>Supported versions:</b> {@code 4.0}
123             * </p>
124             * @param uri the "tel" URI
125             */
126            public void setUri(TelUri uri) {
127                    text = null;
128                    this.uri = uri;
129            }
130    
131            /**
132             * Gets all the TYPE parameters.
133             * @return the TYPE parameters or empty set if there are none
134             */
135            public Set<TelephoneType> getTypes() {
136                    Set<String> values = parameters.getTypes();
137                    Set<TelephoneType> types = new HashSet<TelephoneType>(values.size());
138                    for (String value : values) {
139                            types.add(TelephoneType.get(value));
140                    }
141                    return types;
142            }
143    
144            /**
145             * Adds a TYPE parameter.
146             * @param type the TYPE parameter to add
147             */
148            public void addType(TelephoneType type) {
149                    parameters.addType(type.getValue());
150            }
151    
152            /**
153             * Removes a TYPE parameter.
154             * @param type the TYPE parameter to remove
155             */
156            public void removeType(TelephoneType type) {
157                    parameters.removeType(type.getValue());
158            }
159    
160            @Override
161            public List<Integer[]> getPids() {
162                    return super.getPids();
163            }
164    
165            @Override
166            public void addPid(int localId, int clientPidMapRef) {
167                    super.addPid(localId, clientPidMapRef);
168            }
169    
170            @Override
171            public void removePids() {
172                    super.removePids();
173            }
174    
175            @Override
176            public Integer getPref() {
177                    return super.getPref();
178            }
179    
180            @Override
181            public void setPref(Integer pref) {
182                    super.setPref(pref);
183            }
184    
185            //@Override
186            public String getAltId() {
187                    return parameters.getAltId();
188            }
189    
190            //@Override
191            public void setAltId(String altId) {
192                    parameters.setAltId(altId);
193            }
194    
195            @Override
196            protected void _validate(List<Warning> warnings, VCardVersion version, VCard vcard) {
197                    if (uri == null && text == null) {
198                            warnings.add(new Warning(8));
199                    }
200    
201                    if (uri != null && (version == VCardVersion.V2_1 || version == VCardVersion.V3_0)) {
202                            warnings.add(new Warning(19));
203                    }
204    
205                    for (TelephoneType type : getTypes()) {
206                            if (type == TelephoneType.PREF) {
207                                    //ignore because it is converted to a PREF parameter for 4.0 vCards
208                                    continue;
209                            }
210    
211                            if (!type.isSupported(version)) {
212                                    warnings.add(new Warning(9, type.getValue()));
213                            }
214                    }
215            }
216    }