[ 
https://issues.apache.org/jira/browse/CXF-4676?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13546555#comment-13546555
 ] 

iris ding commented on CXF-4676:
--------------------------------

Hi Freeman,

seems this is a bug for DefinitionImpl.getAllPortTypes() method. To bypass this 
problem, I will use below code snippet for this aim: -it means getPortTypes 
from wsdl and all it's imported wsdl by ourself.

  private boolean isEmptywsdl(String wsdlUrl) {
        Definition definition;
        try {
            definition = 
getBus().getExtension(WSDLManager.class).getDefinition(wsdlUrl);
            List<Definition> importedDefinitions = new ArrayList<Definition>();
            parseImports(definition, importedDefinitions);
            for (Definition def : importedDefinitions) {
                Set<QName> portTypes = def.getPortTypes().keySet();
                for (QName sName : portTypes) {
                    if (!definition.getPortTypes().keySet().contains(sName)) {
                        definition.getPortTypes().put(sName, 
def.getPortType(sName));
                    }
                }
            }

        } catch (Exception e) {
            return true;
        }
       if (definition.getPortTypes().isEmpty()) {
            return true;
        } 
        return false;
    }
    private void parseImports(Definition def, List<Definition> 
importedDefinitions) {
        for (Import impt : getImports(def)) {
            if (!importedDefinitions.contains(impt.getDefinition())) {
                importedDefinitions.add(impt.getDefinition());
                parseImports(impt.getDefinition(), importedDefinitions);
            }
        }
    }
    
    private static Collection<Import> getImports(final Definition wsdlDef) {
        Collection<Import> importList = new ArrayList<Import>();
        Map<?, ?> imports = wsdlDef.getImports();
        for (Iterator<?> iter = imports.keySet().iterator(); iter.hasNext();) {
            String uri = (String)iter.next();
            List<Import> lst = CastUtils.cast((List<?>)imports.get(uri));
            importList.addAll(lst);
        }
        return importList;
    }
Do you have any comments for this? This method works for the above cases.
                
> Partial WSDL support in CXF 
> ----------------------------
>
>                 Key: CXF-4676
>                 URL: https://issues.apache.org/jira/browse/CXF-4676
>             Project: CXF
>          Issue Type: Bug
>          Components: Services
>    Affects Versions: 2.6.2
>            Reporter: iris ding
>            Assignee: Freeman Fang
>         Attachments: cxf-4676.patch
>
>
> I have one SEI defined as below:
> @WebService(wsdlLocation="WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl")
> public class AddNumbersImplPartial1 {
>        
>         public int addTwoNumbers(int number1, int number2) throws 
> AddNegativeNumbersException {
>                 if (number1 < 0 || number2 < 0) {
>                         throw new AddNegativeNumbersException("Negative 
> number submitted !! ", "Numbers: " +
>                                                               number1 + ", " 
> + number2);
>                 }
>                 return number1 + number2;
>         }
> }
> The WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl is not complete, it only 
> contains to the porttype part:
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> <definitions
> targetNamespace="http://serverpartial1.partialwsdl.annotations/"; 
> name="AddNumbersImplPartial1Service"
> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; 
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
> xmlns:tns="http://serverpartial1.partialwsdl.annotations/";
> xmlns="http://schemas.xmlsoap.org/wsdl/";>
>   <types>
>     <xsd:schema>
>       <xsd:import namespace="http://serverpartial1.partialwsdl.annotations/"; 
> schemaLocation="AddNumbersImplPartial1Service_schema1.xsd"/>
>     </xsd:schema>
>   </types>
>   <message name="addTwoNumbers">
>     <part name="parameters" element="tns:addTwoNumbers"/>
>   </message>
>   <message name="addTwoNumbersResponse">
>     <part name="parameters" element="tns:addTwoNumbersResponse"/>
>   </message>
>   <message name="AddNegativeNumbersException">
>     <part name="fault" element="tns:AddNegativeNumbersException"/>
>   </message>
>   <portType name="AddNumbersImplPartial1">
>     <operation name="addTwoNumbers">
>       <input message="tns:addTwoNumbers"/>
>       <output message="tns:addTwoNumbersResponse"/>
>       <fault name="AddNegativeNumbersException" 
> message="tns:AddNegativeNumbersException"/>
>     </operation>
>   </portType>
>  
> </definitions>
> Now if I put the war file into tomcat and let it use CXF, the service can not 
> be deployed successfully. In CXF, when it calls WSDLServiceFactory.create, it 
> will simply get the service name from wsdl file and in our case, since it is 
> empty, it will throw exception and service deployment failed. you can 
> reference below part:
> javax.wsdl.Service wsdlService = definition.getService(serviceName);
>             if (wsdlService == null) {
>                 throw new ServiceConstructionException(new 
> Message("NO_SUCH_SERVICE_EXC", LOG, serviceName));
>             }
> But per jaxws 2.2 spec, in chapter 5.2.5.5:
> 5.2.5.5 Application-specified PortType
> No metadata document contains a definition for the sought-after service S, 
> but a metadata document, say
> D, contains a definition for the WSDL portType whose qualified name, say P, 
> matches that specified by the
> endpoint being published. In this case, a JAX-WS implementation MUST create a 
> new description for S,
> including an appropriate WSDL binding element referencing portType P. The 
> metadata document D MUST
> be imported/included so that the published contract uses the definition of P 
> provided by D. No schema generation
> occurs,as P is assumed to embed or import schema definitions for all the 
> types/elements it requires.
> Like in the previous case, the implementation MUST override any location and 
> schemaLocation attributes.
> It is an error if more than one metadata document contains a definition for 
> the sought-after portType
> P.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to