if (destroyWhenIdle != null) deleteWhenIdle = destroyWhenIdle.booleanValue();
if (subscriptionName != null)
{
// see if this is a reconnect
QueueConsumer consumer = queueConsumers.get(subscriptionName);
if (consumer != null)
{
boolean acked = consumer instanceof AcknowledgedSubscriptionResource;
acked = !acked;
if (acked != autoAck)
{
throw new WebApplicationException(
Response.status(412).entity("Consumer already exists and ack-modes don't match.").type("text/plain").build()
);
}
Subscription sub = (Subscription) consumer;
if (sub.isDurable() != durable)
{
throw new WebApplicationException(
Response.status(412).entity("Consumer already exists and durability doesn't match.").type("text/plain").build()
);
}
Response.ResponseBuilder builder = Response.noContent();
String pathToPullSubscriptions = uriInfo.getMatchedURIs().get(0);
if (autoAck)
{
headAutoAckSubscriptionResponse(uriInfo, consumer, builder, pathToPullSubscriptions);
consumer.setSessionLink(builder, uriInfo, pathToPullSubscriptions + "/auto-ack/" + consumer.getId());
}
else
{
headAcknowledgedConsumerResponse(uriInfo, (AcknowledgedQueueConsumer) consumer, builder);
consumer.setSessionLink(builder, uriInfo, pathToPullSubscriptions + "/acknowledged/" + consumer.getId());
}
return builder.build();
}
}
else
{
subscriptionName = generateSubscriptionName();
}
ClientSession session = null;
try
{
// if this is not a reconnect, create the subscription queue
if (!subscriptionExists(subscriptionName))
{
session = sessionFactory.createSession();
if (durable)
{
session.createQueue(destination, subscriptionName, true);
}
else
{
session.createTemporaryQueue(destination, subscriptionName);
}
}
QueueConsumer consumer = createConsumer(durable, autoAck, subscriptionName, selector, timeout, deleteWhenIdle);
queueConsumers.put(consumer.getId(), consumer);
serviceManager.getTimeoutTask().add(this, consumer.getId());
UriBuilder location = uriInfo.getAbsolutePathBuilder();
if (autoAck) location.path("auto-ack");
else location.path("acknowledged");
location.path(consumer.getId());
Response.ResponseBuilder builder = Response.created(location.build());
if (autoAck)
{
QueueConsumer.setConsumeNextLink(serviceManager.getLinkStrategy(), builder, uriInfo, uriInfo.getMatchedURIs().get(0) + "/auto-ack/" + consumer.getId(), "-1");
}
else
{
AcknowledgedQueueConsumer.setAcknowledgeNextLink(serviceManager.getLinkStrategy(), builder, uriInfo, uriInfo.getMatchedURIs().get(0) + "/acknowledged/" + consumer.getId(), "-1");
}
return builder.build();
}