On Tue, Aug 9, 2011 at 3:20 PM, Simon Laws <[email protected]> wrote:
> On Tue, Aug 9, 2011 at 3:02 PM, ant elder <[email protected]> wrote:
>> On Tue, Aug 9, 2011 at 2:50 PM, Simon Laws <[email protected]> wrote:
>>> On Tue, Jul 26, 2011 at 7:38 PM, <[email protected]> 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