Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions client-rpc/src/bookmap/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
add_on_position_update_handler,\
add_broadcasting_handler, \
add_broadcasting_provider_status_handler, \
add_broadcasting_settings_handler, \
create_order_book, \
on_depth, \
get_bbo, \
Expand Down
10 changes: 10 additions & 0 deletions client-rpc/src/bookmap/bookmap.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
BROADCASTING = "29"
REGISTER_BROADCASTING_PROVIDER = "30"
PROVIDERS_STATUS = "31"
BROADCASTING_SETTINGS = "32"
ERROR = "-1"

counter_lock = threading.Lock()
Expand Down Expand Up @@ -285,6 +286,8 @@ def _get_parameters_from_msg(type_token: str, msg: str):
return tokens[1], json.loads(tokens[2])
elif type_token == PROVIDERS_STATUS:
return [json.loads(tokens[1])]
elif type_token == BROADCASTING_SETTINGS:
return tokens[1], json.loads(tokens[2])
else:
# default case when there should not be any parameter parsing, but instead the msg should be sent to a server
return type_token, msg
Expand Down Expand Up @@ -722,6 +725,13 @@ def add_broadcasting_provider_status_handler(
_add_event_handler(addon, PROVIDERS_STATUS, handler)


def add_broadcasting_settings_handler(
addon: typing.Dict[str, object],
handler: typing.Callable[[str, object], None]
) -> None:
_add_event_handler(addon, BROADCASTING_SETTINGS, handler)


################ Util objects
### Order book
def create_order_book() -> typing.Dict[str, SortedDict]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,14 @@ public void subscribeToLiveData(String generatorName, EventLoop eventLoop, Strin

// Trying to subscribe for live events.
// Broadcasting will notify us of a successful subscription through the LiveConnectionListener.
broadcasterConsumer.subscribeToLiveData(providerName, generatorInfo.getGeneratorName(),
Event.class, eventListener, subscriptionListener);

if (doesRequireFiltering) {
broadcasterConsumer.setListenersForGenerator(providerName, generatorName, filterListener, new SettingsListener());
broadcasterConsumer.setListenersForGenerator(providerName, generatorName, filterListener, new SettingsListener(eventLoop, generatorName));
} else {
broadcasterConsumer.setListenersForGenerator(providerName, generatorName, null, null);
}
broadcasterConsumer.subscribeToLiveData(providerName, generatorInfo.getGeneratorName(),
Event.class, eventListener, subscriptionListener);
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@
import com.bookmap.addons.broadcasting.api.view.listeners.LiveEventListener;
import com.bookmap.api.rpc.server.EventLoop;
import com.bookmap.api.rpc.server.data.outcome.BroadcastingEvent;
import com.google.gson.JsonObject;

import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import com.bookmap.api.rpc.server.utils.JsonUtil;

/**
* The listener that is passed to BrAPI.
Expand All @@ -17,7 +13,6 @@ public class EventListener implements LiveEventListener {

private final EventLoop eventLoop;
private final String generatorName;
private final Map<Class<?>, Field[]> classToFields = new ConcurrentHashMap<>();
private final FilterListener filterListener;

public EventListener(EventLoop eventLoop, String generatorName, FilterListener filterListener) {
Expand All @@ -34,43 +29,12 @@ public void giveEvent(Object o) {
}
String event;
try {
event = convertEventToJSON(o);
event = JsonUtil.convertObjectToJsonString(o);
}
catch (IllegalAccessException e) {
throw new RuntimeException("Error during parsing event object", e);
}
eventLoop.pushEvent(new BroadcastingEvent(generatorName, event));
}
}

private String convertEventToJSON(Object o) throws IllegalAccessException {
JsonObject jsonObject = new JsonObject();
Class<?> clazz = o.getClass();
if (classToFields.containsKey(clazz)) {
Field[] fields = classToFields.get(clazz);
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
Object fieldValue = field.get(o);
jsonObject.addProperty(fieldName, fieldValue.toString());
}
} else {
Field[] fields = clazz.getDeclaredFields();
List<Field> fieldNames = new ArrayList<>();
for (Field field : fields) {
field.setAccessible(true);

String fieldName = field.getName();
if (fieldName.equals("serialVersionUID")) {
continue;
}
fieldNames.add(field);
Object fieldValue = field.get(o);
jsonObject.addProperty(fieldName, fieldValue.toString());
}
classToFields.put(clazz, fieldNames.toArray(new Field[0]));
}

return jsonObject.toString();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,31 @@
package com.bookmap.api.rpc.server.addon.listeners.broadcasting;

import com.bookmap.addons.broadcasting.api.view.listeners.UpdateSettingsListener;
import com.bookmap.api.rpc.server.EventLoop;
import com.bookmap.api.rpc.server.data.outcome.BroadcastingSettingsEvent;
import com.bookmap.api.rpc.server.utils.JsonUtil;

public class SettingsListener implements UpdateSettingsListener {

private final EventLoop eventLoop;
private final String generatorName;

public SettingsListener(EventLoop eventLoop, String generatorName) {
this.eventLoop = eventLoop;
this.generatorName = generatorName;
}

@Override
public void reactToSettingsUpdate(Object o) {
if (o != null) {
String event;
try {
event = JsonUtil.convertObjectToJsonString(o);
}
catch (IllegalAccessException e) {
throw new RuntimeException("Error during parsing event object", e);
}
eventLoop.pushEvent(new BroadcastingSettingsEvent(generatorName, event));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.bookmap.api.rpc.server.data.outcome;

import com.bookmap.api.rpc.server.data.utils.AbstractEvent;
import com.bookmap.api.rpc.server.data.utils.Type;

public class BroadcastingSettingsEvent extends AbstractEvent {

public final String event;
public final String generatorName;

public BroadcastingSettingsEvent(String generatorName, String event) {
super(Type.BROADCASTING_SETTINGS);
this.generatorName = generatorName;
this.event = event;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.bookmap.api.rpc.server.data.outcome.converters;

import com.bookmap.api.rpc.server.data.outcome.BroadcastingSettingsEvent;
import com.bookmap.api.rpc.server.data.utils.EventConverter;

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class BroadcastingSettingsConverter implements EventConverter<BroadcastingSettingsEvent, String> {
@Inject
BroadcastingSettingsConverter() {}

@Override
public String convert(BroadcastingSettingsEvent entity) {
return entity.type.code +
FIELDS_DELIMITER +
entity.generatorName +
FIELDS_DELIMITER +
entity.event;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.bookmap.api.rpc.server.data.outcome.converters.modules;

import com.bookmap.api.rpc.server.data.outcome.converters.BroadcastingSettingsConverter;
import com.bookmap.api.rpc.server.data.utils.AbstractEvent;
import com.bookmap.api.rpc.server.data.utils.EventConverter;
import com.bookmap.api.rpc.server.data.utils.EventTypeMapKey;
import com.bookmap.api.rpc.server.data.utils.Type;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;

@Module
public abstract class BroadcastingSettingsConverterModule {

@Binds
@IntoMap
@EventTypeMapKey(Type.BROADCASTING_SETTINGS)
abstract EventConverter<? extends AbstractEvent, String> converter(BroadcastingSettingsConverter converter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public enum Type {
BROADCASTING(29),
REGISTER_BROADCASTING_PROVIDER(30),
PROVIDERS_STATUS(31),
BROADCASTING_SETTINGS(32),
ERROR(-1),
UNKNOWN(-2147483648);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
modules = {
BalanceConverterModule.class,
BroadcastingConverterModule.class,
BroadcastingSettingsConverterModule.class,
DepthDataConverterModule.class,
ErrorEventConverterModule.class,
IndicatorResponseConverterModule.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.bookmap.api.rpc.server.utils;

import com.google.gson.JsonObject;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class JsonUtil {
private static final Map<Class<?>, Field[]> classToFields = new ConcurrentHashMap<>();

public static String convertObjectToJsonString(Object o) throws IllegalAccessException {
JsonObject jsonObject = new JsonObject();
Class<?> clazz = o.getClass();
if (classToFields.containsKey(clazz)) {
Field[] fields = classToFields.get(clazz);
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
Object fieldValue = field.get(o);
jsonObject.addProperty(fieldName, fieldValue.toString());
}
} else {
Field[] fields = clazz.getDeclaredFields();
List<Field> fieldNames = new ArrayList<>();
for (Field field : fields) {
field.setAccessible(true);

String fieldName = field.getName();
if (fieldName.equals("serialVersionUID")) {
continue;
}
fieldNames.add(field);
Object fieldValue = field.get(o);
jsonObject.addProperty(fieldName, fieldValue.toString());
}
classToFields.put(clazz, fieldNames.toArray(new Field[0]));
}

return jsonObject.toString();
}
}
1 change: 1 addition & 0 deletions serverside-rpc/src/main/resources/bookmap/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
add_on_position_update_handler,\
add_broadcasting_handler, \
add_broadcasting_provider_status_handler, \
add_broadcasting_settings_handler, \
create_order_book, \
on_depth, \
get_bbo, \
Expand Down
10 changes: 10 additions & 0 deletions serverside-rpc/src/main/resources/bookmap/bookmap.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
BROADCASTING = "29"
REGISTER_BROADCASTING_PROVIDER = "30"
PROVIDERS_STATUS = "31"
BROADCASTING_SETTINGS = "32"
ERROR = "-1"

counter_lock = threading.Lock()
Expand Down Expand Up @@ -285,6 +286,8 @@ def _get_parameters_from_msg(type_token: str, msg: str):
return tokens[1], json.loads(tokens[2])
elif type_token == PROVIDERS_STATUS:
return [json.loads(tokens[1])]
elif type_token == BROADCASTING_SETTINGS:
return tokens[1], json.loads(tokens[2])
else:
# default case when there should not be any parameter parsing, but instead the msg should be sent to a server
return type_token, msg
Expand Down Expand Up @@ -722,6 +725,13 @@ def add_broadcasting_provider_status_handler(
_add_event_handler(addon, PROVIDERS_STATUS, handler)


def add_broadcasting_settings_handler(
addon: typing.Dict[str, object],
handler: typing.Callable[[str, object], None]
) -> None:
_add_event_handler(addon, BROADCASTING_SETTINGS, handler)


################ Util objects
### Order book
def create_order_book() -> typing.Dict[str, SortedDict]:
Expand Down