View Javadoc
1   package ejava.examples.ejbwar.inventory.rs;
2   
3   import java.net.URI;
4   
5   import javax.inject.Inject;
6   import javax.ws.rs.Consumes;
7   import javax.ws.rs.DELETE;
8   import javax.ws.rs.DefaultValue;
9   import javax.ws.rs.FormParam;
10  import javax.ws.rs.GET;
11  import javax.ws.rs.POST;
12  import javax.ws.rs.PUT;
13  import javax.ws.rs.Path;
14  import javax.ws.rs.PathParam;
15  import javax.ws.rs.Produces;
16  import javax.ws.rs.QueryParam;
17  import javax.ws.rs.core.Context;
18  import javax.ws.rs.core.MediaType;
19  import javax.ws.rs.core.Request;
20  import javax.ws.rs.core.Response;
21  import javax.ws.rs.core.UriBuilder;
22  import javax.ws.rs.core.UriInfo;
23  
24  import org.apache.commons.logging.Log;
25  import org.apache.commons.logging.LogFactory;
26  
27  import ejava.examples.ejbwar.inventory.bo.Product;
28  import ejava.examples.ejbwar.inventory.bo.Products;
29  import ejava.examples.ejbwar.inventory.ejb.InventoryMgmtEJB;
30  
31  /**
32   * This class implements the JAX-RS interface for the injected inventory 
33   * management EJB logic.
34   */
35  @Path("/products")
36  public class ProductsResource {
37  	private static final Log log = LogFactory.getLog(ProductsResource.class);
38  	@Inject
39  	private InventoryMgmtEJB ejb;
40  	@Context
41  	private Request request;
42  	@Context 
43  	private UriInfo uriInfo;
44  
45  	/**
46  	 * Creates a product
47  	 * @param product
48  	 * @param category
49  	 * @return
50  	 */
51  	@POST @Path("")
52  	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
53  	@Produces(MediaType.APPLICATION_XML)
54  	public Response createProduct(
55  			@FormParam("name") String name,
56  			@FormParam("quantity") Integer quantity,
57  			@FormParam("price") Double price,
58  			@FormParam("category") String category) {
59  		log.debug(String.format("%s %s", request.getMethod(), uriInfo.getAbsolutePath()));
60  
61  		try {
62  			Product product = new Product(name, quantity, price);
63  			Product p = ejb.addProduct(product, category);
64  			//build URI that can be used to get this product
65  			URI uri = UriBuilder.fromUri(uriInfo.getAbsolutePath())
66  						.path(ProductsResource.class, "getProduct")
67  						.build(p.getId());
68  			return Response.created(uri)
69  					.entity(p)
70    				    .tag("" + p.getVersion())
71  				    .build();
72  		} catch (Exception ex) {
73  			return ResourceHelper.serverError(log, "creating product", ex).build();
74  		}
75  	}
76  	
77  	/**
78  	 * Returns a specific product
79  	 * @param id
80  	 * @return
81  	 */
82  	@GET @Path("{id}")
83  	@Produces(MediaType.APPLICATION_XML)
84  	public Response getProduct(@PathParam("id")int id) {
85  		log.debug(String.format("%s %s", request.getMethod(), uriInfo.getAbsolutePath()));
86  
87  		try {
88  			Product product = ejb.getProduct(id);
89  			if (product != null) {
90  				return Response.ok(product)
91  						.tag("" + product.getVersion())
92  						.build();
93  			}
94  			else {
95  				return Response.status(Response.Status.NOT_FOUND)
96  						.entity(String.format("unable to locate product %d", id))
97  						.type(MediaType.TEXT_PLAIN)
98  						.build();
99  			}
100 		} catch (Exception ex) {
101 			return ResourceHelper.serverError(log, "getting product", ex).build();
102 		}
103 	}
104 
105 	/**
106 	 * Updates a product with the values of the object passed in
107 	 * @param id
108 	 * @param product
109 	 * @return
110 	 */
111 	@PUT @Path("{id}")
112 	@Consumes(MediaType.APPLICATION_XML)
113 	@Produces(MediaType.APPLICATION_XML)
114 	public Response updateProduct(@PathParam("id") int id, Product product) {
115 		log.debug(String.format("%s %s", request.getMethod(), uriInfo.getAbsolutePath()));
116 
117 		try {
118 			Product p = ejb.updateProduct(product);
119 			return Response.ok(p)
120 					.tag("" + p.getVersion())
121 					.build();
122 		} catch (Exception ex) {
123 			return ResourceHelper.serverError(log, "update product", ex).build();
124 		}
125 	}
126 
127 	/**
128 	 * Deletes the product identified.
129 	 * @param id
130 	 * @return
131 	 */
132 	@DELETE @Path("{id}")
133 	public Response deleteProduct(@PathParam("id")int id) {
134 		log.debug(String.format("%s %s", request.getMethod(), uriInfo.getAbsolutePath()));
135 
136 		try {
137 			Product product = ejb.getProduct(id);
138 			if (product != null) {
139 				try {
140 					ejb.deleteProduct(product);
141 					return Response.noContent().build();
142 				} catch (Exception ex) {
143 					return ResourceHelper.serverError(log, "deleting product", ex).build();
144 				}
145 			}
146 			else {
147 				return Response.status(Response.Status.NOT_FOUND)
148 						.entity(String.format("unable to locate product %d", id))
149 						.type(MediaType.TEXT_PLAIN)
150 						.build();
151 			}
152 		} catch (Exception ex) {
153 			return ResourceHelper.serverError(log, "getting product", ex).build();
154 		}
155 	}
156 
157 	/**
158 	 * Returns a simple list of products that match provided name
159 	 * @param name
160 	 * @return
161 	 */
162 	@GET @Path("")
163 	@Produces(MediaType.APPLICATION_XML)
164 	public Response findProductsByName(
165 			@QueryParam("name")String name,
166 			@QueryParam("offset") @DefaultValue("0") int offset,
167 			@QueryParam("limit") @DefaultValue("0") int limit) {
168 		log.debug(String.format("%s %s", request.getMethod(), uriInfo.getAbsolutePath()));
169 
170 		try {
171 			Products products = ejb.findProductByName(name, offset, limit);
172 			return Response.ok(products)
173 					.build();
174 		} catch (Exception ex) {
175 			return ResourceHelper.serverError(log, "getting products", ex).build();
176 		}
177 	}	
178 }