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