/* * 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.builder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MethodDescriptionComposite implements TMAnnotationComposite, TMFAnnotationComposite { //Method reflective information private String methodName; //a public method name in this class private String returnType; //Methods return type private String[] exceptions; private String declaringClass; //the class/interface that actually declares this method private boolean staticModifier= false;//true if method is static private boolean finalModifier = false; //true if method is final boolean oneWayAnnotated; // boolean that indicates if an @XmlList annotation was found on the method private boolean isListType = false; private WebMethodAnnot webMethodAnnot; private WebResultAnnot webResultAnnot; private HandlerChainAnnot handlerChainAnnot; private SoapBindingAnnot soapBindingAnnot; private WebServiceRefAnnot webServiceRefAnnot; private WebEndpointAnnot webEndpointAnnot; private RequestWrapperAnnot requestWrapperAnnot; //TODO EDIT CHECK: only on methods of SEI private ResponseWrapperAnnot responseWrapperAnnot;//TODO EDIT CHECK: only on methods of SEI private List<ParameterDescriptionComposite> parameterDescriptions;//TODO EDIT CHECK: only on methods of SEI private DescriptionBuilderComposite parentDBC; private ActionAnnot actionAnnot; /* * Default Constructor */ public MethodDescriptionComposite() { parameterDescriptions = new ArrayList<ParameterDescriptionComposite>(); } public MethodDescriptionComposite( String methodName, String returnType, WebMethodAnnot webMethodAnnot, WebResultAnnot webResultAnnot, boolean oneWayAnnotated, HandlerChainAnnot handlerChainAnnot, SoapBindingAnnot soapBindingAnnot, WebServiceRefAnnot webServiceRefAnnot, WebEndpointAnnot webEndpointAnnot, RequestWrapperAnnot requestWrapperAnnot, ResponseWrapperAnnot responseWrapperAnnot ) { this.methodName = methodName; this.returnType = returnType; this.webMethodAnnot = webMethodAnnot; this.webResultAnnot = webResultAnnot; this.oneWayAnnotated = oneWayAnnotated; this.handlerChainAnnot = handlerChainAnnot; this.soapBindingAnnot = soapBindingAnnot; this.webServiceRefAnnot = webServiceRefAnnot; this.webEndpointAnnot = webEndpointAnnot; this.requestWrapperAnnot = requestWrapperAnnot; this.responseWrapperAnnot = responseWrapperAnnot; } /** @return Returns the methodName */ public String getMethodName() { return methodName; } /** * Returns the String descrbing this method result type. Note that this string is unparsed. For * example, if it represents a java.util.List<my.package.Foo>, then that excact string will be * returned, i.e. "java.util.List<my.package.Foo>". You can use other methods on this object to * retrieve parsed values for Generics and Holders. * * @return Returns the returnType */ public String getReturnType() { return returnType; } /** * Returns the class associated with the method result type. Note that if the resturn type a * generic (such as java.util.List<my.package.Foo>) then the class associated with the raw type is * returned (i.e. java.util.List). * <p/> * There are other methods that return the class for the actual type for certain JAX-WS specific * generics such as Response<T> * * @return Returns the parameterTypeClass. */ public Class getReturnTypeClass() { Class returnTypeClass = null; String fullReturnType = getReturnType(); if (fullReturnType != null) { returnTypeClass = DescriptionBuilderUtils.getPrimitiveClass(fullReturnType); if (returnTypeClass == null) { // If this is a Generic, we need to load the class associated with the Raw Type, // i.e. for List<Foo>, we want to load List. Othwerise, load the type directly. String classToLoad = null; if (DescriptionBuilderUtils.getRawType(fullReturnType) != null) { classToLoad = DescriptionBuilderUtils.getRawType(fullReturnType); } else { classToLoad = fullReturnType; } returnTypeClass = loadClassFromMDC(classToLoad); } } return returnTypeClass; } private Class loadClassFromMDC(String classToLoad) { Class returnClass = null; ClassLoader classLoader = null; if (getDescriptionBuilderCompositeRef() != null) { classLoader = getDescriptionBuilderCompositeRef().getClassLoader(); } returnClass = DescriptionBuilderUtils.loadClassFromComposite(classToLoad, classLoader); return returnClass; } /** @return returns whether this is OneWay */ public boolean isOneWay() { return oneWayAnnotated; } /** @return Returns the webEndpointAnnot. */ public WebEndpointAnnot getWebEndpointAnnot() { return webEndpointAnnot; } /** @return Returns the requestWrapperAnnot. */ public RequestWrapperAnnot getRequestWrapperAnnot() { return requestWrapperAnnot; } /** @return Returns the responseWrapperAnnot. */ public ResponseWrapperAnnot getResponseWrapperAnnot() { return responseWrapperAnnot; } /** @return Returns the handlerChainAnnot. */ public HandlerChainAnnot getHandlerChainAnnot() { return handlerChainAnnot; } /** @return Returns the soapBindingAnnot. */ public SoapBindingAnnot getSoapBindingAnnot() { return soapBindingAnnot; } /** @return Returns the webMethodAnnot. */ public WebMethodAnnot getWebMethodAnnot() { return webMethodAnnot; } /** @return Returns the webResultAnnot. */ public WebResultAnnot getWebResultAnnot() { return webResultAnnot; } /** @return Returns the webServiceRefAnnot. */ public WebServiceRefAnnot getWebServiceRefAnnot() { return webServiceRefAnnot; } /** @return Returns the actionAnnot. */ public ActionAnnot getActionAnnot() { return actionAnnot; } /** @return Returns the exceptions. */ public String[] getExceptions() { return exceptions; } /** @return Returns the exceptions. */ public Class[] getExceptionTypes() { //TODO: Implement this... //for each exception in the array, convert it to a class, and return that //If a classloader was not set, then just use the default Class[] classes = new Class[0]; return classes; } /** @return Returns the fully qualified name of the declaring class. */ public String getDeclaringClass() { if (declaringClass == null && parentDBC != null) { return parentDBC.getClassName(); } return declaringClass; } /** @return Returns the ModuleClassType. */ public DescriptionBuilderComposite getDescriptionBuilderCompositeRef() { return this.parentDBC; } /** @param methodName The methodName to set. */ public void setMethodName(String methodName) { this.methodName = methodName; } /** @param returnType The returnType to set. */ public void setReturnType(String returnType) { this.returnType = returnType; } /** @param oneWayAnnotated The oneWay boolean to set */ public void setOneWayAnnot(boolean oneWayAnnotated) { this.oneWayAnnotated = oneWayAnnotated; } /** @param webEndpointAnnotImpl The webEndpointAnnotImpl to set. */ public void setWebEndpointAnnot(WebEndpointAnnot webEndpointAnnot) { this.webEndpointAnnot = webEndpointAnnot; } /** @param requestWrapperAnnot The requestWrapperAnnot to set. */ public void setRequestWrapperAnnot( RequestWrapperAnnot requestWrapperAnnot) { this.requestWrapperAnnot = requestWrapperAnnot; } /** @param responseWrapperAnnot The responseWrapperAnnot to set. */ public void setResponseWrapperAnnot( ResponseWrapperAnnot responseWrapperAnnot) { this.responseWrapperAnnot = responseWrapperAnnot; } /** @param handlerChainAnnot The handlerChainAnnot to set. */ public void setHandlerChainAnnot(HandlerChainAnnot handlerChainAnnot) { this.handlerChainAnnot = handlerChainAnnot; } /** @param soapBindingAnnot The soapBindingAnnot to set. */ public void setSoapBindingAnnot(SoapBindingAnnot soapBindingAnnot) { this.soapBindingAnnot = soapBindingAnnot; } /** @param webMethodAnnot The webMethodAnnot to set. */ public void setWebMethodAnnot(WebMethodAnnot webMethodAnnot) { this.webMethodAnnot = webMethodAnnot; } /** @param webResultAnnot The webResultAnnot to set. */ public void setWebResultAnnot(WebResultAnnot webResultAnnot) { this.webResultAnnot = webResultAnnot; } /** @param webServiceRefAnnot The webServiceRefAnnot to set. */ public void setWebServiceRefAnnot(WebServiceRefAnnot webServiceRefAnnot) { this.webServiceRefAnnot = webServiceRefAnnot; } /** @param actionAnnot The actionAnnot to set. */ public void setActionAnnot(ActionAnnot actionAnnot) { this.actionAnnot = actionAnnot; } /** @param parameterDescription The parameterDescription to add to the set. */ public void addParameterDescriptionComposite( ParameterDescriptionComposite parameterDescription) { parameterDescriptions.add(parameterDescription); } /** * @param parameterDescription The parameterDescription to add to the set. * @param index The index at which to place this parameterDescription */ public void addParameterDescriptionComposite(ParameterDescriptionComposite parameterDescription, int index) { parameterDescription.setListOrder(index); parameterDescriptions.add(index, parameterDescription); } /** @param parameterDescription The parameterDescription to add to the set. */ public void setParameterDescriptionCompositeList( List<ParameterDescriptionComposite> parameterDescriptionList) { this.parameterDescriptions = parameterDescriptionList; } /** @param parameterDescription The parameterDescription to add to the set. */ public ParameterDescriptionComposite getParameterDescriptionComposite(int index) { return parameterDescriptions.get(index); } /** */ public List<ParameterDescriptionComposite> getParameterDescriptionCompositeList() { return parameterDescriptions; } /** @param exceptions The exceptions to set. */ public void setExceptions(String[] exceptions) { this.exceptions = exceptions; } /** @param declaringClass The wrapper class to set. */ public void setDeclaringClass(String declaringClass) { this.declaringClass = declaringClass; } /** @return Returns the ModuleClassType. */ public void setDescriptionBuilderCompositeRef(DescriptionBuilderComposite dbc) { this.parentDBC = dbc; } public boolean isStatic() { return staticModifier; } public void setStaticModifier(boolean staticModifier) { this.staticModifier = staticModifier; } public boolean isFinal() { return finalModifier; } public void setFinalModifier(boolean finalModifier) { this.finalModifier = finalModifier; } public boolean compare(Object obj) { if (obj instanceof MethodDescriptionComposite) { MethodDescriptionComposite mdc = (MethodDescriptionComposite)obj; if (!(this.methodName.equals(mdc.getMethodName()))) { return false; } List<ParameterDescriptionComposite> thisParamList = this.parameterDescriptions; List<ParameterDescriptionComposite> paramList = mdc.getParameterDescriptionCompositeList(); if (thisParamList.size() != paramList.size()) { return false; } for (int i = 0; i < thisParamList.size(); i++) { if (!(thisParamList.get(i).compare(paramList.get(i)))) { return false; } } return true; } else { return super.equals(obj); } } public void setIsListType(boolean isListType) { this.isListType = isListType; } public boolean isListType() { return isListType; } /** * Convenience method for unit testing. We will print all of the * data members here. */ public String toString() { StringBuffer sb = new StringBuffer(); final String newLine = "\n"; final String sameLine = "; "; sb.append(super.toString()); sb.append(newLine); sb.append("Name: " + methodName); sb.append(sameLine); sb.append("ReturnType: " + returnType); sb.append(newLine); sb.append("Exceptions: "); if (exceptions != null) { for (int i = 0; i < exceptions.length; i++) { sb.append(exceptions[i]); sb.append(sameLine); } } if (oneWayAnnotated) { sb.append(newLine); sb.append("OneWay"); } if (webMethodAnnot != null) { sb.append(newLine); sb.append("WebMethod: "); sb.append(webMethodAnnot.toString()); } if (requestWrapperAnnot != null) { sb.append(newLine); sb.append("RequestWrapper: "); sb.append(requestWrapperAnnot.toString()); } if (responseWrapperAnnot != null) { sb.append(newLine); sb.append("ResponsetWrapper: "); sb.append(responseWrapperAnnot.toString()); } if (soapBindingAnnot != null) { sb.append(newLine); sb.append("SOAPBinding: "); sb.append(soapBindingAnnot.toString()); } if (webEndpointAnnot != null) { sb.append(newLine); sb.append("WebEndpoint: "); sb.append(webEndpointAnnot.toString()); } if (webResultAnnot != null) { sb.append(newLine); sb.append("WebResult: "); sb.append(webResultAnnot.toString()); } if (webServiceRefAnnot != null) { sb.append(newLine); sb.append("WebServiceRef: "); sb.append(webServiceRefAnnot.toString()); } if (actionAnnot != null) { sb.append(newLine); sb.append("Action: "); sb.append(actionAnnot.toString()); } if (handlerChainAnnot != null) { sb.append(newLine); sb.append("HandlerChain: "); sb.append(handlerChainAnnot.toString()); } sb.append(newLine); sb.append("Number of Parameter Descriptions: " + parameterDescriptions.size()); Iterator<ParameterDescriptionComposite> pdcIter = parameterDescriptions.iterator(); while (pdcIter.hasNext()) { sb.append(newLine); ParameterDescriptionComposite pdc = pdcIter.next(); sb.append(pdc.toString()); } return sb.toString(); } }