Author: heiko.braun(a)jboss.com
Date: 2007-11-20 15:51:27 -0500 (Tue, 20 Nov 2007)
New Revision: 5089
Added:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/DefaultProviderFactory.java
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/StringProvider.java
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBProvider.java
Removed:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBReader.java
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBWriter.java
Modified:
stack/native/branches/rest/src/main/java/org/jboss/rs/deployment/ResourceServlet.java
stack/native/branches/rest/src/test/java/org/jboss/test/rs/media/MediaTypeTestCase.java
Log:
Default entity provider, first cut. Supports JAXB and String types
Modified:
stack/native/branches/rest/src/main/java/org/jboss/rs/deployment/ResourceServlet.java
===================================================================
---
stack/native/branches/rest/src/main/java/org/jboss/rs/deployment/ResourceServlet.java 2007-11-20
17:49:19 UTC (rev 5088)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/deployment/ResourceServlet.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -25,6 +25,7 @@
import org.jboss.rs.ResourceError;
import org.jboss.rs.ResourceRegistry;
import org.jboss.rs.ResourceRegistryFactory;
+import org.jboss.rs.media.DefaultProviderFactory;
import org.jboss.rs.model.ResourceModel;
import org.jboss.rs.runtime.InvocationMediator;
import org.jboss.rs.runtime.RuntimeContext;
@@ -35,8 +36,12 @@
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.ext.ProviderFactory;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.PrintWriter;
+import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
@@ -95,22 +100,30 @@
// mediate the invocation
InvocationMediator mediator = new InvocationMediator(rt);
- Object result = mediator.invoke();
+ Object invocationResult = mediator.invoke();
+ Object returnValue = null;
- // write to output stream
- if(result instanceof String)
+ // may be a Response object
+ if(invocationResult instanceof Response)
{
- res.setContentType("text/plain");
- PrintWriter writer = res.getWriter();
- writer.write(result.toString());
- writer.flush();
- writer.close();
+ Response response = (Response)invocationResult;
+ returnValue = response.getEntity();
+ log.warn("Not implemented: Response metadata currently ignored");
}
else
{
- serverError(405, "Cannot marshall " + result.getClass(), res);
+ returnValue = invocationResult;
}
+ // response meta data
+ // write to output stream, TODO: mediatypes
+ ProviderFactory providerfactory = DefaultProviderFactory.newInstance();
+ MessageBodyWriter writer =
providerfactory.createMessageBodyWriter(returnValue.getClass(), null);
+ OutputStream out = res.getOutputStream();
+ writer.writeTo(returnValue, null, null, out);
+ out.flush();
+ out.close();
+
}
catch(ResourceError resourceError)
{
Added:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/DefaultProviderFactory.java
===================================================================
---
stack/native/branches/rest/src/main/java/org/jboss/rs/media/DefaultProviderFactory.java
(rev 0)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/media/DefaultProviderFactory.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -0,0 +1,89 @@
+package org.jboss.rs.media;
+
+import org.jboss.rs.media.xml.JAXBProvider;
+import org.jboss.rs.media.simple.StringProvider;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.HeaderProvider;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.ProviderFactory;
+import java.util.List;
+import java.util.ArrayList;
+
+
+/**
+ * Ugly hack.
+ * TODO: Provide a scoped (classloading) reader/writer registry that this class can
delegate to.
+ */
+public class DefaultProviderFactory extends ProviderFactory
+{
+
+ private static List<MessageBodyReader> reader = new
ArrayList<MessageBodyReader>();
+ private static List<MessageBodyWriter> writer = new
ArrayList<MessageBodyWriter>();
+
+ static final JAXBProvider JAXB = new JAXBProvider();
+ static final StringProvider STRING = new StringProvider();
+
+ static
+ {
+ reader.add( JAXB );
+ reader.add( STRING );
+
+ writer.add( JAXB );
+ writer.add( STRING );
+ }
+
+ public static ProviderFactory newInstance()
+ {
+ return new DefaultProviderFactory();
+ }
+
+ public <T> T createInstance(Class<T> aClass)
+ {
+ return null;
+ }
+
+ public <T> HeaderProvider<T> createHeaderProvider(Class<T> aClass)
+ {
+ throw new IllegalArgumentException("Not implemented");
+ }
+
+ public <T> MessageBodyReader<T> createMessageBodyReader(Class<T>
aClass, MediaType mediaType)
+ {
+ MessageBodyReader match = null;
+
+ for(MessageBodyReader r : reader)
+ {
+ if(r.isReadable(aClass))
+ {
+ match = r;
+ break;
+ }
+ }
+
+ if(null==match)
+ throw new RuntimeException("No reader for type: " + aClass + ",
mediaType="+mediaType);
+
+ return match;
+ }
+
+ public <T> MessageBodyWriter<T> createMessageBodyWriter(Class<T>
aClass, MediaType mediaType)
+ {
+ MessageBodyWriter match = null;
+
+ for(MessageBodyWriter w : writer)
+ {
+ if(w.isWriteable(aClass))
+ {
+ match = w;
+ break;
+ }
+ }
+
+ if(null==match)
+ throw new RuntimeException("No writer for type: " + aClass + ",
mediaType="+mediaType);
+
+ return match;
+ }
+}
Property changes on:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/DefaultProviderFactory.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/StringProvider.java
===================================================================
---
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/StringProvider.java
(rev 0)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/StringProvider.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -0,0 +1,43 @@
+package org.jboss.rs.media.simple;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import java.io.*;
+
+public class StringProvider implements MessageBodyReader<String>,
MessageBodyWriter<String>
+{
+
+ public boolean isReadable(Class<?> aClass)
+ {
+ return aClass == String.class;
+ }
+
+ public String readFrom(Class<String> aClass, MediaType mediaType,
MultivaluedMap<String, String> multivaluedMap, InputStream inputStream) throws
IOException
+ {
+ Reader reader = new InputStreamReader(inputStream);
+ StringBuilder sb = new StringBuilder();
+ char[] c = new char[1024];
+ int l;
+ while ((l = reader.read(c)) != -1) {
+ sb.append(c, 0, l);
+ }
+ return sb.toString();
+ }
+
+ public boolean isWriteable(Class<?> aClass)
+ {
+ return aClass == String.class;
+ }
+
+ public long getSize(String s)
+ {
+ return s.length();
+ }
+
+ public void writeTo(String s, MediaType mediaType, MultivaluedMap<String,
Object> multivaluedMap, OutputStream outputStream) throws IOException
+ {
+ outputStream.write( s.getBytes() );
+ }
+}
Property changes on:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/simple/StringProvider.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added: stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBProvider.java
===================================================================
--- stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBProvider.java
(rev 0)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBProvider.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -0,0 +1,61 @@
+package org.jboss.rs.media.xml;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class JAXBProvider implements MessageBodyReader<Object>,
MessageBodyWriter<Object>
+{
+ public boolean isReadable(Class<?> aClass)
+ {
+ return aClass.isAnnotationPresent(XmlRootElement.class);
+ }
+
+ public java.lang.Object readFrom(Class<java.lang.Object> aClass, MediaType
mediaType, MultivaluedMap<String, String> multivaluedMap, InputStream inputStream)
throws IOException
+ {
+ try
+ {
+ JAXBContext jaxb = JAXBContext.newInstance(aClass);
+ Object obj = jaxb.createUnmarshaller().unmarshal(inputStream);
+
+ if(obj instanceof JAXBElement)
+ obj = ((JAXBElement)obj).getValue();
+
+ return obj;
+ } catch (JAXBException e)
+ {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public boolean isWriteable(Class<?> aClass)
+ {
+ return aClass.isAnnotationPresent(XmlRootElement.class);
+ }
+
+ public long getSize(java.lang.Object object)
+ {
+ return -1;
+ }
+
+ public void writeTo(java.lang.Object object, MediaType mediaType,
MultivaluedMap<String, java.lang.Object> multivaluedMap, OutputStream outputStream)
throws IOException
+ {
+ try
+ {
+ JAXBContext jaxb = JAXBContext.newInstance(object.getClass());
+ jaxb.createMarshaller().marshal(object, outputStream);
+ } catch (JAXBException e)
+ {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+}
Property changes on:
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBProvider.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Deleted: stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBReader.java
===================================================================
---
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBReader.java 2007-11-20
17:49:19 UTC (rev 5088)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBReader.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -1,33 +0,0 @@
-package org.jboss.rs.media;
-
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import java.io.InputStream;
-import java.io.IOException;
-
-public class JAXBReader implements MessageBodyReader
-{
-
- public boolean isReadable(Class aClass)
- {
- return aClass.isAnnotationPresent(XmlRootElement.class);
- }
-
- public Object readFrom(Class aClass, MediaType mediaType, MultivaluedMap
multivaluedMap, InputStream inputStream)
- throws IOException
- {
- try
- {
- JAXBContext jaxb = JAXBContext.newInstance(aClass);
- Object obj = jaxb.createUnmarshaller().unmarshal(inputStream);
- return obj;
- } catch (JAXBException e)
- {
- throw new IOException(e.getMessage());
- }
- }
-}
Deleted: stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBWriter.java
===================================================================
---
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBWriter.java 2007-11-20
17:49:19 UTC (rev 5088)
+++
stack/native/branches/rest/src/main/java/org/jboss/rs/media/xml/JAXBWriter.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -1,37 +0,0 @@
-package org.jboss.rs.media.xml;
-
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import java.io.OutputStream;
-import java.io.IOException;
-
-public class JAXBWriter implements MessageBodyWriter
-{
-
- public boolean isWriteable(Class aClass)
- {
- return aClass.isAnnotationPresent(XmlRootElement.class);
- }
-
- public long getSize(Object o)
- {
- return -1;
- }
-
- public void writeTo(Object o, MediaType mediaType, MultivaluedMap multivaluedMap,
OutputStream outputStream)
- throws IOException
- {
- try
- {
- JAXBContext jaxb = JAXBContext.newInstance(o.getClass());
- jaxb.createMarshaller().marshal(o, outputStream);
- } catch (JAXBException e)
- {
- throw new IOException(e.getMessage());
- }
- }
-}
Modified:
stack/native/branches/rest/src/test/java/org/jboss/test/rs/media/MediaTypeTestCase.java
===================================================================
---
stack/native/branches/rest/src/test/java/org/jboss/test/rs/media/MediaTypeTestCase.java 2007-11-20
17:49:19 UTC (rev 5088)
+++
stack/native/branches/rest/src/test/java/org/jboss/test/rs/media/MediaTypeTestCase.java 2007-11-20
20:51:27 UTC (rev 5089)
@@ -1,11 +1,14 @@
package org.jboss.test.rs.media;
import junit.framework.Test;
+import org.jboss.rs.media.DefaultProviderFactory;
import org.jboss.wsf.test.JBossWSTest;
import org.jboss.wsf.test.JBossWSTestSetup;
-import org.jboss.rs.media.JAXBReader;
-import java.io.OutputStreamWriter;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.ProviderFactory;
+import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -27,8 +30,7 @@
*/
public void testRequest1() throws Exception
{
- URL url = new URL("http://localhost:8080/jbossrs-mediatype" +
- "/books/3897217279");
+ URL url = new
URL("http://localhost:8080/jbossrs-mediatype/books/3897217279");
Object response = doMediaRequest(url, null);
assertNotNull(response );
@@ -38,31 +40,28 @@
private Object doMediaRequest(URL url, Object data) throws Exception
{
+ ProviderFactory providerFactory = DefaultProviderFactory.newInstance();
+
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput( data!=null );
conn.setRequestProperty("accept", "text/xml");
if(data !=null)
{
- OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
-
- // TODO: resolve MessageBodyWriter
-
- wr.flush();
- wr.close();
+ OutputStream out = conn.getOutputStream();
+ MessageBodyWriter writer =
providerFactory.createMessageBodyWriter(data.getClass(), null);
+ writer.writeTo(data, null, null, out);
+ out.flush();
+ out.close();
}
- // TODO: resolve MessageBodyReader
-
- Object result = null;
-
- JAXBReader reader = new JAXBReader();
+ Object returnValue = null;
+ MessageBodyReader reader =
providerFactory.createMessageBodyReader(BookResource.class, null);
if(reader.isReadable(BookResource.class))
{
- result = reader.readFrom(BookResource.class, null, null,
conn.getInputStream());
+ returnValue = reader.readFrom(BookResource.class, null, null,
conn.getInputStream());
}
-
- return result;
+ return returnValue;
}
}