On Tue, Aug 9, 2011 at 3:20 PM, Simon Laws <simonsl...@googlemail.com> wrote:
> On Tue, Aug 9, 2011 at 3:02 PM, ant elder <ant.el...@gmail.com> wrote:
>> On Tue, Aug 9, 2011 at 2:50 PM, Simon Laws <simonsl...@googlemail.com> wrote:
>>> On Tue, Jul 26, 2011 at 7:38 PM,  <antel...@apache.org> wrote:
>>>> Author: antelder
>>>> Date: Tue Jul 26 18:38:46 2011
>>>> New Revision: 1151203
>>>>
>>>> URL: http://svn.apache.org/viewvc?rev=1151203&view=rev
>>>> Log:
>>>> Add some code to try to convert the wsdl string from the remote endpoint 
>>>> back into a WSDLInterfaceContract. This doesn't work properly and throws 
>>>> an InvalidWSDLException with some JDKs. Committing as-is to see if anyone 
>>>> has any ideas why
>>>>
>>>> Added:
>>>>    
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
>>>> Modified:
>>>>    
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
>>>>    
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
>>>>
>>>> Modified: 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
>>>> URL: 
>>>> http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java?rev=1151203&r1=1151202&r2=1151203&view=diff
>>>> ==============================================================================
>>>> --- 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
>>>>  (original)
>>>> +++ 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
>>>>  Tue Jul 26 18:38:46 2011
>>>> @@ -31,9 +31,6 @@ import java.util.List;
>>>>  import java.util.Map;
>>>>  import java.util.concurrent.ConcurrentHashMap;
>>>>
>>>> -import javax.wsdl.Definition;
>>>> -import javax.wsdl.WSDLException;
>>>> -import javax.wsdl.xml.WSDLReader;
>>>>  import javax.wsdl.xml.WSDLWriter;
>>>>  import javax.xml.namespace.QName;
>>>>  import javax.xml.stream.XMLStreamException;
>>>> @@ -82,7 +79,6 @@ import org.apache.tuscany.sca.interfaced
>>>>  import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
>>>>  import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
>>>>  import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
>>>> -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
>>>>  import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
>>>>  import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
>>>>  import org.apache.tuscany.sca.invocation.Interceptor;
>>>> @@ -115,7 +111,6 @@ import org.apache.tuscany.sca.runtime.Ru
>>>>  import org.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPoint;
>>>>  import org.apache.tuscany.sca.work.WorkScheduler;
>>>>  import org.oasisopen.sca.ServiceRuntimeException;
>>>> -import org.xml.sax.InputSource;
>>>>
>>>>  /**
>>>>  * Runtime model for Endpoint that supports java serialization
>>>> @@ -1067,24 +1062,12 @@ public class RuntimeEndpointImpl extends
>>>>         if (wsdl == null || wsdl.length() < 1) {
>>>>             return;
>>>>         }
>>>> -        try {
>>>> -            InterfaceContract ic = getComponentServiceInterfaceContract();
>>>> -            WSDLFactory wsdlFactory = 
>>>> registry.getExtensionPoint(FactoryExtensionPoint.class).getFactory(WSDLFactory.class);
>>>> -            WSDLInterfaceContract wsdlIC = 
>>>> wsdlFactory.createWSDLInterfaceContract();
>>>> -            WSDLInterface wsdlIface = wsdlFactory.createWSDLInterface();
>>>> -            WSDLDefinition wsdlDef = wsdlFactory.createWSDLDefinition();
>>>> -            WSDLReader reader = 
>>>> javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader();
>>>> -            InputSource inputSource = new InputSource(new 
>>>> StringReader(wsdl));
>>>> -            Definition def = reader.readWSDL("", inputSource);
>>>> -            wsdlDef.setDefinition(def);
>>>> -            wsdlIface.setWsdlDefinition(wsdlDef);
>>>> -            wsdlIC.setInterface(wsdlIface);
>>>> -            ic.setNormalizedWSDLContract(wsdlIC);
>>>> -        } catch (WSDLException e) {
>>>> -            throw new RuntimeException(e);
>>>> +        InterfaceContract ic = getComponentServiceInterfaceContract();
>>>> +        if (ic != null) {
>>>> +            
>>>> ic.setNormalizedWSDLContract(WSDLHelper.createWSDLInterfaceContract(registry,
>>>>  wsdl));
>>>>         }
>>>>     }
>>>> -
>>>> +
>>>>     public InterfaceContract getGeneratedWSDLContract(InterfaceContract 
>>>> interfaceContract) {
>>>>
>>>>         if ( interfaceContract.getNormalizedWSDLContract() == null){
>>>>
>>>> Added: 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
>>>> URL: 
>>>> http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java?rev=1151203&view=auto
>>>> ==============================================================================
>>>> --- 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
>>>>  (added)
>>>> +++ 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
>>>>  Tue Jul 26 18:38:46 2011
>>>> @@ -0,0 +1,117 @@
>>>> +/*
>>>> + * 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.tuscany.sca.core.assembly.impl;
>>>> +
>>>> +import java.io.File;
>>>> +import java.io.FileNotFoundException;
>>>> +import java.io.FileOutputStream;
>>>> +import java.io.IOException;
>>>> +import java.io.OutputStreamWriter;
>>>> +import java.io.Writer;
>>>> +import java.net.URI;
>>>> +
>>>> +import javax.wsdl.PortType;
>>>> +
>>>> +import org.apache.tuscany.sca.contribution.Contribution;
>>>> +import org.apache.tuscany.sca.contribution.ContributionFactory;
>>>> +import 
>>>> org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
>>>> +import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
>>>> +import 
>>>> org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
>>>> +import 
>>>> org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
>>>> +import 
>>>> org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
>>>> +import org.apache.tuscany.sca.core.ExtensionPointRegistry;
>>>> +import org.apache.tuscany.sca.core.FactoryExtensionPoint;
>>>> +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
>>>> +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
>>>> +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
>>>> +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
>>>> +import org.apache.tuscany.sca.interfacedef.wsdl.impl.InvalidWSDLException;
>>>> +
>>>> +public class WSDLHelper {
>>>> +
>>>> +    /**
>>>> +     * This creates a WSDLInterfaceContract from a WSDL document
>>>> +     * TODO: Presently this writes the wsdl string to a temporary file 
>>>> which is then used by the Tuscany contribution
>>>> +     * code to turn the wsdl into the correctly populated Tuscany model 
>>>> objects. There must/should be a way to have
>>>> +     * that happen without needing the external file but i've not been 
>>>> able to find the correct configuration to
>>>> +     * get that to happen with all the schema objects created correctly.
>>>> +     */
>>>> +    public static WSDLInterfaceContract 
>>>> createWSDLInterfaceContract(ExtensionPointRegistry registry, String wsdl) {
>>>> +        File wsdlFile = null;
>>>> +        try {
>>>> +
>>>> +            wsdlFile = writeToFile(wsdl);
>>>> +            System.out.println("wsdl: " + wsdlFile);
>>>> +
>>>> +            FactoryExtensionPoint fep = 
>>>> registry.getExtensionPoint(FactoryExtensionPoint.class);
>>>> +            URLArtifactProcessorExtensionPoint apep = 
>>>> registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
>>>> +            ExtensibleURLArtifactProcessor aproc = new 
>>>> ExtensibleURLArtifactProcessor(apep);
>>>> +            ProcessorContext ctx = new ProcessorContext();
>>>> +
>>>> +            ContributionFactory cf = 
>>>> fep.getFactory(ContributionFactory.class);
>>>> +            final Contribution c = cf.createContribution();
>>>> +            c.setURI("temp");
>>>> +            c.setLocation(wsdlFile.toURI().toURL().toString());
>>>> +            c.setModelResolver(new ExtensibleModelResolver(c, 
>>>> registry.getExtensionPoint(ModelResolverExtensionPoint.class), fep));
>>>> +
>>>> +            WSDLDefinition wd = aproc.read(null, new URI("temp.wsdl"), 
>>>> wsdlFile.toURI().toURL(), ctx, WSDLDefinition.class);
>>>> +            c.getModelResolver().addModel(wd, ctx);
>>>> +            c.getModelResolver().resolveModel(WSDLDefinition.class, wd, 
>>>> ctx);
>>>> +            PortType pt = 
>>>> (PortType)wd.getDefinition().getAllPortTypes().values().iterator().next();
>>>> +
>>>> +            WSDLFactory wsdlFactory = 
>>>> registry.getExtensionPoint(FactoryExtensionPoint.class).getFactory(WSDLFactory.class);
>>>> +            WSDLInterface nwi = wsdlFactory.createWSDLInterface(pt, wd, 
>>>> c.getModelResolver(), null);
>>>> +            nwi.setWsdlDefinition(wd);
>>>> +            WSDLInterfaceContract wsdlIC = 
>>>> wsdlFactory.createWSDLInterfaceContract();
>>>> +            wsdlIC.setInterface(nwi);
>>>> +
>>>> +            wsdlFile.delete();
>>>> +
>>>> +            return wsdlIC;
>>>> +
>>>> +        } catch (InvalidWSDLException e) {
>>>> +            //* TODO: Also, this doesn't seem to work reliably and 
>>>> sometimes the schema objects don't get built correctly
>>>> +            //* 
>>>> org.apache.tuscany.sca.interfacedef.wsdl.impl.InvalidWSDLException: 
>>>> Element cannot be resolved: {http://sample/}sayHello
>>>> +            //*         at 
>>>> org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLOperationIntrospectorImpl$WSDLPart.<init>(WSDLOperationIntrospectorImpl.java:276)
>>>> +            //* It seems like it works ok for me with IBM JDK but not 
>>>> with a Sun one
>>>> +            // I'm still trying to track this down but committing like 
>>>> this to see if anyone has any ideas
>>>> +            e.printStackTrace();
>>>> +            return null;
>>>> +        } catch(Exception e) {
>>>> +            throw new RuntimeException(e);
>>>> +        } finally {
>>>> +            if (wsdlFile != null) {
>>>> +                wsdlFile.delete();
>>>> +            }
>>>> +        }
>>>> +    }
>>>> +
>>>> +    private static File writeToFile(String wsdl) throws 
>>>> FileNotFoundException, IOException {
>>>> +        File f = File.createTempFile("endpoint", ".wsdl");
>>>> +        Writer out = new OutputStreamWriter(new FileOutputStream(f));
>>>> +        try {
>>>> +          out.write(wsdl);
>>>> +        }
>>>> +        finally {
>>>> +          out.close();
>>>> +        }
>>>> +        return f;
>>>> +    }
>>>> +}
>>>>
>>>> Modified: 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
>>>> URL: 
>>>> http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java?rev=1151203&r1=1151202&r2=1151203&view=diff
>>>> ==============================================================================
>>>> --- 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
>>>>  (original)
>>>> +++ 
>>>> tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
>>>>  Tue Jul 26 18:38:46 2011
>>>> @@ -915,9 +915,9 @@ public class EndpointReferenceBinderImpl
>>>>             return true;
>>>>         }
>>>>
>>>> -        // TODO - is there a better test for this. Would have to cast to 
>>>> the
>>>> -        //        correct iface type to get to the resolved flag
>>>> -        //        We need to rely on normailzed interfaces in this case!!
>>>> +//        // TODO - is there a better test for this. Would have to cast 
>>>> to the
>>>> +//        //        correct iface type to get to the resolved flag
>>>> +//        //        We need to rely on normailzed interfaces in this 
>>>> case!!
>>>>         if (endpointContract.getInterface().getOperations().size() == 0){
>>>>             // the interface contract is likely remote but unresolved
>>>>             // we discussed this on the ML and decided that we could
>>>>
>>>>
>>>>
>>>
>>> Ant
>>>
>>> Have been looking into this and I have a concern about writing the
>>> WSDL as is as WSDL4J as we have it configured flattens any top level
>>> includes/imports but leaves any nested includes/imports intact. These
>>> will not resolve correctly on the reference side.
>>>
>>> Now this may be a configuration issue (will look at it) but if this is
>>> just how it is we need to pass the interface information via the
>>> registry in some more complete form. An alternative would be to
>>> provide more information in the registry about which contribution owns
>>> the endpoint and hence load the artifacts directly but this is another
>>> layer of complexity which I'd avoid if possible.
>>>
>>
>> Yep imports will be an issue. As the simple case of wsdl with no
>> imports doesn't work yet though so i didn't code anything for dealing
>> with it yet.
>>
>>   ...ant
>>
>
> What was the code that you tried and which failed? I only see the code
> that writes to file and reads it back again. Or was it the case that
> the failure was happening with the code writing to/reading from file?
>

Yes its that code which isn't working correctly. For example if you
run something like the helloworld-scaclient testcase you should see an
exception InvalidWSDLException: Element cannot be resolved:
{http://sample/}sayHello. (The test does pass successfully even with
that exception as the remote interface validataion code isn't enabled
yet).

   ...ant

Reply via email to