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

io.github.seabow.datax.common.ConfigUtils.scala Maven / Gradle / Ivy

package io.github.seabow.datax.common

import com.typesafe.config._
import org.apache.commons.text.StringEscapeUtils

import scala.collection.JavaConverters._
import scala.collection.mutable

object ConfigUtils {
  /**
   * 解析自定义变量参数
   *
   * @param config
   * @param key
   * @return
   */
  def getUdvMap(udvList: List[Config]): Map[String, String] = {
    var map = Map.empty[String, String]
    udvList.map(udv => {
      val udvName = udv.getString("name")
      val udvType = udv.getString("type")
      val udvValue = udv.getString("value")

      udvType match {
        case "udf" => {
          val pattern = "(.*)\\.(.*)\\((.*)\\)".r
          val regRes = pattern.findAllIn(udvValue)
          val udfClass = regRes.group(1)
          val udfFunction = regRes.group(2)
          val udfParam = regRes.group(3)
          println(s"udf info,class:$udfClass,method:$udfFunction,param:$udfParam")
          val c = Class.forName(udfClass)
          val method = c.getDeclaredMethod(udfFunction, classOf[String])
          val finalValue = method.invoke(null, udfParam).toString
          map += (udvName -> finalValue)
        }
        case "shell"=>{
          map+=(udvName->ShellUtils.runShellForStringSubstitution(udvValue))
        }
        case _ => return map
      }
    })
    map
  }

  /**
   * 生成最终的config。
   * 1.通过$代替的来源,可以是udv,也可以是param,param的优先级高于udv。
   * @param configContent
   * @param params
   * @return
   */
  def parseAndResolveContent(configContent: String, params: Map[String, String]=Map.empty): Config = {
    var finalConfig = configContent
    // 先处理自定义的参数
    params.map { case (k, v) =>
      val findStr = "\\$\\{" + k + "\\}"
      finalConfig = finalConfig.replaceAll(findStr, StringEscapeUtils.escapeXSI(v))
    }
    val paramConfig: Config = ConfigFactory.parseMap(params.asJava)
    val resolveOptions= ConfigResolveOptions.defaults().setAllowUnresolved(true)
    val config = ConfigFactory.parseString(finalConfig).resolve(resolveOptions).resolveWith(paramConfig,resolveOptions)
    if(!config.hasPath("udv")){
      return config
    }

    // 处理UDV
    var udvParamMap:Map[String,String]=getUdvMap(config.getConfigList("udv").asScala.toList)
    val udvParamMapConfig: Config = ConfigFactory.parseMap(udvParamMap.asJava)
    println(udvParamMapConfig)
    val result= config.resolveWith(udvParamMapConfig, ConfigResolveOptions.defaults().setAllowUnresolved(true))
    finalConfig=result.root().render()
    udvParamMap.map{
      case (k,v)=>
        val findStr = "\\$\\{" + k + "\\}"
        finalConfig = finalConfig.replaceAll(findStr, v)
    }
   return ConfigFactory.parseString(finalConfig)
  }

  implicit class ImplicitConfigUtils(config: Config){
    def getString(key: String, defaultValue: String): String = {
      if (config.hasPath(key)) config.getString(key) else defaultValue
    }

    def getStringSafely(key: String): String = {
      getString( key, "")
    }

    /*获取布尔值*/
    def getBoolean( key: String, defaultValue: Boolean): Boolean = {
      if (config.hasPath(key)) config.getBoolean(key) else defaultValue
    }

    def getBooleanSafely(key: String): Boolean = {
      getBoolean(key, false)
    }

    /*获取整型数值*/
    def getInt( key: String, defaultValue: Int): Int = {
      if (config.hasPath(key)) config.getInt(key) else defaultValue
    }

    def getIntSafely(key: String): Int = {
      getInt( key, 0)
    }

    def getElement[T]( key: String): T = {
      key match {
        case key if (config.hasPath(key)) => config.getAnyRef(key).asInstanceOf[T]
      }
    }

    /*取String List*/
    def getStringListSafely(key: String): List[String] = {
      key match {
        case x if config.hasPath(x) => config.getStringList(x).asScala.toList
        case _ => Nil
      }
    }

    /*获取mutable.Map[String, String]*/
    def getStringMapSafely(key: String): mutable.Map[String, String] = {
      val map = new mutable.LinkedHashMap[String, String]
      if (config.hasPath(key)) {
        config.getConfig(key)
          .entrySet()
          .asScala
          .foreach(entry => {
            map.put(entry.getKey, entry.getValue.unwrapped().toString)
          })
      }
      map
    }

    /*获取 Map[String, List[String]]*/
    def getListMapSafely(key: String): Map[String, List[String]] = {
      var map = Map.empty[String, List[String]]
      key match {
        case x if config.hasPath(x) => {
          config.getConfig(key).
            entrySet().asScala.
            foreach(entry => {
              val key = entry.getKey
              val value = entry.getValue.atKey(key).getStringList(key).asScala.toList
              if (value.nonEmpty) {
                map += key -> entry.getValue.atKey(key).getStringList(key).asScala.toList
              }
            })
        }
        case _ => return map
      }
      map
    }
  }

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy