001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.servlet;
016    
017    import com.liferay.portal.kernel.servlet.BrowserSniffer;
018    import com.liferay.portal.kernel.servlet.HttpHeaders;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    import com.liferay.portal.kernel.util.Validator;
022    
023    import java.util.regex.Matcher;
024    import java.util.regex.Pattern;
025    
026    import javax.servlet.http.HttpServletRequest;
027    
028    /**
029     * See http://www.zytrax.com/tech/web/browser_ids.htm for examples.
030     *
031     * @author Eduardo Lundgren
032     * @author Nate Cavanaugh
033     */
034    public class BrowserSnifferImpl implements BrowserSniffer {
035    
036            public boolean acceptsGzip(HttpServletRequest request) {
037                    String acceptEncoding = request.getHeader(HttpHeaders.ACCEPT_ENCODING);
038    
039                    if ((acceptEncoding != null) && acceptEncoding.contains("gzip")) {
040                            return true;
041                    }
042                    else {
043                            return false;
044                    }
045            }
046    
047            public String getBrowserId(HttpServletRequest request) {
048                    if (isIe(request)) {
049                            return BROWSER_ID_IE;
050                    }
051                    else if (isFirefox(request)) {
052                            return BROWSER_ID_FIREFOX;
053                    }
054                    else {
055                            return BROWSER_ID_OTHER;
056                    }
057            }
058    
059            public float getMajorVersion(HttpServletRequest request) {
060                    float majorVersion = 0;
061    
062                    String version = getVersion(request);
063    
064                    Matcher matcher = _majorVersionPattern.matcher(version);
065    
066                    if (matcher.find()) {
067                            majorVersion = GetterUtil.getFloat(matcher.group(1));
068                    }
069    
070                    return majorVersion;
071            }
072    
073            public String getRevision(HttpServletRequest request) {
074                    String revision = StringPool.BLANK;
075    
076                    String userAgent = getUserAgent(request);
077    
078                    Matcher matcher = _revisionPattern.matcher(userAgent);
079    
080                    if (matcher.find()) {
081                            revision = matcher.group(1);
082                    }
083    
084                    return revision;
085            }
086    
087            public String getVersion(HttpServletRequest request) {
088                    String userAgent = getUserAgent(request);
089    
090                    String version = StringPool.BLANK;
091    
092                    Matcher matcher = _versionPattern.matcher(userAgent);
093    
094                    if (matcher.find()) {
095                            version = matcher.group(1);
096                    }
097                    else if (isFirefox(request)) {
098                            Matcher versionFirefoxMatcher = _versionFirefoxPattern.matcher(
099                                    userAgent);
100    
101                            if (versionFirefoxMatcher.find()) {
102                                    version = versionFirefoxMatcher.group(1);
103                            }
104                    }
105                    else if (isChrome(request)) {
106                            Matcher versionChromeMatcher = _versionChromePattern.matcher(
107                                    userAgent);
108    
109                            if (versionChromeMatcher.find()) {
110                                    version = versionChromeMatcher.group(1);
111                            }
112                    }
113                    else {
114                            version = getRevision(request);
115                    }
116    
117                    return version;
118            }
119    
120            public boolean isAir(HttpServletRequest request) {
121                    String userAgent = getUserAgent(request);
122    
123                    if (userAgent.contains("adobeair")) {
124                            return true;
125                    }
126    
127                    return false;
128            }
129    
130            public boolean isChrome(HttpServletRequest request) {
131                    String userAgent = getUserAgent(request);
132    
133                    if (userAgent.contains("chrome")) {
134                            return true;
135                    }
136    
137                    return false;
138            }
139    
140            public boolean isFirefox(HttpServletRequest request) {
141                    if (!isMozilla(request)) {
142                            return false;
143                    }
144    
145                    String userAgent = getUserAgent(request);
146    
147                    for (String firefoxAlias : _FIREFOX_ALIASES) {
148                            if (userAgent.contains(firefoxAlias)) {
149                                    return true;
150                            }
151                    }
152    
153                    return false;
154            }
155    
156            public boolean isGecko(HttpServletRequest request) {
157                    String userAgent = getUserAgent(request);
158    
159                    if (userAgent.contains("gecko")) {
160                            return true;
161                    }
162    
163                    return false;
164            }
165    
166            public boolean isIe(HttpServletRequest request) {
167                    String userAgent = getUserAgent(request);
168    
169                    if (userAgent.contains("msie") && !userAgent.contains("opera")) {
170                            return true;
171                    }
172    
173                    return false;
174            }
175    
176            public boolean isIphone(HttpServletRequest request) {
177                    String userAgent = getUserAgent(request);
178    
179                    if (userAgent.contains("iphone")) {
180                            return true;
181                    }
182    
183                    return false;
184            }
185    
186            public boolean isLinux(HttpServletRequest request) {
187                    String userAgent = getUserAgent(request);
188    
189                    if (userAgent.contains("linux")) {
190                            return true;
191                    }
192    
193                    return false;
194            }
195    
196            public boolean isMac(HttpServletRequest request) {
197                    String userAgent = getUserAgent(request);
198    
199                    if (userAgent.contains("mac")) {
200                            return true;
201                    }
202    
203                    return false;
204            }
205    
206            public boolean isMobile(HttpServletRequest request) {
207                    String userAgent = getUserAgent(request);
208    
209                    if (userAgent.contains("mobile")) {
210                            return true;
211                    }
212    
213                    return false;
214            }
215    
216            public boolean isMozilla(HttpServletRequest request) {
217                    String userAgent = getUserAgent(request);
218    
219                    if (userAgent.contains("mozilla") &&
220                            !(userAgent.contains("compatible") ||
221                              userAgent.contains("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 (!isMobile(request)) {
251                            if (isOpera(request) && (majorVersion >= 10.0)) {
252                                    return true;
253                            }
254    
255                            if (isSafari(request) && (majorVersion >= 3.0)) {
256                                    return true;
257                            }
258                    }
259    
260                    return false;
261            }
262    
263            public boolean isSafari(HttpServletRequest request) {
264                    String userAgent = getUserAgent(request);
265    
266                    if (isWebKit(request) && userAgent.contains("safari")) {
267                            return true;
268                    }
269    
270                    return false;
271            }
272    
273            public boolean isSun(HttpServletRequest request) {
274                    String userAgent = getUserAgent(request);
275    
276                    if (userAgent.contains("sunos")) {
277                            return true;
278                    }
279    
280                    return false;
281            }
282    
283            public boolean isWap(HttpServletRequest request) {
284                    return isWapXhtml(request);
285            }
286    
287            public boolean isWapXhtml(HttpServletRequest request) {
288                    String accept = getAccept(request);
289    
290                    if (accept.contains("wap.xhtml")) {
291                            return true;
292                    }
293    
294                    return false;
295            }
296    
297            public boolean isWebKit(HttpServletRequest request) {
298                    String userAgent = getUserAgent(request);
299    
300                    for (String webKitAlias : _WEBKIT_ALIASES) {
301                            if (userAgent.contains(webKitAlias)) {
302                                    return true;
303                            }
304                    }
305    
306                    return false;
307            }
308    
309            public boolean isWindows(HttpServletRequest request) {
310                    String userAgent = getUserAgent(request);
311    
312                    for (String windowsAlias : _WINDOWS_ALIASES) {
313                            if (userAgent.contains(windowsAlias)) {
314                                    return true;
315                            }
316                    }
317    
318                    return false;
319            }
320    
321            public boolean isWml(HttpServletRequest request) {
322                    String accept = getAccept(request);
323    
324                    if (accept.contains("wap.wml")) {
325                            return true;
326                    }
327    
328                    return false;
329            }
330    
331            protected String getAccept(HttpServletRequest request) {
332                    String accept = StringPool.BLANK;
333    
334                    if (request == null) {
335                            return accept;
336                    }
337    
338                    accept = String.valueOf(request.getAttribute(HttpHeaders.ACCEPT));
339    
340                    if (Validator.isNotNull(accept)) {
341                            return accept;
342                    }
343    
344                    accept = request.getHeader(HttpHeaders.ACCEPT);
345    
346                    if (accept != null) {
347                            accept = accept.toLowerCase();
348                    }
349                    else {
350                            accept = StringPool.BLANK;
351                    }
352    
353                    request.setAttribute(HttpHeaders.ACCEPT, accept);
354    
355                    return accept;
356            }
357    
358            protected String getUserAgent(HttpServletRequest request) {
359                    String userAgent = StringPool.BLANK;
360    
361                    if (request == null) {
362                            return userAgent;
363                    }
364    
365                    userAgent = String.valueOf(
366                            request.getAttribute(HttpHeaders.USER_AGENT));
367    
368                    if (Validator.isNotNull(userAgent)) {
369                            return userAgent;
370                    }
371    
372                    userAgent = request.getHeader(HttpHeaders.USER_AGENT);
373    
374                    if (userAgent != null) {
375                            userAgent = userAgent.toLowerCase();
376                    }
377                    else {
378                            userAgent = StringPool.BLANK;
379                    }
380    
381                    request.setAttribute(HttpHeaders.USER_AGENT, userAgent);
382    
383                    return userAgent;
384            }
385    
386            private static final String[] _FIREFOX_ALIASES = {
387                    "firefox", "minefield", "granparadiso", "bonecho", "firebird",
388                    "phoenix", "camino"
389            };
390    
391            private static final String[] _WEBKIT_ALIASES = {"khtml", "applewebkit"};
392    
393            private static final String[] _WINDOWS_ALIASES = {
394                    "windows", "win32", "16bit"
395            };
396    
397            private static Pattern _majorVersionPattern = Pattern.compile(
398                    "(\\d+[.]\\d+)");
399            private static Pattern _revisionPattern = Pattern.compile(
400                    "(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
401            private static Pattern _versionChromePattern = Pattern.compile(
402                    "(?:chrome)[\\/]([\\d.]+)");
403            private static Pattern _versionFirefoxPattern = Pattern.compile(
404                    "(?:firefox|minefield)[\\/]([\\d.]+)");
405            private static Pattern _versionPattern = Pattern.compile(
406                    "(?:version)[\\/]([\\d.]+)");
407    
408    }