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