diff --git a/cnf/build.bnd b/cnf/build.bnd
index a3f5f020..4090d844 100644
--- a/cnf/build.bnd
+++ b/cnf/build.bnd
@@ -2,7 +2,8 @@
# Gecko EMF OSGi - geckoEMF
# OSGi-Test Support - gecko-osgitest
# DIMC Github-Configuration - gecko-dimc
-# Jacoco Support - gecko-jacoco
+# Jacoco Support - gecko-jacoco
+
-library: \
geckoEMF,\
geckoOSGi-Test,\
@@ -14,7 +15,7 @@
# Needed because we enabled library 'gecko-dimc'
github-project: org.gecko.playground
-base-version: 1.0.0.SNAPSHOT
+base-version: 1.0.0
# Maven Central Group-Id
-groupid: org.gecko.playground
diff --git a/org.gecko.playground.config/bnd.bnd b/org.gecko.playground.config/bnd.bnd
index 73310f38..af729825 100644
--- a/org.gecko.playground.config/bnd.bnd
+++ b/org.gecko.playground.config/bnd.bnd
@@ -1,4 +1,4 @@
-Bundle-Name: Runtime Configuration
+Bundle-Name: Playground Runtime Configuration
Bundle-Version: 1.0.0.SNAPSHOT
-includeresource: \
diff --git a/org.gecko.playground.ds.simple/.classpath b/org.gecko.playground.ds.simple/.classpath
new file mode 100644
index 00000000..a3296b89
--- /dev/null
+++ b/org.gecko.playground.ds.simple/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/org.gecko.playground.ds.simple/.gitignore b/org.gecko.playground.ds.simple/.gitignore
new file mode 100644
index 00000000..ae3c1726
--- /dev/null
+++ b/org.gecko.playground.ds.simple/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/org.gecko.playground.ds.simple/.project b/org.gecko.playground.ds.simple/.project
new file mode 100644
index 00000000..7d7061f9
--- /dev/null
+++ b/org.gecko.playground.ds.simple/.project
@@ -0,0 +1,23 @@
+
+
+ org.gecko.playground.ds.simple
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ bndtools.core.bndbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ bndtools.core.bndnature
+
+
diff --git a/org.gecko.playground.ds.simple/.settings/org.eclipse.core.resources.prefs b/org.gecko.playground.ds.simple/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000..9c756685
--- /dev/null
+++ b/org.gecko.playground.ds.simple/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
+encoding/bnd.bnd=UTF-8
diff --git a/org.gecko.playground.ds.simple/.settings/org.eclipse.jdt.core.prefs b/org.gecko.playground.ds.simple/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..8c9943d5
--- /dev/null
+++ b/org.gecko.playground.ds.simple/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/org.gecko.playground.ds.simple/bnd.bnd b/org.gecko.playground.ds.simple/bnd.bnd
new file mode 100644
index 00000000..e69de29b
diff --git a/org.gecko.playground.ds.simple/hello-component.bndrun b/org.gecko.playground.ds.simple/hello-component.bndrun
new file mode 100644
index 00000000..b01a35db
--- /dev/null
+++ b/org.gecko.playground.ds.simple/hello-component.bndrun
@@ -0,0 +1,15 @@
+-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]'
+-runee: JavaSE-17
+-runrequires: \
+ bnd.identity;id='org.gecko.playground.ds.simple',\
+ bnd.identity;id='org.apache.felix.gogo.command',\
+ bnd.identity;id='org.apache.felix.gogo.shell'
+-runbundles: \
+ org.apache.felix.scr;version='[2.2.6,2.2.7)',\
+ org.gecko.playground.ds.simple;version=snapshot,\
+ org.osgi.service.component;version='[1.5.1,1.5.2)',\
+ org.osgi.util.function;version='[1.2.0,1.2.1)',\
+ org.osgi.util.promise;version='[1.3.0,1.3.1)',\
+ org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
+ org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
+ org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)'
\ No newline at end of file
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/ConsoleLog.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/ConsoleLog.java
new file mode 100644
index 00000000..7d7481f9
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/ConsoleLog.java
@@ -0,0 +1,18 @@
+package org.gecko.playground.ds.simple;
+
+import org.gecko.playground.ds.simple.logging.Log;
+import org.osgi.service.component.annotations.Component;
+
+@Component
+public class ConsoleLog implements Log {
+
+ public ConsoleLog () {
+ System.out.println("ConsoleLog created");
+ }
+
+ @Override
+ public void logMessage(String message) {
+ System.out.println("LOG : " + message);
+ }
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/HelloComponent.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/HelloComponent.java
new file mode 100644
index 00000000..8bc99513
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/HelloComponent.java
@@ -0,0 +1,12 @@
+package org.gecko.playground.ds.simple;
+
+import org.osgi.service.component.annotations.Component;
+
+@Component
+public class HelloComponent {
+
+ public HelloComponent () {
+ System.out.println("HelloComponent created");
+ }
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/Log.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/Log.java
new file mode 100644
index 00000000..918865e0
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/Log.java
@@ -0,0 +1,6 @@
+package org.gecko.playground.ds.simple.logging;
+
+public interface Log {
+
+ void logMessage(String message);
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/package-info.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/package-info.java
new file mode 100644
index 00000000..3d5c2c0d
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/logging/package-info.java
@@ -0,0 +1,3 @@
+@org.osgi.annotation.bundle.Export
+@org.osgi.annotation.versioning.Version("1.0.0")
+package org.gecko.playground.ds.simple.logging;
\ No newline at end of file
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/AnotherLog.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/AnotherLog.java
new file mode 100644
index 00000000..2cffff70
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/AnotherLog.java
@@ -0,0 +1,15 @@
+package org.gecko.playground.ds.simple.properties;
+
+import org.gecko.playground.ds.simple.logging.Log;
+import org.osgi.service.component.annotations.Component;
+
+//@Component(property = "fizz=buzz")
+@MyServiceProp(foo = "bar")
+public class AnotherLog implements Log {
+
+ @Override
+ public void logMessage(String message) {
+ System.out.println("ANOTHER LOG : " + message);
+ }
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/MyServiceProp.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/MyServiceProp.java
new file mode 100644
index 00000000..ff931a6f
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/properties/MyServiceProp.java
@@ -0,0 +1,17 @@
+package org.gecko.playground.ds.simple.properties;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.osgi.service.component.annotations.ComponentPropertyType;
+
+@ComponentPropertyType
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.TYPE)
+public @interface MyServiceProp {
+
+ String foo();
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/references/ReferencedComponent.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/references/ReferencedComponent.java
new file mode 100644
index 00000000..098ba0e0
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/references/ReferencedComponent.java
@@ -0,0 +1,23 @@
+package org.gecko.playground.ds.simple.references;
+
+import org.gecko.playground.ds.simple.logging.Log;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+//@Component
+public class ReferencedComponent {
+
+ public ReferencedComponent () {
+ System.out.println("ReferencedComponent created");
+ }
+
+ @Reference
+ void setLog(Log log) {
+ System.out.println("set Log " + log.getClass().getName());
+ }
+
+ void unsetLog(Log log) {
+ System.out.println("set Log " + log.getClass().getName());
+ }
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService.java
new file mode 100644
index 00000000..99718177
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService.java
@@ -0,0 +1,5 @@
+package org.gecko.playground.ds.simple.services;
+
+public interface MyService {
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService1.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService1.java
new file mode 100644
index 00000000..6e9d9bd6
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService1.java
@@ -0,0 +1,5 @@
+package org.gecko.playground.ds.simple.services;
+
+public interface MyService1 {
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService2.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService2.java
new file mode 100644
index 00000000..dd91f710
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyService2.java
@@ -0,0 +1,5 @@
+package org.gecko.playground.ds.simple.services;
+
+public interface MyService2 {
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyServiceImpl.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyServiceImpl.java
new file mode 100644
index 00000000..191f2457
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/MyServiceImpl.java
@@ -0,0 +1,10 @@
+package org.gecko.playground.ds.simple.services;
+
+import org.osgi.service.component.annotations.Component;
+
+//@Component(service = MyService.class)
+//@Component(service = {MyService1.class, MyService2.class})
+//@Component(service = {})
+public class MyServiceImpl implements MyService, MyService1, MyService2 {
+
+}
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/package-info.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/package-info.java
new file mode 100644
index 00000000..682efb6b
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/services/package-info.java
@@ -0,0 +1 @@
+package org.gecko.playground.ds.simple.services;
\ No newline at end of file
diff --git a/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/shell/HelloCommand.java b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/shell/HelloCommand.java
new file mode 100644
index 00000000..d4d7cd02
--- /dev/null
+++ b/org.gecko.playground.ds.simple/src/org/gecko/playground/ds/simple/shell/HelloCommand.java
@@ -0,0 +1,19 @@
+package org.gecko.playground.ds.simple.shell;
+
+import org.osgi.service.component.annotations.Component;
+
+//@Component (service = Object.class ,
+// property = { "osgi.command.scope=hello",
+// "osgi.command.function=sagHallo",
+// "osgi.command.function=sayHello"})
+public class HelloCommand {
+
+ public void sayHello () {
+ System.out.println("I wanted to say Hello!");
+ }
+
+// public void sagHallo () {
+// System.out.println("Ich wollte nur Hallo sagen!");
+// }
+
+}
\ No newline at end of file
diff --git a/org.gecko.playground.ds/config/config.json b/org.gecko.playground.ds/config/config.json
index 90ca4c5e..f2b68e43 100644
--- a/org.gecko.playground.ds/config/config.json
+++ b/org.gecko.playground.ds/config/config.json
@@ -11,6 +11,6 @@
{
"name": "Happy",
"year": 2010,
- "description": "I wanna be happy"
+ "description": "I wanna be shappy"
}
}
\ No newline at end of file
diff --git a/org.gecko.playground.ds/configurator.config.bnd b/org.gecko.playground.ds/configurator.config.bnd
index 9385296f..4ed66740 100644
--- a/org.gecko.playground.ds/configurator.config.bnd
+++ b/org.gecko.playground.ds/configurator.config.bnd
@@ -1,4 +1,6 @@
-includeresource: \
OSGI-INF/configurator/=config/
+
+-resourceonly: true
Require-Capability: osgi.extender;filter:='(osgi.extender=osgi.configurator)'
\ No newline at end of file
diff --git a/org.gecko.playground.ds/factory.bnd b/org.gecko.playground.ds/factory.bnd
index 36be3a9e..950f9298 100644
--- a/org.gecko.playground.ds/factory.bnd
+++ b/org.gecko.playground.ds/factory.bnd
@@ -1,3 +1,4 @@
-privatepackage: \
org.gecko.playground.ds.factory,\
- org.gecko.playground.ds.factory.cmd
\ No newline at end of file
+ org.gecko.playground.ds.factory.cmd
+Export-Package: org.gecko.playground.ds.factory.api
\ No newline at end of file
diff --git a/org.gecko.playground.ds/factory.garden.bnd b/org.gecko.playground.ds/factory.garden.bnd
new file mode 100644
index 00000000..91244087
--- /dev/null
+++ b/org.gecko.playground.ds/factory.garden.bnd
@@ -0,0 +1 @@
+-privatepackage: org.gecko.playground.ds.factory.garden
\ No newline at end of file
diff --git a/org.gecko.playground.ds/factory.home.bnd b/org.gecko.playground.ds/factory.home.bnd
new file mode 100644
index 00000000..f73900a3
--- /dev/null
+++ b/org.gecko.playground.ds/factory.home.bnd
@@ -0,0 +1 @@
+-privatepackage: org.gecko.playground.ds.factory.home
\ No newline at end of file
diff --git a/org.gecko.playground.ds/launch_config.bndrun b/org.gecko.playground.ds/launch_config.bndrun
index 75ffde54..6bbf010c 100644
--- a/org.gecko.playground.ds/launch_config.bndrun
+++ b/org.gecko.playground.ds/launch_config.bndrun
@@ -26,4 +26,10 @@
-runproperties: \
osgi.console.enable.builtin=false,\
osgi.console=
--runblacklist: bnd.identity;id='org.osgi.service.cm'
\ No newline at end of file
+-runblacklist: \
+ bnd.identity;id='org.osgi.service.cm',\
+ bnd.identity;id='org.gecko.playground.ds.factory',\
+ bnd.identity;id='org.gecko.playground.ds.greedy',\
+ bnd.identity;id='org.gecko.playground.ds.greedy.very',\
+ bnd.identity;id='org.gecko.playground.ds.prototype',\
+ bnd.identity;id='org.gecko.playground.ds.simple'
\ No newline at end of file
diff --git a/org.gecko.playground.ds/launch_factory.bndrun b/org.gecko.playground.ds/launch_factory.bndrun
index 09dbcc68..aee365f3 100644
--- a/org.gecko.playground.ds/launch_factory.bndrun
+++ b/org.gecko.playground.ds/launch_factory.bndrun
@@ -4,7 +4,9 @@
-runrequires: \
bnd.identity;id='org.apache.felix.gogo.command',\
bnd.identity;id='org.apache.felix.gogo.shell',\
- bnd.identity;id='org.gecko.playground.ds.factory'
+ bnd.identity;id='org.gecko.playground.ds.factory',\
+ bnd.identity;id='org.gecko.playground.ds.factory.garden',\
+ bnd.identity;id='org.gecko.playground.ds.factory.home'
-runbundles: \
org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
@@ -13,7 +15,9 @@
org.apache.felix.scr;version='[2.2.6,2.2.7)',\
org.osgi.service.component;version='[1.5.1,1.5.2)',\
org.osgi.util.function;version='[1.2.0,1.2.1)',\
- org.osgi.util.promise;version='[1.3.0,1.3.1)'
+ org.osgi.util.promise;version='[1.3.0,1.3.1)',\
+ org.gecko.playground.ds.factory.garden;version=snapshot,\
+ org.gecko.playground.ds.factory.home;version=snapshot
-runproperties: \
osgi.console.enable.builtin=false,\
diff --git a/org.gecko.playground.ds/launch_greedy.bndrun b/org.gecko.playground.ds/launch_greedy.bndrun
index 8183ca5c..d83f7c6f 100644
--- a/org.gecko.playground.ds/launch_greedy.bndrun
+++ b/org.gecko.playground.ds/launch_greedy.bndrun
@@ -17,7 +17,7 @@
org.osgi.util.function;version='[1.2.0,1.2.1)',\
org.osgi.util.promise;version='[1.3.0,1.3.1)'
- -runproperties: \
+-runproperties: \
osgi.console.enable.builtin=false,\
osgi.console=
-runblacklist: bnd.identity;id='org.osgi.service.cm'
\ No newline at end of file
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/config/ConfigComponent.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/config/ConfigComponent.java
index 2bbc316f..cd3cded6 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/config/ConfigComponent.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/config/ConfigComponent.java
@@ -17,11 +17,6 @@
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(name = "MyFancyConfig", configurationPolicy = ConfigurationPolicy.REQUIRE)
public class ConfigComponent {
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/config/MyFancyConfig.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/config/MyFancyConfig.java
index e50e06f9..db605e12 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/config/MyFancyConfig.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/config/MyFancyConfig.java
@@ -11,11 +11,6 @@
*/
package org.gecko.playground.ds.config;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
public @interface MyFancyConfig {
String name();
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandlerService.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandlerService.java
index 392426ce..6b61121e 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandlerService.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandlerService.java
@@ -16,6 +16,8 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.gecko.playground.ds.factory.api.Device;
+import org.gecko.playground.ds.factory.api.DeviceHandler;
import org.osgi.service.component.ComponentFactory;
import org.osgi.service.component.ComponentInstance;
import org.osgi.service.component.annotations.Component;
@@ -23,11 +25,6 @@
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(immediate = true)
public class DeviceHandlerService implements DeviceHandler {
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/Device.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/Device.java
similarity index 85%
rename from org.gecko.playground.ds/src/org/gecko/playground/ds/factory/Device.java
rename to org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/Device.java
index d8fe5798..17536443 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/Device.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/Device.java
@@ -9,13 +9,8 @@
* Contributors:
* Data In Motion - initial API and implementation
*/
-package org.gecko.playground.ds.factory;
+package org.gecko.playground.ds.factory.api;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
public interface Device {
String getType();
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandler.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/DeviceHandler.java
similarity index 85%
rename from org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandler.java
rename to org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/DeviceHandler.java
index 9a852362..8fe1e4e2 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/DeviceHandler.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/DeviceHandler.java
@@ -9,13 +9,8 @@
* Contributors:
* Data In Motion - initial API and implementation
*/
-package org.gecko.playground.ds.factory;
+package org.gecko.playground.ds.factory.api;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
public interface DeviceHandler {
Device createDevice(String type, String name);
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/package-info.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/package-info.java
new file mode 100644
index 00000000..83ba83d9
--- /dev/null
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/api/package-info.java
@@ -0,0 +1,2 @@
+@org.osgi.annotation.versioning.Version("1.0.0")
+package org.gecko.playground.ds.factory.api;
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/cmd/WorkmodeCommands.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/cmd/WorkmodeCommands.java
index acd839eb..f974a18b 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/cmd/WorkmodeCommands.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/cmd/WorkmodeCommands.java
@@ -1,7 +1,18 @@
+/**
+ * Copyright (c) 2012 - 2022 Data In Motion and others.
+ * All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the terms of the
+ * Eclipse Public License v2.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ * Data In Motion - initial API and implementation
+ */
package org.gecko.playground.ds.factory.cmd;
-import org.gecko.playground.ds.factory.Device;
-import org.gecko.playground.ds.factory.DeviceHandler;
+import org.gecko.playground.ds.factory.api.Device;
+import org.gecko.playground.ds.factory.api.DeviceHandler;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/GardenDeviceFactory.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/GardenDeviceFactory.java
similarity index 95%
rename from org.gecko.playground.ds/src/org/gecko/playground/ds/factory/GardenDeviceFactory.java
rename to org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/GardenDeviceFactory.java
index 261359f4..3bca9f5f 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/GardenDeviceFactory.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/GardenDeviceFactory.java
@@ -9,19 +9,15 @@
* Contributors:
* Data In Motion - initial API and implementation
*/
-package org.gecko.playground.ds.factory;
+package org.gecko.playground.ds.factory.garden;
import java.util.Map;
+import org.gecko.playground.ds.factory.api.Device;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(factory = "GARDEN", service = Device.class, property = "type=GARDEN")
public class GardenDeviceFactory implements Device {
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/package-info.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/package-info.java
new file mode 100644
index 00000000..7354a3c5
--- /dev/null
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/garden/package-info.java
@@ -0,0 +1 @@
+package org.gecko.playground.ds.factory.garden;
\ No newline at end of file
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/HomeDeviceFactory.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/HomeDeviceFactory.java
similarity index 95%
rename from org.gecko.playground.ds/src/org/gecko/playground/ds/factory/HomeDeviceFactory.java
rename to org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/HomeDeviceFactory.java
index 6a23999a..1cfaf487 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/HomeDeviceFactory.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/HomeDeviceFactory.java
@@ -9,19 +9,15 @@
* Contributors:
* Data In Motion - initial API and implementation
*/
-package org.gecko.playground.ds.factory;
+package org.gecko.playground.ds.factory.home;
import java.util.Map;
+import org.gecko.playground.ds.factory.api.Device;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(factory = "HOME", service = Device.class, property = "type=HOME")
public class HomeDeviceFactory implements Device {
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/package-info.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/package-info.java
new file mode 100644
index 00000000..41f25124
--- /dev/null
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/factory/home/package-info.java
@@ -0,0 +1 @@
+package org.gecko.playground.ds.factory.home;
\ No newline at end of file
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/GreedyConsumer.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/GreedyConsumer.java
index 8db7e835..7807fc64 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/GreedyConsumer.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/GreedyConsumer.java
@@ -19,11 +19,6 @@
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component
public class GreedyConsumer {
@@ -38,21 +33,21 @@ public void deactivate() {
}
// @Reference
-// @Reference(policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
- @Reference(policyOption = ReferencePolicyOption.GREEDY)
+ @Reference(policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
+// @Reference(policyOption = ReferencePolicyOption.GREEDY)
public void setImportant(Important i) {
String importance = i.very() ? "VERY" : "less";
- System.out.println("Set " + importance + " service; important: " + i.important() + ", very: " + i.very() + " from " + i);
+ System.out.println("Set " + importance + " important service: " + i.important() + ", very: " + i.very() + " from " + i);
}
public void modifiedImportant(Important i) {
String importance = i.very() ? "VERY" : "less";
- System.out.println("Modified " + importance + " service; important: " + i.important() + ", very: " + i.very() + " from " + i);
+ System.out.println("Modified " + importance + " important service: " + i.important() + ", very: " + i.very() + " from " + i);
}
public void unsetImportant(Important i) {
String importance = i.very() ? "VERY" : "less";
- System.out.println("Unset " + importance + " service; important: " + i.important() + ", very: " + i.very() + " from " + i);
+ System.out.println("Unset " + importance + " important service: " + i.important() + ", very: " + i.very() + " from " + i);
}
}
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/Important.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/Important.java
index 198ed167..8da09d82 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/Important.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/Important.java
@@ -11,11 +11,6 @@
*/
package org.gecko.playground.ds.greedy;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
public interface Important {
boolean important();
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/ImportantService.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/ImportantService.java
index 0fe71b31..6b468bcf 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/ImportantService.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/ImportantService.java
@@ -13,11 +13,6 @@
import org.osgi.service.component.annotations.Component;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(name="IS")
public class ImportantService implements Important{
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/very/VeryImportantService.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/very/VeryImportantService.java
index 512c9085..7057f402 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/very/VeryImportantService.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/greedy/very/VeryImportantService.java
@@ -15,11 +15,6 @@
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component(name="VIS", property = Constants.SERVICE_RANKING + ":Integer=10")
public class VeryImportantService implements Important{
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/Counter.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/Counter.java
index 004fc73a..6fb2e8e2 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/Counter.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/Counter.java
@@ -11,11 +11,6 @@
*/
package org.gecko.playground.ds.prototype;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
public interface Counter {
int getCurrentCount();
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent1.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent1.java
index 6cba3cce..66cb2734 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent1.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent1.java
@@ -11,15 +11,13 @@
*/
package org.gecko.playground.ds.prototype;
+import java.util.Objects;
+
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component
public class CounterComponent1 {
@@ -28,10 +26,19 @@ public class CounterComponent1 {
@Activate
public void activate() {
+ if (Objects.isNull(counter)) {
+ System.out.println("Counter 1: No counter available");
+ return;
+ }
for (int i = 0; i < 3; i++) {
- System.out.println("Counter 1 " + counter.getCurrentCount() + " with instance " + counter.toString());
+ System.out.println("Counter 1: " + counter.getCurrentCount() + " with instance " + counter.toString());
}
}
+
+ @Deactivate
+ public void deactivate() {
+ System.out.println("------ Deactivate Counter 1 ------");
+ }
}
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent2.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent2.java
index 853adf64..f875a5f1 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent2.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterComponent2.java
@@ -11,15 +11,14 @@
*/
package org.gecko.playground.ds.prototype;
+import java.util.Objects;
+
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceScope;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
@Component
public class CounterComponent2 {
@@ -30,9 +29,18 @@ public class CounterComponent2 {
@Activate
public void activate() {
+ if (Objects.isNull(counter)) {
+ System.out.println("Counter 2: No counter available");
+ return;
+ }
for (int i = 0; i < 3; i++) {
- System.out.println("Counter 2 " + counter.getCurrentCount() + " with instance " + counter.toString());
+ System.out.println("Counter 2: " + counter.getCurrentCount() + " with instance " + counter.toString());
}
}
+
+ @Deactivate
+ public void deactivate() {
+ System.out.println("------ Deactivate Counter 2 ------");
+ }
}
diff --git a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/ProtoypeComponent.java b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterService.java
similarity index 89%
rename from org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/ProtoypeComponent.java
rename to org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterService.java
index 358984fb..e96a6dc8 100644
--- a/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/ProtoypeComponent.java
+++ b/org.gecko.playground.ds/src/org/gecko/playground/ds/prototype/CounterService.java
@@ -16,14 +16,9 @@
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ServiceScope;
-/**
- *
- * @author mark
- * @since 29.04.2022
- */
//@Component(scope=ServiceScope.PROTOTYPE)
@Component(scope=ServiceScope.SINGLETON)
-public class ProtoypeComponent implements Counter{
+public class CounterService implements Counter{
private final AtomicInteger counter = new AtomicInteger();
diff --git a/org.gecko.playground.e4.rcp/launch_base.bndrun b/org.gecko.playground.e4.rcp/launch_base.bndrun
index be77acd8..c8bbcc84 100644
--- a/org.gecko.playground.e4.rcp/launch_base.bndrun
+++ b/org.gecko.playground.e4.rcp/launch_base.bndrun
@@ -145,12 +145,8 @@
org.eclipse.parsson.jakarta.json;version='[1.1.1,1.1.2)',\
com.google.guava;version='[31.1.0,31.1.1)',\
com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\
- org.gecko.emf.pushstreams;version='[1.0.15,1.0.16)',\
org.gecko.emf.repository.api;version='[9.2.2,9.2.3)',\
org.gecko.playground.mongo;version=snapshot,\
- org.gecko.util.common;version='[2.0.0,2.0.1)',\
- org.gecko.util.pushstream;version='[6.0.0,6.0.1)',\
- org.osgi.util.pushstream;version='[1.0.1,1.0.2)',\
org.gecko.emf.collections;version='[2.1.1,2.1.2)',\
org.gecko.emf.mongo.api;version='[6.0.0,6.0.1)',\
org.gecko.emf.mongo.collection;version='[6.0.0,6.0.1)',\
@@ -166,4 +162,6 @@
org.gecko.emf.search;version='[1.1.0,1.1.1)',\
org.gecko.search;version='[1.1.0,1.1.1)',\
org.gecko.search.document;version='[1.1.0,1.1.1)',\
- org.gecko.search.util;version='[1.1.0,1.1.1)'
\ No newline at end of file
+ org.gecko.search.util;version='[1.1.0,1.1.1)',\
+ org.gecko.emf.pushstreams;version='[1.1.1,1.1.2)'
+-runblacklist: bnd.identity;id='org.jsr-305';version:Version='3.0.2'
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.api/.classpath b/org.gecko.playground.exchange.api/.classpath
new file mode 100644
index 00000000..bbfbdbe4
--- /dev/null
+++ b/org.gecko.playground.exchange.api/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/org.gecko.playground.exchange.api/.project b/org.gecko.playground.exchange.api/.project
new file mode 100644
index 00000000..58168fa2
--- /dev/null
+++ b/org.gecko.playground.exchange.api/.project
@@ -0,0 +1,23 @@
+
+
+ org.gecko.playground.exchange.api
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ bndtools.core.bndbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ bndtools.core.bndnature
+
+
diff --git a/org.gecko.playground.exchange.api/.settings/org.eclipse.jdt.core.prefs b/org.gecko.playground.exchange.api/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..8c9943d5
--- /dev/null
+++ b/org.gecko.playground.exchange.api/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/Exchange.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/Exchange.class
new file mode 100644
index 00000000..5aa14d09
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/Exchange.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/ExchangeListener.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/ExchangeListener.class
new file mode 100644
index 00000000..0b1e202a
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/ExchangeListener.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/FillListener.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/FillListener.class
new file mode 100644
index 00000000..e4e411d3
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/FillListener.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/package-info.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/package-info.class
new file mode 100644
index 00000000..3b0b4ddf
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/exchange/api/package-info.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Fill.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Fill.class
new file mode 100644
index 00000000..6e0aa514
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Fill.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Order.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Order.class
new file mode 100644
index 00000000..6e391684
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Order.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Side.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Side.class
new file mode 100644
index 00000000..2147f12c
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/Side.class differ
diff --git a/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/package-info.class b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/package-info.class
new file mode 100644
index 00000000..6cbdfddf
Binary files /dev/null and b/org.gecko.playground.exchange.api/bin/org/gecko/playground/model/orders/package-info.class differ
diff --git a/org.gecko.playground.exchange.api/bnd.bnd b/org.gecko.playground.exchange.api/bnd.bnd
new file mode 100644
index 00000000..94c8f7ec
--- /dev/null
+++ b/org.gecko.playground.exchange.api/bnd.bnd
@@ -0,0 +1,4 @@
+-buildpath: \
+ org.osgi.service.log,\
+ org.osgi.framework,\
+ org.osgi.service.component
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/Exchange.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/Exchange.java
new file mode 100644
index 00000000..de584f8c
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/Exchange.java
@@ -0,0 +1,18 @@
+package org.gecko.playground.exchange.api;
+
+import java.util.Collection;
+import java.util.UUID;
+
+import org.gecko.playground.model.orders.Order;
+import org.osgi.annotation.versioning.ProviderType;
+
+@ProviderType
+public interface Exchange {
+
+ void submitOrder(Order order) throws Exception;
+
+ Order findOrder(UUID id);
+
+ Collection getAllOrders();
+
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/ExchangeListener.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/ExchangeListener.java
new file mode 100644
index 00000000..a0588d9b
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/ExchangeListener.java
@@ -0,0 +1,30 @@
+package org.gecko.playground.exchange.api;
+
+import org.gecko.playground.model.orders.Order;
+import org.osgi.annotation.versioning.ConsumerType;
+
+@ConsumerType
+public abstract class ExchangeListener {
+ /**
+ * An order was submitted to an exchange
+ *
+ * @param order
+ */
+ public void orderSubmitted(String exchangeId, Order order) {};
+
+ /**
+ * An order was cancelled.
+ *
+ * @param order
+ * The order as it existed just prior to cancellation.
+ */
+ public void orderCancelled(String exchangeId, Order order) {};
+
+ /**
+ * An order expired.
+ *
+ * @param order
+ * The order as it existed just prior to expiration.
+ */
+ public void orderExpired(String exchangeId, Order order) {};
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/FillListener.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/FillListener.java
new file mode 100644
index 00000000..b51ca1f5
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/FillListener.java
@@ -0,0 +1,11 @@
+package org.gecko.playground.exchange.api;
+
+import org.gecko.playground.model.orders.Fill;
+import org.osgi.annotation.versioning.ConsumerType;
+
+@ConsumerType
+public interface FillListener {
+
+ void filled(String exchangeId, Fill fill);
+
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/package-info.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/package-info.java
new file mode 100644
index 00000000..350c448f
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/exchange/api/package-info.java
@@ -0,0 +1,3 @@
+@org.osgi.annotation.versioning.Version("1.0")
+@org.osgi.annotation.bundle.Export
+package org.gecko.playground.exchange.api;
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Fill.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Fill.java
new file mode 100644
index 00000000..52e4741d
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Fill.java
@@ -0,0 +1,52 @@
+package org.gecko.playground.model.orders;
+
+import java.io.Serializable;
+
+
+public final class Fill implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final long fillQuantity;
+ private final Order bidOrder;
+ private final Order askOrder;
+ private final long time;
+
+ public Fill(long fillQuantity, Order bidOrder, Order askOrder, long time) {
+ this.fillQuantity = fillQuantity;
+ this.bidOrder = bidOrder;
+ this.askOrder = askOrder;
+ this.time = time;
+ }
+
+ /**
+ * @return The quantity of each order that was filled. This quantity cannot
+ * be more than the lesser out of the bid order quantity and the ask
+ * order quantity, as they each existed at the time of the fill.
+ */
+ public long getFillQuantity() {
+ return fillQuantity;
+ }
+
+ /**
+ * The bid-side order that was filled, either in whole or in part.
+ */
+ public Order getBidOrder() {
+ return bidOrder;
+ }
+
+ /**
+ * The ask-side order that was filled, either in whole or in part.
+ */
+ public Order getAskOrder() {
+ return askOrder;
+ }
+
+ /**
+ * @return The time at which the fill was generated.
+ */
+ public long getTime() {
+ return time;
+ }
+
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Order.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Order.java
new file mode 100644
index 00000000..6b667dca
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Order.java
@@ -0,0 +1,101 @@
+package org.gecko.playground.model.orders;
+
+import java.io.Serializable;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+
+public final class Order implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final UUID id;
+ private final long customerId;
+ private final String symbol;
+ private final Side side;
+ private final long price;
+ private final long expiry;
+ private final long initialQuantity;
+ private final AtomicLong quantity;
+
+ public Order(String symbol, Side side, long initialQuantity, long price) {
+ this(UUID.randomUUID(), 0, symbol, side, initialQuantity, price, 0);
+ }
+
+ public Order(UUID id, long customerId, String symbol, Side side, long initialQuantity, long price, long expiry) {
+ this.id = id;
+ this.customerId = customerId;
+ this.symbol = symbol;
+ this.side = side;
+ this.initialQuantity = initialQuantity;
+ this.quantity = new AtomicLong(initialQuantity);
+ this.price = price;
+ this.expiry = expiry;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public long getCustomerId() {
+ return customerId;
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
+
+ public Side getSide() {
+ return side;
+ }
+
+ public long getInitialQuantity() {
+ return initialQuantity;
+ }
+
+ public long getQuantity() {
+ return quantity.get();
+ }
+
+ public void setQuantity(long newQuantity) {
+ quantity.set(newQuantity);
+ }
+
+ public long getPrice() {
+ return price;
+ }
+
+ public long getExpiry() {
+ return expiry;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Order [id=%s, customerId=%s, symbol=%s, side=%s, quantity=%d, initialQuantity=%d, price=%d, expiry=%s]", id, customerId, symbol, side, quantity.get(), initialQuantity, price, expiry);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Order other = (Order) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Side.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Side.java
new file mode 100644
index 00000000..95b898bc
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/Side.java
@@ -0,0 +1,21 @@
+package org.gecko.playground.model.orders;
+
+public enum Side {
+ Bid, Ask;
+
+ public Side opposite() {
+ Side result;
+ switch (this) {
+ case Bid:
+ result = Ask;
+ break;
+ case Ask:
+ result = Bid;
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid side: " + this);
+ }
+ return result;
+ }
+
+}
diff --git a/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/package-info.java b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/package-info.java
new file mode 100644
index 00000000..823eeb57
--- /dev/null
+++ b/org.gecko.playground.exchange.api/src/org/gecko/playground/model/orders/package-info.java
@@ -0,0 +1,3 @@
+@org.osgi.annotation.versioning.Version("1.0")
+@org.osgi.annotation.bundle.Export
+package org.gecko.playground.model.orders;
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.client/.classpath b/org.gecko.playground.exchange.client/.classpath
new file mode 100644
index 00000000..bbfbdbe4
--- /dev/null
+++ b/org.gecko.playground.exchange.client/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/org.gecko.playground.exchange.client/.project b/org.gecko.playground.exchange.client/.project
new file mode 100644
index 00000000..efc5240c
--- /dev/null
+++ b/org.gecko.playground.exchange.client/.project
@@ -0,0 +1,23 @@
+
+
+ org.gecko.playground.exchange.client
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ bndtools.core.bndbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ bndtools.core.bndnature
+
+
diff --git a/org.gecko.playground.exchange.client/.settings/org.eclipse.jdt.core.prefs b/org.gecko.playground.exchange.client/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..8c9943d5
--- /dev/null
+++ b/org.gecko.playground.exchange.client/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/logger/LoggingExchangeListener.class b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/logger/LoggingExchangeListener.class
new file mode 100644
index 00000000..4ab0a623
Binary files /dev/null and b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/logger/LoggingExchangeListener.class differ
diff --git a/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/orderentry/placeholder.txt b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/orderentry/placeholder.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/ExchangeCommand.class b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/ExchangeCommand.class
new file mode 100644
index 00000000..e7f5cf95
Binary files /dev/null and b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/ExchangeCommand.class differ
diff --git a/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/package-info.class b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/package-info.class
new file mode 100644
index 00000000..826e319a
Binary files /dev/null and b/org.gecko.playground.exchange.client/bin/org/gecko/playground/exchange/shell/package-info.class differ
diff --git a/org.gecko.playground.exchange.client/bin_test/.gitignore b/org.gecko.playground.exchange.client/bin_test/.gitignore
new file mode 100644
index 00000000..e69de29b
diff --git a/org.gecko.playground.exchange.client/bnd.bnd b/org.gecko.playground.exchange.client/bnd.bnd
new file mode 100644
index 00000000..09db6b2f
--- /dev/null
+++ b/org.gecko.playground.exchange.client/bnd.bnd
@@ -0,0 +1,3 @@
+-buildpath: \
+ org.gecko.playground.ds.simple;version=latest,\
+ org.gecko.playground.exchange.api;version=latest
diff --git a/org.gecko.playground.exchange.client/launch.bndrun b/org.gecko.playground.exchange.client/launch.bndrun
new file mode 100644
index 00000000..8f9596ad
--- /dev/null
+++ b/org.gecko.playground.exchange.client/launch.bndrun
@@ -0,0 +1,22 @@
+-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]'
+-runee: JavaSE-17
+-runrequires: \
+ bnd.identity;id='org.gecko.playground.exchange.impl',\
+ bnd.identity;id='org.gecko.playground.exchange.client',\
+ bnd.identity;id='org.apache.felix.gogo.command',\
+ bnd.identity;id='org.apache.felix.gogo.shell',\
+ osgi.identity;filter:='(&(osgi.identity=org.apache.felix.eventadmin)(version>=1.6.4))'
+-runbundles: \
+ org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
+ org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
+ org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\
+ org.apache.felix.scr;version='[2.2.6,2.2.7)',\
+ org.gecko.playground.exchange.api;version=snapshot,\
+ org.gecko.playground.exchange.impl;version=snapshot,\
+ org.osgi.service.component;version='[1.5.1,1.5.2)',\
+ org.osgi.service.log;version='[1.5.0,1.5.1)',\
+ org.osgi.util.function;version='[1.2.0,1.2.1)',\
+ org.osgi.util.promise;version='[1.3.0,1.3.1)',\
+ org.gecko.playground.ds.simple;version=snapshot,\
+ org.gecko.playground.exchange.client;version=snapshot,\
+ org.apache.felix.eventadmin;version='[1.6.4,1.6.5)'
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/logger/LoggingExchangeListener.java b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/logger/LoggingExchangeListener.java
new file mode 100644
index 00000000..a6fd97ed
--- /dev/null
+++ b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/logger/LoggingExchangeListener.java
@@ -0,0 +1,34 @@
+package org.gecko.playground.exchange.logger;
+
+import org.gecko.playground.ds.simple.logging.Log;
+import org.gecko.playground.exchange.api.ExchangeListener;
+import org.gecko.playground.model.orders.Order;
+
+public class LoggingExchangeListener extends ExchangeListener {
+
+ private Log log;
+
+ public Log getLog() {
+ return log;
+ }
+
+ public void setLog(Log log) {
+ this.log = log;
+ }
+
+ @Override
+ public void orderSubmitted(String exchangeId, Order order) {
+ log.logMessage("LoggingExchangeListener: order submitted.");
+ }
+
+ @Override
+ public void orderCancelled(String exchangeId, Order order) {
+ log.logMessage("LoggingExchangeListener: order cancelled.");
+ }
+
+ @Override
+ public void orderExpired(String exchangeId, Order order) {
+ log.logMessage("LoggingExchangeListener: order expired.");
+ }
+
+}
diff --git a/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/orderentry/placeholder.txt b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/orderentry/placeholder.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/ExchangeCommand.java b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/ExchangeCommand.java
new file mode 100644
index 00000000..8990e418
--- /dev/null
+++ b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/ExchangeCommand.java
@@ -0,0 +1,36 @@
+package org.gecko.playground.exchange.shell;
+
+import static java.util.Objects.isNull;
+
+import org.gecko.playground.exchange.api.Exchange;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+
+@Component (service = Object.class ,
+property = { "osgi.command.scope=exchange",
+ "osgi.command.function=orders"})
+public class ExchangeCommand {
+
+ private Exchange exchange;
+
+// @Reference
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL)
+ public void setExchange(Exchange exchange) {
+ this.exchange = exchange;
+ }
+
+ public void unsetExchange(Exchange exchange) {
+ this.exchange = null;
+ }
+
+ public void orders() {
+ if (isNull(exchange)) {
+ System.out.println("Exchange not available!");
+ } else {
+ System.out.println(String.format("There are %d orders", exchange.getAllOrders().size()));
+ }
+ }
+
+}
diff --git a/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/package-info.java b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/package-info.java
new file mode 100644
index 00000000..590f54dd
--- /dev/null
+++ b/org.gecko.playground.exchange.client/src/org/gecko/playground/exchange/shell/package-info.java
@@ -0,0 +1 @@
+package org.gecko.playground.exchange.shell;
\ No newline at end of file
diff --git a/org.gecko.playground.exchange.client/test/.gitignore b/org.gecko.playground.exchange.client/test/.gitignore
new file mode 100644
index 00000000..e69de29b
diff --git a/org.gecko.playground.exchange.impl/.classpath b/org.gecko.playground.exchange.impl/.classpath
new file mode 100644
index 00000000..bbfbdbe4
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/org.gecko.playground.exchange.impl/.project b/org.gecko.playground.exchange.impl/.project
new file mode 100644
index 00000000..772759e6
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/.project
@@ -0,0 +1,23 @@
+
+
+ org.gecko.playground.exchange.impl
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ bndtools.core.bndbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ bndtools.core.bndnature
+
+
diff --git a/org.gecko.playground.exchange.impl/.settings/org.eclipse.jdt.core.prefs b/org.gecko.playground.exchange.impl/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..8c9943d5
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl$1.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl$1.class
new file mode 100644
index 00000000..bbe108e2
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl$1.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl.class
new file mode 100644
index 00000000..cce97a44
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/ExchangeImpl.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Handler.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Handler.class
new file mode 100644
index 00000000..9993194f
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Handler.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderComparator.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderComparator.class
new file mode 100644
index 00000000..86f71182
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderComparator.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderEventHandler.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderEventHandler.class
new file mode 100644
index 00000000..b3fd065e
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/OrderEventHandler.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Subscriber.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Subscriber.class
new file mode 100644
index 00000000..689ce8c6
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/impl/Subscriber.class differ
diff --git a/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/prices/RandomPriceFeed.class b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/prices/RandomPriceFeed.class
new file mode 100644
index 00000000..003b0106
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin/org/gecko/playground/exchange/prices/RandomPriceFeed.class differ
diff --git a/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderComparatorTest.class b/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderComparatorTest.class
new file mode 100644
index 00000000..1a9cdedb
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderComparatorTest.class differ
diff --git a/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.class b/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.class
new file mode 100644
index 00000000..a7ce5e72
Binary files /dev/null and b/org.gecko.playground.exchange.impl/bin_test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.class differ
diff --git a/org.gecko.playground.exchange.impl/bnd.bnd b/org.gecko.playground.exchange.impl/bnd.bnd
new file mode 100644
index 00000000..d3fe1f93
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/bnd.bnd
@@ -0,0 +1,11 @@
+
+Private-Package: \
+ org.gecko.playground.exchange.prices,\
+ org.gecko.playground.exchange.impl
+
+-buildpath: \
+ org.gecko.playground.exchange.api;version=latest,\
+ org.osgi.service.component;version=latest,\
+ org.osgi.service.log;version=latest,\
+ org.osgi.framework;version=latest,\
+ org.osgi.service.event
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/ExchangeImpl.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/ExchangeImpl.java
new file mode 100644
index 00000000..47f3df9a
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/ExchangeImpl.java
@@ -0,0 +1,115 @@
+package org.gecko.playground.exchange.impl;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.BlockingDeque;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.gecko.playground.exchange.api.Exchange;
+import org.gecko.playground.model.orders.Fill;
+import org.gecko.playground.model.orders.Order;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.log.Logger;
+import org.osgi.service.log.LoggerFactory;
+
+@Component(
+ property = {
+ "name=Local",
+ "symbols=MSFT",
+ "symbols=GOOG",
+ "symbols=AAPL"
+ })
+public class ExchangeImpl implements Exchange {
+
+ private static final AtomicLong instanceCounter = new AtomicLong(0L);
+
+ private final ConcurrentMap orders = new ConcurrentHashMap();
+ private final BlockingDeque orderQueue = new LinkedBlockingDeque(128);
+ private final BlockingDeque fillQueue = new LinkedBlockingDeque(128);
+ private final ExecutorService executor = Executors.newCachedThreadPool();
+
+ private String id;
+
+ @Reference(service = LoggerFactory.class, cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
+ private Logger log;
+
+ // TODO: bind to ExchangeListener services.
+ // You will need to add a final field of type List.
+
+ /**
+ * Activate without OSGi ComponentContext. Used for tests.
+ * @param configProps
+ */
+ void activate(Map configProps) {
+ activate(configProps, null);
+ }
+
+ @Activate
+ void activate(Map configProps, ComponentContext context) {
+ Handler fillHandler = new Handler() {
+ public void handle(Fill event) {
+ fireFill(event);
+ }
+ };
+ executor.submit(new Subscriber(fillQueue, fillHandler, log));
+ executor.submit(new Subscriber(orderQueue, new OrderEventHandler(this, fillQueue), log));
+
+ // Get my ID as /
+ if (context != null) {
+ String frameworkUUID = context.getBundleContext().getProperty(Constants.FRAMEWORK_UUID);
+ ServiceReference> ref = context.getServiceReference();
+ long serviceId = ref != null ? (Long) ref.getProperty(Constants.SERVICE_ID) : 0;
+ id = String.format("%s/%d", frameworkUUID, serviceId);
+ } else {
+ id = String.format("%s/%d", UUID.randomUUID().toString(), instanceCounter.getAndIncrement());
+ }
+ }
+
+ @Deactivate
+ void deactivate() {
+ executor.shutdown();
+ }
+
+ @Override
+ public void submitOrder(Order order) throws Exception {
+ orderQueue.putFirst(order);
+ }
+
+ @Override
+ public Order findOrder(UUID id) {
+ return orders.get(id);
+ }
+
+ @Override
+ public Collection getAllOrders() {
+ return orders.values();
+ }
+
+ void orderSubmitted(Order order) {
+ orders.put(order.getId(), order);
+ fireOrderSubmitted(order);
+ }
+
+ private void fireOrderSubmitted(Order order) {
+ // TODO: iterate over ExchangeListeners and call orderSubmitted(exchangeId, order).
+ }
+
+ private void fireFill(Fill fill) {
+ // this method can be ignored
+ }
+
+}
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Handler.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Handler.java
new file mode 100644
index 00000000..f7d7b274
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Handler.java
@@ -0,0 +1,5 @@
+package org.gecko.playground.exchange.impl;
+
+public interface Handler {
+ void handle(T event) throws Exception;
+}
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderComparator.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderComparator.java
new file mode 100644
index 00000000..3b081b5a
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderComparator.java
@@ -0,0 +1,29 @@
+package org.gecko.playground.exchange.impl;
+
+import java.util.Comparator;
+
+import org.gecko.playground.model.orders.Order;
+import org.gecko.playground.model.orders.Side;
+
+public class OrderComparator implements Comparator {
+
+ @Override
+ public int compare(Order o1, Order o2) {
+ // Bids before Asks
+ if (o1.getSide() == Side.Ask && o2.getSide() == Side.Bid)
+ return 1;
+ if (o1.getSide() == Side.Bid && o2.getSide() == Side.Ask)
+ return -1;
+
+ // Lowest priced first
+ long priceDiff = o1.getPrice() - o2.getPrice();
+ if (priceDiff < 0L)
+ return -1;
+ else if (priceDiff > 0L)
+ return 1;
+
+ // Finally, order by ID
+ return o1.getId().compareTo(o2.getId());
+ }
+
+}
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderEventHandler.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderEventHandler.java
new file mode 100644
index 00000000..742e90ad
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/OrderEventHandler.java
@@ -0,0 +1,87 @@
+package org.gecko.playground.exchange.impl;
+
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.BlockingDeque;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.gecko.playground.model.orders.Fill;
+import org.gecko.playground.model.orders.Order;
+import org.gecko.playground.model.orders.Side;
+
+class OrderEventHandler implements Handler {
+
+ private final ConcurrentMap> bids = new ConcurrentHashMap>();
+ private final ConcurrentMap> asks = new ConcurrentHashMap>();
+
+ private final ExchangeImpl exchange;
+ private final BlockingDeque fillQueue;
+
+ OrderEventHandler(ExchangeImpl exchange, BlockingDeque fillQueue) {
+ this.exchange = exchange;
+ this.fillQueue = fillQueue;
+ }
+
+ @Override
+ public void handle(Order order) throws Exception {
+ long qtyRemaining = order.getQuantity();
+
+ // Look for immediately available matches
+ TreeSet oppositeBook = getBook(order.getSymbol(), order.getSide().opposite());
+ Iterator iter = order.getSide().opposite() == Side.Ask ? oppositeBook.iterator() : oppositeBook.descendingIterator();
+ while (iter.hasNext()) {
+ Order matchingOrder = iter.next();
+ if (qtyRemaining == 0)
+ break;
+
+ boolean canFill = (order.getSide() == Side.Bid && matchingOrder.getPrice() <= order.getPrice()) || order.getSide() == Side.Ask && matchingOrder.getPrice() >= order.getPrice();
+ if (!canFill)
+ break;
+
+ long fillQty = Math.min(qtyRemaining, matchingOrder.getQuantity());
+
+ Order bid, ask;
+ if (order.getSide() == Side.Bid) {
+ bid = order;
+ ask = matchingOrder;
+ } else {
+ bid = matchingOrder;
+ ask = order;
+ }
+
+ // Send a fill event onto the fills queue
+ Fill fill = new Fill(fillQty, bid, ask, System.currentTimeMillis());
+ fillQueue.putFirst(fill);
+
+ qtyRemaining -= fillQty;
+
+ matchingOrder.setQuantity(matchingOrder.getQuantity() - fillQty);
+ if (matchingOrder.getQuantity() == 0)
+ iter.remove();
+ }
+ order.setQuantity(qtyRemaining);
+
+ // If any quantity remaining, record order in the order book
+ if (qtyRemaining > 0) {
+ SortedSet book = getBook(order.getSymbol(), order.getSide());
+ book.add(order);
+ }
+
+ exchange.orderSubmitted(order);
+ }
+
+ private TreeSet getBook(String symbol, Side side) {
+ ConcurrentMap> map = (side == Side.Bid) ? bids : asks;
+ TreeSet book = map.get(symbol);
+ if (book == null) {
+ book = new TreeSet(new OrderComparator());
+ TreeSet previous = map.putIfAbsent(symbol, book);
+ if (previous != null)
+ book = previous;
+ }
+ return book;
+ }
+
+}
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Subscriber.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Subscriber.java
new file mode 100644
index 00000000..3e787b56
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/impl/Subscriber.java
@@ -0,0 +1,35 @@
+package org.gecko.playground.exchange.impl;
+
+import java.util.concurrent.BlockingDeque;
+
+import org.osgi.service.log.Logger;
+
+public class Subscriber implements Runnable {
+
+ private BlockingDeque extends T> queue;
+ private Handler super T> handler;
+ private Logger log;
+
+ public Subscriber(BlockingDeque extends T> queue, Handler super T> handler, Logger log) {
+ this.queue = queue;
+ this.handler = handler;
+ this.log = log;
+ }
+
+ @Override
+ public void run() {
+ while (!Thread.interrupted()) {
+ try {
+ T item = queue.takeLast();
+ handler.handle(item);
+ } catch (InterruptedException e) {
+ // Exit from main loop
+ break;
+ } catch (Exception e) {
+ log.error("Error handling event: ", e);
+ }
+ }
+ }
+
+
+}
diff --git a/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/prices/RandomPriceFeed.java b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/prices/RandomPriceFeed.java
new file mode 100644
index 00000000..4664ca66
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/src/org/gecko/playground/exchange/prices/RandomPriceFeed.java
@@ -0,0 +1,77 @@
+package org.gecko.playground.exchange.prices;
+
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Random;
+
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+@Component(immediate=true, name="org.gecko.playground.exchange.prices.feed")
+public class RandomPriceFeed implements Runnable {
+
+ private static final String TOPIC_PREFIX = "PRICES/STOCKS/NASDAQ/";
+ private static final long MINIMUM_SLEEP_TIME = 100;
+
+
+ private double startingPrice;
+ private String symbol;
+ private long sleepTime;
+
+ private Thread thread;
+ private double delta;
+
+ // TODO (Lab 17): bind a reference to the EventAdmin service
+ @Reference
+ private EventAdmin eventAdmin;
+
+ @Activate
+ protected void activate() {
+ // TODO (Lab 18): get the following two settings from config
+ symbol = "MSFT";
+ startingPrice = 300;
+
+ sleepTime = Math.max(MINIMUM_SLEEP_TIME, 500);
+ delta = 10;
+ thread = new Thread(this);
+ thread.start();
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ thread.interrupt();
+ }
+
+ public void run() {
+ double price = startingPrice;
+ Random random = new Random();
+
+ try {
+ while (!Thread.currentThread().isInterrupted()) {
+ postUpdate(symbol, price, System.currentTimeMillis());
+
+ // Sleep
+ Thread.sleep(sleepTime);
+
+ // Randomly adjust price by up to +/- delta
+ double adjustment = random.nextDouble() * delta * 2 - delta;
+ price = Math.max(0, price + adjustment);
+ }
+ } catch (InterruptedException e) {
+ // Exit quietly
+ }
+ }
+
+ private void postUpdate(String symbol, double price, long time) {
+ // TODO (Lab 17): Create and send the event containing symbol, current time and price
+ // Tip: create the topic using the TOPIC_PREFIX constant, e.g. TOPIC_PREFIX + symbol
+ Dictionary props = FrameworkUtil.asDictionary(Map.of(null, null));
+ Event e = new Event(TOPIC_PREFIX + symbol, props);
+ eventAdmin.postEvent(e);
+ }
+}
diff --git a/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderComparatorTest.java b/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderComparatorTest.java
new file mode 100644
index 00000000..2f96fa47
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderComparatorTest.java
@@ -0,0 +1,55 @@
+package org.gecko.playground.exchange.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Iterator;
+import java.util.TreeSet;
+import java.util.UUID;
+
+import org.gecko.playground.exchange.impl.OrderComparator;
+import org.gecko.playground.model.orders.Order;
+import org.gecko.playground.model.orders.Side;
+import org.junit.jupiter.api.Test;
+
+public class OrderComparatorTest {
+
+ @Test
+ public void testBidOrdering() {
+ Order o1 = new Order(UUID.randomUUID(), 0, "", Side.Bid, 100, 101, 0);
+ Order o2 = new Order(UUID.randomUUID(), 0, "", Side.Bid, 100, 102, 0);
+ Order o3 = new Order(UUID.randomUUID(), 0, "", Side.Bid, 100, 103, 0);
+
+ OrderComparator c = new OrderComparator();
+ assertTrue(c.compare(o1, o2) < 0);
+ assertTrue(c.compare(o2, o3) < 0);
+
+ TreeSet set = new TreeSet(c);
+ set.add(o1);
+ set.add(o3);
+ set.add(o2);
+
+ Iterator iter = set.descendingIterator();
+ assertEquals(103, iter.next().getPrice());
+ assertEquals(102, iter.next().getPrice());
+ assertEquals(101, iter.next().getPrice());
+ }
+
+ @Test
+ public void testAskOrdering() {
+ Order o1 = new Order(UUID.randomUUID(), 0, "", Side.Ask, 100, 101, 0);
+ Order o2 = new Order(UUID.randomUUID(), 0, "", Side.Ask, 100, 102, 0);
+ Order o3 = new Order(UUID.randomUUID(), 0, "", Side.Ask, 100, 103, 0);
+
+ OrderComparator c = new OrderComparator();
+ TreeSet set = new TreeSet(c);
+ set.add(o1);
+ set.add(o3);
+ set.add(o2);
+
+ Iterator iter = set.iterator();
+ assertEquals(101, iter.next().getPrice());
+ assertEquals(102, iter.next().getPrice());
+ assertEquals(103, iter.next().getPrice());
+ }
+}
diff --git a/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.java b/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.java
new file mode 100644
index 00000000..aa4ea791
--- /dev/null
+++ b/org.gecko.playground.exchange.impl/test/org/gecko/playground/exchange/impl/OrderEventHandlerTest.java
@@ -0,0 +1,187 @@
+package org.gecko.playground.exchange.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import java.util.UUID;
+import java.util.concurrent.BlockingDeque;
+import java.util.concurrent.LinkedBlockingDeque;
+
+import org.gecko.playground.exchange.impl.ExchangeImpl;
+import org.gecko.playground.exchange.impl.OrderEventHandler;
+import org.gecko.playground.model.orders.Fill;
+import org.gecko.playground.model.orders.Order;
+import org.gecko.playground.model.orders.Side;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.osgi.service.log.Logger;
+
+@ExtendWith(MockitoExtension.class)
+public class OrderEventHandlerTest {
+
+ private final ExchangeImpl exchange = new ExchangeImpl();
+
+ private BlockingDeque fillQueue;
+ private Logger log;
+
+ @BeforeEach
+ protected void setUp() throws Exception {
+ fillQueue = new LinkedBlockingDeque();
+ log = mock(Logger.class);
+ }
+
+ @AfterEach
+ protected void tearDown() throws Exception {
+ }
+
+ private Order createSubmitOrderEvent(String symbol, Side side, long qty, long price, long expiry) {
+ return new Order(UUID.randomUUID(), 0, symbol, side, qty, price, expiry);
+ }
+
+ @Test
+ public void testExactMatchOrderFill() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+
+ // Buy 1000
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Bid, 1000, 50, 0));
+
+ // Sell 1000
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 1000, 50, 0));
+
+ // Sell 50
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 50, 50, 0));
+
+ // Check fill events
+ Fill fill = fillQueue.takeLast();
+ assertEquals(1000, fill.getFillQuantity());
+
+ Thread.sleep(500);
+ assertEquals(0, fillQueue.size());
+ }
+
+ @Test
+ public void testExactMatchOrderFillReverse() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+
+ // Sell 1000
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 1000, 50, 0));
+
+ // Buy 1000
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Bid, 1000, 50, 0));
+
+ // Buy 50
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Bid, 50, 50, 0));
+
+ // Check fill events
+ Fill fill = fillQueue.takeLast();
+ assertEquals(1000, fill.getFillQuantity());
+
+ Thread.sleep(500);
+ assertEquals(0, fillQueue.size());
+ }
+
+ @Test
+ public void testPartialFill() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+ // Buy 100 at 100
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Bid, 100, 100, 0));
+ // Buy 100 at 101
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Bid, 100, 101, 0));
+ // Sell 100 at 200
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Ask, 100, 200, 0));
+ // Sell 50 at 101 -- this should trigger a partial fill
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Ask, 50, 101, 0));
+
+ // Check fill events
+ Fill fill = fillQueue.removeFirst();
+ assertEquals(50, fill.getFillQuantity());
+ assertEquals(101, fill.getBidOrder().getPrice());
+ assertEquals(101, fill.getAskOrder().getPrice());
+ assertEquals(50, fill.getBidOrder().getQuantity());
+ assertEquals(0, fill.getAskOrder().getQuantity());
+ }
+
+ @Test
+ public void testOverflow() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+ // Buy 10 at 100
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Bid, 10, 100, 0));
+ // Buy 10 at 100
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Bid, 10, 100, 0));
+
+ // Sell 10 at 100
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Ask, 10, 100, 0));
+ // Sell 10 at 100
+ handler.handle(createSubmitOrderEvent("MSFT", Side.Ask, 10, 100, 0));
+
+ assertEquals(2, fillQueue.size());
+ }
+
+ @Test
+ public void testMultipleFills() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+
+ // Sell 1000, no fills
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 1000, 50, 0));
+
+ // Buy 100
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Bid, 100, 55, 0));
+
+ // Buy 2000
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Bid, 2000, 55, 0));
+
+ // Verify interactions
+ Fill fill;
+
+ fill = fillQueue.takeLast();
+ assertEquals(100, fill.getFillQuantity());
+
+ fill = fillQueue.takeLast();
+ assertEquals(900, fill.getFillQuantity());
+
+ Thread.sleep(500);
+ assertEquals(0, fillQueue.size());
+ }
+
+ @Test
+ public void testNoFillDueToSpread() throws Exception {
+ OrderEventHandler handler = new OrderEventHandler(exchange, fillQueue);
+
+ // Sell @50
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 1000, 50, 0));
+
+ // Buy @49
+ handler.handle(createSubmitOrderEvent("USDCAD", Side.Ask, 100, 49, 0));
+
+ Thread.sleep(1000); // that should do it
+ assertEquals(0, fillQueue.size());
+ }
+
+ /*
+ @Test
+ public void testCancelOrder() throws Exception {
+ FillListener mockListener = mock(FillListener.class);
+
+ ExchangeImpl exchange = new ExchangeImpl();
+ exchange.addFillListener(mockListener);
+
+ // Sell
+ Order sell = exchange.submitOrder(-1, "USDCAD", Side.Ask, 1000, 50, 0);
+ assertEquals(1000, sell.getQuantity());
+
+ // Cancel
+ long cancelledQty = sell.cancel();
+ assertEquals(1000, cancelledQty);
+
+ // Buy - no fill
+ Order buy = exchange.submitOrder(-1, "USDCAD", Side.Bid, 1000, 50, 0);
+ assertEquals(1000, buy.getQuantity());
+
+ verifyZeroInteractions(mockListener);
+ }
+ */
+
+}
diff --git a/org.gecko.playground.lucene/bnd.bnd b/org.gecko.playground.lucene/bnd.bnd
index 98282eff..9351fc6b 100644
--- a/org.gecko.playground.lucene/bnd.bnd
+++ b/org.gecko.playground.lucene/bnd.bnd
@@ -12,7 +12,6 @@ Bundle-Version: ${lib.version}
Export-Package: org.apache.lucene.*
Bundle-Name: Apache Lucene OSGi Bundle
Import-Package: \
- sun.*;'resolution:'=optional,\
com.sun.*;'resolution:'=optional,\
*
diff --git a/org.gecko.playground.search/bnd.bnd b/org.gecko.playground.search/bnd.bnd
index 8f9f2bad..9e2bc9e6 100644
--- a/org.gecko.playground.search/bnd.bnd
+++ b/org.gecko.playground.search/bnd.bnd
@@ -2,21 +2,20 @@
Bundle-Version: 1.0.0.SNAPSHOT
-buildpath: \
- org.osgi.service.component,\
- org.gecko.search,\
- org.gecko.search.util,\
+ org.osgi.service.component;version=latest,\
+ org.gecko.search;version=latest,\
+ org.gecko.search.util;version=latest,\
org.apache.lucene.core;version=latest,\
org.gecko.playground.model;version=latest,\
org.osgi.util.promise;version=latest,\
- org.gecko.emf.repository.api,\
- org.osgi.util.function,\
- org.gecko.emf.mongo.pushstream,\
- org.gecko.emf.pushstreams,\
- org.osgi.util.pushstream,\
- org.gecko.util.pushstream,\
- org.gecko.emf.mongo.api,\
- org.gecko.emf.search,\
- org.gecko.search.document
+ org.gecko.emf.repository.api;version=latest,\
+ org.osgi.util.function;version=latest,\
+ org.gecko.emf.mongo.pushstream;version=latest,\
+ org.gecko.emf.pushstreams;version=latest,\
+ org.osgi.util.pushstream;version=latest,\
+ org.gecko.emf.mongo.api;version=latest,\
+ org.gecko.emf.search;version=latest,\
+ org.gecko.search.document;version=latest
-includeresource: \
OSGI-INF/configurator/=configs/
diff --git a/org.gecko.playground.search/src/org/gecko/playground/search/PersonIndexMongoService.java b/org.gecko.playground.search/src/org/gecko/playground/search/PersonIndexMongoService.java
index 30796546..607a8c07 100644
--- a/org.gecko.playground.search/src/org/gecko/playground/search/PersonIndexMongoService.java
+++ b/org.gecko.playground.search/src/org/gecko/playground/search/PersonIndexMongoService.java
@@ -29,7 +29,6 @@
import org.gecko.emf.repository.query.QueryRepository;
import org.gecko.playground.model.person.Person;
import org.gecko.playground.model.person.PersonPackage;
-import org.gecko.util.pushstreams.GeckoPushbackPolicyOption;
import org.osgi.service.component.ComponentServiceObjects;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
@@ -40,6 +39,7 @@
import org.osgi.util.promise.PromiseFactory;
import org.osgi.util.pushstream.PushEvent;
import org.osgi.util.pushstream.PushStream;
+import org.osgi.util.pushstream.PushbackPolicyOption;
import org.osgi.util.pushstream.QueuePolicyOption;
@@ -97,7 +97,7 @@ public Promise initializeIndex() {
}
PushStream indexNew = psp.createPushStreamBuilder()
- .withPushbackPolicy(GeckoPushbackPolicyOption.LINEAR_AFTER_THRESHOLD.getPolicy(50))
+ .withPushbackPolicy(PushbackPolicyOption.LINEAR, 50)
.withQueuePolicy(QueuePolicyOption.BLOCK)
.withExecutor(Executors.newSingleThreadExecutor())
.withBuffer(new ArrayBlockingQueue>(100))
diff --git a/org.gecko.playground.tasks.demo/bnd.bnd b/org.gecko.playground.tasks.demo/bnd.bnd
index 22261e56..690be758 100644
--- a/org.gecko.playground.tasks.demo/bnd.bnd
+++ b/org.gecko.playground.tasks.demo/bnd.bnd
@@ -5,5 +5,5 @@
org.osgi.service.condition;version='1.0',\
org.osgi.service.log
-Bundle-Name: Tasks Demo
+Bundle-Name: Playground Tasks Demo
Bundle-Description: Gecko Playground Tasks Demo
\ No newline at end of file
diff --git a/org.gecko.playground.tasks.demo/launch.bndrun b/org.gecko.playground.tasks.demo/launch.bndrun
index 4c9e6e66..5e25c701 100644
--- a/org.gecko.playground.tasks.demo/launch.bndrun
+++ b/org.gecko.playground.tasks.demo/launch.bndrun
@@ -9,29 +9,32 @@
osgi.console=
-runbundles: \
- org.gecko.playground;version=snapshot,\
- org.gecko.playground.workmode;version=snapshot,\
- org.gecko.playground.tasks;version=snapshot,\
- org.gecko.playground.tasks.demo;version=snapshot,\
- org.gecko.playground.config;version=snapshot,\
org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\
- jakarta.json-api;version='[2.1.1,2.1.2)',\
org.apache.felix.cm.json;version='[2.0.0,2.0.1)',\
- org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\
org.apache.felix.configurator;version='[1.0.18,1.0.19)',\
org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
org.apache.felix.scr;version='[2.2.6,2.2.7)',\
+ org.gecko.playground.config;version=snapshot,\
org.osgi.service.component;version='[1.5.1,1.5.2)',\
org.osgi.util.converter;version='[1.0.9,1.0.10)',\
org.osgi.util.function;version='[1.2.0,1.2.1)',\
org.osgi.util.promise;version='[1.3.0,1.3.1)',\
- org.osgi.service.cm;version='[1.6.1,1.6.2)'
+ org.gecko.playground;version=snapshot,\
+ org.gecko.playground.workmode;version=snapshot,\
+ org.gecko.playground.tasks;version=snapshot,\
+ org.gecko.playground.tasks.demo;version=snapshot,\
+ org.eclipse.parsson.jakarta.json;version='[1.1.1,1.1.2)',\
+ org.apache.felix.configadmin;version='[1.9.26,1.9.27)'
-runrequires: \
playground.config;filter:='(playground.config=default)',\
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
- bnd.identity;id='org.gecko.playground.tasks.demo'
+ bnd.identity;id='org.gecko.playground.tasks.demo',\
+ bnd.identity;id='org.eclipse.parsson.jakarta.json'
--runvm: -DlogFolderPath=${build}
\ No newline at end of file
+-runvm: -DlogFolderPath=${build}
+-runblacklist: \
+ bnd.identity;id='org.osgi.service.cm',\
+ bnd.identity;id='org.eclipse.equinox.cm'
\ No newline at end of file
diff --git a/org.gecko.playground.tasks/bnd.bnd b/org.gecko.playground.tasks/bnd.bnd
index f2e0cf43..2459ac1e 100644
--- a/org.gecko.playground.tasks/bnd.bnd
+++ b/org.gecko.playground.tasks/bnd.bnd
@@ -5,7 +5,7 @@
org.osgi.framework,\
org.osgi.service.log
-Bundle-Name: Tasks Runtime
+Bundle-Name: Playground Tasks Runtime
Bundle-Description: Gecko Playground Tasks Runtime
-privatepackage: \
org.gecko.playground.tasks.commands,\
diff --git a/org.gecko.playground.vaadin.frontend/bnd.bnd b/org.gecko.playground.vaadin.frontend/bnd.bnd
index 2f3f8089..c6a94792 100644
--- a/org.gecko.playground.vaadin.frontend/bnd.bnd
+++ b/org.gecko.playground.vaadin.frontend/bnd.bnd
@@ -8,12 +8,15 @@ Bundle-Version: 1.0.0.SNAPSHOT
-dependson: \
org.gecko.playground.vaadin
+
+-buildpath: \
+ org.gecko.playground.vaadin;version=project
--generate:\
- test.txt;\
- generate=geckoVaadinNPM;\
- output=META-INF/VAADIN;\
- cleanup=ALL
+#-generate:\
+# test.txt;\
+# generate=geckoVaadinNPM;\
+# output=META-INF/VAADIN;\
+# cleanup=ALL
-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]'
-runee: JavaSE-17
@@ -110,33 +113,6 @@ Bundle-Version: 1.0.0.SNAPSHOT
org.gecko.search.document;version='[1.1.0,1.1.1)',\
org.gecko.search.util;version='[1.1.0,1.1.1)'
-runrepos: \
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
- Workspace,\
Workspace,\
Central,\
Local,\
diff --git a/org.gecko.playground.workmode/bnd.bnd b/org.gecko.playground.workmode/bnd.bnd
index 9fcd6138..464923c5 100644
--- a/org.gecko.playground.workmode/bnd.bnd
+++ b/org.gecko.playground.workmode/bnd.bnd
@@ -5,11 +5,12 @@
org.osgi.service.log,\
org.osgi.framework
-Bundle-Name: Workmode
+Bundle-Name: Playground Workmode
Bundle-Description: Gecko Playground Workmode
-privatepackage: \
org.gecko.playground.workmode.command,\
org.gecko.playground.workmode.internal
Export-Package: \
org.gecko.playground.workmode,\
- org.gecko.playground.workmode.annotations
\ No newline at end of file
+ org.gecko.playground.workmode.annotations
+
\ No newline at end of file
diff --git a/org.gecko.playground.xslt/src/org/gecko/playground/xslt/ExampleXSLT.java b/org.gecko.playground.xslt/src/org/gecko/playground/xslt/ExampleXSLT.java
index a4d1ce23..3f4a439a 100644
--- a/org.gecko.playground.xslt/src/org/gecko/playground/xslt/ExampleXSLT.java
+++ b/org.gecko.playground.xslt/src/org/gecko/playground/xslt/ExampleXSLT.java
@@ -50,6 +50,7 @@ public void activate() {
System.out.println("Source XML: ");
System.out.println(sw.toString());
// Create Transformer
+ long start = System.currentTimeMillis();
Transformer transformer = templates.newTransformer();
// Source
@@ -62,8 +63,18 @@ public void activate() {
// Transform
transformer.transform(source, result);
+ start = System.currentTimeMillis() - start;
System.out.println("Transformation resulted in: ");
System.out.println(new String(baos.toByteArray()));
+ System.out.println("1. Transformation took : " + start + " ms (Transformer warm-up)");
+ for (int i = 0; i < 5; i++) {
+ start = System.currentTimeMillis();
+ transformer.transform(source, result);
+ start = System.currentTimeMillis() - start;
+ System.out.println((i + 2) + ". Transformation took : " + start + " ms");
+
+ }
+
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (JAXBException e) {