content: package site.alanliang.geekblog.utils;
  
  import cn.hutool.core.io.resource.ClassPathResource;
  import eu.bitwalker.useragentutils.Browser;
  import eu.bitwalker.useragentutils.UserAgent;
  import org.lionsoul.ip2region.DataBlock;
  import org.lionsoul.ip2region.DbConfig;
  import org.lionsoul.ip2region.DbSearcher;
  import site.alanliang.geekblog.common.Constant;
  
  import javax.servlet.http.HttpServletRequest;
  import java.io.File;
  import java.io.IOException;
  import java.lang.reflect.Method;
  import java.net.InetAddress;
  import java.net.UnknownHostException;
  import java.util.Calendar;
  import java.util.Date;
  
  /**
   * @author Zheng Jie
   * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
   */
  public class StringUtils extends org.apache.commons.lang3.StringUtils {
  
      private static final char SEPARATOR = '_';
  
      private static final String UNKNOWN = "unknown";
  
      /**
       * 驼峰命名法工具
       *
       * @return toCamelCase(" hello_world ") == "helloWorld"
       * toCapitalizeCamelCase("hello_world") == "HelloWorld"
       * toUnderScoreCase("helloWorld") = "hello_world"
       */
      public static String toCamelCase(String s) {
          if (s == null) {
              return null;
          }
  
          s = s.toLowerCase();
  
          StringBuilder sb = new StringBuilder(s.length());
          boolean upperCase = false;
          for (int i = 0; i < s.length(); i++) {
              char c = s.charAt(i);
  
              if (c == SEPARATOR) {
                  upperCase = true;
              } else if (upperCase) {
                  sb.append(Character.toUpperCase(c));
                  upperCase = false;
              } else {
                  sb.append(c);
              }
          }
  
          return sb.toString();
      }
  
      /**
       * 驼峰命名法工具
       *
       * @return toCamelCase(" hello_world ") == "helloWorld"
       * toCapitalizeCamelCase("hello_world") == "HelloWorld"
       * toUnderScoreCase("helloWorld") = "hello_world"
       */
      public static String toCapitalizeCamelCase(String s) {
          if (s == null) {
              return null;
          }
          s = toCamelCase(s);
          return s.substring(0, 1).toUpperCase() + s.substring(1);
      }
  
      /**
       * 驼峰命名法工具
       *
       * @return toCamelCase(" hello_world ") == "helloWorld"
       * toCapitalizeCamelCase("hello_world") == "HelloWorld"
       * toUnderScoreCase("helloWorld") = "hello_world"
       */
      static String toUnderScoreCase(String s) {
          if (s == null) {
              return null;
          }
  
          StringBuilder sb = new StringBuilder();
          boolean upperCase = false;
          for (int i = 0; i < s.length(); i++) {
              char c = s.charAt(i);
  
              boolean nextUpperCase = true;
  
              if (i < (s.length() - 1)) {
                  nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
              }
  
              if ((i > 0) && Character.isUpperCase(c)) {
                  if (!upperCase || !nextUpperCase) {
                      sb.append(SEPARATOR);
                  }
                  upperCase = true;
              } else {
                  upperCase = false;
              }
  
              sb.append(Character.toLowerCase(c));
          }
  
          return sb.toString();
      }
  
      /**
       * 获取ip地址
       */
      public static String getIp(HttpServletRequest request) {
          String ip = request.getHeader("x-forwarded-for");
          if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
              ip = request.getHeader("Proxy-Client-IP");
          }
          if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
              ip = request.getHeader("WL-Proxy-Client-IP");
          }
          if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
              ip = request.getRemoteAddr();
          }
          String comma = ",";
          String localhost = "127.0.0.1";
          if (ip.contains(comma)) {
              ip = ip.split(",")[0];
          }
          if (localhost.equals(ip)) {
              // 获取本机真正的ip地址
              try {
                  ip = InetAddress.getLocalHost().getHostAddress();
              } catch (UnknownHostException e) {
                  e.printStackTrace();
              }
          }
          return ip;
      }
  
      /**
       * 根据ip获取详细地址
       */
      public static String getCityInfo(String ip) {
          DbSearcher searcher = null;
          try {
              String path = "ip2region/ip2region.db";
              String name = "ip2region.db";
              DbConfig config = new DbConfig();
              File file = FileUtil.inputStreamToFile(new ClassPathResource(path).getStream(), name);
              searcher = new DbSearcher(config, file.getPath());
              Method method;
              method = searcher.getClass().getMethod("btreeSearch", String.class);
              DataBlock dataBlock;
              dataBlock = (DataBlock) method.invoke(searcher, ip);
              String address = dataBlock.getRegion().replace("0|", "");
              char symbol = '|';
              if (address.charAt(address.length() - 1) == symbol) {
                  address = address.substring(0, address.length() - 1);
              }
              return address.equals(Constant.REGION) ? "内网IP" : address;
          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              if (searcher != null) {
                  try {
                      searcher.close();
                  } catch (IOException ignored) {
                  }
              }
  
          }
          return "";
      }
  
      public static String getBrowser(HttpServletRequest request) {
          UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
          Browser browser = userAgent.getBrowser();
          return browser.getName();
      }
  
      public static String getClientOS(HttpServletRequest request) {
          UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
          // 获取客户端操作系统
          return userAgent.getOperatingSystem().getName();
      }
  
      /**
       * 获得当天是周几
       */
      public static String getWeekDay() {
          String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
          Calendar cal = Calendar.getInstance();
          cal.setTime(new Date());
  
          int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
          if (w < 0) {
              w = 0;
          }
          return weekDays[w];
      }
  }
  