/**
* Copyright (c) 2000-2017 Liferay, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.liferay.faces.util.client.internal;
import javax.servlet.http.HttpServletRequest;
//J-
/**
* This class was copied from Liferay Portal in order to utilize the features of the Portal's BrowserSniffer without
* depending on the Liferay Portal API.
*
* See http://www.zytrax.com/tech/web/browser_ids.htm for examples.
*
* @author Eduardo Lundgren
* @author Nate Cavanaugh
*/
public class LiferayPortalBrowserSnifferImpl extends LiferayPortalBrowserSnifferCompat implements LiferayPortalBrowserSniffer {
@Override
public boolean acceptsGzip(HttpServletRequest request) {
String acceptEncoding = request.getHeader("Accept-Encoding");
if ((acceptEncoding != null) && acceptEncoding.contains("gzip")) {
return true;
}
else {
return false;
}
}
@Override
public String getBrowserId(HttpServletRequest request) {
if (isIe(request)) {
return BROWSER_ID_IE;
}
else if (isFirefox(request)) {
return BROWSER_ID_FIREFOX;
}
else {
return BROWSER_ID_OTHER;
}
}
@Override
public float getMajorVersion(HttpServletRequest request) {
return GetterUtil.getFloat(getVersion(request));
}
@Override
public String getRevision(HttpServletRequest request) {
String revision = (String)request.getAttribute(
WebKeys.BROWSER_SNIFFER_REVISION);
if (revision != null) {
return revision;
}
revision = parseVersion(
getUserAgent(request), revisionLeadings, revisionSeparators);
request.setAttribute(WebKeys.BROWSER_SNIFFER_REVISION, revision);
return revision;
}
@Override
public String getVersion(HttpServletRequest request) {
String version = (String)request.getAttribute(
WebKeys.BROWSER_SNIFFER_VERSION);
if (version != null) {
return version;
}
String userAgent = getUserAgent(request);
version = parseVersion(userAgent, versionLeadings, versionSeparators);
if (version.isEmpty()) {
version = parseVersion(
userAgent, revisionLeadings, revisionSeparators);
}
request.setAttribute(WebKeys.BROWSER_SNIFFER_VERSION, version);
return version;
}
@Override
public boolean isAir(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("adobeair")) {
return true;
}
return false;
}
@Override
public boolean isAndroid(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("android")) {
return true;
}
return false;
}
@Override
public boolean isChrome(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("chrome")) {
return true;
}
return false;
}
@Override
public boolean isFirefox(HttpServletRequest request) {
if (!isMozilla(request)) {
return false;
}
String userAgent = getUserAgent(request);
for (String firefoxAlias : _FIREFOX_ALIASES) {
if (userAgent.contains(firefoxAlias)) {
return true;
}
}
return false;
}
@Override
public boolean isGecko(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("gecko")) {
return true;
}
return false;
}
@Override
public boolean isIe(HttpServletRequest request) {
return isIe(getUserAgent(request));
}
@Override
public boolean isIeOnWin32(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (isIe(userAgent) &&
!(userAgent.contains("wow64") || userAgent.contains("win64"))) {
return true;
}
return false;
}
@Override
public boolean isIeOnWin64(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (isIe(userAgent) &&
(userAgent.contains("wow64") || userAgent.contains("win64"))) {
return true;
}
return false;
}
@Override
public boolean isIphone(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("iphone")) {
return true;
}
return false;
}
@Override
public boolean isLinux(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("linux")) {
return true;
}
return false;
}
@Override
public boolean isMac(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("mac")) {
return true;
}
return false;
}
@Override
public boolean isMobile(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("mobile") ||
(isAndroid(request) && userAgent.contains("nexus"))) {
return true;
}
return false;
}
@Override
public boolean isMozilla(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("mozilla") &&
!(userAgent.contains("compatible") ||
userAgent.contains("webkit"))) {
return true;
}
return false;
}
@Override
public boolean isOpera(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("opera")) {
return true;
}
return false;
}
@Override
public boolean isRtf(HttpServletRequest request) {
if (isAndroid(request)) {
return true;
}
if (isChrome(request)) {
return true;
}
float majorVersion = getMajorVersion(request);
if (isIe(request) && (majorVersion >= 5.5)) {
return true;
}
if (isMozilla(request) && (majorVersion >= 1.3)) {
return true;
}
if (isOpera(request)) {
if (isMobile(request) && (majorVersion >= 10.0)) {
return true;
}
else if (!isMobile(request)) {
return true;
}
}
if (isSafari(request)) {
if (isMobile(request) && (majorVersion >= 5.0)) {
return true;
}
else if (!isMobile(request) && (majorVersion >= 3.0)) {
return true;
}
}
return false;
}
@Override
public boolean isSafari(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (isWebKit(request) && userAgent.contains("safari")) {
return true;
}
return false;
}
@Override
public boolean isSun(HttpServletRequest request) {
String userAgent = getUserAgent(request);
if (userAgent.contains("sunos")) {
return true;
}
return false;
}
@Override
public boolean isWebKit(HttpServletRequest request) {
String userAgent = getUserAgent(request);
for (String webKitAlias : _WEBKIT_ALIASES) {
if (userAgent.contains(webKitAlias)) {
return true;
}
}
return false;
}
@Override
public boolean isWindows(HttpServletRequest request) {
String userAgent = getUserAgent(request);
for (String windowsAlias : _WINDOWS_ALIASES) {
if (userAgent.contains(windowsAlias)) {
return true;
}
}
return false;
}
protected static String parseVersion(
String userAgent, String[] leadings, char[] separators) {
leading:
for (String leading : leadings) {
int index = 0;
version:
while (true) {
index = userAgent.indexOf(leading, index);
if ((index < 0) ||
(((index += leading.length()) + 2) > userAgent.length())) {
continue leading;
}
char c1 = userAgent.charAt(index);
char c2 = userAgent.charAt(++index);
if (((c2 >= '0') && (c2 <= '9')) || (c2 == '.')) {
for (char separator : separators) {
if (c1 == separator) {
break version;
}
}
}
}
// Major
int majorStart = index;
int majorEnd = index + 1;
for (int i = majorStart; i < userAgent.length(); i++) {
char c = userAgent.charAt(i);
if ((c < '0') || (c > '9')) {
majorEnd = i;
break;
}
}
String major = userAgent.substring(majorStart, majorEnd);
if (userAgent.charAt(majorEnd) != '.') {
return major;
}
// Minor
int minorStart = majorEnd + 1;
int minorEnd = userAgent.length();
for (int i = minorStart; i < userAgent.length(); i++) {
char c = userAgent.charAt(i);
if ((c < '0') || (c > '9')) {
minorEnd = i;
break;
}
}
String minor = userAgent.substring(minorStart, minorEnd);
return major.concat(".").concat(minor);
}
return "";
}
protected String getAccept(HttpServletRequest request) {
String accept = "";
if (request == null) {
return accept;
}
accept = String.valueOf(request.getAttribute("ACCEPT"));
if (Validator.isNotNull(accept)) {
return accept;
}
accept = request.getHeader("ACCEPT");
if (accept != null) {
accept = StringUtil.toLowerCase(accept);
}
else {
accept = "";
}
request.setAttribute("ACCEPT", accept);
return accept;
}
protected String getUserAgent(HttpServletRequest request) {
String userAgent = "";
if (request == null) {
return userAgent;
}
userAgent = String.valueOf(
request.getAttribute("User-Agent"));
if (Validator.isNotNull(userAgent)) {
return userAgent;
}
userAgent = request.getHeader("User-Agent");
if (userAgent != null) {
userAgent = StringUtil.toLowerCase(userAgent);
}
else {
userAgent = "";
}
request.setAttribute("User-Agent", userAgent);
return userAgent;
}
protected boolean isIe(String userAgent) {
if (userAgent.contains("msie") && !userAgent.contains("opera")) {
return true;
}
return false;
}
protected static String[] revisionLeadings = {"rv", "it", "ra", "ie"};
protected static char[] revisionSeparators =
{CharPool.BACK_SLASH, CharPool.COLON, CharPool.SLASH, CharPool.SPACE};
protected static String[] versionLeadings =
{"version", "firefox", "minefield", "chrome"};
protected static char[] versionSeparators =
{CharPool.BACK_SLASH, CharPool.SLASH};
private static final String[] _FIREFOX_ALIASES = {
"firefox", "minefield", "granparadiso", "bonecho", "firebird",
"phoenix", "camino"
};
private static final String[] _WEBKIT_ALIASES = {"khtml", "applewebkit"};
private static final String[] _WINDOWS_ALIASES = {
"windows", "win32", "16bit"
};
}
//J+