blob: 7df983b9dc29fb0ae8dccee89d77df5f12f253c8 [file] [log] [blame]
/*
* 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.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
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) {
final String restrictStaticWebmethod = "jaxws.runtime.restrictStaticWebmethod";
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();
AxisConfiguration ac = eid.getEndpointDescription().getServiceDescription().getAxisConfigContext().getAxisConfiguration();
Parameter p =ac.getParameter(restrictStaticWebmethod);
Boolean isRestrictStaticOperation=Boolean.FALSE;
if(p!=null){
isRestrictStaticOperation = DescriptionUtils.getBooleanValue((String)p.getValue());
if(log.isDebugEnabled()){
log.debug("System property jaxws.runtime.restrictStaticWebmethod is set to :"+isRestrictStaticOperation);
}
}
if (mdcList != null) {
iter = dbc.getMethodDescriptionsList().iterator();
while (iter.hasNext()) {
MethodDescriptionComposite mdc = iter.next();
if(isRestrictStaticOperation){
//all operation with legacy jaxws tooling excluding static operations will be exposed.
if (!mdc.isStatic() && !DescriptionUtils.isExcludeTrue(mdc)) {
mdc.setDeclaringClass(dbc.getClassName());
retrieveList.add(mdc);
}
}else{
//all operation with legacy jaxws tooling including static operations will be exposed.
if (!DescriptionUtils.isExcludeTrue(mdc)) {
mdc.setDeclaringClass(dbc.getClassName());
retrieveList.add(mdc);
}
}
}
}
}
return retrieveList;
}
}