blob: 90f23a05422bec08f5a40908d35208d4a944d43e [file] [log] [blame]
/*
* Copyright (c) 2009-2012, 2014 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.session.remote;
import org.eclipse.net4j.util.CheckUtil;
import org.eclipse.net4j.util.HexUtil;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.io.ExtendedDataInput;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.ExtendedDataOutput;
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.MessageFormat;
/**
* A message from a {@link CDORemoteSession remote session}.
*
* @author Eike Stepper
* @since 3.0
*/
public final class CDORemoteSessionMessage
{
private String type;
private Priority priority;
private byte[] data;
public CDORemoteSessionMessage(String type, Priority priority, byte[] data)
{
CheckUtil.checkArg(type, "type");
CheckUtil.checkArg(priority, "priority");
this.type = type;
this.priority = priority;
this.data = data;
}
public CDORemoteSessionMessage(String type, Priority priority)
{
this(type, priority, null);
}
public CDORemoteSessionMessage(String type, byte[] data)
{
this(type, Priority.NORMAL, data);
}
public CDORemoteSessionMessage(String type)
{
this(type, Priority.NORMAL, null);
}
public CDORemoteSessionMessage(ExtendedDataInput in) throws IOException
{
type = in.readString();
priority = Priority.values()[in.readByte()];
data = in.readByteArray();
}
public synchronized void write(ExtendedDataOutput out) throws IOException
{
out.writeString(type);
out.writeByte(priority.ordinal());
out.writeByteArray(data);
}
/**
* Returns the type of this message that enables {@link IListener message handlers} to decide whether to react on this
* message or not.
*
* @return the message type, never <code>null</code>.
*/
public String getType()
{
return type;
}
/**
* Returns the priority of this message.
*
* @return the message priority, never <code>null</code>.
*/
public Priority getPriority()
{
return priority;
}
/**
* Returns a copy of this message's data as a byte array. Thread-safety for the message data is ensured internally.
*/
public synchronized byte[] getData()
{
return copyData(data);
}
/**
* Sets the data of this message as a byte array. Thread-safety for the message data is ensured internally.
*/
public synchronized void setData(byte[] data)
{
this.data = copyData(data);
}
/**
* Returns a copy of this message's data as an extended input stream. Thread-safety for the message data is ensured
* internally, but not for the wrapping stream!
*/
public ExtendedDataInputStream getInputStream()
{
byte[] copy;
synchronized (this)
{
copy = copyData(data);
if (copy == null)
{
return null;
}
}
return new ExtendedDataInputStream(new ByteArrayInputStream(copy));
}
/**
* Sets the data of this message as an extended output stream. Thread-safety for the message data is ensured
* internally, but not for the wrapping stream!
*/
public ExtendedDataOutputStream getOutputStream()
{
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
return new ExtendedDataOutputStream(baos)
{
@Override
public void close() throws IOException
{
super.close();
setData(baos.toByteArray());
}
};
}
@Override
public String toString()
{
return MessageFormat.format("Message[type={0}, priority={1}, data={3}]", type, priority, HexUtil.bytesToHex(data));
}
private byte[] copyData(byte[] src)
{
if (src == null)
{
return null;
}
byte[] copy = new byte[src.length];
System.arraycopy(src, 0, copy, 0, src.length);
return copy;
}
/**
* Enumerates the possible {@link CDORemoteSessionMessage remote session message} priorities.
*
* @author Eike Stepper
*/
public enum Priority
{
VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH
}
}