/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.commons.util;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.log4j.Logger;
/**
* <pre>
* servlet.getRequest("User-Agent")를 정보를 가지고 사용자 브라우저의 종류와 os정보를 사용합니다.
* </pre>
*
* @author hangum
*
*/
public class ServletUserAgent {
private static final Logger logger = Logger.getLogger(ServletUserAgent.class);
/** tadpole가 지원하는 시스템만 */
public enum OS_SIMPLE_TYPE {
MACOSX,
WINDOWS,
LINUX,
UNKNOWN
}
/** 알아 낼수 있는 전체 os */
public enum OS_TYPE {
MACOSX,
WIN95,
WIN98,
WINNT,
WIN2K,
WINXP,
WINVISTA,
WIN7,
WIN8,
LINUX,
IOS,
ANDROID,
JAVA_ME,
UNKNOWN
}
/**알아낼수있는 전체 브라우저 */
public enum BROWSER_TYPE {
EDGE,
IE,
FIREFOX,
CHROME,
OPERA,
SAFARI,
UNKNOWN
}
// private OS_TYPE OS_Type = OS_TYPE.UNKNOWN;
private OS_SIMPLE_TYPE oS_Simple_Type = OS_SIMPLE_TYPE.UNKNOWN;
private BROWSER_TYPE browser_Type = BROWSER_TYPE.UNKNOWN;
private int majorVersion = 0;
private String fullVersion = "0";
/**
* 시스템의 정보를 가져온다.
*
* @param req
*/
public void detect(HttpServletRequest req) {
String userAgent = req.getHeader("User-Agent");
if(logger.isDebugEnabled()) {
logger.debug("=====================================================================");
logger.debug("user agent :" + userAgent);
}
// OS_Type = detectedOS(userAgent);
oS_Simple_Type = detectedOSSimple(userAgent);
detectBrowser(userAgent);
}
private OS_SIMPLE_TYPE detectedOSSimple(String userAgent) {
if (null == userAgent) {
return OS_SIMPLE_TYPE.UNKNOWN;
} else if(userAgent.contains("Mac OS X")) {
return OS_SIMPLE_TYPE.MACOSX;
} else if (userAgent.contains("Windows")) {
return OS_SIMPLE_TYPE.WINDOWS;
} else if (userAgent.contains("Linux")) {
return OS_SIMPLE_TYPE.LINUX;
}
return OS_SIMPLE_TYPE.UNKNOWN;
}
// private OS_TYPE detectedOS(String userAgent) {
// if (null == userAgent) {
// return OS_TYPE.UNKNOWN;
// } else if(userAgent.contains("Android")) {
// return OS_TYPE.ANDROID;
// } else if(userAgent.contains("J2ME")) {
// return OS_TYPE.JAVA_ME;
// } else if(userAgent.contains("iPhone") || userAgent.contains("iPod") || userAgent.contains("iPad")) {
// return OS_TYPE.IOS;
// } else if(userAgent.contains("Mac OS X")) {
// return OS_TYPE.MACOSX;
// } else if (userAgent.contains("Windows NT 5.0")) {
// return OS_TYPE.WIN2K;
// } else if (userAgent.contains("Windows NT 5.1") || userAgent.contains("Windows NT 5.2") || userAgent.contains("Windows XP")) {
// return OS_TYPE.WINXP;
// } else if (userAgent.contains("Windows NT 6.0")) {
// return OS_TYPE.WINVISTA;
// } else if (userAgent.contains("Windows NT 6.1")) {
// return OS_TYPE.WIN7;
// } else if (userAgent.contains("Windows NT 6.2")) {
// return OS_TYPE.WIN8;
// } else if (userAgent.contains("Windows NT")) {
// return OS_TYPE.WINNT;
// } else if (userAgent.contains("Linux")) {
// return OS_TYPE.LINUX;
// }
// return OS_TYPE.UNKNOWN;
// }
public void detectBrowser(String userAgentStr) {
if (null != userAgentStr) {
try {
if(userAgentStr.contains("Edge/")) {
browser_Type = BROWSER_TYPE.EDGE;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("Edge/")+5);
// fullVersion = fullVersion;//.substring(0, fullVersion.indexOf(";")).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
} else if (userAgentStr.contains("MSIE ")) {
browser_Type = BROWSER_TYPE.IE;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("MSIE ")+5);
fullVersion = fullVersion.substring(0, fullVersion.indexOf(";")).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
} else if (userAgentStr.contains("Trident")) {
browser_Type = BROWSER_TYPE.IE;
// Internet Explorer 11
// Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
// Internet Explorer 10
// Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
if(userAgentStr.contains("Trident/6.0")) {
fullVersion = "10";
majorVersion = 10;
} else {
fullVersion = userAgentStr.substring(userAgentStr.indexOf("rv:"));
fullVersion = fullVersion.substring(3, fullVersion.indexOf(")")).trim();
majorVersion = (int)NumberUtils.toFloat(fullVersion);
}
} else if(userAgentStr.contains("Chrome/")) {
browser_Type = BROWSER_TYPE.CHROME;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("Chrome/")+7);
fullVersion = fullVersion.substring(0, fullVersion.indexOf(" ")).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
} else if (userAgentStr.contains("Firefox/")) {
browser_Type = BROWSER_TYPE.FIREFOX;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("Firefox/")+8);
fullVersion = fullVersion.substring(0, (fullVersion.indexOf(" ") > 0 ? fullVersion.indexOf(" ") : fullVersion.length())).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
} else if (userAgentStr.contains("Opera ") || userAgentStr.contains("Opera/")) {
browser_Type = BROWSER_TYPE.OPERA;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("Opera ")+6);
fullVersion = fullVersion.substring(0, (fullVersion.indexOf(" ") > 0 ? fullVersion.indexOf(" ") : fullVersion.length())).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
} else if (userAgentStr.contains("Safari/")) {
browser_Type = BROWSER_TYPE.SAFARI;
fullVersion = userAgentStr.substring(userAgentStr.indexOf("Version/")+8);
fullVersion = fullVersion.substring(0, (fullVersion.indexOf(" ") > 0 ? fullVersion.indexOf(" ") : fullVersion.length())).trim();
majorVersion = Integer.parseInt(fullVersion.substring(0, fullVersion.indexOf(".")));
}
} catch (Exception nfe) {
fullVersion = "0";
majorVersion = 0;
}
}
}
// public OS_TYPE getOsType() {
// return OS_Type;
// }
public OS_SIMPLE_TYPE getOSSimpleType() {
return oS_Simple_Type;
}
public BROWSER_TYPE getBrowserType() {
return browser_Type;
}
public String getFullVersion() {
return fullVersion;
}
public int getMajorVersion() {
return majorVersion;
}
}