summaryrefslogtreecommitdiffstats
path: root/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java')
-rw-r--r--daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java b/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java
new file mode 100644
index 0000000..d2cfb21
--- /dev/null
+++ b/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java
@@ -0,0 +1,66 @@
+package org.openslx.taskmanager.network;
+
+import java.nio.charset.StandardCharsets;
+
+import org.apache.log4j.Logger;
+import org.openslx.taskmanager.api.TaskStatus;
+import org.openslx.taskmanager.main.Taskmanager;
+
+import com.google.gson.Gson;
+
+public class RequestParser
+{
+ private static final Logger log = Logger.getLogger( RequestParser.class );
+
+ /**
+ * Our very own gson instance (for serializing replies)
+ */
+ private static final Gson sendGson = new Gson();
+
+ /**
+ * Handle the given unparsed request.
+ *
+ * @param source source of the request, where the reply will be send to (if any)
+ * @param payload Packet data received from network, already converted to a string
+ */
+ public static byte[] handle( String payload )
+ {
+ String[] parts = payload.split( " *, *", 3 );
+ // Message format is "<message id>, <command>, <command payload/argument>"
+ if ( parts.length != 3 ) {
+ log.debug( "Could not split message" );
+ return null;
+ }
+ // Look at parts[1], if it's "status" it's a request for the task
+ // with the ID given in parts[2]
+ if ( parts[1].equals( "status" ) ) {
+ TaskStatus status = Taskmanager.getTaskStatus( parts[2] );
+ return serialize( parts[0], status );
+ }
+ // Now check if parts[1] is "release"
+ if ( parts[1].equals( "release" ) ) {
+ Taskmanager.releaseTask( parts[2] );
+ return null;
+ }
+ // Anything else in parts[0] will be treated as a fresh task invocation, so let's
+ // pass it on to the task manager.
+ TaskStatus status = Taskmanager.submitTask( parts[1], parts[2] );
+ return serialize( parts[0], status );
+ }
+
+ private static byte[] serialize( String messageId, TaskStatus status )
+ {
+ String data;
+ try {
+ synchronized ( sendGson ) {
+ data = sendGson.toJson( status );
+ }
+ } catch ( Throwable e ) {
+ log.warn( "Could not serialize reply with TaskStatus " + status.getStatusObjectClassName() );
+ log.warn( e.toString() );
+ return null;
+ }
+ return ( messageId + ',' + data ).getBytes( StandardCharsets.UTF_8 );
+ }
+
+}