/**
* Copyright 2005-2016 Red Hat, Inc.
*
* Red Hat 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 io.fabric8.cxf.endpoint.jaxrs;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.MatrixParam;
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.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import org.apache.cxf.annotations.Logging;
import org.apache.cxf.staxutils.DepthExceededStaxException;
import org.apache.cxf.staxutils.StaxUtils;
@Path("/")
@Produces("application/json")
@Logging
public class BookStoreSpring {
private Map<Long, Book> books = new HashMap<Long, Book>();
private Long mainId = 123L;
@Context
private UriInfo ui;
private boolean postConstructCalled;
public BookStoreSpring() {
init();
}
@PostConstruct
public void postConstruct() {
postConstructCalled = true;
}
@PreDestroy
public void preDestroy() {
}
@GET
@Path("/books/webex")
public Books getBookWebEx() {
throw new WebApplicationException(new RuntimeException("Book web exception"));
}
@GET
@Path("/books/webex2")
public Books getBookWebEx2() {
throw new InternalServerErrorException(new RuntimeException("Book web exception"));
}
@GET
@Path("/books/list/{id}")
public Books getBookAsJsonList(@PathParam("id") Long id) {
return new Books(books.get(id));
}
@POST
@Path("/books/xsitype")
@Produces("application/xml")
@Consumes("application/xml")
public Book postGetBookXsiType(Book book) {
return book;
}
@GET
@Path("/books/{id}")
@Produces({"application/json", "application/vnd.example-com.foo+json" })
public Book getBookById(@PathParam("id") Long id) {
return books.get(id);
}
@GET
@Path("/bookstore/books/{id}")
@Produces("application/xml")
public Book getBookXml(@PathParam("id") Long id) {
return books.get(id);
}
@GET
@Path("/semicolon{id}")
@Produces("application/xml")
public Book getBookWithSemicoln(@PathParam("id") String name) {
return new Book(name, 333L);
}
@GET
@Path("/semicolon2{id}")
@Produces("application/xml")
public Book getBookWithSemicolnAndMatrixParam(@PathParam("id") String name,
@MatrixParam("a") String matrixParam) {
return new Book(name + matrixParam, 333L);
}
@GET
@Path("/bookinfo")
public Book getBookByUriInfo() throws Exception {
MultivaluedMap<String, String> params = ui.getQueryParameters();
String id = params.getFirst("param1") + params.getFirst("param2");
return books.get(Long.valueOf(id));
}
@GET
@Path("/booksquery")
public Book getBookByQuery(@QueryParam("id") String id) {
if (!postConstructCalled) {
throw new RuntimeException();
}
String[] values = id.split("\\+");
StringBuilder b = new StringBuilder();
b.append(values[0]).append(values[1]);
return books.get(Long.valueOf(b.toString()));
}
@GET
@Path("id={id}")
public Book getBookByEncodedId(@PathParam("id") String id) {
String[] values = id.split("\\+");
StringBuilder b = new StringBuilder();
b.append(values[0]).append(values[1]);
return books.get(Long.valueOf(b.toString()));
}
@GET
public Book getDefaultBook() {
return books.get(mainId);
}
@POST
@Path("depth")
@Produces({"application/xml", "application/json" })
@Consumes({"application/xml", "application/json" })
public Book echoBook(Book book) {
return book;
}
@POST
@Path("depth-source")
@Consumes({"application/xml" })
public void postSourceBook(Source source) {
try {
StaxUtils.copy(source, new ByteArrayOutputStream());
} catch (DepthExceededStaxException ex) {
throw new WebApplicationException(413);
} catch (Exception ex) {
// ignore for now
}
throw new WebApplicationException(500);
}
@POST
@Path("depth-dom")
@Consumes({"application/xml" })
public void postDomBook(DOMSource source) {
// complete
}
@POST
@Path("depth-form")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void depthForm(MultivaluedMap<String, String> map) {
}
@POST
@Path("books/convert")
@Consumes({"application/xml", "application/json", "application/vnd.example-com.foo+json" })
@Produces({"application/xml", "application/vnd.example-com.foo+json" })
public Book convertBook(Book2 book) {
// how to have Book2 populated ?
Book b = new Book();
b.setId(book.getId());
b.setName(book.getName());
return b;
}
@PUT
@Path("books/convert2/{id}")
@Consumes({"application/xml", "application/json", "application/jettison" })
@Produces("application/xml")
public Book convertBook2(Book2 book) {
return convertBook(book);
}
@GET
@Path("books/aegis")
@Produces({"application/html;q=1.0", "application/xml;q=0.5", "application/json;q=0.5" })
public Book getBookAegis() {
// how to have Book2 populated ?
Book b = new Book();
b.setId(124);
b.setName("CXF in Action - 2");
return b;
}
@GET
@Path("books/xslt/{id}")
@Produces({"text/html", "application/xhtml+xml", "application/xml" })
public Book getBookXSLT(@PathParam("id") long id,
@QueryParam("name") String name,
@MatrixParam("name2") String name2) {
// how to have Book2 populated ?
Book b = new Book();
b.setId(999);
b.setName("CXF in ");
return b;
}
final void init() {
Book book = new Book();
book.setId(mainId);
book.setName("CXF in Action");
books.put(book.getId(), book);
}
}