package envoy.server.net; import java.io.*; import java.lang.reflect.ParameterizedType; import java.util.Set; import java.util.logging.*; import com.jenkov.nioserver.*; import envoy.util.EnvoyLog; import envoy.server.processors.ObjectProcessor; /** * Handles incoming objects. * * @author Kai S. K. Engelbart * @since Envoy Server Standalone v0.1-alpha */ public final class ObjectMessageProcessor implements IMessageProcessor { private final Set> processors; private static final Logger logger = EnvoyLog.getLogger(ObjectMessageProcessor.class); /** * The constructor to set the {@link ObjectProcessor}s. * * @param processors the {@link ObjectProcessor} to set * @since Envoy Server Standalone v0.1-alpha */ public ObjectMessageProcessor(Set> processors) { this.processors = processors; } @SuppressWarnings("unchecked") @Override public void process(Message message, WriteProxy writeProxy) { try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(message.sharedArray, message.offset + 4, message.length - 4))) { Object obj = in.readObject(); if (obj == null) { logger.warning("Received a null object"); return; } logger.fine("Received " + obj); // Get processor and input class and process object for (@SuppressWarnings("rawtypes") ObjectProcessor p : processors) { Class c = (Class) ((ParameterizedType) p.getClass().getGenericInterfaces()[0]) .getActualTypeArguments()[0]; if (c.equals(obj.getClass())) try { p.process(c.cast(obj), message.socketId, new ObjectWriteProxy(writeProxy)); break; } catch (IOException e) { logger.log(Level.SEVERE, "Exception during processor execution: ", e); } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }