summaryrefslogtreecommitdiffstats
path: root/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java
diff options
context:
space:
mode:
Diffstat (limited to 'simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java')
-rw-r--r--simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java126
1 files changed, 126 insertions, 0 deletions
diff --git a/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java b/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java
new file mode 100644
index 0000000..0c4ec4d
--- /dev/null
+++ b/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/WebSocketTableUpdater.java
@@ -0,0 +1,126 @@
+package org.simpleframework.http.socket.table;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.simpleframework.http.socket.Session;
+import org.simpleframework.http.socket.FrameChannel;
+import org.simpleframework.http.socket.WebSocketAnalyzer;
+import org.simpleframework.http.socket.service.Service;
+import org.simpleframework.transport.trace.TraceAnalyzer;
+
+public class WebSocketTableUpdater extends Thread implements Service {
+
+ private final Set<WebSocketTableSubscription> subscriptions;
+ private final WebSocketTableListener listener;
+ private final WebSocketTableRowChanger changer;
+ private final WebSocketTableSweeper sweeper;
+ private final WebSocketTable table;
+ private final AtomicLong time;
+
+ public WebSocketTableUpdater(String key, WebSocketTableSchema schema, WebSocketTableRowAnnotator annotator) {
+ this.subscriptions = new CopyOnWriteArraySet<WebSocketTableSubscription>();
+ this.table = new WebSocketTable(key, schema, annotator);
+ this.sweeper = new WebSocketTableSweeper(table);
+ this.changer = new WebSocketTableRowChanger(table);
+ this.listener = new WebSocketTableListener(this);
+ this.time = new AtomicLong();
+ }
+
+ public void refresh(Session session) {
+ for(WebSocketTableSubscription subscription : subscriptions) {
+ FrameChannel socket = subscription.getSocket();
+ FrameChannel other = session.getChannel();
+
+ if(socket == other) {
+ AtomicLong timeStamp = subscription.getTimeStamp();
+ timeStamp.set(0);
+ }
+ }
+ }
+
+ public void run() {
+ changer.start();
+
+ while(true) {
+ try {
+ Thread.sleep(200);
+
+ for(WebSocketTableSubscription subscription : subscriptions) {
+ FrameChannel socket = subscription.getSocket();
+ AtomicLong timeStamp = subscription.getTimeStamp();
+ AtomicLong sendCount = subscription.getSendCount();
+ long before = System.currentTimeMillis();
+ long time = timeStamp.get();
+ long count = sendCount.get();
+
+ try {
+ Map<WebSocketTableUpdateType, String> messages = sweeper.sweep(time - 1000, count);
+ Set<WebSocketTableUpdateType> updates = messages.keySet();
+
+ for(WebSocketTableUpdateType update : updates) {
+ String message = messages.get(update);
+
+ if(message != null) {
+ socket.send(update.code + message);
+ }
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ subscriptions.remove(subscription);
+ socket.close();
+ } finally {
+ sendCount.getAndIncrement();
+ timeStamp.set(before);
+ }
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void connect(Session connection) {
+ FrameChannel socket = connection.getChannel();
+
+ try {
+ WebSocketTableSubscription subscription = new WebSocketTableSubscription(socket);
+
+ socket.register(listener);
+ subscriptions.add(subscription);
+ time.set(0);
+ Thread.sleep(1000); // crap
+ time.set(0);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void main(String[] list) throws Exception {
+ TraceAnalyzer agent = new WebSocketAnalyzer();
+ Map<String, WebSocketTableColumnStyle> columns = new LinkedHashMap<String, WebSocketTableColumnStyle>();
+
+ WebSocketTableSchema schema = new WebSocketTableSchema(columns);
+ columns.put("id", new WebSocketTableColumnStyle("id", "Id", "{id}", true, true));
+ columns.put("bidOutrightVolume", new WebSocketTableColumnStyle("bidOutrightVolume", "$ B", "<div style='font-weight: bold; color: #0000ff; text-decoration: underline;'>{bidOutrightVolume}</a>", true, false));
+ columns.put("bidOutright", new WebSocketTableColumnStyle("bidOutright", "Bid", "<div style='font-weight: bold; color: #0000ff; text-decoration: underline;'>{bidOutright}</a>", true, false));
+ columns.put("offerOutright", new WebSocketTableColumnStyle("offerOutright", "Offer", "<div style='font-weight: bold; color: #ff0000; text-decoration: underline;'>{offerOutright}</a>", true, false));
+ columns.put("offerOutrightVolume", new WebSocketTableColumnStyle("offerOutrightVolume", "$ O", "<div style='font-weight: bold; color: #ff0000; text-decoration: underline;'>{offerOutrightVolume}</a>", true, false));
+ columns.put("product", new WebSocketTableColumnStyle("product", "Security", "<div style='font-weight: bold;'>{product}</div>", true, true));
+ columns.put("bidEFPVolume", new WebSocketTableColumnStyle("bidEFPVolume", "$ B", "<div style='font-weight: bold; color: #0000ff; text-decoration: underline;'>{bidEFPVolume}</a>", true, false));
+ columns.put("bidEFP", new WebSocketTableColumnStyle("bidEFP", "Bid", "<div style='font-weight: bold; color: #0000ff; text-decoration: underline;'>{bidEFP}</a>", true, false));
+ columns.put("offerEFP", new WebSocketTableColumnStyle("offerEFP", "Offer", "<div style='font-weight: bold; color: #ff0000; text-decoration: underline;'>{offerEFP}</a>", true, false));
+ columns.put("offerEFPVolume", new WebSocketTableColumnStyle("offerEFPVolume", "$ O", "<div style='font-weight: bold; color: #ff0000; text-decoration: underline;'>{offerEFPVolume}</a>", true, false));
+ columns.put("reference", new WebSocketTableColumnStyle("reference", "Ref", "{reference}", true, true));
+ WebSocketTableRowAnnotator annotator = new WebSocketTableRowAnnotator(schema);
+ WebSocketTableUpdater application = new WebSocketTableUpdater("product", schema, annotator);
+
+ WebSocketTableUpdaterApplication container = new WebSocketTableUpdaterApplication(application, agent, 6060);
+ application.start();
+ container.connect();
+ }
+} \ No newline at end of file