001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *   http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.myfaces.tobago.context;
021    
022    import java.io.Serializable;
023    import java.util.ArrayList;
024    import java.util.Collections;
025    import java.util.List;
026    import java.util.Locale;
027    
028    public class UserAgent implements Serializable {
029    
030      private static final long serialVersionUID = -3138810465122379395L;
031    
032      public static final String DEFAULT_NAME = "standard";
033    
034      public static final UserAgent DEFAULT = new UserAgent(null, null);
035    
036    
037      public static final UserAgent MSIE = new UserAgent("msie", null);
038    
039      public static final UserAgent MSIE_5_0 = new UserAgent("msie", "5_0");
040    
041      public static final UserAgent MSIE_5_5 = new UserAgent("msie", "5_5");
042    
043      public static final UserAgent MSIE_6_0 = new UserAgent("msie", "6_0");
044    
045      public static final UserAgent MSIE_7_0 = new UserAgent("msie", "7_0");
046    
047      /** @deprecated spell error, use {@link #MSIE_7_0} */
048      @Deprecated
049      public static final UserAgent MSIE_7_O = MSIE_7_0;
050    
051      public static final UserAgent MSIE_5_0_MAC = new UserAgent("msie", "5_0_mac");
052    
053      public static final UserAgent MSIE_6_0_MAC = new UserAgent("msie", "6_0_mac");
054    
055    
056      public static final UserAgent OPERA = new UserAgent("opera", null);
057    
058      public static final UserAgent OPERA_5_0 = new UserAgent("opera", "5_0");
059    
060      public static final UserAgent OPERA_6_0 = new UserAgent("opera", "6_0");
061    
062      public static final UserAgent OPERA_7_11 = new UserAgent("opera", "7_11");
063    
064    
065      public static final UserAgent MOZILLA = new UserAgent("mozilla", null);
066    
067      public static final UserAgent MOZILLA_4_7 = new UserAgent("mozilla", "4_7");
068    
069      public static final UserAgent MOZILLA_5_0 = new UserAgent("mozilla", "5_0");
070    
071      public static final UserAgent MOZILLA_5_0_R1_6 = new UserAgent("mozilla", "5_0_r1_6");
072    
073      /** Firefox 2 */
074      public static final UserAgent MOZILLA_5_0_FF_2 = new UserAgent("mozilla", "5_0_ff_2");
075    
076      private String name;
077    
078      private String version;
079    
080    
081      private UserAgent(String name, String version) {
082        this.name = name;
083        this.version = version;
084      }
085    
086      public boolean isMsie() {
087        return MSIE.name.equals(name);
088      }
089    
090      public boolean isMsie6() {
091        return MSIE_6_0.name.equals(name) && MSIE_6_0.version.equals(version);
092      }
093    
094      public boolean isMozilla() {
095        return MOZILLA.name.equals(name);
096      }
097    
098      public List<String> getFallbackList() {
099        return getFallbackList(false);
100      }
101    
102      private List<String> getFallbackList(boolean reverseOrder) {
103        List<String> list = new ArrayList<String>(3);
104        if (version != null) {
105          list.add(name + '_' + version);
106        }
107        if (name != null) {
108          list.add(name);
109        }
110        list.add(DEFAULT_NAME);
111        if (reverseOrder) {
112          Collections.reverse(list);
113        }
114        return list;
115      }
116    
117      public static UserAgent getInstance(String header) {
118        if (header == null) {
119          return DEFAULT;
120        }
121    
122        header = header.toLowerCase(Locale.ENGLISH).replace('/', ' ');
123        if (header.indexOf("opera") > -1) {
124          if (header.indexOf("opera 5.0") > -1) {
125            return OPERA_5_0;
126          } else if (header.indexOf("opera 6.0") > -1) {
127            return OPERA_6_0;
128          } else if (header.indexOf("opera 7.11") > -1) {
129            return OPERA_7_11;
130          } else {
131            return OPERA;
132          }
133        } else if (header.indexOf("msie") > -1 || header.indexOf("trident") > -1) {
134          if (header.indexOf("msie 5.0") > -1) {
135            if (header.indexOf("mac") > -1) {
136              return MSIE_5_0_MAC;
137            } else {
138              return MSIE_5_0;
139            }
140          } else if (header.indexOf("msie 5.5") > -1) {
141            return MSIE_5_5;
142          } else if (header.indexOf("msie 6.0") > -1) {
143            if (header.indexOf("mac") > -1) {
144              return MSIE_6_0_MAC;
145            } else {
146              return MSIE_6_0;
147            }
148          } else if (header.indexOf("msie 7.0") > -1) {
149            return MSIE_7_O;
150          } else if (header.indexOf("rv:11") > -1) {
151            return MOZILLA; // IE11 - Mozilla is here the best matching browser
152          } else {
153            return MSIE;
154          }
155        } else if (header.indexOf("mozilla") > -1) {
156          if (header.indexOf("mozilla 4.7") > -1) {
157            return MOZILLA_4_7;
158          } else if (header.indexOf("mozilla 5.0") > -1) {
159            if (header.indexOf("rv:1.6") > -1) {
160              return MOZILLA_5_0_R1_6;
161            } else if (header.indexOf("firefox 2") > -1) {
162              return MOZILLA_5_0_FF_2;
163            } else {
164              return MOZILLA_5_0;
165            }
166          } else {
167            return MOZILLA;
168          }
169        }
170    
171        return DEFAULT;
172      }
173    
174      public static UserAgent getInstanceForId(String id) {
175        if (id == null) {
176          return DEFAULT;
177        }
178    
179        if (id.indexOf("opera") == 0) {
180          if (id.equals("opera_5_0")) {
181            return OPERA_5_0;
182          } else if (id.equals("opera_6_0")) {
183            return OPERA_6_0;
184          } else if (id.equals("opera_7_11")) {
185            return OPERA_7_11;
186          } else {
187            return OPERA;
188          }
189        } else if (id.indexOf("msie") == 0) {
190          if (id.equals("msie_5_0")) {
191            return MSIE_5_0;
192          } else if (id.equals("msie_5_0_mac")) {
193            return MSIE_5_0_MAC;
194          } else if (id.equals("msie_5_5")) {
195            return MSIE_5_5;
196          } else if (id.equals("msie_6_0")) {
197            return MSIE_6_0;
198          } else if (id.equals("msie_6_0_mac")) {
199            return MSIE_6_0_MAC;
200          } else if (id.equals("msie_7_0")) {
201            return MSIE_7_O;
202          } else {
203            return MSIE;
204          }
205        } else if (id.indexOf("mozilla") == 0) {
206          if (id.equals("mozilla_4_7")) {
207            return MOZILLA_4_7;
208          } else if (id.equals("mozilla_5_0")) {
209            return MOZILLA_5_0;
210          } else if (id.equals("mozilla_5_0_r1_6")) {
211            return MOZILLA_5_0_R1_6;
212          } else if (id.equals("mozilla_5_0_ff_2")) {
213            return MOZILLA_5_0_FF_2;
214          } else {
215            return MOZILLA;
216          }
217        }
218    
219        return DEFAULT;
220      }
221    
222    
223      /**
224       * @deprecated don't use toString() functionallity!
225       */
226      public String toString() {
227        return version != null
228            ? name + '_' + version
229            : name;
230      }
231    }
232