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