client.responded();
}
}
}
Message metaConnectReply=null;
// Do we need to wait for messages
if (transport != null)
{
metaConnectReply=transport.getMetaConnectReply();
if (metaConnectReply != null)
{
long timeout=client.getTimeout();
if (timeout < 0)
timeout=_bayeux.getTimeout();
Continuation continuation=ContinuationSupport.getContinuation(request,client);
// Get messages or wait
synchronized(client)
{
if (timeout > 0 && !client.hasNonLazyMessages() && initial && received <= 1)
{
// save state and suspend
request.setAttribute(CLIENT_ATTR,client);
request.setAttribute(TRANSPORT_ATTR,transport);
client.setContinuation(continuation);
continuation.setObject(response);
continuation.suspend(timeout);
}
continuation.reset();
}
client.setContinuation(null);
transport.setMetaConnectReply(null);
}
else if (client != null)
{
client.access();
}
}
if (client != null)
{
if (metaConnectDeliveryOnly && !metaConnect)
{
// wake up any long poll
client.resume();
}
else
{
List<Message> messages;
synchronized (client)
{
client.doDeliverListeners();
ArrayQueue<Message> clientMessages = (ArrayQueue<Message>)client.getQueue();
// Copy the messages to avoid synchronization
messages = new ArrayList<Message>(clientMessages);
// Empty client's queue
clientMessages.clear();
}
final int size=messages.size();
for (int i=0; i < size; i++)
{
final Message message=messages.get(i);
final MessageImpl mesgImpl=(message instanceof MessageImpl)?(MessageImpl)message:null;
// Can we short cut the message?
if (i == 0 && size == 1 && mesgImpl != null && _refsThreshold > 0 && metaConnectReply != null && transport instanceof JSONTransport)
{