/**
* Copyright (C) 2010 Talend Inc. - www.talend.com
*/
package service.books;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.apache.cxf.jaxrs.ext.Oneway;
import org.apache.cxf.jaxrs.ext.ProtocolHeaders;
import common.books.Book;
@Path("/")
@Produces({"text/xml", "application/xml" })
@Consumes({"text/xml", "application/xml" })
public class JMSHttpBookStore {
@javax.ws.rs.core.Context
private ProtocolHeaders context;
private Map<Long, Book> books = new HashMap<Long, Book>();
public JMSHttpBookStore() {
books.put(123L, new Book("JMS and HTTP Transport in CXF JAX-RS", 123L));
}
@GET
@Path("{bookId}")
public Book getBook(@PathParam("bookId") Long id) {
return books.get(id);
}
@POST
public Response addBook(Book book) {
book.setId(124);
books.put(book.getId(), book);
return Response.ok(book).build();
}
@PUT
@Oneway
public void oneWayRequest(Book book) throws Exception {
//printRequestTransport();
Connection connection = null;
try {
Context ctx = getContext();
ConnectionFactory factory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Destination replyToDestination = (Destination)ctx.lookup("dynamicQueues/test.jmstransport.response");
connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
postOneWayBook(session, replyToDestination, book);
session.close();
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
try {
if (connection != null) {
connection.stop();
connection.close();
}
} catch (JMSException ex) {
// ignore
}
}
}
private Context getContext() throws Exception {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
return new InitialContext(props);
} finally {
Thread.currentThread().setContextClassLoader(loader);
}
}
private void postOneWayBook(Session session, Destination destination, Book book)
throws Exception {
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage();
message.setText(writeBook(book));
producer.send(message);
producer.close();
}
private String writeBook(Book b) throws Exception {
JAXBContext c = JAXBContext.newInstance(new Class[]{Book.class});
Marshaller m = c.createMarshaller();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
m.marshal(b, bos);
return bos.toString();
}
private void printRequestTransport() {
if (context.getRequestHeaderValue("JMSMessageType") != null) {
System.out.println("It is the JMS Request");
} else {
System.out.println("It is the HTTP Request");
}
}
}