1
19
20 package com.liferay.portal.servlet;
21
22 import com.liferay.portal.kernel.servlet.BrowserSniffer;
23 import com.liferay.portal.kernel.servlet.HttpHeaders;
24 import com.liferay.portal.kernel.util.GetterUtil;
25 import com.liferay.portal.kernel.util.StringPool;
26
27 import java.util.regex.Matcher;
28 import java.util.regex.Pattern;
29
30 import javax.servlet.http.HttpServletRequest;
31
32
41 public class BrowserSnifferImpl implements BrowserSniffer {
42
43 public boolean acceptsGzip(HttpServletRequest request) {
44 String acceptEncoding = request.getHeader(HttpHeaders.ACCEPT_ENCODING);
45
46 if ((acceptEncoding != null) &&
47 (acceptEncoding.indexOf("gzip") != -1)) {
48
49 return true;
50 }
51 else {
52 return false;
53 }
54 }
55
56 public String getBrowserId(HttpServletRequest request) {
57 if (isIe(request)) {
58 return BROWSER_ID_IE;
59 }
60 else if (isFirefox(request)) {
61 return BROWSER_ID_FIREFOX;
62 }
63 else {
64 return BROWSER_ID_OTHER;
65 }
66 }
67
68 public float getMajorVersion(HttpServletRequest request) {
69 float majorVersion = 0;
70
71 String version = getVersion(request);
72
73 Matcher matcher = _majorVersionPattern.matcher(version);
74
75 if (matcher.find()) {
76 majorVersion = GetterUtil.getFloat(matcher.group(1));
77 }
78
79 return majorVersion;
80 }
81
82 public String getRevision(HttpServletRequest request) {
83 String revision = StringPool.BLANK;
84
85 String userAgent = getUserAgent(request);
86
87 Matcher matcher = _revisionPattern.matcher(userAgent);
88
89 while (matcher.find()) {
90 for (int i = 1; i <= matcher.groupCount(); i++) {
91 revision = matcher.group(i);
92 }
93 }
94
95 return revision;
96 }
97
98 public String getVersion(HttpServletRequest request) {
99 String userAgent = getUserAgent(request);
100
101 String version = StringPool.BLANK;
102
103 Matcher matcher = _versionPattern.matcher(userAgent);
104
105 if (matcher.find()) {
106 version = matcher.group(1);
107 }
108 else if (isFirefox(request)) {
109 Matcher versionFirefoxMatcher = _versionFirefoxPattern.matcher(
110 userAgent);
111
112 if (versionFirefoxMatcher.find()) {
113 version = versionFirefoxMatcher.group(1);
114 }
115 }
116 else if (isChrome(request)) {
117 Matcher versionChromeMatcher = _versionChromePattern.matcher(
118 userAgent);
119
120 if (versionChromeMatcher.find()) {
121 version = versionChromeMatcher.group(1);
122 }
123 }
124 else {
125 version = getRevision(request);
126 }
127
128 return version;
129 }
130
131 public boolean isAir(HttpServletRequest request) {
132 String userAgent = getUserAgent(request);
133
134 if (userAgent.indexOf("adobeair") != -1) {
135 return true;
136 }
137
138 return false;
139 }
140
141 public boolean isChrome(HttpServletRequest request) {
142 String userAgent = getUserAgent(request);
143
144 if (userAgent.indexOf("chrome") != -1) {
145 return true;
146 }
147
148 return false;
149 }
150
151 public boolean isFirefox(HttpServletRequest request) {
152 if (!isMozilla(request)) {
153 return false;
154 }
155
156 String userAgent = getUserAgent(request);
157
158 Matcher matcher = _firefoxPattern.matcher(userAgent);
159
160 if (matcher.find()) {
161 return true;
162 }
163
164 return false;
165 }
166
167 public boolean isGecko(HttpServletRequest request) {
168 String userAgent = getUserAgent(request);
169
170 if (userAgent.indexOf("gecko") != -1) {
171 return true;
172 }
173
174 return false;
175 }
176
177 public boolean isIe(HttpServletRequest request) {
178 String userAgent = getUserAgent(request);
179
180 if ((userAgent.indexOf("msie") != -1) &&
181 (userAgent.indexOf("opera") == -1)) {
182
183 return true;
184 }
185
186 return false;
187 }
188
189 public boolean isIphone(HttpServletRequest request) {
190 String userAgent = getUserAgent(request);
191
192 if (userAgent.indexOf("iphone") != -1) {
193 return true;
194 }
195
196 return false;
197 }
198
199 public boolean isLinux(HttpServletRequest request) {
200 String userAgent = getUserAgent(request);
201
202 if (userAgent.indexOf("linux") != -1) {
203 return true;
204 }
205
206 return false;
207 }
208
209 public boolean isMac(HttpServletRequest request) {
210 String userAgent = getUserAgent(request);
211
212 if (userAgent.indexOf("mac") != -1) {
213 return true;
214 }
215
216 return false;
217 }
218
219 public boolean isMobile(HttpServletRequest request) {
220 String userAgent = getUserAgent(request);
221
222 if (userAgent.indexOf("mobile") != -1) {
223 return true;
224 }
225
226 return false;
227 }
228
229 public boolean isMozilla(HttpServletRequest request) {
230 String userAgent = getUserAgent(request);
231
232 if ((userAgent.indexOf("mozilla") != -1) &&
233 (!userAgent.matches("compatible|webkit"))) {
234
235 return true;
236 }
237
238 return false;
239 }
240
241 public boolean isOpera(HttpServletRequest request) {
242 String userAgent = getUserAgent(request);
243
244 if (userAgent.indexOf("opera") != -1) {
245 return true;
246 }
247
248 return false;
249 }
250
251 public boolean isRtf(HttpServletRequest request) {
252 float majorVersion = getMajorVersion(request);
253
254 if (isIe(request) && (majorVersion >= 5.5)) {
255 return true;
256 }
257
258 if (isMozilla(request) && (majorVersion >= 1.3)) {
259 return true;
260 }
261
262 if (isSafari(request) && (majorVersion >= 3.0) && !isMobile(request)) {
263 return true;
264 }
265
266 return false;
267 }
268
269 public boolean isSafari(HttpServletRequest request) {
270 String userAgent = getUserAgent(request);
271
272 if (isWebKit(request) && (userAgent.indexOf("safari") != -1)) {
273 return true;
274 }
275
276 return false;
277 }
278
279 public boolean isSun(HttpServletRequest request) {
280 String userAgent = getUserAgent(request);
281
282 if (userAgent.indexOf("sunos") != -1) {
283 return true;
284 }
285
286 return false;
287 }
288
289 public boolean isWap(HttpServletRequest request) {
290 return isWapXhtml(request);
291 }
292
293 public boolean isWapXhtml(HttpServletRequest request) {
294 String accept = getAccept(request);
295
296 if (accept.indexOf("wap.xhtml") != -1) {
297 return true;
298 }
299
300 return false;
301 }
302
303 public boolean isWebKit(HttpServletRequest request) {
304 String userAgent = getUserAgent(request);
305
306 Matcher matcher = _webKitPattern.matcher(userAgent);
307
308 if (matcher.find()) {
309 return true;
310 }
311
312 return false;
313 }
314
315 public boolean isWindows(HttpServletRequest request) {
316 String userAgent = getUserAgent(request);
317
318 Matcher matcher = _windowsPattern.matcher(userAgent);
319
320 if (matcher.find()) {
321 return true;
322 }
323
324 return false;
325 }
326
327 public boolean isWml(HttpServletRequest request) {
328 String accept = getAccept(request);
329
330 if (accept.indexOf("wap.wml") != -1) {
331 return true;
332 }
333
334 return false;
335 }
336
337 protected String getAccept(HttpServletRequest request) {
338 String accept = StringPool.BLANK;
339
340 if (request != null) {
341 String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
342
343 if (acceptHeader != null) {
344 accept = acceptHeader.toLowerCase();
345 }
346 }
347
348 return accept;
349 }
350
351 protected String getUserAgent(HttpServletRequest request) {
352 String userAgent = StringPool.BLANK;
353
354 if (request != null) {
355 String userAgentHeader = request.getHeader(HttpHeaders.USER_AGENT);
356
357 if (userAgentHeader != null) {
358 userAgent = userAgentHeader.toLowerCase();
359 }
360 }
361
362 return userAgent;
363 }
364
365 private static Pattern _firefoxPattern = Pattern.compile(
366 "(firefox|minefield|granparadiso|bonecho|firebird|phoenix|camino)");
367 private static Pattern _majorVersionPattern = Pattern.compile(
368 "(\\d+[.]\\d+)");
369 private static Pattern _revisionPattern = Pattern.compile(
370 ".+(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
371 private static Pattern _versionChromePattern = Pattern.compile(
372 "(?:chrome)[\\/]([\\d.]+)");
373 private static Pattern _versionFirefoxPattern = Pattern.compile(
374 "(?:firefox|minefield)[\\/]([\\d.]+)");
375 private static Pattern _versionPattern = Pattern.compile(
376 "(?:version)[\\/]([\\d.]+)");
377 private static Pattern _webKitPattern = Pattern.compile(
378 "(khtml|applewebkit)");
379 private static Pattern _windowsPattern = Pattern.compile(
380 "(windows|win32|16bit)");
381
382 }