001
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
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 }