/** * 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.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; 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.Link; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import javax.xml.stream.XMLStreamException; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.staxutils.DepthExceededStaxException; import org.apache.cxf.staxutils.StaxUtils; @Path("/") @Produces("application/json") public class BookStoreSpring { private Map<Long, Book> books = new HashMap<>(); private Long mainId = 123L; @Context private UriInfo ui; private boolean postConstructCalled; public BookStoreSpring() { init(); //System.out.println("----books: " + books.size()); } @PostConstruct public void postConstruct() { postConstructCalled = true; } @PreDestroy public void preDestroy() { //System.out.println("PreDestroy called"); } @POST @Path("/bookform") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces("application/xml") public Book echoBookForm(@Context HttpServletRequest req) { String name = req.getParameter("name"); long id = Long.valueOf(req.getParameter("id")); return new Book(name, id); } @POST @Path("/bookform2") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces("application/xml") public Book echoBookForm2(@Context HttpServletRequest req) { String name = req.getParameterValues("name")[0]; long id = Long.valueOf(req.getParameter("id")); return new Book(name, id); } @POST @Path("/bookform3") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces("application/xml") public Book echoBookForm3(@Context HttpServletRequest req) { String name = req.getParameterMap().get("name")[0]; long id = Long.valueOf(req.getParameter("id")); return new Book(name, id); } @POST @Path("/bookform4") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces("application/xml") public Book echoBookForm4(@Context HttpServletRequest req) { String key = req.getParameterNames().nextElement(); String name = req.getParameter(key); long id = Long.valueOf(req.getParameter("id")); return new Book(name, id); } @POST @Path("/bookform5") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces("application/xml") public Book echoBookForm5(@Context HttpServletRequest req, @FormParam("id") Long formId) { String name = req.getParameter("name"); long id = Long.valueOf(req.getParameter("id")); if (id != formId) { throw new WebApplicationException(); } return new Book(name, id); } @POST @Path("/bookform") @Consumes("application/xml") @Produces("application/xml") public String echoBookFormXml(@Context HttpServletRequest req) throws IOException { InputStream is = req.getInputStream(); return IOUtils.readStringFromStream(is); } @GET @Path("/books/webex") public Books getBookWebEx() { throw new WebApplicationException(new RuntimeException("Book web exception")); } @GET @Path("/books/redirectStart") public Book getBookRedirectStart() { return new Book("Redirect start", 123L); } @GET @Path("/link") public Response getBookLink() { URI selfUri = ui.getBaseUriBuilder().path(BookStoreSpring.class).build(); Link link = Link.fromUri(selfUri).rel("self").build(); return Response.ok().links(link).build(); } @GET @Path("/books/redirectComplete") public Book getBookRedirectComplete(@Context HttpServletRequest request) { Book book = (Book)request.getAttribute(Book.class.getSimpleName().toLowerCase()); book.setName("Redirect complete: " + request.getRequestURI()); return book; } @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)); } @GET @Path("/books/xsitype") @Produces("application/xml") public Book getBookXsiType() { return new SuperBook("SuperBook", 999L, true); } @GET @Path("/books/text") @Produces("text/*") public String getBookText() { return "SuperBook"; } @SuppressWarnings("unchecked") @GET @Path("/books/superbook") @Produces("application/json") public <T extends Book> T getSuperBookJson() { return (T)new SuperBook("SuperBook", 999L, true); } @SuppressWarnings("unchecked") @GET @Path("/books/superbooks") @Produces("application/json") public <T extends Book> List<T> getSuperBookCollectionJson() { SuperBook book = new SuperBook("SuperBook", 999L, true); return Collections.singletonList((T)book); } @POST @Path("/books/superbook") @Consumes("application/json") @Produces("application/json") public <T extends Book> T echoSuperBookJson(T book) { if (((SuperBook)book).isSuperBook()) { return book; } throw new WebApplicationException(400); } @POST @Path("/books/superbooks") @Consumes("application/json") @Produces("application/json") public <T extends Book> List<T> echoSuperBookCollectionJson(List<T> book) { if (((SuperBook)book.get(0)).isSuperBook()) { return book; } throw new WebApplicationException(400); } @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("/ISO-8859-1/1") @Produces({"application/json;charset=ISO-8859-1", "application/xml;charset=ISO-8859-1" }) public Book getBookISO() throws Exception { String eWithAcute = "\u00E9"; String helloStringUTF16 = "F" + eWithAcute + "lix"; byte[] iso88591bytes = helloStringUTF16.getBytes("ISO-8859-1"); String helloStringISO88591 = new String(iso88591bytes, "ISO-8859-1"); return new Book(helloStringISO88591, 333L); } @GET @Path("/ISO-8859-1/2") @Produces({"application/json", "application/xml" }) public Book getBookISO2() throws Exception { return getBookISO(); } @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 (XMLStreamException ex) { if (ex.getMessage().startsWith("Maximum Number")) { throw new WebApplicationException(413); } } 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; } @RETRIEVE @Path("books/aegis/retrieve") @Produces({"application/html;q=0.5", "application/xml;q=1.0", "application/json;q=0.5" }) public Book getBookAegisRetrieve() { return getBookAegis(); } @RETRIEVE_get @Path("books/aegis/retrieve/get") @Produces({"application/html;q=0.5", "application/xml;q=1.0", "application/json;q=0.5" }) public Book getBookAegisRetrieveGet() { return getBookAegis(); } @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); } }