Return-Path: Delivered-To: apmail-ws-axis-dev-archive@www.apache.org Received: (qmail 65124 invoked from network); 26 Apr 2007 05:20:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 26 Apr 2007 05:20:51 -0000 Received: (qmail 63201 invoked by uid 500); 26 Apr 2007 05:20:51 -0000 Delivered-To: apmail-ws-axis-dev-archive@ws.apache.org Received: (qmail 62962 invoked by uid 500); 26 Apr 2007 05:20:50 -0000 Mailing-List: contact axis-cvs-help@ws.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list axis-cvs@ws.apache.org Received: (qmail 62805 invoked by uid 500); 26 Apr 2007 05:20:49 -0000 Delivered-To: apmail-ws-axis2-cvs@ws.apache.org Received: (qmail 62799 invoked by uid 99); 26 Apr 2007 05:20:49 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Apr 2007 22:20:49 -0700 X-ASF-Spam-Status: No, hits=-98.6 required=10.0 tests=ALL_TRUSTED,INFO_TLD,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Apr 2007 22:20:29 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 8A82F1A9864; Wed, 25 Apr 2007 22:19:44 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r532615 [12/13] - in /webservices/axis2/branches/java/1_2/modules: jaxws-api/src/javax/xml/ws/handler/soap/ jaxws-api/src/javax/xml/ws/soap/ jaxws/ jaxws/src/org/apache/axis2/jaxws/ jaxws/src/org/apache/axis2/jaxws/binding/ jaxws/src/org/ap... Date: Thu, 26 Apr 2007 05:19:33 -0000 To: axis2-cvs@ws.apache.org From: dims@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070426051944.8A82F1A9864@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl.java Wed Apr 25 22:19:23 2007 @@ -43,6 +43,7 @@ import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType; import org.apache.axis2.jaxws.i18n.Messages; import org.apache.axis2.jaxws.util.WSDL4JWrapper; +import org.apache.axis2.jaxws.util.WSDLWrapper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -296,85 +297,126 @@ buildDescriptionHierachy(); WsdlComposite wsdlComposite = null; + + String bindingType = getBindingType(); + boolean isSOAP12 = (bindingType.equals( javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) + || bindingType.equals(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_MTOM_BINDING)) + ? true : false; //Determine if we need to generate WSDL - //Assumption is that WSDL will be generated only when the composite does not contain a - //Wsdl Definition - if ( - (isEndpointBased() && - DescriptionUtils.isEmpty(getAnnoWebServiceEndpointInterface())) - || - (!isEndpointBased()) - ) { - //This is either an implicit SEI, or a WebService Provider - - wsdlComposite = generateWSDL(composite); - - } else if (isEndpointBased()) { - //This impl class specifies an SEI...this is a special case. There is a bug - //in the tooling that allows for the wsdllocation to be specifed on either the - //impl. class, or the SEI, or both. So, we need to look for the wsdl as follows: - // 1. If the Wsdl exists on the SEI, then check for it on the impl. - // 2. If it is not found in either location, in that order, then generate - - DescriptionBuilderComposite seic = - getServiceDescriptionImpl().getDBCMap() - .get(composite.getWebServiceAnnot().endpointInterface()); - - //Only generate WSDL if a definition doesn't already exist - if (seic.getWsdlDefinition() == null) + //First, make sure that this is not a SOAP 1.2 based binding, per JAXWS spec. we cannot + //generate WSDL if the binding type is SOAP 1.2 based. + //Then, assuming the composite does not contain a + //Wsdl Definition, go ahead and generate it + // REVIEW: I think this should this be isSOAP11 so the generators are only called for + // SOAP11; i.e. NOT for SOAP12 or XML/HTTP bindings. + if (!isSOAP12) { + if ( + (isEndpointBased() && + DescriptionUtils.isEmpty(getAnnoWebServiceEndpointInterface())) + || + (!isEndpointBased()) + ) { + //This is either an implicit SEI, or a WebService Provider + wsdlComposite = generateWSDL(composite); + + } else if (isEndpointBased()) { + //This impl class specifies an SEI...this is a special case. There is a bug + //in the tooling that allows for the wsdllocation to be specifed on either the + //impl. class, or the SEI, or both. So, we need to look for the wsdl as follows: + // 1. If the Wsdl exists on the SEI, then check for it on the impl. + // 2. If it is not found in either location, in that order, then generate + + DescriptionBuilderComposite seic = + getServiceDescriptionImpl().getDBCMap() + .get(composite.getWebServiceAnnot().endpointInterface()); + + //Only generate WSDL if a definition doesn't already exist + if (seic.getWsdlDefinition() == null) + wsdlComposite = generateWSDL(composite); + } + + } else if (composite.getWsdlDefinition() == null) { + //This is a SOAP12 binding that does not contain a WSDL definition, log a WARNING + log.warn("This implementation does not contain a WSDL definition and uses a SOAP 1.2 based binding. " + + "Per JAXWS spec. - a WSDL definition cannot be generated for this implementation. Name: " + + composite.getClassName()); } - //Store the WsdlComposite only if it was created - if (wsdlComposite != null) { + if (!isSOAP12) { + + //Save the WSDL Location and the WsdlDefinition, value depends on whether wsdl was generated + Parameter wsdlLocationParameter = new Parameter(); + wsdlLocationParameter.setName(MDQConstants.WSDL_LOCATION); + + Parameter wsdlDefParameter = new Parameter(); + wsdlDefParameter.setName(MDQConstants.WSDL_DEFINITION); + Parameter wsdlCompositeParameter = new Parameter(); wsdlCompositeParameter.setName(MDQConstants.WSDL_COMPOSITE); - wsdlCompositeParameter.setValue(wsdlComposite); - + + if (wsdlComposite != null) { + + //We have a wsdl composite, so set these values for the generated wsdl + wsdlCompositeParameter.setValue(wsdlComposite); + wsdlLocationParameter.setValue(wsdlComposite.getWsdlFileName()); + wsdlDefParameter.setValue( + getServiceDescriptionImpl().getGeneratedWsdlWrapper().getDefinition()); + } else if (getServiceDescriptionImpl().getWSDLWrapper() != null) { + //No wsdl composite because wsdl already exists + wsdlLocationParameter.setValue(getAnnoWebServiceWSDLLocation()); + wsdlDefParameter.setValue(getServiceDescriptionImpl().getWSDLWrapper().getDefinition()); + } else { + //There is no wsdl composite and there is NOT a wsdl definition + wsdlLocationParameter.setValue(null); + wsdlDefParameter.setValue(null); + + } + try { - axisService.addParameter(wsdlCompositeParameter); + if (wsdlComposite != null) { + axisService.addParameter(wsdlCompositeParameter); + } + axisService.addParameter(wsdlDefParameter); + axisService.addParameter(wsdlLocationParameter); } catch (Exception e) { throw ExceptionFactory.makeWebServiceException( - "EndpointDescription: Unable to add wsdlComposite parm. to AxisService"); + "EndpointDescription: Unable to add parameters to AxisService"); } } + else { + // Need to account for SOAP 1.2 WSDL when supplied with application + Parameter wsdlDefParameter = new Parameter(); + wsdlDefParameter.setName(MDQConstants.WSDL_DEFINITION); + Parameter wsdlLocationParameter = new Parameter(); + wsdlLocationParameter.setName(MDQConstants.WSDL_LOCATION); + if (getServiceDescriptionImpl().getWSDLWrapper() != null) { + wsdlLocationParameter.setValue(getAnnoWebServiceWSDLLocation()); + wsdlDefParameter.setValue(getServiceDescriptionImpl().getWSDLWrapper() + .getDefinition()); + } + // No WSDL supplied and we do not generate for non-SOAP 1.1/HTTP + // endpoints + else { + wsdlLocationParameter.setValue(null); + wsdlDefParameter.setValue(null); + } + try { + axisService.addParameter(wsdlDefParameter); + axisService.addParameter(wsdlLocationParameter); - //Save the WSDL Location and the WsdlDefinition, value depends on whether wsdl was generated - Parameter wsdlLocationParameter = new Parameter(); - wsdlLocationParameter.setName(MDQConstants.WSDL_LOCATION); - - Parameter wsdlDefParameter = new Parameter(); - wsdlDefParameter.setName(MDQConstants.WSDL_DEFINITION); - - if (wsdlComposite != null) { - - wsdlLocationParameter.setValue(wsdlComposite.getWsdlFileName()); - wsdlDefParameter.setValue( - getServiceDescriptionImpl().getGeneratedWsdlWrapper().getDefinition()); - } else if (getServiceDescriptionImpl().getWSDLWrapper() != null) { - - wsdlLocationParameter.setValue(getAnnoWebServiceWSDLLocation()); - wsdlDefParameter.setValue(getServiceDescriptionImpl().getWSDLWrapper().getDefinition()); - } else { - wsdlLocationParameter.setValue(null); - wsdlDefParameter.setValue(null); - - } - - try { - axisService.addParameter(wsdlDefParameter); - axisService.addParameter(wsdlLocationParameter); - } catch (Exception e) { - throw ExceptionFactory.makeWebServiceException( - "EndpointDescription: Unable to add parms. to AxisService"); + } catch (Exception e) { + throw ExceptionFactory + .makeWebServiceException("EndpointDescription: Unable to add parameters to AxisService"); + } } } /** - * Create from an annotated implementation or SEI class. Note this is currently used only on the - * server-side (this probably won't change). - * + * Create from an annotated implementation or SEI class. Note this is + * currently used only on the server-side (this probably won't change). + * * @param theClass An implemntation or SEI class * @param portName May be null; if so the annotation is used * @param parent @@ -711,12 +753,16 @@ // Note that the axis service builder takes only the localpart of the port qname. // TODO:: This should check that the namespace of the definition matches the namespace of the portQName per JAXRPC spec + WSDLWrapper wrapper = getServiceDescriptionImpl().getWSDLWrapper(); WSDL11ToAxisServiceBuilder serviceBuilder = new WSDL11ToAxisServiceBuilder( - getServiceDescriptionImpl().getWSDLWrapper().getDefinition(), + wrapper.getDefinition(), getServiceDescription().getServiceQName(), getPortQName().getLocalPart()); + //TODO: Temporary, please change the following log.info to log.debug + log.info("Building AxisService from wsdl: " + wrapper.getWSDLLocation()); + if (getServiceDescriptionImpl().isDBCMap()) { //this.class.getClass().getClassLoader(); URIResolverImpl uriResolver = @@ -1198,7 +1244,7 @@ * @return HandlerChainsType This is the top-level element for the Handler configuration file */ public HandlerChainsType getHandlerChain() { - // TODO: This needs to work for DBC or class + if (handlerChainsType == null) { getAnnoHandlerChainAnnotation(); if (handlerChainAnnotation != null) { @@ -1206,7 +1252,7 @@ // TODO RAS & NLS if (log.isDebugEnabled()) { - log.debug("EndpointDescriptionImpl.getHandlerList: fileName: " + log.debug("EndpointDescriptionImpl.getHandlerChain: fileName: " + handlerFileName + " className: " + composite.getClassName()); @@ -1223,21 +1269,25 @@ className, classLoader); - try { - // All the classes we need should be part of this package - JAXBContext jc = JAXBContext - .newInstance("org.apache.axis2.jaxws.description.xml.handler", - this.getClass().getClassLoader()); - - Unmarshaller u = jc.createUnmarshaller(); - - JAXBElement o = (JAXBElement)u.unmarshal(is); - handlerChainsType = (HandlerChainsType)o.getValue(); - - } catch (Exception e) { - throw ExceptionFactory - .makeWebServiceException( - "EndpointDescriptionImpl: getHandlerList: thrown when attempting to unmarshall JAXB content"); + if(is == null) { + log.warn("Unable to load handlers from file: " + handlerFileName); + } else { + try { + // All the classes we need should be part of this package + JAXBContext jc = JAXBContext + .newInstance("org.apache.axis2.jaxws.description.xml.handler", + this.getClass().getClassLoader()); + + Unmarshaller u = jc.createUnmarshaller(); + + JAXBElement o = (JAXBElement)u.unmarshal(is); + handlerChainsType = (HandlerChainsType)o.getValue(); + + } catch (Exception e) { + throw ExceptionFactory + .makeWebServiceException( + "EndpointDescriptionImpl: getHandlerList: thrown when attempting to unmarshall JAXB content"); + } } } } @@ -1247,7 +1297,31 @@ public HandlerChain getAnnoHandlerChainAnnotation() { if (this.handlerChainAnnotation == null) { if (getServiceDescriptionImpl().isDBCMap()) { + /* + * Per JSR-181 The @HandlerChain annotation MAY be present on + * the endpoint interface and service implementation bean. The + * service implementations bean's @HandlerChain is used if + * @HandlerChain is present on both. So, if we do find the + * annotation on this impl, then don't worry about else + * Otherwise, check to see if the SEI might be annotated with + * @HandlerChain + */ + handlerChainAnnotation = composite.getHandlerChainAnnot(); + if (handlerChainAnnotation == null) { + + // If this is NOT an implicit SEI, then check for the + // annotation on the SEI + if (!DescriptionUtils.isEmpty(getAnnoWebServiceEndpointInterface())) { + + DescriptionBuilderComposite seic = getServiceDescriptionImpl().getDBCMap() + .get(composite.getWebServiceAnnot().endpointInterface()); + if (seic != null) { + handlerChainAnnotation = seic.getHandlerChainAnnot(); + } + // TODO else clause for if to throw exception when seic == null + } + } } else { if (implOrSEIClass != null) { handlerChainAnnotation = @@ -1258,20 +1332,7 @@ return handlerChainAnnotation; } - - /* - * Returns a live list describing the handlers on this port. - * TODO: This is currently returning List, but it should return a HandlerDescritpion - * object that can represent a handler description from various Metadata (annotation, deployment descriptors, etc); - * use JAX-WS Appendix B Handler Chain Configuration File Schema as a starting point for HandlerDescription. - * - * @return A List of handlers for this port. The actual list is returned, and therefore can be modified. - public List getHandlerList() { - return handlerList; - } - */ - private Definition getWSDLDefinition() { return ((ServiceDescriptionWSDL)getServiceDescription()).getWSDLDefinition(); } Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/EndpointInterfaceDescriptionImpl.java Wed Apr 25 22:19:23 2007 @@ -319,9 +319,14 @@ 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; + + //Make sure that this is not one of the 'async' methods associated with + //this operation. If it is, let it be created as its own opDesc. + if (!DescriptionUtils.isAsync(seiMethod)) { + ((OperationDescriptionImpl) checkOpDesc).setSEIMethod(seiMethod); + addOpDesc = false; + break; + } } } if (addOpDesc) { @@ -440,6 +445,26 @@ } return returnOperations; } + /* (non-Javadoc) + * @see org.apache.axis2.jaxws.description.EndpointInterfaceDescription#getDispatchableOperations() + */ + public OperationDescription[] getDispatchableOperations() { + OperationDescription[] returnOperations = null; + OperationDescription[] allMatchingOperations = getOperations(); + if (allMatchingOperations != null && allMatchingOperations.length > 0) { + ArrayList dispatchableOperations = new ArrayList(); + for (OperationDescription operation : allMatchingOperations) { + if (!operation.isJAXWSAsyncClientMethod()) { + dispatchableOperations.add(operation); + } + } + + if (dispatchableOperations.size() > 0) { + returnOperations = dispatchableOperations.toArray(new OperationDescription[0]); + } + } + return returnOperations; + } /** * Return an OperationDescription for the corresponding SEI method. Note that this ONLY works @@ -844,7 +869,9 @@ if (wsdlDefn != null) { String tns = getEndpointDescription().getTargetNamespace(); String localPart = getEndpointDescription().getName(); - portType = wsdlDefn.getPortType(new QName(tns, localPart)); + if (localPart != null) { + portType = wsdlDefn.getPortType(new QName(tns, localPart)); + } } return portType; } Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java Wed Apr 25 22:19:23 2007 @@ -37,6 +37,7 @@ 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.WebParamAnnot; import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -47,6 +48,7 @@ import javax.jws.WebParam.Mode; import javax.jws.WebResult; import javax.jws.soap.SOAPBinding; +import javax.xml.bind.annotation.XmlList; import javax.xml.namespace.QName; import javax.xml.ws.AsyncHandler; import javax.xml.ws.RequestWrapper; @@ -61,6 +63,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.concurrent.Future; @@ -94,6 +97,9 @@ private Oneway onewayAnnotation; private Boolean onewayIsOneway; + // ANNOTATION: @XmlList + private boolean isListType = false; + // ANNOTATION: @RequestWrapper private RequestWrapper requestWrapperAnnotation; private String requestWrapperTargetNamespace; @@ -162,7 +168,7 @@ // TODO: Look for WebMethod anno; get name and action off of it parentEndpointInterfaceDescription = parent; setSEIMethod(method); - + checkForXmlListAnnotation(method.getAnnotations()); // The operationQName is intentionally unqualified to be consistent with the remaining parts of the system. // Using a qualified name will cause breakage. // Don't do --> this.operationQName = new QName(parent.getTargetNamespace(), getOperationName()); @@ -190,6 +196,7 @@ parameterDescriptions = createParameterDescriptions(); faultDescriptions = createFaultDescriptions(); + isListType = mdc.isListType(); //If an AxisOperation was already created for us by populateService then just use that one //Otherwise, create it @@ -261,13 +268,13 @@ // QName based on this parameter then break out of the loop. AxisMessage axisMessage = newAxisOperation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); - String partLocalName = paramDesc.getPartName(); + String elementName = paramDesc.getParameterName(); String partNamespace = paramDesc.getTargetNamespace(); if (log.isDebugEnabled()) { log.debug("Setting up annotation based Doc/Lit/Bare operation: " + newAxisOperation.getName() - + "; axisMessage: " + axisMessage + "; partLocalName: " - + partLocalName + "; partTNS: " + partNamespace); + + "; axisMessage: " + axisMessage + "; name: " + + elementName + "; partTNS: " + partNamespace); } if (axisMessage == null) { // TODO: RAS & NLS @@ -277,12 +284,16 @@ // TODO: RAS & NLS throw ExceptionFactory.makeWebServiceException( "Could not setup Doc/Lit/Bare operation because part namespace is empty"); - } else if (DescriptionUtils.isEmpty(partLocalName)) { + } else if (DescriptionUtils.isEmpty(elementName)) { // TODO: RAS & NLS throw ExceptionFactory.makeWebServiceException( - "Could not setup Doc/Lit/Bare operation because part local name is empty"); + "Could not setup Doc/Lit/Bare operation because name is empty"); } else { - QName partQName = new QName(partNamespace, partLocalName); + QName partQName = new QName(partNamespace, elementName); + if(log.isDebugEnabled()) { + log.debug("Setting AxisMessage element QName for bare mapping: " + + partQName); + } axisMessage.setElementQName(partQName); } break; @@ -346,6 +357,16 @@ } public AxisOperation getAxisOperation() { + // Note that only the sync operations, and not the JAX-WS async client versions of an + // operation, will have an AxisOperation associated with it. For those async operations, + // get the AxisOperation associated with the sync method and return that. + if (axisOperation == null) { + OperationDescription opDesc = getSyncOperation(); + if (opDesc != null && opDesc != this) { + return getSyncOperation().getAxisOperation(); + } + } + return axisOperation; } @@ -1190,7 +1211,7 @@ public javax.jws.soap.SOAPBinding.ParameterStyle getAnnoSoapBindingParameterStyle() { if (soapBindingParameterStyle == null) { - if (getAnnoSoapBinding() != null && getAnnoSoapBinding().use() != null) { + if (getAnnoSoapBinding() != null && getAnnoSoapBinding().parameterStyle() != null) { soapBindingParameterStyle = getAnnoSoapBinding().parameterStyle(); } else { // Per JSR-181 MR Sec 4.7, pg 28: if not specified, use the Type value. @@ -1488,6 +1509,18 @@ runtimeDescMap.put(ord.getKey(), ord); } + private void checkForXmlListAnnotation(Annotation[] annotations) { + for(Annotation annotation : annotations) { + if(annotation.annotationType() == XmlList.class) { + isListType = true; + } + } + } + + public boolean isListType() { + return isListType; + } + public String toString() { final String newline = "\n"; final String sameline = "; "; Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ParameterDescriptionImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ParameterDescriptionImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ParameterDescriptionImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ParameterDescriptionImpl.java Wed Apr 25 22:19:23 2007 @@ -27,6 +27,7 @@ import javax.jws.WebParam; import javax.jws.soap.SOAPBinding; +import javax.xml.bind.annotation.XmlList; import javax.xml.ws.Holder; import java.lang.annotation.Annotation; import java.lang.reflect.Array; @@ -60,7 +61,10 @@ private WebParam.Mode webParamMode; public static final Boolean WebParam_Header_DEFAULT = new Boolean(false); private Boolean webParamHeader; - + + // This boolean indicates whether or not there was an @XMLList on the parameter + private boolean isListType = false; + ParameterDescriptionImpl(int parameterNumber, Class parameterType, Type parameterGenericType, Annotation[] parameterAnnotations, OperationDescription parent) { this.parameterNumber = parameterNumber; @@ -75,6 +79,7 @@ getGenericParameterActualType((ParameterizedType)parameterGenericType); } findWebParamAnnotation(parameterAnnotations); + findXmlListAnnotation(parameterAnnotations); } ParameterDescriptionImpl(int parameterNumber, ParameterDescriptionComposite pdc, @@ -83,6 +88,7 @@ this.parameterNumber = parameterNumber; this.parentOperationDescription = parent; webParamAnnotation = pdc.getWebParamAnnot(); + this.isListType = pdc.isListType(); //TODO: Need to build the schema map. Need to add logic to add this parameter // to the schema map. @@ -107,6 +113,18 @@ } } + /** + * This method will search array of parameter annotations for the presence of the @XmlList + * annotation. + */ + private void findXmlListAnnotation(Annotation[] annotations) { + for (Annotation checkAnnotation:annotations) { + if (checkAnnotation.annotationType() == XmlList.class) { + isListType = true; + } + } + } + public OperationDescription getOperationDescription() { return parentOperationDescription; } @@ -363,5 +381,9 @@ return string.toString(); } return string.toString(); + } + + public boolean isListType() { + return isListType; } } Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java Wed Apr 25 22:19:23 2007 @@ -30,6 +30,8 @@ import org.apache.axis2.jaxws.description.ServiceRuntimeDescription; import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite; import org.apache.axis2.jaxws.description.builder.MDQConstants; +import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_FUTURE; +import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_RESPONSE; import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite; import org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposite; import org.apache.axis2.jaxws.i18n.Messages; @@ -47,6 +49,7 @@ import javax.xml.namespace.QName; import javax.xml.ws.soap.SOAPBinding; import java.io.FileNotFoundException; +import java.io.IOException; import java.net.ConnectException; import java.net.URL; import java.net.UnknownHostException; @@ -155,7 +158,12 @@ String serviceImplName = this.composite.getClassName(); this.dbcMap = dbcMap; -//TODO: How to we get this when called from server side, create here for now + //TODO: How to we get this when called from server side, create here for now + //REVIEW: The value being set here is used later in validation checking to + // validation that should occur separately on server and client. If + // at some point this constructor is ever called by the client side, + // then we'll have to get smarter about how we determine server/client + // validation this.isServerSide = true; //capture the WSDL, if there is any...to be used for later processing @@ -252,13 +260,13 @@ // This guards against the case where an addPort was done previously and now a getPort is done on it. // TODO: RAS & NLS throw ExceptionFactory.makeWebServiceException( - "ServiceDescription.updateEndpointDescription: Can not do a getPort on a port added via addPort(). PortQN: " + - portQName != null ? portQName.toString() : "not specified"); + "ServiceDescription.updateEndpointDescription: Can not do a getPort on a port added via addPort(). PortQN: " + + (portQName != null ? portQName.toString() : "not specified")); } else if (sei == null) { // TODO: RAS & NLS throw ExceptionFactory.makeWebServiceException( - "ServiceDescription.updateEndpointDescription: Can not do a getPort with a null SEI. PortQN: " + - portQName != null ? portQName.toString() : "not specified"); + "ServiceDescription.updateEndpointDescription: Can not do a getPort with a null SEI. PortQN: " + + (portQName != null ? portQName.toString() : "not specified")); } else if (endpointDescription == null) { // Use the SEI Class and its annotations to finish creating the Description hierachy: Endpoint, EndpointInterface, Operations, Parameters, etc. // TODO: Need to create the Axis Description objects after we have all the config info (i.e. from this SEI) @@ -315,10 +323,13 @@ private Class getEndpointSEI(QName portQName) { Class endpointSEI = null; - EndpointInterfaceDescription endpointInterfaceDesc = - getEndpointDescription(portQName).getEndpointInterfaceDescription(); - if (endpointInterfaceDesc != null) { - endpointSEI = endpointInterfaceDesc.getSEIClass(); + EndpointDescription endpointDesc = getEndpointDescription(portQName); + if (endpointDesc != null) { + EndpointInterfaceDescription endpointInterfaceDesc = + endpointDesc.getEndpointInterfaceDescription(); + if (endpointInterfaceDesc != null ) { + endpointSEI = endpointInterfaceDesc.getSEIClass(); + } } return endpointSEI; } @@ -489,6 +500,9 @@ throw ExceptionFactory.makeWebServiceException( Messages.getMessage("connectionRefused", e.getMessage()), e); } + catch(IOException e) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("urlStream", e.getMessage()), e); + } catch (WSDLException e) { throw ExceptionFactory.makeWebServiceException( Messages.getMessage("wsdlException", e.getMessage()), e); @@ -542,8 +556,28 @@ * @see org.apache.axis2.jaxws.description.ServiceDescription#getServiceClient(javax.xml.namespace.QName) */ public ServiceClient getServiceClient(QName portQName) { - // TODO: RAS if no portQName found - return getEndpointDescription(portQName).getServiceClient(); + ServiceClient returnServiceClient = null; + if (!DescriptionUtils.isEmpty(portQName)) { + EndpointDescription endpointDesc = getEndpointDescription(portQName); + if (endpointDesc != null) { + returnServiceClient = endpointDesc.getServiceClient(); + } + else { + // Couldn't find Endpoint Description for port QName + if (log.isDebugEnabled()) { + log.debug("Could not find portQName: " + portQName + + " under ServiceDescription: " + toString()); + } + } + } + else { + // PortQName is empty + if (log.isDebugEnabled()) { + log.debug("PortQName agrument is invalid; it can not be null or an empty string: " + portQName); + } + } + + return returnServiceClient; } /* (non-Javadoc) @@ -560,7 +594,7 @@ } - boolean isServerSide() { + public boolean isServerSide() { return isServerSide; } @@ -904,7 +938,8 @@ * compiler will take care of everything else. */ - HashMap compositeHashMap = new HashMap(); + HashMap compositeHashMap = + new HashMap(); Iterator compIterator = composite.getMethodDescriptionsList().iterator(); while (compIterator.hasNext()) { @@ -914,7 +949,8 @@ // Add methods declared in the implementation's superclass addSuperClassMethods(compositeHashMap, composite); - HashMap seiMethodHashMap = new HashMap(); + HashMap seiMethodHashMap = + new HashMap(); Iterator seiMethodIterator = seic.getMethodDescriptionsList().iterator(); while (seiMethodIterator.hasNext()) { @@ -930,18 +966,181 @@ seiMethodHashMap.values().iterator(); while (verifySEIIterator.hasNext()) { MethodDescriptionComposite mdc = verifySEIIterator.next(); - // REVIEW: Only the names are checked; this isn't checking signatures - if (compositeHashMap.get(mdc.getMethodName()) == null) { + // TODO: This does not take into consideration overloaded java methods! + MethodDescriptionComposite implMDC = compositeHashMap.get(mdc.getMethodName()); + + if (implMDC == null) { // TODO: RAS/NLS throw ExceptionFactory.makeWebServiceException( "Validation error: Implementation subclass does not implement method on specified interface. Implementation class: " + composite.getClassName() + "; missing method name: " + mdc.getMethodName() + "; endpointInterface: " + seic.getClassName()); + } else { + //At least we found it, now make sure that signatures match up + + //Check for exception and signature matching + validateMethodExceptions(mdc, implMDC, seic.getClassName()); + validateMethodReturnValue(mdc, implMDC, seic.getClassName()); + validateMethodParameters(mdc, implMDC, seic.getClassName()); } } } + private void validateMethodParameters(MethodDescriptionComposite seiMDC, + MethodDescriptionComposite implMDC, String className) { + List seiPDCList = seiMDC + .getParameterDescriptionCompositeList(); + List implPDCList = implMDC + .getParameterDescriptionCompositeList(); + if ((seiPDCList == null || seiPDCList.isEmpty()) + && (implPDCList == null || implPDCList.isEmpty())) { + // There are no parameters on the SEI or the impl; all is well + } else if ((seiPDCList == null || seiPDCList.isEmpty()) + && !(implPDCList == null || implPDCList.isEmpty())) { + String message = "Validation error: SEI indicates no parameters but implementation method specifies parameters: " + + implPDCList + + "; Implementation class: " + + composite.getClassName() + + "; Method name: " + seiMDC.getMethodName() + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + } else if ((seiPDCList != null && !seiPDCList.isEmpty()) + && !(implPDCList != null && !implPDCList.isEmpty())) { + String message = "Validation error: SEI indicates parameters " + seiPDCList + + " but implementation method specifies no parameters; Implementation class: " + + composite.getClassName() + "; Method name: " + seiMDC.getMethodName() + + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + } else if (seiPDCList.size() != implPDCList.size()) { + String message = "Validation error: The number of parameters on the SEI method (" + + seiPDCList.size() + + ") does not match the number of parameters on the implementation ( " + + implPDCList.size() + "); Implementation class: " + composite.getClassName() + + "; Method name: " + seiMDC.getMethodName() + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + + } else { + // Make sure the order and type of parameters match + // REVIEW: This checks for strict equality of the fully qualified + // type. It does not + // take into consideration object hierachy. For example foo(Animal) + // will not equal bar(Zebra) + boolean parametersMatch = true; + String failingMessage = null; + for (int paramNumber = 0; paramNumber < seiPDCList.size(); paramNumber++) { + String seiParamType = seiPDCList.get(paramNumber).getParameterType(); + String implParamType = implPDCList.get(paramNumber).getParameterType(); + if (!seiParamType.equals(implParamType)) { + parametersMatch = false; + failingMessage = "Validation error: SEI and implementation parameters do not match. Parameter number " + + paramNumber + + " on the SEI is " + + seiParamType + + "; on the implementation it is " + + implParamType + + "; Implementation class: " + + composite.getClassName() + + "; Method name: " + + seiMDC.getMethodName() + "; Endpoint Interface: " + className; + break; + } + } + if (!parametersMatch) { + throw ExceptionFactory.makeWebServiceException(failingMessage); + } + } + } + + private void validateMethodReturnValue(MethodDescriptionComposite seiMDC, + MethodDescriptionComposite implMDC, String className) { + String seiReturnValue = seiMDC.getReturnType(); + String implReturnValue = implMDC.getReturnType(); + + if (seiReturnValue == null && implReturnValue == null) { + // Neither specify a return value; all is well + } else if (seiReturnValue == null && implReturnValue != null) { + String message = "Validation error: SEI indicates no return value but implementation method specifies return value: " + + implReturnValue + + "; Implementation class: " + + composite.getClassName() + + "; Method name: " + seiMDC.getMethodName() + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + } else if (seiReturnValue != null && implReturnValue == null) { + String message = "Validation error: SEI indicates return value " + seiReturnValue + + " but implementation method specifies no return value; Implementation class: " + + composite.getClassName() + "; Method name: " + seiMDC.getMethodName() + + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + } else if (!seiReturnValue.equals(implReturnValue)) { + String message = "Validation error: SEI return value " + seiReturnValue + + " does not match implementation method return value " + implReturnValue + + "; Implementation class: " + composite.getClassName() + "; Method name: " + + seiMDC.getMethodName() + "; Endpoint Interface: " + className; + throw ExceptionFactory.makeWebServiceException(message); + } + + } + + private void validateMethodExceptions ( MethodDescriptionComposite seiMDC, + MethodDescriptionComposite implMDC, + String className) { + + String[] seiExceptions = seiMDC.getExceptions(); + String[] implExceptions = implMDC.getExceptions(); + + // An impl can choose to throw fewer checked exceptions than declared on the SEI, but not more. + // This is analagous to the Java rules for interfaces. + if (seiExceptions == null) { + if (implExceptions == null) { + return; + } else { + // SEI delcares no checked exceptions, but the implementation has checked exceptions, which is an error + throw ExceptionFactory.makeWebServiceException("Validation error: Implementation method signature has more checked exceptions than SEI method signature (0): Implementation class: " + + composite.getClassName() + + "; method name: " + seiMDC.getMethodName() + + "; endpointInterface: " + className); + } + } else if (implExceptions == null) { + // Implementation throws fewer checked exceptions than SEI, which is OK. + return; + } + + // Check the list length; An implementation can not declare more exceptions than the SEI + if (seiExceptions.length < implExceptions.length) { + throw ExceptionFactory.makeWebServiceException("Validation error: Implementation method signature has more checked exceptions (" + + implExceptions.length + ") than SEI method signature (" + + seiExceptions.length + "): Implementation class: " + + composite.getClassName() + + "; method name: " + seiMDC.getMethodName() + + "; endpointInterface: " + className); + } + + // Make sure that each checked exception declared by the + // implementation is on the SEI also + if (implExceptions.length > 0) { + for (String implException : implExceptions) { + boolean foundIt = false; + if (seiExceptions.length > 0) { + for (String seiException : seiExceptions) { + if (seiException.equals(implException)) { + foundIt = true; + break; + } + } + } + + if (!foundIt) { + throw ExceptionFactory.makeWebServiceException("Validation error: Implementation method signature throws exception " + + implException + "which is not declared on the SEI method signature: Implementation class: " + + composite.getClassName() + + "; method name: " + seiMDC.getMethodName() + + "; endpointInterface: " + className); + } + } + } + + } + /** * Adds any methods declared in superclasses to the HashMap. The hierachy starting with the DBC * will be walked up recursively, adding methods from each parent DBC encountered. @@ -1046,7 +1245,7 @@ //This will perform validation for all methods, regardless of WebMethod annotations //It is called for the SEI, and an impl. class that does not specify an endpointInterface - validateMethods(); + validateMethods(seic.getMethodDescriptionsList()); } /** @return Returns TRUE if we find just one WebMethod Annotation */ @@ -1077,10 +1276,21 @@ } - /** - */ - private void validateMethods() { - //TODO: Fill this out to validate all MethodDescriptionComposite (and their inclusive + private void validateMethods(List mdcList) { + if (mdcList != null && !mdcList.isEmpty()) { + for (MethodDescriptionComposite mdc : mdcList) { + String returnType = mdc.getReturnType(); + if (returnType != null + && (returnType.equals(RETURN_TYPE_FUTURE) || returnType + .equals(RETURN_TYPE_RESPONSE))) { + throw ExceptionFactory.makeWebServiceException(Messages + .getMessage("serverSideAsync", mdc.getDeclaringClass(), mdc + .getMethodName())); + } + } + } + // TODO: Fill this out to validate all MethodDescriptionComposite (and + // their inclusive // annotations on this SEI (SEI is assumed here) //check oneway // @@ -1173,8 +1383,8 @@ // Go through the list of Endpoints that have been created and add any // not already in the list. This will include ports added to the Service // via getPort(...) and addPort(...) - EndpointDescription[] endpointDescArray = getEndpointDescriptions(); - for (EndpointDescription endpointDesc : endpointDescArray) { + Collection endpointDescs = getEndpointDescriptions_AsCollection(); + for (EndpointDescription endpointDesc : endpointDescs) { QName endpointPortQName = endpointDesc.getPortQName(); if (!portList.contains(endpointPortQName)) { portList.add(endpointPortQName); @@ -1272,11 +1482,12 @@ // string.append("ConfigurationContext: " + getAxisConfigContext()); // EndpointDescriptions string.append(newline); - EndpointDescription[] endpointDescs = getEndpointDescriptions(); + Collection endpointDescs = getEndpointDescriptions_AsCollection(); if (endpointDescs == null) { string.append("EndpointDescription array is null"); - } else { - string.append("Number of EndpointDescrptions: " + endpointDescs.length); + } + else { + string.append("Number of EndpointDescrptions: " + endpointDescs.size()); string.append(newline); for (EndpointDescription endpointDesc : endpointDescs) { string.append(endpointDesc.toString()); Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/URIResolverImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/URIResolverImpl.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/URIResolverImpl.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/impl/URIResolverImpl.java Wed Apr 25 22:19:23 2007 @@ -20,6 +20,8 @@ import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.axis2.jaxws.i18n.Messages; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.ws.commons.schema.resolver.URIResolver; import org.xml.sax.InputSource; @@ -38,7 +40,11 @@ private final String FILE_PROTOCOL = "file"; + private final String JAR_PROTOCOL = "jar"; + private ClassLoader classLoader; + + private static final Log log = LogFactory.getLog(URIResolverImpl.class); public URIResolverImpl() { } @@ -49,35 +55,61 @@ public InputSource resolveEntity(String namespace, String schemaLocation, String baseUri) { - + //TODO: Temporary, please change the following log.info to log.debug + log.info("resolveEntity: ["+ namespace + "]["+ schemaLocation + "][ " + baseUri+ "]"); + InputStream is = null; URI pathURI = null; + String pathURIStr = null; + if(log.isDebugEnabled()) { + log.debug("Import location: " + schemaLocation + " parent document: " + + baseUri); + } if (baseUri != null) { try { // if the location is an absolute path, build a URL directly // from it if (isAbsolute(schemaLocation)) { + if(log.isDebugEnabled()) { + log.debug("Retrieving input stream for absolute schema location: " + + schemaLocation); + } is = getInputStreamForURI(schemaLocation); } - // Try baseURI + relavtive schema path combo else { pathURI = new URI(baseUri); - String pathURIStr = schemaLocation; + pathURIStr = schemaLocation; // If this is absolute we need to resolve the path without the // scheme information if (pathURI.isAbsolute()) { + if(log.isDebugEnabled()) { + log.debug("Parent document is at absolute location: " + + pathURI.toString()); + } URL url = new URL(baseUri); if (url != null) { URI tempURI = new URI(url.getPath()); URI resolvedURI = tempURI.resolve(schemaLocation); // Add back the scheme to the resolved path pathURIStr = constructPath(url, resolvedURI); + if(log.isDebugEnabled()) { + log.debug("Resolved this path to imported document: " + + pathURIStr); + } } } else { + if(log.isDebugEnabled()) { + log.debug("Parent document is at relative location: " + + pathURI.toString()); + } pathURI = pathURI.resolve(schemaLocation); pathURIStr = pathURI.toString(); + if(log.isDebugEnabled()) { + log.debug("Resolved this path to imported document: " + + pathURIStr); + } } // If path is absolute, build URL directly from it if (isAbsolute(pathURIStr)) { @@ -95,10 +127,32 @@ } } } catch (Exception e) { - + if(log.isDebugEnabled()) { + log.debug(e); + } + } + } + if(is == null) { + if(log.isDebugEnabled()) { + log.debug("XSD input stream is null after resolving import for: " + + schemaLocation + " from parent document: " + baseUri); + } + } + else { + if(log.isDebugEnabled()) { + log.debug("XSD input stream is not null after resolving import for: " + + schemaLocation + " from parent document: " + baseUri); } } - return new InputSource(is); + + InputSource returnInputSource = new InputSource(is); + // We need to set the systemId. XmlSchema will use this value to maintain a collection of + // imported XSDs that have been read. If this value is null, then circular XSDs will + // cause infinite recursive reads. + returnInputSource.setSystemId(pathURIStr != null ? pathURIStr : schemaLocation); + //TODO: Temporary, please change the following log.info to log.debug + log.info("returnInputSource :" + returnInputSource.getSystemId()); + return returnInputSource; } /** @@ -169,10 +223,21 @@ HTTP_PROTOCOL) || baseURL.getProtocol().equals(HTTPS_PROTOCOL))) { url = new URL(baseURL.getProtocol(), baseURL.getHost(), baseURL.getPort(), resolvedURI.toString()); + importLocation = url.toString(); } // Check for file else if (baseURL.getProtocol() != null && baseURL.getProtocol().equals(FILE_PROTOCOL)) { url = new URL(baseURL.getProtocol(), baseURL.getHost(), resolvedURI.toString()); + importLocation = url.toString(); + } + // Check for jar + else if (baseURL.getProtocol() != null && baseURL.getProtocol().equals(JAR_PROTOCOL)) { + importLocation = resolvedURI.toString(); + if(importLocation.startsWith(":")){ + importLocation = "jar" + importLocation; + } else { + importLocation = "jar:" + importLocation; + } } } catch (MalformedURLException e) { @@ -181,12 +246,11 @@ baseURL.toString()), e); } - if (url == null) { + if (importLocation == null) { throw ExceptionFactory.makeWebServiceException(Messages.getMessage("schemaImportError", resolvedURI.toString(), baseURL.toString())); } - importLocation = url.toString(); return importLocation; } Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointDescriptionValidator.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointDescriptionValidator.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointDescriptionValidator.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointDescriptionValidator.java Wed Apr 25 22:19:23 2007 @@ -48,12 +48,15 @@ return VALID; } - if (!validateWSDLPort()) { - return INVALID; - } - - if (!validateWSDLBindingType()) { - return INVALID; + //The following phase II validation can only happen on the server side + if (endpointDesc.getServiceDescription().isServerSide()) { + if (!validateWSDLPort()) { + return INVALID; + } + + if (!validateWSDLBindingType()) { + return INVALID; + } } if (!validateEndpointInterface()) { Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/EndpointInterfaceDescriptionValidator.java Wed Apr 25 22:19:23 2007 @@ -66,9 +66,11 @@ if (portType != null) { // TODO: Need more validation here, including: operation name, parameters, faults List wsdlOperationList = portType.getOperations(); - OperationDescription[] opDescArray = epInterfaceDesc.getOperations(); - if (wsdlOperationList.size() != opDescArray.length) { + OperationDescription[] dispatchableOpDescArray = + epInterfaceDesc.getDispatchableOperations(); + + if (wsdlOperationList.size() != dispatchableOpDescArray.length) { addValidationFailure(this, "The number of operations in the WSDL " + "portType does not match the number of methods in the SEI or " + "Web service implementation class."); @@ -76,8 +78,7 @@ } // If they are the same size, let's check to see if the operation names match - - if (!checkOperationsMatchMethods(wsdlOperationList, opDescArray)) { + if (!checkOperationsMatchMethods(wsdlOperationList, dispatchableOpDescArray)) { addValidationFailure(this, "The operation names in the WSDL portType " + "do not match the method names in the SEI or Web service i" + "mplementation class."); Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/ServiceDescriptionValidator.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/ServiceDescriptionValidator.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/ServiceDescriptionValidator.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/validator/ServiceDescriptionValidator.java Wed Apr 25 22:19:23 2007 @@ -18,6 +18,8 @@ */ package org.apache.axis2.jaxws.description.validator; +import java.util.Collection; + import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.description.ServiceDescription; import org.apache.axis2.jaxws.description.ServiceDescriptionJava; @@ -60,10 +62,10 @@ private boolean validateEndpointDescriptions() { boolean areAllValid = true; // Validate all the Endpoints that were created under this Service Description - EndpointDescription[] endpointDescArray = serviceDesc.getEndpointDescriptions(); - for (EndpointDescription endpointDesc : endpointDescArray) { - EndpointDescriptionValidator endpointValidator = - new EndpointDescriptionValidator(endpointDesc); + Collection endpointDescs = serviceDesc.getEndpointDescriptions_AsCollection(); + for (EndpointDescription endpointDesc:endpointDescs) { + EndpointDescriptionValidator endpointValidator = new EndpointDescriptionValidator(endpointDesc); + boolean isEndpointValid = endpointValidator.validate(); if (!isEndpointValid) { addValidationFailure(endpointValidator, "Endpoint failed validation"); Modified: webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/xml/handler/HandlerChainType.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/xml/handler/HandlerChainType.java?view=diff&rev=532615&r1=532614&r2=532615 ============================================================================== --- webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/xml/handler/HandlerChainType.java (original) +++ webservices/axis2/branches/java/1_2/modules/metadata/src/org/apache/axis2/jaxws/description/xml/handler/HandlerChainType.java Wed Apr 25 22:19:23 2007 @@ -19,6 +19,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.ArrayList; import java.util.List; +import javax.xml.namespace.QName; /** @@ -41,8 +42,8 @@ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <choice minOccurs="0"> - * <element name="service-name-pattern" type="{http://java.sun.com/xml/ns/javaee}qname-pattern"/> - * <element name="port-name-pattern" type="{http://java.sun.com/xml/ns/javaee}qname-pattern"/> + * <element name="service-name-pattern" type="{http://www.w3.org/2001/XMLSchema}QName"/> + * <element name="port-name-pattern" type="{http://www.w3.org/2001/XMLSchema}QName"/> * <element name="protocol-bindings" type="{http://java.sun.com/xml/ns/javaee}protocol-bindingListType"/> * </choice> * <element name="handler" type="{http://java.sun.com/xml/ns/javaee}handlerType" @@ -64,11 +65,9 @@ public class HandlerChainType { @XmlElement(name = "service-name-pattern", namespace = "http://java.sun.com/xml/ns/javaee") - @XmlJavaTypeAdapter(CollapsedStringAdapter.class) - protected java.lang.String serviceNamePattern; + protected QName serviceNamePattern; @XmlElement(name = "port-name-pattern", namespace = "http://java.sun.com/xml/ns/javaee") - @XmlJavaTypeAdapter(CollapsedStringAdapter.class) - protected java.lang.String portNamePattern; + protected QName portNamePattern; @XmlList @XmlElement(name = "protocol-bindings", namespace = "http://java.sun.com/xml/ns/javaee") protected List protocolBindings; @@ -84,7 +83,7 @@ * * @return possible object is {@link java.lang.String } */ - public java.lang.String getServiceNamePattern() { + public QName getServiceNamePattern() { return serviceNamePattern; } @@ -93,7 +92,7 @@ * * @param value allowed object is {@link java.lang.String } */ - public void setServiceNamePattern(java.lang.String value) { + public void setServiceNamePattern(QName value) { this.serviceNamePattern = value; } @@ -102,7 +101,7 @@ * * @return possible object is {@link java.lang.String } */ - public java.lang.String getPortNamePattern() { + public QName getPortNamePattern() { return portNamePattern; } @@ -111,7 +110,7 @@ * * @param value allowed object is {@link java.lang.String } */ - public void setPortNamePattern(java.lang.String value) { + public void setPortNamePattern(QName value) { this.portNamePattern = value; } --------------------------------------------------------------------- To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org For additional commands, e-mail: axis-cvs-help@ws.apache.org