diff --git a/docker-service-api-core/pom.xml b/docker-service-api-core/pom.xml
index 7e0158a..8c7c213 100644
--- a/docker-service-api-core/pom.xml
+++ b/docker-service-api-core/pom.xml
@@ -9,10 +9,20 @@
org.hobbit
docker-service-api-parent
- 1.0.0-SNAPSHOT
+ 1.1.0-SNAPSHOT
+
+ org.aksw.commons
+ aksw-commons-utils
+
+
+
+ org.apache.jena
+ jena-arq
+
+
com.google.guava
guava
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerService.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerService.java
index 2c19b75..feb0ec2 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerService.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerService.java
@@ -17,6 +17,8 @@ public interface DockerService
/**
* The container id of a once started service
*
+ * TODO This is usually NOT the docker Id, but an IP address, a host name, or some other form of handle
+ *
* @return
*/
String getContainerId();
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilder.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilder.java
index ef61367..9655f91 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilder.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilder.java
@@ -1,8 +1,13 @@
package org.hobbit.core.service.docker.api;
-import java.util.Map;
-
/**
+ * Typically,
+ * a docker serviceBuilder internally bundles a DockerServiceFactory with a mutable configuration object.
+ *
+ *
+ * Note, {@link DockerServiceBuilderFactory} provides the mechanism to create new,
+ * possibly preconfigured, configurations.
+ *
* Base implementation for creating docker services.
*
* Calling the .get() method will create a service object whose state is based on the factories current state but independent from it.
@@ -10,41 +15,61 @@
* The factory does not do book keeping of created services.
*
*
+ * Note: Although DockerService builder extends DockerServiceSpec, it should never be used as such.
+ * The reason for this inheritance is simply to make method forwarding easier: We can just reuse
+ * DockerServiceSpecForwarding.
+ *
* @author raven Sep 20, 2017
*
*/
public interface DockerServiceBuilder
- extends ServiceBuilder
+ extends ServiceBuilder, DockerServiceSpecLike>
{
- String getImageName();
- DockerServiceBuilder setImageName(String imageName);
-
-
- /**
- * Get the local environment of the factory.
- *
- *
- * Local means, that it should NOT return e.g. the system environment
- * or anything else that is outside of control of this factory.
- *
- *
- * We use the term local enviroment in order for subclasses to support spring's Environment object,
- * which is at the core of dependency injenction, and it has a proper API
- * for nesting of property sources
- *
- * Under this consideration, the local environment should be the treated as the first property source
- * of an overall spring environment.
- *
- *
- * @return
- */
- Map getLocalEnvironment();
+// String getContainerName();
+// DockerServiceBuilder setContainerName(String containerName);
+//
+// String getImageName();
+// DockerServiceBuilder setImageName(String imageName);
+//
+// Map getLocalEnvironment();
+// DockerServiceBuilder setLocalEnvironment(Map localEnvironment);
- /**
- *
- * @param environment
- * @return
- */
- DockerServiceBuilder setLocalEnvironment(Map environment);
+ // Yield the object that backs the service builder.
+ // May be null.
+ // DockerServiceSpec getSpec();
+//
+// String getContainerName();
+// DockerServiceBuilder setContainerName(String containerName);
+//
+// String getImageName();
+// DockerServiceBuilder setImageName(String imageName);
+//
+//
+// /**
+// * Get the local environment of the factory.
+// *
+// *
+// * Local means, that it should NOT return e.g. the system environment
+// * or anything else that is outside of control of this factory.
+// *
+// *
+// * We use the term local enviroment in order for subclasses to support spring's Environment object,
+// * which is at the core of dependency injenction, and it has a proper API
+// * for nesting of property sources
+// *
+// * Under this consideration, the local environment should be the treated as the first property source
+// * of an overall spring environment.
+// *
+// *
+// * @return
+// */
+// Map getLocalEnvironment();
+//
+// /**
+// *
+// * @param environment
+// * @return
+// */
+// DockerServiceBuilder setLocalEnvironment(Map environment);
}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilderFactory.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilderFactory.java
new file mode 100644
index 0000000..1e54ab2
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceBuilderFactory.java
@@ -0,0 +1,6 @@
+package org.hobbit.core.service.docker.api;
+
+public interface DockerServiceBuilderFactory
+{
+ DockerServiceBuilder newServiceBuilder();
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceFactory.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceFactory.java
index 6ac2e78..ed691ec 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceFactory.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceFactory.java
@@ -2,6 +2,8 @@
import java.util.Map;
+import org.hobbit.core.service.docker.impl.core.DockerServiceSpecImpl;
+
/**
* In contrast to the builder, the service factory only provides a single create method.
*
@@ -11,5 +13,41 @@
public interface DockerServiceFactory
extends AutoCloseable
{
- T create(String imageName, Map env);
+ /**
+ * Create a service object based on a specification
+ *
+ * @param serviceSpec
+ * @return
+ */
+ T create(DockerServiceSpec serviceSpec);
+
+ /**
+ * Method to obtain a new, possibly partially configured, service specification object.
+ *
+ * @return
+ */
+// default DockerServiceSpec newSpec() {
+// return new DockerServiceSpecImpl();
+// }
+
+ // TODO Due to dependence on the serviceSpec object, which might already be implementation dependnent,
+ // this implementation might better fit into an abstract class
+ default T create(String containerName, String imageName, Map env) {
+ //DockerServiceSpec r = ModelFactory.createDefaultModel().createResource().as(DockerServiceSpec.class);
+
+// DockerServiceSpec r = newSpec();
+ DockerServiceSpec r = new DockerServiceSpecImpl();
+
+ r.setContainerName(containerName);
+ r.setImageName(imageName);
+ r.setLocalEnvironment(env);
+
+ T result = create(r);
+ return result;
+ }
+
+ default T create(String imageName, Map env) {
+ T result = create(null, imageName, env);
+ return result;
+ }
}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpec.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpec.java
new file mode 100644
index 0000000..8412f56
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpec.java
@@ -0,0 +1,24 @@
+package org.hobbit.core.service.docker.api;
+
+/**
+ * Simple mutable specification of a docker(-like) service.
+ *
+ * Note, that this is deliberately an interface so that implementations
+ * can choose to use different backing specification objects,
+ * such as JSON or RDF resources.
+ *
+ * @author Claus Stadler, Jan 9, 2019
+ *
+ */
+public interface DockerServiceSpec
+ extends DockerServiceSpecLike
+{
+// String getContainerName();
+// DockerServiceSpec setContainerName(String containerName);
+//
+// String getImageName();
+// DockerServiceSpec setImageName(String imageName);
+//
+// Map getLocalEnvironment();
+// DockerServiceSpec setLocalEnvironment(Map localEnvironment);
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpecLike.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpecLike.java
new file mode 100644
index 0000000..6170d00
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSpecLike.java
@@ -0,0 +1,14 @@
+package org.hobbit.core.service.docker.api;
+
+import java.util.Map;
+
+public interface DockerServiceSpecLike> {
+ String getContainerName();
+ F setContainerName(String containerName);
+
+ String getImageName();
+ F setImageName(String imageName);
+
+ Map getLocalEnvironment();
+ F setLocalEnvironment(Map localEnvironment);
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSystem.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSystem.java
new file mode 100644
index 0000000..8996d1a
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/DockerServiceSystem.java
@@ -0,0 +1,20 @@
+package org.hobbit.core.service.docker.api;
+
+
+/**
+ * A DockerServiceSystem combines both the factory and the builder APIs:
+ * - The builder API creates preconfigured configuration objects that can be modified using the
+ * DockerServiceSpec API. Internal config objects may be accessible by casting the
+ * DockerServiceSpec config object.
+ * - The factory API, which only takes a single service specification, and fills the rest up with
+ * default values based on the factory state. This approach does not give access to internal config objects.
+ *
+ * @author Claus Stadler, Jan 9, 2019
+ *
+ * @param
+ */
+public interface DockerServiceSystem
+ extends DockerServiceFactory, DockerServiceBuilderFactory
+{
+ T findServiceByName(String id);
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/ResourceAware.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/ResourceAware.java
new file mode 100644
index 0000000..761f78d
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/ResourceAware.java
@@ -0,0 +1,13 @@
+package org.hobbit.core.service.docker.api;
+
+/**
+ * Interface for Java classes to expose whether they can make use of Jena's
+ * Resource infrastructure
+ *
+ * @author Claus Stadler, Jan 9, 2019
+ *
+ */
+public interface ResourceAware {
+ boolean isResource();
+
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/SimpleServiceFactory.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/SimpleServiceFactory.java
index ea8ac64..5bb0ba8 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/SimpleServiceFactory.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/api/SimpleServiceFactory.java
@@ -1,17 +1,14 @@
package org.hobbit.core.service.docker.api;
-import java.util.Map;
-
-import com.google.common.util.concurrent.Service;
-
/**
* A simple service factory is configured via an environment
*
* @author raven
*
*/
-public interface SimpleServiceFactory
- extends ServiceBuilder
-{
- Map getEnvironment();
-}
+//Probably can be removed
+//public interface SimpleServiceFactory
+// extends ServiceBuilder
+//{
+// Map getEnvironment();
+//}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/AbstractSimpleServiceFactory.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/AbstractSimpleServiceFactory.java
index 7fda6e4..a514c2d 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/AbstractSimpleServiceFactory.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/AbstractSimpleServiceFactory.java
@@ -1,18 +1,12 @@
package org.hobbit.core.service.docker.impl.core;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.hobbit.core.service.docker.api.SimpleServiceFactory;
-
-import com.google.common.util.concurrent.Service;
-
-public abstract class AbstractSimpleServiceFactory
- implements SimpleServiceFactory
-{
- protected Map environment = new LinkedHashMap<>();
-
- public Map getEnvironment() {
- return environment;
- }
-}
+// Probably can be removed
+//public abstract class AbstractSimpleServiceFactory
+// implements SimpleServiceFactory
+//{
+// protected Map environment = new LinkedHashMap<>();
+//
+// public Map getEnvironment() {
+// return environment;
+// }
+//}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderFactory.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderFactory.java
index 43208a5..1965aee 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderFactory.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderFactory.java
@@ -4,6 +4,7 @@
import org.hobbit.core.service.docker.api.DockerService;
import org.hobbit.core.service.docker.api.DockerServiceBuilder;
+import org.hobbit.core.service.docker.api.DockerServiceFactory;
/**
* A convenience interface which can be used e.g. in dependency injection.
@@ -16,8 +17,6 @@
public interface DockerServiceBuilderFactory>
extends Supplier
{
-
-
/**
* Creates a DockerServiceBuilderFactory from a Supplier.
* A down cast is performed (instead of wrapping) if this supplier is already a DockerServiceBuilderFactory
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderImpl.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderImpl.java
new file mode 100644
index 0000000..13ee766
--- /dev/null
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderImpl.java
@@ -0,0 +1,42 @@
+package org.hobbit.core.service.docker.impl.core;
+
+import java.util.Map;
+
+import org.hobbit.core.service.docker.api.DockerService;
+import org.hobbit.core.service.docker.api.DockerServiceBuilder;
+import org.hobbit.core.service.docker.api.DockerServiceFactory;
+import org.hobbit.core.service.docker.api.DockerServiceSpec;
+import org.hobbit.core.service.docker.api.DockerServiceSpecLike;
+
+/**
+ *
+ *
+ * @author Claus Stadler, Jan 9, 2019
+ *
+ * @param
+ */
+public class DockerServiceBuilderImpl
+ extends DockerServiceSpecLikeForwarding>
+ implements DockerServiceBuilder
+{
+ protected DockerServiceFactory dockerServiceFactory;
+ protected DockerServiceSpec serviceSpec;
+
+
+ public DockerServiceBuilderImpl(DockerServiceFactory dockerServiceFactory, DockerServiceSpec serviceSpec) {
+ super();
+ this.dockerServiceFactory = dockerServiceFactory;
+ this.serviceSpec = serviceSpec;
+ }
+
+ @Override
+ public DockerServiceSpecLike> getDelegate() {
+ return serviceSpec;
+ }
+
+ @Override
+ public T get() {
+ T result = dockerServiceFactory.create(serviceSpec);
+ return result;
+ }
+}
diff --git a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderJsonDelegate.java b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderJsonDelegate.java
index 99a8fb7..fe0124c 100644
--- a/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderJsonDelegate.java
+++ b/docker-service-api-core/src/main/java/org/hobbit/core/service/docker/impl/core/DockerServiceBuilderJsonDelegate.java
@@ -26,6 +26,7 @@
public class DockerServiceBuilderJsonDelegate
implements DockerServiceBuilder//, Cloneable
{
+ public static final String KEY_CONTAINER_NAME = "containerName";
public static final String KEY_IMAGE_NAME = "imageName";
public static final String KEY_ENV = "env";
public static final String KEY_BASE_ENV = "baseEnv";
@@ -46,6 +47,20 @@ public DockerServiceBuilderJsonDelegate(Function delegate, JsonOb
this.config = config;
}
+ @Override
+ public String getContainerName() {
+ String result = config.get(KEY_CONTAINER_NAME).getAsString();
+ return result;
+ }
+
+ @Override
+ public DockerServiceBuilder setContainerName(String containerName) {
+ config.remove(KEY_CONTAINER_NAME);
+ config.addProperty(KEY_CONTAINER_NAME, containerName);
+
+ return this;
+ }
+
@Override
public String getImageName() {
String result = config.get(KEY_IMAGE_NAME).getAsString();
@@ -110,6 +125,7 @@ public T get() {
public static Type mapStringStringType = new TypeToken