/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.model.internal; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import de.rcenvironment.core.communication.common.SerializationException; import de.rcenvironment.core.communication.model.NetworkMessage; import de.rcenvironment.core.communication.protocol.MessageMetaData; import de.rcenvironment.core.communication.utils.MessageUtils; /** * Abstract base class for transport-independent network messages. * * @author Robert Mischke */ public class AbstractNetworkMessage implements NetworkMessage { // TODO review private static final String METADATA_KEY_REQUEST_ID = "common.requestId"; protected MessageMetaData metaDataWrapper; private Map<String, String> metaData; private byte[] contentBytes; // cached deserialization of contentBytes private Serializable deserializedContent; public AbstractNetworkMessage() { setMetaData(new HashMap<String, String>()); } public AbstractNetworkMessage(Map<String, String> metaData) { // TODO review: the provided map is embedded/used, not cloned (for now) setMetaData(metaData); } @Override public String getMessageType() { return metaDataWrapper.getMessageType(); } @Override public byte[] getContentBytes() { return contentBytes; } /** * @param contentBytes the bytes to set as payload */ public void setContentBytes(byte[] contentBytes) { if (PayloadTestFuzzer.ENABLED) { PayloadTestFuzzer.apply(contentBytes); } this.contentBytes = contentBytes; } @Override public synchronized Serializable getDeserializedContent() throws SerializationException { if (contentBytes == null) { return null; } // lazy init / caching of deserialized form if (deserializedContent == null) { // note: this requires a deserialization context to be set for the current thread; see NodeIdentifierContextHolder class deserializedContent = MessageUtils.deserializeObject(contentBytes); } return deserializedContent; } /** * @param messageBody the message body to serialize and store * @throws SerializationException on serialization failure */ public void setContent(Serializable messageBody) throws SerializationException { setContentBytes(MessageUtils.serializeObject(messageBody)); } @Override public MessageMetaData accessMetaData() { return metaDataWrapper; } @Override public Map<String, String> accessRawMetaData() { // note: direct access, not cloned return metaData; } /** * Replaces the internal metadata map with the provided one. * * @param metaData the new map instance to use internally */ public void setMetaData(Map<String, String> metaData) { this.metaData = metaData; this.metaDataWrapper = MessageMetaData.wrap(metaData); } /** * @return the associated request id; currently unused */ public String getRequestId() { return metaDataWrapper.getValue(METADATA_KEY_REQUEST_ID); } /** * @param requestId an arbitrary id to associate with this request; currently unused */ public void setRequestId(String requestId) { metaDataWrapper.setValue(METADATA_KEY_REQUEST_ID, requestId); } }