2020-01-03 15:40:43 +01:00
|
|
|
package envoy.server.net;
|
2019-12-28 14:48:39 +01:00
|
|
|
|
2020-09-25 14:29:23 +02:00
|
|
|
import java.io.*;
|
2020-07-25 17:29:32 +02:00
|
|
|
import java.lang.reflect.ParameterizedType;
|
2019-12-30 14:53:40 +01:00
|
|
|
import java.util.Set;
|
2020-09-25 14:29:23 +02:00
|
|
|
import java.util.logging.*;
|
2019-12-28 14:48:39 +01:00
|
|
|
|
2020-09-25 14:29:23 +02:00
|
|
|
import com.jenkov.nioserver.*;
|
2019-12-28 14:48:39 +01:00
|
|
|
|
2020-06-11 12:06:06 +02:00
|
|
|
import envoy.util.EnvoyLog;
|
2020-01-03 15:40:43 +01:00
|
|
|
|
2020-10-18 15:16:46 +02:00
|
|
|
import envoy.server.processors.ObjectProcessor;
|
|
|
|
|
2019-12-28 14:48:39 +01:00
|
|
|
/**
|
2020-09-25 14:29:23 +02:00
|
|
|
* Handles incoming objects.
|
2019-12-30 15:15:25 +01:00
|
|
|
*
|
2019-12-28 14:48:39 +01:00
|
|
|
* @author Kai S. K. Engelbart
|
2019-12-29 10:09:26 +01:00
|
|
|
* @since Envoy Server Standalone v0.1-alpha
|
2019-12-28 14:48:39 +01:00
|
|
|
*/
|
2020-08-22 13:37:07 +02:00
|
|
|
public final class ObjectMessageProcessor implements IMessageProcessor {
|
2019-12-28 14:48:39 +01:00
|
|
|
|
2020-01-06 13:58:28 +01:00
|
|
|
private final Set<ObjectProcessor<?>> processors;
|
2019-12-30 14:53:40 +01:00
|
|
|
|
2020-06-11 12:06:06 +02:00
|
|
|
private static final Logger logger = EnvoyLog.getLogger(ObjectMessageProcessor.class);
|
|
|
|
|
2019-12-30 15:15:25 +01:00
|
|
|
/**
|
|
|
|
* The constructor to set the {@link ObjectProcessor}s.
|
|
|
|
*
|
|
|
|
* @param processors the {@link ObjectProcessor} to set
|
|
|
|
* @since Envoy Server Standalone v0.1-alpha
|
|
|
|
*/
|
2020-10-18 15:16:46 +02:00
|
|
|
public ObjectMessageProcessor(Set<ObjectProcessor<?>> processors) {
|
|
|
|
this.processors = processors;
|
|
|
|
}
|
2019-12-30 14:53:40 +01:00
|
|
|
|
2020-02-07 09:34:02 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
2019-12-28 14:48:39 +01:00
|
|
|
@Override
|
|
|
|
public void process(Message message, WriteProxy writeProxy) {
|
2020-10-18 15:16:46 +02:00
|
|
|
try (ObjectInputStream in =
|
|
|
|
new ObjectInputStream(new ByteArrayInputStream(message.sharedArray, message.offset + 4,
|
|
|
|
message.length - 4))) {
|
|
|
|
final Object obj = in.readObject();
|
2020-02-18 16:28:32 +01:00
|
|
|
if (obj == null) {
|
2020-06-11 12:06:06 +02:00
|
|
|
logger.warning("Received a null object");
|
2020-02-18 16:28:32 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-06-11 12:06:06 +02:00
|
|
|
logger.fine("Received " + obj);
|
2019-12-30 14:53:40 +01:00
|
|
|
|
2020-07-25 17:29:32 +02:00
|
|
|
// Get processor and input class and process object
|
|
|
|
for (@SuppressWarnings("rawtypes")
|
2020-10-18 15:16:46 +02:00
|
|
|
final ObjectProcessor p : processors) {
|
|
|
|
final Class<?> c =
|
|
|
|
(Class<?>) ((ParameterizedType) p.getClass()
|
|
|
|
.getGenericInterfaces()[0]).getActualTypeArguments()[0];
|
2020-09-25 14:29:23 +02:00
|
|
|
if (c.equals(obj.getClass()))
|
2020-07-25 17:29:32 +02:00
|
|
|
try {
|
|
|
|
p.process(c.cast(obj), message.socketId, new ObjectWriteProxy(writeProxy));
|
|
|
|
break;
|
2020-10-18 15:16:46 +02:00
|
|
|
} catch (final IOException e) {
|
2020-07-25 17:29:32 +02:00
|
|
|
logger.log(Level.SEVERE, "Exception during processor execution: ", e);
|
|
|
|
}
|
|
|
|
}
|
2019-12-28 14:48:39 +01:00
|
|
|
} catch (IOException | ClassNotFoundException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
2020-03-23 22:12:27 +01:00
|
|
|
}
|