import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import uk.ac.ntu.n0521366.wsyd.libs.message.MessageAbstract;
/**
*/
long _key;
- // Class<?> _class;
+ /**
+ * A concrete message sub-class.
+ */
MessageAbstract _message;
+ /**
+ * Sending service unique (random) ID provides loopback detection.
+ */
+ public int _sendersUniqueID;
+
+ /**
+ * The sending host information tagged on by the receiving service.
+ *
+ * This information is needed to ensure the ServiceAddressMap is accurate. It cannot be easily
+ * gotten from the sender since services there are usually bound to wildcard IP addresses and
+ * cannot get the IP of the interface the message is sent from.
+ */
+ WSYD_SocketAddress _receivedFrom;
+
/**
* Default constructor.
*/
_intent = null;
_serviceSender = null;
_serviceTarget = null;
- // _class = null;
_message = null;
+ _receivedFrom = null;
}
/**
*/
@Override
public String toString() {
- return new String("_serializedLength:" + _serializeLength +
- ",_intent:" + _intent +
- ",_serviceSender:" + _serviceSender +
- ",_serviceTarget:" + _serviceTarget +
- ",_message:" + _message.toString()
- );
+ return "_serializedLength:" + _serializeLength +
+ ",_intent:" + _intent +
+ ",_serviceSender:" + _serviceSender +
+ ",_serviceTarget:" + _serviceTarget +
+ ",_message:" + (_message != null ? _message.toString() : "") +
+ ", receivedFrom:" + (_receivedFrom != null ? _receivedFrom.toString() : "");
}
/**
* Create a message for passing over the network.
return _key;
}
+ /**
+ * get the sender details tagged on by the receiving service.
+ * @return the sender's address, port, and protocol
+ */
+ public WSYD_SocketAddress getReceivedFrom() {
+ return _receivedFrom;
+ }
/**
* Create a message for passing over the network.
*
if (! (message instanceof Serializable))
throw new CloneNotSupportedException();
- try {
- result = deserialize(serialize(message));
- } catch (IOException | ClassNotFoundException e) {
- throw new CloneNotSupportedException();
- }
-
- return result;
+ byte[] temp = serialize(message);
+ return deserialize(temp);
}
/**
*
* @param message
* @return the message as an array of bytes
- * @throws IOException
*/
- public static byte[] serialize(NetworkMessage message) throws IOException {
+ public static byte[] serialize(NetworkMessage message) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(message);
- byte[] bytes = baos.toByteArray();
- message.setSerializeLength(bytes.length);
- return bytes;
+ ObjectOutputStream oos;
+ try {
+ oos = new ObjectOutputStream(baos);
+ oos.writeObject(message);
+ byte[] bytes = baos.toByteArray();
+ message.setSerializeLength(bytes.length);
+ return bytes;
+ } catch (IOException ex) {
+ Logger.getLogger(NetworkMessage.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return null;
}
/**
- * Deserialize raw data into a NetworkMessage.
+ * Deserialize a number of raw bytes into a NetworkMessage.
*
* @param bytes raw bytes
+ * @param length number of bytes in buffer that should be treated as a serialized object
+ * @return the NetworkMessage object
+ */
+ public static NetworkMessage deserialize(byte[] bytes, int length) {
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes, 0, length);
+ ObjectInputStream ois;
+ try {
+ ois = new ObjectInputStream(bais);
+ int bytesAvailable = bais.available();
+ NetworkMessage temp = (NetworkMessage) ois.readObject();
+ int bytesRead = bytesAvailable - bais.available();
+ temp.setSerializeLength(bytesRead);
+ return temp;
+ } catch (IOException | ClassNotFoundException ex) {
+ Logger.getLogger(NetworkMessage.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return null;
+ }
+
+ /**
+ * Deserialize raw bytes into a NetworkMessage.
+ *
+ * @param bytes ray bytes
* @return the NetworkMessage object
- * @throws IOException
- * @throws ClassNotFoundException
*/
- public static NetworkMessage deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
- ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
- ObjectInputStream ois = new ObjectInputStream(bais);
- NetworkMessage temp = (NetworkMessage) ois.readObject();
- temp.setSerializeLength(bytes.length);
- return temp;
+ public static NetworkMessage deserialize(byte[] bytes) {
+ return deserialize(bytes, bytes.length);
}
}