support maturity level on CLI and module loader

This commit is contained in:
Jonathan Shook 2021-12-21 13:08:46 -06:00
parent 2e74116dca
commit ba736c5f6e
22 changed files with 170 additions and 62 deletions

View File

@ -4,6 +4,7 @@ import io.nosqlbench.docsys.DocsysDefaultAppPath;
import io.nosqlbench.docsys.api.Docs;
import io.nosqlbench.docsys.api.WebServiceObject;
import io.nosqlbench.docsys.handlers.FavIconHandler;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.ServletRegistration;
@ -123,8 +124,8 @@ public class NBWebServer implements Runnable {
.collect(Collectors.toList());
}
SimpleServiceLoader<WebServiceObject> svcLoader = new SimpleServiceLoader<>(WebServiceObject.class);
svcLoader.getNamedProviders().values()
SimpleServiceLoader<WebServiceObject> svcLoader = new SimpleServiceLoader<>(WebServiceObject.class, Maturity.Any);
svcLoader.getNamedProviders().stream().map(p -> p.provider)
.forEach(p -> {
Class<? extends WebServiceObject> c = p.type();
logger.info("Adding web service object: " + c.getSimpleName());
@ -294,7 +295,7 @@ public class NBWebServer implements Runnable {
server.setHandler(handlers);
for (Connector connector : server.getConnectors()) {
if (connector instanceof AbstractConnector) {
logger.debug("Setting idle timeout for " + connector.toString() + " to 300,000ms");
logger.debug("Setting idle timeout for " + connector + " to 300,000ms");
((AbstractConnector) connector).setIdleTimeout(300000);
}
}

View File

@ -3,6 +3,7 @@ package io.nosqlbench.docsys.endpoints;
import io.nosqlbench.docsys.api.WebServiceObject;
import io.nosqlbench.docsys.core.NBWebServer;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.annotations.Maturity;
import jakarta.inject.Singleton;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
@ -13,7 +14,7 @@ import jakarta.ws.rs.core.MediaType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Service(value = WebServiceObject.class, selector = "docserver-status")
@Service(value = WebServiceObject.class, selector = "docserver-status", maturity = Maturity.Deprecated)
@Singleton
@Path("_")
public class DocServerStatusEndpoint implements WebServiceObject {

View File

@ -7,6 +7,7 @@ import io.nosqlbench.docsys.api.WebServiceObject;
import io.nosqlbench.docsys.core.DocsysPathLoader;
import io.nosqlbench.docsys.core.PathWalker;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.annotations.Maturity;
import jakarta.inject.Singleton;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
@ -20,7 +21,7 @@ import java.nio.file.Files;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
@Service(value = WebServiceObject.class, selector = "docsys-markdown")
@Service(value = WebServiceObject.class, selector = "docsys-markdown",maturity = Maturity.Deprecated)
@Singleton
@Path("/services/docs/")
public class DocsysMarkdownEndpoint implements WebServiceObject {

View File

@ -19,6 +19,7 @@ package io.nosqlbench.engine.api.activityapi.cyclelog.filters;
import io.nosqlbench.engine.api.activityapi.core.Activity;
import io.nosqlbench.engine.api.util.SimpleConfig;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
import java.util.function.IntPredicate;
@ -26,7 +27,7 @@ import java.util.function.IntPredicate;
public interface ExperimentalResultFilterType {
SimpleServiceLoader<ExperimentalResultFilterType> FINDER =
new SimpleServiceLoader<>(ExperimentalResultFilterType.class);
new SimpleServiceLoader<>(ExperimentalResultFilterType.class, Maturity.Any);
default IntPredicateDispenser getFilterDispenser(Activity activity) {
SimpleConfig conf = new SimpleConfig(activity, "resultfilter");

View File

@ -17,11 +17,12 @@
package io.nosqlbench.engine.api.activityapi.cyclelog.filters;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
public interface ResultValueFilterType {
SimpleServiceLoader<ResultValueFilterType> FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class);
SimpleServiceLoader<ResultValueFilterType> FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class, Maturity.Any);
ResultFilterDispenser getDispenser(String config);
}

View File

@ -18,12 +18,13 @@
package io.nosqlbench.engine.api.activityapi.input;
import io.nosqlbench.engine.api.activityapi.core.Activity;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
public interface InputType {
SimpleServiceLoader<InputType> FINDER =
new SimpleServiceLoader<>(InputType.class);
new SimpleServiceLoader<>(InputType.class, Maturity.Any);
InputDispenser getInputDispenser(Activity activity);
}

View File

@ -18,12 +18,13 @@
package io.nosqlbench.engine.api.activityapi.output;
import io.nosqlbench.engine.api.activityapi.core.Activity;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
public interface OutputType {
SimpleServiceLoader<OutputType> FINDER =
new SimpleServiceLoader<>(OutputType.class);
new SimpleServiceLoader<>(OutputType.class, Maturity.Any);
OutputDispenser getOutputDispenser(Activity activity);

View File

@ -17,6 +17,7 @@ import io.nosqlbench.engine.core.script.Scenario;
import io.nosqlbench.engine.core.script.ScenariosExecutor;
import io.nosqlbench.engine.core.script.ScriptParams;
import io.nosqlbench.engine.docker.DockerMetricsManager;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.annotations.Annotation;
import io.nosqlbench.nb.api.annotations.Layer;
import io.nosqlbench.nb.api.content.Content;
@ -56,10 +57,8 @@ public class NBCLI {
public NBCLI(String commandName) {
this.commandName = commandName;
}
public static void main(String[] args) {
try {
NBCLI cli = new NBCLI("eb");
@ -264,12 +263,12 @@ public class NBCLI {
}
if (options.wantsInputTypes()) {
InputType.FINDER.getAllSelectors().forEach(System.out::println);
InputType.FINDER.getAllSelectors().forEach((k,v) -> System.out.println(k + " (" + v.name() + ")"));
System.exit(0);
}
if (options.wantsMarkerTypes()) {
OutputType.FINDER.getAllSelectors().forEach(System.out::println);
OutputType.FINDER.getAllSelectors().forEach((k,v) -> System.out.println(k + " (" + v.name() + ")"));
System.exit(0);
}
@ -365,8 +364,8 @@ public class NBCLI {
options.wantsCompileScript(),
options.getReportSummaryTo(),
String.join("\n", args),
options.getLogsDirectory()
);
options.getLogsDirectory(),
Maturity.Unspecified);
ScriptBuffer buffer = new BasicScriptBuffer()
.add(options.getCommands()

View File

@ -3,6 +3,7 @@ package io.nosqlbench.engine.cli;
import io.nosqlbench.engine.api.metrics.IndicatorMode;
import io.nosqlbench.engine.api.util.Unit;
import io.nosqlbench.engine.core.script.Scenario;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.NBEnvironment;
import io.nosqlbench.nb.api.errors.BasicError;
import io.nosqlbench.nb.api.logging.NBLogLevel;
@ -59,6 +60,8 @@ public class NBCLIOptions {
private static final String SCRIPT_FILE = "--script-file";
private static final String COPY = "--copy";
private static final String SHOW_STACKTRACES = "--show-stacktraces";
private static final String EXPERIMENTAL = "--experimental";
private static final String MATURITY = "--maturity";
// Execution
private static final String EXPORT_CYCLE_LOG = "--export-cycle-log";
@ -67,6 +70,7 @@ public class NBCLIOptions {
// Execution Options
private static final String SESSION_NAME = "--session-name";
private static final String LOGS_DIR = "--logs-dir";
private static final String WORKSPACES_DIR = "--workspaces-dir";
@ -162,6 +166,7 @@ public class NBCLIOptions {
private String dockerPromRetentionDays = "183d";
private String reportSummaryTo = REPORT_SUMMARY_TO_DEFAULT;
private boolean enableAnsi = System.getenv("TERM")!=null && !System.getenv("TERM").isEmpty();
private Maturity minMaturity = Maturity.Unspecified;
public String getAnnotatorsConfig() {
return annotatorsConfig;
@ -392,6 +397,15 @@ public class NBCLIOptions {
arglist.removeFirst();
showStackTraces = true;
break;
case EXPERIMENTAL:
arglist.removeFirst();
arglist.addFirst("experimental");
arglist.addFirst("--maturity");
break;
case MATURITY:
arglist.removeFirst();
String maturity = readWordOrThrow(arglist,"maturity of components to allow");
this.minMaturity = Maturity.valueOf(maturity.toLowerCase(Locale.ROOT));
default:
nonincludes.addLast(arglist.removeFirst());
}
@ -626,6 +640,10 @@ public class NBCLIOptions {
return configs;
}
public Maturity allowMinMaturity() {
return minMaturity;
}
public List<Cmd> getCommands() {
return cmdList;
}

View File

@ -5,6 +5,7 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.engine.api.activityimpl.uniform.DriverAdapter;
import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.NBEnvironment;
import io.nosqlbench.nb.api.config.standard.*;
import io.nosqlbench.nb.api.content.Content;
@ -25,10 +26,15 @@ import java.util.stream.Collectors;
public class ActivityTypeLoader {
private static final Logger logger = LogManager.getLogger(ActivityTypeLoader.class);
private static final SimpleServiceLoader<ActivityType> ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader<ActivityType>(ActivityType.class);
private static final SimpleServiceLoader<DriverAdapter> DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class);
private final SimpleServiceLoader<ActivityType> ACTIVITYTYPE_SPI_FINDER = new SimpleServiceLoader<ActivityType>(ActivityType.class, Maturity.Any);
private final SimpleServiceLoader<DriverAdapter> DRIVERADAPTER_SPI_FINDER = new SimpleServiceLoader<>(DriverAdapter.class, Maturity.Any);
private final Set<URL> jarUrls = new HashSet<>();
public ActivityTypeLoader setMaturity(Maturity maturity) {
ACTIVITYTYPE_SPI_FINDER.setMaturity(maturity);
return this;
}
public ActivityTypeLoader() {
List<String> libpaths = NBEnvironment.INSTANCE.interpolateEach(":", "$" + NBEnvironment.NBLIBS);
@ -154,11 +160,11 @@ public class ActivityTypeLoader {
.asReadOnly();
public Set<String> getAllSelectors() {
List<String> allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors();
List<String> allDrivers = DRIVERADAPTER_SPI_FINDER.getAllSelectors();
Set<String> all = new HashSet<>();
all.addAll(allSelectors);
all.addAll(allDrivers);
Map<String, Maturity> allSelectors = ACTIVITYTYPE_SPI_FINDER.getAllSelectors();
Map<String, Maturity> addAdapters = DRIVERADAPTER_SPI_FINDER.getAllSelectors();
Set<String> all = new LinkedHashSet<>();
all.addAll(allSelectors.keySet());
all.addAll(addAdapters.keySet());
return all;
}
}

View File

@ -22,6 +22,7 @@ import io.nosqlbench.engine.api.activityimpl.ParameterMap;
import io.nosqlbench.engine.api.activityimpl.ProgressAndStateMeter;
import io.nosqlbench.engine.api.metrics.ActivityMetrics;
import io.nosqlbench.engine.core.annotation.Annotators;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.annotations.Annotation;
import io.nosqlbench.nb.api.annotations.Layer;
import io.nosqlbench.nb.api.errors.BasicError;
@ -44,9 +45,11 @@ public class ScenarioController {
private final Map<String, ActivityExecutor> activityExecutors = new ConcurrentHashMap<>();
private final String sessionId;
private final Maturity minMaturity;
public ScenarioController(String sessionId) {
public ScenarioController(String sessionId, Maturity minMaturity) {
this.sessionId = sessionId;
this.minMaturity = minMaturity;
}
/**
@ -315,9 +318,12 @@ public class ScenarioController {
if (executor == null && createIfMissing) {
ActivityType<?> activityType = new ActivityTypeLoader().load(activityDef).orElseThrow(
() -> new RuntimeException("Could not load Driver for " + activityDef + "'")
);
ActivityType<?> activityType = new ActivityTypeLoader()
.setMaturity(this.minMaturity)
.load(activityDef)
.orElseThrow(
() -> new RuntimeException("Could not load Driver for " + activityDef + "'")
);
executor = new ActivityExecutor(
activityType.getAssembledActivity(
@ -333,7 +339,7 @@ public class ScenarioController {
}
/**
* Wait for a bit. This is not the best approach, and will be replace with a different system in the future.
* Wait for a bit. This is not the best approach, and will be replaced with a different system in the future.
*
* @param waitMillis time to wait, in milliseconds
*/

View File

@ -19,17 +19,18 @@ import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine;
import io.nosqlbench.engine.api.extensions.ScriptingPluginInfo;
import io.nosqlbench.engine.api.metrics.ActivityMetrics;
import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer;
import io.nosqlbench.engine.core.annotation.Annotators;
import io.nosqlbench.engine.core.lifecycle.ActivityProgressIndicator;
import io.nosqlbench.engine.core.lifecycle.PolyglotScenarioController;
import io.nosqlbench.engine.core.lifecycle.ScenarioController;
import io.nosqlbench.engine.core.lifecycle.ScenarioResult;
import io.nosqlbench.engine.core.annotation.Annotators;
import io.nosqlbench.engine.core.metrics.PolyglotMetricRegistryBindings;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.annotations.Annotation;
import io.nosqlbench.nb.api.annotations.Layer;
import io.nosqlbench.nb.api.metadata.ScenarioMetadata;
import io.nosqlbench.nb.api.metadata.ScenarioMetadataAware;
import io.nosqlbench.nb.api.metadata.SystemId;
import io.nosqlbench.nb.api.annotations.Layer;
import io.nosqlbench.nb.api.annotations.Annotation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.graalvm.polyglot.Context;
@ -49,7 +50,10 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.stream.Collectors;
@ -58,6 +62,7 @@ public class Scenario implements Callable<ScenarioResult> {
private final String commandLine;
private final String reportSummaryTo;
private final Path logsPath;
private final Maturity minMaturity;
private Logger logger = LogManager.getLogger("SCENARIO");
private State state = State.Scheduled;
@ -106,7 +111,8 @@ public class Scenario implements Callable<ScenarioResult> {
boolean wantsCompiledScript,
String reportSummaryTo,
String commandLine,
Path logsPath) {
Path logsPath,
Maturity minMaturity) {
this.scenarioName = scenarioName;
this.scriptfile = scriptfile;
@ -118,13 +124,15 @@ public class Scenario implements Callable<ScenarioResult> {
this.reportSummaryTo = reportSummaryTo;
this.commandLine = commandLine;
this.logsPath = logsPath;
this.minMaturity = minMaturity;
}
public Scenario(String name, Engine engine, String reportSummaryTo) {
public Scenario(String name, Engine engine, String reportSummaryTo, Maturity minMaturity) {
this.scenarioName = name;
this.reportSummaryTo = reportSummaryTo;
this.engine = engine;
this.commandLine = "";
this.minMaturity = minMaturity;
this.logsPath = Path.of("logs");
}
@ -197,7 +205,7 @@ public class Scenario implements Callable<ScenarioResult> {
break;
}
scenarioController = new ScenarioController(this.scenarioName);
scenarioController = new ScenarioController(this.scenarioName, minMaturity);
if (!progressInterval.equals("disabled")) {
activityProgressIndicator = new ActivityProgressIndicator(scenarioController, progressInterval);
}

View File

@ -2,6 +2,7 @@ package io.nosqlbench.engine.core;
import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer;
import io.nosqlbench.engine.core.script.Scenario;
import io.nosqlbench.nb.annotations.Maturity;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
@ -25,7 +26,7 @@ public class ScenarioTest {
@Test
public void shouldLoadScriptText() {
ScriptEnvBuffer buffer = new ScriptEnvBuffer();
Scenario env = new Scenario("testing", Scenario.Engine.Graalvm, "stdout:300");
Scenario env = new Scenario("testing", Scenario.Engine.Graalvm, "stdout:300", Maturity.Any);
env.addScriptText("print('loaded script environment...');\n");
env.runScenario();
assertThat(env.getIOLog().get().get(0)).contains("loaded script environment...");

View File

@ -18,6 +18,7 @@
package io.nosqlbench.engine.core.script;
import io.nosqlbench.engine.core.lifecycle.ScenariosResults;
import io.nosqlbench.nb.annotations.Maturity;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@ -27,7 +28,7 @@ public class ScenariosExecutorTest {
@Disabled
public void testAwaitOnTime() {
ScenariosExecutor e = new ScenariosExecutor(ScenariosExecutorTest.class.getSimpleName(), 1);
Scenario s = new Scenario("testing", Scenario.Engine.Graalvm,"stdout:3000");
Scenario s = new Scenario("testing", Scenario.Engine.Graalvm,"stdout:3000", Maturity.Any);
s.addScriptText("load('classpath:scripts/asyncs.js');\nsetTimeout(\"print('waited')\",5000);\n");
e.execute(s);
ScenariosResults scenariosResults = e.awaitAllResults();

View File

@ -13,6 +13,7 @@ import io.nosqlbench.engine.rest.services.WorkspaceFinder;
import io.nosqlbench.engine.rest.transfertypes.LiveScenarioView;
import io.nosqlbench.engine.rest.transfertypes.RunScenarioRequest;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.annotations.Maturity;
import jakarta.inject.Singleton;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.*;
@ -119,8 +120,8 @@ public class ScenarioExecutorEndpoint implements WebServiceObject {
false,
"",
cmdList.toString(),
(java.nio.file.Path) config.getProperties().get("logpath")
);
(java.nio.file.Path) config.getProperties().get("logpath"),
Maturity.Unspecified);
scenario.addScriptText(buffer.getParsedScript());

View File

@ -15,9 +15,33 @@ package io.nosqlbench.nb.annotations;
* <li>By default, the runtime will mark a component as Unspecified unless/until the maturity field is set of its {@link Service} annotation.</li>
* </ul>
*/
public enum Stability {
Experimental,
Settling,
Stable,
Unspecified
public enum Maturity {
Stable(6,"Proven to work in practice and has has little to no change since"),
Proven(5, "Proven to work in practice"),
Verified(4, "Tested by a user and verified to function according to expectations"),
Tested(1, "Is tested regularly with unit tests"),
Unspecified(0, "The developer needs to be more opinionated about the status of this component"),
Deprecated(-1, "This component is no loner recommended for general use"),
Experimental(-2, "This component is provided as an experiment which may mature to something more reliable"),
Sketch(-3,"The component is presented for consideration, and not intended to be promoted without community validation"),
Any(-100,"Any component will match this, but no component should be assigned it");
private final int stability;
private final String description;
Maturity(int stability, String description) {
this.stability = stability;
this.description = description;
}
public int getStability() {
return stability;
}
public String getDescription() {
return this.description;
}
public boolean equalOrGreater(Maturity reference) {
return this.stability >= reference.stability;
}
}

View File

@ -31,5 +31,5 @@ import java.lang.annotation.Target;
public @interface Service {
Class<?> value();
String selector();
Stability maturity() default Stability.Unspecified;
Maturity maturity() default Maturity.Unspecified;
}

View File

@ -1,11 +1,12 @@
package io.nosqlbench.nb.addins.s3.s3urlhandler;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.annotations.Maturity;
import java.net.URLStreamHandler;
import java.net.spi.URLStreamHandlerProvider;
@Service(value = URLStreamHandlerProvider.class, selector = "s3")
@Service(value = URLStreamHandlerProvider.class, selector = "s3", maturity = Maturity.Verified)
public class S3UrlStreamHandlerProvider extends URLStreamHandlerProvider {
private final S3ClientCache clientCache = new S3ClientCache();

View File

@ -1,10 +1,11 @@
package io.nosqlbench.nb.api.markdown;
import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.api.markdown.providers.DocsRootDirectory;
import io.nosqlbench.nb.api.markdown.providers.RawMarkdownSource;
@Service(value = RawMarkdownSource.class, selector = "docs-for-testing")
@Service(value = RawMarkdownSource.class, selector = "docs-for-testing", maturity = Maturity.Stable)
public class DocsForTestingOnly extends DocsRootDirectory {
@Override

View File

@ -17,6 +17,7 @@
package io.nosqlbench.nb.api.spi;
import io.nosqlbench.nb.annotations.Maturity;
import io.nosqlbench.nb.annotations.Service;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -29,22 +30,27 @@ public class SimpleServiceLoader<T> {
private static final Logger logger = LogManager.getLogger("SERVICESAPI");
private final Class<? extends T> serviceType;
private Maturity maturity = Maturity.Unspecified;
public SimpleServiceLoader(Class<? extends T> serviceType) {
public SimpleServiceLoader(Class<? extends T> serviceType, Maturity maturity) {
this.serviceType = serviceType;
this.maturity =maturity;
}
public SimpleServiceLoader setMaturity(Maturity maturity) {
this.maturity = maturity;
return this;
}
public Optional<T> get(String implName) {
LinkedHashMap<String, ServiceLoader.Provider<? extends T>> namedProviders = getNamedProviders();
ServiceLoader.Provider<? extends T> providers = namedProviders.get(implName);
List<Component<? extends T>> namedProviders = getNamedProviders();
ServiceLoader.Provider<? extends T> providers = namedProviders.stream().filter(n -> n.selector.equals(implName)).findFirst().get().provider;
return Optional.ofNullable(providers == null ? null : providers.get());
}
public T getOrThrow(String implName) {
Optional<T> t = get(implName);
return t.orElseThrow(
() -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" +
this.getNamedProviders().keySet().stream().collect(Collectors.joining(",")))
() -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" + getNamedProviders())
);
}
@ -62,12 +68,14 @@ public class SimpleServiceLoader<T> {
* {@link Service} annotation.
* @return A map of providers of T
*/
public synchronized LinkedHashMap<String, ServiceLoader.Provider<? extends T>> getNamedProviders(Pattern... includes) {
public synchronized List<Component<? extends T>> getNamedProviders(String... includes) {
ServiceLoader<? extends T> loader = ServiceLoader.load(serviceType);
List<Pattern> patterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(Pattern.compile(".*"));
List<String> defaultedPatterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(".*");
List<Pattern> qualifiedPatterns = defaultedPatterns.stream().map(p -> {
return Pattern.compile(p);
}).collect(Collectors.toList());
LinkedHashMap<String, ServiceLoader.Provider<? extends T>> providers;
providers = new LinkedHashMap<>();
List<Component<? extends T>> components = new ArrayList<>();
loader.stream().forEach(provider -> {
logger.trace("loading provider: " + provider.type());
@ -79,18 +87,43 @@ public class SimpleServiceLoader<T> {
);
}
Service service = type.getAnnotation(Service.class);
for (Pattern pattern : patterns) {
for (Pattern pattern : qualifiedPatterns) {
if (pattern.matcher(service.selector()).matches()) {
providers.put(service.selector(), provider);
components.add(new Component(service.selector(), provider, service.maturity()));
break;
}
}
});
return providers;
return components;
}
public List<String> getAllSelectors(Pattern... patterns) {
return new ArrayList<>(getNamedProviders(patterns).keySet());
public final static class Component<T> {
public final String selector;
public final ServiceLoader.Provider<? extends T> provider;
public final Maturity maturity;
public Component(String selector, ServiceLoader.Provider<? extends T> provider, Maturity maturity) {
this.selector = selector;
this.provider = provider;
this.maturity = maturity;
}
@Override
public String toString() {
return "Component{" +
selector + " (" + maturity + ")";
}
}
public Map<String,Maturity> getAllSelectors(String... patterns) {
LinkedHashMap<String, Maturity> map = new LinkedHashMap<>();
for (Component<? extends T> namedProvider : getNamedProviders(patterns)) {
map.put(namedProvider.selector,namedProvider.maturity);
}
return map;
}
}

View File

@ -19,6 +19,7 @@ package io.nosqlbench.engine.core.script;
import io.nosqlbench.engine.core.lifecycle.ScenarioResult;
import io.nosqlbench.engine.core.lifecycle.ScenariosResults;
import io.nosqlbench.nb.annotations.Maturity;
import org.apache.commons.compress.utils.IOUtils;
import org.assertj.core.data.Offset;
import org.junit.jupiter.api.BeforeAll;
@ -52,7 +53,7 @@ public class AsyncScriptIntegrationTests {
String scenarioName = "scenario " + scriptname;
System.out.println("=".repeat(29) + " Running ASYNC integration test for: " + scenarioName);
ScenariosExecutor executor = new ScenariosExecutor(AsyncScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1);
Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300");
Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300", Maturity.Any);
s.addScenarioScriptParams(paramsMap);

View File

@ -19,6 +19,7 @@ package io.nosqlbench.engine.core.script;
import io.nosqlbench.engine.core.lifecycle.ScenarioResult;
import io.nosqlbench.engine.core.lifecycle.ScenariosResults;
import io.nosqlbench.nb.annotations.Maturity;
import org.apache.commons.compress.utils.IOUtils;
import org.assertj.core.data.Offset;
import org.junit.jupiter.api.BeforeAll;
@ -48,7 +49,7 @@ public class ScriptIntegrationTests {
String scenarioName = "scenario " + scriptname;
System.out.println("=".repeat(29) + " Running SYNC integration test for: " + scenarioName);
ScenariosExecutor e = new ScenariosExecutor(ScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1);
Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300");
Scenario s = new Scenario(scenarioName, Scenario.Engine.Graalvm,"stdout:300", Maturity.Any);
s.addScenarioScriptParams(paramsMap);
ClassLoader cl = AsyncScriptIntegrationTests.class.getClassLoader();
String script;