You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/04/01 07:47:52 UTC

svn commit: r1087589 - in /geronimo/bundles/trunk/axis2: pom.xml src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java src/main/java/org/apache/axis2/jaxws/runtime/

Author: xuhaihong
Date: Fri Apr  1 05:47:52 2011
New Revision: 1087589

URL: http://svn.apache.org/viewvc?rev=1087589&view=rev
Log:
Try with the new Axis2 change from Geronimo side

Removed:
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/runtime/
Modified:
    geronimo/bundles/trunk/axis2/pom.xml
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java

Modified: geronimo/bundles/trunk/axis2/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/pom.xml?rev=1087589&r1=1087588&r2=1087589&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/pom.xml (original)
+++ geronimo/bundles/trunk/axis2/pom.xml Fri Apr  1 05:47:52 2011
@@ -243,12 +243,7 @@
                            org/apache/axis2/jaxws/message/databinding/JAXBUtils$4.class=target/classes/org/apache/axis2/jaxws/message/databinding/JAXBUtils$4.class,
                            org/apache/axis2/jaxws/message/databinding/JAXBUtils$3.class=target/classes/org/apache/axis2/jaxws/message/databinding/JAXBUtils$3.class,
                            org/apache/axis2/jaxws/message/databinding/JAXBUtils$2.class=target/classes/org/apache/axis2/jaxws/message/databinding/JAXBUtils$2.class,
-                           org/apache/axis2/jaxws/message/databinding/JAXBUtils$1.class=target/classes/org/apache/axis2/jaxws/message/databinding/JAXBUtils$1.class,
-                           org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.class=target/classes/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.class,
-                           org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$1.class=target/classes/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$1.class,
-                           org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$2.class=target/classes/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$2.class,
-                           org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$3.class=target/classes/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$3.class,
-                           org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$4.class=target/classes/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor$4.class
+                           org/apache/axis2/jaxws/message/databinding/JAXBUtils$1.class=target/classes/org/apache/axis2/jaxws/message/databinding/JAXBUtils$1.class
                         </Include-Resource>
                         <SPI-Provider>true</SPI-Provider>
                     </instructions>

Modified: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java?rev=1087589&r1=1087588&r2=1087589&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java (original)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java Fri Apr  1 05:47:52 2011
@@ -19,9 +19,27 @@
 
 package org.apache.axis2.jaxws.client.proxy;
 
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Holder;
+import javax.xml.ws.Response;
+import javax.xml.ws.WebServiceException;
+import javax.xml.ws.WebServiceFeature;
+import javax.xml.ws.soap.SOAPBinding;
+
 import org.apache.axis2.addressing.AddressingConstants;
-import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.addressing.AddressingConstants.Final;
+import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.jaxws.BindingProvider;
 import org.apache.axis2.jaxws.ExceptionFactory;
@@ -51,21 +69,6 @@ import org.apache.axis2.transport.http.H
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.ws.AsyncHandler;
-import javax.xml.ws.Holder;
-import javax.xml.ws.Response;
-import javax.xml.ws.WebServiceException;
-import javax.xml.ws.WebServiceFeature;
-import javax.xml.ws.soap.SOAPBinding;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-
 /**
  * ProxyHandler is the java.lang.reflect.InvocationHandler implementation. When a JAX-WS client
  * calls the method on a proxy object, created by calling the ServiceDelegate.getPort(...) method,
@@ -696,6 +699,7 @@ public class JAXWSProxyHandler extends B
                 }
             }
             
+            List<String> classRefs = JAXBUtils.pruneDirectives(new TreeSet<String>(marshalDesc.getPackages()));
             // Heuristic to choose the better classloader to marshal the
             // data.  Slight priority given to the classloader that loaded
             // the sei class.
@@ -713,6 +717,10 @@ public class JAXWSProxyHandler extends B
                     log.debug("Could not load JAXBContext for Context ClassLoader");
                 }
                 cl = classCL;
+            } else if (JAXBUtils.containsClasses(jbc_classCL, classRefs)) {
+                cl = classCL;
+            } else if (JAXBUtils.containsClasses(jbc_contextCL, classRefs)) {
+                cl = contextCL;
             } else if (holder_contextCL.value == JAXBUtils.CONSTRUCTION_TYPE.BY_CONTEXT_PATH &&
                     holder_classCL.value == JAXBUtils.CONSTRUCTION_TYPE.BY_CONTEXT_PATH) {
                 // Both were successfully built with the context path.
@@ -748,7 +756,7 @@ public class JAXWSProxyHandler extends B
         }
         return cl;
     }
-    
+        
     private static ClassLoader getContextClassLoader() {
         // NOTE: This method must remain private because it uses AccessController
         ClassLoader cl = null;

Modified: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?rev=1087589&r1=1087588&r2=1087589&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Fri Apr  1 05:47:52 2011
@@ -34,6 +34,7 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.JAXBIntrospector;
 import javax.xml.bind.Marshaller;
+import javax.xml.bind.PropertyException;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.ws.Holder;
@@ -45,6 +46,7 @@ import java.io.UnsupportedEncodingExcept
 import java.lang.annotation.Annotation;
 import java.lang.ref.SoftReference;
 import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Array;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.security.PrivilegedActionException;
@@ -61,50 +63,50 @@ import java.util.concurrent.ConcurrentHa
 
 
 /**
- * JAXB Utilites to pool JAXBContext and related objects.
+ * JAXB Utilites to pool JAXBContext and related objects. 
  */
 public class JAXBUtils {
 
     private static final Log log = LogFactory.getLog(JAXBUtils.class);
 
-    // Create a concurrent map to get the JAXBObject:
+    // Create a concurrent map to get the JAXBObject: 
     //    key is the String (sorted packages)
     //    value is a SoftReference to a ConcurrentHashMap of Classloader keys and JAXBContextValue objects
     //               It is a soft map to encourage GC in low memory situations
     private static Map<
-        String,
+        String, 
         SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>> jaxbMap =
-            new ConcurrentHashMap<String,
+            new ConcurrentHashMap<String, 
                 SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>>();
 
     private static Pool<JAXBContext, Marshaller>       mpool = new Pool<JAXBContext, Marshaller>();
     private static Pool<JAXBContext, Unmarshaller>     upool = new Pool<JAXBContext, Unmarshaller>();
     private static Pool<JAXBContext, JAXBIntrospector> ipool = new Pool<JAXBContext, JAXBIntrospector>();
-
+    
     // From Lizet Ernand:
-    // If you really care about the performance,
-    // and/or your application is going to read a lot of small documents,
-    // then creating Unmarshaller could be relatively an expensive operation.
+    // If you really care about the performance, 
+    // and/or your application is going to read a lot of small documents, 
+    // then creating Unmarshaller could be relatively an expensive operation. 
     // In that case, consider pooling Unmarshaller objects.
-    // Different threads may reuse one Unmarshaller instance,
-    // as long as you don't use one instance from two threads at the same time.
+    // Different threads may reuse one Unmarshaller instance, 
+    // as long as you don't use one instance from two threads at the same time. 
     // ENABLE_ADV_POOLING is false...which means they are obtained from the JAXBContext instead of
     // from the pool.
     private static boolean ENABLE_MARSHALL_POOLING = true;
     private static boolean ENABLE_UNMARSHALL_POOLING = true;
     private static boolean ENABLE_INTROSPECTION_POOLING = false;
-
+    
     private static int MAX_LOAD_FACTOR = 32;  // Maximum number of JAXBContext to store
 
     // Construction Type
     public enum CONSTRUCTION_TYPE {
-        BY_CLASS_ARRAY,   // New Instance with Class[]
+        BY_CLASS_ARRAY,   // New Instance with Class[] 
         BY_CONTEXT_PATH,  // New Instance with context path string (preferred)
         BY_CLASS_ARRAY_PLUS_ARRAYS, // New Instance with Class[] plus arrays of each class are added
         UNKNOWN}
 
     ;
-
+    
     // Some packages have a known set of classes.
     // This map is immutable after its static creation.
     private static final Map<String, List<Class>> specialMap = new HashMap<String, List<Class>>();
@@ -114,9 +116,9 @@ public class JAXBUtils {
         classes.add(W3CEndpointReference.class);
         specialMap.put("javax.xml.ws.wsaddressing", classes);
     }
-
+    
     public static final String DEFAULT_NAMESPACE_REMAP = getDefaultNamespaceRemapProperty();
-
+    
     /**
      * Get a JAXBContext for the class
      *
@@ -126,13 +128,13 @@ public class JAXBUtils {
      * @deprecated
      */
     public static JAXBContext getJAXBContext(TreeSet<String> contextPackages) throws JAXBException {
-        return getJAXBContext(contextPackages, new Holder<CONSTRUCTION_TYPE>(),
+        return getJAXBContext(contextPackages, new Holder<CONSTRUCTION_TYPE>(), 
                               contextPackages.toString(), null, null);
     }
 
     /**
      * Get a JAXBContext for the class
-     *
+     * 
      * Note: The contextPackage object is used by multiple threads.  It should be considered immutable
      * and not altered by this method.
      *
@@ -142,13 +144,13 @@ public class JAXBUtils {
      * @throws JAXBException
      * @deprecated
      */
-    public static JAXBContext getJAXBContext(TreeSet<String> contextPackages, ClassLoader
+    public static JAXBContext getJAXBContext(TreeSet<String> contextPackages, ClassLoader 
                                              cacheKey) throws JAXBException {
         return getJAXBContext(contextPackages, new Holder<CONSTRUCTION_TYPE>(),
                               contextPackages.toString(), cacheKey, null);
     }
-
-    public static JAXBContext getJAXBContext(TreeSet<String> contextPackages,
+    
+    public static JAXBContext getJAXBContext(TreeSet<String> contextPackages, 
                                              Holder<CONSTRUCTION_TYPE> constructionType,
                                              String key)
         throws JAXBException {
@@ -160,8 +162,8 @@ public class JAXBUtils {
      *
      * Note: The contextPackage object is used by multiple threads.  It should be considered immutable
      * and not altered by this method.
-     *
-     * @param contextPackage  Set<Package>
+     * 
+     * @param contextPackage  Set<Package> 
      * @param contructionType (output value that indicates how the context was constructed)
      * @param cacheKey ClassLoader
      * @return JAXBContext
@@ -173,11 +175,11 @@ public class JAXBUtils {
                                              ClassLoader cacheKey,
                                              Map<String, ?> properties)
             throws JAXBException {
-        return getJAXBContext(contextPackages,
-                        constructionType,
-                        false,
-                        key,
-                        cacheKey,
+        return getJAXBContext(contextPackages, 
+                        constructionType, 
+                        false, 
+                        key, 
+                        cacheKey, 
                         properties);
     }
     /**
@@ -185,8 +187,8 @@ public class JAXBUtils {
      *
      * Note: The contextPackage object is used by multiple threads.  It should be considered immutable
      * and not altered by this method.
-     *
-     * @param contextPackage  Set<Package>
+     * 
+     * @param contextPackage  Set<Package> 
      * @param contructionType (output value that indicates how the context was constructed)
      * @param forceArrays (forces the returned JAXBContext to include the array types)
      * @param cacheKey ClassLoader
@@ -194,11 +196,11 @@ public class JAXBUtils {
      * @throws JAXBException
      */
     public static JAXBContext getJAXBContext(TreeSet<String> contextPackages,
-                                             Holder<CONSTRUCTION_TYPE> constructionType,
+                                             Holder<CONSTRUCTION_TYPE> constructionType, 
                                              boolean forceArrays,
                                              String key,
                                              ClassLoader cacheKey,
-                                             Map<String, ?> properties)
+                                             Map<String, ?> properties) 
         throws JAXBException {
         // JAXBContexts for the same class can be reused and are supposed to be thread-safe
         if (log.isDebugEnabled()) {
@@ -213,13 +215,13 @@ public class JAXBUtils {
 
         // Get or Create The InnerMap using the package key
         ConcurrentHashMap<ClassLoader, JAXBContextValue> innerMap = null;
-        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>
+        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>> 
             softRef = jaxbMap.get(key);
-
+        
         if (softRef != null) {
             innerMap = softRef.get();
         }
-
+        
         if (innerMap == null) {
             synchronized(jaxbMap) {
                 softRef = jaxbMap.get(key);
@@ -228,38 +230,38 @@ public class JAXBUtils {
                 }
                 if (innerMap == null) {
                     innerMap = new ConcurrentHashMap<ClassLoader, JAXBContextValue>();
-                    softRef =
+                    softRef = 
                         new SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>(innerMap);
                     jaxbMap.put(key, softRef);
                 }
             }
         }
-
-        // Now get the contextValue using either the classloader key or
+        
+        // Now get the contextValue using either the classloader key or 
         // the current Classloader
         ClassLoader cl = getContextClassLoader();
         JAXBContextValue contextValue = null;
         if(cacheKey != null) {
             if(log.isDebugEnabled()) {
-                log.debug("Using supplied classloader to retrieve JAXBContext: " +
+                log.debug("Using supplied classloader to retrieve JAXBContext: " + 
                           cacheKey);
             }
             contextValue = innerMap.get(cacheKey);
         } else {
             if(log.isDebugEnabled()) {
-                log.debug("Using classloader from Thread to retrieve JAXBContext: " +
+                log.debug("Using classloader from Thread to retrieve JAXBContext: " + 
                           cl);
             }
             contextValue = innerMap.get(cl);
         }
-
+      
         // If the context value is found, but the caller requested that the JAXBContext
         // contain arrays, then rebuild the JAXBContext value
         if (forceArrays &&
-            contextValue != null &&
+            contextValue != null && 
             contextValue.constructionType != JAXBUtils.CONSTRUCTION_TYPE.BY_CLASS_ARRAY_PLUS_ARRAYS) {
             if(log.isDebugEnabled()) {
-                log.debug("Found a JAXBContextValue with constructionType=" +
+                log.debug("Found a JAXBContextValue with constructionType=" + 
                             contextValue.constructionType + "  but the caller requested a JAXBContext " +
                           " that includes arrays.  A new JAXBContext will be built");
             }
@@ -276,39 +278,39 @@ public class JAXBUtils {
                 contextValue = innerMap.get(clKey);
                 adjustPoolSize(innerMap);
                 if (forceArrays &&
-                        contextValue != null &&
+                        contextValue != null && 
                         contextValue.constructionType != JAXBUtils.CONSTRUCTION_TYPE.BY_CLASS_ARRAY_PLUS_ARRAYS) {
                     contextValue = null;
                 }
                 if (contextValue==null) {
                     // Create a copy of the contextPackages.  This new TreeSet will
                     // contain only the valid contextPackages.
-                    // Note: The original contextPackage set is accessed by multiple
+                    // Note: The original contextPackage set is accessed by multiple 
                     // threads and should not be altered.
 
-                    TreeSet<String> validContextPackages = new TreeSet<String>(contextPackages);
-
+                    TreeSet<String> validContextPackages = new TreeSet<String>(contextPackages); 
+                    
                     List<String> classRefs = pruneDirectives(validContextPackages);
-
+                    
                     int numPackages = validContextPackages.size();
-
-                    contextValue = createJAXBContextValue(validContextPackages,
-                            clKey,
-                            forceArrays,
-                            properties,
+                    
+                    contextValue = createJAXBContextValue(validContextPackages, 
+                            clKey, 
+                            forceArrays, 
+                            properties, 
                             classRefs);
-
+                    
                     synchronized (jaxbMap) {
                         // Add the context value with the original package set
                         ConcurrentHashMap<ClassLoader, JAXBContextValue> map1 = null;
-                        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>
+                        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>> 
                         softRef1 = jaxbMap.get(key);
                         if (softRef1 != null) {
                             map1 = softRef1.get();
                         }
                         if (map1 == null) {
                             map1 = new ConcurrentHashMap<ClassLoader, JAXBContextValue>();
-                            softRef1 =
+                            softRef1 = 
                                 new SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>(map1);
                             jaxbMap.put(key, softRef1);
                         }
@@ -318,24 +320,24 @@ public class JAXBUtils {
 
                         // Add the context value with the new package set
                         ConcurrentHashMap<ClassLoader, JAXBContextValue> map2 = null;
-                        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>
+                        SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>> 
                         softRef2 = jaxbMap.get(validPackagesKey);
                         if (softRef2 != null) {
                             map2 = softRef2.get();
                         }
                         if (map2 == null) {
                             map2 = new ConcurrentHashMap<ClassLoader, JAXBContextValue>();
-                            softRef2 =
+                            softRef2 = 
                                 new SoftReference<ConcurrentHashMap<ClassLoader, JAXBContextValue>>(map2);
                             jaxbMap.put(validPackagesKey, softRef2);
                         }
                         map2.put(clKey, contextValue);
-
+                        
                         if (log.isDebugEnabled()) {
                             log.debug("JAXBContext [created] for " + key);
                             log.debug("JAXBContext also stored by the list of valid packages:" + validPackagesKey);
                         }
-                    }
+                    }        
                 }
             }
         } else {
@@ -351,16 +353,16 @@ public class JAXBUtils {
         constructionType.value = contextValue.constructionType;
         return contextValue.jaxbContext;
     }
-
+    
     /**
-     * The contextPackages may declare overrides.
+     * The contextPackages may declare overrides.  
      * Example:
      *    "com.A"
      *    "com.B"
      *    "com.C"
      *    "@com.A"   <-- Indicates a reference to a class (versus ns 2 pkg conversion)
      *    "com.A > com.B"   <-- This says com.A overrides com.B
-     *
+     *    
      * This method prunes the overrides and overriden packages.
      * Example return:
      *    "com.A"
@@ -368,11 +370,11 @@ public class JAXBUtils {
      * @param contextPackages
      * @return List<String> class references
      */
-    protected static List<String> pruneDirectives(TreeSet<String> contextPackages) {
+    public static List<String> pruneDirectives(TreeSet<String> contextPackages) {
         List<String> removePkgsList = new ArrayList<String>();
         List<String> strongPkgsList = new ArrayList<String>();
         List<String> classRefs = new ArrayList<String>();
-
+        
         // Walk the contextPackages looking for entries representing directives
         Iterator<String> it = contextPackages.iterator();
         while (it.hasNext()) {
@@ -383,8 +385,8 @@ public class JAXBUtils {
                     log.debug("Override found:" + entry);
                 }
                 // Remove the entry using an iterator remove()
-                it.remove();
-
+                it.remove();  
+                
                 // Store the overridden package
                 String removePkg = entry.substring(entry.indexOf(">") + 1);
                 removePkg = removePkg.trim();
@@ -395,8 +397,8 @@ public class JAXBUtils {
                     log.debug("Strong (class) reference found:" + entry);
                 }
                 // Remove the entry using an iterator remove()
-                it.remove();
-
+                it.remove();  
+                
                 // Store the overridden package
                 String strongPkg = entry.substring(1);
                 strongPkg = strongPkg.trim();
@@ -407,14 +409,14 @@ public class JAXBUtils {
                     log.debug("Class Reference found:" + entry);
                 }
                 // Remove the entry using an iterator remove()
-                it.remove();
-
+                it.remove();  
+                
                 // Store the class
                 String cls = entry.substring(1, entry.length()-1);
                 classRefs.add(cls);
             }
         }
-
+        
         // Now walk the contextPackages and remove the overriden packages
         it = contextPackages.iterator();
         while (it.hasNext()) {
@@ -425,10 +427,10 @@ public class JAXBUtils {
                     log.debug("Removing override package:" + entry);
                 }
                 // Remove the overridden package using an iterator remove()
-                it.remove();
+                it.remove();  
             }
         }
-
+        
         // Now add back all of the strong packages
         contextPackages.addAll(strongPkgsList);
         return classRefs;
@@ -453,9 +455,9 @@ public class JAXBUtils {
 
         JAXBContextValue contextValue = null;
         if (log.isDebugEnabled()) {
-
+            
             log.debug("Following packages are in this batch of getJAXBContext() :");
-
+            
             for (String pkg : contextPackages) {
                 log.debug(pkg);
             }
@@ -494,14 +496,14 @@ public class JAXBUtils {
         //    all of the packages separated by colons.
         // 2) USE A CLASS[], which is an array of all of the classes
         //    involved in the marshal/unmarshal.
-        //
+        //   
         // There are pros/cons with both approaches.
-        // USE A CONTEXTPATH:
-        //    Pros: preferred way of doing this.
+        // USE A CONTEXTPATH: 
+        //    Pros: preferred way of doing this.  
         //          performant
         //          most dynamic
         //    Cons: Each package in context path must have an ObjectFactory
-        //
+        //        
         //
         // USE CLASS[]:
         //    Pros: Doesn't require ObjectFactory in each package
@@ -559,7 +561,7 @@ public class JAXBUtils {
             }
         }
 
-        // The code above may have removed some packages from the list.
+        // The code above may have removed some packages from the list. 
         // Retry our lookup with the updated list
         if (contextConstruction) {
             if (log.isDebugEnabled()) {
@@ -575,15 +577,15 @@ public class JAXBUtils {
             if (innerMap != null) {
                 contextValue = innerMap.get(cl);
                 if (forceArrays &&
-                        contextValue != null &&
+                        contextValue != null && 
                         contextValue.constructionType != JAXBUtils.CONSTRUCTION_TYPE.BY_CLASS_ARRAY_PLUS_ARRAYS) {
                     if(log.isDebugEnabled()) {
-                        log.debug("Found a JAXBContextValue with constructionType=" +
+                        log.debug("Found a JAXBContextValue with constructionType=" + 
                                 contextValue.constructionType + "  but the caller requested a JAXBContext " +
                         " that includes arrays.  A new JAXBContext will be built");
                     }
                     contextValue = null;
-                }
+                } 
 
                 if (contextValue != null) {
                     if (log.isDebugEnabled()) {
@@ -632,10 +634,6 @@ public class JAXBUtils {
             }
             JAXBContext context = JAXBContext_newInstance(classArray, cl, properties, classRefs);
             if (context != null) {
-                List<String> unContainedClasses = getUnContainedClasses(context, classRefs);
-                if (unContainedClasses.size() > 0) {
-                    throw new JAXBException("Classes in the " + unContainedClasses +" could not find in the built JAXBContext with classArrays");
-                }
                 if (forceArrays) {
                     contextValue = new JAXBContextValue(context, CONSTRUCTION_TYPE.BY_CLASS_ARRAY_PLUS_ARRAYS);
                 } else {
@@ -735,7 +733,7 @@ public class JAXBUtils {
      */
     public static Marshaller getJAXBMarshaller(JAXBContext context) throws JAXBException {
         Marshaller m = null;
-
+        
         if (!ENABLE_MARSHALL_POOLING) {
             if (log.isDebugEnabled()) {
                 log.debug("Marshaller created [no pooling]");
@@ -759,7 +757,7 @@ public class JAXBUtils {
     }
 
     /**
-     * releaseJAXBMarshalller
+     * releaseJAXBMarshalller 
      * Do not call this method if an exception occurred while using the
      * Marshaller. We don't want an object in an invalid state.
      *
@@ -774,7 +772,7 @@ public class JAXBUtils {
         }
         if (ENABLE_MARSHALL_POOLING) {
             // Make sure to clear any state or properties
-
+            
             try {
                 marshaller.setAttachmentMarshaller(null);
                 // Set the JAXB_ENCODING back to the default value UTF-8
@@ -786,7 +784,7 @@ public class JAXBUtils {
                     log.debug("The following exception is ignored. Processing continues " + t);
                 }
             }
-
+            
         }
     }
 
@@ -877,7 +875,7 @@ public class JAXBUtils {
             Class cls = forName(p + ".package-info", false, cl);
             if (cls != null) {
                 return true;
-            }
+            }  
         } catch (Throwable e) {
             //Catch Throwable as ClassLoader can throw an NoClassDefFoundError that
             //does not extend Exception. So we will absorb any Throwable exception here.
@@ -918,8 +916,8 @@ public class JAXBUtils {
                 log.debug("Attempting to create JAXBContext with contextPath=" + contextpath);
             }
             context = JAXBContext_newInstance(contextpath, cl);
-
-            if (getUnContainedClasses(context, classRefs).size() > 0) {
+            
+            if (!containsClasses(context, classRefs)) {
                 if (log.isDebugEnabled()) {
                     log.debug("  Unsuccessful: Will now use an alterative JAXBConstruct construction");
                 }
@@ -937,13 +935,13 @@ public class JAXBUtils {
         }
         return context;
     }
-
+    
     /**
      * containsClasses
-     * @param JAXBContext
+     * @param JAXBContext 
      * @param List<String> classRefs
      */
-    private static List<String> getUnContainedClasses(JAXBContext context, List<String> classRefs) {
+    public static boolean containsClasses(JAXBContext context, List<String> classRefs) {
         String text = context.toString();
         text = text.replace('\n', ' ');
         text = text.replace('\t', ' ');
@@ -951,8 +949,7 @@ public class JAXBUtils {
         text = text.replace('<', ' ');
         text = text.replace('[', ' ');
         text = text.replace(']', ' ');
-
-        List<String> unContainedClasses = new ArrayList<String>();
+        
         for (String classRef: classRefs) {
             // Strip off generic and array chars
             int index = classRef.indexOf('<');
@@ -963,7 +960,7 @@ public class JAXBUtils {
             if (index > 0) {
                 classRef = classRef.substring(0, index);
             }
-
+            
             if (classRef.length() == 0 ||
                 classRef.endsWith(".ObjectFactory") ||
                 classRef.startsWith("java.util.") ||
@@ -971,15 +968,15 @@ public class JAXBUtils {
                 // skip these
             } else {
                 String search = " " + classRef + " ";
-                if (!text.contains(search)) {
+                if (!text.contains(search)) {               
                     if (log.isDebugEnabled()) {
                         log.debug("The context does not contain " + classRef + " " + context);
                     }
-                    unContainedClasses.add(classRef);
+                    return false;
                 }
             }
         }
-        return unContainedClasses;
+        return true;
     }
 
     /**
@@ -1000,7 +997,7 @@ public class JAXBUtils {
             }
             return new ArrayList<Class>();
         }
-
+        
         // See if this is a special package that has a set of known classes.
         List<Class> knownClasses = specialMap.get(pkg);
         if (knownClasses != null) {
@@ -1062,7 +1059,7 @@ public class JAXBUtils {
             log.debug("End: Obtain packages from ClassFinder plugin");
         }
         if (log.isDebugEnabled()) {
-
+            
             try {
                 log.debug("End: getAllClassesFromPackage for " + pkg + "with classes " + classes);
             } catch (Throwable e) {
@@ -1072,18 +1069,18 @@ public class JAXBUtils {
         }
         return classes;
     }
-
+    
     /**
      * @param list
      * @param pkg
      */
     private static void checkClasses(List<Class> list, String pkg) {
-        // The installed classfinder or directory search may inadvertently add too many
+        // The installed classfinder or directory search may inadvertently add too many 
         // classes.  This rountine is a 'double check' to make sure that the classes
         // are acceptable.
         for (int i=0; i<list.size();) {
             Class cls = list.get(i);
-            if (!cls.isInterface() &&
+            if (!cls.isInterface() && 
                     (cls.isEnum() ||
                      getAnnotation(cls, XmlType.class) != null ||
                      ClassUtils.getDefaultPublicConstructor(cls) != null) &&
@@ -1147,15 +1144,15 @@ public class JAXBUtils {
                         try {
                             Class clazz = forName(className,
                                                   false, getContextClassLoader());
-                            // Don't add any interfaces or JAXWS specific classes.
-                            // Only classes that represent data and can be marshalled
+                            // Don't add any interfaces or JAXWS specific classes.  
+                            // Only classes that represent data and can be marshalled 
                             // by JAXB should be added.
                             if (!clazz.isInterface()
                                     && (clazz.isEnum() ||
                                         getAnnotation(clazz, XmlType.class) != null ||
                                         ClassUtils.getDefaultPublicConstructor(clazz) != null)
                                     && !ClassUtils.isJAXWSClass(clazz)
-                                    && !isSkipClass(clazz)
+                                    && !isSkipClass(clazz) 
                                     && !java.lang.Exception.class.isAssignableFrom(clazz)) {
 
                                 // Ensure that all the referenced classes are loadable too
@@ -1194,7 +1191,7 @@ public class JAXBUtils {
                 }
             }
         }
-
+        
         return classes;
     }
 
@@ -1218,7 +1215,7 @@ public class JAXBUtils {
             "javax.xml.namespace.QName[]" };
 
     private static void addCommonArrayClasses(List<Class> list) {
-
+        
         // Add common primitives arrays (necessary for RPC list type support)
         ClassLoader cl = getContextClassLoader();
 
@@ -1240,10 +1237,10 @@ public class JAXBUtils {
                 }
             }
         }
-
+        
     }
-
-
+    
+    
 
     /** @return ClassLoader */
     private static ClassLoader getContextClassLoader() {
@@ -1266,19 +1263,19 @@ public class JAXBUtils {
 
         return cl;
     }
-
-
+    
+    
     /**
      * @return true if clazz is a class that should be skipped (should not
      * be a considered for JAXB)
      */
     private static boolean isSkipClass(Class clazz) {
-
+       
         Class cls = clazz;
         while (cls != null) {
             // Check the name of the class to see if it should be excluded.
             String clsName = cls.getCanonicalName();
-            if (clsName != null &&
+            if (clsName != null && 
                     (clsName.equals("javax.ejb.SessionBean")  ||
                             clsName.equals("org.apache.axis2.jaxws.spi.JAXBExclude"))) {
                 if (log.isDebugEnabled()) {
@@ -1287,13 +1284,13 @@ public class JAXBUtils {
                 }
                 return true;
             }
-
+            
             // Check the interfaces of the class to see if it should be excluded
             Class[] intferfaces = getInterfaces_priv(cls);
             if (intferfaces != null) {
                 for (int i=0; i<intferfaces.length; i++) {
                     clsName = intferfaces[i].getCanonicalName();
-                    if (clsName != null &&
+                    if (clsName != null && 
                             (clsName.equals("javax.ejb.SessionBean")  ||
                                     clsName.equals("org.apache.axis2.jaxws.spi.JAXBExclude"))) {
                         if (log.isDebugEnabled()) {
@@ -1301,7 +1298,7 @@ public class JAXBUtils {
                             log.debug("  (It is skipped because the class implements " + clsName);
                         }
                         return true;
-                    }
+                    } 
                 }
             }
             cls = cls.getSuperclass();  // Proceed up the hierarchy
@@ -1311,7 +1308,7 @@ public class JAXBUtils {
         }
         return false;
     }
-
+    
     private static Class[] getInterfaces_priv(final Class cls) {
         Class[] intferfaces = null;
         if (cls == null) {
@@ -1414,7 +1411,7 @@ public class JAXBUtils {
      * @return
      * @throws Exception
      */
-    private static JAXBContext JAXBContext_newInstance(final Class[] classArray,
+    private static JAXBContext JAXBContext_newInstance(final Class[] classArray, 
                                                        final ClassLoader cl,
                                                        Map<String, ?> properties,
                                                        List<String> classRefs)
@@ -1432,9 +1429,9 @@ public class JAXBUtils {
         }
 
         // Get JAXBContext from classes
-        jaxbContext = JAXBContextFromClasses.newInstance(classArray,
-                cl,
-                properties,
+        jaxbContext = JAXBContextFromClasses.newInstance(classArray, 
+                cl, 
+                properties, 
                 classRefs);
 
         return jaxbContext;
@@ -1451,7 +1448,7 @@ public class JAXBUtils {
             this.constructionType = constructionType;
         }
     }
-
+    
     static private void adjustPoolSize(Map map) {
         if (map.size() > MAX_LOAD_FACTOR) {
             // Remove every other Entry in the map.
@@ -1474,16 +1471,16 @@ public class JAXBUtils {
      * @param <V> Pooled object
      */
     private static class Pool<K,V> {
-        private SoftReference<Map<K,List<V>>> softMap =
+        private SoftReference<Map<K,List<V>>> softMap = 
             new SoftReference<Map<K,List<V>>>(
                     new ConcurrentHashMap<K, List<V>>());
 
         // The maps are freed up when a LOAD FACTOR is hit
         private static int MAX_LIST_FACTOR = 50;
-
+        
         // Limit the adjustSize calls
         private int count = 0;
-
+        
         /**
          * @param key
          * @return removed item from pool or null.
@@ -1494,7 +1491,7 @@ public class JAXBUtils {
                 if (values.size()>0) {
                     V v = values.remove(values.size()-1);
                     return v;
-
+                    
                 }
             }
             return null;
@@ -1536,7 +1533,7 @@ public class JAXBUtils {
                 if (values == null) {
                     if (map == null) {
                         map = new ConcurrentHashMap<K, List<V>>();
-                        softMap =
+                        softMap = 
                             new SoftReference<Map<K,List<V>>>(map);
                     }
                     values = new ArrayList<V>();
@@ -1546,17 +1543,17 @@ public class JAXBUtils {
                 return values;
             }
         }
-
+        
         /**
          * AdjustSize
          * When the number of keys exceeds the maximum load, half
          * of the entries are deleted.
-         *
+         * 
          * The assumption is that the JAXBContexts, UnMarshallers, Marshallers, etc. require
          * a large footprint.
          */
         private void adjustSize() {
-
+            
             // Don't check each time, map.size() can be expensive
             count++;
             if (count < 10) {
@@ -1586,15 +1583,15 @@ public class JAXBUtils {
             }
         });
     }
-
+    
     private static String getDefaultNamespaceRemapProperty() {
         String external = "com.sun.xml.bind.defaultNamespaceRemap";
         String internal = "com.sun.xml.internal.bind.defaultNamespaceRemap";
-
+        
         Boolean isExternal = testJAXBProperty(external);
         if (Boolean.TRUE.equals(isExternal)) {
             return external;
-        }
+        }                
         Boolean isInternal = testJAXBProperty(internal);
         if (Boolean.TRUE.equals(isInternal)) {
             return internal;
@@ -1602,7 +1599,7 @@ public class JAXBUtils {
         // hmm... both properties cannot be set
         return external;
     }
-
+    
     private static Boolean testJAXBProperty(String propName) {
         final Map<String, String> props = new HashMap<String, String>();
         props.put(propName, "http://test");
@@ -1617,7 +1614,7 @@ public class JAXBUtils {
         } catch (PrivilegedActionException e) {
             if (e.getCause() instanceof JAXBException) {
                 return Boolean.FALSE;
-            }
+            } 
             return null;
         }
     }