From 2c73710f25fe4e5d19c15b7fb15df827dd3f3127 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 9 Nov 2016 11:03:11 -0500 Subject: [PATCH] Native Messaging WIP Signed-off-by: Bill Erickson --- src/org/evergreen_ils/hatch/MessageIO.java | 12 +++--- src/org/evergreen_ils/hatch/RequestHandler.java | 27 ++++++++++++ src/org/evergreen_ils/hatch/TestHatch.java | 57 +++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 src/org/evergreen_ils/hatch/TestHatch.java diff --git a/src/org/evergreen_ils/hatch/MessageIO.java b/src/org/evergreen_ils/hatch/MessageIO.java index bda965bb70..d24ecb0a22 100644 --- a/src/org/evergreen_ils/hatch/MessageIO.java +++ b/src/org/evergreen_ils/hatch/MessageIO.java @@ -97,11 +97,10 @@ public class MessageIO { int msgLength = bytesToInt(lenBytes); if (msgLength == 0) { - throw new IOException("Inbound message is 0 bytes. Interrupted?"); + throw new IOException( + "Inbound message is 0 bytes. I/O interrupted?"); } - logger.info("MessageReader read message length: " + msgLength); - byte[] msgBytes = new byte[msgLength]; bytesRead = System.in.read(msgBytes); @@ -112,7 +111,7 @@ public class MessageIO { String message = new String(msgBytes, "UTF-8"); - logger.info("MessageReader read message " + message); + logger.info("MessageReader read: " + message); return message; } @@ -150,7 +149,7 @@ public class MessageIO { inQueue.offer(jsonMsg); - logger.info("inQueue contains " + inQueue.size() + " messages"); + logger.finest("inQueue contains " + inQueue.size() + " messages"); } } } @@ -179,6 +178,7 @@ public class MessageIO { * Encodes and writes one message to STDOUT. */ public void writeOneMessage(String message) throws IOException { + logger.finest("MessageWriter sending: " + message); System.out.write(intToBytes(message.length())); System.out.write(message.getBytes("UTF-8")); System.out.flush(); @@ -191,8 +191,6 @@ public class MessageIO { public void run() { while (true) { - logger.info("MessageWriter waiting for outQueue message"); - try { // take() blocks the thread until a message is available diff --git a/src/org/evergreen_ils/hatch/RequestHandler.java b/src/org/evergreen_ils/hatch/RequestHandler.java index f60a6cc082..d3d1221683 100644 --- a/src/org/evergreen_ils/hatch/RequestHandler.java +++ b/src/org/evergreen_ils/hatch/RequestHandler.java @@ -3,6 +3,10 @@ package org.evergreen_ils.hatch; import org.json.*; import java.util.logging.*; +/** + * Dispatches requests received via MessageIO, sends responses back + * via MessageIO. + */ public class RequestHandler extends Thread { private MessageIO io; static final Logger logger = Hatch.getLogger(); @@ -11,6 +15,9 @@ public class RequestHandler extends Thread { io = new MessageIO(); } + /** + * Unpack a JSON request and send it to the necessary Hatch handler. + */ void dispatchRequest(JSONObject request) throws JSONException { long msgid = request.getLong("msgid"); @@ -23,6 +30,26 @@ public class RequestHandler extends Thread { boolean showDialog = request.optBoolean("showDialog"); logger.info("Received message action: " + action); + + JSONObject response = new JSONObject(); + + switch (action) { + + case "printers": + response.put("printers", + new PrintManager().getPrintersAsMaps()); + break; + + case "print": + String content = request.getString("content"); + String contentType = request.getString("contentType"); + + + default: + response.put("error", "Unknown action: " + action); + } + + io.sendMessage(response); } diff --git a/src/org/evergreen_ils/hatch/TestHatch.java b/src/org/evergreen_ils/hatch/TestHatch.java new file mode 100644 index 0000000000..73c1cf9967 --- /dev/null +++ b/src/org/evergreen_ils/hatch/TestHatch.java @@ -0,0 +1,57 @@ +package org.evergreen_ils.hatch; + +import java.util.logging.Logger; +import org.json.*; + +public class TestHatch { + static MessageIO io; + static final Logger logger = Hatch.getLogger(); + + public static void rest() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) {} + } + + public static void doSends() { + int msgId = 1; + + JSONObject obj = new JSONObject(); + obj.put("msgid", msgId++); + obj.put("action", "printers"); + io.sendMessage(obj); + + rest(); + + obj = new JSONObject(); + obj.put("msgid", msgId++); + obj.put("action", "print"); + obj.put("contentType", "text/plain"); + obj.put("content", "Hello, World!"); + io.sendMessage(obj); + + rest(); + } + + /** + * Log all received message as a JSON string + */ + public static void doReceive() { + while (true) { + JSONObject resp = io.recvMessage(); + logger.info("TestJSON:doReceive(): " + resp.toString()); + } + } + + public static void main (String[] args) { + io = new MessageIO(); + io.listen(); + + if (args.length > 0 && args[0].equals("receive")) { + doReceive(); + } else { + doSends(); + } + } +} + -- 2.11.0