Author: scheu
Date: Mon May 3 19:41:27 2010
New Revision: 940583
URL: http://svn.apache.org/viewvc?rev=940583&view=rev
Log:
AXIS2-4700
Contributor:Rich Scheuerle
Slight change to the algorithm for finding JAX-WS Wrapper and WebFault classes
when annotations are not present.
Modified:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.java
Modified:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.java?rev=940583&r1=940582&r2=940583&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.java
(original)
+++
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/runtime/description/marshal/impl/ArtifactProcessor.java
Mon May 3 19:41:27 2010
@@ -56,6 +56,8 @@ class ArtifactProcessor {
private Map<FaultDescription, FaultBeanDesc> faultBeanDescMap =
new HashMap<FaultDescription, FaultBeanDesc>();
+ static final String JAXWS_SUBPACKAGE = "jaxws";
+
/**
* Artifact Processor
*
@@ -95,48 +97,30 @@ class ArtifactProcessor {
// There is no default for
@RequestWrapper/@ResponseWrapper classname None is listed in Sec. 7.3 on p. 80
of
// the JAX-WS spec, BUT Conformance(Using
javax.xml.ws.RequestWrapper) in Sec 2.3.1.2 on p. 13
- // says the entire annotation "...MAY be omitted if all
its properties would have default vaules."
+ // says the entire annotation "...MAY be omitted if all
its properties would have default values."
// We will assume that this statement gives us the liberty
to find a wrapper class/build a wrapper class or
// implement an engine w/o the wrapper class.
// @RequestWrapper className processing
String requestWrapperName =
opDesc.getRequestWrapperClassName();
- if (requestWrapperName == null) {
- if (packageName.length() > 0) {
- requestWrapperName =
- packageName + "." +
javaMethodToClassName(methodName);
- } else {
- requestWrapperName =
javaMethodToClassName(methodName);
- }
- }
- String foundRequestWrapperName =
findArtifact(requestWrapperName);
- if (foundRequestWrapperName == null) {
- foundRequestWrapperName =
findArtifact(requestWrapperName, ed.getAxisService().getClassLoader());
- }
- if (foundRequestWrapperName == null) {
- foundRequestWrapperName =
missingArtifact(requestWrapperName);
- }
+ String foundRequestWrapperName =
getWrapperClass("@RequestWrapper",
+ requestWrapperName,
+ packageName,
+ javaMethodToClassName(methodName),
+ ed.getAxisService().getClassLoader());
+
if (foundRequestWrapperName != null) {
requestWrapperMap.put(opDesc, foundRequestWrapperName);
}
// @ResponseWrapper className processing
String responseWrapperName =
opDesc.getResponseWrapperClassName();
- if (responseWrapperName == null) {
- if (packageName.length() > 0) {
- responseWrapperName = packageName + "." +
- javaMethodToClassName(methodName) +
"Response";
- } else {
- responseWrapperName =
javaMethodToClassName(methodName) + "Response";
- }
- }
- String foundResponseWrapperName =
findArtifact(responseWrapperName);
- if (foundResponseWrapperName == null) {
- foundResponseWrapperName =
findArtifact(responseWrapperName, ed.getAxisService().getClassLoader());
- }
- if (foundResponseWrapperName == null) {
- foundResponseWrapperName =
missingArtifact(responseWrapperName);
- }
+ String foundResponseWrapperName =
getWrapperClass("@ResponseWrapper",
+ responseWrapperName,
+ packageName,
+ javaMethodToClassName(methodName) + "Response",
+ ed.getAxisService().getClassLoader());
+
if (foundResponseWrapperName != null) {
responseWrapperMap.put(opDesc,
foundResponseWrapperName);
}
@@ -180,34 +164,151 @@ class ArtifactProcessor {
}
}
+ /**
+ * @param type "@RequestWrapper", "@ResponseWrapper", and "@WebFault"
+ * @param providedValue String name of the Wrapper or Fault Bean from
annotations
+ * @param defaultPkg String name of the package to use for defaulting
+ * @param defaultClassName name of the class to use if defaulting
+ * @param altClassLoader name of the alternative classloader
+ * @return
+ */
+ static private String getWrapperClass(String type,
+ String providedValue,
+ String defaultPkg,
+ String defaultClassName,
+ ClassLoader altClassLoader) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("getWrapperClass for " + type + " with value (" +
providedValue + ")");
+ }
+
+ String wrapperClass = null;
+ try {
+ Class cls = null;
+ ClassLoader cl = getContextClassLoader();
+ if (providedValue != null && providedValue.length() > 0) {
+
+ // If a className is provided try to load it with the context
classloader
+ // and then the alternate classloader.
+ // If the class still cannot be loaded, then try inserting the
+ // jaxws sub-package.
+
+ if (log.isDebugEnabled()) {
+ log.debug("Try finding the class with the name provided =
" + providedValue);
+ }
+ cls = loadClassOrNull(providedValue, cl);
+ if (cls != null) {
+ wrapperClass = providedValue;
+ }
+ else {
+ cls = loadClassOrNull(providedValue, altClassLoader);
+ if (cls != null) {
+ wrapperClass = providedValue;
+ }
+ }
+ // Legacy
+ if (cls == null) {
+ String origPackage = getPackageName(providedValue);
+ if (origPackage.length() > 0) {
+ String newPackage = origPackage + "." +
JAXWS_SUBPACKAGE;
+ String clsName = getSimpleClassName(providedValue);
+ String newValue = newPackage + "." + clsName;
+ if (log.isDebugEnabled()) {
+ log.debug("Did not find the name provided. Now
trying " + newValue);
+ }
+ cls = loadClassOrNull(newValue, cl);
+ if (cls != null) {
+ wrapperClass = newValue;
+ } else {
+ cls = loadClassOrNull(newValue, altClassLoader);
+ if (cls != null) {
+ wrapperClass = newValue;
+ }
+ }
+ }
+ }
+ } else {
+ // If no valud is provided by the annotation, then the we try
default values.
+ // The wsgen tool generates classes in the jaxws subpackage.
+ // The wsimport tool generates classes in the same package as
the SEI.
+ // Note that from reading the JAX-WS spec, it seems that WSGen
is doing that
+ // correctly; See the conformance requirement in JAX-WS 2.0
Spec Section 3.6.2.1 Document
+ // Wrapped on page 36: Conformance (Default wrapper bean
package): In the absence of
+ // customizations, the wrapper beans package MUST be a
generated jaxws subpackage of the SEI
+ // package.
+ //
+ // Thus the following algorithm with check the jaxws
subpackage first.
+ String defaultValue = null;
+ if (defaultPkg.length() > 0) {
+ defaultValue = defaultPkg + "." + JAXWS_SUBPACKAGE + "." +
defaultClassName;
+ if (log.isDebugEnabled()) {
+ log.debug("No provided value. Try the default class
name = " + defaultValue);
+ }
+ cls = loadClassOrNull(defaultValue, cl);
+ if (cls != null) {
+ wrapperClass = defaultValue;
+ } else {
+ cls = loadClassOrNull(defaultValue, altClassLoader);
+ if (cls != null) {
+ wrapperClass = defaultValue;
+ }
+ }
+ }
+
+ if (cls == null) {
+ // Try pkg without jaxws
+ if (defaultPkg.length() > 0) {
+ defaultValue = defaultPkg + "." + defaultClassName;
+ } else {
+ defaultValue = defaultClassName;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Did not find the default name. Try a
different default class name = " + defaultValue);
+ }
+ cls = loadClassOrNull(defaultValue, cl);
+ if (cls != null) {
+ wrapperClass = defaultValue;
+ } else {
+ cls = loadClassOrNull(defaultValue, altClassLoader);
+ if (cls != null) {
+ wrapperClass = defaultValue;
+ }
+ }
+ }
+ }
+
+
+ } catch (Throwable t) {
+ if (log.isDebugEnabled()) {
+ log.debug("Unexpected error. Processing continues. ", t);
+ }
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("exit getWrapperClass with " + wrapperClass);
+ }
+ return wrapperClass;
+
+ }
private FaultBeanDesc create(EndpointDescription ed, FaultDescription
faultDesc, OperationDescription opDesc) {
/* FaultBeanClass algorithm
* 1) The class defined on @WebFault of the exception
* 2) If not present or invalid, the class defined by getFaultInfo.
- * 3) If not present, the class is found by looking for the
- * a class named <exceptionName>Bean in the interface's package.
- * 4) If not present, the class is found by looking for the
- * a class named <exceptionName>Bean in the interface + jaxws
package
+ * 3) If not present, the class is found using the default name and
location
*/
+String declaringClassName = opDesc.getJavaDeclaringClassName();
+
+ String type = "@WebFault";
String faultBeanClassName = faultDesc.getFaultBean();
if (faultBeanClassName == null || faultBeanClassName.length() == 0) {
+ type = "faultInfo";
faultBeanClassName = faultDesc.getFaultInfo();
}
- if (faultBeanClassName == null || faultBeanClassName.length() == 0) {
- String declaringClassName = opDesc.getJavaDeclaringClassName();
- String packageName = getPackageName(declaringClassName);
- String simpleName =
getSimpleClassName(faultDesc.getExceptionClassName());
- if (packageName.length() > 0) {
- faultBeanClassName = packageName + "." + simpleName + "Bean";
- } else {
- faultBeanClassName = simpleName + "Bean";
- }
- }
- String foundClassName = findArtifact(faultBeanClassName);
- if (foundClassName == null) {
- faultBeanClassName = findArtifact(faultBeanClassName,
ed.getAxisService().getClassLoader());
- }
+ String foundClassName = getWrapperClass(type,
+ faultBeanClassName,
+ getPackageName(declaringClassName),
+ getSimpleClassName(faultDesc.getExceptionClassName()) + "Bean",
+ ed.getAxisService().getClassLoader());
if (foundClassName == null) {
faultBeanClassName = missingArtifact(faultBeanClassName);
}
@@ -332,60 +433,18 @@ class ArtifactProcessor {
}
/**
- * Determine the actual packager name for the generated artifacts by
trying to load the class
- * from one of two packages. This is necessary because the RI
implementations of WSGen and
- * WSImport generate the artifacts in different packages: - WSImport
generates the artifacts in
- * the same package as the SEI - WSGen generates the artifacts in a
"jaxws" sub package under
- * the SEI package. Note that from reading the JAX-WS spec, it seems that
WSGen is doing that
- * correctly; See the conformance requirement in JAX-WS 2.0 Spec Section
3.6.2.1 Document
- * Wrapped on page 36: Conformance (Default wrapper bean package): In the
absence of
- * customizations, the wrapper beans package MUST be a generated jaxws
subpackage of the SEI
- * package. ^^^^^^^^^^^^^^^^
- *
- * @param artifactClassName
- * @return
+ * @param className
+ * @param classLoader
+ * @return Class or Null
*/
- static final String JAXWS_SUBPACKAGE = "jaxws";
-
- private static String findArtifact(String artifactClassName) {
- return findArtifact(artifactClassName, getContextClassLoader());
- }
-
- private static String findArtifact(String artifactClassName, ClassLoader
classLoader) {
- String returnArtifactClassName = null;
- if (artifactClassName == null) {
- return returnArtifactClassName;
- }
-
- // Try to load the class that was passed in
+ private static Class loadClassOrNull(String className, ClassLoader
classLoader) {
try {
- forName(artifactClassName, true, classLoader);
- returnArtifactClassName = artifactClassName;
- }
- catch (ClassNotFoundException e) {
- // Couldn't load the class; we'll try another one below.
- }
-
- // If the original class couldn't be loaded, try adding ".jaxws." to
the package
- if (returnArtifactClassName == null) {
- String originalPackage = getPackageName(artifactClassName);
- if (originalPackage.length() > 0) {
- String alternatePackage = originalPackage + "." +
JAXWS_SUBPACKAGE;
- String className = getSimpleClassName(artifactClassName);
- String alternateWrapperClass = alternatePackage + "." +
className;
- try {
- loadClass(alternateWrapperClass, getContextClassLoader());
- returnArtifactClassName = alternateWrapperClass;
- }
- catch (ClassNotFoundException e) {
- // Couldn't load the class
- }
- }
- }
-
- return returnArtifactClassName;
+ return loadClass(className, classLoader);
+ } catch (Throwable t) {
+ return null;
+ }
}
-
+
private static Class loadClass(String className, ClassLoader classLoader)
throws ClassNotFoundException {
// Don't make this public, its a security exposure
return forName(className, true, classLoader);