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