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