endpointinterfacedescriptionimpl.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,033 行 · 第 1/4 页
JAVA
1,033 行
*
* @param seiMethod The java.lang.Method from the SEI for which an OperationDescription is
* wanted
* @return
*/
public OperationDescription getOperation(Method seiMethod) {
OperationDescription returnOperation = null;
if (seiMethod != null) {
OperationDescription[] allOperations = getOperations();
for (OperationDescription operation : allOperations) {
if (operation.getSEIMethod() != null && operation.getSEIMethod().equals(seiMethod))
{
returnOperation = operation;
}
}
}
return returnOperation;
}
public Class getSEIClass() {
return seiClass;
}
// Annotation-realted getters
// ========================================
// SOAP Binding annotation realted methods
// ========================================
public SOAPBinding getAnnoSoapBinding() {
// TODO: Test with sei Null, not null, SOAP Binding annotated, not annotated
if (soapBindingAnnotation == null) {
if (dbc != null) {
soapBindingAnnotation = dbc.getSoapBindingAnnot();
} else {
if (seiClass != null) {
soapBindingAnnotation = (SOAPBinding)seiClass.getAnnotation(SOAPBinding.class);
}
}
}
return soapBindingAnnotation;
}
public javax.jws.soap.SOAPBinding.Style getSoapBindingStyle() {
// REVIEW: Implement WSDL/Anno merge
return getAnnoSoapBindingStyle();
}
public javax.jws.soap.SOAPBinding.Style getAnnoSoapBindingStyle() {
if (soapBindingStyle == null) {
if (getAnnoSoapBinding() != null && getAnnoSoapBinding().style() != null) {
soapBindingStyle = getAnnoSoapBinding().style();
} else {
soapBindingStyle = SOAPBinding_Style_DEFAULT;
}
}
return soapBindingStyle;
}
public javax.jws.soap.SOAPBinding.Use getSoapBindingUse() {
// REVIEW: Implement WSDL/Anno merge
return getAnnoSoapBindingUse();
}
public javax.jws.soap.SOAPBinding.Use getAnnoSoapBindingUse() {
if (soapBindingUse == null) {
if (getAnnoSoapBinding() != null && getAnnoSoapBinding().use() != null) {
soapBindingUse = getAnnoSoapBinding().use();
} else {
soapBindingUse = SOAPBinding_Use_DEFAULT;
}
}
return soapBindingUse;
}
public javax.jws.soap.SOAPBinding.ParameterStyle getSoapBindingParameterStyle() {
// REVIEW: Implement WSDL/Anno merge
return getAnnoSoapBindingParameterStyle();
}
public javax.jws.soap.SOAPBinding.ParameterStyle getAnnoSoapBindingParameterStyle() {
if (soapParameterStyle == null) {
if (getAnnoSoapBinding() != null && getAnnoSoapBinding().parameterStyle() != null) {
soapParameterStyle = getAnnoSoapBinding().parameterStyle();
} else {
soapParameterStyle = SOAPBinding_ParameterStyle_DEFAULT;
}
}
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()) {
retrieveList.addAll(retrieveSEIMethodsChain(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(
"EndpointInterfaceDescriptionImpl: cannot find super class that was specified for this class");
}
if (superDBC.getWebServiceAnnot() != null) {
//Now, gather the list of Methods just like we do for the lowest subclass
retrieveList.addAll(retrieveImplicitSEIMethods(superDBC));
} else {
//This superclass does not contain a WebService annotation, add only the
//methods that are annotated with WebMethod
Iterator<MethodDescriptionComposite> iterMethod =
dbc.getMethodDescriptionsList().iterator();
while (iterMethod.hasNext()) {
MethodDescriptionComposite mdc = iterMethod.next();
if (!DescriptionUtils.isExcludeTrue(mdc)) {
mdc.setDeclaringClass(superDBC.getClassName());
retrieveList.add(mdc);
}
}
}
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 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) {
HashMap<String, Integer> hierarchyMap = 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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?