private def getRandomJsonInternal()

in DataProcessing/datax-utility/src/main/scala/datax/utility/DataGenerator.scala [32:167]


  private def getRandomJsonInternal(dataType: DataType, metadata: Metadata): JValue = {
    implicit val formats = DefaultFormats

    val rand = ThreadLocalRandom.current()
    dataType match {
      case t: StringType =>
        val maxLength = getMaxLength(metadata)
        var result = Random.alphanumeric.take(maxLength).mkString
        if (metadata.contains(SettingAllowedValues)) {
          val vals = metadata.getStringArray(SettingAllowedValues)
          val randomIndex = rand.nextInt(vals.length)
          result = vals(randomIndex)
        }
        JString(result)
      case t: DoubleType =>
        var result = rand.nextDouble()
        if (metadata != null) {

          // The settings are evaluated in a specific order below. For e.g. is both allowedValues and Min/Max value is set, allowedValues is taken.
          // This order is maintained for all numeric types.
          if (metadata.contains(SettingAllowedValues)) {
            val vals = metadata.getDoubleArray(SettingAllowedValues)
            val randomIndex = rand.nextInt(vals.length)
            result = vals(randomIndex)
          }
          else if (metadata.contains(SettingMinValue) || metadata.contains(SettingMaxValue)) {
            val minVal = getDoubleValue(SettingMinValue, metadata)
            val maxVal = getDoubleValue(SettingMaxValue, metadata)

            result = maxVal match {
              case None => minVal match {
                case None => result
                case Some(value) => rand.nextDouble(minVal.getOrElse(Double.MinValue), maxVal.getOrElse(Double.MaxValue))
              }
              case Some(value) => rand.nextDouble(minVal.getOrElse(Double.MinValue), maxVal.getOrElse(Double.MaxValue))
            }
          }
        }
        JDouble(result)
      case t: IntegerType =>
        var result = rand.nextInt()
        if (metadata != null) {
          if(metadata.contains(SettingAllowedValues)) {
            val vals = metadata.getLongArray(SettingAllowedValues)
            val randomIndex = rand.nextInt(vals.length)
            result = vals(randomIndex).toInt
            }
          else if(metadata.contains(SettingMinValue) || metadata.contains(SettingMaxValue)) {
            val minVal = getIntValue(SettingMinValue, metadata)
            val maxVal = getIntValue(SettingMaxValue, metadata)

            result = maxVal match {
              case None => minVal match {
                case None=> result
                case Some(value) => rand.nextInt(minVal.getOrElse(Int.MinValue), maxVal.getOrElse(Int.MaxValue))
              }
              case Some(value) => rand.nextInt(minVal.getOrElse(Int.MinValue), maxVal.getOrElse(Int.MaxValue))
            }
          }
        }
        JInt(result)
      case t: LongType =>
        var result = rand.nextLong()
        if (metadata != null) {
          // currentTimeMillis setting is evaluated first, then allowedValues and then Min/Max for longType.
          if (metadata.contains(SettingUseCurrentTimeMillis)) {
            result = System.currentTimeMillis()
          }
          else if (metadata.contains(SettingAllowedValues)) {
            val vals = metadata.getLongArray(SettingAllowedValues)
            val randomIndex = rand.nextInt(vals.length)
            result = vals(randomIndex)
          }
          else if (metadata.contains(SettingMinValue) || metadata.contains(SettingMaxValue)) {
            val minVal = getLongValue(SettingMinValue, metadata)
            val maxVal = getLongValue(SettingMaxValue, metadata)

            result = maxVal match {
              case None => minVal match {
                case None=> result
                case Some(value) => rand.nextLong(minVal.getOrElse(Long.MinValue), maxVal.getOrElse(Long.MaxValue))
              }
              case Some(value) => rand.nextLong(minVal.getOrElse(Long.MinValue), maxVal.getOrElse(Long.MaxValue))
            }
          }
        }
        JInt(result)
      case t: FloatType =>
        var result = rand.nextFloat()
        if (metadata != null) {
          if (metadata.contains(SettingAllowedValues)) {
            val vals = metadata.getDoubleArray(SettingAllowedValues)
            val randomIndex = rand.nextInt(vals.length)
            result = vals(randomIndex).toFloat
          }
          else if (metadata.contains(SettingMinValue) || metadata.contains(SettingMaxValue)) {
            val minVal = getFloatValue(SettingMinValue, metadata)
            val maxVal = getFloatValue(SettingMaxValue, metadata)

            result = maxVal match {
              case None => minVal match {
                case None => result
                case Some(value) => rand.nextDouble(minVal.getOrElse(Float.MinValue).toDouble, maxVal.getOrElse(Float.MaxValue).toDouble).toFloat
              }
              case Some(value) => rand.nextDouble(minVal.getOrElse(Float.MinValue).toDouble, maxVal.getOrElse(Float.MaxValue).toDouble).toFloat
            }
          }
        }
        JDouble(result)
      case t: BooleanType =>
        JBool(rand.nextBoolean())
      case t: ArrayType =>
        val maxLength = getMaxLength(metadata)
        val size = rand.nextInt(maxLength)
        JArray(
          (0 to size).map(_ => getRandomJsonInternal(t.elementType, Metadata.empty)).toList
        )
      case t: MapType =>
        val maxLength = getMaxLength(metadata)
        val size = rand.nextInt(maxLength)
          JObject(
            (0 to size).map(_ => compact(render(getRandomJsonInternal(t.keyType, Metadata.empty))) -> getRandomJsonInternal(t.valueType, Metadata.empty)).toList
          )
      case t: StructType =>
        JObject(
          t.fields.flatMap {
            f =>
              // Generate null 10% of the time
              if (f.nullable && rand.nextInt(10)>=9)
                None
              else
                Some(JField(f.name, getRandomJsonInternal(f.dataType, f.metadata)))
          }.toList
        )
    }
  }