From 960ef736d702d87ede50b097e191f6336c9be7a4 Mon Sep 17 00:00:00 2001 From: rfeng Date: Fri, 5 Dec 2008 22:32:00 +0000 Subject: Further cleanup for ComponentContext, CompositeContext git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@723904 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/core/assembly/CompositeActivator.java | 14 - .../core/assembly/impl/CompositeActivatorImpl.java | 51 +-- .../sca/core/context/ComponentContextExt.java | 1 + .../tuscany/sca/core/context/CompositeContext.java | 284 ++++++----------- .../context/DefaultComponentContextFactory.java | 55 +--- .../core/context/impl/CallableReferenceImpl.java | 107 +++---- .../core/context/impl/ComponentContextImpl.java | 60 ++-- .../core/context/impl/CompositeContextImpl.java | 355 +++++++++++++++++++++ .../sca/core/context/impl/RequestContextImpl.java | 4 +- 9 files changed, 545 insertions(+), 386 deletions(-) create mode 100644 java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CompositeContextImpl.java (limited to 'java/sca/modules/core/src/main') diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivator.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivator.java index 24be299581..56b7442f51 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivator.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivator.java @@ -112,20 +112,6 @@ public interface CompositeActivator { */ CompositeContext getCompositeContext(); - /** - * Get the proxy factory - * @return - */ - ProxyFactory getProxyFactory(); - - /** - * Get the java interface factory - * @return - */ - JavaInterfaceFactory getJavaInterfaceFactory(); - - ConversationManager getConversationManager(); - /** * Configure the runtime component with component context * @param component diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java index 5d8fdecc2f..67edf3ab9d 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java @@ -37,21 +37,20 @@ import org.apache.tuscany.sca.assembly.Implementation; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.context.ComponentContextFactory; import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint; +import org.apache.tuscany.sca.context.PropertyValueFactory; import org.apache.tuscany.sca.context.RequestContextFactory; -import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.UtilityExtensionPoint; import org.apache.tuscany.sca.core.assembly.ActivationException; import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.context.CompositeContext; -import org.apache.tuscany.sca.core.context.impl.ComponentContextImpl; +import org.apache.tuscany.sca.core.context.impl.CompositeContextImpl; import org.apache.tuscany.sca.core.conversation.ConversationManager; -import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; import org.apache.tuscany.sca.core.invocation.ExtensibleWireProcessor; import org.apache.tuscany.sca.core.invocation.ProxyFactory; -import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.core.scope.Scope; import org.apache.tuscany.sca.core.scope.ScopeContainer; import org.apache.tuscany.sca.core.scope.ScopeRegistry; @@ -97,16 +96,20 @@ public class CompositeActivatorImpl implements CompositeActivator { private final ProviderFactoryExtensionPoint providerFactories; private final EndpointResolverFactoryExtensionPoint endpointResolverFactories; + private final ComponentContextFactory componentContextFactory; private final RequestContextFactory requestContextFactory; private final ProxyFactory proxyFactory; private final JavaInterfaceFactory javaInterfaceFactory; + private final PropertyValueFactory propertyValueFactory; + private final ConversationManager conversationManager; - private final CompositeContext componentContextHelper; + private final CompositeContext compositeContext; private Composite domainComposite; public CompositeActivatorImpl(ExtensionPointRegistry extensionPoints) { + this.compositeContext = new CompositeContextImpl(extensionPoints); FactoryExtensionPoint factories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); this.assemblyFactory = factories.getFactory(AssemblyFactory.class); this.messageFactory = factories.getFactory(MessageFactory.class); @@ -117,14 +120,13 @@ public class CompositeActivatorImpl implements CompositeActivator { this.wireProcessor = new ExtensibleWireProcessor(extensionPoints.getExtensionPoint(RuntimeWireProcessorExtensionPoint.class)); this.providerFactories = extensionPoints.getExtensionPoint(ProviderFactoryExtensionPoint.class); this.endpointResolverFactories = extensionPoints.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class); - this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); + this.javaInterfaceFactory = compositeContext.getJavaInterfaceFactory(); + this.propertyValueFactory = factories.getFactory(PropertyValueFactory.class); ContextFactoryExtensionPoint contextFactories = extensionPoints.getExtensionPoint(ContextFactoryExtensionPoint.class); + this.componentContextFactory = contextFactories.getFactory(ComponentContextFactory.class); this.requestContextFactory = contextFactories.getFactory(RequestContextFactory.class); - ProxyFactoryExtensionPoint proxyFactories = extensionPoints.getExtensionPoint(ProxyFactoryExtensionPoint.class); - proxyFactory = new ExtensibleProxyFactory(proxyFactories); - this.conversationManager = utilities.getUtility(ConversationManager.class); - StAXArtifactProcessorExtensionPoint processors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); - this.componentContextHelper = new CompositeContext(extensionPoints); + proxyFactory = compositeContext.getProxyFactory(); + this.conversationManager = compositeContext.getConversationManager(); } /** @@ -651,9 +653,7 @@ public class CompositeActivatorImpl implements CompositeActivator { * @param runtimeComponent */ public void configureComponentContext(RuntimeComponent runtimeComponent) { - RuntimeComponentContext componentContext = - new ComponentContextImpl(this, assemblyFactory, proxyFactory, interfaceContractMapper, - requestContextFactory, javaInterfaceFactory, runtimeComponent); + RuntimeComponentContext componentContext = (RuntimeComponentContext) componentContextFactory.createComponentContext(runtimeComponent); runtimeComponent.setComponentContext(componentContext); } @@ -1025,14 +1025,7 @@ public class CompositeActivatorImpl implements CompositeActivator { * @return the referenceHelper */ public CompositeContext getCompositeContext() { - return componentContextHelper; - } - - /** - * @return the proxyFactory - */ - public ProxyFactory getProxyFactory() { - return proxyFactory; + return compositeContext; } /** @@ -1075,19 +1068,5 @@ public class CompositeActivatorImpl implements CompositeActivator { } return null; } - - /** - * @return the javaInterfaceFactory - */ - public JavaInterfaceFactory getJavaInterfaceFactory() { - return javaInterfaceFactory; - } - - /** - * @return the conversationManager - */ - public ConversationManager getConversationManager() { - return conversationManager; - } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextExt.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextExt.java index cb61c57f27..6db3af213d 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextExt.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextExt.java @@ -27,4 +27,5 @@ import org.apache.tuscany.sca.runtime.RuntimeComponentContext; */ public interface ComponentContextExt extends RuntimeComponentContext { CompositeActivator getCompositeActivator(); + CompositeContext getCompositeContext(); } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CompositeContext.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CompositeContext.java index 76de8a2aaa..c68b05e8fb 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CompositeContext.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CompositeContext.java @@ -21,39 +21,21 @@ package org.apache.tuscany.sca.core.context; import java.io.IOException; import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.List; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLStreamWriter; -import org.apache.tuscany.sca.assembly.AssemblyFactory; -import org.apache.tuscany.sca.assembly.Binding; 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.Multiplicity; -import org.apache.tuscany.sca.assembly.OptimizableBinding; -import org.apache.tuscany.sca.assembly.Reference; -import org.apache.tuscany.sca.assembly.Service; -import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; -import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.assembly.CompositeActivator; -import org.apache.tuscany.sca.core.context.impl.ComponentContextImpl; +import org.apache.tuscany.sca.core.conversation.ConversationManager; +import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.core.invocation.ThreadMessageContext; -import org.apache.tuscany.sca.interfacedef.Interface; -import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; import org.apache.tuscany.sca.invocation.Message; import org.apache.tuscany.sca.runtime.EndpointReference; @@ -65,20 +47,7 @@ import org.osoa.sca.ServiceRuntimeException; /** * @version $Rev$ $Date$ */ -public class CompositeContext { - private final ExtensionPointRegistry extensionPointRegistry; - private final AssemblyFactory assemblyFactory; - private final JavaInterfaceFactory javaInterfaceFactory; - private final StAXArtifactProcessorExtensionPoint staxProcessors; - - public CompositeContext(ExtensionPointRegistry registry) { - this.extensionPointRegistry = registry; - FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class); - this.assemblyFactory = factories.getFactory(AssemblyFactory.class); - this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); - this.staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); - } - +public abstract class CompositeContext { /** * Create a self-reference for a component service * @param component @@ -86,66 +55,10 @@ public class CompositeContext { * @throws CloneNotSupportedException * @throws InvalidInterfaceException */ - public ComponentReference createSelfReference(Component component, - ComponentService service, - Class businessInterface) throws CloneNotSupportedException, - InvalidInterfaceException { - ComponentReference componentReference = assemblyFactory.createComponentReference(); - componentReference.setName("$self$." + service.getName()); - for (Binding binding : service.getBindings()) { - if (binding instanceof OptimizableBinding) { - OptimizableBinding optimizableBinding = (OptimizableBinding)((OptimizableBinding)binding).clone(); - optimizableBinding.setTargetBinding(binding); - optimizableBinding.setTargetComponent(component); - optimizableBinding.setTargetComponentService(service); - componentReference.getBindings().add(optimizableBinding); - } else { - componentReference.getBindings().add(binding); - } - } - - componentReference.setCallback(service.getCallback()); - componentReference.getTargets().add(service); - componentReference.getPolicySets().addAll(service.getPolicySets()); - componentReference.getRequiredIntents().addAll(service.getRequiredIntents()); - - InterfaceContract interfaceContract = service.getInterfaceContract(); - Service componentTypeService = service.getService(); - if (componentTypeService != null && componentTypeService.getInterfaceContract() != null) { - interfaceContract = componentTypeService.getInterfaceContract(); - } - interfaceContract = getInterfaceContract(interfaceContract, businessInterface); - componentReference.setInterfaceContract(interfaceContract); - componentReference.setMultiplicity(Multiplicity.ONE_ONE); - // component.getReferences().add(componentReference); - return componentReference; - } - - /** - * @param interfaceContract - * @param businessInterface - * @return - * @throws CloneNotSupportedException - * @throws InvalidInterfaceException - */ - private InterfaceContract getInterfaceContract(InterfaceContract interfaceContract, Class businessInterface) - throws CloneNotSupportedException, InvalidInterfaceException { - Interface interfaze = interfaceContract.getInterface(); - boolean compatible = false; - if (interfaze instanceof JavaInterface) { - Class cls = ((JavaInterface)interfaze).getJavaClass(); - if (businessInterface.isAssignableFrom(cls)) { - compatible = true; - } - } - if (!compatible) { - // The interface is not assignable from the interface contract - interfaceContract = (InterfaceContract)interfaceContract.clone(); - interfaceContract.setInterface(javaInterfaceFactory.createJavaInterface(businessInterface)); - } - - return interfaceContract; - } + public abstract ComponentReference createSelfReference(Component component, + ComponentService service, + Class businessInterface) + throws CloneNotSupportedException, InvalidInterfaceException; /** * Bind a component reference to a component service @@ -157,108 +70,79 @@ public class CompositeContext { * @throws CloneNotSupportedException * @throws InvalidInterfaceException */ - public RuntimeComponentReference bindComponentReference(Class businessInterface, - RuntimeComponentReference reference, - RuntimeComponent component, - RuntimeComponentService service) - throws CloneNotSupportedException, InvalidInterfaceException { - RuntimeComponentReference ref = (RuntimeComponentReference)reference.clone(); - InterfaceContract interfaceContract = reference.getInterfaceContract(); - Reference componentTypeReference = reference.getReference(); - if (componentTypeReference != null && componentTypeReference.getInterfaceContract() != null) { - interfaceContract = componentTypeReference.getInterfaceContract(); - } - InterfaceContract refInterfaceContract = getInterfaceContract(interfaceContract, businessInterface); - if (refInterfaceContract != interfaceContract) { - ref = (RuntimeComponentReference)reference.clone(); - ref.setInterfaceContract(interfaceContract); - } - ref.setComponent(component); - ref.getTargets().add(service); - ref.getBindings().clear(); - for (Binding binding : service.getBindings()) { - if (binding instanceof OptimizableBinding) { - OptimizableBinding optimizableBinding = (OptimizableBinding)((OptimizableBinding)binding).clone(); - optimizableBinding.setTargetBinding(binding); - optimizableBinding.setTargetComponent(component); - optimizableBinding.setTargetComponentService(service); - ref.getBindings().add(optimizableBinding); - } else { - ref.getBindings().add(binding); - } - } - return ref; - } - - public void write(Component component, ComponentReference reference, Writer writer) throws IOException { - write(component, reference, null, writer); - } + public abstract RuntimeComponentReference bindComponentReference(Class businessInterface, + RuntimeComponentReference reference, + RuntimeComponent component, + RuntimeComponentService service) + throws CloneNotSupportedException, InvalidInterfaceException; - public void write(Component component, ComponentReference reference, ComponentService service, Writer writer) throws IOException { - try { - StAXArtifactProcessor processor = staxProcessors.getProcessor(Composite.class); - Composite composite = assemblyFactory.createComposite(); - composite.setName(new QName("http://tuscany.apache.org/xmlns/sca/1.0", "default")); - Component comp = assemblyFactory.createComponent(); - comp.setName("default"); - comp.setURI(component.getURI()); - composite.getComponents().add(comp); - if (reference != null) { - comp.getReferences().add(reference); - } - if (service != null) { - comp.getServices().add(service); - } + /** + * @param component + * @param reference + * @param writer + * @throws IOException + */ + public abstract void write(Component component, ComponentReference reference, Writer writer) throws IOException; - XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(writer); - processor.write(composite, streamWriter); - } catch (Exception e) { - throw new IOException(e.getMessage()); - } - } + /** + * @param component + * @param reference + * @param service + * @param writer + * @throws IOException + */ + public abstract void write(Component component, + ComponentReference reference, + ComponentService service, + Writer writer) throws IOException; - public String toXML(Component component, ComponentReference reference) throws IOException { - StringWriter writer = new StringWriter(); - write(component, reference, writer); - return writer.toString(); - } + /** + * @param component + * @param reference + * @return + * @throws IOException + */ + public abstract String toXML(Component component, ComponentReference reference) throws IOException; - public String toXML(Component component, ComponentService service) throws IOException { - StringWriter writer = new StringWriter(); - write(component, null, service, writer); - return writer.toString(); - } + /** + * @param component + * @param service + * @return + * @throws IOException + */ + public abstract String toXML(Component component, ComponentService service) throws IOException; - public RuntimeComponent read(Reader reader) throws IOException { - try { - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLStreamReader streamReader = inputFactory.createXMLStreamReader(reader); - return read(streamReader); - } catch (Exception e) { - throw new IOException(e.getMessage()); - } - } + /** + * @param reader + * @return + * @throws IOException + */ + public abstract RuntimeComponent read(Reader reader) throws IOException; - public RuntimeComponent read(XMLStreamReader streamReader) throws IOException { - try { - StAXArtifactProcessor processor = staxProcessors.getProcessor(Composite.class); - Composite composite = processor.read(streamReader); - RuntimeComponent component = (RuntimeComponent)composite.getComponents().get(0); - return component; - } catch (Exception e) { - throw new IOException(e.getMessage()); - } - } + /** + * @param streamReader + * @return + * @throws IOException + */ + public abstract RuntimeComponent read(XMLStreamReader streamReader) throws IOException; - public Component fromXML(String xml) throws IOException { - return read(new StringReader(xml)); - } + /** + * @param xml + * @return + * @throws IOException + */ + public abstract Component fromXML(String xml) throws IOException; - public Component fromXML(XMLStreamReader streamReader) throws IOException { - return read(streamReader); - } + /** + * @param streamReader + * @return + * @throws IOException + */ + public abstract Component fromXML(XMLStreamReader streamReader) throws IOException; + /** + * @return + */ public static RuntimeComponent getCurrentComponent() { Message message = ThreadMessageContext.getMessageContext(); if (message != null) { @@ -272,15 +156,21 @@ public class CompositeContext { return null; } + /** + * @return + */ public static CompositeActivator getCurrentCompositeActivator() { RuntimeComponent component = getCurrentComponent(); if (component != null) { - ComponentContextImpl context = (ComponentContextImpl)component.getComponentContext(); + ComponentContextExt context = (ComponentContextExt)component.getComponentContext(); return context.getCompositeActivator(); } return null; } + /** + * @return + */ public static CompositeContext getCurrentCompositeContext() { CompositeActivator activator = getCurrentCompositeActivator(); if (activator != null) { @@ -316,8 +206,20 @@ public class CompositeContext { return targetService; } - public ExtensionPointRegistry getExtensionPointRegistry() { - return extensionPointRegistry; - } + public abstract ExtensionPointRegistry getExtensionPointRegistry(); + + public abstract ConversationManager getConversationManager(); + + /** + * Get the java interface factory + * @return + */ + public abstract JavaInterfaceFactory getJavaInterfaceFactory(); + + /** + * Get the proxy factory + * @return + */ + public abstract ProxyFactory getProxyFactory(); } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java index 51da89499d..f1f808d285 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java @@ -19,20 +19,9 @@ package org.apache.tuscany.sca.core.context; -import org.apache.tuscany.sca.assembly.AssemblyFactory; import org.apache.tuscany.sca.context.ComponentContextFactory; -import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint; -import org.apache.tuscany.sca.context.RequestContextFactory; import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; -import org.apache.tuscany.sca.core.UtilityExtensionPoint; -import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.context.impl.ComponentContextImpl; -import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; -import org.apache.tuscany.sca.core.invocation.ProxyFactory; -import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; -import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; -import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.osoa.sca.ComponentContext; @@ -40,50 +29,14 @@ import org.osoa.sca.ComponentContext; * @version $Rev$ $Date$ */ public class DefaultComponentContextFactory implements ComponentContextFactory { - private final CompositeActivator compositeActivator; - private final RequestContextFactory requestContextFactory; - private final ProxyFactory proxyFactory; - private final AssemblyFactory assemblyFactory; - private final JavaInterfaceFactory javaInterfaceFactory; - private final InterfaceContractMapper interfaceContractMapper; + private final ExtensionPointRegistry registry; public DefaultComponentContextFactory(ExtensionPointRegistry registry) { - FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class); - this.assemblyFactory = factories.getFactory(AssemblyFactory.class); - this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); - UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class); - this.compositeActivator = utilities.getUtility(CompositeActivator.class); - this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class); - this.requestContextFactory = - registry.getExtensionPoint(ContextFactoryExtensionPoint.class).getFactory(RequestContextFactory.class); - this.proxyFactory = new ExtensibleProxyFactory(registry.getExtensionPoint(ProxyFactoryExtensionPoint.class)); + this.registry = registry; } - public DefaultComponentContextFactory(CompositeActivator compositeActivator, - AssemblyFactory assemblyFactory, - ProxyFactory proxyFactory, - InterfaceContractMapper interfaceContractMapper, - RequestContextFactory requestContextFactory, - JavaInterfaceFactory javaInterfaceFactory) { - super(); - this.compositeActivator = compositeActivator; - this.assemblyFactory = assemblyFactory; - this.proxyFactory = proxyFactory; - this.requestContextFactory = requestContextFactory; - this.javaInterfaceFactory = javaInterfaceFactory; - this.interfaceContractMapper = interfaceContractMapper; - } - - /** - * @see org.apache.tuscany.sca.context.ComponentContextFactory#createComponentContext(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.context.RequestContextFactory) - */ - public ComponentContext createComponentContext(RuntimeComponent component, - RequestContextFactory requestContextFactory) { - if (requestContextFactory == null) { - requestContextFactory = this.requestContextFactory; - } - return new ComponentContextImpl(compositeActivator, assemblyFactory, proxyFactory, interfaceContractMapper, - requestContextFactory, javaInterfaceFactory, component); + public ComponentContext createComponentContext(RuntimeComponent component) { + return new ComponentContextImpl(registry, component); } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java index 901a642f1c..71410b7e35 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java @@ -88,7 +88,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { private transient RuntimeComponentReference clonedRef; private transient ReferenceParameters refParams; private transient XMLStreamReader xmlReader; - + private transient RuntimeWire endpointWire; /* @@ -138,7 +138,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { // FIXME: Should we normalize the componentName/serviceName URI into an absolute SCA URI in the SCA binding? // sca:component1/component11/component112/service1? this.compositeActivator = compositeActivator; - this.conversationManager = this.compositeActivator.getConversationManager(); + this.conversationManager = this.compositeActivator.getCompositeContext().getConversationManager(); initCallbackID(); } @@ -151,7 +151,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { public RuntimeWire getRuntimeWire() { try { resolve(); - if (endpointWire != null){ + if (endpointWire != null) { return endpointWire; } else if (reference != null) { return reference.getRuntimeWire(binding); @@ -165,15 +165,15 @@ public class CallableReferenceImpl implements CallableReferenceExt { protected void bind(RuntimeWire wire) { if (wire != null) { - - if (wire instanceof EndpointWireImpl){ + + if (wire instanceof EndpointWireImpl) { endpointWire = wire; } this.component = wire.getSource().getComponent(); this.reference = (RuntimeComponentReference)wire.getSource().getContract(); this.binding = wire.getSource().getBinding(); this.compositeActivator = ((ComponentContextExt)component.getComponentContext()).getCompositeActivator(); - this.conversationManager = this.compositeActivator.getConversationManager(); + this.conversationManager = this.compositeActivator.getCompositeContext().getConversationManager(); initCallbackID(); } } @@ -189,7 +189,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { public B getProxy() throws ObjectCreationException { try { if (proxy == null) { - proxy = createProxy(); + proxy = createProxy(); } return businessInterface.cast(proxy); } catch (Exception e) { @@ -197,13 +197,13 @@ public class CallableReferenceImpl implements CallableReferenceExt { } } - public void setProxy(Object proxy) { - this.proxy = proxy; - } + public void setProxy(Object proxy) { + this.proxy = proxy; + } protected Object createProxy() throws Exception { return proxyFactory.createProxy(this); - } + } public B getService() { try { @@ -220,12 +220,12 @@ public class CallableReferenceImpl implements CallableReferenceExt { return businessInterface; } catch (Exception e) { throw new ServiceRuntimeException(e); - } + } } public boolean isConversational() { try { - resolve(); + resolve(); return reference == null ? false : reference.getInterfaceContract().getInterface().isConversational(); } catch (Exception e) { throw new ServiceRuntimeException(e); @@ -237,12 +237,12 @@ public class CallableReferenceImpl implements CallableReferenceExt { // resolve from XML just in case this CallableReference is the result of // passing a CallableReference as a parameter resolve(); - + if (conversation == null || conversation.getState() == ConversationState.ENDED) { conversation = null; } return conversation; - + } catch (Exception e) { throw new ServiceRuntimeException(e); } @@ -250,11 +250,11 @@ public class CallableReferenceImpl implements CallableReferenceExt { public Object getCallbackID() { try { - resolve(); + resolve(); return callbackID; } catch (Exception e) { throw new ServiceRuntimeException(e); - } + } } /** @@ -277,14 +277,14 @@ public class CallableReferenceImpl implements CallableReferenceExt { CompositeContext componentContextHelper = CompositeContext.getCurrentCompositeContext(); if (componentContextHelper != null) { this.compositeActivator = CompositeContext.getCurrentCompositeActivator(); - this.conversationManager = this.compositeActivator.getConversationManager(); + this.conversationManager = componentContextHelper.getConversationManager(); Component c; if (xmlReader != null) { c = componentContextHelper.fromXML(xmlReader); - xmlReader = null; // OK to GC this now + xmlReader = null; // OK to GC this now } else { c = componentContextHelper.fromXML(scdl); - scdl = null; // OK to GC this now + scdl = null; // OK to GC this now } this.component = (RuntimeComponent)c; compositeActivator.configureComponentContext(this.component); @@ -309,21 +309,21 @@ public class CallableReferenceImpl implements CallableReferenceExt { // Resolve the Component final String bindingURI = binding.getURI(); final Component targetComponent = resolveComponentURI(bindingURI); - + // Find the Service ComponentService targetService = resolveServiceURI(bindingURI, targetComponent); - + // if the target service is a promoted service then find the // service it promotes if ((targetService != null) && (targetService.getService() instanceof CompositeService)) { - CompositeService compositeService = (CompositeService) targetService.getService(); + CompositeService compositeService = (CompositeService)targetService.getService(); // Find the promoted component service ComponentService promotedComponentService = getPromotedComponentService(compositeService); if (promotedComponentService != null && !promotedComponentService.isUnresolved()) { targetService = promotedComponentService; } } - + OptimizableBinding optimizableBinding = (OptimizableBinding)binding; optimizableBinding.setTargetComponent(targetComponent); optimizableBinding.setTargetComponentService(targetService); @@ -357,28 +357,28 @@ public class CallableReferenceImpl implements CallableReferenceExt { } }); javaInterface.setJavaClass(classLoader.loadClass(javaInterface.getName())); - compositeActivator.getJavaInterfaceFactory().createJavaInterface(javaInterface, - javaInterface.getJavaClass()); + compositeActivator.getCompositeContext().getJavaInterfaceFactory() + .createJavaInterface(javaInterface, javaInterface.getJavaClass()); //FIXME: If the interface needs XSDs to be loaded (e.g., for static SDO), // this needs to be done here. We usually search for XSDs in the current // contribution at resolve time. Is it possible to locate the current // contribution at runtime? - } + } this.businessInterface = (Class)javaInterface.getJavaClass(); } if (binding instanceof BindingBuilderExtension) { ((BindingBuilderExtension)binding).getBuilder().build(component, reference, binding, null); } - this.proxyFactory = compositeActivator.getProxyFactory(); + this.proxyFactory = compositeActivator.getCompositeContext().getProxyFactory(); } } else { this.compositeActivator = CompositeContext.getCurrentCompositeActivator(); if (this.compositeActivator != null) { - this.proxyFactory = this.compositeActivator.getProxyFactory(); + this.proxyFactory = this.compositeActivator.getCompositeContext().getProxyFactory(); } } } - + /** * Follow a service promotion chain down to the inner most (non composite) * component service. @@ -386,26 +386,26 @@ public class CallableReferenceImpl implements CallableReferenceExt { * @param topCompositeService * @return */ - private ComponentService getPromotedComponentService(CompositeService compositeService) { + private ComponentService getPromotedComponentService(CompositeService compositeService) { ComponentService componentService = compositeService.getPromotedService(); if (componentService != null) { Service service = componentService.getService(); if (componentService.getName() != null && service instanceof CompositeService) { - + // Continue to follow the service promotion chain return getPromotedComponentService((CompositeService)service); - + } else { - + // Found a non-composite service return componentService; } } else { - + // No promoted service return null; } - } + } /** * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) @@ -436,29 +436,28 @@ public class CallableReferenceImpl implements CallableReferenceExt { } if (refParams == null) { refParams = new ReferenceParametersImpl(); - + // remove any existing reference parameters from the clone Object toRemove = null; - for (Object extension : clonedRef.getExtensions()){ - if (extension instanceof ReferenceParameters){ + for (Object extension : clonedRef.getExtensions()) { + if (extension instanceof ReferenceParameters) { toRemove = extension; } } - - if (toRemove != null){ + + if (toRemove != null) { clonedRef.getExtensions().remove(toRemove); } - + // add the new reference parameter object clonedRef.getExtensions().add(refParams); } refParams.setCallbackID(callbackID); - if (conversation != null){ + if (conversation != null) { refParams.setConversationID(conversation.getConversationID()); } - return ((CompositeActivatorImpl)compositeActivator).getCompositeContext() - .toXML(component, clonedRef); - } else { + return ((CompositeActivatorImpl)compositeActivator).getCompositeContext().toXML(component, clonedRef); + } else { return scdl; } } @@ -479,7 +478,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { public void attachConversationID(Object conversationID) { this.conversationID = conversationID; } - + public void attachConversation(ConversationExt conversation) { this.conversation = conversation; } @@ -487,7 +486,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { public void attachConversation(Object conversationID) { if (conversationID != null) { ConversationExt conversation = conversationManager.getConversation(conversationID); - if (conversation == null){ + if (conversation == null) { conversation = conversationManager.startConversation(conversationID); } this.conversation = conversation; @@ -507,8 +506,8 @@ public class CallableReferenceImpl implements CallableReferenceExt { public EndpointReference getEndpointReference() { try { - resolve(); - + resolve(); + // Use the interface contract of the reference on the component type Reference componentTypeRef = reference.getReference(); InterfaceContract sourceContract = @@ -520,7 +519,7 @@ public class CallableReferenceImpl implements CallableReferenceExt { return epr; } catch (Exception e) { throw new ServiceRuntimeException(e); - } + } } public XMLStreamReader getXMLReader() { @@ -571,14 +570,14 @@ public class CallableReferenceImpl implements CallableReferenceExt { * @return The Service with the specified serviceName or null if no such Service found. */ protected ComponentService resolveServiceURI(String bindingURI, Component targetComponent) { - + ComponentService targetService = null; - + if (targetComponent != null) { if (bindingURI.startsWith("/")) { bindingURI = bindingURI.substring(1); } - + final String componentURI = targetComponent.getURI(); final String serviceName; if (componentURI.equals(bindingURI)) { diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java index 9538eb755f..d35d02aa1b 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java @@ -34,16 +34,20 @@ import org.apache.tuscany.sca.assembly.Multiplicity; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint; import org.apache.tuscany.sca.context.PropertyValueFactory; import org.apache.tuscany.sca.context.RequestContextFactory; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.core.UtilityExtensionPoint; import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.context.ComponentContextExt; import org.apache.tuscany.sca.core.context.CompositeContext; +import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.interfacedef.InterfaceContract; -import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; @@ -68,30 +72,19 @@ public class ComponentContextImpl implements ComponentContextExt { private final ProxyFactory proxyFactory; private final AssemblyFactory assemblyFactory; private final JavaInterfaceFactory javaInterfaceFactory; - - /** - * This is a reference to the PropertyValueFactory that is provided by the Implementation - * that can be used to get the value from a Property Object. - * - * @see #setPropertyValueFactory(PropertyValueFactory) - * @see #getProperty(Class, String) - */ - private PropertyValueFactory propertyFactory; - - public ComponentContextImpl(CompositeActivator compositeActivator, - AssemblyFactory assemblyFactory, - ProxyFactory proxyFactory, - InterfaceContractMapper interfaceContractMapper, - RequestContextFactory requestContextFactory, - JavaInterfaceFactory javaInterfaceFactory, - RuntimeComponent component) { - super(); - this.compositeActivator = compositeActivator; - this.assemblyFactory = assemblyFactory; - this.proxyFactory = proxyFactory; - this.requestContextFactory = requestContextFactory; - this.javaInterfaceFactory = javaInterfaceFactory; + private final PropertyValueFactory propertyFactory; + + public ComponentContextImpl(ExtensionPointRegistry registry, RuntimeComponent component) { this.component = component; + FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class); + this.assemblyFactory = factories.getFactory(AssemblyFactory.class); + this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); + UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class); + this.compositeActivator = utilities.getUtility(CompositeActivator.class); + this.requestContextFactory = + registry.getExtensionPoint(ContextFactoryExtensionPoint.class).getFactory(RequestContextFactory.class); + this.proxyFactory = new ExtensibleProxyFactory(registry.getExtensionPoint(ProxyFactoryExtensionPoint.class)); + this.propertyFactory = factories.getFactory(PropertyValueFactory.class); } public String getURI() { @@ -131,19 +124,6 @@ public class ComponentContextImpl implements ComponentContextExt { } } - /** - * The Implementation is responsible for calling this method to set the - * PropertyValueFactory that is used to get the Property Value from - * a Tuscany Property object. - * - * @param factory The PropertyValueFactory to use - * - * @see #getProperty(Class, String) - */ - public void setPropertyValueFactory(PropertyValueFactory factory) { - propertyFactory = factory; - } - /** * Gets the value for the specified property with the specified type. * @@ -455,8 +435,12 @@ public class ComponentContextImpl implements ComponentContextExt { } /* ******************** Contribution for issue TUSCANY-2281 ******************** */ + public CompositeContext getCompositeContext() { + return compositeActivator.getCompositeContext(); + } + public ExtensionPointRegistry getExtensionPointRegistry() { - return compositeActivator.getCompositeContext().getExtensionPointRegistry(); + return getCompositeContext().getExtensionPointRegistry(); } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CompositeContextImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CompositeContextImpl.java new file mode 100644 index 0000000000..71f4e2c9a1 --- /dev/null +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CompositeContextImpl.java @@ -0,0 +1,355 @@ +/* + * 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.context.impl; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Binding; +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.Multiplicity; +import org.apache.tuscany.sca.assembly.OptimizableBinding; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.core.UtilityExtensionPoint; +import org.apache.tuscany.sca.core.assembly.CompositeActivator; +import org.apache.tuscany.sca.core.context.CompositeContext; +import org.apache.tuscany.sca.core.conversation.ConversationManager; +import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; +import org.apache.tuscany.sca.core.invocation.ThreadMessageContext; +import org.apache.tuscany.sca.interfacedef.Interface; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; +import org.apache.tuscany.sca.invocation.Message; +import org.apache.tuscany.sca.runtime.EndpointReference; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; +import org.osoa.sca.ServiceRuntimeException; + +/** + * @version $Rev$ $Date$ + */ +public class CompositeContextImpl extends CompositeContext { + private final ExtensionPointRegistry extensionPointRegistry; + private final UtilityExtensionPoint utilityExtensionPoint; + private final AssemblyFactory assemblyFactory; + private final JavaInterfaceFactory javaInterfaceFactory; + private final StAXArtifactProcessorExtensionPoint staxProcessors; + private final XMLInputFactory xmlInputFactory; + private final XMLOutputFactory xmlOutputFactory; + private final ProxyFactory proxyFactory; + + public CompositeContextImpl(ExtensionPointRegistry registry) { + this.extensionPointRegistry = registry; + this.utilityExtensionPoint = extensionPointRegistry.getExtensionPoint(UtilityExtensionPoint.class); + FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class); + this.xmlInputFactory = factories.getFactory(XMLInputFactory.class); + this.xmlOutputFactory = factories.getFactory(XMLOutputFactory.class); + this.assemblyFactory = factories.getFactory(AssemblyFactory.class); + this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); + this.staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); + ProxyFactoryExtensionPoint proxyFactories = extensionPointRegistry.getExtensionPoint(ProxyFactoryExtensionPoint.class); + this.proxyFactory = new ExtensibleProxyFactory(proxyFactories); + } + + /** + * Create a self-reference for a component service + * @param component + * @param service + * @throws CloneNotSupportedException + * @throws InvalidInterfaceException + */ + public ComponentReference createSelfReference(Component component, + ComponentService service, + Class businessInterface) throws CloneNotSupportedException, + InvalidInterfaceException { + ComponentReference componentReference = assemblyFactory.createComponentReference(); + componentReference.setName("$self$." + service.getName()); + for (Binding binding : service.getBindings()) { + if (binding instanceof OptimizableBinding) { + OptimizableBinding optimizableBinding = (OptimizableBinding)((OptimizableBinding)binding).clone(); + optimizableBinding.setTargetBinding(binding); + optimizableBinding.setTargetComponent(component); + optimizableBinding.setTargetComponentService(service); + componentReference.getBindings().add(optimizableBinding); + } else { + componentReference.getBindings().add(binding); + } + } + + componentReference.setCallback(service.getCallback()); + componentReference.getTargets().add(service); + componentReference.getPolicySets().addAll(service.getPolicySets()); + componentReference.getRequiredIntents().addAll(service.getRequiredIntents()); + + InterfaceContract interfaceContract = service.getInterfaceContract(); + Service componentTypeService = service.getService(); + if (componentTypeService != null && componentTypeService.getInterfaceContract() != null) { + interfaceContract = componentTypeService.getInterfaceContract(); + } + interfaceContract = getInterfaceContract(interfaceContract, businessInterface); + componentReference.setInterfaceContract(interfaceContract); + componentReference.setMultiplicity(Multiplicity.ONE_ONE); + // component.getReferences().add(componentReference); + return componentReference; + } + + /** + * @param interfaceContract + * @param businessInterface + * @return + * @throws CloneNotSupportedException + * @throws InvalidInterfaceException + */ + private InterfaceContract getInterfaceContract(InterfaceContract interfaceContract, Class businessInterface) + throws CloneNotSupportedException, InvalidInterfaceException { + Interface interfaze = interfaceContract.getInterface(); + boolean compatible = false; + if (interfaze instanceof JavaInterface) { + Class cls = ((JavaInterface)interfaze).getJavaClass(); + if (businessInterface.isAssignableFrom(cls)) { + compatible = true; + } + } + if (!compatible) { + // The interface is not assignable from the interface contract + interfaceContract = (InterfaceContract)interfaceContract.clone(); + interfaceContract.setInterface(javaInterfaceFactory.createJavaInterface(businessInterface)); + } + + return interfaceContract; + } + + /** + * Bind a component reference to a component service + * @param + * @param businessInterface + * @param reference + * @param service + * @return + * @throws CloneNotSupportedException + * @throws InvalidInterfaceException + */ + public RuntimeComponentReference bindComponentReference(Class businessInterface, + RuntimeComponentReference reference, + RuntimeComponent component, + RuntimeComponentService service) + throws CloneNotSupportedException, InvalidInterfaceException { + RuntimeComponentReference ref = (RuntimeComponentReference)reference.clone(); + InterfaceContract interfaceContract = reference.getInterfaceContract(); + Reference componentTypeReference = reference.getReference(); + if (componentTypeReference != null && componentTypeReference.getInterfaceContract() != null) { + interfaceContract = componentTypeReference.getInterfaceContract(); + } + InterfaceContract refInterfaceContract = getInterfaceContract(interfaceContract, businessInterface); + if (refInterfaceContract != interfaceContract) { + ref = (RuntimeComponentReference)reference.clone(); + ref.setInterfaceContract(interfaceContract); + } + ref.setComponent(component); + ref.getTargets().add(service); + ref.getBindings().clear(); + for (Binding binding : service.getBindings()) { + if (binding instanceof OptimizableBinding) { + OptimizableBinding optimizableBinding = (OptimizableBinding)((OptimizableBinding)binding).clone(); + optimizableBinding.setTargetBinding(binding); + optimizableBinding.setTargetComponent(component); + optimizableBinding.setTargetComponentService(service); + ref.getBindings().add(optimizableBinding); + } else { + ref.getBindings().add(binding); + } + } + return ref; + } + + public void write(Component component, ComponentReference reference, Writer writer) throws IOException { + write(component, reference, null, writer); + } + + public void write(Component component, ComponentReference reference, ComponentService service, Writer writer) throws IOException { + try { + StAXArtifactProcessor processor = staxProcessors.getProcessor(Composite.class); + Composite composite = assemblyFactory.createComposite(); + composite.setName(new QName("http://tuscany.apache.org/xmlns/sca/1.0", "default")); + Component comp = assemblyFactory.createComponent(); + comp.setName("default"); + comp.setURI(component.getURI()); + composite.getComponents().add(comp); + if (reference != null) { + comp.getReferences().add(reference); + } + if (service != null) { + comp.getServices().add(service); + } + + XMLStreamWriter streamWriter = xmlOutputFactory.createXMLStreamWriter(writer); + processor.write(composite, streamWriter); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + public String toXML(Component component, ComponentReference reference) throws IOException { + StringWriter writer = new StringWriter(); + write(component, reference, writer); + return writer.toString(); + } + + public String toXML(Component component, ComponentService service) throws IOException { + StringWriter writer = new StringWriter(); + write(component, null, service, writer); + return writer.toString(); + } + + public RuntimeComponent read(Reader reader) throws IOException { + try { + XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(reader); + return read(streamReader); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + public RuntimeComponent read(XMLStreamReader streamReader) throws IOException { + try { + StAXArtifactProcessor processor = staxProcessors.getProcessor(Composite.class); + Composite composite = processor.read(streamReader); + RuntimeComponent component = (RuntimeComponent)composite.getComponents().get(0); + return component; + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + public Component fromXML(String xml) throws IOException { + return read(new StringReader(xml)); + } + + public Component fromXML(XMLStreamReader streamReader) throws IOException { + return read(streamReader); + } + + public static RuntimeComponent getCurrentComponent() { + Message message = ThreadMessageContext.getMessageContext(); + if (message != null) { + EndpointReference to = message.getTo(); + if (to == null) { + return null; + } + RuntimeComponent component = message.getTo().getComponent(); + return component; + } + return null; + } + + public static CompositeActivator getCurrentCompositeActivator() { + RuntimeComponent component = getCurrentComponent(); + if (component != null) { + ComponentContextImpl context = (ComponentContextImpl)component.getComponentContext(); + return context.getCompositeActivator(); + } + return null; + } + + public static CompositeContext getCurrentCompositeContext() { + CompositeActivator activator = getCurrentCompositeActivator(); + if (activator != null) { + return activator.getCompositeContext(); + } + return null; + } + + /** + * @param component + */ + public static ComponentService getSingleService(Component component) { + ComponentService targetService; + List services = component.getServices(); + List regularServices = new ArrayList(); + for (ComponentService service : services) { + if (service.isCallback()) { + continue; + } + String name = service.getName(); + if (!name.startsWith("$") || name.startsWith("$dynamic$")) { + regularServices.add(service); + } + } + if (regularServices.size() == 0) { + throw new ServiceRuntimeException("No service is declared on component " + component.getURI()); + } + if (regularServices.size() != 1) { + throw new ServiceRuntimeException("More than one service is declared on component " + component.getURI() + + ". Service name is required to get the service."); + } + targetService = regularServices.get(0); + return targetService; + } + + public ExtensionPointRegistry getExtensionPointRegistry() { + return extensionPointRegistry; + } + + public ConversationManager getConversationManager() { + return utilityExtensionPoint.getUtility(ConversationManager.class); + } + + /** + * Get the java interface factory + * @return + */ + public JavaInterfaceFactory getJavaInterfaceFactory() { + return javaInterfaceFactory; + } + + /** + * Get the proxy factory + * @return + */ + public ProxyFactory getProxyFactory() { + return proxyFactory; + } + +} diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java index bd4a49a71a..5f57d26456 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java @@ -24,6 +24,7 @@ import javax.security.auth.Subject; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.context.CallableReferenceExt; +import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.core.invocation.ThreadMessageContext; @@ -101,8 +102,7 @@ public class RequestContextImpl implements RequestContext { JavaInterface javaInterface = (JavaInterface) callbackReference.getInterfaceContract().getInterface(); Class javaClass = (Class)javaInterface.getJavaClass(); List wires = callbackReference.getRuntimeWires(); - ProxyFactory proxyFactory = javaClass.isInterface() ? proxyFactoryExtensionPoint.getInterfaceProxyFactory() : - proxyFactoryExtensionPoint.getClassProxyFactory(); + ProxyFactory proxyFactory = new ExtensibleProxyFactory(proxyFactoryExtensionPoint); CallbackReferenceImpl ref = CallbackReferenceImpl.newInstance(javaClass, proxyFactory, wires); if (ref != null) { //ref.resolveTarget(); -- cgit v1.2.3