/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.systest.jaxrs;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.jms.BytesMessage;
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.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.QueryParam;
import javax.ws.rs.WebApplicationException;
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 org.apache.cxf.testutil.common.EmbeddedJMSBrokerLauncher;
@Path("/bookstore")
public class JMSBookStore {
@javax.ws.rs.core.Context
private ProtocolHeaders headers;
private Map<Long, Book> books = new HashMap<>();
public JMSBookStore() {
books.put(123L, new Book("CXF JMS Rocks", 123L));
}
@GET
@Path("/bookidarray")
@Produces("application/xml")
public Book getBookByURLQuery(@QueryParam("id") String[] ids) throws Exception {
if (ids == null || ids.length != 3) {
throw new WebApplicationException();
}
return doGetBook(ids[0] + ids[1] + ids[2]);
}
@GET
@Path("/books/{bookId}/")
@Produces("application/xml")
public Book getBook(@PathParam("bookId") String id) throws BookNotFoundFault {
return doGetBook(id);
}
@Path("/booksubresource/{bookId}/")
public Book getBookSubResource(@PathParam("bookId") String id) throws BookNotFoundFault {
return doGetBook(id);
}
private Book doGetBook(String id) throws BookNotFoundFault {
Book book = books.get(Long.parseLong(id));
if (book != null) {
return book;
} else {
BookNotFoundDetails details = new BookNotFoundDetails();
details.setId(Long.parseLong(id));
throw new BookNotFoundFault(details);
}
}
@POST
@Path("/books")
@Produces("text/xml")
@Consumes("application/xml")
public Response addBook(Book book) {
String ct1 = headers.getRequestHeaderValue("Content-Type");
String ct2 = headers.getRequestHeader("Content-Type").get(0);
String ct3 = headers.getRequestHeaders().getFirst("Content-Type");
if (!("application/xml".equals(ct1) && ct1.equals(ct2) && ct1.equals(ct3))) {
throw new RuntimeException("Unexpected content type");
}
if (!"custom.value".equals(headers.getRequestHeaderValue("custom.protocol.header"))) {
throw new RuntimeException("Custom header is not set");
}
book.setId(124);
books.put(book.getId(), book);
return Response.ok(book).build();
}
@PUT
@Path("/oneway")
@Consumes()
@Oneway
public void onewayRequest(Book book) throws Exception {
Context ctx = getContext();
ConnectionFactory factory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Destination replyToDestination = (Destination)ctx.lookup("dynamicQueues/test.jmstransport.response");
Connection connection = null;
try {
connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
postOneWayBook(session, replyToDestination, book);
session.close();
} finally {
try {
if (connection != null) {
connection.stop();
connection.close();
}
} catch (JMSException ex) {
// ignore
}
}
}
private Context getContext() throws Exception {
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "tcp://localhost:" + EmbeddedJMSBrokerLauncher.PORT);
return new InitialContext(props);
}
private void postOneWayBook(Session session, Destination destination, Book book)
throws Exception {
MessageProducer producer = session.createProducer(destination);
BytesMessage message = session.createBytesMessage();
message.writeBytes(writeBook(book));
producer.send(message);
producer.close();
}
private byte[] 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.toByteArray();
}
}