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);