com.liferay.portal.kernel.nio.intraband.messaging.MessageRoutingBag Maven / Gradle / Ivy
/**
* Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.nio.intraband.messaging;
import com.liferay.portal.kernel.io.Deserializer;
import com.liferay.portal.kernel.io.Serializer;
import com.liferay.portal.kernel.messaging.Message;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
* @author Shuyang Zhou
*/
public class MessageRoutingBag implements Externalizable {
public static final String MESSAGE_ROUTING_BAG = "MESSAGE_ROUTING_BAG";
public static MessageRoutingBag fromByteArray(byte[] data)
throws ClassNotFoundException {
MessageRoutingBag messageRoutingBag = new MessageRoutingBag();
Deserializer deserializer = new Deserializer(ByteBuffer.wrap(data));
messageRoutingBag._destinationName = deserializer.readString();
messageRoutingBag._messageData = deserializer.readObject();
messageRoutingBag._routingDowncast = deserializer.readBoolean();
messageRoutingBag._routingTrace = deserializer.readObject();
messageRoutingBag._synchronizedBridge = deserializer.readBoolean();
return messageRoutingBag;
}
public MessageRoutingBag() {
}
public MessageRoutingBag(Message message, boolean synchronizedBridge) {
_destinationName = message.getDestinationName();
_message = message;
_synchronizedBridge = synchronizedBridge;
}
public void appendRoutingId(String routingId) {
_routingTrace.add(routingId);
}
public String getDestinationName() {
return _destinationName;
}
public Message getMessage() throws ClassNotFoundException {
if (_message == null) {
_message = Message.fromByteArray(_messageData);
_message.put(MESSAGE_ROUTING_BAG, this);
_messageData = null;
}
return _message;
}
public byte[] getMessageData() {
if (_messageData == null) {
_message.remove(MESSAGE_ROUTING_BAG);
try {
_messageData = _message.toByteArray();
}
finally {
_message.put(MESSAGE_ROUTING_BAG, this);
_message = null;
}
}
return _messageData;
}
public boolean isRoutingDowncast() {
return _routingDowncast;
}
public boolean isSynchronizedBridge() {
return _synchronizedBridge;
}
public boolean isVisited(String routingId) {
return _routingTrace.contains(routingId);
}
@Override
public void readExternal(ObjectInput objectInput)
throws ClassNotFoundException, IOException {
_destinationName = objectInput.readUTF();
_messageData = (byte[])objectInput.readObject();
_routingDowncast = objectInput.readBoolean();
_routingTrace = (ArrayList)objectInput.readObject();
_synchronizedBridge = objectInput.readBoolean();
}
public void setMessage(Message message) {
_message = message;
message.put(MESSAGE_ROUTING_BAG, this);
}
public void setRoutingDowncast(boolean routingDowncast) {
_routingDowncast = routingDowncast;
}
public byte[] toByteArray() {
Serializer serializer = new Serializer();
serializer.writeString(_destinationName);
serializer.writeObject(getMessageData());
serializer.writeBoolean(_routingDowncast);
serializer.writeObject(_routingTrace);
serializer.writeBoolean(_synchronizedBridge);
ByteBuffer byteBuffer = serializer.toByteBuffer();
return byteBuffer.array();
}
@Override
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeUTF(_destinationName);
objectOutput.writeObject(getMessageData());
objectOutput.writeBoolean(_routingDowncast);
objectOutput.writeObject(_routingTrace);
objectOutput.writeBoolean(_synchronizedBridge);
}
private String _destinationName;
private Message _message;
private byte[] _messageData;
private boolean _routingDowncast;
private ArrayList _routingTrace = new ArrayList();
private boolean _synchronizedBridge;
}