OrdersResource.java
/*
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.linking.integration.app;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.glassfish.jersey.linking.Binding;
import org.glassfish.jersey.linking.ProvideLink;
import org.glassfish.jersey.linking.integration.representations.ExtendedOrder;
import org.glassfish.jersey.linking.integration.representations.Order;
import org.glassfish.jersey.linking.integration.representations.OrderPage;
import org.glassfish.jersey.linking.integration.representations.OrderRequest;
import org.glassfish.jersey.linking.integration.representations.PageLinks;
import org.glassfish.jersey.linking.integration.representations.PaymentConfirmation;
@Path("/orders")
public class OrdersResource {
@Context
private UriInfo uriInfo;
@ProvideLink(value = OrderPage.class, rel = "create")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@POST
public Response create(OrderRequest request) {
Order order = new Order();
order.setId("123");
if ("water".equalsIgnoreCase(request.getDrink())) {
order.setPrice("0.0");
} else {
order.setPrice("1.99");
}
order.getLinks().add(Link.fromUri("/").rel("root").build());
return Response.ok(order).build();
}
@ProvideLink(value = Order.class, rel = "self", bindings = @Binding(name = "orderId", value = "${instance.id}"))
@ProvideLink(value = PaymentConfirmation.class, rel = "order",
bindings = @Binding(name = "orderId", value = "${instance.orderId}"))
@Produces(MediaType.APPLICATION_JSON)
@GET
@Path("/{orderId}")
public Response get(@PathParam("orderId") String orderId) {
ExtendedOrder order = new ExtendedOrder();
order.setId("123");
order.setPrice("1.99");
return Response.ok(order).build();
}
@ProvideLink(value = ExtendedOrder.class, rel = "delete",
bindings = @Binding(name = "orderId", value = "${instance.id}"))
@DELETE
@Path("/{orderId}")
public Response delete(@PathParam("orderId") String orderId) {
return Response.noContent().build();
}
@PageLinks(OrderPage.class)
@Produces(MediaType.APPLICATION_JSON)
@GET
public Response list(@QueryParam("page") @DefaultValue("0") int page, @QueryParam("size") @DefaultValue("2") int size) {
OrderPage orderPage = new OrderPage();
orderPage.setFirstPage(page == 0);
orderPage.setLastPage(page == 2);
orderPage.setPreviousPageAvailable(page > 0);
orderPage.setNextPageAvailable(page < 2);
orderPage.setNumber(page);
orderPage.setSize(size);
orderPage.setTotalElements(6);
orderPage.setTotalPages(3);
orderPage.setOrders(generateOrders(page, size));
return Response.ok(orderPage).build();
}
private List<Order> generateOrders(int page, int size) {
final int base = page * size;
return IntStream.range(1, size + 1).map(x -> x + base).mapToObj(id -> {
Order order = new Order();
order.setId(Integer.toString(id));
order.setPrice(((id & 1) == 1) ? "1.99" : "0.0");
return order;
}).collect(Collectors.toList());
}
}