You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by wo...@apache.org on 2009/09/26 17:42:55 UTC
svn commit: r819156 - in /webservices/axis2/trunk/java/modules/metadata: ./
src/org/apache/axis2/jaxws/description/
src/org/apache/axis2/jaxws/description/builder/
src/org/apache/axis2/jaxws/description/impl/
src/org/apache/axis2/jaxws/description/vali...
Author: woodroy
Date: Sat Sep 26 15:42:55 2009
New Revision: 819156
URL: http://svn.apache.org/viewvc?rev=819156&view=rev
Log:
Support new SUN 1.6 behavior concerning processing of @WebMethod annotations
Added:
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/MethodRetriever.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/LegacyMethodRetrieverImpl.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java
Modified:
webservices/axis2/trunk/java/modules/metadata/pom.xml
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/MDQConstants.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/ValidateWSDLTests.java
Modified: webservices/axis2/trunk/java/modules/metadata/pom.xml
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/pom.xml?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/pom.xml (original)
+++ webservices/axis2/trunk/java/modules/metadata/pom.xml Sat Sep 26 15:42:55 2009
@@ -79,6 +79,21 @@
</exclusions>
</dependency>
<dependency>
+ <groupId>com.sun.xml.ws</groupId>
+ <artifactId>jaxws-tools</artifactId>
+ <version>2.1.3</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.sun.xml.ws</groupId>
+ <artifactId>jaxws-rt</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.sun.xml.bind</groupId>
+ <artifactId>jaxb-xjc</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>${version}</version>
Added: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/MethodRetriever.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/MethodRetriever.java?rev=819156&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/MethodRetriever.java (added)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/MethodRetriever.java Sat Sep 26 15:42:55 2009
@@ -0,0 +1,276 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.jaxws.description;
+
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
+import org.apache.axis2.jaxws.description.impl.DescriptionUtils;
+import org.apache.axis2.jaxws.description.impl.EndpointInterfaceDescriptionImpl;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A MethodRetriever is an abstract class which is meant to be sub-classed for each type of
+ * method retrieval behavior. The catalyst for this was the introduction of new spec.
+ * interpretation by SUN RI.
+ *
+ * Please refer to the following links:
+ *
+ *
+ * https://jax-ws.dev.java.net/issues/show_bug.cgi?id=577
+ * http://forums.java.net/jive/thread.jspa?threadID=61630
+ * http://forums.java.net/jive/thread.jspa?threadID=55078
+ *
+ * This base is being used to allow for a cleaner componentization of the old/new and potential
+ * future behavior changes.
+ *
+ * The sub-class is required to implement only the abstract 'retrieveMethods'
+ *
+ */
+
+public abstract class MethodRetriever {
+
+ //Logging setup
+ private static final Log log = LogFactory.getLog(MethodRetriever.class);
+
+ protected MethodRetriever() {}
+
+ /*
+ * Returns a non-null (possibly empty) list of MethodDescriptionComposites
+ */
+ public abstract Iterator<MethodDescriptionComposite> retrieveMethods();
+
+
+ /**
+ * A recursive method which peruses and retrieves methods in the super class hierarchy
+ * @param tmpDBC
+ * @param eid
+ * @return
+ */
+ protected ArrayList<MethodDescriptionComposite> retrieveSEIMethodsChain(
+ DescriptionBuilderComposite tmpDBC, EndpointInterfaceDescriptionImpl eid) {
+
+ DescriptionBuilderComposite dbc = tmpDBC;
+ ArrayList<MethodDescriptionComposite> retrieveList = new ArrayList<MethodDescriptionComposite>();
+
+ retrieveList = retrieveSEIMethods(dbc);
+
+ //Since this is an interface, anything that is in the extends clause will actually appear
+ // in the interfaces list instead.
+ Iterator<String> iter = null;
+ List<String> interfacesList = dbc.getInterfacesList();
+ if (interfacesList != null) {
+ iter = dbc.getInterfacesList().iterator();
+
+ while (iter.hasNext()) {
+
+ String interfaceName = iter.next();
+ DescriptionBuilderComposite superInterface =
+ eid.getEndpointDescriptionImpl().getServiceDescriptionImpl().getDBCMap().get(interfaceName);
+
+ retrieveList.addAll(retrieveSEIMethodsChain(superInterface, eid));
+ }
+ }
+
+ return retrieveList;
+ }
+
+ /**
+ * This method will loop through each method that was previously determined as being relevant to
+ * the current composite. It will then drive the call to determine if this represents a method
+ * that has been overridden. If it represents an overriding method declaration it will remove
+ * the inherited methods from the list leaving only the most basic method declaration.
+ *
+ * @param methodList - <code>ArrayList</code> list of relevant methods
+ * @param dbc - <code>DescriptionBuilderComposite</code> current composite
+ * @return - <code>ArrayList</code>
+ */
+ protected ArrayList<MethodDescriptionComposite> removeOverriddenMethods(
+ ArrayList<MethodDescriptionComposite> methodList, DescriptionBuilderComposite dbc, EndpointInterfaceDescriptionImpl eid) {
+ Map<String, Integer> hierarchyMap = dbc.isInterface() ? getInterfaceHierarchy(dbc, eid)
+ : getClassHierarchy(dbc, eid);
+ ArrayList<MethodDescriptionComposite> returnMethods = new ArrayList<MethodDescriptionComposite>();
+ for (int i = 0; i < methodList.size(); i++) {
+ if (notFound(returnMethods, methodList.get(i))) {
+ returnMethods.add(getBaseMethod(methodList.get(i), i, methodList, hierarchyMap));
+ }
+
+ }
+ return returnMethods;
+ }
+
+ /**
+ * This method drives the establishment of the hierarchy of interfaces for an SEI.
+ */
+ private Map<String, Integer> getInterfaceHierarchy(DescriptionBuilderComposite dbc, EndpointInterfaceDescriptionImpl eid) {
+ if (log.isDebugEnabled()) {
+ log.debug("Getting interface hierarchy for: " + dbc.getClassName());
+ }
+ Map<String, Integer> hierarchyMap = new HashMap<String, Integer>();
+ hierarchyMap.put(dbc.getClassName(), 0);
+ return getInterfaceHierarchy(dbc.getInterfacesList(), hierarchyMap, 1, eid);
+ }
+
+ protected ArrayList<MethodDescriptionComposite> retrieveSEIMethods(DescriptionBuilderComposite dbc) {
+
+ //Rules for retrieving Methods on an SEI (or a superclass of an SEI) are simple
+ //Just retrieve all methods regardless of WebMethod annotations
+ ArrayList<MethodDescriptionComposite> retrieveList = new ArrayList<MethodDescriptionComposite>();
+
+ Iterator<MethodDescriptionComposite> iter = null;
+ List<MethodDescriptionComposite> mdcList = dbc.getMethodDescriptionsList();
+
+ if (mdcList != null) {
+ iter = dbc.getMethodDescriptionsList().iterator();
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+ mdc.setDeclaringClass(dbc.getClassName());
+ retrieveList.add(mdc);
+ }
+ }
+
+ return retrieveList;
+ }
+
+ /**
+ * This method will establish a <code>HashMap</code> that represents a class name of a composite
+ * and an integer value for the entry. The integer represents the classes level in the Java
+ * hierarchy. 0 represents the most basic class with n representing the highest level class.
+ *
+ * @param dbc - <code>DescriptionBuilderComposite</code>
+ * @return - <code>HashMap</code>
+ */
+ private HashMap<String, Integer> getClassHierarchy(DescriptionBuilderComposite dbc, EndpointInterfaceDescriptionImpl eid) {
+ HashMap<String, DescriptionBuilderComposite> dbcMap = eid.getEndpointDescriptionImpl()
+ .getServiceDescriptionImpl().getDBCMap();
+ HashMap<String, Integer> hierarchyMap = new HashMap<String, Integer>();
+ if (log.isDebugEnabled()) {
+ log.debug("Putting class at base level: " + dbc.getClassName());
+ }
+ hierarchyMap.put(dbc.getClassName(), Integer.valueOf(0));
+ DescriptionBuilderComposite superDBC = dbcMap.get((dbc.getSuperClassName()));
+ int i = 1;
+ while (superDBC != null && !superDBC.getClassName().equals("java.lang.Object")) {
+ hierarchyMap.put(superDBC.getClassName(), Integer.valueOf(i));
+ if (log.isDebugEnabled()) {
+ log.debug("Putting class: " + superDBC.getClassName() + " at hierarchy rank: " + i);
+ }
+ i++;
+ superDBC = dbcMap.get(superDBC.getSuperClassName());
+ }
+ return hierarchyMap;
+ }
+
+ /**
+ * This method will loop through each method we have already identified as a base method and
+ * compare the current method.
+ *
+ * @param mdcList - <code>ArrayList</code> identified base methods
+ * @param mdc - <code>MethodDescriptionComposite</code> current method
+ * @return - boolean
+ */
+ private boolean notFound(ArrayList<MethodDescriptionComposite> mdcList,
+ MethodDescriptionComposite mdc) {
+ for (MethodDescriptionComposite method : mdcList) {
+ if (mdc.compare(method)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Recursive method that builds the hierarchy of interfaces. This begins with an
+ * SEI and walks all of its super interfaces.
+ */
+ private Map<String, Integer> getInterfaceHierarchy(List<String> interfaces,
+ Map<String, Integer> hierarchyMap, int level, EndpointInterfaceDescriptionImpl eid) {
+ HashMap<String, DescriptionBuilderComposite> dbcMap = eid.getEndpointDescriptionImpl()
+ .getServiceDescriptionImpl().getDBCMap();
+
+ // walk through all of the interfaces
+ if (interfaces != null && !interfaces.isEmpty()) {
+ for (String interfaze : interfaces) {
+ DescriptionBuilderComposite interDBC = dbcMap.get(interfaze);
+ if (interDBC != null) {
+ if (log.isDebugEnabled()) {
+ log.debug("Inserting super interface " + interDBC.getClassName()
+ + " at level " + level);
+ }
+ hierarchyMap.put(interDBC.getClassName(), level);
+ return getInterfaceHierarchy(interDBC.getInterfacesList(), hierarchyMap,
+ level++, eid);
+ }
+ }
+ }
+ return hierarchyMap;
+ }
+
+ /**
+ * This method is responsible for determining the most basic level of a method declaration in
+ * the <code>DescriptionBuilderComposite</code> hierarchy.
+ *
+ * @param mdc - <code>MethodDescriptionComposite</code> current method
+ * @param index - <code>int</code> current location in method list
+ * @param methodList - <code>List</code> list of methods available on this composite
+ * @param hierarchyMap - <code>HashMap</code> map that represents the hierarchy of the current
+ * <code>DescriptionBuilderComposite</code>
+ * @return - <code>MethodDescriptionComposite</code> most basic method declaration
+ */
+ private static MethodDescriptionComposite getBaseMethod(MethodDescriptionComposite mdc,
+ int index, ArrayList<MethodDescriptionComposite> methodList,
+ Map<String, Integer> hierarchyMap) {
+ int baseLevel = hierarchyMap.get(mdc.getDeclaringClass());
+ if (log.isDebugEnabled()) {
+ log.debug("Base method: " + mdc.getMethodName() + " initial level: " + baseLevel);
+ }
+ for (; index < methodList.size(); index++) {
+ MethodDescriptionComposite compareMDC = methodList.get(index);
+ // If the two methods are the same method that means we have found an inherited
+ // overridden case
+ if (mdc.equals(compareMDC)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Found equivalent methods: " + mdc.getMethodName());
+ }
+ // get the declaration level of the method we are comparing to
+ int compareLevel = hierarchyMap.get(compareMDC.getDeclaringClass());
+ // if the method was declared by a class in a lower level of the hierarchy it
+ // becomes the method that we will compare other methods to
+ if (compareLevel < baseLevel) {
+ if (log.isDebugEnabled()) {
+ log.debug("Found method lower in hierarchy chain: "
+ + compareMDC.getMethodName() + " of class: "
+ + compareMDC.getMethodName());
+ }
+ mdc = compareMDC;
+ baseLevel = compareLevel;
+ }
+ }
+ }
+ return mdc;
+ }
+
+}
\ No newline at end of file
Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/MDQConstants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/MDQConstants.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/MDQConstants.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/MDQConstants.java Sat Sep 26 15:42:55 2009
@@ -68,4 +68,10 @@
public static final String SOAP11JMS_MTOM_BINDING = "http://http://www.example.org/2006/06/soap/bindings/JMS/?mtom=true";
public static final String SOAP12JMS_MTOM_BINDING = "http://http://www.example.org/2006/06/soap/bindings/JMS/?mtom=true";
public static final String SOAP_HTTP_BINDING ="SOAP_HTTP_BINDING";
+
+ public static final String USE_LEGACY_WEB_METHOD_RULES_SUN = "com.sun.xml.ws.model.RuntimeModeler.legacyWebMethod";
+ public static final String USE_LEGACY_WEB_METHOD_RULES = "jaxws.runtime.legacyWebMethod";
+ public static final String USE_MANIFEST_LEGACY_WEB_METHOD_RULES = "LegacyWebMethod";
+ public static final String SUN_WEB_METHOD_BEHAVIOR_CHANGE_VERSION = "2.1.6";
+
}
Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java Sat Sep 26 15:42:55 2009
@@ -98,7 +98,7 @@
* fixed, that will probably have an impact on this class. In particular, I think this should be created
* somehow from an AxisService/AxisPort combination, and not directly from the WSDL.
*/
-class EndpointDescriptionImpl
+public class EndpointDescriptionImpl
implements EndpointDescription, EndpointDescriptionJava, EndpointDescriptionWSDL {
private ServiceDescriptionImpl parentServiceDescription;
@@ -723,7 +723,7 @@
return parentServiceDescription;
}
- ServiceDescriptionImpl getServiceDescriptionImpl() {
+ public ServiceDescriptionImpl getServiceDescriptionImpl() {
return (ServiceDescriptionImpl)parentServiceDescription;
}
Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java Sat Sep 26 15:42:55 2009
@@ -20,6 +20,26 @@
package org.apache.axis2.jaxws.description.impl;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import javax.wsdl.Definition;
+import javax.wsdl.PortType;
+import javax.xml.namespace.QName;
+
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisOperationFactory;
@@ -30,34 +50,20 @@
import org.apache.axis2.jaxws.description.EndpointInterfaceDescription;
import org.apache.axis2.jaxws.description.EndpointInterfaceDescriptionJava;
import org.apache.axis2.jaxws.description.EndpointInterfaceDescriptionWSDL;
+import org.apache.axis2.jaxws.description.MethodRetriever;
import org.apache.axis2.jaxws.description.OperationDescription;
import org.apache.axis2.jaxws.description.ServiceDescriptionWSDL;
import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
import org.apache.axis2.jaxws.description.builder.MDQConstants;
import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.util.WSToolingUtils;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.jws.WebService;
-import javax.jws.soap.SOAPBinding;
-import javax.wsdl.Definition;
-import javax.wsdl.PortType;
-import javax.xml.namespace.QName;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
/** @see ../EndpointInterfaceDescription */
-class EndpointInterfaceDescriptionImpl
+public class EndpointInterfaceDescriptionImpl
implements EndpointInterfaceDescription, EndpointInterfaceDescriptionJava,
EndpointInterfaceDescriptionWSDL {
private EndpointDescriptionImpl parentEndpointDescription;
@@ -95,6 +101,10 @@
public static final javax.jws.soap.SOAPBinding.ParameterStyle SOAPBinding_ParameterStyle_DEFAULT =
javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED;
+ private static String newRulesFlag = null;
+
+ private static String newSunRulesFlag = null;
+
/**
* Add the operationDescription to the list of operations. Note that we can not create the
* list of dispatchable operations at this points.
@@ -211,11 +221,16 @@
//For every MethodDescriptionComposite in this list, call OperationDescription
//constructor for it, then add this operation
- //Retrieve the relevent method composites for this dbc (and those in the superclass chain)
- Iterator<MethodDescriptionComposite> iter = retrieveReleventMethods(dbc);
+ //Retrieve the relevant method composites for this dbc (and those in the superclass chain)
+
+ MethodRetriever methodRetriever = getMethodRetriever();
- if (log.isDebugEnabled())
+ Iterator<MethodDescriptionComposite> iter = methodRetriever.retrieveMethods();
+
+ if (log.isDebugEnabled()) {
log.debug("EndpointInterfaceDescriptionImpl: Finished retrieving methods");
+ }
+
MethodDescriptionComposite mdc = null;
while (iter.hasNext()) {
@@ -433,7 +448,7 @@
return operationDescriptions.toArray(new OperationDescription[0]);
}
- EndpointDescriptionImpl getEndpointDescriptionImpl() {
+ public EndpointDescriptionImpl getEndpointDescriptionImpl() {
return (EndpointDescriptionImpl)parentEndpointDescription;
}
@@ -627,337 +642,6 @@
return soapParameterStyle;
}
- /*
- * Returns a non-null (possibly empty) list of MethodDescriptionComposites
- */
- Iterator<MethodDescriptionComposite> retrieveReleventMethods(DescriptionBuilderComposite dbc) {
-
- /*
- * Depending on whether this is an implicit SEI or an actual SEI, Gather up and build a
- * list of MDC's. If this is an actual SEI, then starting with this DBC, build a list of all
- * MDC's that are public methods in the chain of extended classes.
- * If this is an implicit SEI, then starting with this DBC,
- * 1. If a false exclude is found, then take only those that have false excludes
- * 2. Assuming no false excludes, take all public methods that don't have exclude == true
- * 3. For each super class, if 'WebService' present, take all MDC's according to rules 1&2
- * But, if WebService not present, grab only MDC's that are annotated.
- */
- if (log.isTraceEnabled()) {
- log.trace("retrieveReleventMethods: Enter");
- }
-
- ArrayList<MethodDescriptionComposite> retrieveList =
- new ArrayList<MethodDescriptionComposite>();
-
- if (dbc.isInterface()) {
- if(log.isDebugEnabled()) {
- log.debug("Removing overridden methods for interface: " + dbc.getClassName() +
- " with super interface: " + dbc.getSuperClassName());
- }
-
- // make sure we retrieve all the methods, then remove the overridden
- // methods that exist in the base interface
- retrieveList = retrieveSEIMethodsChain(dbc);
- retrieveList = removeOverriddenMethods(retrieveList, dbc);
-
- } else {
- //this is an implied SEI...rules are more complicated
-
- retrieveList = retrieveImplicitSEIMethods(dbc);
-
- //Now, continue to build this list with relevent methods in the chain of
- //superclasses. If the logic for processing superclasses is the same as for
- //the original SEI, then we can combine this code with above code. But, its possible
- //the logic is different for superclasses...keeping separate for now.
- DescriptionBuilderComposite tempDBC = dbc;
-
- while (!DescriptionUtils.isEmpty(tempDBC.getSuperClassName())) {
-
- //verify that this superclass name is not
- // java.lang.object, if so, then we're done processing
- if (DescriptionUtils.javifyClassName(tempDBC.getSuperClassName())
- .equals(MDQConstants.OBJECT_CLASS_NAME))
- break;
-
- DescriptionBuilderComposite superDBC =
- getEndpointDescriptionImpl().getServiceDescriptionImpl().getDBCMap()
- .get(tempDBC.getSuperClassName());
-
- if (log.isTraceEnabled())
- log.trace("superclass name for this DBC is:" + tempDBC.getSuperClassName());
-
- //Verify that we can find the SEI in the composite list
- if (superDBC == null) {
- throw ExceptionFactory.makeWebServiceException(Messages.getMessage("seiNotFoundErr"));
- }
-
- //If the superclass contains a WebService annotation then retrieve its methods
- //as we would for the impl class, otherwise ignore the methods of this
- //superclass
- if (superDBC.getWebServiceAnnot() != null) {
- //Now, gather the list of Methods just like we do for the lowest subclass
- retrieveList.addAll(retrieveImplicitSEIMethods(superDBC));
- }
- tempDBC = superDBC;
- } //Done with implied SEI's superclasses
- retrieveList = removeOverriddenMethods(retrieveList, dbc);
- }//Done with implied SEI's
-
- return retrieveList.iterator();
- }
-
-
- /**
- * This method will establish a <code>HashMap</code> that represents a class name of a composite
- * and an integer value for the entry. The integer represents the classes level in the Java
- * hierarchy. 0 represents the most basic class with n representing the highest level class.
- *
- * @param dbc - <code>DescriptionBuilderComposite</code>
- * @return - <code>HashMap</code>
- */
- private HashMap<String, Integer> getClassHierarchy(DescriptionBuilderComposite dbc) {
- HashMap<String, DescriptionBuilderComposite> dbcMap = getEndpointDescriptionImpl().
- getServiceDescriptionImpl().getDBCMap();
- HashMap<String, Integer> hierarchyMap = new HashMap<String, Integer>();
- if (log.isDebugEnabled()) {
- log.debug("Putting class at base level: " + dbc.getClassName());
- }
- hierarchyMap.put(dbc.getClassName(), Integer.valueOf(0));
- DescriptionBuilderComposite superDBC = dbcMap.get((dbc.getSuperClassName()));
- int i = 1;
- while (superDBC != null && !superDBC.getClassName().equals("java.lang.Object")) {
- hierarchyMap.put(superDBC.getClassName(), Integer.valueOf(i));
- if (log.isDebugEnabled()) {
- log.debug("Putting class: " + superDBC.getClassName() + " at hierarchy rank: " +
- i);
- }
- i++;
- superDBC = dbcMap.get(superDBC.getSuperClassName());
- }
- return hierarchyMap;
- }
-
- /**
- * This method drives the establishment of the hierarchy of interfaces for an SEI.
- */
- private Map<String, Integer> getInterfaceHierarchy(DescriptionBuilderComposite dbc) {
- if(log.isDebugEnabled()) {
- log.debug("Getting interface hierarchy for: " + dbc.getClassName());
- }
- Map<String, Integer> hierarchyMap = new HashMap<String, Integer>();
- hierarchyMap.put(dbc.getClassName(), 0);
- return getInterfaceHierarchy(dbc.getInterfacesList(),
- hierarchyMap,
- 1);
- }
-
- /**
- * Recursive method that builds the hierarchy of interfaces. This begins with an
- * SEI and walks all of its super interfaces.
- */
- private Map<String, Integer> getInterfaceHierarchy(List<String> interfaces,
- Map<String, Integer> hierarchyMap,
- int level) {
- HashMap<String, DescriptionBuilderComposite> dbcMap = getEndpointDescriptionImpl().
- getServiceDescriptionImpl().getDBCMap();
-
- // walk through all of the interfaces
- if(interfaces != null
- &&
- !interfaces.isEmpty()) {
- for(String interfaze : interfaces) {
- DescriptionBuilderComposite interDBC = dbcMap.get(interfaze);
- if(interDBC != null) {
- if(log.isDebugEnabled()) {
- log.debug("Inserting super interface " + interDBC.getClassName() +
- " at level " + level);
- }
- hierarchyMap.put(interDBC.getClassName(), level);
- return getInterfaceHierarchy(interDBC.getInterfacesList(), hierarchyMap, level++);
- }
- }
- }
- return hierarchyMap;
- }
-
- /**
- * This method will loop through each method that was previously determined as being relevant to
- * the current composite. It will then drive the call to determine if this represents a method
- * that has been overridden. If it represents an overriding method declaration it will remove
- * the inherited methods from the list leaving only the most basic method declaration.
- *
- * @param methodList - <code>ArrayList</code> list of relevant methods
- * @param dbc - <code>DescriptionBuilderComposite</code> current composite
- * @return - <code>ArrayList</code>
- */
- private ArrayList<MethodDescriptionComposite> removeOverriddenMethods(
- ArrayList<MethodDescriptionComposite>
- methodList, DescriptionBuilderComposite dbc) {
- Map<String, Integer> hierarchyMap = dbc.isInterface() ? getInterfaceHierarchy(dbc) :
- getClassHierarchy(dbc);
- ArrayList<MethodDescriptionComposite> returnMethods =
- new ArrayList<MethodDescriptionComposite>();
- for (int i = 0; i < methodList.size(); i++) {
- if (notFound(returnMethods, methodList.get(i))) {
- returnMethods.add(getBaseMethod(methodList.get(i), i, methodList, hierarchyMap));
- }
-
- }
- return returnMethods;
- }
-
- /**
- * This method will loop through each method we have already identified as a base method and
- * compare the current method.
- *
- * @param mdcList - <code>ArrayList</code> identified base methods
- * @param mdc - <code>MethodDescriptionComposite</code> current method
- * @return - boolean
- */
- private boolean notFound(ArrayList<MethodDescriptionComposite> mdcList,
- MethodDescriptionComposite mdc) {
- for (MethodDescriptionComposite method : mdcList) {
- if (mdc.compare(method)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * This method is responsible for determining the most basic level of a method declaration in
- * the <code>DescriptionBuilderComposite</code> hierarchy.
- *
- * @param mdc - <code>MethodDescriptionComposite</code> current method
- * @param index - <code>int</code> current location in method list
- * @param methodList - <code>List</code> list of methods available on this composite
- * @param hierarchyMap - <code>HashMap</code> map that represents the hierarchy of the current
- * <code>DescriptionBuilderComposite</code>
- * @return - <code>MethodDescriptionComposite</code> most basic method declaration
- */
- private static MethodDescriptionComposite getBaseMethod(MethodDescriptionComposite mdc,
- int index,
- ArrayList<MethodDescriptionComposite> methodList,
- Map<String, Integer>
- hierarchyMap) {
- int baseLevel = hierarchyMap.get(mdc.getDeclaringClass());
- if (log.isDebugEnabled()) {
- log.debug("Base method: " + mdc.getMethodName() + " initial level: " + baseLevel);
- }
- for (; index < methodList.size(); index++) {
- MethodDescriptionComposite compareMDC = methodList.get(index);
- // If the two methods are the same method that means we have found an inherited
- // overridden case
- if (mdc.equals(compareMDC)) {
- if (log.isDebugEnabled()) {
- log.debug("Found equivalent methods: " + mdc.getMethodName());
- }
- // get the declaration level of the method we are comparing to
- int compareLevel = hierarchyMap.get(compareMDC.getDeclaringClass());
- // if the method was declared by a class in a lower level of the hierarchy it
- // becomes the method that we will compare other methods to
- if (compareLevel < baseLevel) {
- if (log.isDebugEnabled()) {
- log.debug("Found method lower in hierarchy chain: " +
- compareMDC.getMethodName()
- + " of class: " + compareMDC.getMethodName());
- }
- mdc = compareMDC;
- baseLevel = compareLevel;
- }
- }
- }
- return mdc;
- }
-
- /*
- * This is called when we know that this DBC is an implicit SEI
- */
- private ArrayList<MethodDescriptionComposite> retrieveImplicitSEIMethods(
- DescriptionBuilderComposite dbc) {
-
- ArrayList<MethodDescriptionComposite> retrieveList =
- new ArrayList<MethodDescriptionComposite>();
-
- retrieveList = DescriptionUtils.getMethodsWithFalseExclusions(dbc);
-
- //If this list is empty, then there are no false exclusions, so gather
- //all composites that don't have exclude == true
- //If the list is not empty, then it means we found at least one method with 'exclude==false'
- //so the list should contain only those methods
- if (retrieveList == null || retrieveList.size() == 0) {
- Iterator<MethodDescriptionComposite> iter = null;
- List<MethodDescriptionComposite> mdcList = dbc.getMethodDescriptionsList();
-
- if (mdcList != null) {
- iter = dbc.getMethodDescriptionsList().iterator();
- while (iter.hasNext()) {
- MethodDescriptionComposite mdc = iter.next();
-
- if (!DescriptionUtils.isExcludeTrue(mdc)) {
- mdc.setDeclaringClass(dbc.getClassName());
- retrieveList.add(mdc);
- }
- }
- }
- }
-
- return retrieveList;
- }
-
- private ArrayList<MethodDescriptionComposite> retrieveSEIMethods(
- DescriptionBuilderComposite dbc) {
-
- //Rules for retrieving Methods on an SEI (or a superclass of an SEI) are simple
- //Just retrieve all methods regardless of WebMethod annotations
- ArrayList<MethodDescriptionComposite> retrieveList =
- new ArrayList<MethodDescriptionComposite>();
-
- Iterator<MethodDescriptionComposite> iter = null;
- List<MethodDescriptionComposite> mdcList = dbc.getMethodDescriptionsList();
-
- if (mdcList != null) {
- iter = dbc.getMethodDescriptionsList().iterator();
- while (iter.hasNext()) {
- MethodDescriptionComposite mdc = iter.next();
- mdc.setDeclaringClass(dbc.getClassName());
- retrieveList.add(mdc);
- }
- }
-
- return retrieveList;
- }
-
- private ArrayList<MethodDescriptionComposite> retrieveSEIMethodsChain(
- DescriptionBuilderComposite tmpDBC) {
-
- DescriptionBuilderComposite dbc = tmpDBC;
- ArrayList<MethodDescriptionComposite> retrieveList =
- new ArrayList<MethodDescriptionComposite>();
-
- retrieveList = retrieveSEIMethods(dbc);
-
- //Since this is an interface, anything that is in the extends clause will actually appear
- // in the interfaces list instead.
- Iterator<String> iter = null;
- List<String> interfacesList = dbc.getInterfacesList();
- if (interfacesList != null) {
- iter = dbc.getInterfacesList().iterator();
-
- while (iter.hasNext()) {
-
- String interfaceName = iter.next();
- DescriptionBuilderComposite superInterface =
- getEndpointDescriptionImpl().getServiceDescriptionImpl().getDBCMap()
- .get(interfaceName);
-
- retrieveList.addAll(retrieveSEIMethodsChain(superInterface));
- }
- }
-
- return retrieveList;
- }
-
private Definition getWSDLDefinition() {
return ((ServiceDescriptionWSDL)getEndpointDescription().getServiceDescription())
.getWSDLDefinition();
@@ -1086,4 +770,149 @@
}
});
}
+
+
+ /*
+ * This method returns a method retriever that properly implements the specified behavior,
+ * which is determined by a user-defined system property
+ */
+ private MethodRetriever getMethodRetriever () {
+
+ MethodRetriever methodRetriever = null;
+ boolean newSunBehavior = false;
+
+ //If the user has a setting for the property flag then that overrides and possible setting
+ //of the SUN flag. Assuming no
+ //property, we will still honor the setting of the SUN property.
+
+ //REVIEW: We are making the assumption that the system property always overrides the manifest
+ // property. So, if both are set than the manifest property will be ignored
+ if (WSToolingUtils.hasValue(getNewRulesFlag())) {
+ if (newRulesFlag.equalsIgnoreCase("false")) {
+ if (log.isDebugEnabled()){
+ log.debug("EndpointInterfaceDescriptionImpl: System property USE_LEGACY_WEB_METHOD_RULES set to false" );
+ }
+ newSunBehavior = isNewSunBehavior(MDQConstants.USE_LEGACY_WEB_METHOD_RULES);
+ }
+ } else if (WSToolingUtils.hasValue(getNewSunRulesFlag())) {
+ if (getNewSunRulesFlag().equalsIgnoreCase("false")) {
+ if (log.isDebugEnabled()){
+ log.debug("EndpointInterfaceDescriptionImpl: System property USE_LEGACY_WEB_METHOD_RULES_SUN set to false" );
+ }
+ newSunBehavior = isNewSunBehavior(MDQConstants.USE_LEGACY_WEB_METHOD_RULES_SUN);
+ }
+ }
+
+ methodRetriever = newSunBehavior ? new PostRI216MethodRetrieverImpl(dbc, this) : new LegacyMethodRetrieverImpl(dbc, this);
+
+ if(log.isDebugEnabled()) {
+ if (newSunBehavior) {
+ log.debug("getMethodRetriever: returning a PostRI216MethodRetrieverImpl");
+ } else {
+ log.debug("getMethodRetriever: returning a LegacyMethodRetrieverImpl");
+ }
+ }
+
+ return methodRetriever;
+ }
+
+ /**
+ * The user has indicated that they want to use the new Sun behavior (regardless) of which flag
+ * they were using.
+ * This method determines whether we have the proper JDK version for using the new SUN behavior for
+ * retrieving methods. We determine this by checking the version of WsGen.
+ * @param propertyToSet
+ * @return
+ */
+ private boolean isNewSunBehavior(String propertyToSet) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("isNewSunBehavior: Validating that JDK version can be used with property: " +propertyToSet);
+
+ }
+
+ boolean versionValid = false;
+
+ try {
+
+ String wsGenVersion = WSToolingUtils.getWsGenVersion();
+
+ versionValid = WSToolingUtils.isValidVersion(wsGenVersion);
+
+ if (log.isDebugEnabled()) {
+ log.debug("isNewSunBehavior: versionValid is: " +versionValid);
+ }
+
+ if (!versionValid) {
+
+ if (log.isWarnEnabled()) {
+ log.warn("You are attempting set a property: "
+ + propertyToSet
+ + " This property is not supported with this version of the JDK");
+ }
+ }
+
+ // We don't want to affect existing systems, if anything goes
+ // wrong just display
+ // a warning and default to old behavior
+ } catch (ClassNotFoundException e) {
+ if (log.isWarnEnabled()) {
+ log.warn(" Unable to determine WsGen version being used");
+ }
+ } catch (IOException ioex) {
+ if (log.isWarnEnabled()) {
+ log.warn(" Unable to determine WsGen version being used");
+ }
+ }
+
+ return versionValid;
+ }
+
+ private static String getNewRulesFlag () {
+
+ if (newRulesFlag != null) {
+ return newRulesFlag;
+ }
+
+ try {
+ newRulesFlag = (String) AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() {
+ return (System.getProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES));
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ // Swallow and continue
+ if (log.isWarnEnabled()) {
+ log.debug("Exception getting USE_LEGACY_WEB_METHOD_RULES system property: " +e.getException());
+ }
+ }
+
+ return newRulesFlag;
+ }
+
+ private static String getNewSunRulesFlag () {
+
+ if (newSunRulesFlag != null) {
+ return newSunRulesFlag;
+ }
+
+ try {
+ newSunRulesFlag = (String) AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() {
+ return (System.getProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES_SUN));
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ // Swallow and continue
+ if (log.isWarnEnabled()) {
+ log.debug("Exception getting USE_LEGACY_WEB_METHOD_RULES_SUN system property: " +e.getException());
+ }
+ }
+
+ return newRulesFlag;
+ }
+
+
}
Added: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/LegacyMethodRetrieverImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/LegacyMethodRetrieverImpl.java?rev=819156&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/LegacyMethodRetrieverImpl.java (added)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/LegacyMethodRetrieverImpl.java Sat Sep 26 15:42:55 2009
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.jaxws.description.impl;
+
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.description.MethodRetriever;
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.MDQConstants;
+import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * LegacyMethodRetrieverImpl subclass implements the original SUN RI interpretation for
+ * annotation processing. See MethodRetriever superclass...
+ *
+ * Please refer to the following links for more info:
+ *
+ *
+ * https://jax-ws.dev.java.net/issues/show_bug.cgi?id=577
+ * http://forums.java.net/jive/thread.jspa?threadID=61630
+ * http://forums.java.net/jive/thread.jspa?threadID=55078
+ *
+ *
+ */
+public class LegacyMethodRetrieverImpl extends MethodRetriever {
+
+ //Logging setup
+ private static final Log log = LogFactory.getLog(LegacyMethodRetrieverImpl.class);
+
+ private EndpointInterfaceDescriptionImpl eid = null;
+
+ private DescriptionBuilderComposite dbc = null;
+
+ public LegacyMethodRetrieverImpl (DescriptionBuilderComposite dbc,
+ EndpointInterfaceDescriptionImpl eid) {
+
+ super();
+ this.dbc = dbc;
+ this.eid = eid;
+ }
+
+ /*
+ * Returns a non-null (possibly empty) list of MethodDescriptionComposites
+ */
+
+ public Iterator<MethodDescriptionComposite> retrieveMethods() {
+
+
+ /*
+ * Depending on whether this is an implicit SEI or an actual SEI, Gather up and build a
+ * list of MDC's. If this is an actual SEI, then starting with this DBC, build a list of all
+ * MDC's that are public methods in the chain of extended classes.
+ * If this is an implicit SEI, then starting with this DBC,
+ * 1. If a false exclude is found, then take only those that have false excludes
+ * 2. Assuming no false excludes, take all public methods that don't have exclude == true
+ * 3. For each super class, if 'WebService' present, take all MDC's according to rules 1&2
+ * But, if WebService not present, grab only MDC's that are annotated.
+ */
+ if (log.isTraceEnabled()) {
+ log.trace("retrieveReleventMethods: Enter");
+ }
+
+ ArrayList<MethodDescriptionComposite> retrieveList =
+ new ArrayList<MethodDescriptionComposite>();
+
+ if (dbc.isInterface()) {
+ if(log.isDebugEnabled()) {
+ log.debug("Removing overridden methods for interface: " + dbc.getClassName() +
+ " with super interface: " + dbc.getSuperClassName());
+ }
+
+ // make sure we retrieve all the methods, then remove the overridden
+ // methods that exist in the base interface
+ retrieveList = retrieveSEIMethodsChain(dbc, eid);
+ retrieveList = removeOverriddenMethods(retrieveList, dbc, eid);
+
+ } else {
+ //this is an implied SEI...rules are more complicated
+
+ retrieveList = retrieveImplicitSEIMethods(dbc);
+
+ //Now, continue to build this list with relevent methods in the chain of
+ //superclasses. If the logic for processing superclasses is the same as for
+ //the original SEI, then we can combine this code with above code. But, its possible
+ //the logic is different for superclasses...keeping separate for now.
+ DescriptionBuilderComposite tempDBC = dbc;
+
+ while (!DescriptionUtils.isEmpty(tempDBC.getSuperClassName())) {
+
+ //verify that this superclass name is not
+ // java.lang.object, if so, then we're done processing
+ if (DescriptionUtils.javifyClassName(tempDBC.getSuperClassName())
+ .equals(MDQConstants.OBJECT_CLASS_NAME))
+ break;
+
+ DescriptionBuilderComposite superDBC =
+ eid.getEndpointDescriptionImpl().getServiceDescriptionImpl().getDBCMap()
+ .get(tempDBC.getSuperClassName());
+
+ if (log.isTraceEnabled())
+ log.trace("superclass name for this DBC is:" + tempDBC.getSuperClassName());
+
+ //Verify that we can find the SEI in the composite list
+ if (superDBC == null) {
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("seiNotFoundErr"));
+ }
+
+ //If the superclass contains a WebService annotation then retrieve its methods
+ //as we would for the impl class, otherwise ignore the methods of this
+ //superclass
+ if (superDBC.getWebServiceAnnot() != null) {
+ //Now, gather the list of Methods just like we do for the lowest subclass
+ retrieveList.addAll(retrieveImplicitSEIMethods(superDBC));
+ }
+ tempDBC = superDBC;
+ } //Done with implied SEI's superclasses
+
+ retrieveList = removeOverriddenMethods(retrieveList, dbc, eid);
+
+ }//Done with implied SEI's
+
+ return retrieveList.iterator();
+ }
+
+ /*
+ * This is called when we know that this DBC is an implicit SEI
+ */
+ private ArrayList<MethodDescriptionComposite> retrieveImplicitSEIMethods(
+ DescriptionBuilderComposite dbc) {
+
+ ArrayList<MethodDescriptionComposite> retrieveList =
+ new ArrayList<MethodDescriptionComposite>();
+
+ retrieveList = DescriptionUtils.getMethodsWithFalseExclusions(dbc);
+
+ //If this list is empty, then there are no false exclusions, so gather
+ //all composites that don't have exclude == true
+ //If the list is not empty, then it means we found at least one method with 'exclude==false'
+ //so the list should contain only those methods
+ if (retrieveList == null || retrieveList.size() == 0) {
+ Iterator<MethodDescriptionComposite> iter = null;
+ List<MethodDescriptionComposite> mdcList = dbc.getMethodDescriptionsList();
+
+ if (mdcList != null) {
+ iter = dbc.getMethodDescriptionsList().iterator();
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+
+ if (!DescriptionUtils.isExcludeTrue(mdc)) {
+ mdc.setDeclaringClass(dbc.getClassName());
+ retrieveList.add(mdc);
+ }
+ }
+ }
+ }
+
+ return retrieveList;
+ }
+
+}
Added: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java?rev=819156&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java (added)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java Sat Sep 26 15:42:55 2009
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.jaxws.description.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.description.MethodRetriever;
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.MDQConstants;
+import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * PostRI216MethodRetrieverImpl subclass implements the new SUN RI interpretation for
+ * annotation processing. See MethodRetriever superclass...
+ *
+ * Please refer to the following links for more info:
+ *
+ *
+ * https://jax-ws.dev.java.net/issues/show_bug.cgi?id=577
+ * http://forums.java.net/jive/thread.jspa?threadID=61630
+ * http://forums.java.net/jive/thread.jspa?threadID=55078
+ *
+ *
+ */
+public class PostRI216MethodRetrieverImpl extends MethodRetriever {
+
+ //Logging setup
+ private static final Log log = LogFactory.getLog(PostRI216MethodRetrieverImpl.class);
+
+ private EndpointInterfaceDescriptionImpl eid = null;
+
+ private DescriptionBuilderComposite dbc = null;
+
+ public PostRI216MethodRetrieverImpl (DescriptionBuilderComposite dbc,
+ EndpointInterfaceDescriptionImpl eid) {
+ super();
+
+ this.dbc = dbc;
+ this.eid = eid;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.description.MethodRetriever#retrieveMethods()
+ */
+ public Iterator<MethodDescriptionComposite> retrieveMethods() {
+
+ /*
+ * Depending on whether this is an implicit SEI or an actual SEI, Gather up and build a
+ * list of MDC's. If this is an actual SEI, then starting with this DBC, build a list of all
+ * MDC's that are public methods in the chain of extended classes.
+ * If this is an implicit SEI, then starting with this DBC,
+ * 1. If a false exclude is found, then take only those that have false excludes
+ * 2. Assuming no false excludes, take all public methods that don't have exclude == true
+ * 3. For each super class, if 'WebService' present, take all MDC's according to rules 1&2
+ * But, if WebService not present, grab only MDC's that are annotated.
+ */
+ if (log.isTraceEnabled()) {
+ log.trace("retrieveMethods: Enter");
+ }
+
+ ArrayList<MethodDescriptionComposite> retrieveList = new ArrayList<MethodDescriptionComposite>();
+
+ if (dbc.isInterface()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Removing overridden methods for interface: " + dbc.getClassName()
+ + " with super interface: " + dbc.getSuperClassName());
+ }
+
+ // make sure we retrieve all the methods, then remove the overridden
+ // methods that exist in the base interface
+ retrieveList = retrieveSEIMethodsChain(dbc, eid);
+ retrieveList = removeOverriddenMethods(retrieveList, dbc, eid);
+
+ } else {
+ //this is an implied SEI...rules are more complicated
+
+ retrieveList = retrieveImplicitSEIMethods(dbc);
+
+ //Now, continue to build this list with relevent methods in the chain of
+ //superclasses. If the logic for processing superclasses is the same as for
+ //the original SEI, then we can combine this code with above code. But, its possible
+ //the logic is different for superclasses...keeping separate for now.
+ DescriptionBuilderComposite tempDBC = dbc;
+
+ while (!DescriptionUtils.isEmpty(tempDBC.getSuperClassName())) {
+
+ //verify that this superclass name is not
+ // java.lang.object, if so, then we're done processing
+ if (DescriptionUtils.javifyClassName(tempDBC.getSuperClassName()).equals(
+ MDQConstants.OBJECT_CLASS_NAME))
+ break;
+
+ DescriptionBuilderComposite superDBC = eid.getEndpointDescriptionImpl()
+ .getServiceDescriptionImpl().getDBCMap().get(tempDBC.getSuperClassName());
+
+ if (log.isTraceEnabled())
+ log.trace("superclass name for this DBC is:" + tempDBC.getSuperClassName());
+
+ //Verify that we can find the SEI in the composite list
+ if (superDBC == null) {
+ throw ExceptionFactory.makeWebServiceException(Messages
+ .getMessage("seiNotFoundErr"));
+ }
+
+ // Now, gather the list of Methods just like we do for
+ // the lowest subclass
+ retrieveList.addAll(retrieveImplicitSEIMethods(superDBC));
+ tempDBC = superDBC;
+ } //Done with implied SEI's superclasses
+ retrieveList = removeOverriddenMethods(retrieveList, dbc, eid);
+ }//Done with implied SEI's
+
+ return retrieveList.iterator();
+ }
+
+ /*
+ * This is called when we know that this DBC is an implicit SEI and the user has set the
+ * property for using Suns new behavior in JDK 1.6. We will retrieve all the public methods
+ * that do not have @WebMethod(exclude == true).
+ */
+ private ArrayList<MethodDescriptionComposite> retrieveImplicitSEIMethods(
+ DescriptionBuilderComposite dbc) {
+
+ ArrayList<MethodDescriptionComposite> retrieveList = new ArrayList<MethodDescriptionComposite>();
+
+ Iterator<MethodDescriptionComposite> iter = null;
+ List<MethodDescriptionComposite> mdcList = dbc.getMethodDescriptionsList();
+
+ if (mdcList != null) {
+ iter = dbc.getMethodDescriptionsList().iterator();
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+
+ if (!DescriptionUtils.isExcludeTrue(mdc)) {
+ mdc.setDeclaringClass(dbc.getClassName());
+ retrieveList.add(mdc);
+ }
+ }
+ }
+
+ return retrieveList;
+ }
+
+
+}
Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java Sat Sep 26 15:42:55 2009
@@ -92,7 +92,7 @@
/** @see ../ServiceDescription */
-class ServiceDescriptionImpl
+public class ServiceDescriptionImpl
implements ServiceDescription, ServiceDescriptionWSDL, ServiceDescriptionJava {
private ClientConfigurationFactory clientConfigFactory;
private ConfigurationContext configContext;
@@ -1387,7 +1387,7 @@
return isServerSide;
}
- HashMap<String, DescriptionBuilderComposite> getDBCMap() {
+ public HashMap<String, DescriptionBuilderComposite> getDBCMap() {
return dbcMap;
}
Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java Sat Sep 26 15:42:55 2009
@@ -23,6 +23,8 @@
import org.apache.axis2.jaxws.description.EndpointInterfaceDescriptionJava;
import org.apache.axis2.jaxws.description.EndpointInterfaceDescriptionWSDL;
import org.apache.axis2.jaxws.description.OperationDescription;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import javax.wsdl.Operation;
import javax.wsdl.PortType;
@@ -38,6 +40,7 @@
EndpointInterfaceDescriptionJava epInterfaceDescJava;
EndpointInterfaceDescriptionWSDL epInterfaceDescWSDL;
+ private static final Log log = LogFactory.getLog(EndpointInterfaceDescriptionValidator.class);
public EndpointInterfaceDescriptionValidator(EndpointInterfaceDescription toValidate) {
epInterfaceDesc = toValidate;
epInterfaceDescJava = (EndpointInterfaceDescriptionJava)epInterfaceDesc;
@@ -72,12 +75,52 @@
epInterfaceDesc.getDispatchableOperations();
if (wsdlOperationList.size() != dispatchableOpDescArray.length) {
- addValidationFailure(this, "The number of operations in the WSDL " +
- "portType does not match the number of methods in the SEI or " +
- "Web service implementation class. " +
- "wsdl operations = [" + toString(wsdlOperationList) +"] " +
- "dispatch operations = [" + toString(dispatchableOpDescArray) +"]");
- return INVALID;
+ //We used to throw a Validation error here.
+ //I am removing the validation error due to new interpretations
+ // of @WebMethod annotations introduced in 2.2 TCK and newer RI/JDK wsgen tools,
+ //where it's possilbe for a wsdl to have more operations than what the jaxws
+ //runtime exposes from the SEI impl.
+
+ //For Example server endpoint defines the following operations
+ // @WebService
+ // public MySEIImpl {
+ //public boolean x() {...}
+ //@WebMethod(exclude=false)
+ //public boolean y(){ ...}
+ //public String z(){ ...}
+ // ..}
+
+ //A wsGen run on this will generate a wsdl with following operations
+ //<operation name="x">
+ //<operation name="y">
+ //<operation name="z">
+
+ // And this is the WSDL Provider would return in a ?wsld request,
+ // even though the provider may only allow you to dispatch to operation y.
+
+ // To avoid security exposure, the provider may not be
+ // able to expose operations x & z, unless it's specifically
+ // requested to do so by service application. If client neglects to regen their
+ // artifacts, it's SEI will only contain operation y.
+ // This is the reason why we need to relax this error.
+
+ // The additional
+ // operation can be invoked using JAX-WS Dispatch client,
+ // or by regenerating the client artifacts (wsimport)
+ // and only when the service chooses for the runtime to expose those
+ // operations via custom settings.
+
+ //If TCK tests complaint here, we might have to reverse this
+ //change and add the validaiton back.
+
+ if(log.isWarnEnabled()){
+ log.warn("The number of operations in the WSDL " +
+ "portType does not match the number of methods in the SEI or " +
+ "Web service implementation class. " +
+ "wsdl operations = [" + toString(wsdlOperationList) +"] " +
+ "dispatch operations = [" + toString(dispatchableOpDescArray) +"]");
+ }
+ return VALID;
}
// If they are the same size, let's check to see if the operation names match
Added: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java?rev=819156&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java (added)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java Sat Sep 26 15:42:55 2009
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axis2.jaxws.util;
+
+import org.apache.axis2.java.security.AccessController;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import java.io.IOException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Properties;
+
+public class WSToolingUtils {
+
+ private static final Log log = LogFactory.getLog(WSToolingUtils.class);
+
+ /**
+ * A handy function to check for empty or null string
+ *
+ * @param str
+ * @return boolean
+ *
+ */
+ public static boolean hasValue(String str) {
+ return ((str != null) && (str.length() > 0));
+ }
+
+ /**
+ * Retrieves the major version number of the WsGen class that we're using
+ *
+ * @return String
+ *
+ */
+ public static String getWsGenVersion() throws ClassNotFoundException, IOException {
+
+ Class clazz = null;
+ try {
+
+ clazz = forName("com.sun.tools.ws.WsGen", false,
+ getContextClassLoader(null));
+
+ } catch (ClassNotFoundException e1) {
+
+ try {
+
+ clazz = forName("com.sun.tools.internal.ws.WsGen", false,
+ getContextClassLoader(null));
+
+ } catch (ClassNotFoundException e2) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from getWsGenVersion: " + e2.getMessage(), e2);
+ }
+ throw (ClassNotFoundException) e2.getException();
+ }
+ }
+
+ Properties p = new Properties();
+
+ try {
+
+ p.load(clazz.getResourceAsStream("version.properties"));
+
+ } catch (IOException ioex) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from getWsGenVersion: " + ioex.getMessage(), ioex);
+
+ }
+ throw (IOException) ioex.getCause();
+ }
+
+ return (p.getProperty("major-version"));
+ }
+
+ /**
+ * @return ClassLoader
+ */
+ private static ClassLoader getContextClassLoader(final ClassLoader classLoader) {
+ ClassLoader cl;
+ try {
+ cl = (ClassLoader) AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() throws ClassNotFoundException {
+ return classLoader != null ? classLoader : Thread.currentThread().getContextClassLoader();
+ }
+ }
+ );
+ } catch (PrivilegedActionException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from AccessController: " + e.getMessage(), e);
+ }
+ throw ExceptionFactory.makeWebServiceException(e.getException());
+ }
+
+ return cl;
+ }
+
+ /**
+ * Return the class for this name
+ *
+ * @return Class
+ */
+ private static Class forName(final String className, final boolean initialize,
+ final ClassLoader classloader) throws ClassNotFoundException {
+ Class cl = null;
+ try {
+ cl = (Class) AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() throws ClassNotFoundException {
+ return Class.forName(className, initialize, classloader);
+ }
+ }
+ );
+ } catch (PrivilegedActionException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from AccessController: " + e.getMessage(), e);
+ }
+ throw (ClassNotFoundException) e.getException();
+ }
+
+ return cl;
+ }
+
+ public static boolean isValidVersion(String wsGenVersion) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("isValidVersion: Determining if WsGen version: " +wsGenVersion
+ +" is appropriate version for using new SUN RI behavior");
+ }
+
+ // Beginning of reuseable code
+ final int VERSION_FIELD_1 = 2;
+ final int VERSION_FIELD_2 = 1;
+ final int VERSION_FIELD_3 = 6;
+
+ String version = wsGenVersion.trim();
+
+ //Algorithm assumption 1: We are assuming that the version string will always be
+ // of the form "x.x.x" where x is a character (or series of characters) with each digit
+ // having a converted integer value of 0 - 9.
+ //Assumption 2: We are assuming thatWsgen version 2.1.6 is the starting version
+ // for being able to use the new Sun behavior
+
+ int dotIndex = version.indexOf(".");
+ int subField = Integer.valueOf(version.substring(0, dotIndex));
+
+ if (subField < VERSION_FIELD_1) {
+ return false;
+ } else if (subField > VERSION_FIELD_1) {
+ //If we are greater than 2.x.x (i.e. 3.x.x) then version is valid
+ return true;
+ }
+
+ String subString2 = version.substring(dotIndex + 1);
+ dotIndex = subString2.indexOf(".");
+ subField = Integer.valueOf(subString2.substring(0, dotIndex));
+
+ if (subField < VERSION_FIELD_2) {
+ return false;
+ } else if (subField > VERSION_FIELD_2) {
+ //If we are greater than 2.1.x (i.e. 2.2.x) then version is valid
+ return true;
+ }
+
+ //Final substring, will probably hit end of string. But, check to make sure there is not
+ // another "." (i.e. We could have "2.1.6.1")yes.
+ String subString3 = subString2.substring(dotIndex + 1);
+
+ //Does string contain another dot? if so, just read up to that dot. Otherwise, assume that
+ //this is the last sub-string
+ dotIndex = subString3.indexOf(".");
+ if (dotIndex == -1) {
+ subField = Integer.valueOf(subString3);
+ } else {
+ subField = Integer.valueOf(subString3.substring(0, dotIndex));
+ }
+
+ if (subField < VERSION_FIELD_3) {
+ return false;
+ }
+
+ return true;
+ }
+}
Modified: webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java Sat Sep 26 15:42:55 2009
@@ -23,7 +23,9 @@
import junit.framework.TestCase;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Parameter;
+import org.apache.axis2.jaxws.description.builder.MDQConstants;
import org.apache.axis2.jaxws.description.echo.EchoServiceImplWithSEI;
+import org.apache.axis2.jaxws.util.WSToolingUtils;
import org.apache.log4j.BasicConfigurator;
import javax.jws.Oneway;
@@ -36,6 +38,8 @@
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
+import java.io.IOException;
+
/**
* Tests the creation of the Description classes based on a service implementation bean and various
* combinations of annotations
@@ -526,6 +530,191 @@
assertNull(operationDescs);
}
+
+
+ //Verify that
+ // 1. Wsgen version 2.1.6 is valid for using the new behavior
+ // 2. Something greater than 2.1.6 is also valid
+ // 3. Something less that 2.1.6 is not valid
+ public void testValidWsgenVersion() {
+
+ assertTrue(WSToolingUtils.isValidVersion(MDQConstants.SUN_WEB_METHOD_BEHAVIOR_CHANGE_VERSION));
+
+ //This should be true because it converts to something greater than 2.1.6
+ assertTrue(WSToolingUtils.isValidVersion("2.12.6.1"));
+
+ //Less than 2.1.6 so should fail
+ assertFalse(WSToolingUtils.isValidVersion("2.1.1"));
+ }
+
+ //This test verifies that the old WebMethod behavior has not changed if the system flag is
+ //not set, slightly redundant but still a safety check
+ public void testWebMethodOldBehavior1() {
+
+ try {
+ //If the version is valid then try the new behavior
+ if (WSToolingUtils.isValidVersion(WSToolingUtils.getWsGenVersion())) {
+ System.setProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES, "false");
+ //Try new behavior
+ }
+ } catch (ClassNotFoundException e) {
+ } catch (IOException ioex) {
+ }
+
+
+ EndpointInterfaceDescription testEndpointInterfaceDesc =
+ getEndpointInterfaceDesc(WebMethodTestImpl.class);
+
+
+ // Test results from method with no annotation
+ OperationDescription[] operationDescs =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("method1");
+
+ assertNull(operationDescs);
+
+ OperationDescription operationDesc =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod2", operationDesc.getOperationName());
+ assertEquals("", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3")[0];
+ assertNotNull(operationDesc);
+ assertEquals("method3", operationDesc.getOperationName());
+ assertEquals("ActionMethod3", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod4", operationDesc.getOperationName());
+ assertEquals("ActionMethod4", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod4", operationDesc.getOperationName());
+ assertEquals("ActionMethod4", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method5");
+ assertNull(operationDescs);
+
+ }
+
+ //This test verifies that, if we do have the appropriate JDK installed but we do not set
+ //the System property then the old behavior remains unchanged
+ public void testWebMethodOldBehavior2() {
+
+ try {
+ //If the version is valid then try the new behavior
+ if (WSToolingUtils.isValidVersion(WSToolingUtils.getWsGenVersion())) {
+ //Set the property to empty just to make sure we are not trying the new behavior
+ //In order for the new behavior to work, this must be set explicitly to 'false'
+ System.setProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES, "");
+ //Try new behavior
+ } else {
+ //At this point, just return as it would be redundant to continue...already tested
+ // in testWebMethodOldBehavior1
+ return;
+ }
+ } catch (ClassNotFoundException e) {
+ } catch (IOException ioex) {
+ }
+
+
+ EndpointInterfaceDescription testEndpointInterfaceDesc =
+ getEndpointInterfaceDesc(WebMethodTestImpl.class);
+
+
+ // Test results from method with no annotation
+ OperationDescription[] operationDescs =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("method1");
+
+ assertNull(operationDescs);
+
+ OperationDescription operationDesc =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("method2")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod2", operationDesc.getOperationName());
+ assertEquals("", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method3")[0];
+ assertNotNull(operationDesc);
+ assertEquals("method3", operationDesc.getOperationName());
+ assertEquals("ActionMethod3", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod4", operationDesc.getOperationName());
+ assertEquals("ActionMethod4", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDesc = testEndpointInterfaceDesc.getOperationForJavaMethod("method4")[0];
+ assertNotNull(operationDesc);
+ assertEquals("renamedMethod4", operationDesc.getOperationName());
+ assertEquals("ActionMethod4", operationDesc.getAction());
+ assertFalse(operationDesc.isExcluded());
+
+ operationDescs = testEndpointInterfaceDesc.getOperationForJavaMethod("method5");
+ assertNull(operationDescs);
+
+ }
+
+ //This test verifies that, if we do have the appropriate JDK installed and we do set the
+ //system property flag, then the new behavior will be realized.
+ //NOTE: This method can be forced to run thru the tests by temporarily changing
+ //the "newSunBehavior" flag inside of EndpointInterfaceDescriptionImpl.getMethodRetriever()
+ // and
+ // in this method, by forcing "validVersion" to true. Realize that by doing this other tests
+ // will fail...So this should be considered temporary for testing this method
+ public void testWebMethodNewBehavior1() {
+
+ try {
+ boolean validVersion = WSToolingUtils.isValidVersion(WSToolingUtils.getWsGenVersion());
+ //If the version is valid then try the new behavior
+
+ if (validVersion) {
+ //Try new behavior
+ System.setProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES, "false");
+ } else {
+ //At this point, just return since the test would be guaranteed to fail as we
+ //testing new rules
+ return;
+ }
+ } catch (ClassNotFoundException e) {
+ } catch (IOException ioex) {
+ }
+
+ EndpointInterfaceDescription testEndpointInterfaceDesc =
+ getEndpointInterfaceDesc(WebMethodTestImpl1.class);
+
+ // All tests here will be using the new behavior
+
+ //We should be able to see this even though there are false exclusions
+ OperationDescription[] operationDescs =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("method1");
+
+ assertNotNull(operationDescs);
+
+ operationDescs =
+ testEndpointInterfaceDesc.getOperationForJavaMethod("shouldBeExcludedMethod");
+
+ assertNull(operationDescs);
+
+ operationDescs =
+ testEndpointInterfaceDesc.getOperations();
+ assertEquals(operationDescs.length, 4);
+
+ //Need to make sure we don't mess up the other tests, so set this back to using the
+ //legacy behavior
+ System.setProperty(MDQConstants.USE_LEGACY_WEB_METHOD_RULES, "true");
+
+ }
+
+
public void testWebResult() {
EndpointInterfaceDescription testEndpointInterfaceDesc =
@@ -1270,6 +1459,42 @@
}
}
+//=============================================================================
+//testWebMethod service implementaiton class
+//=============================================================================
+
+//This an implied SEI which will be used to test the new Sun Behavior
+@WebService
+class WebMethodTestImpl1 {
+// No web method annotation
+public String method1(String s) {
+ return s;
+}
+
+@WebMethod(operationName = "renamedMethod2")
+public String method2(String s) {
+ return s;
+}
+
+@WebMethod(action = "ActionMethod3")
+public String method3(String s) {
+ return s;
+}
+
+@WebMethod(operationName = "renamedMethod4", action = "ActionMethod4")
+public String method4(String s) {
+ return s;
+}
+
+@WebMethod(operationName = "shouldBeExcludedMethod", exclude = true)
+public String method5(String s) {
+ return s;
+}
+}
+
+
+
+
// =============================================================================
// testWebMethod service implementaiton class
// =============================================================================
Modified: webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/ValidateWSDLTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/ValidateWSDLTests.java?rev=819156&r1=819155&r2=819156&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/ValidateWSDLTests.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/ValidateWSDLTests.java Sat Sep 26 15:42:55 2009
@@ -81,7 +81,12 @@
try {
List<ServiceDescription> serviceDescList =
DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap);
- fail();
+
+ //Removing the fail() call here as we removed the Valdiation Error from
+ //EndpointInterfaceDescriptionValidator.
+
+ //Expected code path
+
}
catch (WebServiceException e) {
// Expected code path