You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/07/27 20:33:08 UTC
svn commit: r1151586 - in /openejb/trunk/openejb3: examples/rest-on-ejb/
examples/rest-on-ejb/src/main/java/org/superbiz/rest/
examples/rest-on-ejb/src/test/java/org/superbiz/rest/
server/openejb-http/src/main/java/org/apache/openejb/server/httpd/
Author: rmannibucau
Date: Wed Jul 27 18:33:07 2011
New Revision: 1151586
URL: http://svn.apache.org/viewvc?rev=1151586&view=rev
Log:
adding some support for PUT, DELETE... in openejb-http
Modified:
openejb/trunk/openejb3/examples/rest-on-ejb/pom.xml
openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/User.java
openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/UserService.java
openejb/trunk/openejb3/examples/rest-on-ejb/src/test/java/org/superbiz/rest/UserServiceTest.java
openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
Modified: openejb/trunk/openejb3/examples/rest-on-ejb/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/rest-on-ejb/pom.xml?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/rest-on-ejb/pom.xml (original)
+++ openejb/trunk/openejb3/examples/rest-on-ejb/pom.xml Wed Jul 27 18:33:07 2011
@@ -80,6 +80,12 @@
<version>4.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.1</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<!--
This section allows you to configure where to publish libraries for sharing.
Modified: openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/User.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/User.java?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/User.java (original)
+++ openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/User.java Wed Jul 27 18:33:07 2011
@@ -32,7 +32,7 @@ import javax.xml.bind.annotation.XmlRoot
@NamedQuery(name = "user.list", query = "select u from User u")
})
@XmlRootElement(name = "user")
-public class User implements Cloneable{
+public class User implements Cloneable {
@Id @GeneratedValue private long id;
private String fullname;
private String password;
@@ -78,4 +78,21 @@ public class User implements Cloneable{
user.setId(getId());
return user;
}
+
+ @Override public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ User user = (User) o;
+
+ return id == user.id;
+ }
+
+ @Override public int hashCode() {
+ return (int) (id ^ (id >>> 32));
+ }
}
Modified: openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/UserService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/UserService.java?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/UserService.java (original)
+++ openejb/trunk/openejb3/examples/rest-on-ejb/src/main/java/org/superbiz/rest/UserService.java Wed Jul 27 18:33:07 2011
@@ -31,6 +31,7 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
@@ -68,22 +69,35 @@ public class UserService {
}
@Path("/show/{id}") @GET public User find(@PathParam("id") long id) {
- return em.find(User.class, id).copy();
+ User user = em.find(User.class, id);
+ if (user == null) {
+ return null;
+ }
+ return user.copy();
+
}
- @Path("/delete") @DELETE public void delete(long id) {
- em.remove(id);
+ @Path("/delete/{id}") @DELETE public void delete(@PathParam("id") long id) {
+ User user = em.find(User.class, id);
+ if (user != null) {
+ em.remove(user);
+ }
}
- @Path("/update") @POST public User update(long id, String name, String pwd, String mail) {
+ @Path("/update/{id}") @POST public Response update(@PathParam("id") long id,
+ @QueryParam("name") String name,
+ @QueryParam("pwd") String pwd,
+ @QueryParam("mail") String mail) {
User user = em.find(User.class, id);
if (user == null) {
- throw new IllegalArgumentException("setUser id " + id + " not found");
+ throw new IllegalArgumentException("user id " + id + " not found");
}
user.setFullname(name);
user.setPassword(pwd);
user.setEmail(mail);
- return em.merge(user);
+ em.merge(user);
+
+ return Response.ok(user.copy()).build();
}
}
Modified: openejb/trunk/openejb3/examples/rest-on-ejb/src/test/java/org/superbiz/rest/UserServiceTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/rest-on-ejb/src/test/java/org/superbiz/rest/UserServiceTest.java?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/rest-on-ejb/src/test/java/org/superbiz/rest/UserServiceTest.java (original)
+++ openejb/trunk/openejb3/examples/rest-on-ejb/src/test/java/org/superbiz/rest/UserServiceTest.java Wed Jul 27 18:33:07 2011
@@ -1,5 +1,5 @@
/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
+ * 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
@@ -21,26 +21,29 @@ import org.apache.openejb.OpenEjbContain
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import sun.awt.geom.AreaOp;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import javax.naming.NamingException;
+import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBContext;
-import java.net.URL;
+import javax.xml.bind.Unmarshaller;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.fail;
/**
- * In standalone only GET and POST are managed.
- *
* @author Romain Manni-Bucau
*/
public class UserServiceTest {
private static Context context;
+ private static UserService service;
+ private static List<User> users = new ArrayList<User>();
@BeforeClass public static void start() throws NamingException {
Properties properties = new Properties();
@@ -48,9 +51,9 @@ public class UserServiceTest {
context = EJBContainer.createEJBContainer(properties).getContext();
// create some records
- UserService service = (UserService) context.lookup("java:global/rest-on-ejb/UserService");
- service.create("foo", "foopwd", "foo@foo.com");
- service.create("bar", "barpwd", "bar@bar.com");
+ service = (UserService) context.lookup("java:global/rest-on-ejb/UserService");
+ users.add(service.create("foo", "foopwd", "foo@foo.com"));
+ users.add(service.create("bar", "barpwd", "bar@bar.com"));
}
@AfterClass public static void close() throws NamingException {
@@ -59,9 +62,36 @@ public class UserServiceTest {
}
}
+ @Test public void create() {
+ int expected = service.list(0, 100).size() + 1;
+ Response response = WebClient.create("http://localhost:4204")
+ .path("/user/create")
+ .query("name", "dummy")
+ .query("pwd", "unbreakable")
+ .query("mail", "foo@bar.fr")
+ .put(null);
+ List<User> list = service.list(0, 100);
+ for (User u : list) {
+ if (!users.contains(u)) {
+ service.delete(u.getId());
+ return;
+ }
+ }
+ fail("user was not added");
+ }
+
+ @Test public void delete() throws Exception {
+ User user = service.create("todelete", "dontforget", "delete@me.com");
+
+ WebClient.create("http://localhost:4204").path("/user/delete/" + user.getId()).delete();
+
+ user = service.find(user.getId());
+ assertNull(user);
+ }
+
@Test public void show() {
User user = WebClient.create("http://localhost:4204")
- .path("/user/show/1")
+ .path("/user/show/" + users.iterator().next().getId())
.get(User.class);
assertEquals("foo", user.getFullname());
assertEquals("foopwd", user.getPassword());
@@ -88,4 +118,22 @@ public class UserServiceTest {
"</user>" +
"</users>", users);
}
+
+ @Test public void update() throws Exception {
+ User created = service.create("name", "pwd", "mail");
+ Response response = WebClient.create("http://localhost:4204")
+ .path("/user/update/" + created.getId())
+ .query("name", "corrected")
+ .query("pwd", "userpwd")
+ .query("mail", "it@is.ok")
+ .post(null);
+
+ JAXBContext ctx = JAXBContext.newInstance(User.class);
+ Unmarshaller unmarshaller = ctx.createUnmarshaller();
+ User modified = (User) unmarshaller.unmarshal(InputStream.class.cast(response.getEntity()));
+
+ assertEquals("corrected", modified.getFullname());
+ assertEquals("userpwd", modified.getPassword());
+ assertEquals("it@is.ok", modified.getEmail());
+ }
}
Modified: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java Wed Jul 27 18:33:07 2011
@@ -350,11 +350,13 @@ public class HttpRequestImpl implements
method = Method.GET.name();
} else if (token.equalsIgnoreCase("POST")) {
method = Method.POST.name();
- } /* else if (token.equalsIgnoreCase("PUT")) {
+ } else if (token.equalsIgnoreCase("PUT")) {
method = Method.PUT.name();
} else if (token.equalsIgnoreCase("DELETE")) {
method = Method.DELETE.name();
- } */ else {
+ } else if (token.equalsIgnoreCase("HEAD")) {
+ method = Method.HEAD.name();
+ } else {
method = Method.UNSUPPORTED.name();
throw new IOException("Unsupported HTTP Request Method :" + token);
}
@@ -495,6 +497,9 @@ public class HttpRequestImpl implements
//end temp-debug---------------------------------------
}
+ private boolean hasBody() {
+ return !method.equals(Method.GET.name()) && !method.equals(Method.DELETE.name());
+ }
/**
* reads the body from the data input passed in
*
@@ -509,7 +514,7 @@ public class HttpRequestImpl implements
contentType = getHeader(HttpRequest.HEADER_CONTENT_TYPE);
- if (method.equals(Method.POST.name()) && FORM_URL_ENCODED.equals(contentType)) {
+ if (hasBody() && FORM_URL_ENCODED.equals(contentType)) {
String rawParams;
try {
@@ -544,7 +549,7 @@ public class HttpRequestImpl implements
formParams.put(name, value);
//System.out.println(name + ": " + value);
}
- } else if (method.equals(Method.POST.name()) && CHUNKED.equals(headers.get(TRANSFER_ENCODING))) {
+ } else if (hasBody() && CHUNKED.equals(headers.get(TRANSFER_ENCODING))) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
for (String line = in.readLine(); line != null; line = in.readLine()) {
@@ -568,7 +573,7 @@ public class HttpRequestImpl implements
} catch (Exception e) {
throw (IOException)new IOException("Unable to read chunked body").initCause(e);
}
- } else if (method.equals(Method.POST.name())){
+ } else if (hasBody()){
// TODO This really is terrible
body = readContent(in);
this.in = new ServletByteArrayIntputStream(body);
Modified: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java?rev=1151586&r1=1151585&r2=1151586&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java Wed Jul 27 18:33:07 2011
@@ -18,6 +18,7 @@ package org.apache.openejb.server.httpd;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
@@ -33,14 +34,11 @@ public class HttpResponseImpl implements
private String responseString = "OK";
/** Code */
- private int code = 200;
+ private int code = HttpServletResponse.SC_OK;
/** Response headers */
private final Map<String,String> headers = new HashMap<String,String>();
- /** Response body */
- private byte[] body = new byte[0];
-
/** the writer for the response */
private transient PrintWriter writer;
/** the raw body */
@@ -397,8 +395,8 @@ public class HttpResponseImpl implements
if (content == null){
writer.flush();
writer.close();
- body = sosi.getOutputStream().toByteArray();
- setHeader("Content-Length", body.length+"");
+ int length = sosi.getOutputStream().toByteArray().length;
+ setHeader("Content-Length", length + "");
} else {
setHeader("Content-Length", content.getContentLength()+"");
}
@@ -457,7 +455,7 @@ public class HttpResponseImpl implements
private void writeBody(DataOutput out) throws IOException{
out.writeBytes(CRLF);
if (content == null){
- out.write(body);
+ out.write(sosi.getOutputStream().toByteArray());
} else {
InputStream in = content.getInputStream();
byte buf[] = new byte[1024];
@@ -596,7 +594,7 @@ public class HttpResponseImpl implements
/** Response body */
writer.flush();
- body = sosi.getOutputStream().toByteArray();
+ byte[] body = sosi.getOutputStream().toByteArray();
//System.out.println("[] body "+body.length );
out.writeObject( body );
}
@@ -620,7 +618,7 @@ public class HttpResponseImpl implements
this.headers.putAll(headers);
/** Response body */
- body = (byte[]) in.readObject();
+ byte[] body = (byte[]) in.readObject();
//System.out.println("[] body "+body.length );
sosi = new ServletByteArrayOutputStream();
sosi.write(body);