Unable to convert scala gatling to java gatling, Need Help

I tried converting it to java gatling but getting some compatibility issue related to java gatling. I need to convert two files InternallyTrackedAction and InternallyTrackedActionBuilder scala classes,

class InternallyTrackedAction(
                               val requestWith: RequestAction,
                               val trackWith: Tracker,
                               val requestName: Expression[String],
                               val context: ScenarioContext,
                               val next: Action
                             ) extends RequestAction with NameGen {
  val coreComponents: CoreComponents = context.coreComponents

  override val statsEngine: StatsEngine = coreComponents.statsEngine
  override val clock: Clock = coreComponents.clock
  override val name: String = genName("InternallyTrackedAction")

  override def sendRequest(session: Session): Validation[Unit] = {
    val startTime = clock.nowMillis
    val reqName: String = requestName(session).toOption.get

    val requestValidation = requestWith.sendRequest(session)

    val trackerValidation = trackWith.track(session)

    val validation = mergeValidations(requestValidation, trackerValidation) {
      (a, b) => s"$a - $b"
    }

    validation.onSuccess(_ => statsEngine.logResponse(session.scenario, session.groups, reqName, startTime, clock.nowMillis, OK, None, None))
    validation
  }

  def mergeValidations[A, B, C](validation1: Validation[A], validation2: Validation[B])(mergeFn: (A, B) => C): Validation[Unit] = {
    (validation1, validation2) match {
      case (Success(a), Success(b)) =>
        Success(mergeFn(a, b))
      case (Failure(err1), Failure(err2)) =>
        Failure(err1 ++ err2)
      case (Failure(err), _) =>
        Failure(err)
      case (_, Failure(err)) =>
        Failure(err)
    }
  }

}

Here is the builder class,

final class InternallyTrackedActionBuilder(val requestName: Expression[String]) extends ActionBuilder {
  private var requestActionBuilder: Option[BiFunction[ScenarioContext, Action, RequestAction]] = None
  private var tracker: Option[Tracker] = None

  def requestWithHttp(httpRequestBuilder: HttpRequestBuilder): InternallyTrackedActionBuilder = {
    this.requestActionBuilder = Some((ctx, next) => httpRequestBuilder.build(ctx, next).asInstanceOf[RequestAction])
    this
  }

  def trackWith(tracker: Tracker): InternallyTrackedActionBuilder = {
    this.tracker = Some(tracker)
    this
  }

  def trackOnCreatedEvent(transactionId: Expression[String]): InternallyTrackedActionBuilder = {
    this.tracker = Some(new CreatedEventTracker(transactionId))
    this
  }

  def trackOnStatusChangedEvent(transactionId: Expression[String]): InternallyTrackedActionBuilder = {
    this.tracker = Some(new StatusChangedEventTracker(transactionId))
    this
  }

  override def build(ctx: ScenarioContext, next: Action): Action =
    new InternallyTrackedAction(requestActionBuilder.get.apply(ctx, next),
      tracker.getOrElse((session: Session) => Success()),
      requestName, ctx, next)
}

object InternallyTrackedActionBuilder {
  def internallyTrackedAction(requestName: Expression[String]): InternallyTrackedActionBuilder = new InternallyTrackedActionBuilder(requestName)
}

It"s been used in TransactionUtil here,

def requestTransactionApprovalToDbLimits(requestName: Expression[String]): ChainBuilder = {
  feed(createUserDecisionFeederForAction("APPROVE_LIMIT_REQUEST", entityVersion = 0))
    .exec(
      internallyTrackedAction(requestName)
        .requestWithHttp(
          http("Send Approval Request")
            .post("/api/abcd/#{sourceReference}:0/status")
            .body(ElFileBody("performance/abcd.json"))
        )
        .trackOnCreatedEvent("#{sourceReference}")
    )
    .exec { session =>
      DbLimitsMockResponseEvents.sendApprovalEvent(session, "#{sourceReference}")
      session
    }
    .pause(Duration(10, TimeUnit.MILLISECONDS))
}

In java this part

  http("Send Approval Request")
            .post("/api/abcd/#{sourceReference}:0/status")
            .body(ElFileBody("performance/abcd.json"))

returns HttpRequestActionBuilder but this class don"t contains any build method inside it, whereas in scala HttpRequestBuilder is used

I think AI did well in converting, did you try AI yet ?

Note: this code is not standard Gatling usage (SDK API) but custom components. Not something we from Gatling can help with here.

Yeah tried it but unfortunately, code was not working, there were some compatibility issue in java gatling came

Yeah, it’s a custom Action created, I want the same behaviour to be implemented in java gatling

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.