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 2012/12/04 15:17:36 UTC

svn commit: r1416956 - in /cxf/branches/2.6.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/

Author: sergeyb
Date: Tue Dec  4 14:17:35 2012
New Revision: 1416956

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

........
  r1416953 | sergeyb | 2012-12-04 14:14:50 +0000 (Tue, 04 Dec 2012) | 1 line
  
  [CXF-4672] Better support for extraClass property when package JAXB contexts are created
........

Added:
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/
      - copied from r1416953, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/SuperBook3.java
      - copied unchanged from r1416953, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/SuperBook3.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/jaxb.index
      - copied unchanged from r1416953, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/jaxb/index/jaxb.index
Modified:
    cxf/branches/2.6.x-fixes/   (props changed)
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/trunk:r1416953

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

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1416956&r1=1416955&r2=1416956&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Tue Dec  4 14:17:35 2012
@@ -28,6 +28,7 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -124,6 +125,8 @@ public abstract class AbstractJAXBProvid
     
     private boolean skipJaxbChecks;
     private boolean singleJaxbContext;
+    private boolean useSingleContextForPackages;
+    
     private Class<?>[] extraClass;
     
     private boolean validateOutput;
@@ -156,6 +159,10 @@ public abstract class AbstractJAXBProvid
         singleJaxbContext = useSingleContext;
     }
     
+    public void setUseSingleContextForPackages(boolean use) {
+        useSingleContextForPackages = use;
+    }
+    
     public void setExtraClass(Class<?>[] userExtraClass) {
         extraClass = userExtraClass;
     }
@@ -163,14 +170,24 @@ public abstract class AbstractJAXBProvid
     @Override
     public void init(List<ClassResourceInfo> cris) {
         if (singleJaxbContext) {
-            Set<Class<?>> allTypes = 
-                new HashSet<Class<?>>(ResourceUtils.getAllRequestResponseTypes(cris, true)
+            JAXBContext context = null;
+            Set<Class<?>> allTypes = null;
+            if (cris != null) {    
+                allTypes = new HashSet<Class<?>>(ResourceUtils.getAllRequestResponseTypes(cris, true)
                     .getAllTypes().keySet());
-            JAXBContext context = 
-                ResourceUtils.createJaxbContext(allTypes, extraClass, cProperties);
+                context = ResourceUtils.createJaxbContext(allTypes, extraClass, cProperties);
+            } else if (extraClass != null) {
+                allTypes = new HashSet<Class<?>>(Arrays.asList(extraClass));
+                context = ResourceUtils.createJaxbContext(allTypes, null, cProperties);
+            }
+            
             if (context != null) {
                 for (Class<?> cls : allTypes) {
-                    classContexts.put(cls, context);
+                    if (useSingleContextForPackages) {
+                        packageContexts.put(PackageUtils.getPackageName(cls), context);
+                    } else {
+                        classContexts.put(cls, context);
+                    }
                 }
             }
         }
@@ -471,8 +488,21 @@ public abstract class AbstractJAXBProvid
             JAXBContext context = packageContexts.get(packageName);
             if (context == null) {
                 try {
-                    if (type.getClassLoader() != null && objectFactoryOrIndexAvailable(type)) { 
-                        context = JAXBContext.newInstance(packageName, type.getClassLoader(), cProperties);
+                    if (type.getClassLoader() != null && objectFactoryOrIndexAvailable(type)) {
+                        
+                        String contextName = packageName;
+                        if (extraClass != null) {
+                            StringBuilder sb = new StringBuilder(contextName);
+                            for (Class<?> extra : extraClass) {
+                                String extraPackage = PackageUtils.getPackageName(extra);
+                                if (!extraPackage.equals(packageName)) {
+                                    sb.append(":").append(extraPackage);
+                                }
+                            }
+                            contextName = sb.toString();
+                        }
+                        
+                        context = JAXBContext.newInstance(contextName, type.getClassLoader(), cProperties);
                         packageContexts.put(packageName, context);
                     }
                 } catch (JAXBException ex) {

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=1416956&r1=1416955&r2=1416956&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Tue Dec  4 14:17:35 2012
@@ -528,6 +528,54 @@ public class JAXBElementProviderTest ext
         assertEquals(124L, book.getSuperId());
     }
     
+    @Test
+    public void testObjectFactoryExtraClass() throws Exception {
+        JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book> provider 
+            = new JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book>();
+        provider.setExtraClass(new Class[]{org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3.class});
+
+        doTestObjectFactoryExtraClass(provider);
+    }
+    
+    @Test
+    public void testObjectFactoryExtraClass2() throws Exception {
+        JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book> provider 
+            = new JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book>();
+        provider.setExtraClass(new Class[] {
+            org.apache.cxf.jaxrs.fortest.jaxb.Book.class,                               
+            org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3.class});
+        provider.setSingleJaxbContext(true);
+        provider.setUseSingleContextForPackages(true);
+        provider.init(null);
+        
+        doTestObjectFactoryExtraClass(provider);
+    }
+    
+    private void doTestObjectFactoryExtraClass(JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book> provider)
+        throws Exception {
+
+        org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3 b = 
+            new org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3("CXF in Action", 123L, 124L);
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        provider.writeTo(b, org.apache.cxf.jaxrs.fortest.jaxb.Book.class, 
+                         org.apache.cxf.jaxrs.fortest.jaxb.Book.class,
+                         new Annotation[0], MediaType.TEXT_XML_TYPE, 
+                         new MetadataMap<String, Object>(), bos);
+        JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book> provider2 
+            = new JAXBElementProvider<org.apache.cxf.jaxrs.fortest.jaxb.Book>();
+        provider2.setExtraClass(new Class[]{org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3.class});
+        
+        ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
+        org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3 book = 
+            (org.apache.cxf.jaxrs.fortest.jaxb.index.SuperBook3)provider2.readFrom(
+                       org.apache.cxf.jaxrs.fortest.jaxb.Book.class, 
+                       org.apache.cxf.jaxrs.fortest.jaxb.Book.class,
+                       new Annotation[0], MediaType.TEXT_XML_TYPE, new MetadataMap<String, String>(), is);
+        assertEquals(124L, book.getSuperId());
+    }
+    
+    
     private void readSuperBook(String data, boolean xsiTypeExpected) throws Exception {
         if (xsiTypeExpected) {
             assertTrue(data.contains("xsi:type"));