001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.matches("compatible|webkit")) {
220    
221                            return true;
222                    }
223    
224                    return false;
225            }
226    
227            public boolean isOpera(HttpServletRequest request) {
228                    String userAgent = getUserAgent(request);
229    
230                    if (userAgent.contains("opera")) {
231                            return true;
232                    }
233    
234                    return false;
235            }
236    
237            public boolean isRtf(HttpServletRequest request) {
238                    float majorVersion = getMajorVersion(request);
239    
240                    if (isIe(request) && (majorVersion >= 5.5)) {
241                            return true;
242                    }
243    
244                    if (isMozilla(request) && (majorVersion >= 1.3)) {
245                            return true;
246                    }
247    
248                    if (isSafari(request) && (majorVersion >= 3.0) && !isMobile(request)) {
249                            return true;
250                    }
251    
252                    return false;
253            }
254    
255            public boolean isSafari(HttpServletRequest request) {
256                    String userAgent = getUserAgent(request);
257    
258                    if (isWebKit(request) && userAgent.contains("safari")) {
259                            return true;
260                    }
261    
262                    return false;
263            }
264    
265            public boolean isSun(HttpServletRequest request) {
266                    String userAgent = getUserAgent(request);
267    
268                    if (userAgent.contains("sunos")) {
269                            return true;
270                    }
271    
272                    return false;
273            }
274    
275            public boolean isWap(HttpServletRequest request) {
276                    return isWapXhtml(request);
277            }
278    
279            public boolean isWapXhtml(HttpServletRequest request) {
280                    String accept = getAccept(request);
281    
282                    if (accept.contains("wap.xhtml")) {
283                            return true;
284                    }
285    
286                    return false;
287            }
288    
289            public boolean isWebKit(HttpServletRequest request) {
290                    String userAgent = getUserAgent(request);
291    
292                    for (String webKitAlias : _WEBKIT_ALIASES) {
293                            if (userAgent.contains(webKitAlias)) {
294                                    return true;
295                            }
296                    }
297    
298                    return false;
299            }
300    
301            public boolean isWindows(HttpServletRequest request) {
302                    String userAgent = getUserAgent(request);
303    
304                    for (String windowsAlias : _WINDOWS_ALIASES) {
305                            if (userAgent.contains(windowsAlias)) {
306                                    return true;
307                            }
308                    }
309    
310                    return false;
311            }
312    
313            public boolean isWml(HttpServletRequest request) {
314                    String accept = getAccept(request);
315    
316                    if (accept.contains("wap.wml")) {
317                            return true;
318                    }
319    
320                    return false;
321            }
322    
323            protected String getAccept(HttpServletRequest request) {
324                    String accept = StringPool.BLANK;
325    
326                    if (request != null) {
327                            accept = (String)request.getAttribute(HttpHeaders.ACCEPT);
328    
329                            if (accept == null) {
330                                    String acceptHeader = request.getHeader(HttpHeaders.ACCEPT);
331    
332                                    if (acceptHeader != null) {
333                                            accept = acceptHeader.toLowerCase();
334                                    }
335                                    else {
336                                            accept = StringPool.BLANK;
337                                    }
338    
339                                    request.setAttribute(HttpHeaders.ACCEPT, accept);
340                            }
341                    }
342    
343                    return accept;
344            }
345    
346            protected String getUserAgent(HttpServletRequest request) {
347                    String userAgent = StringPool.BLANK;
348    
349                    if (request != null) {
350                            userAgent = (String)request.getAttribute(HttpHeaders.USER_AGENT);
351    
352                            if (userAgent == null) {
353                                    String userAgentHeader = request.getHeader(
354                                            HttpHeaders.USER_AGENT);
355    
356                                    if (userAgentHeader != null) {
357                                            userAgent = userAgentHeader.toLowerCase();
358                                    }
359                                    else {
360                                            userAgent = StringPool.BLANK;
361                                    }
362    
363                                    request.setAttribute(HttpHeaders.USER_AGENT, userAgent);
364                            }
365                    }
366    
367                    return userAgent;
368            }
369    
370            private static final String[] _FIREFOX_ALIASES = {
371                    "firefox", "minefield", "granparadiso", "bonecho", "firebird",
372                    "phoenix", "camino"
373            };
374    
375            private static final String[] _WEBKIT_ALIASES = {"khtml", "applewebkit"};
376    
377            private static final String[] _WINDOWS_ALIASES = {
378                    "windows", "win32", "16bit"
379            };
380    
381            private static Pattern _majorVersionPattern = Pattern.compile(
382                    "(\\d+[.]\\d+)");
383            private static Pattern _revisionPattern = Pattern.compile(
384                    "(?:rv|it|ra|ie)[\\/: ]([\\d.]+)");
385            private static Pattern _versionChromePattern = Pattern.compile(
386                    "(?:chrome)[\\/]([\\d.]+)");
387            private static Pattern _versionFirefoxPattern = Pattern.compile(
388                    "(?:firefox|minefield)[\\/]([\\d.]+)");
389            private static Pattern _versionPattern = Pattern.compile(
390                    "(?:version)[\\/]([\\d.]+)");
391    
392    }