You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/05/13 17:28:16 UTC

svn commit: r1481920 - in /cxf/trunk/rt: frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ frontend/jaxrs/src/main/java/org/apache/cxf/...

Author: sergeyb
Date: Mon May 13 15:28:16 2013
New Revision: 1481920

URL: http://svn.apache.org/r1481920
Log:
[CXF-5000,CXF-5007] Delaying converting headeres to String till the stream is written (required), minor updates to do with AsyncResponse exceptions, support for reading streams into File (only to get TCK happy)

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImplTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Mon May 13 15:28:16 2013
@@ -87,8 +87,12 @@ public class JAXRSInvoker extends Abstra
         if (asyncResp != null) {
             AsyncResponseImpl asyncImpl = (AsyncResponseImpl)asyncResp;
             asyncImpl.prepareContinuation();
-            asyncImpl.handleTimeout();
-            return handleAsyncResponse(exchange, asyncImpl);
+            try {
+                asyncImpl.handleTimeout();
+                return handleAsyncResponse(exchange, asyncImpl);
+            } catch (Throwable t) {
+                return handleAsyncFault(exchange, asyncImpl, t);
+            }
         }
         
         ResourceProvider provider = getResourceProvider(exchange);
@@ -125,19 +129,22 @@ public class JAXRSInvoker extends Abstra
     private Object handleAsyncResponse(Exchange exchange, AsyncResponseImpl ar) {
         Object asyncObj = ar.getResponseObject();
         if (asyncObj instanceof Throwable) {
-            try {
-                return handleFault(new Fault((Throwable)asyncObj), 
-                                   exchange.getInMessage(), null, null);
-            } catch (Fault ex) {
-                ar.setUnmappedThrowable(ex.getCause());
-                return new MessageContentsList(Response.serverError().build());
-            }
+            return handleAsyncFault(exchange, ar, (Throwable)asyncObj);
         } else {
             setResponseContentTypeIfNeeded(exchange.getInMessage(), asyncObj);
             return new MessageContentsList(asyncObj);
         }
     }
     
+    private Object handleAsyncFault(Exchange exchange, AsyncResponseImpl ar, Throwable t) {
+        try {
+            return handleFault(new Fault(t), exchange.getInMessage(), null, null);
+        } catch (Fault ex) {
+            ar.setUnmappedThrowable(ex.getCause());
+            return new MessageContentsList(Response.serverError().build());
+        }
+    }
+    
     private void persistRoots(Exchange exchange, Object rootInstance, Object provider) {
         exchange.put(JAXRSUtils.ROOT_INSTANCE, rootInstance);
         exchange.put(JAXRSUtils.ROOT_PROVIDER, provider);
@@ -191,12 +198,12 @@ public class JAXRSInvoker extends Abstra
 
         Object result = null;
         ClassLoaderHolder contextLoader = null;
+        AsyncResponseImpl asyncResponse = null;
         try {
             if (setServiceLoaderAsContextLoader(inMessage)) {
                 contextLoader = ClassLoaderUtils
                     .setThreadContextClassloader(resourceObject.getClass().getClassLoader());
             }
-            AsyncResponseImpl asyncResponse = null;
             if (!ori.isSubResourceLocator()) {
                 asyncResponse = (AsyncResponseImpl)inMessage.get(AsyncResponse.class);
             }
@@ -205,7 +212,13 @@ public class JAXRSInvoker extends Abstra
                 result = handleAsyncResponse(exchange, asyncResponse);
             }
         } catch (Fault ex) {
-            return handleFault(ex, inMessage, cri, methodToInvoke);
+            Object faultResponse;
+            if (asyncResponse != null && !asyncResponse.suspendContinuationIfNeeded()) {
+                faultResponse = handleAsyncFault(exchange, asyncResponse, ex.getCause());    
+            } else {
+                faultResponse = handleFault(ex, inMessage, cri, methodToInvoke);
+            }
+            return faultResponse;
         } finally {
             exchange.put(LAST_SERVICE_OBJECT, resourceObject);
             if (contextLoader != null) {

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImpl.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImpl.java Mon May 13 15:28:16 2013
@@ -21,7 +21,6 @@ package org.apache.cxf.jaxrs.impl;
 
 import java.lang.annotation.Annotation;
 import java.net.URI;
-import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
@@ -40,12 +39,11 @@ import javax.ws.rs.core.Response.Respons
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.core.Variant;
 
-import org.apache.cxf.jaxrs.utils.HttpUtils;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.PhaseInterceptorChain;
 
 public final class ResponseBuilderImpl extends ResponseBuilder implements Cloneable {
+    
     private int status = 200;
     private boolean statusSet;
     private Object entity;
@@ -90,7 +88,7 @@ public final class ResponseBuilderImpl e
     }
 
     public ResponseBuilder type(MediaType type) {
-        return type(type == null ? null : JAXRSUtils.mediaTypeToString(type));
+        return setHeader(HttpHeaders.CONTENT_TYPE, type);
     }
 
     public ResponseBuilder type(String type) {
@@ -99,7 +97,7 @@ public final class ResponseBuilderImpl e
 
     @Override
     public ResponseBuilder language(Locale locale) {
-        return language(locale == null ? null : locale.toString());
+        return setHeader(HttpHeaders.CONTENT_LANGUAGE, locale);
     }
     
     public ResponseBuilder language(String language) {
@@ -126,17 +124,19 @@ public final class ResponseBuilderImpl e
     }
 
     public ResponseBuilder tag(EntityTag tag) {
-        return setHeader(HttpHeaders.ETAG, tag == null ? null : tag.toString());
+        return setHeader(HttpHeaders.ETAG, tag);
     }
 
     public ResponseBuilder tag(String tag) {
-        // String tag value needs to be parsed as it may 
-        // contain parameters indicating it's a weak tag, etc
-        return tag(tag == null ? null : EntityTag.valueOf(tag));
+        final String doubleQuote = "\"";
+        if (tag != null && !tag.startsWith(doubleQuote)) {
+            tag = doubleQuote + tag + doubleQuote;
+        }
+        return setHeader(HttpHeaders.ETAG, tag);
     }
 
     public ResponseBuilder lastModified(Date date) {
-        return setHeader(HttpHeaders.LAST_MODIFIED, date == null ? null : toHttpDate(date));
+        return setHeader(HttpHeaders.LAST_MODIFIED, date);
     }
 
     public ResponseBuilder cacheControl(CacheControl cacheControl) {
@@ -145,7 +145,7 @@ public final class ResponseBuilderImpl e
 
     @Override
     public ResponseBuilder expires(Date date) {
-        return setHeader(HttpHeaders.EXPIRES, date == null ? null : toHttpDate(date));
+        return setHeader(HttpHeaders.EXPIRES, date);
     }
 
     @Override
@@ -154,14 +154,7 @@ public final class ResponseBuilderImpl e
     }
     
     public ResponseBuilder header(String name, Object value) {
-        if (HttpUtils.isDateRelatedHeader(name)) {
-            Object theValue = value instanceof Date ? toHttpDate((Date)value) : value;  
-            return setHeader(name, theValue);
-        } else if (HttpHeaders.LOCATION.equals(name)) {
-            return location(URI.create(value.toString()));
-        } else {
-            return addHeader(name, value);
-        }
+        return addHeader(name, value);
     }
 
     
@@ -233,16 +226,11 @@ public final class ResponseBuilderImpl e
         status = 200;
     }
     
-    private String toHttpDate(Date date) {
-        SimpleDateFormat format = HttpUtils.getHttpDateFormat();
-        return format.format(date);
-    }
-    
     private ResponseBuilder setHeader(String name, Object value) {
         if (value == null) {
             metadata.remove(name);
         } else {
-            metadata.putSingle(name, value.toString());
+            metadata.putSingle(name, value);
         }
         return this;
     }
@@ -251,7 +239,7 @@ public final class ResponseBuilderImpl e
         if (values != null && values.length >= 1 && values[0] != null) {
             for (Object value : values) {
                 if (!valueExists(name, value)) {
-                    metadata.add(name, value.toString());
+                    metadata.add(name, value);
                 }
             }
         } else {
@@ -262,7 +250,7 @@ public final class ResponseBuilderImpl e
     
     private boolean valueExists(String key, Object value) {
         List<Object> values = metadata.get(key);
-        return values == null ? false : values.contains(value.toString());
+        return values == null ? false : values.contains(value);
     }
 
     @Override

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java Mon May 13 15:28:16 2013
@@ -46,6 +46,8 @@ import javax.ws.rs.core.NewCookie;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status.Family;
 import javax.ws.rs.ext.ReaderInterceptor;
+import javax.ws.rs.ext.RuntimeDelegate;
+import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
 
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
@@ -149,29 +151,30 @@ public final class ResponseImpl extends 
     public MultivaluedMap<String, String> getStringHeaders() {
         MetadataMap<String, String> headers = new MetadataMap<String, String>(metadata.size());
         for (Map.Entry<String, List<Object>> entry : metadata.entrySet()) {
-            headers.put(entry.getKey(), toListOfStrings(entry.getValue()));
+            String headerName = entry.getKey();
+            headers.put(headerName, toListOfStrings(headerName, entry.getValue()));
         }
         return headers;
     }
 
-    private String getHeader(String header) {
-        Object value = metadata.getFirst(header);
-        return value == null ? null : value.toString();
-    }
-    
     public String getHeaderString(String header) {
         List<Object> methodValues = metadata.get(header);
-        return HttpUtils.getHeaderString(toListOfStrings(methodValues));
+        return HttpUtils.getHeaderString(toListOfStrings(header, methodValues));
     }
     
     // This conversion is needed as some values may not be Strings
-    private List<String> toListOfStrings(List<Object> values) {
+    private List<String> toListOfStrings(String headerName, List<Object> values) {
         if (values == null) {
             return null; 
         } else {
             List<String> stringValues = new ArrayList<String>(values.size());
+            RuntimeDelegate rd = RuntimeDelegate.getInstance();
+            @SuppressWarnings("unchecked")
+            HeaderDelegate<Object> hd = rd == null || values.isEmpty() 
+                ? null : (HeaderDelegate<Object>)rd.createHeaderDelegate(values.get(0).getClass());
             for (Object value : values) {
-                stringValues.add(value.toString());
+                String actualValue = hd == null ? value.toString() : hd.toString(value); 
+                stringValues.add(actualValue);
             }
             return stringValues;
         }
@@ -211,16 +214,21 @@ public final class ResponseImpl extends 
     }
 
     private Date doGetDate(String dateHeader) {
-        return HttpUtils.getHttpDate(getHeader(dateHeader));
+        Object value = metadata.getFirst(dateHeader);
+        return value == null || value instanceof Date ? (Date)value
+            : HttpUtils.getHttpDate(value.toString());
     }
     
     public EntityTag getEntityTag() {
-        String header = getHeader(HttpHeaders.ETAG);
-        return header == null ? null : EntityTag.valueOf(header);
+        Object header = metadata.getFirst(HttpHeaders.ETAG);
+        return header == null || header instanceof EntityTag ? (EntityTag)header
+            : EntityTag.valueOf(header.toString());
     }
 
     public Locale getLanguage() {
-        return HttpUtils.getLocale(getHeader(HttpHeaders.CONTENT_LANGUAGE));
+        Object header = metadata.getFirst(HttpHeaders.CONTENT_LANGUAGE);
+        return header == null || header instanceof Locale ? (Locale)header
+            : HttpUtils.getLocale(header.toString());
     }
 
     public Date getLastModified() {
@@ -228,17 +236,20 @@ public final class ResponseImpl extends 
     }
 
     public int getLength() {
-        return HttpUtils.getContentLength(getHeader(HttpHeaders.CONTENT_LENGTH));
+        Object header = metadata.getFirst(HttpHeaders.CONTENT_LENGTH);
+        return HttpUtils.getContentLength(header == null ? null : header.toString());
     }
 
     public URI getLocation() {
-        String header = getHeader(HttpHeaders.LOCATION);
-        return header == null ? null : URI.create(header);
+        Object header = metadata.getFirst(HttpHeaders.LOCATION);
+        return header == null || header instanceof URI ? (URI)header
+            : URI.create(header.toString());
     }
 
     public MediaType getMediaType() {
-        String header = getHeader(HttpHeaders.CONTENT_TYPE);
-        return header == null ? null : JAXRSUtils.toMediaType(header);
+        Object header = metadata.getFirst(HttpHeaders.CONTENT_TYPE);
+        return header == null || header instanceof MediaType ? (MediaType)header 
+            : (MediaType)JAXRSUtils.toMediaType(header.toString());
     }
     
     public boolean hasLink(String relation) {

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/BinaryDataProvider.java Mon May 13 15:28:16 2013
@@ -23,6 +23,7 @@ import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -32,6 +33,8 @@ import java.io.Reader;
 import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.UUID;
+import java.util.logging.Logger;
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
@@ -40,6 +43,8 @@ import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.helpers.FileUtils;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
 import org.apache.cxf.message.Message;
@@ -50,6 +55,7 @@ public class BinaryDataProvider<T> exten
     implements MessageBodyReader<T>, MessageBodyWriter<T> {
     
     private static final String HTTP_RANGE_PROPERTY = "http.range.support";
+    private static final Logger LOG = LogUtils.getL7dLogger(BinaryDataProvider.class);
     
     private static final int BUFFER_SIZE = 4096;
     private boolean reportByteArraySize;
@@ -57,7 +63,8 @@ public class BinaryDataProvider<T> exten
     public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
         return byte[].class.isAssignableFrom(type)
                || InputStream.class.isAssignableFrom(type)
-               || Reader.class.isAssignableFrom(type);
+               || Reader.class.isAssignableFrom(type)
+               || File.class.isAssignableFrom(type);
     }
 
     public T readFrom(Class<T> clazz, Type genericType, Annotation[] annotations, MediaType type, 
@@ -72,6 +79,19 @@ public class BinaryDataProvider<T> exten
         if (byte[].class.isAssignableFrom(clazz)) {
             return clazz.cast(IOUtils.readBytesFromStream(is));
         }
+        if (File.class.isAssignableFrom(clazz)) {
+            LOG.warning("Reading data into File objects with the help of pre-packaged" 
+                + " providers is not recommended - use InputStream or custom File reader");
+            // create a temp file, delete on exit
+            File f = FileUtils.createTempFile("File" + UUID.randomUUID().toString(), 
+                                              "jaxrs",
+                                              null,
+                                              true);
+            FileOutputStream fos = new FileOutputStream(f);
+            IOUtils.copy(is, fos);
+            fos.close();
+            return clazz.cast(f);
+        }
         throw new IOException("Unrecognized class");
     }
 

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java Mon May 13 15:28:16 2013
@@ -31,7 +31,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.ResourceBundle;
-import java.util.TimeZone;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -55,6 +54,7 @@ import org.apache.cxf.message.Message;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.Destination;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
+import org.apache.cxf.transport.http.Headers;
 import org.apache.cxf.transport.servlet.BaseUrlHelper;
 
 public final class HttpUtils {
@@ -187,11 +187,11 @@ public final class HttpUtils {
     }
     
     public static SimpleDateFormat getHttpDateFormat() {
-        SimpleDateFormat dateFormat = 
-            new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
-        TimeZone tZone = TimeZone.getTimeZone("GMT");
-        dateFormat.setTimeZone(tZone);
-        return dateFormat;
+        return Headers.getHttpDateFormat();
+    }
+    
+    public static String toHttpDate(Date date) {
+        return Headers.toHttpDate(date);
     }
     
     public static Date getHttpDate(String value) {
@@ -199,7 +199,7 @@ public final class HttpUtils {
             return null;
         }
         try {
-            return HttpUtils.getHttpDateFormat().parse(value);
+            return Headers.getHttpDateFormat().parse(value);
         } catch (ParseException ex) {
             return null;
         }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Mon May 13 15:28:16 2013
@@ -1368,7 +1368,8 @@ public final class JAXRSUtils {
                 }
             }
             writer.writeTo(entity, type, genericType, annotations, mediaType,
-                           httpHeaders, entityStream);
+                           httpHeaders, 
+                           entityStream);
         }
     }
     //CHECKSTYLE:ON

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java Mon May 13 15:28:16 2013
@@ -161,7 +161,7 @@ public class RequestImplTest extends Ass
         Response r = rb.build();
         assertEquals("If-Match precondition was not met", 412, r.getStatus());
         assertEquals("Response should include ETag", 
-                     "\"123\"", r.getMetadata().getFirst("ETag"));
+                     "\"123\"", r.getMetadata().getFirst("ETag").toString());
     }
     
     @Test

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImplTest.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseBuilderImplTest.java Mon May 13 15:28:16 2013
@@ -161,7 +161,7 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testAbsoluteLocation() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.putSingle("Location", "http://localhost/rest");
+        m.putSingle("Location", URI.create("http://localhost/rest"));
         checkBuild(Response.ok().location(URI.create("http://localhost/rest")).build(), 200, null, m);
     }
     
@@ -183,15 +183,15 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testLinkStr() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.putSingle("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.putSingle("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         checkBuild(Response.ok().link("http://example.com/page3", "next").build(), 200, null, m);
     }
 
     @Test
     public void testLinkStrMultiple() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Link", "<http://example.com/page1>;rel=\"previous\"");
-        m.add("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.add("Link", Link.valueOf("<http://example.com/page1>;rel=\"previous\""));
+        m.add("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         checkBuild(Response.ok().link("http://example.com/page1", "previous")
                        .link("http://example.com/page3", "next").build(), 200, null, m);
     }
@@ -199,8 +199,8 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testLinkStrMultipleSameRel() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Link", "<http://example.com/page2.pdf>;rel=\"alternate\"");
-        m.add("Link", "<http://example.com/page2.txt>;rel=\"alternate\"");
+        m.add("Link", Link.valueOf("<http://example.com/page2.pdf>;rel=\"alternate\""));
+        m.add("Link", Link.valueOf("<http://example.com/page2.txt>;rel=\"alternate\""));
         checkBuild(Response.ok().link("http://example.com/page2.pdf", "alternate")
                        .link("http://example.com/page2.txt", "alternate").build(), 200, null, m);
     }
@@ -209,15 +209,15 @@ public class ResponseBuilderImplTest ext
     public void testLinkURI() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
         URI uri = URI.create("http://example.com/page3");
-        m.putSingle("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.putSingle("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         checkBuild(Response.ok().link(uri, "next").build(), 200, null, m);
     }
 
     @Test
     public void testLinks() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Link", "<http://example.com/page1>;rel=\"previous\"");
-        m.add("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.add("Link", Link.valueOf("<http://example.com/page1>;rel=\"previous\""));
+        m.add("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         RuntimeDelegateImpl delegate = new RuntimeDelegateImpl();
         Link.Builder linkBuilder = delegate.createLinkBuilder();
         Link prevLink = linkBuilder.uri("http://example.com/page1").rel("previous").build();
@@ -230,8 +230,8 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testLinksNoReset() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Link", "<http://example.com/page1>;rel=\"previous\"");
-        m.add("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.add("Link", Link.valueOf("<http://example.com/page1>;rel=\"previous\""));
+        m.add("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         RuntimeDelegateImpl delegate = new RuntimeDelegateImpl();
         Link.Builder linkBuilder = delegate.createLinkBuilder();
         Link prevLink = linkBuilder.uri("http://example.com/page1").rel("previous").build();
@@ -243,7 +243,7 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testLinksWithReset() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Link", "<http://example.com/page3>;rel=\"next\"");
+        m.add("Link", Link.valueOf("<http://example.com/page3>;rel=\"next\""));
         RuntimeDelegateImpl delegate = new RuntimeDelegateImpl();
         Link.Builder linkBuilder = delegate.createLinkBuilder();
         Link prevLink = linkBuilder.uri("http://example.com/page1").rel("previous").build();
@@ -268,8 +268,8 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testAddCookie() {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Set-Cookie", "a=b;Version=1");
-        m.add("Set-Cookie", "c=d;Version=1");
+        m.add("Set-Cookie", new NewCookie("a", "b"));
+        m.add("Set-Cookie", new NewCookie("c", "d"));
         checkBuild(Response.ok().cookie(new NewCookie("a", "b"))
                                 .cookie(new NewCookie("c", "d")).build(), 
                   200, null, m);
@@ -305,14 +305,18 @@ public class ResponseBuilderImplTest ext
     
     @Test
     public void testExpires() throws Exception {
-        MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.putSingle("Expires", "Tue, 21 Oct 2008 17:00:00 GMT");
         SimpleDateFormat format = HttpUtils.getHttpDateFormat();
         Date date = format.parse("Tue, 21 Oct 2008 17:00:00 GMT");
-        checkBuild(Response.ok().expires(date).build(), 200, null, m);
-        checkBuild(Response.ok().expires(date)
-                   .header(HttpHeaders.EXPIRES, date).build(), 200, null, m);
-        checkBuild(Response.ok().header(HttpHeaders.EXPIRES, date).build(), 200, null, m);
+        
+        MetadataMap<String, Object> m = new MetadataMap<String, Object>();
+        m.putSingle("Expires", date);
+        checkBuild(Response.ok()
+                   .expires(format.parse("Tue, 21 Oct 2008 17:00:00 GMT"))
+                   .build(), 200, null, m);
+        checkBuild(Response.ok()
+                   .header(HttpHeaders.EXPIRES, 
+                           format.parse("Tue, 21 Oct 2008 17:00:00 GMT"))
+                   .build(), 200, null, m);
     }
     
     @Test
@@ -327,8 +331,8 @@ public class ResponseBuilderImplTest ext
     public void testVariant() throws Exception {
         
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.putSingle("Content-Type", "text/xml");
-        m.putSingle("Content-Language", "en");
+        m.putSingle("Content-Type", MediaType.TEXT_XML_TYPE);
+        m.putSingle("Content-Language", new Locale("en"));
         m.putSingle("Content-Encoding", "gzip");
         Variant v = new Variant(MediaType.TEXT_XML_TYPE, new Locale("en"), "gzip");
         
@@ -346,7 +350,7 @@ public class ResponseBuilderImplTest ext
         List<Object> enc = response.getHeaders().get(HttpHeaders.CONTENT_ENCODING);
         assertTrue(encoding.containsAll(enc));
         List<Object> ct = response.getHeaders().get(HttpHeaders.CONTENT_TYPE);
-        assertTrue(ct.contains(mt.toString()));
+        assertTrue(ct.contains(mt));
     }
     
     protected static List<Variant> getVariantList(List<String> encoding,
@@ -363,7 +367,7 @@ public class ResponseBuilderImplTest ext
     public void testCreatedNoEntity() throws Exception {
         
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.putSingle("Location", "http://foo");
+        m.putSingle("Location", URI.create("http://foo"));
         
         checkBuild(Response.created(new URI("http://foo")).build(),
                    201, null, m);
@@ -384,14 +388,14 @@ public class ResponseBuilderImplTest ext
     public void testVariantsArray() throws Exception {
         
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Content-Type", "application/json");
-        m.add("Content-Language", "en_uk");
-        m.add("Content-Language", "en_gb");
+        m.add("Content-Type", MediaType.APPLICATION_JSON_TYPE);
+        m.add("Content-Language", new Locale("en_uk"));
+        m.add("Content-Language", new Locale("en_gb"));
         m.add("Vary", "Accept");
         m.add("Vary", "Accept-Language");
         
-        Variant json = new Variant(MediaType.APPLICATION_JSON_TYPE, "en_uk", null);
-        Variant xml = new Variant(MediaType.APPLICATION_JSON_TYPE, "en_gb", null);
+        Variant json = new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en_uk"), null);
+        Variant xml = new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en_gb"), null);
 
         checkBuild(Response.ok().variants(json, xml).build(), 200, null, m);
     }
@@ -399,9 +403,9 @@ public class ResponseBuilderImplTest ext
     @Test
     public void testVariantsList() throws Exception {
         MetadataMap<String, Object> m = new MetadataMap<String, Object>();
-        m.add("Content-Type", "text/xml");
-        m.add("Content-Language", "en_UK");
-        m.add("Content-Language", "en_GB");
+        m.add("Content-Type", MediaType.TEXT_XML_TYPE);
+        m.add("Content-Language", new Locale("en", "UK"));
+        m.add("Content-Language", new Locale("en", "GB"));
         m.add("Content-Encoding", "compress");
         m.add("Content-Encoding", "gzip");
         m.add("Vary", "Accept");

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java Mon May 13 15:28:16 2013
@@ -47,7 +47,6 @@ import org.apache.cxf.jaxrs.resources.Bo
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 
 
@@ -68,7 +67,6 @@ public class ResponseImplTest extends As
     }
     
     @Test
-    @Ignore
     public void testGetHeaderStringUsingHeaderDelegate() throws Exception {
         StringBean bean = new StringBean("s3");
         RuntimeDelegate original = RuntimeDelegate.getInstance();

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java Mon May 13 15:28:16 2013
@@ -275,7 +275,7 @@ public class WadlGeneratorTest extends A
     private void checkResponse(Response r) throws Exception {
         assertNotNull(r);
         assertEquals(MediaType.APPLICATION_XML,
-                     r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE));
+                     r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE).toString());
 //        File f = new File("test.xml");
 //        f.delete();
 //        f.createNewFile();
@@ -300,7 +300,7 @@ public class WadlGeneratorTest extends A
         Message m = mockMessage("http://localhost:8080/baz", "", WadlGenerator.WADL_QUERY, cris);
         Response r = handleRequest(wg, m);
         assertEquals(WadlGenerator.WADL_TYPE.toString(),
-                     r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE));
+                     r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE).toString());
         String wadl = r.getEntity().toString();
         Document doc = DOMUtils.readXml(new StringReader(wadl));
         checkGrammars(doc.getDocumentElement(), "thebook", "books", "thebook2", "thechapter");

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/BinaryDataProviderTest.java Mon May 13 15:28:16 2013
@@ -54,7 +54,7 @@ public class BinaryDataProviderTest exte
         MessageBodyReader<Object> p = new BinaryDataProvider<Object>();
         assertTrue(p.isReadable(byte[].class, null, null, null)
                    && p.isReadable(InputStream.class, null, null, null)
-                   && !p.isReadable(File.class, null, null, null)
+                   && p.isReadable(File.class, null, null, null)
                    && !p.isReadable(int[].class, null, null, null));
     }
     

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java?rev=1481920&r1=1481919&r2=1481920&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java Mon May 13 15:28:16 2013
@@ -21,16 +21,19 @@ package org.apache.cxf.transport.http;
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URLConnection;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 import java.util.TreeMap;
-
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -416,7 +419,11 @@ public class Headers {
             } else {
                 StringBuilder sb = new StringBuilder();
                 for (int i = 0; i < headerList.size(); i++) {
-                    sb.append(headerList.get(i));
+                    Object headerValue = headerList.get(i);
+                    if (headerValue instanceof Date) {
+                        headerValue = toHttpDate((Date)headerValue);
+                    }
+                    sb.append(headerValue.toString());
                     if (i + 1 < headerList.size()) {
                         sb.append(',');
                     }
@@ -443,4 +450,16 @@ public class Headers {
         }
     }
 
+    public static SimpleDateFormat getHttpDateFormat() {
+        SimpleDateFormat dateFormat = 
+            new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+        TimeZone tZone = TimeZone.getTimeZone("GMT");
+        dateFormat.setTimeZone(tZone);
+        return dateFormat;
+    }
+    
+    public static String toHttpDate(Date date) {
+        SimpleDateFormat format = getHttpDateFormat();
+        return format.format(date);
+    }
 }