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? Simon -- Apache Tuscany committer: tuscany.apache.org Co-author of a book about Tuscany and SCA: tuscanyinaction.com