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    
022    import java.util.regex.Matcher;
023    import java.util.regex.Pattern;
024    
025    import javax.servlet.http.HttpServletRequest;
026    
027    /**
028     * See http://www.zytrax.com/tech/web/browser_ids.htm for examples.
029     *
030     * @author Eduardo Lundgren
031     * @author Nate Cavanaugh
032     */
033    public class BrowserSnifferImpl implements BrowserSniffer {
034    
035            public boolean acceptsGzip(HttpServletRequest request) {
036                    String acceptEncoding = request.getHeader(HttpHeaders.ACCEPT_ENCODING);
037    
038                    if ((acceptEncoding != null) && acceptEncoding.contains("gzip")) {
039                            return true;
040                    }
041                    else {
042                            return false;
043                    }
044            }
045    
046            public String getBrowserId(HttpServletRequest request) {
047                    if (isIe(request)) {
048                            return BROWSER_ID_IE;
049                    }
050                    else if (isFirefox(request)) {
051                            return BROWSER_ID_FIREFOX;
052                    }
053                    else {
054                            return BROWSER_ID_OTHER;
055                    }
056            }
057    
058            public float getMajorVersion(HttpServletRequest request) {
059                    float majorVersion = 0;
060    
061                    String version = getVersion(request);
062    
063                    Matcher matcher = _majorVersionPattern.matcher(version);
064    
065                    if (matcher.find()) {
066                            majorVersion = GetterUtil.getFloat(matcher.group(1));
067                    }
068    
069                    return majorVersion;
070            }
071    
072            public String getRevision(HttpServletRequest request) {
073                    String revision = StringPool.BLANK;
074    
075                    String userAgent = getUserAgent(request);
076    
077                    Matcher matcher = _revisionPattern.matcher(userAgent);
078    
079                    if (matcher.find()) {
080                            revision = matcher.group(1);
081                    }
082    
083                    return revision;
084            }
085    
086            public String getVersion(HttpServletRequest request) {
087                    String userAgent = getUserAgent(request);
088    
089                    String version = StringPool.BLANK;
090    
091                    Matcher matcher = _versionPattern.matcher(userAgent);
092    
093                    if (matcher.find()) {
094                            version = matcher.group(1);
095                    }
096                    else if (isFirefox(request)) {
097                            Matcher versionFirefoxMatcher = _versionFirefoxPattern.matcher(
098                                    userAgent);
099    
100                            if (versionFirefoxMatcher.find()) {
101                                    version = versionFirefoxMatcher.group(1);
102                            }
103                    }
104                    else if (isChrome(request)) {
105                            Matcher versionChromeMatcher = _versionChromePattern.matcher(
106                                    userAgent);
107    
108                            if (versionChromeMatcher.find()) {
109                                    version = versionChromeMatcher.group(1);
110                            }
111                    }
112                    else {
113                            version = getRevision(request);
114                    }
115    
116                    return version;
117            }
118    
119            public boolean isAir(HttpServletRequest request) {
120                    String userAgent = getUserAgent(request);
121    
122                    if (userAgent.contains("adobeair")) {
123                            return true;
124                    }
125    
126                    return false;
127            }
128    
129            public boolean isChrome(HttpServletRequest request) {
130                    String userAgent = getUserAgent(request);
131    
132                    if (userAgent.contains("chrome")) {
133                            return true;
134                    }
135    
136                    return false;
137            }
138    
139            public boolean isFirefox(HttpServletRequest request) {
140                    if (!isMozilla(request)) {
141                            return false;
142                    }
143    
144                    String userAgent = getUserAgent(request);
145    
146                    for (String firefoxAlias : _FIREFOX_ALIASES) {
147                            if (userAgent.contains(firefoxAlias)) {
148                                    return true;
149                            }
150                    }
151    
152                    return false;
153            }
154    
155            public boolean isGecko(HttpServletRequest request) {
156                    String userAgent = getUserAgent(request);
157    
158                    if (userAgent.contains("gecko")) {
159                            return true;
160                    }
161    
162                    return false;
163            }
164    
165            public boolean isIe(HttpServletRequest request) {
166                    String userAgent = getUserAgent(request);
167    
168                    if (userAgent.contains("msie") && !userAgent.contains("opera")) {
169                            return true;
170                    }
171    
172                    return false;
173            }
174    
175            public boolean isIphone(HttpServletRequest request) {
176                    String userAgent = getUserAgent(request);
177    
178                    if (userAgent.contains("iphone")) {
179                            return true;
180                    }
181    
182                    return false;
183            }
184    
185            public boolean isLinux(HttpServletRequest request) {
186                    String userAgent = getUserAgent(request);
187    
188                    if (userAgent.contains("linux")) {
189                            return true;
190                    }
191    
192                    return false;
193            }
194    
195            public boolean isMac(HttpServletRequest request) {
196                    String userAgent = getUserAgent(request);
197    
198                    if (userAgent.contains("mac")) {
199                            return true;
200                    }
201    
202                    return false;
203            }
204    
205            public boolean isMobile(HttpServletRequest request) {
206                    String userAgent = getUserAgent(request);
207    
208                    if (userAgent.contains("mobile")) {
209                            return true;
210                    }
211    
212                    return false;
213            }
214    
215            public boolean isMozilla(HttpServletRequest request) {
216                    String userAgent = getUserAgent(request);
217    
218                    if (userAgent.contains("mozilla") &&
219                            !(userAgent.contains("compatible") ||
220                              userAgent.contains("webkit"))) {
221    
222                            return true;
223                    }
224    
225                    return false;
226            }
227    
228            public boolean isOpera(HttpServletRequest request) {
229                    String userAgent = getUserAgent(request);
230    
231                    if (userAgent.contains("opera")) {
232                            return true;
233                    }
234    
235                    return false;
236            }
237    
238            public boolean isRtf(HttpServletRequest request) {
239                    float majorVersion = getMajorVersion(request);
240    
241                    if (isIe(request) && (majorVersion >= 5.5)) {
242                            return true;
243                    }
244    
245                    if (isMozilla(request) && (majorVersion >= 1.3)) {
246                            return true;
247                    }
248    
249                    if (!isMobile(request)) {
250                            if (isOpera(request) && (majorVersion >= 10.0)) {
251                                    return true;
252                            }
253    
254                            if (isSafari(request) && (majorVersion >= 3.0)) {
255                                    return true;
256                            }
257                    }
258    
259                    return false;
260            }
261    
262            public boolean isSafari(HttpServletRequest request) {
263                    String userAgent = getUserAgent(request);
264    
265                    if (isWebKit(request) && userAgent.contains("safari")) {
266                            return true;
267                    }
268    
269                    return false;
270            }
271    
272            public boolean isSun(HttpServletRequest request) {
273                    String userAgent = getUserAgent(request);
274    
275                    if (userAgent.contains("sunos")) {
276                            return true;
277                    }
278    
279                    return false;
280            }
281    
282            public boolean isWap(HttpServletRequest request) {
283                    return isWapXhtml(request);
284            }
285    
286            public boolean isWapXhtml(HttpServletRequest request) {
287                    String accept = getAccept(request);
288    
289                    if (accept.contains("wap.xhtml")) {
290                            return true;
291                    }
292    
293                    return false;
294            }
295    
296            public boolean isWebKit(HttpServletRequest request) {
297                    String userAgent = getUserAgent(request);
298    
299                    for (String webKitAlias : _WEBKIT_ALIASES) {
300                            if (userAgent.contains(webKitAlias)) {
301                                    return true;
302                            }
303                    }
304    
305                    return false;
306            }
307    
308            public boolean isWindows(HttpServletRequest request) {
309                    String userAgent = getUserAgent(request);
310    
311                    for (String windowsAlias : _WINDOWS_ALIASES) {
312                            if (userAgent.contains(windowsAlias)) {
313                                    return true;
314                            }
315                    }
316    
317                    return false;
318            }
319    
320            public boolean isWml(HttpServletRequest request) {
321                    String accept = getAccept(request);
322    
323                    if (accept.contains("wap.wml")) {
324                            return true;
325                    }
326    
327                    return false;
328            }
329    
330            protected String getAccept(HttpServletRequest request) {
331                    String accept = StringPool.BLANK;
332    
333                    if (request != null) {
334                            accept = (String)request.getAttribute(HttpHeaders.ACCEPT);
335    
336                            if (accept == null) {
337                                    String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
338    
339                                    if (acceptHeader != null) {
340                                            accept = acceptHeader.toLowerCase();
341                                    }
342                                    else {
343                                            accept = StringPool.BLANK;
344                                    }
345    
346                                    request.setAttribute(HttpHeaders.ACCEPT, accept);
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                            userAgent = (String)request.getAttribute(HttpHeaders.USER_AGENT);
358    
359                            if (userAgent == null) {
360                                    String userAgentHeader = request.getHeader(
361                                            HttpHeaders.USER_AGENT);
362    
363                                    if (userAgentHeader != null) {
364                                            userAgent = userAgentHeader.toLowerCase();
365                                    }
366                                    else {
367                                            userAgent = StringPool.BLANK;
368                                    }
369    
370                                    request.setAttribute(HttpHeaders.USER_AGENT, userAgent);
371                            }
372                    }
373    
374                    return userAgent;
375            }
376    
377            private static final String[] _FIREFOX_ALIASES = {
378                    "firefox", "minefield", "granparadiso", "bonecho", "firebird",
379                    "phoenix", "camino"
380            };
381    
382            private static final String[] _WEBKIT_ALIASES = {"khtml", "applewebkit"};
383    
384            private static final String[] _WINDOWS_ALIASES = {
385                    "windows", "win32", "16bit"
386            };
387    
388            private static Pattern _majorVersionPattern = Pattern.compile(
389                    "(\\d+[.]\\d+)");
390            private static Pattern _revisionPattern = Pattern.compile(
391                    "(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
392            private static Pattern _versionChromePattern = Pattern.compile(
393                    "(?:chrome)[\\/]([\\d.]+)");
394            private static Pattern _versionFirefoxPattern = Pattern.compile(
395                    "(?:firefox|minefield)[\\/]([\\d.]+)");
396            private static Pattern _versionPattern = Pattern.compile(
397                    "(?:version)[\\/]([\\d.]+)");
398    
399    }