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 ba...@apache.org on 2006/11/03 02:33:03 UTC
svn commit: r470629 [4/8] - in /webservices/axis2/trunk/java/modules/jaxws:
src/javax/xml/ws/spi/ src/org/apache/axis2/jaxws/
src/org/apache/axis2/jaxws/client/proxy/
src/org/apache/axis2/jaxws/context/utils/
src/org/apache/axis2/jaxws/description/ src...
Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java?view=diff&rev=470629&r1=470628&r2=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java Thu Nov 2 17:33:00 2006
@@ -18,999 +18,52 @@
package org.apache.axis2.jaxws.description;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import javax.jws.Oneway;
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebResult;
-import javax.jws.WebParam.Mode;
-import javax.jws.soap.SOAPBinding;
import javax.xml.namespace.QName;
-import javax.xml.ws.RequestWrapper;
-import javax.xml.ws.ResponseWrapper;
-import javax.xml.ws.WebFault;
-import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisOperation;
-import org.apache.axis2.description.AxisOperationFactory;
-import org.apache.axis2.description.InOnlyAxisOperation;
-import org.apache.axis2.description.InOutAxisOperation;
-import org.apache.axis2.description.OutInAxisOperation;
-import org.apache.axis2.description.OutOnlyAxisOperation;
-import org.apache.axis2.engine.MessageReceiver;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.jaxws.description.builder.HandlerChainAnnot;
-import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
-import org.apache.axis2.jaxws.description.builder.OneWayAnnot;
-import org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposite;
-import org.apache.axis2.jaxws.description.builder.RequestWrapperAnnot;
-import org.apache.axis2.jaxws.description.builder.ResponseWrapperAnnot;
-import org.apache.axis2.jaxws.description.builder.SoapBindingAnnot;
-import org.apache.axis2.jaxws.description.builder.WebEndpointAnnot;
-import org.apache.axis2.jaxws.description.builder.WebMethodAnnot;
-import org.apache.axis2.jaxws.description.builder.WebResultAnnot;
-import org.apache.axis2.jaxws.description.builder.WebServiceContextAnnot;
-import org.apache.axis2.jaxws.description.builder.WebServiceRefAnnot;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.axis2.wsdl.WSDLConstants.WSDL20_2004Constants;
-import org.apache.axis2.wsdl.WSDLConstants.WSDL20_2006Constants;
-/**
- * An OperationDescripton corresponds to a method on an SEI. That SEI could be explicit
- * (i.e. WebService.endpointInterface=sei.class) or implicit (i.e. public methods on the service implementation
- * are the contract and thus the implicit SEI). Note that while OperationDescriptions are created on both the client
- * and service side, implicit SEIs will only occur on the service side.
- *
- * OperationDescriptons contain information that is only relevent for and SEI-based service, i.e. one that is invoked via specific
- * methods. This class does not exist for Provider-based services (i.e. those that specify WebServiceProvider)
- *
- * <pre>
- * <b>OperationDescription details</b>
- *
- * CORRESPONDS TO: A single operation on an SEI (on both Client and Server)
- *
- * AXIS2 DELEGATE: AxisOperation
- *
- * CHILDREN: 0..n ParameterDescription
- * 0..n FaultDescription (Note: Not fully implemented)
- *
- * ANNOTATIONS:
- * WebMethod [181]
- * SOAPBinding [181]
- * Oneway [181]
- * WebResult [181]
- * RequestWrapper [224]
- * ResponseWrapper [224]
- *
- * WSDL ELEMENTS:
- * operation
- *
- * </pre>
- */
+public interface OperationDescription {
+ public EndpointInterfaceDescription getEndpointInterfaceDescription();
+ public FaultDescription[] getFaultDescriptions();
+ public FaultDescription resolveFaultByExceptionName(String exceptionClassName);
+ public FaultDescription resolveFaultByFaultBeanName(String faultBeanName);
+ public ParameterDescription getParameterDescription(int parameterNumber);
+ public ParameterDescription getParameterDescription(String parameterName);
+ public ParameterDescription[] getParameterDescriptions();
+
+ public abstract AxisOperation getAxisOperation();
+
+ public String getJavaMethodName();
+ public String[] getJavaParameters();
+ public Method getSEIMethod();
+
+ public QName getName();
+ public String getOperationName();
+ public String getAction();
+ public boolean isOneWay();
+ public boolean isExcluded();
+ public boolean isOperationReturningResult();
+
+ public String getResultName();
+ public String getResultTargetNamespace();
+ public String getResultPartName();
+ public boolean isResultHeader();
+
+ public String getRequestWrapperClassName();
+ public String getRequestWrapperTargetNamespace();
+ public String getRequestWrapperLocalName();
+
+ public String getResponseWrapperClassName();
+ public String getResponseWrapperTargetNamespace();
+ public String getResponseWrapperLocalName();
+
+ public String[] getParamNames();
+
+ public javax.jws.soap.SOAPBinding.ParameterStyle getSoapBindingParameterStyle();
+ public javax.jws.soap.SOAPBinding.Style getSoapBindingStyle();
+ public javax.jws.soap.SOAPBinding.Use getSoapBindingUse();
-// TODO: Axis2 does not support overloaded operations, although EndpointInterfaceDescription.addOperation() does support overloading
-// of methods represented by OperationDescription classes. However, the AxisOperation contained in an OperationDescription
-// does NOT support overloaded methods.
-//
-// While overloading is not supported by WS-I, it IS supported by JAX-WS (p11).
-// Note that this requires support in Axis2; currently WSDL11ToAxisServiceBuilder.populateOperations does not
-// support overloaded methods in the WSDL; the operations are stored on AxisService as children in a HashMap with the wsdl
-// operation name as the key.
-// TODO: Need tests for all the "default" code paths in the annotation getters.
-// TODO: Need tests for each when annotation is not present where that is allowed by the spec.
-public class OperationDescription {
- private EndpointInterfaceDescription parentEndpointInterfaceDescription;
- private AxisOperation axisOperation;
- private QName operationName;
- private Method seiMethod;
- private MethodDescriptionComposite methodComposite;
- private ParameterDescription[] parameterDescriptions;
- private FaultDescription[] faultDescriptions;
-
- // ===========================================
- // ANNOTATION related information
- // ===========================================
-
- // ANNOTATION: @Oneway
- private Oneway onewayAnnotation;
- private Boolean onewayIsOneway;
-
- // ANNOTATION: @RequestWrapper
- private RequestWrapper requestWrapperAnnotation;
- private String requestWrapperTargetNamespace;
- private String requestWrapperLocalName;
- private String requestWrapperClassName;
-
- // ANNOTATION: @ResponseWrapper
- private ResponseWrapper responseWrapperAnnotation;
- private String responseWrapperLocalName;
- private String responseWrapperTargetNamespace;
- private String responseWrapperClassName;
-
- // ANNOTATION: @SOAPBinding
- // Note this is the Method-level annotation. See EndpointInterfaceDescription for the Type-level annotation
- // Also note this annotation is only allowed on methods if SOAPBinding.Style is DOCUMENT and if the method-level
- // annotation is absent, the behavior defined on the Type is used.
- // per JSR-181 MR Sec 4.7 "Annotation: javax.jws.soap.SOAPBinding" pg 28
- private SOAPBinding soapBindingAnnotation;
- // REVIEW: Should this be using the jaxws annotation values or should that be wrappered?
- private javax.jws.soap.SOAPBinding.Style soapBindingStyle;
- public static final javax.jws.soap.SOAPBinding.Style SoapBinding_Style_VALID = javax.jws.soap.SOAPBinding.Style.DOCUMENT;
- private javax.jws.soap.SOAPBinding.Use soapBindingUse;
- // Default value per JSR-181 MR Sec 4.7 "Annotation: javax.jws.soap.SOAPBinding" pg 28
- public static final javax.jws.soap.SOAPBinding.Use SOAPBinding_Use_DEFAULT = javax.jws.soap.SOAPBinding.Use.LITERAL;
- private javax.jws.soap.SOAPBinding.ParameterStyle soapBindingParameterStyle;
- // Default value per JSR-181 MR Sec 4.7 "Annotation: javax.jws.soap.SOAPBinding" pg 28
- public static final javax.jws.soap.SOAPBinding.ParameterStyle SOAPBinding_ParameterStyle_DEFAULT = javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED;
-
- // ANNOTATION: @WebMethod
- private WebMethod webMethodAnnotation;
- private String webMethodOperationName;
- // Default value per JSR-181 MR Sec 4.2, pg 17
- public static final String WebMethod_Action_DEFAULT = "";
- private String webMethodAction;
- // Default value per JSR-181 MR sec 4.2, pg 17
- public static final Boolean WebMethod_Exclude_DEFAULT = new Boolean(false);
- private Boolean webMethodExclude;
-
- // ANNOTATION: @WebParam
- private String[] webParamNames;
- private Mode[] webParamMode;
- private String[] webParamTargetNamespace;
-
-
- // ANNOTATION: @WebResult
- private WebResult webResultAnnotation;
- private String webResultName;
- private String webResultPartName;
- // Default value per JSR-181 MR Sec 4.5.1, pg 23
- public static final String WebResult_TargetNamespace_DEFAULT = "";
- private String webResultTargetNamespace;
- // Default value per JSR-181 MR sec 4.5, pg 24
- public static final Boolean WebResult_Header_DEFAULT = new Boolean(false);
- private Boolean webResultHeader;
-
- OperationDescription(Method method, EndpointInterfaceDescription parent) {
- // TODO: Look for WebMethod anno; get name and action off of it
- parentEndpointInterfaceDescription = parent;
- setSEIMethod(method);
-
-
- this.operationName = new QName(getWebMethodOperationName());
- }
-
- OperationDescription(AxisOperation operation, EndpointInterfaceDescription parent) {
- parentEndpointInterfaceDescription = parent;
- axisOperation = operation;
- this.operationName = axisOperation.getName();
- }
-
- OperationDescription(MethodDescriptionComposite mdc, EndpointInterfaceDescription parent) {
-
- parentEndpointInterfaceDescription = parent;
- methodComposite = mdc;
- this.operationName = new QName(getWebMethodOperationName());
- webMethodAnnotation = methodComposite.getWebMethodAnnot();
-
- AxisOperation axisOperation = null;
-
- try {
- if (isOneWay()) {
- axisOperation = AxisOperationFactory.getOperationDescription(WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_ONLY);
- } else {
- axisOperation = AxisOperationFactory.getOperationDescription(WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OUT);
- }
- //TODO: There are several other MEP's, such as: OUT_ONLY, IN_OPTIONAL_OUT, OUT_IN, OUT_OPTIONAL_IN, ROBUST_OUT_ONLY,
- // ROBUST_IN_ONLY
- // Determine how these MEP's should be handled, if at all
-
- } catch (Exception e) {
- AxisFault ex = new AxisFault("OperationDescription:cons - unable to build AxisOperation ");
- }
-
- if (axisOperation != null){
-
- axisOperation.setName(determineOperationQName(this.methodComposite));
- axisOperation.setSoapAction(this.getWebMethodAction());
-
-
- //TODO: Determine other axisOperation values that may need to be set
- // Currently, the following values are being set on AxisOperation in
- // ServiceBuilder.populateService which we are not setting:
- // AxisOperation.setPolicyInclude()
- // AxisOperation.setWsamappingList()
- // AxisOperation.setOutputAction()
- // AxisOperation.addFaultAction()
- // AxisOperation.setFaultMessages()
-
- // TODO: The WSMToAxisServiceBuilder sets the message receiver, not sure why this is done
- // since AxisService.addOperation does this as well by setting it to a default
- // MessageReceiver...it appears that this code is also setting it to a default
- // receiver..need to understand this
-
- /*
- String messageReceiverClass = "org.apache.axis2.rpc.receivers.RPCMessageReceiver";
- if(wsmOperation.isOneWay()){
- messageReceiverClass = "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver";
- }
- try{
- MessageReceiver msgReceiver = (MessageReceiver)Class.forName(messageReceiverClass).newInstance();
- axisOperation.setMessageReceiver(msgReceiver);
-
- }catch(Exception e){
- }
- */
-
- parameterDescriptions = createParameterDescriptions();
- faultDescriptions = createFaultDescriptions();
-
- //TODO: Need to process the other annotations that can exist, on the server side
- // and at the method level.
- // They are, as follows:
- // WebResultAnnot (181)
- // HandlerChain
- // SoapBinding (181)
- // WebServiceRefAnnot (List) (JAXWS)
- // WebServiceContextAnnot (JAXWS via injection)
- // RequestWrapper (JAXWS)
- // ResponseWrapper (JAXWS)
-
-//System.out.println("OperationDescription: Finished setting operation");
-
- }
-
- this.axisOperation = axisOperation;
- }
-
- public void setSEIMethod(Method method) {
- if (seiMethod != null) {
- // TODO: This is probably an error, but error processing logic is incorrect
- throw new UnsupportedOperationException("Can not set an SEI method once it has been set.");
- }
- else {
- seiMethod = method;
- webMethodAnnotation = seiMethod.getAnnotation(WebMethod.class);
- parameterDescriptions = createParameterDescriptions();
- faultDescriptions = createFaultDescriptions();
- }
- }
-
- public EndpointInterfaceDescription getEndpointInterfaceDescription() {
- return parentEndpointInterfaceDescription;
- }
-
- public AxisOperation getAxisOperation() {
- return axisOperation;
- }
-
- public QName getName() {
- return operationName;
- }
-
- // Java-related getters
- public String getJavaMethodName() {
- String returnString = null;
-
- if (!isDBC()) {
- if (seiMethod != null) {
- returnString = seiMethod.getName();
- }
- } else {
- if (methodComposite != null) {
- returnString = methodComposite.getMethodName();
- }
- }
-
- return returnString;
- }
-
- public String[] getJavaParameters() {
-
- ArrayList<String> returnParameters = new ArrayList<String>();
-
- if (!isDBC()) {
- if (seiMethod != null) {
- Class[] paramaters = seiMethod.getParameterTypes();
- for (Class param:paramaters) {
- returnParameters.add(param.getName());
- }
- }
-
- }
- else {
- if (methodComposite != null) {
-
- Iterator<ParameterDescriptionComposite> iter =
- methodComposite.getParameterDescriptionCompositeList().iterator();
- while (iter.hasNext()) {
- returnParameters.add(iter.next().getParameterType());
- }
- }
- }
-
- // TODO: This is different than the rest, which return null instead of an empty array
- return returnParameters.toArray(new String[0]);
- }
- /**
- * Note this will return NULL unless the operation was built via introspection on the SEI.
- * In other words, it will return null if the operation was built with WSDL.
- * @return
- */
- public Method getSEIMethod() {
- return seiMethod;
- }
-
- public MethodDescriptionComposite getMethodDescriptionComposite() {
- return methodComposite;
- }
-
- private boolean isWrappedParameters() {
- // TODO: WSDL may need to be considered in this check as well
- return getSoapBindingParameterStyle() == javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED;
- }
-
- private ParameterDescription[] createParameterDescriptions() {
-
- ArrayList<ParameterDescription> buildParameterList = new ArrayList<ParameterDescription>();
-
- if (!isDBC()) {
- Class[] parameters = seiMethod.getParameterTypes();
- Type[] paramaterTypes = seiMethod.getGenericParameterTypes();
- Annotation[][] annotations = seiMethod.getParameterAnnotations();
-
- for(int i = 0; i < parameters.length; i++) {
- ParameterDescription paramDesc = new ParameterDescription(i, parameters[i], paramaterTypes[i], annotations[i], this);
- buildParameterList.add(paramDesc);
- }
-
- } else {
- ParameterDescriptionComposite pdc = null;
- Iterator<ParameterDescriptionComposite> iter =
- methodComposite.getParameterDescriptionCompositeList().iterator();
-
- for (int i = 0; i < methodComposite.getParameterDescriptionCompositeList().size(); i++) {
- ParameterDescription paramDesc =
- new ParameterDescription ( i,
- methodComposite.getParameterDescriptionComposite(i),
- this);
- buildParameterList.add(paramDesc);
- }
- }
-
- return buildParameterList.toArray(new ParameterDescription[buildParameterList.size()]);
-
- }
-
- private FaultDescription[] createFaultDescriptions() {
-
- ArrayList<FaultDescription> buildFaultList = new ArrayList<FaultDescription>();
-
- if (!isDBC()) {
- // get exceptions this method "throws"
- Class[] webFaultClasses = seiMethod.getExceptionTypes();
-
- for(Class wfClass:webFaultClasses) {
- for (Annotation anno:wfClass.getAnnotations()) {
- if (anno.annotationType() == WebFault.class) {
- buildFaultList.add(new FaultDescription(wfClass.getCanonicalName(), ((WebFault)anno).faultBean(), (WebFault)anno, this));
- }
- }
- }
- } else {
- // TODO do I care about methodComposite like the paramDescription does?
- }
- return buildFaultList.toArray(new FaultDescription[0]);
- }
-
- // =====================================
- // ANNOTATION: WebMethod
- // =====================================
- WebMethod getWebMethod() {
- return webMethodAnnotation;
- }
-
- static QName determineOperationQName(Method javaMethod) {
- return new QName(determineOperationName(javaMethod));
- }
-
- //TODO: For now, we are overriding the above method only because it is static, these should
- //be combined at some point
- static QName determineOperationQName(MethodDescriptionComposite mdc) {
- return new QName(determineOperationName(mdc));
- }
-
- //TODO: Deprecate this after we use only DBC objects
- private static String determineOperationName(Method javaMethod) {
-
- String operationName = null;
-
- WebMethod wmAnnotation = javaMethod.getAnnotation(WebMethod.class);
- // Per JSR-181 MR Sec 4.2 "Annotation: javax.jws.WebMethod" pg 17,
- // if @WebMethod specifies and operation name, use that. Otherwise
- // default is the Java method name
- if (wmAnnotation != null && !DescriptionUtils.isEmpty(wmAnnotation.operationName())) {
- operationName = wmAnnotation.operationName();
- }
- else {
- operationName = javaMethod.getName();
- }
-
- return operationName;
- }
-
- //TODO: For now, we are overriding the above method only because it is static, these should
- //be combined at some point
- private static String determineOperationName(MethodDescriptionComposite mdc) {
- String operationName = null;
-
- WebMethod wmAnnotation = mdc.getWebMethodAnnot();
- if (wmAnnotation != null && !DescriptionUtils.isEmpty(wmAnnotation.operationName())) {
- operationName = wmAnnotation.operationName();
- }
- else {
- operationName = mdc.getMethodName();
- }
-
- return operationName;
- }
-
- public String getWebMethodOperationName() {
- if (webMethodOperationName == null) {
- if (!isDBC())
- webMethodOperationName = determineOperationName(seiMethod);
- else
- webMethodOperationName = determineOperationName(methodComposite);
- }
- return webMethodOperationName;
- }
-
- public String getWebMethodAction() {
- if (webMethodAction == null) {
- if (getWebMethod() != null && !DescriptionUtils.isEmpty(getWebMethod().action())) {
- webMethodAction = getWebMethod().action();
- }
- else {
- webMethodAction = WebMethod_Action_DEFAULT;
- }
- }
- return webMethodAction;
- }
-
- public boolean getWebMethodExclude() {
- if (webMethodExclude == null) {
- // TODO: Validation: if this attribute specified, no other elements allowed per JSR-181 MR Sec 4.2, pg 17
- // TODO: Validation: This element is not allowed on endpoint interfaces
- // Unlike the elements with a String value, if the annotation is present, exclude will always
- // return a usable value since it will default to FALSE if the element is not present.
- if (getWebMethod() != null) {
- webMethodExclude = new Boolean(getWebMethod().exclude());
- }
- else {
- webMethodExclude = WebMethod_Exclude_DEFAULT;
- }
- }
-
- return webMethodExclude.booleanValue();
- }
-
- // ==========================================
- // ANNOTATION: RequestWrapper
- // ==========================================
- RequestWrapper getRequestWrapper() {
- if (requestWrapperAnnotation == null) {
- if (!isDBC()) {
- requestWrapperAnnotation = seiMethod.getAnnotation(RequestWrapper.class);
- } else {
- requestWrapperAnnotation = methodComposite.getRequestWrapperAnnot();
- }
- }
- return requestWrapperAnnotation;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getRequestWrapperLocalName() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (requestWrapperLocalName == null) {
- if (getRequestWrapper() != null
- && !DescriptionUtils.isEmpty(getRequestWrapper().localName())) {
- requestWrapperLocalName = getRequestWrapper().localName();
- } else {
- // The default value of localName is the value of operationName as
- // defined in the WebMethod annotation. [JAX-WS Sec. 7.3, p. 80]
- requestWrapperLocalName = getWebMethodOperationName();
- }
- }
- return requestWrapperLocalName;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getRequestWrapperTargetNamespace() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (requestWrapperTargetNamespace == null) {
- if (getRequestWrapper() != null && !DescriptionUtils.isEmpty(getRequestWrapper().targetNamespace())) {
- requestWrapperTargetNamespace = getRequestWrapper().targetNamespace();
- }
- else {
- // The default value for targetNamespace is the target namespace of the SEI. [JAX-WS Sec 7.3, p. 80]
- // TODO: Implement getting the TNS from the SEI
-// requestWrapperTargetNamespace = getEndpointInterfaceDescription().getWebServiceTargetNamespace();
- throw new UnsupportedOperationException("RequestWrapper.targetNamespace default not implented yet"); }
- }
- return requestWrapperTargetNamespace;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getRequestWrapperClassName() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (requestWrapperClassName == null) {
- if (getRequestWrapper() != null && !DescriptionUtils.isEmpty(getRequestWrapper().className())) {
- requestWrapperClassName = getRequestWrapper().className();
- }
- else {
- // Not sure what the default value should be (if any). None is listed in Sec. 7.3 on p. 80 of
- // the JAX-WS spec, BUT Conformance(Using javax.xml.ws.RequestWrapper) in Sec 2.3.1.2 on p. 13
- // says the entire annotation "...MAY be omitted if all its properties would have default vaules."
- // implying there IS some sort of default. We'll try this for now:
- if (isDBC()) {
- requestWrapperClassName = this.methodComposite.getDeclaringClass();
- } else {
- Class clazz = seiMethod.getDeclaringClass();
- String packageName = clazz.getPackage().getName();
- String className = DescriptionUtils.javaMethodtoClassName(seiMethod.getName());
- requestWrapperClassName = packageName + "." + className;
- }
- }
- }
- return requestWrapperClassName;
- }
-
- // ===========================================
- // ANNOTATION: ResponseWrapper
- // ===========================================
- ResponseWrapper getResponseWrapper() {
- if (responseWrapperAnnotation == null) {
- if (!isDBC()) {
- responseWrapperAnnotation = seiMethod.getAnnotation(ResponseWrapper.class);
- } else {
- responseWrapperAnnotation = methodComposite.getResponseWrapperAnnot();
- }
- }
- return responseWrapperAnnotation;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getResponseWrapperLocalName() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (responseWrapperLocalName == null) {
- if (getResponseWrapper() != null && !DescriptionUtils.isEmpty(getResponseWrapper().localName())) {
- responseWrapperLocalName = getResponseWrapper().localName();
- }
- else {
- // The default value of localName is the value of operationName as
- // defined in the WebMethod annotation appended with "Response". [JAX-WS Sec. 7.4, p. 81]
- responseWrapperLocalName = getWebMethodOperationName() + "Response";
- }
- }
- return responseWrapperLocalName;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getResponseWrapperTargetNamespace() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (responseWrapperTargetNamespace == null) {
- if (getResponseWrapper() != null && !DescriptionUtils.isEmpty(getResponseWrapper().targetNamespace())) {
- responseWrapperTargetNamespace = getResponseWrapper().targetNamespace();
- }
- else {
- // The default value for targetNamespace is the target namespace of the SEI. [JAX-WS Sec 7.3, p. 80]
- // TODO: Implement getting the TNS from the SEI
-// responseWrapperTargetNamespace = getEndpointInterfaceDescription().getWebServiceTargetNamespace();
- throw new UnsupportedOperationException("RequestWrapper.targetNamespace default not implented yet");
- }
- }
- return responseWrapperTargetNamespace;
- }
-
- /**
- * For wrapped parameter style (based on the annotation and the WSDL), returns the
- * wrapper value. For non-wrapped (i.e. bare) parameter style, returns null.
- * @return
- */
- public String getResponseWrapperClassName() {
- if (!isWrappedParameters()) {
- // A wrapper is only meaningful for wrapped parameters
- return null;
- }
- if (responseWrapperClassName == null) {
- if (getResponseWrapper() != null && !DescriptionUtils.isEmpty(getResponseWrapper().className())) {
- responseWrapperClassName = getResponseWrapper().className();
- }
- else {
- // Not sure what the default value should be (if any). None is listed in Sec. 7.4 on p. 81 of
- // the JAX-WS spec, BUT Conformance(Using javax.xml.ws.ResponseWrapper) in Sec 2.3.1.2 on p. 13
- // says the entire annotation "...MAY be omitted if all its properties would have default vaules."
- // implying there IS some sort of default. We'll try this for now:
- if (!isDBC()) {
- Class clazz = seiMethod.getDeclaringClass();
- String packageName = clazz.getPackage().getName();
- String className = DescriptionUtils.javaMethodtoClassName(seiMethod.getName());
- responseWrapperClassName = packageName + "." + className;
- } else {
- responseWrapperClassName = methodComposite.getDeclaringClass();
- }
- }
- }
- return responseWrapperClassName;
- }
-
-
- // ===========================================
- // ANNOTATION: WebFault
- // ===========================================
-
- /*
- * TODO some of the WebFault stuff should be moved to FaultDescription
- */
-
- /*
- * TODO: this will need revisited. The problem is that a WebFault is not mapped 1:1 to an
- * OperationDescription. We should do a better job caching the information. For now, I'm
- * following the getWebParam() pattern.
- *
- * This is gonna get complicated. One other thing to consider is that a method (opdesc) may declare
- * several types of exceptions it throws
- *
- */
-
- public FaultDescription[] getFaultDescriptions() {
- return faultDescriptions;
- }
-
- public FaultDescription resolveFaultByFaultBeanName(String faultBeanName) {
- for(FaultDescription fd: faultDescriptions) {
- if (faultBeanName.equals(fd.getBeanName()))
- return fd;
- }
- return null;
- }
-
- public FaultDescription resolveFaultByExceptionName(String exceptionClassName) {
- for(FaultDescription fd: faultDescriptions) {
- if (exceptionClassName.equals(fd.getExceptionClassName()))
- return fd;
- }
- return null;
- }
-
- // ===========================================
- // ANNOTATION: WebParam
- // ===========================================
- // Note that this annotation is handled by the ParameterDescripton.
- // Methods are provided on OperationDescription as convenience methods.
- public ParameterDescription[] getParameterDescriptions() {
- return parameterDescriptions;
- }
-
- public ParameterDescription getParameterDescription(String parameterName) {
- // TODO: Validation: For BARE paramaterUse, only a single IN our INOUT paramater and a single output (either return or OUT or INOUT) is allowed
- // Per JSR-224, Sec 3.6.2.2, pg 37
- ParameterDescription matchingParamDesc = null;
- if (parameterName != null && !parameterName.equals("")) {
- for (ParameterDescription paramDesc:parameterDescriptions) {
- if (parameterName.equals(paramDesc.getWebParamName())) {
- matchingParamDesc = paramDesc;
- break;
- }
- }
- }
- return matchingParamDesc;
- }
-
- public ParameterDescription getParameterDescription(int parameterNumber) {
- return parameterDescriptions[parameterNumber];
- }
-
- public String[] getWebParamNames() {
- if (webParamNames == null) {
- ArrayList<String> buildNames = new ArrayList<String>();
- ParameterDescription[] paramDescs = getParameterDescriptions();
- for (ParameterDescription currentParamDesc:paramDescs) {
- buildNames.add(currentParamDesc.getWebParamName());
- }
- webParamNames = buildNames.toArray(new String[0]);
- }
- return webParamNames;
- }
-
- public String[] getWebParamTargetNamespaces(){
- if (webParamTargetNamespace == null) {
- ArrayList<String> buildTargetNS = new ArrayList<String>();
- ParameterDescription[] paramDescs = getParameterDescriptions();
- for (ParameterDescription currentParamDesc:paramDescs) {
- buildTargetNS.add(currentParamDesc.getWebParamTargetNamespace());
- }
- webParamTargetNamespace = buildTargetNS.toArray(new String[0]);
- }
- return webParamTargetNamespace;
- }
-
- public String getWebParamTargetNamespace(String name){
- String returnTargetNS = null;
- ParameterDescription paramDesc = getParameterDescription(name);
- if (paramDesc != null) {
- returnTargetNS = paramDesc.getWebParamTargetNamespace();
- }
- return returnTargetNS;
- }
-
-
- public Mode[] getWebParamModes(){
- if(webParamMode == null){
- ArrayList<Mode> buildModes = new ArrayList<Mode>();
- ParameterDescription[] paramDescs = getParameterDescriptions();
- for (ParameterDescription currentParamDesc:paramDescs) {
- buildModes.add(currentParamDesc.getWebParamMode());
- }
- webParamMode = buildModes.toArray(new Mode[0]);
- }
- return webParamMode;
- }
- public boolean isWebParamHeader(String name){
- ParameterDescription paramDesc = getParameterDescription(name);
- if (paramDesc != null) {
- return paramDesc.getWebParamHeader();
- }
- return false;
- }
-
- // ===========================================
- // ANNOTATION: WebResult
- // ===========================================
- WebResult getWebResult() {
- if (webResultAnnotation == null) {
- if (!isDBC()) {
- webResultAnnotation = seiMethod.getAnnotation(WebResult.class);
- } else {
- webResultAnnotation = methodComposite.getWebResultAnnot();
- }
-
- }
- return webResultAnnotation;
- }
-
- public boolean isWebResultAnnotationSpecified() {
- return getWebResult() != null;
- }
-
- public boolean isOperationReturningResult() {
- boolean isResult = false;
- if (!isOneWay()) {
- if (!isDBC()) {
- if (seiMethod.getReturnType() != Void.TYPE) {
- isResult = true;
- }
- } else {
- if (!DescriptionUtils.isEmpty(methodComposite.getReturnType()) &&
- !methodComposite.getReturnType().equals("void"))
- isResult = true;
- }
- }
- return isResult;
- }
-
- public String getWebResultName() {
- if (!isOperationReturningResult()) {
- return null;
- }
- if (webResultName == null) {
- if (getWebResult() != null && !DescriptionUtils.isEmpty(getWebResult().name())) {
- webResultName = getWebResult().name();
- }
- else if (getSoapBindingStyle() == SOAPBinding.Style.DOCUMENT
- && getSoapBindingParameterStyle() == SOAPBinding.ParameterStyle.BARE) {
- // Default for operation style DOCUMENT and paramater style BARE per JSR 181 MR Sec 4.5.1, pg 23
- webResultName = getWebMethodOperationName() + "Response";
-
- }
- else {
- // Defeault value is "return" per JSR-181 MR Sec. 4.5.1, p. 22
- webResultName = "return";
- }
- }
- return webResultName;
- }
-
- public String getWebResultPartName() {
- if (!isOperationReturningResult()) {
- return null;
- }
- if (webResultPartName == null) {
- if (getWebResult() != null && !DescriptionUtils.isEmpty(getWebResult().partName())) {
- webResultPartName = getWebResult().partName();
- }
- else {
- // Default is the WebResult.name per JSR-181 MR Sec 4.5.1, pg 23
- webResultPartName = getWebResultName();
- }
- }
- return webResultPartName;
- }
-
- public String getWebResultTargetNamespace() {
- if (!isOperationReturningResult()) {
- return null;
- }
- if (webResultTargetNamespace == null) {
- if (getWebResult() != null && !DescriptionUtils.isEmpty(getWebResult().targetNamespace())) {
- webResultTargetNamespace = getWebResult().targetNamespace();
- }
- else if (getSoapBindingStyle() == SOAPBinding.Style.DOCUMENT
- && getSoapBindingParameterStyle() == SOAPBinding.ParameterStyle.WRAPPED
- && !getWebResultHeader()) {
- // Default for operation style DOCUMENT and paramater style WRAPPED and the return value
- // does not map to a header per JSR-181 MR Sec 4.5.1, pg 23-24
- webResultTargetNamespace = WebResult_TargetNamespace_DEFAULT;
- }
- else {
- // Default is the namespace from the WebService per JSR-181 MR Sec 4.5.1, pg 23-24
- webResultTargetNamespace = getEndpointInterfaceDescription().getEndpointDescription().getWebServiceTargetNamespace();
- }
-
- }
- return webResultTargetNamespace;
- }
-
- public boolean getWebResultHeader() {
- if (!isOperationReturningResult()) {
- return false;
- }
- if (webResultHeader == null) {
- if (getWebResult() != null) {
- // Unlike the elements with a String value, if the annotation is present, exclude will always
- // return a usable value since it will default to FALSE if the element is not present.
- webResultHeader = new Boolean(getWebResult().header());
- }
- else {
- webResultHeader = WebResult_Header_DEFAULT;
- }
- }
- return webResultHeader.booleanValue();
- }
-
- // ===========================================
- // ANNOTATION: SOAPBinding
- // ===========================================
- SOAPBinding getSoapBinding() {
- // TODO: VALIDATION: Only style of DOCUMENT allowed on Method annotation; remember to check the Type's style setting also
- // JSR-181 Sec 4.7 p. 28
- if (soapBindingAnnotation == null) {
- if (!isDBC()) {
- soapBindingAnnotation = seiMethod.getAnnotation(SOAPBinding.class);
- } else {
- soapBindingAnnotation = methodComposite.getSoapBindingAnnot();
- }
- }
- return soapBindingAnnotation;
- }
-
- public javax.jws.soap.SOAPBinding.Style getSoapBindingStyle() {
- if (soapBindingStyle == null) {
- if (getSoapBinding() != null && getSoapBinding().style() != null) {
- soapBindingStyle = getSoapBinding().style();
- }
- else {
- // Per JSR-181 MR Sec 4.7, pg 28: if not specified, use the Type value.
- soapBindingStyle = getEndpointInterfaceDescription().getSoapBindingStyle();
- }
- }
- return soapBindingStyle;
- }
-
- public javax.jws.soap.SOAPBinding.Use getSoapBindingUse() {
- if (soapBindingUse == null) {
- if (getSoapBinding() != null && getSoapBinding().use() != null) {
- soapBindingUse = getSoapBinding().use();
- }
- else {
- // Per JSR-181 MR Sec 4.7, pg 28: if not specified, use the Type value.
- soapBindingUse = getEndpointInterfaceDescription().getSoapBindingUse();
- }
- }
- return soapBindingUse;
- }
-
- public javax.jws.soap.SOAPBinding.ParameterStyle getSoapBindingParameterStyle() {
- if (soapBindingParameterStyle == null) {
- if (getSoapBinding() != null && getSoapBinding().use() != null) {
- soapBindingParameterStyle = getSoapBinding().parameterStyle();
- }
- else {
- // Per JSR-181 MR Sec 4.7, pg 28: if not specified, use the Type value.
- soapBindingParameterStyle = getEndpointInterfaceDescription().getSoapBindingParameterStyle();
- }
- }
- return soapBindingParameterStyle;
- }
-
- // ===========================================
- // ANNOTATION: OneWay
- // ===========================================
- Oneway getOnewayAnnotation() {
- //TODO: Shouldn't really do it this way...if there is not Oneway annotation,
- // we will always be calling the methods to try to retrieve it, since
- // it will always be null, should consider relying on 'isOneWay'
-
- if (onewayAnnotation == null) {
- if (isDBC()) {
- if (methodComposite.isOneWay()) {
- onewayAnnotation = OneWayAnnot.createOneWayAnnotImpl();
- }
- } else
- onewayAnnotation = seiMethod.getAnnotation(Oneway.class);
- }
- return onewayAnnotation;
- }
-
- public boolean isOneWay() {
- if (onewayIsOneway == null) {
- if (getOnewayAnnotation() != null) {
- // The presence of the annotation indicates the method is oneway
- onewayIsOneway = new Boolean(true);
- }
- else {
- // If the annotation is not present, the default is this is NOT a One Way method
- onewayIsOneway = new Boolean(false);
- }
- }
- return onewayIsOneway.booleanValue();
- }
-
- private boolean isDBC() {
- if (methodComposite != null)
- return true;
- else
- return false;
- }
-}
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org