001    package ezvcard;
002    
003    import java.util.Arrays;
004    import java.util.Collection;
005    import java.util.Collections;
006    import java.util.EnumSet;
007    import java.util.Set;
008    
009    import ezvcard.util.CaseClasses;
010    
011    /*
012     Copyright (c) 2013, Michael Angstadt
013     All rights reserved.
014    
015     Redistribution and use in source and binary forms, with or without
016     modification, are permitted provided that the following conditions are met: 
017    
018     1. Redistributions of source code must retain the above copyright notice, this
019     list of conditions and the following disclaimer. 
020     2. Redistributions in binary form must reproduce the above copyright notice,
021     this list of conditions and the following disclaimer in the documentation
022     and/or other materials provided with the distribution. 
023    
024     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
025     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
026     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
027     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
028     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
029     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
030     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
031     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
032     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
033     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
034    
035     The views and conclusions contained in the software and documentation are those
036     of the authors and should not be interpreted as representing official policies, 
037     either expressed or implied, of the FreeBSD Project.
038     */
039    
040    /**
041     * Defines the data type of a property's value.
042     * @author Michael Angstadt
043     */
044    public class VCardDataType {
045            private static final CaseClasses<VCardDataType, String> enums = new CaseClasses<VCardDataType, String>(VCardDataType.class) {
046                    @Override
047                    protected VCardDataType create(String value) {
048                            return new VCardDataType(value);
049                    }
050    
051                    @Override
052                    protected boolean matches(VCardDataType dataType, String value) {
053                            return dataType.name.equalsIgnoreCase(value);
054                    }
055            };
056    
057            /**
058             * <b>Supported versions:</b> {@code 2.1 (p.18-9)}
059             */
060            public static final VCardDataType URL = new VCardDataType("url", VCardVersion.V2_1);
061    
062            /**
063             * <b>Supported versions:</b> {@code 2.1 (p.8-9)}
064             */
065            public static final VCardDataType CONTENT_ID = new VCardDataType("content-id", VCardVersion.V2_1);
066    
067            /**
068             * <b>Supported versions:</b> {@code 3.0}
069             */
070            public static final VCardDataType BINARY = new VCardDataType("binary", VCardVersion.V3_0);
071    
072            /**
073             * <b>Supported versions:</b> {@code 3.0, 4.0}
074             */
075            public static final VCardDataType URI = new VCardDataType("uri", VCardVersion.V3_0, VCardVersion.V4_0);
076    
077            /**
078             * <b>Supported versions:</b> {@code 2.1, 3.0, 4.0}
079             */
080            public static final VCardDataType TEXT = new VCardDataType("text");
081    
082            /**
083             * <b>Supported versions:</b> {@code 3.0, 4.0}
084             */
085            public static final VCardDataType DATE = new VCardDataType("date", VCardVersion.V3_0, VCardVersion.V4_0);
086    
087            /**
088             * <b>Supported versions:</b> {@code 3.0, 4.0}
089             */
090            public static final VCardDataType TIME = new VCardDataType("time", VCardVersion.V3_0, VCardVersion.V4_0);
091    
092            /**
093             * <b>Supported versions:</b> {@code 3.0, 4.0}
094             */
095            public static final VCardDataType DATE_TIME = new VCardDataType("date-time", VCardVersion.V3_0, VCardVersion.V4_0);
096    
097            /**
098             * <b>Supported versions:</b> {@code 4.0}
099             */
100            public static final VCardDataType DATE_AND_OR_TIME = new VCardDataType("date-and-or-time", VCardVersion.V4_0);
101    
102            /**
103             * <b>Supported versions:</b> {@code 4.0}
104             */
105            public static final VCardDataType TIMESTAMP = new VCardDataType("timestamp", VCardVersion.V4_0);
106    
107            /**
108             * <b>Supported versions:</b> {@code 4.0}
109             */
110            public static final VCardDataType BOOLEAN = new VCardDataType("boolean", VCardVersion.V4_0);
111    
112            /**
113             * <b>Supported versions:</b> {@code 4.0}
114             */
115            public static final VCardDataType INTEGER = new VCardDataType("integer", VCardVersion.V4_0);
116    
117            /**
118             * <b>Supported versions:</b> {@code 4.0}
119             */
120            public static final VCardDataType FLOAT = new VCardDataType("float", VCardVersion.V4_0);
121    
122            /**
123             * <b>Supported versions:</b> {@code 4.0}
124             */
125            public static final VCardDataType UTC_OFFSET = new VCardDataType("utc-offset", VCardVersion.V4_0);
126    
127            /**
128             * <b>Supported versions:</b> {@code 4.0}
129             */
130            public static final VCardDataType LANGUAGE_TAG = new VCardDataType("language-tag", VCardVersion.V4_0);
131    
132            private final String name;
133            private final Set<VCardVersion> supportedVersions;
134    
135            private VCardDataType(String name, VCardVersion... supportedVersions) {
136                    this.name = name;
137                    if (supportedVersions.length == 0) {
138                            supportedVersions = VCardVersion.values();
139                    }
140    
141                    Set<VCardVersion> set = EnumSet.copyOf(Arrays.asList(supportedVersions));
142                    this.supportedVersions = Collections.unmodifiableSet(set);
143            }
144    
145            /**
146             * Gets the name of the data type.
147             * @return the name of the data type (e.g. "text")
148             */
149            public String getName() {
150                    return name;
151            }
152    
153            /**
154             * Determines if the data type is supported by the given vCard version.
155             * @param version the vCard version
156             * @return true if it is supported, false if not
157             */
158            public boolean isSupported(VCardVersion version) {
159                    return supportedVersions.contains(version);
160            }
161    
162            @Override
163            public String toString() {
164                    return name;
165            }
166    
167            /**
168             * Searches for a data type that is defined as a static constant in this
169             * class.
170             * @param dataType the data type name (e.g. "text")
171             * @return the data type or null if not found
172             */
173            public static VCardDataType find(String dataType) {
174                    return enums.find(dataType);
175            }
176    
177            /**
178             * Searches for a data type and creates one if it cannot be found. All
179             * objects are guaranteed to be unique, so they can be compared with
180             * {@code ==} equality.
181             * @param dataType data type name (e.g. "text")
182             * @return the data type
183             */
184            public static VCardDataType get(String dataType) {
185                    return enums.get(dataType);
186            }
187    
188            /**
189             * Gets all of the data types that are defined as static constants in this
190             * class.
191             * @return the data types
192             */
193            public static Collection<VCardDataType> all() {
194                    return enums.all();
195            }
196    }