Author: scheu Date: Sat Aug 28 14:55:23 2010 New Revision: 990378 URL: http://svn.apache.org/viewvc?rev=990378&view=rev Log: AXIS2-4803 Contributor:Rich Scheuerle Changed JAXBUtils to verify that classes are present in the constructed JAXBContext. If not, the code automatically falls back to the existing "load by classes" algorithm.
Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?rev=990378&r1=990377&r2=990378&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Sat Aug 28 14:55:23 2010 @@ -606,7 +606,7 @@ public class JAXBUtils { // CONTEXT construction if (contextConstruction) { - JAXBContext context = createJAXBContextUsingContextPath(contextPackages, cl); + JAXBContext context = createJAXBContextUsingContextPath(contextPackages, cl, classRefs); if (context != null) { contextValue = new JAXBContextValue(context, CONSTRUCTION_TYPE.BY_CONTEXT_PATH); } @@ -885,10 +885,12 @@ public class JAXBUtils { * * @param packages * @param cl ClassLoader + * @param List<String> classRefs * @return JAXBContext or null if unsuccessful */ private static JAXBContext createJAXBContextUsingContextPath(TreeSet<String> packages, - ClassLoader cl) { + ClassLoader cl, + List<String> classRefs) { JAXBContext context = null; String contextpath = ""; @@ -907,6 +909,13 @@ public class JAXBUtils { log.debug("Attempting to create JAXBContext with contextPath=" + contextpath); } context = JAXBContext_newInstance(contextpath, cl); + + if (!containsClasses(context, classRefs)) { + if (log.isDebugEnabled()) { + log.debug(" Unsuccessful: Will now use an alterative JAXBConstruct construction"); + return null; + } + } if (log.isDebugEnabled()) { log.debug(" Successfully created JAXBContext:" + context); } @@ -919,6 +928,32 @@ public class JAXBUtils { } return context; } + + /** + * containsClasses + * @param JAXBContext + * @param List<String> classRefs + */ + private static boolean containsClasses(JAXBContext context, List<String> classRefs) { + String text = context.toString(); + + text = text.replace('\n', ' '); + text = text.replace('\t', ' '); + text = text.replace('\r', ' '); + + for (String classRef: classRefs) { + if (!classRef.endsWith(".ObjectFactory")) { + String search = " " + classRef + " "; + if (text.contains(search)) { + if (log.isDebugEnabled()) { + log.debug("The context does not contain " + classRef + " " + context); + } + return false; + } + } + } + return true; + } /** * This method will return all the Class names needed to construct a JAXBContext