diff --git a/docsys/src/main/java/io/nosqlbench/docsys/core/WebObjectLoader.java b/docsys/src/main/java/io/nosqlbench/docsys/core/WebObjectLoader.java
deleted file mode 100644
index b39689ee1..000000000
--- a/docsys/src/main/java/io/nosqlbench/docsys/core/WebObjectLoader.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.nosqlbench.docsys.core;
-
-import io.nosqlbench.docsys.api.WebServiceObject;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ServiceLoader;
-
-public class WebObjectLoader {
- public static List loadWebServiceObjects() {
- List endpoints = new ArrayList<>();
- ServiceLoader loader = ServiceLoader.load(WebServiceObject.class);
- loader.forEach(endpoints::add);
- return endpoints;
- }
-}
diff --git a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java
index c5f4f4544..04f3eff7f 100644
--- a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java
+++ b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocServerStatusEndpoint.java
@@ -14,7 +14,7 @@ import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
-@Service(WebServiceObject.class)
+@Service(value = WebServiceObject.class, selector = "docserver-status")
@Singleton
@Path("_")
public class DocServerStatusEndpoint implements WebServiceObject {
diff --git a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java
index 064472612..eff4dd873 100644
--- a/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java
+++ b/docsys/src/main/java/io/nosqlbench/docsys/endpoints/DocsysMarkdownEndpoint.java
@@ -20,7 +20,7 @@ import java.nio.file.Files;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
-@Service(WebServiceObject.class)
+@Service(value = WebServiceObject.class, selector = "docsys-markdown")
@Singleton
@Path("/services/docs/")
public class DocsysMarkdownEndpoint implements WebServiceObject {
diff --git a/docsys/src/test/java/io/nosqlbench/docsys/core/TestServlet1.java b/docsys/src/test/java/io/nosqlbench/docsys/core/TestServlet1.java
index 61105cea5..7c9040882 100644
--- a/docsys/src/test/java/io/nosqlbench/docsys/core/TestServlet1.java
+++ b/docsys/src/test/java/io/nosqlbench/docsys/core/TestServlet1.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-//@Service(WebServiceObject.class)
+//@Service(value=WebServiceObject.class,selector="test")
@Singleton
@Path("test1")
public class TestServlet1 implements WebServiceObject {
diff --git a/driver-cockroachdb/src/main/java/io/nosqlbench/activitytype/cockroachdb/CockroachActivityType.java b/driver-cockroachdb/src/main/java/io/nosqlbench/activitytype/cockroachdb/CockroachActivityType.java
index 53ceba9d4..340472050 100644
--- a/driver-cockroachdb/src/main/java/io/nosqlbench/activitytype/cockroachdb/CockroachActivityType.java
+++ b/driver-cockroachdb/src/main/java/io/nosqlbench/activitytype/cockroachdb/CockroachActivityType.java
@@ -6,12 +6,8 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "cockroachdb")
public class CockroachActivityType implements ActivityType {
- @Override
- public String getName() {
- return "cockroachdb";
- }
@Override
public ActionDispenser getActionDispenser(CockroachActivity activity) {
diff --git a/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/core/CqlActivityType.java b/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/core/CqlActivityType.java
index 2b5421bd5..7e9b186a1 100644
--- a/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/core/CqlActivityType.java
+++ b/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/core/CqlActivityType.java
@@ -17,13 +17,9 @@ import java.time.Instant;
import java.time.LocalTime;
import java.util.*;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "cql")
public class CqlActivityType implements ActivityType {
- public String getName() {
- return "cql";
- }
-
@Override
public CqlActivity getActivity(ActivityDef activityDef) {
diff --git a/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/filtering/CQLResultFilterType.java b/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/filtering/CQLResultFilterType.java
index 6ab1aee37..88cf4e06a 100644
--- a/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/filtering/CQLResultFilterType.java
+++ b/driver-cql-shaded/src/main/java/io/nosqlbench/activitytype/cql/filtering/CQLResultFilterType.java
@@ -11,14 +11,9 @@ import io.nosqlbench.nb.annotations.Service;
import java.util.function.Predicate;
-@Service(ResultValueFilterType.class)
+@Service(value = ResultValueFilterType.class, selector = "cql")
public class CQLResultFilterType implements ResultValueFilterType {
- @Override
- public String getName() {
- return "cql";
- }
-
@Override
public ResultFilterDispenser getDispenser(String config) {
return new Dispenser(config);
diff --git a/driver-cql-shaded/src/main/java/io/nosqlbench/endpoints/cql/CqlWorkloadGeneratorEndpoint.java b/driver-cql-shaded/src/main/java/io/nosqlbench/endpoints/cql/CqlWorkloadGeneratorEndpoint.java
index a49c6085b..a666daf55 100644
--- a/driver-cql-shaded/src/main/java/io/nosqlbench/endpoints/cql/CqlWorkloadGeneratorEndpoint.java
+++ b/driver-cql-shaded/src/main/java/io/nosqlbench/endpoints/cql/CqlWorkloadGeneratorEndpoint.java
@@ -4,13 +4,15 @@ import io.nosqlbench.generators.cql.lang.CqlWorkloadGen;
import io.nosqlbench.docsys.api.WebServiceObject;
import io.nosqlbench.nb.annotations.Service;
+import javax.inject.Singleton;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-@Service(WebServiceObject.class)
+@Service(value = WebServiceObject.class, selector = "cql-workload-generator")
@Path("/services/cql/")
+@Singleton
public class CqlWorkloadGeneratorEndpoint implements WebServiceObject {
@POST
diff --git a/driver-cqlverify/src/main/java/io/nosqlbench/activitytype/cqlverify/CqlVerifyActivityType.java b/driver-cqlverify/src/main/java/io/nosqlbench/activitytype/cqlverify/CqlVerifyActivityType.java
index 0ae0feeb6..54a707c11 100644
--- a/driver-cqlverify/src/main/java/io/nosqlbench/activitytype/cqlverify/CqlVerifyActivityType.java
+++ b/driver-cqlverify/src/main/java/io/nosqlbench/activitytype/cqlverify/CqlVerifyActivityType.java
@@ -5,14 +5,9 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "cqlverify")
public class CqlVerifyActivityType implements ActivityType {
- @Override
- public String getName() {
- return "cqlverify";
- }
-
@Override
public ActionDispenser getActionDispenser(CqlVerifyActivity activity) {
return new CqlVerifyActionDispenser(activity);
diff --git a/driver-diag/src/main/java/io/nosqlbench/activitytype/diag/DiagActivityType.java b/driver-diag/src/main/java/io/nosqlbench/activitytype/diag/DiagActivityType.java
index 27083fe2f..c03d5395f 100644
--- a/driver-diag/src/main/java/io/nosqlbench/activitytype/diag/DiagActivityType.java
+++ b/driver-diag/src/main/java/io/nosqlbench/activitytype/diag/DiagActivityType.java
@@ -30,16 +30,11 @@ import org.apache.logging.log4j.LogManager;
*
* Diag serves as a basic template for implementing your own activity type.
*/
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "diag")
public class DiagActivityType implements ActivityType {
private static final Logger logger = LogManager.getLogger(DiagActivityType.class);
- @Override
- public String getName() {
- return "diag";
- }
-
@Override
public ActionDispenser getActionDispenser(DiagActivity activity) {
return new DiagActionDispenser(activity);
diff --git a/driver-diag/src/test/java/io/nosqlbench/activitytype/diag/DiagActivityTypeTest.java b/driver-diag/src/test/java/io/nosqlbench/activitytype/diag/DiagActivityTypeTest.java
index 7b4384a15..dc9c20107 100644
--- a/driver-diag/src/test/java/io/nosqlbench/activitytype/diag/DiagActivityTypeTest.java
+++ b/driver-diag/src/test/java/io/nosqlbench/activitytype/diag/DiagActivityTypeTest.java
@@ -25,7 +25,6 @@ public class DiagActivityTypeTest {
@Test
public void testDiagActivity() {
DiagActivityType da = new DiagActivityType();
- da.getName();
ActivityDef ad = ActivityDef.parseActivityDef("driver=diag;");
DiagActivity a = da.getActivity(ad);
a.initActivity();
diff --git a/driver-dsegraph-shaded/src/main/java/com/datastax/ebdrivers/dsegraph/GraphActivityType.java b/driver-dsegraph-shaded/src/main/java/com/datastax/ebdrivers/dsegraph/GraphActivityType.java
index 848e2754d..2364d61ee 100644
--- a/driver-dsegraph-shaded/src/main/java/com/datastax/ebdrivers/dsegraph/GraphActivityType.java
+++ b/driver-dsegraph-shaded/src/main/java/com/datastax/ebdrivers/dsegraph/GraphActivityType.java
@@ -5,14 +5,9 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "dsegraph")
public class GraphActivityType implements ActivityType {
- @Override
- public String getName() {
- return "dsegraph";
- }
-
@Override
public GraphActivity getActivity(ActivityDef activityDef) {
return new GraphActivity(activityDef);
diff --git a/driver-http/src/main/java/io/nosqlbench/activitytype/http/HttpActivityType.java b/driver-http/src/main/java/io/nosqlbench/activitytype/http/HttpActivityType.java
index 6d24956dc..f7722403a 100644
--- a/driver-http/src/main/java/io/nosqlbench/activitytype/http/HttpActivityType.java
+++ b/driver-http/src/main/java/io/nosqlbench/activitytype/http/HttpActivityType.java
@@ -7,16 +7,11 @@ import io.nosqlbench.nb.annotations.Service;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "http")
public class HttpActivityType implements ActivityType {
private static final Logger logger = LogManager.getLogger(HttpActivityType.class);
- @Override
- public String getName() {
- return "http";
- }
-
@Override
public ActionDispenser getActionDispenser(HttpActivity activity) {
if (activity.getParams().getOptionalString("async").isPresent()) {
diff --git a/driver-http/src/test/java/io/nosqlbench/activitytype/http/HttpActivityTypeTest.java b/driver-http/src/test/java/io/nosqlbench/activitytype/http/HttpActivityTypeTest.java
index c4a191fa0..c4bb3b167 100644
--- a/driver-http/src/test/java/io/nosqlbench/activitytype/http/HttpActivityTypeTest.java
+++ b/driver-http/src/test/java/io/nosqlbench/activitytype/http/HttpActivityTypeTest.java
@@ -5,14 +5,10 @@ import io.nosqlbench.engine.api.activityapi.core.ActionDispenser;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
-
public class HttpActivityTypeTest {
@Test
public void testHttpActivity() {
HttpActivityType httpAt = new HttpActivityType();
- String atname = httpAt.getName();
- assertThat(atname.equals("http"));
ActivityDef ad = ActivityDef.parseActivityDef("driver=http; yaml=http-google.yaml; port=80; cycles=1;");
HttpActivity httpActivity = httpAt.getActivity(ad);
diff --git a/driver-jmx/src/main/java/io/nosqlbench/driver/jmx/JMXActivityType.java b/driver-jmx/src/main/java/io/nosqlbench/driver/jmx/JMXActivityType.java
index 5f29622f3..ced843ba5 100644
--- a/driver-jmx/src/main/java/io/nosqlbench/driver/jmx/JMXActivityType.java
+++ b/driver-jmx/src/main/java/io/nosqlbench/driver/jmx/JMXActivityType.java
@@ -5,12 +5,8 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "jmx")
public class JMXActivityType implements ActivityType {
- @Override
- public String getName() {
- return "jmx";
- }
@Override
public JMXActivity getActivity(ActivityDef activityDef) {
diff --git a/driver-kafka/src/main/java/com/datastax/ebdrivers/kafkaproducer/KafkaProducerActivityType.java b/driver-kafka/src/main/java/com/datastax/ebdrivers/kafkaproducer/KafkaProducerActivityType.java
index b7a6a12bc..d3238b704 100644
--- a/driver-kafka/src/main/java/com/datastax/ebdrivers/kafkaproducer/KafkaProducerActivityType.java
+++ b/driver-kafka/src/main/java/com/datastax/ebdrivers/kafkaproducer/KafkaProducerActivityType.java
@@ -6,12 +6,8 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "kafkaproducer")
public class KafkaProducerActivityType implements ActivityType {
- @Override
- public String getName() {
- return "kafkaproducer";
- }
@Override
public KafkaProducerActivity getActivity(ActivityDef activityDef) {
@@ -19,7 +15,7 @@ public class KafkaProducerActivityType implements ActivityType {
- @Override
- public String getName() {
- return "mongodb";
- }
-
@Override
public MongoActivity getActivity(ActivityDef activityDef) {
return new MongoActivity(activityDef);
diff --git a/driver-pulsar/src/main/java/io/nosqlbench/driver/pulsar/PulsarActivityType.java b/driver-pulsar/src/main/java/io/nosqlbench/driver/pulsar/PulsarActivityType.java
index 963f5654e..08d164264 100644
--- a/driver-pulsar/src/main/java/io/nosqlbench/driver/pulsar/PulsarActivityType.java
+++ b/driver-pulsar/src/main/java/io/nosqlbench/driver/pulsar/PulsarActivityType.java
@@ -9,11 +9,6 @@ import io.nosqlbench.nb.annotations.Service;
@Service(value = ActivityType.class, selector = "pulsar")
public class PulsarActivityType implements ActivityType {
- @Override
- public String getName() {
- return "pulsar";
- }
-
@Override
public ActionDispenser getActionDispenser(PulsarActivity activity) {
if (activity.getParams().getOptionalString("async").isPresent()) {
diff --git a/driver-stdout/src/main/java/io/nosqlbench/activitytype/stdout/StdoutActivityType.java b/driver-stdout/src/main/java/io/nosqlbench/activitytype/stdout/StdoutActivityType.java
index 0399bacf2..e1fc86019 100644
--- a/driver-stdout/src/main/java/io/nosqlbench/activitytype/stdout/StdoutActivityType.java
+++ b/driver-stdout/src/main/java/io/nosqlbench/activitytype/stdout/StdoutActivityType.java
@@ -8,14 +8,9 @@ import io.nosqlbench.nb.annotations.Service;
import java.util.Optional;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "stdout")
public class StdoutActivityType implements ActivityType {
- @Override
- public String getName() {
- return "stdout";
- }
-
@Override
public StdoutActivity getActivity(ActivityDef activityDef) {
Optional yaml = activityDef.getParams().getOptionalString("yaml", "workload");
diff --git a/driver-stdout/src/test/java/io/nosqlbench/activitytype/stdout/StdoutActivityTypeTest.java b/driver-stdout/src/test/java/io/nosqlbench/activitytype/stdout/StdoutActivityTypeTest.java
index 53847ca08..99ad701e2 100644
--- a/driver-stdout/src/test/java/io/nosqlbench/activitytype/stdout/StdoutActivityTypeTest.java
+++ b/driver-stdout/src/test/java/io/nosqlbench/activitytype/stdout/StdoutActivityTypeTest.java
@@ -22,8 +22,6 @@ import io.nosqlbench.engine.api.activityapi.core.ActionDispenser;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
-
/**
* Created by sebastianestevez on 5/5/17.
*/
@@ -32,8 +30,6 @@ public class StdoutActivityTypeTest {
@Test
public void testDiagActivity() {
StdoutActivityType stdoutAt = new StdoutActivityType();
- String atname = stdoutAt.getName();
- assertThat(atname.equals("stdout"));
ActivityDef ad = ActivityDef.parseActivityDef("driver=stdout; yaml=stdout-test;");
StdoutActivity stdoutActivity = stdoutAt.getActivity(ad);
ActionDispenser actionDispenser = stdoutAt.getActionDispenser(stdoutActivity);
diff --git a/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpclient/TCPClientActivityType.java b/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpclient/TCPClientActivityType.java
index 67ffbb44d..00eb78723 100644
--- a/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpclient/TCPClientActivityType.java
+++ b/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpclient/TCPClientActivityType.java
@@ -25,14 +25,9 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "tcpclient")
public class TCPClientActivityType implements ActivityType {
- @Override
- public String getName() {
- return "tcpclient";
- }
-
@Override
public TCPClientActivity getActivity(ActivityDef activityDef) {
return new TCPClientActivity(activityDef);
@@ -44,7 +39,7 @@ public class TCPClientActivityType implements ActivityType {
}
private static class Dispenser implements ActionDispenser {
- private StdoutActivity activity;
+ private final StdoutActivity activity;
private Dispenser(StdoutActivity activity) {
this.activity = activity;
diff --git a/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpserver/TCPServerActivityType.java b/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpserver/TCPServerActivityType.java
index 920a1c97c..d204cd843 100644
--- a/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpserver/TCPServerActivityType.java
+++ b/driver-tcp/src/main/java/io/nosqlbench/activitytype/tcpserver/TCPServerActivityType.java
@@ -25,14 +25,9 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "tcpserver")
public class TCPServerActivityType implements ActivityType {
- @Override
- public String getName() {
- return "tcpserver";
- }
-
@Override
public TCPServerActivity getActivity(ActivityDef activityDef) {
return new TCPServerActivity(activityDef);
@@ -44,7 +39,7 @@ public class TCPServerActivityType implements ActivityType {
}
private static class Dispenser implements ActionDispenser {
- private StdoutActivity activity;
+ private final StdoutActivity activity;
private Dispenser(StdoutActivity activity) {
this.activity = activity;
diff --git a/driver-web/src/main/java/io/nosqlbench/driver/webdriver/WebDriverActivityType.java b/driver-web/src/main/java/io/nosqlbench/driver/webdriver/WebDriverActivityType.java
index d875d2d6c..cfbff9344 100644
--- a/driver-web/src/main/java/io/nosqlbench/driver/webdriver/WebDriverActivityType.java
+++ b/driver-web/src/main/java/io/nosqlbench/driver/webdriver/WebDriverActivityType.java
@@ -7,14 +7,9 @@ import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.annotations.Service;
-@Service(ActivityType.class)
+@Service(value = ActivityType.class, selector = "webdriver")
public class WebDriverActivityType implements ActivityType {
- @Override
- public String getName() {
- return "webdriver";
- }
-
@Override
public WebDriverActivity getActivity(ActivityDef activityDef) {
return new WebDriverActivity(activityDef);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java
index b5206936d..08dfb5760 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java
@@ -24,8 +24,7 @@ import io.nosqlbench.engine.api.activityimpl.CoreServices;
import io.nosqlbench.engine.api.activityimpl.SimpleActivity;
import io.nosqlbench.engine.api.activityimpl.action.CoreActionDispenser;
import io.nosqlbench.engine.api.activityimpl.motor.CoreMotorDispenser;
-import io.nosqlbench.engine.api.util.SimpleServiceLoader;
-import io.nosqlbench.nb.api.spi.Named;
+import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
import java.util.Map;
import java.util.Optional;
@@ -38,16 +37,9 @@ import java.util.Optional;
* an action dispenser. Default implementations of input and motor dispensers are provided,
* and by extension, default inputs and motors.
*/
-public interface ActivityType extends Named {
+public interface ActivityType {
- SimpleServiceLoader FINDER = new SimpleServiceLoader<>(ActivityType.class);
- /**
- * Return the short name of this activity type. The fully qualified name of an activity type is
- * this value, prefixed by the package of the implementing class.
- *
- * @return An activity type name, like "diag"
- */
- String getName();
+ SimpleServiceLoader FINDER = new SimpleServiceLoader(ActivityType.class);
/**
* Create an instance of an activity from the activity type.
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/CoreResultValueFilter.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/CoreResultValueFilter.java
index e55266cbf..ef33e6118 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/CoreResultValueFilter.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/CoreResultValueFilter.java
@@ -37,14 +37,9 @@ import java.util.function.Predicate;
* clause. In the example above, the default policy would be "exclude",
* given that the fist clause is "include".
*/
-@Service(ResultValueFilterType.class)
+@Service(value = ResultValueFilterType.class, selector = "core")
public class CoreResultValueFilter implements ResultValueFilterType {
- @Override
- public String getName() {
- return "core";
- }
-
@Override
public ResultFilterDispenser getDispenser(String config) {
return new Dispenser(config);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java
index 7dc634892..b743cedff 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ExperimentalResultFilterType.java
@@ -19,15 +19,14 @@ 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.engine.api.util.SimpleServiceLoader;
-import io.nosqlbench.nb.api.spi.Named;
+import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
import java.util.function.IntPredicate;
-public interface ExperimentalResultFilterType extends Named {
+public interface ExperimentalResultFilterType {
SimpleServiceLoader FINDER =
- new SimpleServiceLoader<>(ExperimentalResultFilterType.class);
+ new SimpleServiceLoader<>(ExperimentalResultFilterType.class);
default IntPredicateDispenser getFilterDispenser(Activity activity) {
SimpleConfig conf = new SimpleConfig(activity, "resultfilter");
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/IncludeCodesTypeExperimental.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/IncludeCodesTypeExperimental.java
index 8734233af..d298c2b47 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/IncludeCodesTypeExperimental.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/IncludeCodesTypeExperimental.java
@@ -29,14 +29,9 @@ import java.util.function.IntPredicate;
* array is used. When the type widens, this will need to use a native
* int trie or something else that is time and space efficient.
*/
-@Service(ExperimentalResultFilterType.class)
+@Service(value = ExperimentalResultFilterType.class, selector = "include")
public class IncludeCodesTypeExperimental implements ExperimentalResultFilterType {
- @Override
- public String getName() {
- return "include";
- }
-
@Override
public IntPredicate getIntPredicate(SimpleConfig conf) {
return new IncludeCodes(conf);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java
index 4f0f2e488..08d902d2e 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/filters/ResultValueFilterType.java
@@ -17,10 +17,9 @@
package io.nosqlbench.engine.api.activityapi.cyclelog.filters;
-import io.nosqlbench.engine.api.util.SimpleServiceLoader;
-import io.nosqlbench.nb.api.spi.Named;
+import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
-public interface ResultValueFilterType extends Named {
+public interface ResultValueFilterType {
SimpleServiceLoader FINDER = new SimpleServiceLoader<>(ResultValueFilterType.class);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/inputs/cyclelog/CycleLogInputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/inputs/cyclelog/CycleLogInputType.java
index dbb5e4d50..6933c012e 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/inputs/cyclelog/CycleLogInputType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/inputs/cyclelog/CycleLogInputType.java
@@ -23,12 +23,8 @@ import io.nosqlbench.engine.api.activityapi.input.InputDispenser;
import io.nosqlbench.engine.api.activityapi.input.InputType;
import io.nosqlbench.nb.annotations.Service;
-@Service(InputType.class)
+@Service(value = InputType.class, selector = "cyclelog")
public class CycleLogInputType implements InputType {
- @Override
- public String getName() {
- return "cyclelog";
- }
@Override
public InputDispenser getInputDispenser(Activity activity) {
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/cyclelog/CycleLogOutputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/cyclelog/CycleLogOutputType.java
index c71fcdbe6..edc1f4134 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/cyclelog/CycleLogOutputType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/cyclelog/CycleLogOutputType.java
@@ -27,14 +27,9 @@ import io.nosqlbench.nb.annotations.Service;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
-@Service(OutputType.class)
+@Service(value = OutputType.class, selector = "cyclelog")
public class CycleLogOutputType implements OutputType {
- @Override
- public String getName() {
- return "cyclelog";
- }
-
@Override
public OutputDispenser getOutputDispenser(Activity activity) {
return new Dispenser(activity);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/logger/LoggingMarkerDispenser.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/logger/LoggingMarkerDispenser.java
index 9846bf278..8124117b0 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/logger/LoggingMarkerDispenser.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/cyclelog/outputs/logger/LoggingMarkerDispenser.java
@@ -24,7 +24,7 @@ import io.nosqlbench.nb.annotations.Service;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
-@Service(OutputDispenser.class)
+@Service(value = OutputDispenser.class, selector = "logging-marker")
public class LoggingMarkerDispenser implements OutputDispenser {
private final static Logger logger = LogManager.getLogger(LoggingMarkerDispenser.class);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java
index 59ccd4423..fbc2b91e0 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/input/InputType.java
@@ -18,13 +18,12 @@
package io.nosqlbench.engine.api.activityapi.input;
import io.nosqlbench.engine.api.activityapi.core.Activity;
-import io.nosqlbench.engine.api.util.SimpleServiceLoader;
-import io.nosqlbench.nb.api.spi.Named;
+import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
-public interface InputType extends Named {
+public interface InputType {
SimpleServiceLoader FINDER =
- new SimpleServiceLoader<>(InputType.class);
+ new SimpleServiceLoader<>(InputType.class);
InputDispenser getInputDispenser(Activity activity);
}
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java
index 04ead50f7..0678bd69d 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/output/OutputType.java
@@ -18,13 +18,12 @@
package io.nosqlbench.engine.api.activityapi.output;
import io.nosqlbench.engine.api.activityapi.core.Activity;
-import io.nosqlbench.engine.api.util.SimpleServiceLoader;
-import io.nosqlbench.nb.api.spi.Named;
+import io.nosqlbench.nb.api.spi.SimpleServiceLoader;
-public interface OutputType extends Named {
+public interface OutputType {
SimpleServiceLoader FINDER =
- new SimpleServiceLoader<>(OutputType.class);
+ new SimpleServiceLoader<>(OutputType.class);
OutputDispenser getOutputDispenser(Activity activity);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/TargetRateInputType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/TargetRateInputType.java
index 0eef8ed4a..90aba3fde 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/TargetRateInputType.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/TargetRateInputType.java
@@ -23,14 +23,9 @@ import io.nosqlbench.engine.api.activityapi.input.InputDispenser;
import io.nosqlbench.engine.api.activityapi.input.InputType;
import io.nosqlbench.nb.annotations.Service;
-@Service(InputType.class)
+@Service(value = InputType.class, selector = "atomicseq")
public class TargetRateInputType implements InputType {
- @Override
- public String getName() {
- return "atomicseq";
- }
-
@Override
public InputDispenser getInputDispenser(Activity activity) {
return new Dispenser(activity);
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/util/SimpleServiceLoader.java b/engine-api/src/main/java/io/nosqlbench/engine/api/util/SimpleServiceLoader.java
deleted file mode 100644
index d4e414d07..000000000
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/util/SimpleServiceLoader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *
- * Copyright 2016 jshook
- * Licensed 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 io.nosqlbench.engine.api.util;
-
-import io.nosqlbench.nb.api.spi.Named;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-public class SimpleServiceLoader {
-
- private static final Logger logger = LogManager.getLogger(SimpleServiceLoader.class);
- private final Class extends T> serviceType;
- private static SimpleServiceLoader instance;
-
- private final Map types = new ConcurrentHashMap<>();
-
- public SimpleServiceLoader(Class extends T> serviceType) {
- this.serviceType = serviceType;
- }
-
- public Optional get(String implName) {
- return Optional.ofNullable(getTypes().get(implName));
- }
-
- public T getOrThrow(String implName) {
- Optional at = Optional.ofNullable(getTypes().get(implName));
- return at.orElseThrow(
- () -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" +
- this.getTypes().keySet().stream().collect(Collectors.joining(",")))
- );
- }
-
- private synchronized Map getTypes() {
- if (types.size()==0) {
- ClassLoader cl = getClass().getClassLoader();
- logger.debug("loading service types for " + serviceType.getSimpleName());
- ServiceLoader extends T> sl = ServiceLoader.load(serviceType);
- try {
- for (T inputType : sl) {
- if (types.get(inputType.getName()) != null) {
- throw new RuntimeException("ActivityType '" + inputType.getName()
- + "' is already defined.");
- }
- types.put(inputType.getName(),inputType);
- }
- } catch (Throwable t) {
- throw new RuntimeException(t);
- }
- }
- logger.debug("Loaded Types:" + types.keySet());
- return types;
- }
-
- public List getAll() {
- List types = new ArrayList<>(getTypes().values());
- types.sort(Comparator.comparing(Named::getName));
- return Collections.unmodifiableList(types);
- }
-
-}
diff --git a/engine-api/src/test/java/io/nosqlbench/TestMetricsRegistry.java b/engine-api/src/test/java/io/nosqlbench/TestMetricsRegistry.java
index 5ec2f44d5..a68ed9f36 100644
--- a/engine-api/src/test/java/io/nosqlbench/TestMetricsRegistry.java
+++ b/engine-api/src/test/java/io/nosqlbench/TestMetricsRegistry.java
@@ -24,10 +24,10 @@ import io.nosqlbench.nb.annotations.Service;
/**
* Provide a local MetricRegistryService for tests
*/
-@Service(MetricRegistryService.class)
+@Service(value = MetricRegistryService.class, selector = "test-registry")
public class TestMetricsRegistry implements MetricRegistryService {
- private MetricRegistry metricRegistry = new MetricRegistry();
+ private final MetricRegistry metricRegistry = new MetricRegistry();
@Override
public MetricRegistry getMetricRegistry() {
diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java
index cea78e67b..4903a2237 100644
--- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java
+++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java
@@ -1,6 +1,6 @@
package io.nosqlbench.engine.cli;
-import io.nosqlbench.docsys.core.DocServerApp;
+import io.nosqlbench.docsys.core.NBWebServerApp;
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityapi.cyclelog.outputs.cyclelog.CycleLogDumperUtility;
import io.nosqlbench.engine.api.activityapi.cyclelog.outputs.cyclelog.CycleLogImporterUtility;
@@ -163,7 +163,7 @@ public class NBCLI {
System.exit(0);
}
if (args.length > 0 && args[0].toLowerCase().matches("docserver|appserver")) {
- DocServerApp.main(Arrays.copyOfRange(args, 1, args.length));
+ NBWebServerApp.main(Arrays.copyOfRange(args, 1, args.length));
System.exit(0);
}
if (args.length > 0 && args[0].toLowerCase().equals(MarkdownExporter.APP_NAME)) {
@@ -194,7 +194,7 @@ public class NBCLI {
}
if (options.wantsActivityTypes()) {
- ActivityType.FINDER.getAll().stream().map(ActivityType::getName).forEach(System.out::println);
+ ActivityType.FINDER.getAllSelectors().forEach(System.out::println);
System.exit(0);
}
@@ -251,12 +251,12 @@ public class NBCLI {
}
if (options.wantsInputTypes()) {
- InputType.FINDER.getAll().stream().map(InputType::getName).forEach(System.out::println);
+ InputType.FINDER.getAllSelectors().forEach(System.out::println);
System.exit(0);
}
if (options.wantsMarkerTypes()) {
- OutputType.FINDER.getAll().stream().map(OutputType::getName).forEach(System.out::println);
+ OutputType.FINDER.getAllSelectors().forEach(System.out::println);
System.exit(0);
}
diff --git a/engine-clients/src/main/java/io/nosqlbench/engine/clients/grafana/annotator/GrafanaMetricsAnnotator.java b/engine-clients/src/main/java/io/nosqlbench/engine/clients/grafana/annotator/GrafanaMetricsAnnotator.java
index aea5af896..05134d91a 100644
--- a/engine-clients/src/main/java/io/nosqlbench/engine/clients/grafana/annotator/GrafanaMetricsAnnotator.java
+++ b/engine-clients/src/main/java/io/nosqlbench/engine/clients/grafana/annotator/GrafanaMetricsAnnotator.java
@@ -103,11 +103,6 @@ public class GrafanaMetricsAnnotator implements Annotator, ConfigAware {
}
- @Override
- public String getName() {
- return "grafana";
- }
-
@Override
public void applyConfig(Map providedConfig) {
ConfigModel configModel = getConfigModel();
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/annotation/Annotators.java b/engine-core/src/main/java/io/nosqlbench/engine/core/annotation/Annotators.java
index 053c0006d..9b664be87 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/annotation/Annotators.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/annotation/Annotators.java
@@ -47,6 +47,7 @@ public class Annotators {
Object typeObj = cmap.remove("type");
String typename = typeObj.toString();
ServiceLoader.Provider annotatorProvider = providers.get(typename);
+
if (annotatorProvider == null) {
throw new RuntimeException("Annotation provider with selector '" + typename + "' was not found.");
}
@@ -98,7 +99,7 @@ public class Annotators {
public static synchronized void recordAnnotation(Annotation annotation) {
for (Annotator annotator : getAnnotators()) {
try {
- logger.trace("calling annotator " + annotator.getName());
+ logger.trace("calling annotator " + annotator.getClass().getAnnotation(Service.class).selector());
annotator.recordAnnotation(annotation);
} catch (Exception e) {
logger.error(e);
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java
index 4be729481..30a9229ff 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ScenarioController.java
@@ -280,14 +280,15 @@ public class ScenarioController {
if (executor == null && createIfMissing) {
String activityTypeName = activityDef.getParams().getOptionalString("driver", "type").orElse(null);
- List knownTypes = ActivityType.FINDER.getAll().stream().map(ActivityType::getName).collect(Collectors.toList());
+
+ List knownTypes = ActivityType.FINDER.getAllSelectors();
// Infer the type from either alias or yaml if possible (exactly one matches)
if (activityTypeName == null) {
List matching = knownTypes.stream().filter(
- n ->
- activityDef.getParams().getOptionalString("alias").orElse("").contains(n)
- || activityDef.getParams().getOptionalString("yaml", "workload").orElse("").contains(n)
+ n ->
+ activityDef.getParams().getOptionalString("alias").orElse("").contains(n)
+ || activityDef.getParams().getOptionalString("yaml", "workload").orElse("").contains(n)
).collect(Collectors.toList());
if (matching.size() == 1) {
activityTypeName = matching.get(0);
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownDocInfo.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownDocInfo.java
index e7083f695..db9e9c644 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownDocInfo.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownDocInfo.java
@@ -1,6 +1,7 @@
package io.nosqlbench.engine.core.metadata;
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
+import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.api.content.Content;
import io.nosqlbench.nb.api.content.NBIO;
import org.apache.logging.log4j.LogManager;
@@ -44,7 +45,8 @@ public class MarkdownDocInfo {
public String forActivityInstance(String s) {
ActivityType activityType = ActivityType.FINDER.getOrThrow(s);
- return forResourceMarkdown(activityType.getName() + ".md", "docs/");
+ return forResourceMarkdown(activityType.getClass().getAnnotation(Service.class)
+ .selector() + ".md", "docs/");
}
}
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/LoggingAnnotator.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/LoggingAnnotator.java
index fa96cc860..1a5a23e1a 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/LoggingAnnotator.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/LoggingAnnotator.java
@@ -31,16 +31,6 @@ public class LoggingAnnotator implements Annotator, ConfigAware {
annotatorLog.log(level, inlineForm);
}
- /**
- * @return The annotated selector of this implementation,
- * ensuring that selector and name stay the same
- */
- @Override
- public String getName() {
- String selector = LoggingAnnotator.class.getAnnotation(Service.class).selector();
- return selector;
- }
-
@Override
public void applyConfig(Map providedConfig) {
ConfigModel configModel = getConfigModel();
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java
index 6c4abb8ae..5a074922e 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java
@@ -21,17 +21,17 @@ import com.codahale.metrics.MetricRegistry;
import io.nosqlbench.engine.api.activityapi.core.MetricRegistryService;
import io.nosqlbench.nb.annotations.Service;
-@Service(MetricRegistryService.class)
+@Service(value = MetricRegistryService.class, selector = "metrics-context")
public class MetricsContext implements MetricRegistryService {
private static MetricsContext instance;
- private MetricReporters metricReporters = MetricReporters.getInstance();
- private MetricRegistry metrics = new NBMetricsRegistry();
+ private final MetricReporters metricReporters = MetricReporters.getInstance();
+ private final MetricRegistry metrics = new NBMetricsRegistry();
public static MetricsContext getInstance() {
synchronized (MetricsContext.class) {
- if (instance==null) {
+ if (instance == null) {
instance = new MetricsContext();
}
}
diff --git a/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlBenchRawMarkdownSource.java b/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlBenchRawMarkdownSource.java
index 0493a92e0..c7be1f6e1 100644
--- a/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlBenchRawMarkdownSource.java
+++ b/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlBenchRawMarkdownSource.java
@@ -1,13 +1,10 @@
package io.nosqlbench.engine.docs;
import io.nosqlbench.nb.annotations.Service;
-import io.nosqlbench.nb.api.content.Content;
import io.nosqlbench.nb.api.markdown.providers.DocsRootDirectory;
import io.nosqlbench.nb.api.markdown.providers.RawMarkdownSource;
-import java.util.List;
-
-@Service(RawMarkdownSource.class)
+@Service(value = RawMarkdownSource.class, selector = "docs-for-eb")
public class NosqlBenchRawMarkdownSource extends DocsRootDirectory {
@Override
diff --git a/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlbenchMarkdownManifest.java b/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlbenchMarkdownManifest.java
index 9bd03fcea..716144c30 100644
--- a/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlbenchMarkdownManifest.java
+++ b/engine-docs/src/main/java/io/nosqlbench/engine/docs/NosqlbenchMarkdownManifest.java
@@ -5,15 +5,15 @@ import io.nosqlbench.docsys.api.DocsBinder;
import io.nosqlbench.docsys.api.DocsysDynamicManifest;
import io.nosqlbench.nb.annotations.Service;
-@Service(DocsysDynamicManifest.class)
+@Service(value = DocsysDynamicManifest.class, selector = "docs-for-eb")
public class NosqlbenchMarkdownManifest implements DocsysDynamicManifest {
@Override
public DocsBinder getDocs() {
return new Docs().namespace("docs-for-eb")
- .addFirstFoundPath(
- "engine-docs/src/main/resources/docs-for-nb/",
- "docs-for-nb/"
- ).setEnabledByDefault(true)
- .asDocsBinder();
+ .addFirstFoundPath(
+ "engine-docs/src/main/resources/docs-for-nb/",
+ "docs-for-nb/"
+ ).setEnabledByDefault(true)
+ .asDocsBinder();
}
}
diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java
index 12358340f..992e1b042 100644
--- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java
+++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java
@@ -24,8 +24,9 @@ import org.apache.logging.log4j.Logger;
import javax.script.ScriptContext;
-@Service(ScriptingPluginInfo.class)
+@Service(value = ScriptingPluginInfo.class, selector = "histologger")
public class HdrHistoLogPluginData implements ScriptingPluginInfo {
+
@Override
public String getDescription() {
return "allows script control of HDR histogram interval logging";
@@ -36,9 +37,4 @@ public class HdrHistoLogPluginData implements ScriptingPluginInfo listing = ws.getWorkspaceListingView("");
if (contains != null) {
listing = listing.stream().filter(i -> i.contains(contains)).collect(Collectors.toList());
@@ -132,7 +132,7 @@ public class WorkspacesEndpoint implements WebServiceObject {
@QueryParam("ls") String ls) {
try {
- if (ls != null && !ls.toLowerCase().equals("false")) {
+ if (ls != null && !ls.equalsIgnoreCase("false")) {
WorkSpace ws = getSvc().getWorkspace(workspace);
List listing = ws.getWorkspaceListingView(filename);
return Response.ok(listing).build();
diff --git a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java
index 8b8aa60b9..dfc4308c0 100644
--- a/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java
+++ b/nb-annotations/src/main/java/io/nosqlbench/nb/annotations/Service.java
@@ -31,5 +31,6 @@ import java.lang.annotation.Target;
public @interface Service {
Class> value();
- String selector() default "";
+ String selector();
+
}
diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/annotations/Annotator.java b/nb-api/src/main/java/io/nosqlbench/nb/api/annotations/Annotator.java
index 2b0d7fe0d..04a16aca0 100644
--- a/nb-api/src/main/java/io/nosqlbench/nb/api/annotations/Annotator.java
+++ b/nb-api/src/main/java/io/nosqlbench/nb/api/annotations/Annotator.java
@@ -1,12 +1,10 @@
package io.nosqlbench.nb.api.annotations;
-import io.nosqlbench.nb.api.spi.Named;
-
/**
* An implementation of this type is responsible for taking annotation details and
* logging them in a useful place.
*/
-public interface Annotator extends Named {
+public interface Annotator {
/**
* Submit an annotation to some type of annotation store, logging or eventing mechanism.
diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java
index 9b78d13d2..e8f0afe0c 100644
--- a/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java
+++ b/nb-api/src/main/java/io/nosqlbench/nb/api/markdown/DocsForTestingOnly.java
@@ -4,7 +4,7 @@ import io.nosqlbench.nb.annotations.Service;
import io.nosqlbench.nb.api.markdown.providers.DocsRootDirectory;
import io.nosqlbench.nb.api.markdown.providers.RawMarkdownSource;
-@Service(RawMarkdownSource.class)
+@Service(value = RawMarkdownSource.class, selector = "docs-for-testing")
public class DocsForTestingOnly extends DocsRootDirectory {
@Override
diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/spi/Named.java b/nb-api/src/main/java/io/nosqlbench/nb/api/spi/Named.java
deleted file mode 100644
index 06592302c..000000000
--- a/nb-api/src/main/java/io/nosqlbench/nb/api/spi/Named.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package io.nosqlbench.nb.api.spi;
-
-public interface Named {
- /**
- * Return the name for this function library implementation.
- *
- * @return Simple lower-case canonical library name
- */
- String getName();
-}
diff --git a/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java b/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java
new file mode 100644
index 000000000..58effcdf6
--- /dev/null
+++ b/nb-api/src/main/java/io/nosqlbench/nb/api/spi/SimpleServiceLoader.java
@@ -0,0 +1,88 @@
+/*
+ *
+ * Copyright 2016 jshook
+ * Licensed 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 io.nosqlbench.nb.api.spi;
+
+import io.nosqlbench.nb.annotations.Service;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class SimpleServiceLoader {
+
+ private static final Logger logger = LogManager.getLogger(SimpleServiceLoader.class);
+ private final Class extends T> serviceType;
+
+ public SimpleServiceLoader(Class extends T> serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ public Optional get(String implName) {
+ LinkedHashMap> namedProviders = getNamedProviders();
+ ServiceLoader.Provider extends T> providers = namedProviders.get(implName);
+ return Optional.ofNullable(providers == null ? null : providers.get());
+ }
+
+ public T getOrThrow(String implName) {
+ Optional t = get(implName);
+ return t.orElseThrow(
+ () -> new RuntimeException(serviceType.getSimpleName() + " '" + implName + "' not found. Available types:" +
+ this.getNamedProviders().keySet().stream().collect(Collectors.joining(",")))
+ );
+ }
+
+ /**
+ * Load the service providers which are annotated with {@link Service} and selector names.
+ *
+ * @param includes If provided, a list of patterns which are used to include named services based on the selector name from the
+ * {@link Service} annotation.
+ * @return A map of providers of T
+ */
+ public synchronized LinkedHashMap> getNamedProviders(Pattern... includes) {
+ ServiceLoader extends T> loader = ServiceLoader.load(serviceType);
+ List patterns = (includes != null && includes.length > 0) ? Arrays.asList(includes) : List.of(Pattern.compile(".*"));
+
+ LinkedHashMap> providers;
+ providers = new LinkedHashMap<>();
+
+ loader.stream().forEach(provider -> {
+ Class extends T> type = provider.type();
+ if (!type.isAnnotationPresent(Service.class)) {
+ throw new RuntimeException(
+ "Annotator services must be annotated with distinct selectors\n" +
+ "such as @Service(Annotator.class,selector=\"myimpl42\")"
+ );
+ }
+ Service service = type.getAnnotation(Service.class);
+ for (Pattern pattern : patterns) {
+ if (pattern.matcher(service.selector()).matches()) {
+ providers.put(service.selector(), provider);
+ break;
+ }
+ }
+ });
+
+ return providers;
+ }
+
+ public List getAllSelectors(Pattern... patterns) {
+ return new ArrayList<>(getNamedProviders(patterns).keySet());
+ }
+}
diff --git a/virtdata-api/src/main/java/io/nosqlbench/virtdata/api/processors/FunctionDocInfoWriter.java b/virtdata-api/src/main/java/io/nosqlbench/virtdata/api/processors/FunctionDocInfoWriter.java
index cdf675552..5b5e2deed 100644
--- a/virtdata-api/src/main/java/io/nosqlbench/virtdata/api/processors/FunctionDocInfoWriter.java
+++ b/virtdata-api/src/main/java/io/nosqlbench/virtdata/api/processors/FunctionDocInfoWriter.java
@@ -17,8 +17,8 @@ import java.util.stream.Collectors;
public class FunctionDocInfoWriter implements FuncEnumerator.Listener {
private final String suffix;
- private Filer filer;
- private Messager messenger;
+ private final Filer filer;
+ private final Messager messenger;
public FunctionDocInfoWriter(Filer filer, Messager messenger, String suffix) {
this.filer = filer;
@@ -100,7 +100,7 @@ public class FunctionDocInfoWriter implements FuncEnumerator.Listener {
ctors.add("add(new $T<$T>() {{$>\n", ArrayList.class, String.class);
for (String s : example) {
Matcher m = Pattern.compile(Matcher.quoteReplacement("$")).matcher(s);
- s=m.replaceAll(m.quoteReplacement("$$"));
+ s = m.replaceAll(Matcher.quoteReplacement("$$"));
ctors.add("add(\"" + s + "\");\n");
}
ctors.add("$<}});\n");
@@ -127,7 +127,8 @@ public class FunctionDocInfoWriter implements FuncEnumerator.Listener {
AnnotationSpec serviceAnnotation = AnnotationSpec.builder(Service.class)
- .addMember("value","$T.class",DocFuncData.class)
+ .addMember("value", "$T.class", DocFuncData.class)
+ .addMember("selector", "$S", doc.getPackageName() + "." + doc.getClassName())
.build();
TypeSpec manifestType = TypeSpec.classBuilder(newClassName)
diff --git a/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataFunctionLibrary.java b/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataFunctionLibrary.java
index 982ad4e9e..034fe5216 100644
--- a/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataFunctionLibrary.java
+++ b/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataFunctionLibrary.java
@@ -1,6 +1,5 @@
package io.nosqlbench.virtdata.core.bindings;
-import io.nosqlbench.nb.api.spi.Named;
import io.nosqlbench.virtdata.lang.ast.Expression;
import io.nosqlbench.virtdata.lang.ast.FunctionCall;
import io.nosqlbench.virtdata.lang.parser.VirtDataDSL;
@@ -12,7 +11,7 @@ import java.util.stream.Collectors;
* A VirtDataFunctionLibrary is simply a way to ask for a set
* of named function objects in a generic way.
*/
-public interface VirtDataFunctionLibrary extends Named {
+public interface VirtDataFunctionLibrary {
/**
* Given a signature for a unary function which takes an input
diff --git a/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataLibraries.java b/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataLibraries.java
index 6b500e4d5..c7063a178 100644
--- a/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataLibraries.java
+++ b/virtdata-api/src/main/java/io/nosqlbench/virtdata/core/bindings/VirtDataLibraries.java
@@ -9,9 +9,9 @@ import java.util.List;
import java.util.Map;
public class VirtDataLibraries implements VirtDataFunctionLibrary {
- private final static Logger logger = LogManager.getLogger(VirtDataLibraries.class);
- private static VirtDataLibraries instance = new VirtDataLibraries();
- private final Map> threadSafeCache = new HashMap<>();
+ private final static Logger logger = LogManager.getLogger(VirtDataLibraries.class);
+ private static final VirtDataLibraries instance = new VirtDataLibraries();
+ private final Map> threadSafeCache = new HashMap<>();
private final VirtDataFunctionResolver resolver = new VirtDataFunctionResolver();
@@ -21,11 +21,6 @@ public class VirtDataLibraries implements VirtDataFunctionLibrary {
private VirtDataLibraries() {
}
- @Override
-
- public String getName() {
- return "ALL";
- }
@Override
public List resolveFunctions(
diff --git a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/VirtDataService.java b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/VirtDataService.java
index f9b034179..8a17db0c8 100644
--- a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/VirtDataService.java
+++ b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/VirtDataService.java
@@ -13,7 +13,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
-@Service(WebServiceObject.class)
+@Service(value = WebServiceObject.class, selector = "virtdata")
@Singleton
@Path("virtdata")
public class VirtDataService implements WebServiceObject {
diff --git a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/docsapp/AutoDocsWebService.java b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/docsapp/AutoDocsWebService.java
index 350f7d7ce..caa358c21 100644
--- a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/docsapp/AutoDocsWebService.java
+++ b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/apps/docsapp/AutoDocsWebService.java
@@ -18,7 +18,7 @@ import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.stream.Collectors;
-@Service(WebServiceObject.class)
+@Service(value = WebServiceObject.class, selector = "autodocs")
@Singleton
@Path("/services/virtdata/functions/")
public class AutoDocsWebService implements WebServiceObject {
diff --git a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/docinfo/VirtdataMarkdownManifest.java b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/docinfo/VirtdataMarkdownManifest.java
index 0eef43ce5..85f75d444 100644
--- a/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/docinfo/VirtdataMarkdownManifest.java
+++ b/virtdata-userlibs/src/main/java/io/nosqlbench/virtdata/userlibs/docinfo/VirtdataMarkdownManifest.java
@@ -5,7 +5,7 @@ import io.nosqlbench.docsys.api.Docs;
import io.nosqlbench.docsys.api.DocsBinder;
import io.nosqlbench.docsys.api.DocsysDynamicManifest;
-@Service(DocsysDynamicManifest.class)
+@Service(value = DocsysDynamicManifest.class, selector = "virtdata-docs")
public class VirtdataMarkdownManifest implements DocsysDynamicManifest {
public DocsBinder getDocs() {