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 2008/12/08 19:36:43 UTC

svn commit: r724440 - in /cxf/branches/2.1.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ rt/frontend/...

Author: sergeyb
Date: Mon Dec  8 10:36:41 2008
New Revision: 724440

URL: http://svn.apache.org/viewvc?rev=724440&view=rev
Log:
Merged revisions 722117 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r722117 | sergeyb | 2008-12-01 16:36:47 +0000 (Mon, 01 Dec 2008) | 1 line
  
  JAXRS : support for custom provider media types plus few other minor changes
........

Added:
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
      - copied unchanged from r722117, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
Modified:
    cxf/branches/2.1.x-fixes/   (props changed)
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PathSegmentImpl.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XMLBeansJSONProvider.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
    cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
    cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
    cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
    cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
    cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
    cxf/branches/2.1.x-fixes/systests/src/test/resources/jaxrs/WEB-INF/beans.xml

Propchange: cxf/branches/2.1.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec  8 10:36:41 2008
@@ -1 +1 @@
-/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100,707902,708035,708044,708074,708410,708417,708550,708554,709353-709354,709425,710076,710150,71015
 4,711193,711388,711410,711490,711635,711949,711975,712194,712198,712238,712272,712299,712312,712670,712893,713082,713095-713096,713099,713584,713597,713737,713804,713899,714167-714168,714245,714255,717937-717961,718281-718448,718565,718620,718640,718665,718970,719017,719210,719215-719218,719222-719273,719305,719327,719354-719680,720053,720119,720218,720238,720293-720316,720497,721221,721241,721501,722129,723024,723338,723716,723778,723791,724333,724372
+/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100,707902,708035,708044,708074,708410,708417,708550,708554,709353-709354,709425,710076,710150,71015
 4,711193,711388,711410,711490,711635,711949,711975,712194,712198,712238,712272,712299,712312,712670,712893,713082,713095-713096,713099,713584,713597,713737,713804,713899,714167-714168,714245,714255,717937-717961,718281-718448,718565,718620,718640,718665,718970,719017,719210,719215-719218,719222-719273,719305,719327,719354-719680,720053,720119,720218,720238,720293-720316,720497,721221,721241,721501,722117,722129,723024,723338,723716,723778,723791,724333,724372

Propchange: cxf/branches/2.1.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PathSegmentImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PathSegmentImpl.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PathSegmentImpl.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PathSegmentImpl.java Mon Dec  8 10:36:41 2008
@@ -46,5 +46,9 @@
         int index = path.indexOf(';');
         return index != -1 ? path.substring(0, index) : path;
     }
+    
+    public String getOriginalPath() {
+        return path;
+    }
 
 }

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Mon Dec  8 10:36:41 2008
@@ -77,6 +77,13 @@
     }
     
     private static String updatePath(String path, String address) {
+        if (address.startsWith("http")) {
+            int idx = address.indexOf('/', 7);
+            if (idx != -1) {
+                address = address.substring(idx);
+            }
+        }
+        
         if (path.startsWith(address)) {
             path = path.substring(address.length());
             if (!path.startsWith("/")) {
@@ -94,7 +101,6 @@
             return;
         }
         
-        String path = (String)message.get(Message.REQUEST_URI);
         
         RequestPreprocessor rp = 
             ProviderFactory.getInstance(baseAddress).getRequestPreprocessor();
@@ -108,8 +114,9 @@
         if (requestContentType == null) {
             requestContentType = "*/*";
         }
-        
-        path = updatePath(path, baseAddress);
+
+        String rawPath = (String)message.get(Message.REQUEST_URI);        
+        rawPath = updatePath(rawPath, baseAddress);
         
         //1. Matching target resource class
         Service service = message.getExchange().get(Service.class);
@@ -124,12 +131,14 @@
         message.getExchange().put(Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
 
         MultivaluedMap<String, String> values = new MetadataMap<String, String>();
-        ClassResourceInfo resource = JAXRSUtils.selectResourceClass(resources, path, values);
+        ClassResourceInfo resource = JAXRSUtils.selectResourceClass(resources, 
+                                          rawPath, 
+                                          values);
         if (resource == null) {
             org.apache.cxf.common.i18n.Message errorMsg = 
                 new org.apache.cxf.common.i18n.Message("NO_ROOT_EXC", 
                                                    BUNDLE, 
-                                                   path);
+                                                   rawPath);
             LOG.severe(errorMsg.toString());
 
             throw new WebApplicationException(404);
@@ -150,7 +159,9 @@
                 
                 if (ori != null) {
                     values = new MetadataMap<String, String>();
-                    resource = JAXRSUtils.selectResourceClass(resources, path, values);
+                    resource = JAXRSUtils.selectResourceClass(resources, 
+                                                              rawPath, 
+                                                              values);
                 }
                 ori = JAXRSUtils.findTargetMethod(resource, values.getFirst(URITemplate.FINAL_MATCH_GROUP), 
                                                   httpMethod, values, requestContentType, acceptContentTypes);
@@ -170,7 +181,9 @@
             message.getExchange().put(Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
             if (ori != null) {
                 values = new MetadataMap<String, String>();
-                resource = JAXRSUtils.selectResourceClass(resources, path, values);
+                resource = JAXRSUtils.selectResourceClass(resources, 
+                                                          rawPath, 
+                                                          values);
             }
             ori = JAXRSUtils.findTargetMethod(resource, values.getFirst(URITemplate.FINAL_MATCH_GROUP), 
                                               httpMethod, values, requestContentType, acceptContentTypes);
@@ -178,7 +191,7 @@
         }
 
         
-        LOG.fine("Request path is: " + path);
+        LOG.fine("Request path is: " + rawPath);
         LOG.fine("Request HTTP method is: " + httpMethod);
         LOG.fine("Request contentType is: " + requestContentType);
         LOG.fine("Accept contentType is: " + acceptTypes);
@@ -187,7 +200,7 @@
             org.apache.cxf.common.i18n.Message errorMsg = 
                 new org.apache.cxf.common.i18n.Message("NO_OP_EXC", 
                                                    BUNDLE, 
-                                                   path,
+                                                   rawPath,
                                                    requestContentType,
                                                    acceptTypes);
             LOG.severe(errorMsg.toString());

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Mon Dec  8 10:36:41 2008
@@ -198,7 +198,7 @@
         List<MediaType> acceptContentTypes = 
             (List<MediaType>)exchange.get(Message.ACCEPT_CONTENT_TYPE);
         if (acceptContentTypes == null) {
-            acceptContentTypes = JAXRSUtils.sortMediaTypes("*/*");
+            acceptContentTypes = Collections.singletonList(MediaType.valueOf("*/*"));
         }        
         return JAXRSUtils.intersectMimeTypes(acceptContentTypes, produceTypes);
         

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java Mon Dec  8 10:36:41 2008
@@ -20,9 +20,6 @@
 package org.apache.cxf.jaxrs.model;
 
 import java.util.Comparator;
-import java.util.List;
-
-import javax.ws.rs.core.MediaType;
 
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 
@@ -51,17 +48,14 @@
             return g1 < g2 ? 1 : -1;
         }
         
-        List<MediaType> mimeType1 = e1.getConsumeTypes();
-        List<MediaType> mimeType2 = e2.getConsumeTypes();
         
-        int result = JAXRSUtils.compareMediaTypes(mimeType1.get(0), 
-                                                  mimeType2.get(0));
+        int result = JAXRSUtils.compareSortedMediaTypes(
+                          e1.getConsumeTypes(), 
+                          e2.getConsumeTypes());
         if (result == 0) {
             //use the media type of output data as the secondary key.
-            List<MediaType> mimeTypeP1 = e1.getProduceTypes();
-            List<MediaType> mimeTypeP2 = e2.getProduceTypes();
-            result =  JAXRSUtils.compareMediaTypes(mimeTypeP1.get(0), 
-                                                mimeTypeP2.get(0));
+            result = JAXRSUtils.compareSortedMediaTypes(e1.getProduceTypes(), 
+                                                        e2.getProduceTypes());
         }
         
         return result;

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java Mon Dec  8 10:36:41 2008
@@ -28,6 +28,10 @@
 
 import javax.ws.rs.Path;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+
+import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 
 public final class URITemplate {
     
@@ -133,7 +137,29 @@
 
         Matcher m = templateRegexPattern.matcher(uri);
         if (!m.matches()) {
-            return false;
+            if (uri.contains(";")) {
+                // we might be trying to match one or few path segments containing matrix
+                // parameters against a clear path segment as in @Path("base").
+                List<PathSegment> pList = JAXRSUtils.getPathSegments(template, false);
+                List<PathSegment> uList = JAXRSUtils.getPathSegments(uri, false);
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < uList.size(); i++) {
+                    sb.append('/');
+                    if (pList.size() > i && pList.get(i).getPath().indexOf('{') != -1) {
+                        // if it's URI template variable then keep the original value
+                        sb.append(HttpUtils.fromPathSegment(uList.get(i)));
+                    } else {
+                        sb.append(uList.get(i).getPath());
+                    }
+                }
+                uri = sb.toString();
+                m = templateRegexPattern.matcher(uri);
+                if (!m.matches()) {
+                    return false;
+                }
+            } else {
+                return false;
+            }
         }
 
         // Assign the matched template values to template variables

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Mon Dec  8 10:36:41 2008
@@ -51,7 +51,7 @@
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler;
 
-public abstract class AbstractJAXBProvider 
+public abstract class AbstractJAXBProvider extends AbstractConfigurableProvider
     implements MessageBodyReader<Object>, MessageBodyWriter<Object> {
     
     protected static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractJAXBProvider.class);

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java Mon Dec  8 10:36:41 2008
@@ -38,7 +38,7 @@
 
 @ConsumeMime("application/x-www-form-urlencoded")
 @Provider
-public final class FormEncodingReaderProvider implements MessageBodyReader<Object> {
+public class FormEncodingReaderProvider implements MessageBodyReader<Object> {
 
     private FormValidator validator;
     

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Mon Dec  8 10:36:41 2008
@@ -49,6 +49,14 @@
     
     private Map<String, Object> mProperties = new HashMap<String, Object>();
     
+    public void setConsumeMediaTypes(List<String> types) {
+        super.setConsumeMediaTypes(types);
+    }
+    
+    public void setProduceMediaTypes(List<String> types) {
+        super.setProduceMediaTypes(types);
+    }
+    
     public void setSchemas(List<String> locations) {
         super.setSchemaLocations(locations);
     }

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java Mon Dec  8 10:36:41 2008
@@ -54,7 +54,7 @@
 @ProduceMime("application/json")
 @ConsumeMime("application/json")
 @Provider
-public final class JSONProvider extends AbstractJAXBProvider  {
+public class JSONProvider extends AbstractJAXBProvider  {
     
     private static final String JAXB_DEFAULT_NAMESPACE = "##default";
     private static final String JAXB_DEFAULT_NAME = "##default";
@@ -63,6 +63,14 @@
     private boolean serializeAsArray;
     private List<String> arrayKeys;
     
+    public void setConsumeMediaTypes(List<String> types) {
+        super.setConsumeMediaTypes(types);
+    }
+    
+    public void setProduceMediaTypes(List<String> types) {
+        super.setProduceMediaTypes(types);
+    }
+    
     public void setSchemas(List<String> locations) {
         super.setSchemaLocations(locations);
     }

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Mon Dec  8 10:36:41 2008
@@ -30,8 +30,6 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.ws.rs.ConsumeMime;
-import javax.ws.rs.ProduceMime;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.ExceptionMapper;
@@ -52,10 +50,8 @@
     
     private static final Map<String, ProviderFactory> FACTORIES = 
         new HashMap<String, ProviderFactory>();
-    
-    static {
-        FACTORIES.put("/", new ProviderFactory());
-    }
+    private static final ProviderFactory DEFAULT_FACTORY = new ProviderFactory(); 
+    private static final String SLASH = "/"; 
     
     private List<ProviderInfo<MessageBodyReader>> defaultMessageReaders = 
         new ArrayList<ProviderInfo<MessageBodyReader>>();
@@ -80,6 +76,10 @@
     private ProviderFactory() {
         // TODO : this needs to be done differently,
         // we need to use cxf-jaxrs-extensions
+        
+        // TODO : make sure the default providers are shared between multiple
+        // factories
+        
         setProviders(defaultMessageReaders,
                      defaultMessageWriters,
                      userContextResolvers,
@@ -102,6 +102,10 @@
     }
     
     public static ProviderFactory getInstance(String baseAddress) {
+        if (SLASH.equals(baseAddress)) {
+            return DEFAULT_FACTORY;
+        }
+        
         ProviderFactory pf = null;
         synchronized (ProviderFactory.class) { 
             pf = FACTORIES.get(baseAddress);
@@ -341,8 +345,7 @@
             return false;
         }
         
-        List<MediaType> supportedMediaTypes =
-            JAXRSUtils.getConsumeTypes(ep.getClass().getAnnotation(ConsumeMime.class));
+        List<MediaType> supportedMediaTypes = JAXRSUtils.getProviderConsumeTypes(ep);
         
         List<MediaType> availableMimeTypes = 
             JAXRSUtils.intersectMimeTypes(Collections.singletonList(mediaType),
@@ -391,8 +394,7 @@
             return false;
         }
         
-        List<MediaType> supportedMediaTypes =
-            JAXRSUtils.getProduceTypes(ep.getClass().getAnnotation(ProduceMime.class));
+        List<MediaType> supportedMediaTypes = JAXRSUtils.getProviderProduceTypes(ep);
         
         List<MediaType> availableMimeTypes = 
             JAXRSUtils.intersectMimeTypes(Collections.singletonList(mediaType),
@@ -402,25 +404,6 @@
         
     }
     
-    public boolean deregisterEntityProvide(Object o) {
-        
-        if (o instanceof MessageBodyReader) {
-            return userMessageReaders.remove(o);
-        }
-        if (o instanceof MessageBodyWriter) {
-            return userMessageWriters.remove(o);
-        }
-        if (o instanceof ContextResolver) {
-            return userContextResolvers.remove(o);
-        }
-        if (o instanceof RequestHandler) {
-            return requestHandlers.remove(o);
-        }
-        
-        return false;
-                                               
-    }
-    
     List<ProviderInfo<MessageBodyReader>> getDefaultMessageReaders() {
         return Collections.unmodifiableList(defaultMessageReaders);
     }
@@ -466,31 +449,13 @@
                            ProviderInfo<MessageBodyReader> p2) {
             MessageBodyReader e1 = p1.getProvider();
             MessageBodyReader e2 = p2.getProvider();
-            
-            ConsumeMime c = e1.getClass().getAnnotation(ConsumeMime.class);
-            String[] mimeType1 = {"*/*"};
-            if (c != null) {
-                mimeType1 = c.value();               
-            }
-            
-            ConsumeMime c2 = e2.getClass().getAnnotation(ConsumeMime.class);
-            String[] mimeType2 = {"*/*"};
-            if (c2 != null) {
-                mimeType2 = c2.value();               
-            }
+            List<MediaType> types1 = JAXRSUtils.getProviderConsumeTypes(e1);
+            types1 = JAXRSUtils.sortMediaTypes(types1);
+            List<MediaType> types2 = JAXRSUtils.getProviderConsumeTypes(e2);
+            types2 = JAXRSUtils.sortMediaTypes(types2);
     
-            return compareString(mimeType1[0], mimeType2[0]);
-            
-        }
-
-        private int compareString(String str1, String str2) {
-            if (!str1.startsWith("*/") && str2.startsWith("*/")) {
-                return -1;
-            } else if (str1.startsWith("*/") && !str2.startsWith("*/")) {
-                return 1;
-            } 
+            return JAXRSUtils.compareSortedMediaTypes(types1, types2);
             
-            return str1.compareTo(str2);
         }
     }
     
@@ -502,30 +467,13 @@
             MessageBodyWriter e1 = p1.getProvider();
             MessageBodyWriter e2 = p2.getProvider();
             
-            ProduceMime c = e1.getClass().getAnnotation(ProduceMime.class);
-            String[] mimeType1 = {"*/*"};
-            if (c != null) {
-                mimeType1 = c.value();               
-            }
-            
-            ProduceMime c2 = e2.getClass().getAnnotation(ProduceMime.class);
-            String[] mimeType2 = {"*/*"};
-            if (c2 != null) {
-                mimeType2 = c2.value();               
-            }
+            List<MediaType> types1 =
+                JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderProduceTypes(e1));
+            List<MediaType> types2 =
+                JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderProduceTypes(e2));
     
-            return compareString(mimeType1[0], mimeType2[0]);
-            
-        }
-        
-        private int compareString(String str1, String str2) {
-            if (!str1.startsWith("*/") && str2.startsWith("*/")) {
-                return -1;
-            } else if (str1.startsWith("*/") && !str2.startsWith("*/")) {
-                return 1;
-            } 
+            return JAXRSUtils.compareSortedMediaTypes(types1, types2);
             
-            return str1.compareTo(str2);
         }
     }
     

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringProvider.java Mon Dec  8 10:36:41 2008
@@ -35,7 +35,7 @@
 import org.apache.cxf.helpers.IOUtils;
 
 @Provider
-public final class StringProvider 
+public class StringProvider 
     implements MessageBodyWriter<String>, MessageBodyReader<String>  {
 
     public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations) {

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XMLBeansJSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XMLBeansJSONProvider.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XMLBeansJSONProvider.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XMLBeansJSONProvider.java Mon Dec  8 10:36:41 2008
@@ -50,7 +50,7 @@
 @ProduceMime("application/json")
 @ConsumeMime("application/json")
 @Provider
-public final class XMLBeansJSONProvider extends XMLBeansElementProvider {
+public class XMLBeansJSONProvider extends XMLBeansElementProvider {
 
     /** {@inheritDoc} */
     @Override

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java Mon Dec  8 10:36:41 2008
@@ -20,14 +20,17 @@
 package org.apache.cxf.jaxrs.utils;
 
 import java.net.URI;
+import java.util.List;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.PathSegment;
 
+import org.apache.cxf.jaxrs.impl.PathSegmentImpl;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 
 public final class HttpUtils {
-    
     private static final String LOCAL_IP_ADDRESS = "127.0.0.1";
     private static final String LOCAL_HOST = "localhost";
     
@@ -51,4 +54,23 @@
         }
         return u;
     }
+    
+    
+    public static String fromPathSegment(PathSegment ps) {
+        if (PathSegmentImpl.class.isAssignableFrom(ps.getClass())) {
+            return ((PathSegmentImpl)ps).getOriginalPath();
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(ps.getPath());
+        for (Map.Entry<String, List<String>> entry : ps.getMatrixParameters().entrySet()) {
+            for (String value : entry.getValue()) {
+                sb.append(';').append(entry.getKey());
+                if (value != null) {
+                    sb.append('=').append(value);
+                }
+            }
+        }
+        return sb.toString();
+    }
+    
 }

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Mon Dec  8 10:36:41 2008
@@ -142,6 +142,10 @@
     
     public static Object handleParameter(String value, Class<?> pClass, boolean pathParam) {
         
+        if (value == null) {
+            return null;
+        }
+        
         if (pathParam) {
             PathSegment ps = new PathSegmentImpl(value, false);    
             if (PathSegment.class.isAssignableFrom(pClass)) {

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Mon Dec  8 10:36:41 2008
@@ -67,6 +67,7 @@
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWorkers;
+import javax.ws.rs.ext.MessageBodyWriter;
 
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
@@ -80,11 +81,11 @@
 import org.apache.cxf.jaxrs.impl.RequestImpl;
 import org.apache.cxf.jaxrs.impl.SecurityContextImpl;
 import org.apache.cxf.jaxrs.impl.UriInfoImpl;
-import org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfoComparator;
 import org.apache.cxf.jaxrs.model.URITemplate;
+import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageImpl;
@@ -107,9 +108,52 @@
                 theList.add(new PathSegmentImpl(path, decode));
             }
         }
+        int len = thePath.length();
+        if (len > 1 && thePath.charAt(len - 1) == '/') {
+            theList.add(new PathSegmentImpl("", false));
+        }
         return theList;
     }
 
+    @SuppressWarnings("unchecked")
+    private static String[] getUserMediaTypes(Object provider, String methodName) {
+        String[] values = null;
+        if (AbstractConfigurableProvider.class.isAssignableFrom(provider.getClass())) {
+            try {
+                Method m = provider.getClass().getMethod(methodName, new Class[]{});
+                List<String> types = (List<String>)m.invoke(provider, new Object[]{});
+                if (types != null) {
+                    values =  types.size() > 0 ? types.toArray(new String[]{})
+                                               : new String[]{"*/*"};
+                }
+            } catch (Exception ex) {
+                System.out.println();
+            }
+        }
+        return values;
+    }
+    
+    @SuppressWarnings("unchecked")
+    public static List<MediaType> getProviderConsumeTypes(MessageBodyReader provider) {
+        String[] values = getUserMediaTypes(provider, "getConsumeMediaTypes");
+        
+        if (values == null) {
+            ConsumeMime c = provider.getClass().getAnnotation(ConsumeMime.class);
+            values = c == null ? new String[]{"*/*"} : c.value();
+        }
+        return JAXRSUtils.getMediaTypes(values);
+    }
+    
+    public static List<MediaType> getProviderProduceTypes(MessageBodyWriter provider) {
+        String[] values = getUserMediaTypes(provider, "getProduceMediaTypes");
+        
+        if (values == null) {
+            ProduceMime c = provider.getClass().getAnnotation(ProduceMime.class);
+            values = c == null ? new String[]{"*/*"} : c.value();
+        }
+        return JAXRSUtils.getMediaTypes(values);
+    }
+    
     public static List<MediaType> getMediaTypes(String[] values) {
         List<MediaType> supportedMimeTypes = new ArrayList<MediaType>(values.length);
         for (int i = 0; i < values.length; i++) {
@@ -136,7 +180,6 @@
         ClassResourceInfo cri = ori.getClassResourceInfo();
         InjectionUtils.injectContextMethods(requestObject, cri, message);
         // Param methods
-        String relativePath = (String)message.get(JAXRSInInterceptor.RELATIVE_PATH);
         MultivaluedMap<String, String> values = 
             (MultivaluedMap<String, String>)message.get(URITemplate.TEMPLATE_PARAMETERS);
         for (Method m : cri.getParameterMethods()) {
@@ -145,7 +188,6 @@
                                                 m.getGenericParameterTypes()[0],
                                                 message,
                                                 values,
-                                                relativePath,
                                                 ori);
             if (o != null) { 
                 InjectionUtils.injectThroughMethod(requestObject, m, o);
@@ -158,7 +200,6 @@
                                                 f.getGenericType(),
                                                 message,
                                                 values,
-                                                relativePath,
                                                 ori);
             if (o != null) { 
                 InjectionUtils.injectFieldValue(f, requestObject, o);
@@ -268,6 +309,18 @@
                           : getMediaTypes(pm.value());
     }
     
+    public static int compareSortedMediaTypes(List<MediaType> mts1, List<MediaType> mts2) {
+        int size1 = mts1.size();
+        int size2 = mts2.size();
+        for (int i = 0; i < size1 && i < size2; i++) {
+            int result = compareMediaTypes(mts1.get(i), mts2.get(i));
+            if (result != 0) {
+                return result;
+            }
+        }
+        return size1 == size2 ? 0 : size1 < size2 ? -1 : 1;
+    }
+    
     public static int compareMediaTypes(MediaType mt1, MediaType mt2) {
         
         if (mt1.equals(mt2)) {
@@ -345,8 +398,6 @@
                                            OperationResourceInfo ori) {
         InputStream is = message.getContent(InputStream.class);
 
-        String path = (String)message.get(JAXRSInInterceptor.RELATIVE_PATH);
-        
         if (parameterAnns == null 
             || !AnnotationUtils.isMethodParamAnnotations(parameterAnns)) {
             
@@ -373,7 +424,6 @@
                                             parameterType,
                                             message,
                                             values,
-                                            path,
                                             ori);
         }
     }
@@ -383,7 +433,6 @@
                                             Type genericParam,
                                             Message message,
                                             MultivaluedMap<String, String> values,
-                                            String path,
                                             OperationResourceInfo ori) {
        
         boolean isEncoded = AnnotationUtils.isEncoded(anns, ori);
@@ -393,8 +442,8 @@
         
         PathParam pathParam = AnnotationUtils.getAnnotation(anns, PathParam.class);
         if (pathParam != null) {
-            result = readFromUriParam(pathParam, parameterClass, genericParam, path, 
-                                    values, defaultValue, !isEncoded);
+            result = readFromUriParam(message, pathParam, parameterClass, genericParam, 
+                                      values, defaultValue, !isEncoded);
         } 
         
         QueryParam qp = AnnotationUtils.getAnnotation(anns, QueryParam.class);
@@ -558,13 +607,14 @@
         return null;
     }
 
-    private static Object readFromUriParam(PathParam uriParamAnnotation,
+    private static Object readFromUriParam(Message m,
+                                           PathParam uriParamAnnotation,
                                            Class<?> paramType,
                                            Type genericType,
-                                           String path,
                                            MultivaluedMap<String, String> values,
                                            String defaultValue,
                                            boolean  decoded) {
+        
         String parameterName = uriParamAnnotation.value();
         if ("".equals(parameterName)) {
             return InjectionUtils.handleBean(paramType, values, true);

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java Mon Dec  8 10:36:41 2008
@@ -46,6 +46,53 @@
     }
     
     @Test
+    public void testMatchWithMatrixAndTemplate() throws Exception {
+        URITemplate uriTemplate = new URITemplate("/customers/{id}",
+                                                  false);
+        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
+        
+        boolean match = uriTemplate.match("/customers/123;123456/", values);
+        assertTrue(match);
+        String value = values.getFirst("id");
+        assertEquals("123;123456", value);
+    }
+    
+    @Test
+    public void testMatchWithMatrixOnClearPath1() throws Exception {
+        URITemplate uriTemplate = new URITemplate("/customers/{id}",
+                                                  false);
+        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
+        
+        boolean match = uriTemplate.match("/customers;123456/123/", values);
+        assertTrue(match);
+        String value = values.getFirst("id");
+        assertEquals("123", value);
+    }
+    
+    @Test
+    public void testMatchWithMatrixOnClearPath2() throws Exception {
+        URITemplate uriTemplate = new URITemplate("/customers/{id}/orders/{order}",
+                                                  false);
+        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
+        
+        assertTrue(uriTemplate.match("/customers;123456/123/orders;456/3", values));
+        assertEquals("123", values.getFirst("id"));
+        assertEquals("3", values.getFirst("order"));
+    }
+    
+    @Test
+    public void testMatchWithMatrixOnClearPath3() throws Exception {
+        URITemplate uriTemplate = new URITemplate("/{id}/customers/",
+                                                  false);
+        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
+        
+        boolean match = uriTemplate.match("/123/customers;123456/", values);
+        assertTrue(match);
+        String value = values.getFirst("id");
+        assertEquals("123", value);
+    }
+    
+    @Test
     public void testMatchBasicTwoParametersVariation1() throws Exception {
         URITemplate uriTemplate = new URITemplate("/customers/{name}/{department}",
                                                   false);

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java Mon Dec  8 10:36:41 2008
@@ -27,6 +27,7 @@
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import javax.ws.rs.ConsumeMime;
@@ -105,6 +106,28 @@
     }
     
     @Test
+    public void testSortEntityProvidersWithConfig() throws Exception {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        JSONProvider json1 = new JSONProvider();
+        pf.registerUserProvider(json1);
+        JSONProvider json2 = new JSONProvider();
+        json2.setConsumeMediaTypes(Collections.singletonList("application/abc"));
+        json2.setProduceMediaTypes(Collections.singletonList("application/sbc"));
+        pf.registerUserProvider(json2);
+        
+        List<ProviderInfo<MessageBodyReader>> readers = pf.getUserMessageReaders();
+
+        assertTrue(indexOf(readers, json2) 
+                   < indexOf(readers, json1));
+        
+        List<ProviderInfo<MessageBodyWriter>> writers = pf.getUserMessageWriters();
+
+        assertTrue(indexOf(writers, json1) 
+                   < indexOf(writers, json2));
+        
+    }
+    
+    @Test
     public void testGetStringProvider() throws Exception {
         verifyProvider(String.class, StringProvider.class, "text/html");
     }
@@ -207,6 +230,17 @@
         return index;
     }
     
+    private int indexOf(List<? extends Object> providerInfos, Object provider) {
+        int index = 0;
+        for (Object pi : providerInfos) {
+            if (((ProviderInfo)pi).getProvider() == provider) {
+                break;
+            }
+            index++;
+        }
+        return index;
+    }
+    
     @ConsumeMime("text/html")
     @ProduceMime("text/html")
     private final class TestStringProvider 

Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Mon Dec  8 10:36:41 2008
@@ -421,6 +421,40 @@
     }
     
     @Test
+    public void testCompareSortedMediaTypes() throws Exception {
+        MediaType m1 = MediaType.valueOf("text/xml");
+        MediaType m2 = MediaType.valueOf("text/*");
+        assertTrue("text/xml is more specific than text/*", 
+                   JAXRSUtils.compareSortedMediaTypes(Collections.singletonList(m1), 
+                                                      Collections.singletonList(m2)) < 0);
+        assertTrue("text/* is less specific than text/xml", 
+                   JAXRSUtils.compareSortedMediaTypes(Collections.singletonList(m2), 
+                                                      Collections.singletonList(m1)) > 0);
+        
+        assertTrue("text/xml is the same as text/xml", 
+                   JAXRSUtils.compareSortedMediaTypes(Collections.singletonList(m1), 
+                                                      Collections.singletonList(m1)) == 0);
+        
+        List<MediaType> sortedList1 = new ArrayList<MediaType>();
+        sortedList1.add(m1);
+        sortedList1.add(m2);
+                
+        List<MediaType> sortedList2 = new ArrayList<MediaType>();
+        sortedList2.add(m1);
+        sortedList2.add(m2);
+        
+        assertTrue("lists should be equal", 
+                   JAXRSUtils.compareSortedMediaTypes(sortedList1, sortedList2) == 0);
+        
+        sortedList1.add(MediaType.valueOf("*/*"));
+        assertTrue("first list should be less specific", 
+                   JAXRSUtils.compareSortedMediaTypes(sortedList1, sortedList2) > 0);
+        sortedList1.add(MediaType.valueOf("*/*"));
+        assertTrue("second list should be more specific", 
+                   JAXRSUtils.compareSortedMediaTypes(sortedList2, sortedList1) < 0);
+    }
+    
+    @Test
     public void testAcceptTypesMatch() throws Exception {
         
         Method m = Customer.class.getMethod("test", new Class[]{});

Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Mon Dec  8 10:36:41 2008
@@ -30,6 +30,7 @@
 import javax.ws.rs.DELETE;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
+import javax.ws.rs.MatrixParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
@@ -62,7 +63,6 @@
 
     public BookStore() {
         init();
-        System.out.println("----books: " + books.size());
     }
     
     @GET
@@ -108,6 +108,14 @@
     }
     
     @GET
+    @Path("/segment/matrix")
+    public Book getBookByMatrixParams(@MatrixParam("first") String s1,
+                                      @MatrixParam("second") String s2) throws Exception {
+        
+        return doGetBook(s1 + s2);
+    }
+    
+    @GET
     @Path("/bookquery")
     public Book getBookByURLQuery(@QueryParam("urlid") String urlValue) throws Exception {
         String url2 = new URL(urlValue).toString();
@@ -185,7 +193,6 @@
     
     @Path("/booksubresource/{bookId}/")
     public Book getBookSubResource(@PathParam("bookId") String id) throws BookNotFoundFault {
-        System.out.println("----invoking getBookSubResource with id: " + id);
         Book book = books.get(Long.parseLong(id));
         if (book != null) {
             return book;
@@ -200,7 +207,6 @@
     @Path("/booknames/{bookId}/")
     @ProduceMime("text/*")
     public String getBookName(@PathParam("bookId") int id) throws BookNotFoundFault {
-        System.out.println("----invoking getBookName with id: " + id);
         Book book = books.get(new Long(id));
         if (book != null) {
             return book.getName();
@@ -216,7 +222,6 @@
     @ProduceMime("text/xml")
     @ConsumeMime("application/xml")
     public Response addBook(Book book) {
-        System.out.println("----invoking addBook, book name is: " + book.getName());
         book.setId(++bookId);
         books.put(book.getId(), book);
 
@@ -234,7 +239,6 @@
     @PUT
     @Path("/books/")
     public Response updateBook(Book book) {
-        System.out.println("----invoking updateBook, book name is: " + book.getName());
         Book b = books.get(book.getId());
 
         Response r;
@@ -251,7 +255,6 @@
     @PUT
     @Path("/bookswithdom/")
     public DOMSource updateBook(DOMSource ds) {
-        System.out.println("----invoking updateBook with DOMSource");
         XMLUtils.printDOM(ds.getNode());
         return ds;
     }
@@ -260,7 +263,6 @@
     @Path("/bookswithjson/")
     @ConsumeMime("application/json")
     public Response updateBookJSON(Book book) {
-        System.out.println("----invoking updateBook, book name is: " + book.getName());
         Book b = books.get(book.getId());
 
         Response r;
@@ -277,7 +279,6 @@
     @DELETE
     @Path("/books/{bookId}/")
     public Response deleteBook(@PathParam("bookId") String id) {
-        System.out.println("----invoking deleteBook with bookId: " + id);
         Book b = books.get(Long.parseLong(id));
 
         Response r;
@@ -319,7 +320,6 @@
     @GET
     @Path("/cd/{CDId}/")
     public CD getCD() {
-        System.out.println("----invoking getCD with cdId: " + currentCdId);
         CD cd = cds.get(Long.parseLong(currentCdId));
 
         return cd;
@@ -329,7 +329,6 @@
     @Path("/cdwithmultitypes/{CDId}/")
     @ProduceMime({"application/xml", "application/json" }) 
     public CD getCDWithMultiContentTypes(@PathParam("CDId") String id) {
-        System.out.println("----invoking getCDWithMultiContentTypes with cdId: " + id);
         CD cd = cds.get(Long.parseLong(id));
 
         return cd;
@@ -338,7 +337,6 @@
     @GET
     @Path("/cds/")
     public CDs getCDs() {
-        System.out.println("----invoking getCDs");
         CDs c = new CDs();
         c.setCD(cds.values());
         return c;

Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java Mon Dec  8 10:36:41 2008
@@ -56,6 +56,7 @@
     
     @GET
     @Path("/books/{id}")
+    @ProduceMime({"application/jettison", "application/json" })
     public Book getBookById(@PathParam("id") Long id) {
         return books.get(id);
     }
@@ -96,7 +97,7 @@
     @POST
     @Path("books/convert")
     @ProduceMime("application/xml")
-    @ConsumeMime({"application/xml", "application/json" })
+    @ConsumeMime({"application/xml", "application/json", "application/jettison" })
     public Book convertBook(Book2 book) {
         // how to have Book2 populated ?
         Book b = new Book();

Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Mon Dec  8 10:36:41 2008
@@ -212,7 +212,21 @@
         getAndCompareAsStrings("http://localhost:9080/bookstore/segment/matrix;first=12;second=3",
                                "resources/expected_get_book123.txt",
                                "application/xml", 200);
-        
+        getAndCompareAsStrings("http://localhost:9080/bookstore;bar/segment;foo/"
+                               + "matrix;first=12;second=3;third",
+                               "resources/expected_get_book123.txt",
+                               "application/xml", 200);
+    }
+    
+    @Test
+    public void testGetBookByMatrixParameters() throws Exception {
+        getAndCompareAsStrings("http://localhost:9080/bookstore/segment/matrix;first=12;second=3",
+                               "resources/expected_get_book123.txt",
+                               "application/xml", 200);
+        getAndCompareAsStrings("http://localhost:9080/bookstore;bar/segment;foo;"
+                               + "first=12;second=3/matrix;third",
+                               "resources/expected_get_book123.txt",
+                               "application/xml", 200);
     }
     
     @Test

Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java Mon Dec  8 10:36:41 2008
@@ -54,7 +54,9 @@
     public void testGetBook123() throws Exception {
         String endpointAddress =
             "http://localhost:9080/bookstore/books/123"; 
-        getBook(endpointAddress, "resources/expected_get_book123json.txt"); 
+        getBook(endpointAddress, "resources/expected_get_book123json.txt");
+        getBook(endpointAddress, "resources/expected_get_book123json.txt",
+                "application/jettison");
     }
     
     @Test
@@ -91,9 +93,13 @@
     }
 
     private void getBook(String endpointAddress, String resource) throws Exception {
+        getBook(endpointAddress, resource, "application/json");
+    }
+    
+    private void getBook(String endpointAddress, String resource, String type) throws Exception {
         URL url = new URL(endpointAddress);
         URLConnection connect = url.openConnection();
-        connect.addRequestProperty("Accept", "application/json");
+        connect.addRequestProperty("Accept", type);
         InputStream in = connect.getInputStream();           
 
         InputStream expected = getClass().getResourceAsStream(resource);
@@ -164,6 +170,12 @@
                "application/json",
                "resources/add_book2json.txt",
                "resources/expected_get_book123.txt");
+        
+        doPost("http://localhost:9080/thebooks/bookstore/books/convert",
+               200,
+               "application/jettison",
+               "resources/add_book2json.txt",
+               "resources/expected_get_book123.txt");
     }
     
     private void doPost(String endpointAddress, int expectedStatus, String contentType,

Modified: cxf/branches/2.1.x-fixes/systests/src/test/resources/jaxrs/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/resources/jaxrs/WEB-INF/beans.xml?rev=724440&r1=724439&r2=724440&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/resources/jaxrs/WEB-INF/beans.xml (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/resources/jaxrs/WEB-INF/beans.xml Mon Dec  8 10:36:41 2008
@@ -79,6 +79,11 @@
     <value>classpath:/org/apache/cxf/systest/jaxrs/book.xsd</value>
   </util:list>
   
+  <util:list id="jsonTypes">
+    <value>application/json</value>
+    <value>application/jettison</value>
+  </util:list>
+  
   <util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
        <entry key="http://www.example.org/books" value="b"/>
   </util:map> 
@@ -93,6 +98,9 @@
 
       <property name="serializeAsArray" value="true"/> 
       <property name="arrayKeys" ref="jsonKeys"/>
+      
+      <property name="produceMediaTypes" ref="jsonTypes"/>
+      <property name="consumeMediaTypes" ref="jsonTypes"/>
   </bean>
 </beans>
 <!-- END SNIPPET: beans -->