You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ba...@apache.org on 2006/11/03 02:33:03 UTC
svn commit: r470629 [3/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...
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionImpl.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionImpl.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionImpl.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,643 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.jws.soap.SOAPBinding;
+import javax.xml.namespace.QName;
+
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.jaxws.ExceptionFactory;
+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.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.BasicConfigurator;
+
+/**
+ * An EndpointInterfaceDescription corresponds to a particular SEI-based Service
+ * Implementation. It can correspond to either either a client to that impl or
+ * the actual service impl.
+ *
+ * The EndpointInterfaceDescription contains information that is relevant only
+ * to an SEI-based (aka Endpoint-based or Java-based) enpdoint; Provider-based
+ * endpoint, which are not operation based and do not have an associated SEI,
+ * will not have an an EndpointInterfaceDescription class and sub-hierachy.
+ *
+ * <pre>
+ * <b>EndpointInterfaceDescription details</b>
+ *
+ * CORRESPONDS TO: An SEI (on both Client and Server)
+ *
+ * AXIS2 DELEGATE: none
+ *
+ * CHILDREN: 1..n OperationDescription
+ *
+ * ANNOTATIONS:
+ * SOAPBinding [181]
+ *
+ * WSDL ELEMENTS:
+ * portType
+ *
+ * </pre>
+ */
+
+/*
+Java Name: SEI Class name
+
+Axis2 Delegate: none
+
+JSR-181 Annotations:
+@WebService Note this can be specified on the endpoint Impl without an SEI
+- name its the PortType Class Name, one you get with getPort() call in Service Delegate [NT]
+- targetNamespace
+- serviceName default is portType+Service. Should we use this if Service.create call does not provide/have ServiceQname?[NT]
+- wsdlLocation if no wsdl location provided the read this annotation. Should this override what is client sets?[NT]
+- endpointInterface Will not be present on interfaces (SEI), so I will use this to figure out if the client Call is Extension of Service or is SEI by looking at this annotation. [NT]
+- portName ok so JSR 181 spec I have does not have this annotation but JAXWS spec I have has this. So if ServiceDelegate.getPort() does not have port name use this annotation and derive portName [NT]
+@SOAPBinding This one is important for Proxy especially. [NT]
+- style: DOCUMENT | RPC tells me if it is doc or rpc[NT]
+- use: LITERAL | ENCODED Always literal for IBM[NT]
+- parameterStyle: BARE | WRAPPED tells me if the wsdl is wrapped or not wrapped [NT]
+@HandlerChain(file, name)
+TBD
+
+WSDL Elements
+<portType
+<binding used for operation parameter bindings below
+
+Properties available to JAXWS runtime:
+getHandlerList() returns a live List of handlers which can be modified; this MUST be cloned before being used as an actual handler chain; Note this needs to consider if any @HandlerChain annotations are in the ServiceDescription as well
+TBD
+
+ */
+class EndpointInterfaceDescriptionImpl
+implements EndpointInterfaceDescription, EndpointInterfaceDescriptionJava, EndpointInterfaceDescriptionWSDL {
+ private EndpointDescriptionImpl parentEndpointDescription;
+ private ArrayList<OperationDescription> operationDescriptions = new ArrayList<OperationDescription>();
+ // This may be an actual Service Endpoint Interface -OR- it may be a service implementation class that did not
+ // specify an @WebService.endpointInterface.
+ private Class seiClass;
+ private DescriptionBuilderComposite dbc;
+
+ //Logging setup
+ private static final Log log = LogFactory.getLog(EndpointInterfaceDescriptionImpl.class);
+
+ // ===========================================
+ // ANNOTATION related information
+ // ===========================================
+
+ // ANNOTATION: @SOAPBinding
+ // Note this is the Type-level annotation. See OperationDescription for the Method-level annotation
+ private SOAPBinding soapBindingAnnotation;
+ // TODO: Should this be using the jaxws annotation values or should that be wrappered?
+ private javax.jws.soap.SOAPBinding.Style soapBindingStyle;
+ // Default value per JSR-181 MR Sec 4.7 "Annotation: javax.jws.soap.SOAPBinding" pg 28
+ public static final javax.jws.soap.SOAPBinding.Style SOAPBinding_Style_DEFAULT = 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 soapParameterStyle;
+ // 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;
+
+ void addOperation(OperationDescription operation) {
+ operationDescriptions.add(operation);
+ }
+
+ EndpointInterfaceDescriptionImpl(Class sei, EndpointDescriptionImpl parent) {
+ seiClass = sei;
+
+ // Per JSR-181 all methods on the SEI are mapped to operations regardless
+ // of whether they include an @WebMethod annotation. That annotation may
+ // be present to customize the mapping, but is not required (p14)
+ // TODO: Testcases that do and do not include @WebMethod anno
+ for (Method method:getSEIMethods(seiClass)) {
+ OperationDescription operation = new OperationDescriptionImpl(method, this);
+ addOperation(operation);
+ }
+
+ parentEndpointDescription = parent;
+ }
+
+ /**
+ * Build from AxisService
+ * @param parent
+ */
+ EndpointInterfaceDescriptionImpl(EndpointDescriptionImpl parent) {
+ parentEndpointDescription = parent;
+
+ AxisService axisService = parentEndpointDescription.getAxisService();
+ if (axisService != null) {
+ ArrayList publishedOperations = axisService.getPublishedOperations();
+ Iterator operationsIterator = publishedOperations.iterator();
+ while (operationsIterator.hasNext()) {
+ AxisOperation axisOperation = (AxisOperation) operationsIterator.next();
+ addOperation(new OperationDescriptionImpl(axisOperation, this));
+ }
+ }
+ }
+
+ /**
+ * Build an EndpointInterfaceDescription from a DescriptionBuilderComposite
+ * @param dbc
+ * @param isClass
+ * @param parent
+ */
+ EndpointInterfaceDescriptionImpl( DescriptionBuilderComposite dbc,
+ boolean isClass,
+ EndpointDescriptionImpl parent){
+
+ parentEndpointDescription = parent;
+ this.dbc = dbc;
+
+ BasicConfigurator.configure();
+
+ //TODO: Determine if the isClass parameter is really necessary
+
+ // Per JSR-181 all methods on the SEI are mapped to operations regardless
+ // of whether they include an @WebMethod annotation. That annotation may
+ // be present to customize the mapping, but is not required (p14)
+
+ // TODO: Testcases that do and do not include @WebMethod anno
+
+ //We are processing the SEI composite
+ //For every MethodDescriptionComposite in this list, call OperationDescription
+ //constructor for it, then add this operation
+
+ //Retrieve the relevent method composites for this dbc (and those in the superclass chain)
+ Iterator<MethodDescriptionComposite> iter = retrieveReleventMethods(dbc);
+
+ if (log.isDebugEnabled())
+ log.debug("EndpointInterfaceDescriptionImpl: Finished retrieving methods");
+ MethodDescriptionComposite mdc = null;
+
+ while (iter.hasNext()) {
+ mdc = iter.next();
+
+ //TODO: Verify that this classname is truly always the wrapper class
+ mdc.setDeclaringClass(dbc.getClassName());
+ OperationDescription operation = new OperationDescriptionImpl(mdc, this);
+
+ //TODO: Do we need to worry about a null AxisOperation at this level?
+
+ //Add this AxisOperation to the AxisService
+ getEndpointDescription().getAxisService().addOperation(operation.getAxisOperation());
+
+ if (log.isDebugEnabled())
+ log.debug("EID: Just added operation= " +operation.getOperationName());
+ addOperation(operation);
+
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("EndpointInterfaceDescriptionImpl: Finished Adding operations");
+
+ //TODO: Need to process the other annotations that can exist, on the server side
+ // and at the class level.
+ // They are, as follows:
+ // HandlerChain (181)
+ // SoapBinding (181)
+ // WebServiceRefAnnot (List) (JAXWS)
+ // BindingTypeAnnot (JAXWS Sec. 7.8 -- Used to set either the AS.endpoint, or AS.SoapNSUri)
+ // WebServiceContextAnnot (JAXWS via injection)
+
+ BasicConfigurator.resetConfiguration();
+ }
+
+ private static Method[] getSEIMethods(Class sei) {
+ // Per JSR-181 all methods on the SEI are mapped to operations regardless
+ // of whether they include an @WebMethod annotation. That annotation may
+ // be present to customize the mapping, but is not required (p14)
+ Method[] seiMethods = sei.getMethods();
+ if (sei != null) {
+ for (Method method:seiMethods) {
+ if (!Modifier.isPublic(method.getModifiers())) {
+ // JSR-181 says methods must be public (p14)
+ // TODO NLS
+ ExceptionFactory.makeWebServiceException("SEI methods must be public");
+ }
+ // TODO: other validation per JSR-181
+ }
+
+ }
+ return seiMethods;
+ }
+
+ /**
+ * Update a previously created EndpointInterfaceDescription with information from an
+ * annotated SEI. This should only be necessary when the this was created with WSDL.
+ * In this case, the information from the WSDL is augmented based on the annotated SEI.
+ * @param sei
+ */
+ void updateWithSEI(Class sei) {
+ if (seiClass != null && seiClass != sei)
+ // TODO: It probably is invalid to try reset the SEI; but this isn't the right error processing
+ throw new UnsupportedOperationException("The seiClass is already set; reseting it is not supported");
+ else if (seiClass != null && seiClass == sei)
+ // We've already done the necessary updates for this SEI
+ return;
+ else if (sei != null) {
+ seiClass = sei;
+ // Update (or possibly add) the OperationDescription for each of the methods on the SEI.
+ for (Method seiMethod:getSEIMethods(seiClass)) {
+
+ if (getOperation(seiMethod) != null) {
+ // If an OpDesc already exists with this java method set on it, then the OpDesc has already
+ // been updated for this method, so skip it.
+ continue;
+ }
+ // At this point (for now at least) the operations were created with WSDL previously.
+ // If they had been created from an annotated class and no WSDL, then the seiClass would have
+ // already been set so we would have taken other branches in this if test. (Note this could
+ // change once AxisServices can be built from annotations by the ServiceDescription class).
+ // Since the operations were created from WSDL, they will not have a java method, which
+ // comes from the SEI, set on them yet.
+ //
+ // Another consideration is that currently Axis2 does not support overloaded WSDL operations.
+ // That means there will only be one OperationDesc build from WSDL. Still another consideration is
+ // that the JAXWS async methods which may exist on the SEI will NOT exist in the WSDL. An example
+ // of these methods for the WSDL operation:
+ // String echo(String)
+ // optionally generated JAX-WS SEI methods from the tooling; take note of the annotation specifying the
+ // operation name
+ // @WebMethod(operationName="echo" ...)
+ // Response<String> echoStringAsync(String)
+ // @WebMethod(operationName="echo" ...)
+ // Future<?> echoStringAsync(String, AsyncHandler)
+ //
+ // So given all the above, the code does the following based on the operation QName
+ // (which might also be the java method name; see determineOperationQName for details)
+ // (1) If an operationDesc does not exist, add it.
+ // (2) If an operationDesc does exist but does not have a java method set on it, set it
+ // (3) If an operationDesc does exist and has a java method set on it already, add a new one.
+ //
+ // TODO: May need to change when Axis2 supports overloaded WSDL operations
+ // TODO: May need to change when ServiceDescription can build an AxisService from annotations
+
+ // Get the QName for this java method and then update (or add) the appropriate OperationDescription
+ // See comments below for imporant notes about the current implementation.
+ // NOTE ON OVERLOADED OPERATIONS
+ // Axis2 does NOT currently support overloading WSDL operations.
+ QName seiOperationQName = OperationDescriptionImpl.determineOperationQName(seiMethod);
+ OperationDescription[] updateOpDesc = getOperation(seiOperationQName);
+ if (updateOpDesc == null || updateOpDesc.length == 0) {
+ // This operation wasn't defined in the WSDL. Note that the JAX-WS async methods
+ // which are defined on the SEI are not defined as operations in the WSDL.
+ // Although they usually specific the same OperationName as the WSDL operation,
+ // there may be cases where they do not.
+ // TODO: Is this path an error path, or can the async methods specify different operation names than the
+ // WSDL operation?
+ OperationDescription operation = new OperationDescriptionImpl(seiMethod, this);
+ addOperation(operation);
+ }
+ else {
+ // Currently Axis2 does not support overloaded operations. That means that even if the WSDL
+ // defined overloaded operations, there would still only be a single AxisOperation, and it
+ // would be the last operation encounterd.
+ // HOWEVER the generated JAX-WS async methods (see above) may (will always?) have the same
+ // operation name and so will come down this path; they need to be added.
+ // TODO: When Axis2 starts supporting overloaded operations, then this logic will need to be changed
+ // TODO: Should we verify that these are the async methods before adding them, and treat it as an error otherwise?
+
+ // Loop through all the opdescs; if one doesn't currently have a java method set, set it
+ // If all have java methods set, then add a new one. Assume we'll need to add a new one.
+ boolean addOpDesc = true;
+ for (OperationDescription checkOpDesc:updateOpDesc) {
+ if (checkOpDesc.getSEIMethod() == null) {
+ // TODO: Should this be checking (somehow) that the signature matches? Probably not an issue until overloaded WSDL ops are supported.
+ ((OperationDescriptionImpl) checkOpDesc).setSEIMethod(seiMethod);
+ addOpDesc = false;
+ break;
+ }
+ }
+ if (addOpDesc) {
+ OperationDescription operation = new OperationDescriptionImpl(seiMethod, this);
+ addOperation(operation);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the OperationDescriptions corresponding to a particular Java method name.
+ * Note that an array is returned because a method could be overloaded.
+ *
+ * @param javaMethodName String representing a Java Method Name
+ * @return
+ */
+ // FIXME: This is confusing; some getOperations use the QName from the WSDL or annotation; this one uses the java method name; rename this signature I think; add on that takes a String but does a QName lookup against the WSDL/Annotation
+ public OperationDescription[] getOperationForJavaMethod(String javaMethodName) {
+ if (DescriptionUtils.isEmpty(javaMethodName)) {
+ return null;
+ }
+
+ ArrayList<OperationDescription> matchingOperations = new ArrayList<OperationDescription>();
+ for (OperationDescription operation: getOperations()) {
+ if (javaMethodName.equals(operation.getJavaMethodName())) {
+ matchingOperations.add(operation);
+ }
+ }
+
+ if (matchingOperations.size() == 0)
+ return null;
+ else
+ return matchingOperations.toArray(new OperationDescription[0]);
+ }
+
+ /**
+ * Return the OperationDesription (only one) corresponding to the OperationName passed in.
+ * @param operationName
+ * @return
+ */
+ public OperationDescription getOperation(String operationName) {
+ if (DescriptionUtils.isEmpty(operationName)) {
+ return null;
+ }
+
+ OperationDescription matchingOperation = null;
+ for (OperationDescription operation:getOperations()) {
+ if (operationName.equals(operation.getOperationName())) {
+ matchingOperation = operation;
+ break;
+ }
+ }
+ return matchingOperation;
+ }
+
+ public OperationDescription[] getOperations() {
+ return operationDescriptions.toArray(new OperationDescription[0]);
+ }
+
+ EndpointDescriptionImpl getEndpointDescriptionImpl() {
+ return (EndpointDescriptionImpl) parentEndpointDescription;
+ }
+ public EndpointDescription getEndpointDescription() {
+ return parentEndpointDescription;
+ }
+
+ /**
+ * Return an array of Operations given an operation QName. Note that an array is returned
+ * since a WSDL operation may be overloaded per JAX-WS.
+ * @param operationQName
+ * @return
+ */
+ public OperationDescription[] getOperation(QName operationQName) {
+ OperationDescription[] returnOperations = null;
+ if (!DescriptionUtils.isEmpty(operationQName)) {
+ ArrayList<OperationDescription> matchingOperations = new ArrayList<OperationDescription>();
+ OperationDescription[] allOperations = getOperations();
+ for (OperationDescription operation:allOperations) {
+ if (operation.getName().equals(operationQName)) {
+ matchingOperations.add(operation);
+ }
+ }
+ // Only return an array if there's anything in it
+ if (matchingOperations.size() > 0) {
+ returnOperations = matchingOperations.toArray(new OperationDescription[0]);
+ }
+ }
+ return returnOperations;
+ }
+
+ /**
+ * Return an OperationDescription for the corresponding SEI method. Note that this ONLY works
+ * if the OperationDescriptions were created from introspecting an SEI. If the were created with a WSDL
+ * then use the getOperation(QName) method, which can return > 1 operation.
+ * @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
+ // ========================================
+ SOAPBinding getSoapBinding(){
+ // 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() {
+ // TODO: (JLB) Implement WSDL/Anno merge
+ return getAnnoSoapBindingStyle();
+ }
+
+ public javax.jws.soap.SOAPBinding.Style getAnnoSoapBindingStyle() {
+ if (soapBindingStyle == null) {
+ if (getSoapBinding() != null && getSoapBinding().style() != null) {
+ soapBindingStyle = getSoapBinding().style();
+ }
+ else {
+ soapBindingStyle = SOAPBinding_Style_DEFAULT;
+ }
+ }
+ return soapBindingStyle;
+ }
+
+ public javax.jws.soap.SOAPBinding.Use getSoapBindingUse() {
+ // TODO: (JLB) Implement WSDL/Anno merge
+ return getAnnoSoapBindingUse();
+ }
+
+ public javax.jws.soap.SOAPBinding.Use getAnnoSoapBindingUse() {
+ if (soapBindingUse == null) {
+ if (getSoapBinding() != null && getSoapBinding().use() != null) {
+ soapBindingUse = getSoapBinding().use();
+ }
+ else {
+ soapBindingUse = SOAPBinding_Use_DEFAULT;
+ }
+ }
+ return soapBindingUse;
+ }
+
+ public javax.jws.soap.SOAPBinding.ParameterStyle getSoapBindingParameterStyle(){
+ // TODO: (JLB) Implement WSDL/Anno merge
+ return getAnnoSoapBindingParameterStyle();
+ }
+ public javax.jws.soap.SOAPBinding.ParameterStyle getAnnoSoapBindingParameterStyle() {
+ if (soapParameterStyle == null) {
+ if (getSoapBinding() != null && getSoapBinding().parameterStyle() != null) {
+ soapParameterStyle = getSoapBinding().parameterStyle();
+ }
+ else {
+ soapParameterStyle = SOAPBinding_ParameterStyle_DEFAULT;
+ }
+ }
+ return soapParameterStyle;
+ }
+
+ 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 = retrieveSEIMethods(dbc);
+
+ //Now gather methods off the chain of superclasses, if any
+ DescriptionBuilderComposite tempDBC = dbc;
+ while (!DescriptionUtils.isEmpty(tempDBC.getSuperClassName())) {
+ DescriptionBuilderComposite superDBC =
+ getEndpointDescriptionImpl().getServiceDescriptionImpl().getDBCMap().get(tempDBC.getSuperClassName());
+ retrieveList.addAll(retrieveSEIMethods(superDBC));
+ tempDBC = superDBC;
+ }
+
+ } 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)) {
+ retrieveList.add(mdc);
+ }
+ }
+ }
+ tempDBC = superDBC;
+ } //Done with implied SEI's superclasses
+
+ }//Done with implied SEI's
+
+ return retrieveList.iterator();
+ }
+
+ private ArrayList<MethodDescriptionComposite> retrieveImplicitSEIMethods(DescriptionBuilderComposite dbc) {
+
+ 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 (retrieveList == null) {
+ Iterator<MethodDescriptionComposite> iter = dbc.getMethodDescriptionsList().iterator();
+
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+
+ if (!DescriptionUtils.isExcludeTrue(mdc)) {
+ retrieveList.add(mdc);
+ }
+ }
+ }
+
+ return retrieveList;
+ }
+
+ private ArrayList<MethodDescriptionComposite> retrieveSEIMethods(DescriptionBuilderComposite dbc) {
+
+ //Rules for retrieving Methods on an SEI (or a superclass of an SEI) are simple
+ //Just retrieve all methods regardless of WebMethod annotations
+ ArrayList<MethodDescriptionComposite> retrieveList = new ArrayList<MethodDescriptionComposite>();
+
+ Iterator<MethodDescriptionComposite> iter = dbc.getMethodDescriptionsList().iterator();
+
+ while (iter.hasNext()) {
+ MethodDescriptionComposite mdc = iter.next();
+ retrieveList.add(mdc);
+ }
+
+ return retrieveList;
+ }
+
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionJava.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionJava.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionJava.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionJava.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,26 @@
+/*
+* 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;
+
+public interface EndpointInterfaceDescriptionJava {
+ public abstract javax.jws.soap.SOAPBinding.ParameterStyle getAnnoSoapBindingParameterStyle();
+ public abstract javax.jws.soap.SOAPBinding.Style getAnnoSoapBindingStyle();
+ public abstract javax.jws.soap.SOAPBinding.Use getAnnoSoapBindingUse();
+
+}
\ No newline at end of file
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionWSDL.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionWSDL.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionWSDL.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/EndpointInterfaceDescriptionWSDL.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,23 @@
+/*
+* 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;
+
+public interface EndpointInterfaceDescriptionWSDL {
+
+}
\ No newline at end of file
Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescription.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescription.java?view=diff&rev=470629&r1=470628&r2=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescription.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescription.java Thu Nov 2 17:33:00 2006
@@ -18,61 +18,9 @@
package org.apache.axis2.jaxws.description;
-import javax.xml.ws.WebFault;
-
-/**
- * A FaultDescription corresponds to a fault that can be thrown from an operation. NOTE this it not
- * implemented yet!
- *
- * FaultDescriptons 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: An exception thrown by an operation on an SEI (on both Client and Server)
- *
- * AXIS2 DELEGATE: None
- *
- * CHILDREN: None
- *
- * ANNOTATIONS:
- * WebFault [224]
- *
- * WSDL ELEMENTS:
- * fault message
- *
- * </pre>
- */
-// TODO: This class is not implemented yet or used from OperationDescription
-public class FaultDescription {
+public interface FaultDescription {
+ public OperationDescription getOperationDescription();
+ public String getBeanName();
+ public String getExceptionClassName();
- private String exceptionClassName;
- private String beanName;
- private WebFault annotation;
- private OperationDescription parent;
-
- public FaultDescription(String exceptionClassName, String beanName, WebFault annotation, OperationDescription parent) {
- this.exceptionClassName = exceptionClassName;
- this.beanName = beanName;
- this.annotation = annotation;
- this.parent = parent;
- }
-
- public WebFault getAnnotation() {
- return annotation;
- }
-
- public String getBeanName() {
- return beanName;
- }
-
- public String getExceptionClassName() {
- return exceptionClassName;
- }
-
- public OperationDescription getParent() {
- return parent;
- }
-
-}
+}
\ No newline at end of file
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionImpl.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionImpl.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionImpl.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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;
+
+import javax.xml.ws.WebFault;
+
+/**
+ * A FaultDescription corresponds to a fault that can be thrown from an operation. NOTE this it not
+ * implemented yet!
+ *
+ * FaultDescriptons 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: An exception thrown by an operation on an SEI (on both Client and Server)
+ *
+ * AXIS2 DELEGATE: None
+ *
+ * CHILDREN: None
+ *
+ * ANNOTATIONS:
+ * WebFault [224]
+ *
+ * WSDL ELEMENTS:
+ * fault message
+ *
+ * </pre>
+ */
+// TODO: This class is not implemented yet or used from OperationDescription
+class FaultDescriptionImpl implements FaultDescription, FaultDescriptionJava, FaultDescriptionWSDL {
+
+ private String exceptionClassName;
+ private String beanName;
+ private WebFault annotation;
+ private OperationDescription parent;
+
+ public FaultDescriptionImpl(String exceptionClassName, String beanName, WebFault annotation, OperationDescription parent) {
+ this.exceptionClassName = exceptionClassName;
+ this.beanName = beanName;
+ this.annotation = annotation;
+ this.parent = parent;
+ }
+
+ public WebFault getAnnoWebFault() {
+ return annotation;
+ }
+
+ public String getBeanName() {
+ return beanName;
+ }
+
+ public String getExceptionClassName() {
+ return exceptionClassName;
+ }
+
+ public OperationDescription getOperationDescription() {
+ return parent;
+ }
+
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionJava.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionJava.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionJava.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionJava.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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;
+
+import javax.xml.ws.WebFault;
+
+public interface FaultDescriptionJava {
+ public WebFault getAnnoWebFault();
+
+}
\ No newline at end of file
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionWSDL.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionWSDL.java?view=auto&rev=470629
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionWSDL.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/FaultDescriptionWSDL.java Thu Nov 2 17:33:00 2006
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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;
+
+public interface FaultDescriptionWSDL {
+
+}
\ 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