blob: 312a156e97eed2557f58dfb25b5428415a148788 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.gatling.protocol
import java.net.URL
import scala.jdk.CollectionConverters._
import org.apache.ignite.Ignite
import org.apache.ignite.client.IgniteClient
import org.apache.ignite.configuration.ClientConfiguration
import org.apache.ignite.configuration.IgniteConfiguration
import org.apache.ignite.internal.IgniteComponentType.SPRING
import org.apache.ignite.internal.IgnitionEx
import org.apache.ignite.internal.util.IgniteUtils
import org.apache.ignite.internal.util.spring.IgniteSpringHelper
trait IgniteProtocolSupport {
/** Ignite protocol builder starting point. */
val igniteProtocol: IgniteProtocolBuilderBase.type = IgniteProtocolBuilderBase
/**
* Implicit to build protocol from the IgniteProtocolBuilder.
* @param builder Protocol builder.
* @return Protocol.
*/
implicit def builder2igniteProtocol(builder: IgniteProtocolBuilder): IgniteProtocol = builder.build
/**
* Implicit to build protocol from the IgniteProtocolBuilderExplicitStartStep.
* @param builder Protocol builder.
* @return Protocol.
*/
implicit def builderExplicitStartStep2igniteProtocol(builder: IgniteProtocolBuilderExplicitStartStep): IgniteProtocol = builder.build
}
/**
* Base Ignite protocol builder.
*/
case object IgniteProtocolBuilderBase {
/**
* Specify Ignite API as pre-started Ignite (thin) Client instance.
*
* @param igniteClient IgniteClient instance.
* @return Build step for additional protocol parameters.
*/
def client(igniteClient: IgniteClient): IgniteProtocolBuilder =
IgniteProtocolBuilder(IgniteClientCfg(igniteClient), explicitClientStart = false)
/**
* Specify Ignite API as Ignite (thin) client configuration.
*
* @param cfg ClientConfiguration instance.
* @return Build step for additional protocol parameters.
*/
def clientCfg(cfg: ClientConfiguration): IgniteProtocolBuilderExplicitStartStep =
IgniteProtocolBuilderExplicitStartStep(IgniteClientConfigurationCfg(cfg))
/**
* Specify Ignite API as Ignite (thin) client Spring XML configuration file.
*
* @param cfgUrl URL of Spring XML configuration file containing the ClientConfiguration bean.
* @return Build step for additional protocol parameters.
*/
def clientCfgPath(cfgUrl: URL): IgniteProtocolBuilderExplicitStartStep = {
val spring: IgniteSpringHelper = SPRING.create(false)
val clientCfg = spring.loadConfigurations(cfgUrl, classOf[ClientConfiguration])
.get1().asScala.head
IgniteProtocolBuilderExplicitStartStep(IgniteClientConfigurationCfg(clientCfg))
}
/**
* Specify Ignite API as Ignite (thin) client Spring XML configuration file.
*
* @param cfgPath Path to Spring XML configuration file containing the ClientConfiguration bean.
* @return Build step for additional protocol parameters.
*/
def clientCfgPath(cfgPath: String): IgniteProtocolBuilderExplicitStartStep =
clientCfgPath(IgniteUtils.resolveSpringUrl(cfgPath))
/**
* Specify Ignite API as Ignite (thin) Client instances pool.
*
* @param pool Pool of IgniteClient instances.
* @return Build step for additional protocol parameters.
*/
def clientPool(pool: IgniteClientPool): IgniteProtocolBuilder =
IgniteProtocolBuilder(IgniteClientPoolCfg(pool), explicitClientStart = false)
/**
* Specify Ignite API as pre-started Ignite (thick) node instance.
*
* @param ignite Ignite instance.
* @return Build step for additional protocol parameters.
*/
def ignite(ignite: Ignite): IgniteProtocolBuilder =
IgniteProtocolBuilder(IgniteNodeCfg(ignite), explicitClientStart = false)
/**
* Specify Ignite API as Ignite (thick) node configuration.
*
* @param cfg IgniteConfiguration instance.
* @return Build step for additional protocol parameters.
*/
def igniteCfg(cfg: IgniteConfiguration): IgniteProtocolBuilder =
IgniteProtocolBuilder(IgniteConfigurationCfg(cfg), explicitClientStart = false)
/**
* Specify Ignite API as Ignite (thick) node Spring XML configuration file.
*
* @param cfgUrl URL of Spring XML configuration file containing the IgniteConfiguration bean.
* @return Build step for additional protocol parameters.
*/
def igniteCfgPath(cfgUrl: URL): IgniteProtocolBuilder =
IgniteProtocolBuilder(IgniteConfigurationCfg(IgnitionEx.loadConfiguration(cfgUrl).get1()), explicitClientStart = false)
/**
* Specify Ignite API as Ignite (thick) node Spring XML configuration file.
*
* @param cfgPath Path to Spring XML configuration file containing the IgniteConfiguration bean.
* @return Build step for additional protocol parameters.
*/
def igniteCfgPath(cfgPath: String): IgniteProtocolBuilder =
igniteCfgPath(IgniteUtils.resolveSpringUrl(cfgPath))
}
/**
* Builder step for additional protocol parameters.
*
* @param cfg Ignite API configuration.
*/
case class IgniteProtocolBuilderExplicitStartStep(cfg: IgniteCfg) {
/**
* Specify the `withExplicitClientStart` flag.
* @return Protocol builder further step.
*/
def withExplicitClientStart: IgniteProtocolBuilder = IgniteProtocolBuilder(cfg, explicitClientStart = true)
/**
* Builds Ignite protocol instance.
* @return Protocol builder further step.
*/
def build: IgniteProtocol = IgniteProtocolBuilder(cfg, explicitClientStart = false).build
}
/**
* Ignite protocol builder step for other parameters.
*
* @param cfg Ignite API configuration.
* @param explicitClientStart Explicit client start flag.
*/
case class IgniteProtocolBuilder(cfg: IgniteCfg, explicitClientStart: Boolean) {
/**
* Builds Ignite protocol instance.
* @return Protocol builder further step.
*/
def build: IgniteProtocol = IgniteProtocol(cfg, explicitClientStart)
}