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 queue; + private Handler handler; + private Logger log; + + public Subscriber(BlockingDeque queue, Handler 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) {