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