{
}
public void methodReceived(AMQStateManager stateManager, ChannelOpenBody body, int channelId) throws AMQException
{
AMQProtocolSession session = stateManager.getProtocolSession();
VirtualHost virtualHost = session.getVirtualHost();
// Protect the broker against out of order frame request.
if (virtualHost == null)
{
throw new AMQException(AMQConstant.COMMAND_INVALID, "Virtualhost has not yet been set. ConnectionOpen has not been called.", null);
}
_logger.info("Connecting to: " + virtualHost.getName());
final AMQChannel channel = new AMQChannel(session,channelId, virtualHost.getMessageStore());
session.addChannel(channel);
ChannelOpenOkBody response;
ProtocolVersion pv = session.getProtocolVersion();
if(pv.equals(ProtocolVersion.v8_0))
{
MethodRegistry_8_0 methodRegistry = (MethodRegistry_8_0) MethodRegistry.getMethodRegistry(ProtocolVersion.v8_0);
response = methodRegistry.createChannelOpenOkBody();
}
else if(pv.equals(ProtocolVersion.v0_9))
{
MethodRegistry_0_9 methodRegistry = (MethodRegistry_0_9) MethodRegistry.getMethodRegistry(ProtocolVersion.v0_9);
UUID uuid = UUID.randomUUID();
ByteArrayOutputStream output = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(output);
try
{
dataOut.writeLong(uuid.getMostSignificantBits());
dataOut.writeLong(uuid.getLeastSignificantBits());
dataOut.flush();
dataOut.close();
}
catch (IOException e)
{
// This *really* shouldn't happen as we're not doing any I/O
throw new RuntimeException("I/O exception when writing to byte array", e);
}
// should really associate this channelId to the session
byte[] channelName = output.toByteArray();
response = methodRegistry.createChannelOpenOkBody(channelName);
}
else if(pv.equals(ProtocolVersion.v0_91))
{
MethodRegistry_0_91 methodRegistry = (MethodRegistry_0_91) MethodRegistry.getMethodRegistry(ProtocolVersion.v0_91);
UUID uuid = UUID.randomUUID();
ByteArrayOutputStream output = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(output);
try
{
dataOut.writeLong(uuid.getMostSignificantBits());
dataOut.writeLong(uuid.getLeastSignificantBits());
dataOut.flush();
dataOut.close();
}
catch (IOException e)
{
// This *really* shouldn't happen as we're not doing any I/O
throw new RuntimeException("I/O exception when writing to byte array", e);
}
// should really associate this channelId to the session
byte[] channelName = output.toByteArray();
response = methodRegistry.createChannelOpenOkBody(channelName);
}
else
{
throw new AMQException(AMQConstant.INTERNAL_ERROR, "Got channel open for protocol version not catered for: " + pv, null);
}
session.writeFrame(response.generateFrame(channelId));
}