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