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/05/13 09:30:38 UTC
svn commit: r1102590 - in /geronimo/bundles/trunk/axis2: pom.xml
src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
Author: xuhaihong
Date: Fri May 13 07:30:38 2011
New Revision: 1102590
URL: http://svn.apache.org/viewvc?rev=1102590&view=rev
Log:
Try the AXIS2-5040 from Geronimo side
Added:
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java (with props)
Modified:
geronimo/bundles/trunk/axis2/pom.xml
Modified: geronimo/bundles/trunk/axis2/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/pom.xml?rev=1102590&r1=1102589&r2=1102590&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/pom.xml (original)
+++ geronimo/bundles/trunk/axis2/pom.xml Fri May 13 07:30:38 2011
@@ -318,7 +318,8 @@
org/apache/axis2/jaxws/context/WebServiceContextImpl.class=target/classes/org/apache/axis2/jaxws/context/WebServiceContextImpl.class,
org/apache/axis2/jaxws/BindingProvider.class=target/classes/org/apache/axis2/jaxws/BindingProvider.class,
org/apache/axis2/jaxws/BindingProvider$ValidatingClientContext.class=target/classes/org/apache/axis2/jaxws/BindingProvider$ValidatingClientContext.class,
- org/apache/axis2/client/OperationClient.class=target/classes/org/apache/axis2/client/OperationClient.class
+ org/apache/axis2/client/OperationClient.class=target/classes/org/apache/axis2/client/OperationClient.class,
+ org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.class=target/classes/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.class
</Include-Resource>
<SPI-Provider>true</SPI-Provider>
</instructions>
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java?rev=1102590&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java Fri May 13 07:30:38 2011
@@ -0,0 +1,205 @@
+/*
+ * 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.Iterator;
+import java.util.List;
+
+import javax.wsdl.Definition;
+
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.description.MethodRetriever;
+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.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);
+ //Let check to see if there where any operations with @Webmethod
+ //If LeagcyWebmethod is NOT defined i.e default and if there
+ //are operations with @Webmethod annotation, then lets warn the
+ //user that we may be exposing public operation that they did not
+ //intend to expose, this can happen if user is migrating application
+ //from old JAX-WS tooling version.
+ //Let also inform user that if they can use LegacyWebmethod to expose
+ //Only those operations that have @webmethod(exclude=false) annotation on them.
+ boolean isWebmethodDefined = DescriptionUtils.isWebmethodDefined(dbc);
+ Iterator<MethodDescriptionComposite> iter = retrieveList.iterator();
+ while(iter.hasNext()){
+ MethodDescriptionComposite mdc = iter.next();
+ //If user defined a legacyWemethod with no wsdl, has atleast one operation with @Wemethod annotation
+ //and this is a public operation with no @Webmethod operation that is being exposed then
+ //lets warn user of possible security exposure.
+ Definition wsdlDef = ((ServiceDescriptionWSDL)eid.getEndpointDescription().getServiceDescription()).getWSDLDefinition();
+ if(getLegacyWebMethod()==null && wsdlDef == null && isWebmethodDefined && mdc.getWebMethodAnnot()==null && !isConstructor(mdc)){
+ log.warn(Messages.getMessage("MethodRetrieverWarning1", mdc.getMethodName()));
+ }
+ }
+ }//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();
+ boolean isWebServiceDefined = dbc.getWebServiceAnnot() != null;
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+ //flag to check if the method can be exposed as webservice.
+ if (!isWebServiceDefined && mdc.getWebMethodAnnot() == null) {
+ continue;
+ }
+ boolean isWebservice = !DescriptionUtils.isExcludeTrue(mdc) && !mdc.isStatic() && !mdc.isFinal();
+ if(!isWebservice){
+ if(log.isDebugEnabled()){
+ log.debug(mdc.getMethodName() + " has static or final modifiers in method signature or has @Webmethod(exclude=true) set");
+ log.debug(mdc.getMethodName() + " cannot be exposed as a webservice");
+ }
+ }
+ if (isWebservice) {
+ mdc.setDeclaringClass(dbc.getClassName());
+ retrieveList.add(mdc);
+ }
+ }
+
+ }
+
+ return retrieveList;
+ }
+
+ private boolean isConstructor(MethodDescriptionComposite mdc){
+ return mdc.getMethodName().equals("<init>");
+ }
+
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain