001// ***************************************************************************************************************************
002// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
003// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
004// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
005// * with the License.  You may obtain a copy of the License at                                                              *
006// *                                                                                                                         *
007// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
008// *                                                                                                                         *
009// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
010// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
011// * specific language governing permissions and limitations under the License.                                              *
012// ***************************************************************************************************************************
013package org.apache.juneau;
014
015import static org.apache.juneau.PropertyConverter.*;
016
017import java.util.*;
018
019/**
020 * Represents possible property types of properties in a {@link PropertyStore}.
021 */
022@SuppressWarnings({"unchecked","rawtypes"})
023public enum PropertyType {
024
025   /** String */
026   STRING("String", "s", STRING_CONVERTER),
027
028   /** Boolean */
029   BOOLEAN("Boolean", "b", BOOLEAN_CONVERTER),
030
031   /** Integer */
032   INTEGER("Integer", "i", INTEGER_CONVERTER),
033
034   /** Class */
035   CLASS("Class", "c", CLASS_CONVERTER),
036
037   /** Object */
038   OBJECT("Object", "o", OBJECT_CONVERTER),
039
040   /** Set<String> */
041   SET_STRING("Set<String>", "ss", STRING_CONVERTER),
042
043   /** Set&lt;Integer&gt; */
044   SET_INTEGER("Set<Integer>", "si", INTEGER_CONVERTER),
045
046   /** Set&lt;Class&gt; */
047   SET_CLASS("Set<Class>", "sc", CLASS_CONVERTER),
048
049   /** List&lt;String&gt; */
050   LIST_STRING("List<String>", "ls", STRING_CONVERTER),
051
052   /** List&lt;Integer&gt; */
053   LIST_INTEGER("List<Integer>", "li", INTEGER_CONVERTER),
054
055   /** List&lt;Class&gt; */
056   LIST_CLASS("List<Class>", "lc", CLASS_CONVERTER),
057
058   /** List&lt;Object&gt; */
059   LIST_OBJECT("List<Object>", "lo", OBJECT_CONVERTER),
060
061   /** TreeMap&lt;String,String&gt; */
062   SORTED_MAP_STRING("Map<String,String>", "sms", STRING_CONVERTER),
063
064   /** TreeMap&lt;String,Integer&gt; */
065   SORTED_MAP_INTEGER("Map<String,Integer>", "smi", INTEGER_CONVERTER),
066
067   /** TreeMap&lt;String,Class&gt; */
068   SORTED_MAP_CLASS("Map<String,Class>", "smc", CLASS_CONVERTER),
069
070   /** TreeMap&lt;String,Object&gt; */
071   SORTED_MAP_OBJECT("Map<String,Object>", "smo", OBJECT_CONVERTER),
072
073   /** LinkedHashMap&lt;String,String&gt; */
074   ORDERED_MAP_STRING("Map<String,String>", "oms", STRING_CONVERTER),
075
076   /** LinkedHashMap&lt;String,Integer&gt; */
077   ORDERED_MAP_INTEGER("Map<String,Integer>", "omi", INTEGER_CONVERTER),
078
079   /** LinkedHashMap&lt;String,Class&gt; */
080   ORDERED_MAP_CLASS("Map<String,Class>", "omc", CLASS_CONVERTER),
081
082   /** LinkedHashMap&lt;String,Object&gt; */
083   ORDERED_MAP_OBJECT("Map<String,Object>", "omo", OBJECT_CONVERTER);
084
085   private final String type, suffix;
086   final PropertyConverter<?> converter;
087
088   private PropertyType(String type, String suffix, PropertyConverter<?> converter) {
089      this.type = type;
090      this.suffix = suffix;
091      this.converter = converter;
092   }
093
094   @Override /* Override */
095   public String toString() {
096      return type;
097   }
098
099   String getSuffix() {
100      return suffix;
101   }
102
103   /**
104    * Returns the comparator to use for entries in this property.
105    *
106    * @return The comparator to use for entries in this property, or <jk>null</jk> to use the default comparator.
107    */
108   Comparator<? super Object> comparator() {
109      switch(this) {
110         case SET_CLASS: return CLASS_COMPARATOR;
111         default: return null;
112      }
113   }
114
115   private static final Comparator CLASS_COMPARATOR = new Comparator<Class<?>>() {
116      @Override /* Comparator */
117      public int compare(Class<?> object1, Class<?> object2) {
118         return object1.getName().compareTo(object2.getName());
119      }
120   };
121}