All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dahuatech.hutool.http.useragent.UserAgentParser Maven / Gradle / Ivy

package com.dahuatech.hutool.http.useragent;

import com.dahuatech.hutool.core.util.ReUtil;

import java.util.regex.Pattern;

/**
 * User-Agent解析器
 *
 * @author looly
 * @since 4.2.1
 */
public class UserAgentParser {

  /**
   * 解析User-Agent
   *
   * @param userAgentString User-Agent字符串
   * @return {@link UserAgent}
   */
  public static UserAgent parse(String userAgentString) {
    final UserAgent userAgent = new UserAgent();

    final Browser browser = parseBrowser(userAgentString);
    userAgent.setBrowser(parseBrowser(userAgentString));
    userAgent.setVersion(browser.getVersion(userAgentString));

    final Engine engine = parseEngine(userAgentString);
    userAgent.setEngine(engine);
    if (false == engine.isUnknown()) {
      userAgent.setEngineVersion(parseEngineVersion(engine, userAgentString));
    }
    userAgent.setOs(parseOS(userAgentString));
    final Platform platform = parsePlatform(userAgentString);
    userAgent.setPlatform(platform);
    userAgent.setMobile(platform.isMobile() || browser.isMobile());

    return userAgent;
  }

  /**
   * 解析浏览器类型
   *
   * @param userAgentString User-Agent字符串
   * @return 浏览器类型
   */
  private static Browser parseBrowser(String userAgentString) {
    for (Browser brower : Browser.browers) {
      if (brower.isMatch(userAgentString)) {
        return brower;
      }
    }
    return Browser.Unknown;
  }

  /**
   * 解析引擎类型
   *
   * @param userAgentString User-Agent字符串
   * @return 引擎类型
   */
  private static Engine parseEngine(String userAgentString) {
    for (Engine engine : Engine.engines) {
      if (engine.isMatch(userAgentString)) {
        return engine;
      }
    }
    return Engine.Unknown;
  }

  /**
   * 解析引擎版本
   *
   * @param engine 引擎
   * @param userAgentString User-Agent字符串
   * @return 引擎版本
   */
  private static String parseEngineVersion(Engine engine, String userAgentString) {
    final String regexp = engine.getName() + "[\\/\\- ]([\\d\\w\\.\\-]+)";
    final Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
    return ReUtil.getGroup1(pattern, userAgentString);
  }

  /**
   * 解析系统类型
   *
   * @param userAgentString User-Agent字符串
   * @return 系统类型
   */
  private static OS parseOS(String userAgentString) {
    for (OS os : OS.oses) {
      if (os.isMatch(userAgentString)) {
        return os;
      }
    }
    return OS.Unknown;
  }

  /**
   * 解析平台类型
   *
   * @param userAgentString User-Agent字符串
   * @return 平台类型
   */
  private static Platform parsePlatform(String userAgentString) {
    for (Platform platform : Platform.platforms) {
      if (platform.isMatch(userAgentString)) {
        return platform;
      }
    }
    return Platform.Unknown;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy