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 ", , " 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 ); } }