| /* |
| * 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 sample.impl; |
| |
| import java.net.URI; |
| import java.net.URL; |
| import java.util.Arrays; |
| |
| import javax.wsdl.PortType; |
| import javax.xml.namespace.QName; |
| |
| import org.apache.tuscany.sca.assembly.AssemblyFactory; |
| import org.apache.tuscany.sca.assembly.Component; |
| import org.apache.tuscany.sca.assembly.ComponentReference; |
| import org.apache.tuscany.sca.assembly.ComponentService; |
| import org.apache.tuscany.sca.assembly.Composite; |
| import org.apache.tuscany.sca.assembly.Contract; |
| import org.apache.tuscany.sca.assembly.Implementation; |
| import org.apache.tuscany.sca.assembly.Reference; |
| import org.apache.tuscany.sca.assembly.Service; |
| import org.apache.tuscany.sca.contribution.Artifact; |
| import org.apache.tuscany.sca.contribution.Contribution; |
| import org.apache.tuscany.sca.contribution.ContributionFactory; |
| import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; |
| 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.databinding.xml.DOMDataBinding; |
| import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; |
| 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.WSDLObject; |
| import org.apache.tuscany.sca.node.Node; |
| import org.apache.tuscany.sca.node.NodeFactory; |
| import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint; |
| |
| /** |
| * A few utility functions to help embed a Tuscany runtime, and a simple DSL |
| * to help assemble and run SCDL. |
| */ |
| public class EmbedUtil { |
| |
| /** |
| * A runtime embedder context, which conveniently initializes a Node factory |
| * and gets the various registries, factories and extension points we need. |
| */ |
| static class Context { |
| final NodeFactory nf; |
| final ExtensionPointRegistry epr; |
| final FactoryExtensionPoint fep; |
| final ContributionFactory cf; |
| final AssemblyFactory af; |
| final JavaInterfaceFactory jif; |
| final WSDLFactory wif; |
| final URLArtifactProcessorExtensionPoint apep; |
| final ExtensibleURLArtifactProcessor aproc; |
| final ModelResolverExtensionPoint mrep; |
| final ProviderFactoryExtensionPoint pfep; |
| |
| Context(final NodeFactory nf) { |
| this.nf = nf; |
| epr = nf.getExtensionPointRegistry(); |
| fep = epr.getExtensionPoint(FactoryExtensionPoint.class); |
| cf = fep.getFactory(ContributionFactory.class); |
| af = fep.getFactory(AssemblyFactory.class); |
| jif = fep.getFactory(JavaInterfaceFactory.class); |
| wif = fep.getFactory(WSDLFactory.class); |
| apep = epr.getExtensionPoint(URLArtifactProcessorExtensionPoint.class); |
| aproc = new ExtensibleURLArtifactProcessor(apep); |
| mrep = epr.getExtensionPoint(ModelResolverExtensionPoint.class); |
| pfep = epr.getExtensionPoint(ProviderFactoryExtensionPoint.class); |
| } |
| } |
| |
| static Context embedContext(NodeFactory nf) { |
| return new Context(nf); |
| } |
| |
| /** |
| * A mini DSL to help build and assemble contributions and SCDL composites. |
| */ |
| interface Builder<T> { |
| T build(Context ec); |
| } |
| |
| static <T> T build(final Builder<T> builder, final Context ec) { |
| return builder.build(ec); |
| } |
| |
| /** |
| * Return a contribution builder. |
| */ |
| static Builder<Contribution> contrib(final String uri, final String loc, final Builder<Artifact>... artifacts) { |
| return new Builder<Contribution>() { |
| public Contribution build(final Context ec) { |
| final Contribution c = ec.cf.createContribution(); |
| c.setURI(uri); |
| c.setLocation(loc); |
| c.setModelResolver(new ExtensibleModelResolver(c, ec.mrep, ec.fep)); |
| for(Builder<Artifact> a: artifacts) |
| c.getArtifacts().add(a.build(ec)); |
| return c; |
| } |
| }; |
| } |
| |
| /** |
| * Return an artifact builder. |
| */ |
| static Builder<Artifact> artifact(final String uri, final Object model) { |
| return new Builder<Artifact>() { |
| public Artifact build(final Context ec) { |
| final Artifact a = ec.cf.createArtifact(); |
| a.setURI(uri); |
| a.setModel(model); |
| return a; |
| } |
| }; |
| } |
| |
| /** |
| * Return a composite builder. |
| */ |
| static Builder<Composite> composite(final String ns, final String name, final Builder<Component>... components) { |
| return new Builder<Composite>() { |
| public Composite build(final Context ec) { |
| final Composite compos = ec.af.createComposite(); |
| compos.setName(new QName(ns, name)); |
| for(final Builder<Component> c: components) |
| compos.getComponents().add(c.build(ec)); |
| return compos; |
| } |
| }; |
| } |
| |
| /** |
| * Return a component builder. |
| */ |
| static Builder<Component> component(final String name, final Builder<Implementation> impl, final Builder<ComponentReference>... references) { |
| return new Builder<Component>() { |
| public Component build(final Context ec) { |
| final Component c = ec.af.createComponent(); |
| c.setName(name); |
| c.setImplementation(impl.build(ec)); |
| for(Builder<ComponentReference> r: references) |
| c.getReferences().add(r.build(ec)); |
| return c; |
| } |
| }; |
| } |
| |
| /** |
| * Return an implementation builder. |
| */ |
| static Builder<Implementation> implementation(final Class<?> clazz, final Builder<Contract>... contracts) { |
| return new Builder<Implementation>() { |
| public SampleImplementation build(final Context ec) { |
| final SampleImplementation impl = ImplUtil.implementation(clazz.getName()); |
| impl.clazz = clazz; |
| impl.setUnresolved(false); |
| for(final Builder<Contract> b: contracts) { |
| Contract c = b.build(ec); |
| if(c instanceof Service) |
| impl.getServices().add((Service)c); |
| else |
| impl.getReferences().add((Reference)c); |
| } |
| return impl; |
| } |
| }; |
| } |
| |
| /** |
| * Return a reference builder. |
| */ |
| static Builder<Contract> reference(final String name, final Class<?> c) { |
| return new Builder<Contract>() { |
| public Reference build(final Context ec) { |
| try { |
| return ImplUtil.reference(name, c, ec.jif, ec.af); |
| } catch(InvalidInterfaceException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| }; |
| } |
| |
| static Builder<Contract> reference(final String name, final WSDLInterface c) { |
| return new Builder<Contract>() { |
| public Reference build(final Context ec) { |
| return ImplUtil.reference(name, c, ec.wif, ec.af); |
| } |
| }; |
| } |
| |
| static Builder<ComponentReference> reference(final String name, final String target) { |
| return new Builder<ComponentReference>() { |
| public ComponentReference build(final Context ec) { |
| final ComponentReference r = ec.af.createComponentReference(); |
| r.setName(name); |
| final ComponentService s = ec.af.createComponentService(); |
| s.setUnresolved(true); |
| s.setName(target); |
| r.getTargets().add(s); |
| return r; |
| } |
| }; |
| } |
| |
| /** |
| * Return a service builder. |
| */ |
| static Builder<Contract> service(final Class<?> c) { |
| return new Builder<Contract>() { |
| public Service build(final Context ec) { |
| try { |
| return ImplUtil.service(c, ec.jif, ec.af); |
| } catch(InvalidInterfaceException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| }; |
| } |
| |
| static Builder<Contract> service(final WSDLInterface c) { |
| return new Builder<Contract>() { |
| public Service build(final Context ec) { |
| return ImplUtil.service(c, ec.wif, ec.af); |
| } |
| }; |
| } |
| |
| /** |
| * Return a WSDLInterface builder which loads a WSDL into a contribution. |
| */ |
| static Builder<WSDLInterface> wsdli(final String uri, final String ns, final String name, final Contribution c) { |
| return new Builder<WSDLInterface>() { |
| public WSDLInterface build(final Context ec) { |
| try { |
| final ProcessorContext ctx = new ProcessorContext(); |
| final WSDLDefinition wd = ec.aproc.read(null, new URI(uri), new URL(new URL(c.getLocation()), uri), ctx, WSDLDefinition.class); |
| c.getModelResolver().addModel(wd, ctx); |
| c.getModelResolver().resolveModel(WSDLDefinition.class, wd, ctx); |
| final WSDLObject<PortType> pt = wd.getWSDLObject(PortType.class, new QName(ns, name)); |
| if(pt == null) |
| throw new ContributionResolveException("Couldn't find " + name); |
| final WSDLInterface nwi = ec.wif.createWSDLInterface(pt.getElement(), wd, c.getModelResolver(), null); |
| nwi.setWsdlDefinition(wd); |
| nwi.resetDataBinding(DOMDataBinding.NAME); |
| return nwi; |
| } catch(Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| }; |
| } |
| |
| /** |
| * Return the extension point registry used by our nodes. |
| */ |
| static ExtensionPointRegistry extensionPoints(final Context ec) { |
| return ec.epr; |
| } |
| |
| /** |
| * Return the provider factory extension point used by our nodes. |
| */ |
| static ProviderFactoryExtensionPoint providerFactories(final Context ec) { |
| return ec.pfep; |
| } |
| |
| /** |
| * Add a deployable composite to a contribution. |
| */ |
| static Contribution deploy(final Contribution contrib, final Composite... comps) { |
| for(Composite c: comps) |
| contrib.getDeployables().add(c); |
| return contrib; |
| } |
| |
| /** |
| * Configure a node with a list of contributions. |
| */ |
| static Node node(final NodeFactory nf, final Contribution... contributions) { |
| return nf.createNode(Arrays.asList(contributions)); |
| } |
| |
| } |