summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl')
-rw-r--r--sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallbackServiceReferenceImpl.java292
-rw-r--r--sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java558
-rw-r--r--sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java126
-rw-r--r--sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ServiceReferenceImpl.java430
4 files changed, 1406 insertions, 0 deletions
diff --git a/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallbackServiceReferenceImpl.java b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallbackServiceReferenceImpl.java
new file mode 100644
index 0000000000..4c206ec5db
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallbackServiceReferenceImpl.java
@@ -0,0 +1,292 @@
+/*
+ * 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.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.SCABinding;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilder;
+import org.apache.tuscany.sca.assembly.builder.BuilderContext;
+import org.apache.tuscany.sca.context.CompositeContext;
+import org.apache.tuscany.sca.context.ThreadMessageContext;
+import org.apache.tuscany.sca.core.invocation.CallbackHandler;
+import org.apache.tuscany.sca.core.invocation.Constants;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+import org.oasisopen.sca.ServiceRuntimeException;
+
+/**
+ * Represent the reference to the callback service. This class basically wraps a Tuscany EndpointReference.
+ * The callback EPR is selected based on the are 3 basic scenarios we are trying to cater for
+ *
+ * A/ <component name="MyComponent">
+ * <service name="MyService>
+ * blank OR <binding.sca/>
+ * </service>
+ * </component>
+ *
+ * B/ <component name="MyComponent">
+ * <service name="MyService>
+ * <binding.someremotebinding/>
+ * </service>
+ * </component>
+ *
+ * C/ <component name="MyComponent">
+ * <service name="MyService>
+ * some binding
+ * <callback>
+ * <binding.someremotebinding/>
+ * </callback>
+ * </service>
+ * </component>
+ *
+ * A - the callback binding will default to binding.sca and the expectation is that
+ * the callback endpoint will be established by looking it up in the registry
+ * hence the forward call must contain the SCA target name referring to the
+ * callback service
+ *
+ * B - the callback binding defaults to be the forward binding taking all of its
+ * configuration. The callback target URI is taken from the forward message and
+ * put into the callback binding URI
+ *
+ * C - the callback binding is as specified by the user. If the user has not specified
+ * a binding URI then the URI from the forward message will be placed in the
+ * callback binding URI. This may or may not lead to happiness depending on whether
+ * the forward and callback bindings are compatible
+ *
+ * The callback proxy, and this class, is instantiated whenever a new callback proxy is
+ * required as follows:
+ *
+ * If the service component implementation is STATELESS then each incoming message
+ * creates a new service instance and hence a new set of callback proxies
+ *
+ * If the service component implementation is COMPOSITE then only a single instance
+ * of the component implementation will exist and the callback proxy will be retrieved
+ * via the RequestContext.
+ *
+ * Following the Tuscany runtime model for normal references we don't cache callback
+ * proxies across component implementation instances. Hence there will be one
+ * instance of this class for each callback proxy, however created, and the class
+ * will refer to a single callback service. To put it another way, messages from
+ * multiple clients (presenting different callback services) will be called back to
+ * via different callback proxies and hence a single instance of this class will
+ * not be required to handle more than one callback address.
+ *
+ */
+public class CallbackServiceReferenceImpl<B> extends ServiceReferenceImpl<B> {
+ private static final Logger logger = Logger.getLogger(CallbackServiceReferenceImpl.class.getName());
+ private RuntimeEndpointReference callbackEPR;
+ private List<? extends EndpointReference> callbackEPRs;
+ private Endpoint resolvedEndpoint;
+ // Holds the ID of the Message that caused the creation of this CallbackServiceReference
+ private String msgID;
+
+ // Holds the URI of the target callback service from the Message that caused the
+ // creation of this CallbackServiceReference
+ private CallbackHandler callbackHandler;
+
+ /*
+ * Public constructor for Externalizable serialization/deserialization
+ * TODO - we need to serialize the msgID and callbackURI
+ */
+ public CallbackServiceReferenceImpl() {
+ super();
+ }
+
+ public CallbackServiceReferenceImpl(Class<B> interfaze,
+ List<? extends EndpointReference> callbackEPRs) {
+ super(interfaze, null, getCompositeContext(callbackEPRs));
+ this.callbackEPRs = callbackEPRs;
+
+ Message msgContext = ThreadMessageContext.getMessageContext();
+
+ // Capture the Message ID from the message which caused the creation of this
+ // CallBackServiceReference
+ this.msgID = (String) msgContext.getHeaders().get(Constants.MESSAGE_ID);
+
+ // Capture the callback URI from the message which caused the creation of this
+ // CallBackServiceReference. This code is more complex that needs be for the time being
+ // to cater for bindings that still use the approach of constructing a callback endpoint
+ // to model the callback URI. With these changes the binding can just set a CallbackHandler
+ // in the forward message to get the same effect. Some bindings don't do that hence
+ // the various checks
+ this.resolvedEndpoint = null;
+
+ if (msgContext.getFrom() != null){
+ resolvedEndpoint = msgContext.getFrom().getCallbackEndpoint();
+ }
+
+ if (resolvedEndpoint != null){
+ if (resolvedEndpoint.getBinding() == null){
+ this.callbackHandler = new CallbackHandler(resolvedEndpoint.getURI());
+ } else if (resolvedEndpoint.getBinding().getType().equals(SCABinding.TYPE)){
+ this.callbackHandler = new CallbackHandler(resolvedEndpoint.getURI());
+ } else {
+ this.callbackHandler = new CallbackHandler(resolvedEndpoint.getBinding().getURI());
+ }
+ } else {
+ this.callbackHandler = (CallbackHandler)msgContext.getHeaders().get(Constants.CALLBACK);
+
+ if (callbackHandler == null){
+ this.callbackHandler = new CallbackHandler(null);
+ }
+ }
+
+ if (callbackHandler.getCallbackTargetURI() != null){
+ logger.log(Level.FINE, "Selecting callback EPR using address from forward message: " + callbackHandler.getCallbackTargetURI());
+ } else {
+ logger.log(Level.FINE, "Selecting callback EPR using address but callback URI is null");
+ }
+
+ // Work out which callback EPR to use
+ callbackEPR = selectCallbackEPR(msgContext);
+ if (callbackEPR == null) {
+ throw new ServiceRuntimeException("No callback binding found for " + msgContext.getTo().toString());
+ }
+
+ // configure the callback EPR with the callback address
+ if (callbackHandler.getCallbackTargetURI() != null) {
+ callbackEPR = setCallbackAddress(callbackEPR);
+ }
+
+ this.resolvedEndpoint = callbackEPR.getTargetEndpoint();
+ }
+
+ public CallbackHandler getCallbackHandler() {
+ return callbackHandler;
+ }
+
+ /**
+ * Gets the message ID associated with this callback reference. All calls through the proxy backed by
+ * this CallbackServiceReference will use the same msgID
+ *
+ * @return the message ID
+ */
+ public String getMsgID() {
+ return msgID;
+ }
+
+
+ private static CompositeContext getCompositeContext(List<? extends EndpointReference> callbackEPRs) {
+ if(!callbackEPRs.isEmpty()) {
+ RuntimeEndpointReference epr = (RuntimeEndpointReference) callbackEPRs.get(0);
+ return epr.getCompositeContext();
+ }
+ return null;
+ }
+
+ @Override
+ protected B createProxy() throws Exception {
+ return proxyFactory.createCallbackProxy(this);
+ }
+
+ public RuntimeEndpointReference getCallbackEPR() {
+ return callbackEPR;
+ }
+
+ public Endpoint getResolvedEndpoint() {
+ return resolvedEndpoint;
+ }
+
+ private RuntimeEndpointReference selectCallbackEPR(Message msgContext) {
+
+ // look for callback binding with same name as service binding
+ Endpoint to = msgContext.getTo();
+ if (to == null) {
+ //FIXME: need better exception
+ throw new ServiceRuntimeException("Destination for forward call is not available");
+ }
+ for (EndpointReference epr : callbackEPRs) {
+ if (epr.getBinding().getName().equals(to.getBinding().getName())) {
+ return (RuntimeEndpointReference) epr;
+ }
+ }
+
+ // if no match, look for callback binding with same type as service binding
+ for (EndpointReference epr : callbackEPRs) {
+ if (epr.getBinding().getType().equals(to.getBinding().getType())) {
+ return (RuntimeEndpointReference) epr;
+ }
+ }
+
+ // no suitable callback wire was found
+ return null;
+ }
+
+ private RuntimeEndpointReference setCallbackAddress(RuntimeEndpointReference endpointReference) {
+ try {
+
+ RuntimeEndpointReference epr = endpointReference;
+
+ if (callbackHandler.getCloneCallbackWire()){
+ epr = (RuntimeEndpointReference)endpointReference.clone();
+ }
+
+ // TUSCANY-3932
+ // If it's the default binding then we're going to look the callback endpoint
+ // up in the registry. Most remote protocols, which may be used as delegates
+ // for binding.sca, will expect to deal with absolute URLs so flip the
+ // callback endpoint back to force the lookup to happen
+ if (epr.getBinding().getType().equals(SCABinding.TYPE)){
+ // A/ create a callback endpoint to allow the
+ // callback lookup to take place
+ epr.setStatus(EndpointReference.Status.WIRED_TARGET_NOT_FOUND);
+
+ // if an endpoint it provided in the forward message use it or
+ // if not create one
+ if (resolvedEndpoint == null ){
+ RuntimeEndpoint callbackEndpoint = (RuntimeEndpoint)assemblyFactory.createEndpoint();
+ callbackEndpoint.setURI(callbackHandler.getCallbackTargetURI());
+ callbackEndpoint.setUnresolved(true);
+ epr.setTargetEndpoint(callbackEndpoint);
+ } else {
+ epr.setTargetEndpoint(resolvedEndpoint);
+ }
+ } else {
+ // B/ and C/ assume that the callback EPR is already resolved
+ // and set the binding URI if one is provided with the
+ // forward message. Some bindings may want to do other
+ // things to determine the callback URI to the
+ // CallbackHandler will be sent in the callback message
+ // header. This is particularly true if the clone isn't
+ // called above because resetting the URI will not
+ // be thread safe.
+ epr.setStatus(EndpointReference.Status.RESOLVED_BINDING);
+
+ if ( callbackHandler.getCallbackTargetURI() != null ){
+ epr.getBinding().setURI(callbackHandler.getCallbackTargetURI());
+ } else {
+ // do nothing and rely on whatever the user has configured
+ // in the SCDL
+ }
+ }
+
+ return epr;
+ } catch (CloneNotSupportedException e) {
+ // will not happen
+ throw new ServiceRuntimeException(e);
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java
new file mode 100644
index 0000000000..18587b2f6d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java
@@ -0,0 +1,558 @@
+/*
+ * 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.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+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.ComponentProperty;
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.assembly.ComponentService;
+import org.apache.tuscany.sca.assembly.CompositeService;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.Multiplicity;
+import org.apache.tuscany.sca.assembly.SCABinding;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.context.CompositeContext;
+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.invocation.ProxyFactory;
+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.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.runtime.CompositeActivator;
+import org.apache.tuscany.sca.runtime.EndpointReferenceBinder;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentContext;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+import org.apache.tuscany.sca.runtime.TuscanyServiceReference;
+import org.oasisopen.sca.RequestContext;
+import org.oasisopen.sca.ServiceReference;
+import org.oasisopen.sca.ServiceRuntimeException;
+
+/**
+ * Implementation of ComponentContext that delegates to a ComponentContextProvider.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ComponentContextImpl implements RuntimeComponentContext {
+ private final RuntimeComponent component;
+
+ private final CompositeContext compositeContext;
+ private final CompositeActivator compositeActivator;
+ private final RequestContextFactory requestContextFactory;
+ private final ProxyFactory proxyFactory;
+ private final AssemblyFactory assemblyFactory;
+ private final JavaInterfaceFactory javaInterfaceFactory;
+ private final PropertyValueFactory propertyFactory;
+ private final EndpointReferenceBinder eprBinder;
+ private final ExtensionPointRegistry registry;
+
+ public ComponentContextImpl(ExtensionPointRegistry registry,
+ AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaInterfaceFactory,
+ CompositeActivator compositeActivator,
+ RequestContextFactory requestContextFactory,
+ PropertyValueFactory propertyFactory,
+ EndpointReferenceBinder eprBinder,
+ ProxyFactory proxyFactory,
+ CompositeContext compositeContext,
+ RuntimeComponent component) {
+ this.registry = registry;
+ this.assemblyFactory = assemblyFactory;
+ this.javaInterfaceFactory = javaInterfaceFactory;
+ this.compositeActivator = compositeActivator;
+ this.requestContextFactory = requestContextFactory;
+ this.propertyFactory = propertyFactory;
+ this.eprBinder = eprBinder;
+ this.proxyFactory = proxyFactory;
+ this.compositeContext = compositeContext;
+ this.component = component;
+ }
+
+ public String getURI() {
+ return component.getURI();
+ }
+
+ public <B> ServiceReference<B> cast(B target) throws IllegalArgumentException {
+ return proxyFactory.cast(target);
+ }
+
+ public <B> B getService(Class<B> businessInterface, String referenceName) throws IllegalArgumentException {
+ B service = null;
+
+ ServiceReference<B> serviceRef = getServiceReference(businessInterface, referenceName);
+ if (serviceRef != null) {
+ service = serviceRef.getService();
+ }
+
+ return service;
+ }
+
+ public <B> TuscanyServiceReference<B> getServiceReference(Class<B> businessInterface, String referenceName)
+ throws IllegalArgumentException {
+
+ for (ComponentReference ref : component.getReferences()) {
+ if (referenceName.equals(ref.getName())) {
+ Multiplicity multiplicity = ref.getMultiplicity();
+ if (multiplicity == Multiplicity.ZERO_N || multiplicity == Multiplicity.ONE_N) {
+ throw new IllegalArgumentException("Reference " + referenceName
+ + " has multiplicity "
+ + multiplicity);
+ }
+ if (ref.getEndpointReferences().size() < 1) {
+ return null;
+ }
+ TuscanyServiceReference<B> sr =
+ getServiceReference(businessInterface, (RuntimeEndpointReference)getEndpointReference(ref));
+ if (sr == null) {
+ throw new IllegalArgumentException("Reference " + referenceName + " is null");
+ }
+ return sr;
+ }
+ }
+ throw new IllegalArgumentException("[JCA80011] Reference not found: " + referenceName);
+
+ }
+
+ /**
+ * Select an endpoint reference from the component reference
+ * @param ref
+ * @return
+ */
+ private EndpointReference getEndpointReference(ComponentReference ref) {
+ List<EndpointReference> eprs = ref.getEndpointReferences();
+ if (eprs.size() == 1) {
+ // Return 1st one
+ return eprs.get(0);
+ } else {
+ for (EndpointReference epr : eprs) {
+ // Try to see if there is an EPR using binding.sca
+ if (epr.getBinding().getType().equals(SCABinding.TYPE)) {
+ return epr;
+ }
+ }
+ return eprs.get(0);
+ }
+ }
+
+ /**
+ * Select an endpoint reference from the component reference
+ * @param ref
+ * @return
+ */
+ private Endpoint getEndpoint(ComponentService service, String bindingName) {
+ if (bindingName == null) {
+ // The default binding name is the name of the promoted service
+ bindingName = getPromotedService(service).getName();
+ }
+ Endpoint returnEp = null;
+ List<Endpoint> eps = service.getEndpoints();
+ for (Endpoint ep : eps) {
+ Binding binding = ep.getBinding();
+ if (bindingName.equals(binding.getName()) || binding.getName() == null) {
+ returnEp = ep;
+ break;
+ }
+ }
+ //TUSCANY-3543
+ if (returnEp == null) {
+ returnEp = eps.get(0);
+ }
+
+ return returnEp;
+ }
+
+ private ComponentService getPromotedService(ComponentService componentService) {
+ Service service = componentService.getService();
+ if (service instanceof CompositeService) {
+ return getPromotedService(((CompositeService)service).getPromotedService());
+ } else {
+ return componentService;
+ }
+
+ }
+
+ /**
+ * Gets the value for the specified property with the specified type.
+ *
+ * @param type The type of the property value we are getting
+ * @param propertyName The name of the property we are getting
+ * @param B The class of the property value we are getting
+ *
+ * @throws ServiceRuntimeException If a Property for the specified propertyName
+ * is not found
+ *
+ * @see #setPropertyValueFactory(PropertyValueFactory)
+ */
+ public <B> B getProperty(Class<B> type, String propertyName) {
+ for (ComponentProperty p : component.getProperties()) {
+ if (propertyName.equals(p.getName())) {
+ return propertyFactory.createPropertyValue(p, type);
+ }
+ }
+ throw new IllegalArgumentException("Property not found: " + propertyName);
+ }
+
+ /**
+ * @param component
+ */
+ public static ComponentService getSingleService(Component component) {
+ ComponentService targetService;
+ List<ComponentService> services = component.getServices();
+ List<ComponentService> regularServices = new ArrayList<ComponentService>();
+ for (ComponentService service : services) {
+ if (service.isForCallback()) {
+ 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 <B> ServiceReference<B> createSelfReference(Class<B> businessInterface) {
+ ComponentService service = getSingleService(component);
+ try {
+ return createSelfReference(businessInterface, service);
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e.getMessage(), e);
+ }
+ }
+
+ public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface, String serviceName) {
+ if (serviceName == null) {
+ return createSelfReference(businessInterface);
+ }
+ try {
+ String bindingName = null;
+ int index = serviceName.indexOf('/');
+ if (index != -1) {
+ bindingName = serviceName.substring(index + 1);
+ serviceName = serviceName.substring(0, index);
+ }
+ for (ComponentService service : component.getServices()) {
+ if (serviceName.equals(service.getName())) {
+ Endpoint endpoint = getEndpoint(service, bindingName);
+ if (endpoint == null) {
+ break;
+ }
+ return getServiceReference(businessInterface, (RuntimeEndpoint)endpoint);
+ }
+ }
+ throw new IllegalArgumentException("Service not found: " + serviceName);
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (ServiceRuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * @param <B>
+ * @param businessInterface
+ * @param service
+ * @return
+ */
+ public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface, ComponentService service) {
+ try {
+ RuntimeEndpointReference ref =
+ (RuntimeEndpointReference)createEndpointReference(component, service, null, businessInterface);
+ ref.setComponent(component);
+ return getServiceReference(businessInterface, ref);
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ public RequestContext getRequestContext() {
+ if (requestContextFactory != null) {
+ return requestContextFactory.createRequestContext(component);
+ } else {
+ return new RequestContextImpl(component);
+ }
+ }
+
+ /**
+ * @param businessInterface
+ * @param reference
+ * @return
+ * @throws CloneNotSupportedException
+ * @throws InvalidInterfaceException
+ */
+ public <B> TuscanyServiceReference<B> getServiceReference(Class<B> businessInterface,
+ RuntimeEndpointReference endpointReference) {
+ TuscanyServiceReference<B> result = null;
+
+ try {
+ InterfaceContract interfaceContract = endpointReference.getComponentTypeReferenceInterfaceContract();
+ if (businessInterface == null) {
+ businessInterface = (Class<B>)((JavaInterface)interfaceContract.getInterface()).getJavaClass();
+ }
+ RuntimeComponentReference ref = (RuntimeComponentReference)endpointReference.getReference();
+ InterfaceContract refInterfaceContract = getInterfaceContract(interfaceContract, businessInterface);
+ if (refInterfaceContract != null) {
+ if (refInterfaceContract != interfaceContract) {
+ ref = (RuntimeComponentReference)ref.clone();
+ if (interfaceContract != null) {
+ ref.setInterfaceContract(interfaceContract);
+ } else {
+ ref.setInterfaceContract(refInterfaceContract);
+ }
+ }
+
+ ref.setComponent(component);
+ result =
+ new ServiceReferenceImpl<B>(businessInterface, endpointReference, component.getComponentContext()
+ .getCompositeContext());
+ }
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+
+ return result;
+ }
+
+ public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, RuntimeEndpoint endpoint) {
+ try {
+ if (businessInterface == null) {
+ InterfaceContract contract = endpoint.getBindingInterfaceContract();
+ if (contract.getInterface() instanceof JavaInterface) {
+ businessInterface = (Class<B>)((JavaInterface)contract.getInterface()).getJavaClass();
+ } else {
+ contract = endpoint.getComponentTypeServiceInterfaceContract();
+ if (contract.getInterface() instanceof JavaInterface) {
+ businessInterface = (Class<B>)((JavaInterface)contract.getInterface()).getJavaClass();
+ }
+ }
+ }
+ RuntimeEndpointReference ref =
+ (RuntimeEndpointReference)createEndpointReference(endpoint, businessInterface);
+ ref.setComponent(component);
+ return new ServiceReferenceImpl<B>(businessInterface, ref, compositeContext);
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ /**
+ * Create a self-reference for a component service
+ * @param component
+ * @param service
+ * @throws CloneNotSupportedException
+ * @throws InvalidInterfaceException
+ */
+ private EndpointReference createEndpointReference(Component component,
+ ComponentService service,
+ String bindingName,
+ Class<?> businessInterface) throws CloneNotSupportedException,
+ InvalidInterfaceException {
+
+ Endpoint endpoint = getEndpoint(service, bindingName);
+ return createEndpointReference(endpoint, businessInterface);
+ }
+
+ private EndpointReference createEndpointReference(Endpoint endpoint, Class<?> businessInterface)
+ throws CloneNotSupportedException, InvalidInterfaceException {
+ Component component = endpoint.getComponent();
+ ComponentService service = endpoint.getService();
+ ComponentReference componentReference = assemblyFactory.createComponentReference();
+ componentReference.setName("$self$." + service.getName());
+
+ componentReference.setCallback(service.getCallback());
+ componentReference.getTargets().add(service);
+ componentReference.getPolicySets().addAll(service.getPolicySets());
+ componentReference.getRequiredIntents().addAll(service.getRequiredIntents());
+ componentReference.getBindings().add(endpoint.getBinding());
+
+ // For the self-reference, allows pass by reference
+ componentReference.setAllowsPassByReference(true);
+
+ 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);
+
+ // create endpoint reference
+ EndpointReference endpointReference = assemblyFactory.createEndpointReference();
+ endpointReference.setComponent(component);
+ endpointReference.setReference(componentReference);
+ endpointReference.setBinding(endpoint.getBinding());
+ endpointReference.setUnresolved(false);
+ endpointReference.setStatus(EndpointReference.Status.WIRED_TARGET_FOUND_READY_FOR_MATCHING);
+
+ endpointReference.setTargetEndpoint(endpoint);
+
+ componentReference.getEndpointReferences().add(endpointReference);
+ ((RuntimeComponentReference)componentReference).setComponent((RuntimeComponent)component);
+ ((RuntimeEndpointReference)endpointReference).bind(compositeContext);
+
+ return endpointReference;
+ }
+
+ /**
+ * @param interfaceContract
+ * @param businessInterface
+ * @return
+ * @throws CloneNotSupportedException
+ * @throws InvalidInterfaceException
+ */
+ private InterfaceContract getInterfaceContract(InterfaceContract interfaceContract, Class<?> businessInterface)
+ throws CloneNotSupportedException, InvalidInterfaceException {
+ if (businessInterface == null) {
+ return interfaceContract;
+ }
+ if (interfaceContract == null) {
+ JavaInterfaceContract ic = javaInterfaceFactory.createJavaInterfaceContract();
+ ic.setInterface(javaInterfaceFactory.createJavaInterface(businessInterface));
+ return ic;
+ }
+ boolean compatible = false;
+ if (interfaceContract != null && interfaceContract.getInterface() != null) {
+ Interface interfaze = interfaceContract.getInterface();
+ if (interfaze instanceof JavaInterface) {
+ Class<?> cls = ((JavaInterface)interfaze).getJavaClass();
+ if (businessInterface.isAssignableFrom(cls)) {
+ compatible = true;
+ }
+ if (!compatible) {
+ InterfaceContract biContract = javaInterfaceFactory.createJavaInterfaceContract();
+ JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(businessInterface);
+ biContract.setInterface(callInterface);
+ if (callInterface.getCallbackClass() != null) {
+ biContract.setCallbackInterface(javaInterfaceFactory.createJavaInterface(callInterface
+ .getCallbackClass()));
+ }
+ InterfaceContractMapper ifcm = registry.getExtensionPoint(InterfaceContractMapper.class);
+ compatible = ifcm.isCompatibleSubset(biContract, interfaceContract);
+ // If the business interface class is not assignable from the service interface class but
+ // they are compatible, we need to return an InterfaceContract with the business interface
+ // class to store on the reference side.
+ if ( compatible ) {
+ return biContract;
+ }
+ }
+
+ }
+ }
+
+ if (!compatible) {
+ // JCA-9011
+ throw new IllegalArgumentException("Business interface " + businessInterface.getName()
+ + " is not compatible with "
+ + interfaceContract.getInterface());
+ }
+
+ return interfaceContract;
+ }
+
+ /* ******************** Contribution for issue TUSCANY-2281 ******************** */
+
+ /**
+ * @see ComponentContext#getServices(Class<B>, String)
+ */
+ public <B> Collection<B> getServices(Class<B> businessInterface, String referenceName) {
+ ArrayList<B> services = new ArrayList<B>();
+ Collection<ServiceReference<B>> serviceRefs = getServiceReferences(businessInterface, referenceName);
+ for (ServiceReference<B> serviceRef : serviceRefs) {
+ services.add(serviceRef.getService());
+ }
+ return services;
+ }
+
+ /**
+ * @see ComponentContext#getServiceReferences(Class<B>, String)
+ */
+ public <B> Collection<ServiceReference<B>> getServiceReferences(Class<B> businessInterface, String referenceName) {
+ try {
+ for (ComponentReference ref : component.getReferences()) {
+ if (referenceName.equals(ref.getName())) {
+ if (ref.getMultiplicity() == Multiplicity.ONE_ONE)
+ throw new IllegalArgumentException("Reference " + referenceName
+ + " is not a valid argument for getServiceReferences because it has a multiplicity of 1..1");
+ if (ref.getMultiplicity() == Multiplicity.ZERO_ONE)
+ throw new IllegalArgumentException("Reference " + referenceName
+ + " is not a valid argument for getServiceReferences because it has a multiplicity of 0..1");
+
+ ArrayList<ServiceReference<B>> serviceRefs = new ArrayList<ServiceReference<B>>();
+ for (EndpointReference endpointReference : ref.getEndpointReferences()) {
+ RuntimeEndpointReference epr = (RuntimeEndpointReference)endpointReference;
+ serviceRefs.add(getServiceReference(businessInterface, epr));
+ }
+ return serviceRefs;
+ }
+ }
+ throw new IllegalArgumentException("Reference not found: " + referenceName);
+ } catch (IllegalArgumentException iae) {
+ throw iae;
+ } catch (ServiceRuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e.getMessage(), e);
+ }
+ }
+
+ /* ******************** Contribution for issue TUSCANY-2281 ******************** */
+
+ public CompositeContext getCompositeContext() {
+ return compositeContext;
+ }
+
+ public ExtensionPointRegistry getExtensionPointRegistry() {
+ return getCompositeContext().getExtensionPointRegistry();
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java
new file mode 100644
index 0000000000..6aaa6186b9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/RequestContextImpl.java
@@ -0,0 +1,126 @@
+/*
+ * 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.util.List;
+
+import javax.security.auth.Subject;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.context.ThreadMessageContext;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.oasisopen.sca.RequestContext;
+import org.oasisopen.sca.ServiceReference;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class RequestContextImpl implements RequestContext {
+
+ public RequestContextImpl(RuntimeComponent component) {
+ }
+
+ public Subject getSecuritySubject() {
+
+ Message msgContext = ThreadMessageContext.getMessageContext();
+
+ if (msgContext == null){
+ // message in thread context could be null if the user has
+ // spun up a new thread inside their component implementation
+ return null;
+ }
+
+ Subject subject = null;
+ for (Object header : msgContext.getHeaders().values()){
+ if (header instanceof Subject){
+ subject = (Subject)header;
+ break;
+ }
+ }
+ return subject;
+ }
+
+ public String getServiceName() {
+ Message msgContext = ThreadMessageContext.getMessageContext();
+
+ if (msgContext != null &&
+ msgContext.getTo() != null){
+ return msgContext.getTo().getService().getName();
+ } else {
+ // message in thread context could be null (or the default message where to == null)
+ // if the user has spun up a new thread inside their component implementation
+ return null;
+ }
+ }
+
+ public <B> ServiceReference<B> getServiceReference() {
+ Message msgContext = ThreadMessageContext.getMessageContext();
+ if (msgContext == null ||
+ msgContext.getTo() == null){
+ // message in thread context could be null (or the default message where to == null)
+ // if the user has spun up a new thread inside their component implementation
+ return null;
+ }
+ // FIXME: [rfeng] Is this the service reference matching the caller side?
+ RuntimeEndpoint to = (RuntimeEndpoint) msgContext.getTo();
+ RuntimeComponent component = (RuntimeComponent) to.getComponent();
+
+ ServiceReference<B> callableReference = component.getComponentContext().getServiceReference(null, to);
+
+ return callableReference;
+ }
+
+ public <CB> CB getCallback() {
+ ServiceReference<CB> cb = getCallbackReference();
+ if (cb == null) {
+ return null;
+ }
+ return cb.getService();
+ }
+
+ @SuppressWarnings("unchecked")
+ public <CB> ServiceReference<CB> getCallbackReference() {
+ Message msgContext = ThreadMessageContext.getMessageContext();
+ if (msgContext == null ||
+ msgContext.getTo() == null){
+ // message in thread context could be null (or the default message where to == null)
+ // if the user has spun up a new thread inside their component implementation
+ return null;
+ }
+
+ Endpoint to = msgContext.getTo();
+ RuntimeComponentService service = (RuntimeComponentService) to.getService();
+ RuntimeComponentReference callbackReference = (RuntimeComponentReference)service.getCallbackReference();
+ if (callbackReference == null) {
+ return null;
+ }
+ JavaInterface javaInterface = (JavaInterface) callbackReference.getInterfaceContract().getInterface();
+ Class<CB> javaClass = (Class<CB>)javaInterface.getJavaClass();
+ List<EndpointReference> wires = callbackReference.getEndpointReferences();
+ ServiceReferenceImpl ref = new CallbackServiceReferenceImpl(javaClass, wires);
+
+ return ref;
+ }
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ServiceReferenceImpl.java b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ServiceReferenceImpl.java
new file mode 100644
index 0000000000..6fa53dcea2
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ServiceReferenceImpl.java
@@ -0,0 +1,430 @@
+/*
+ * 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.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.StringWriter;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+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.ComponentService;
+import org.apache.tuscany.sca.assembly.CompositeService;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilder;
+import org.apache.tuscany.sca.assembly.builder.BuilderContext;
+import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
+import org.apache.tuscany.sca.context.CompositeContext;
+import org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
+import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
+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.RuntimeAssemblyFactory;
+import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl;
+import org.apache.tuscany.sca.core.context.ServiceReferenceExt;
+import org.apache.tuscany.sca.core.factory.ObjectCreationException;
+import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory;
+import org.apache.tuscany.sca.core.invocation.ProxyFactory;
+import org.apache.tuscany.sca.interfacedef.Interface;
+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.runtime.Invocable;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+import org.oasisopen.sca.ServiceRuntimeException;
+
+/**
+ * Default implementation of a ServiceReference.
+ *
+ * @version $Rev$ $Date$
+ * @param <B> the type of the business interface
+ */
+public class ServiceReferenceImpl<B> implements ServiceReferenceExt<B> {
+ private static final long serialVersionUID = 6763709434194361540L;
+
+ protected transient ProxyFactory proxyFactory;
+ protected transient Class<B> businessInterface;
+ protected transient B proxy;
+
+ protected Object callbackID; // The callbackID should be serializable
+
+ protected transient RuntimeEndpointReference endpointReference;
+
+// protected String scdl;
+//
+// private transient XMLStreamReader xmlReader;
+
+ protected transient CompositeContext compositeContext;
+ protected ExtensionPointRegistry registry;
+ protected FactoryExtensionPoint modelFactories;
+ protected RuntimeAssemblyFactory assemblyFactory;
+ protected StAXArtifactProcessorExtensionPoint staxProcessors;
+ protected StAXArtifactProcessor<EndpointReference> staxProcessor;
+ protected XMLInputFactory xmlInputFactory;
+ protected XMLOutputFactory xmlOutputFactory;
+ protected BuilderExtensionPoint builders;
+
+ /*
+ * Public constructor for Externalizable serialization/deserialization
+ */
+ public ServiceReferenceImpl() {
+ super();
+ }
+
+ public ServiceReferenceImpl(Class<B> businessInterface,
+ Invocable endpointReference,
+ CompositeContext compositeContext) {
+ this.businessInterface = businessInterface;
+ this.endpointReference = (RuntimeEndpointReference) endpointReference;
+ if (compositeContext == null) {
+ compositeContext = endpointReference.getCompositeContext();
+ }
+ bind(compositeContext);
+ }
+
+ public ServiceReferenceImpl(Class<B> businessInterface,
+ Invocable endpointReference) {
+ this(businessInterface, endpointReference, null);
+ }
+
+ protected void bind(CompositeContext context) {
+ this.compositeContext = context;
+ this.registry = compositeContext.getExtensionPointRegistry();
+ this.modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+ this.assemblyFactory = (RuntimeAssemblyFactory)modelFactories.getFactory(AssemblyFactory.class);
+ this.xmlInputFactory = modelFactories.getFactory(XMLInputFactory.class);
+ this.xmlOutputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+ this.staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+ this.staxProcessor = staxProcessors.getProcessor(EndpointReference.class);
+ this.builders = registry.getExtensionPoint(BuilderExtensionPoint.class);
+ this.proxyFactory = ExtensibleProxyFactory.getInstance(registry);
+ }
+
+ public RuntimeEndpointReference getEndpointReference() {
+ return endpointReference;
+ }
+
+ public B getProxy() throws ObjectCreationException {
+ try {
+ if (proxy == null) {
+ proxy = createProxy();
+ }
+ return proxy;
+ } catch (Exception e) {
+ throw new ObjectCreationException(e);
+ }
+ }
+
+ public void setProxy(B proxy) {
+ this.proxy = proxy;
+ }
+
+ protected B createProxy() throws Exception {
+ return proxyFactory.createProxy(this);
+ }
+
+ public B getService() {
+ try {
+ resolve();
+ return getProxy();
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ public Class<B> getBusinessInterface() {
+ try {
+ resolve();
+ return businessInterface;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ /**
+ * Follow a service promotion chain down to the inner most (non composite)
+ * component service.
+ *
+ * @param topCompositeService
+ * @return
+ */
+ 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;
+ }
+ }
+
+ // ============ WRITE AND READ THE REFERENCE TO EXTERNAL XML ========================
+
+ /**
+ * write the reference to a stream
+ *
+ * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput)
+ */
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(endpointReference);
+ /*
+ try {
+ String xml = null;
+ if (scdl == null) {
+ xml = toXMLString();
+ } else {
+ xml = scdl;
+ }
+
+ if (xml == null) {
+ out.writeBoolean(false);
+ } else {
+ out.writeBoolean(true);
+ out.writeUTF(xml);
+ }
+ } catch (Exception e) {
+ // e.printStackTrace();
+ throw new IOException(e.toString());
+ }
+ */
+ }
+
+ /**
+ * write the endpoint reference into an xml string
+ */
+ public String toXMLString() throws IOException, XMLStreamException, ContributionWriteException {
+ StringWriter writer = new StringWriter();
+ XMLStreamWriter streamWriter = xmlOutputFactory.createXMLStreamWriter(writer);
+ staxProcessor.write(endpointReference, streamWriter, new ProcessorContext(registry));
+ return writer.toString();
+ }
+
+ /**
+ * Read the reference from a stream
+ *
+ * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
+ */
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ this.endpointReference = (RuntimeEndpointReference) in.readObject();
+ // Force resolve
+ endpointReference.getComponent();
+ bind(endpointReference.getCompositeContext());
+
+ RuntimeComponentReference reference = (RuntimeComponentReference)endpointReference.getReference();
+ reference.setComponent((RuntimeComponent)endpointReference.getComponent());
+
+ Interface i = reference.getInterfaceContract().getInterface();
+ if (i instanceof JavaInterface) {
+ JavaInterface javaInterface = (JavaInterface)i;
+ if (javaInterface.isUnresolved()) {
+ // Allow privileged access to get ClassLoader. Requires RuntimePermission in
+ // security policy.
+ ClassLoader classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+
+ javaInterface.setJavaClass(classLoader.loadClass(javaInterface.getName()));
+ JavaInterfaceFactory javaInterfaceFactory = getJavaInterfaceFactory(compositeContext);
+
+ try {
+ javaInterfaceFactory.createJavaInterface(javaInterface, javaInterface.getJavaClass());
+ } catch (InvalidInterfaceException e) {
+ throw new ServiceRuntimeException(e);
+ }
+ //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<B>)javaInterface.getJavaClass();
+ }
+
+ Binding binding = endpointReference.getBinding();
+ if (binding != null) {
+ BindingBuilder bindingBuilder = builders.getBindingBuilder(binding.getType());
+ if (bindingBuilder != null) {
+ org.apache.tuscany.sca.assembly.builder.BuilderContext context = new BuilderContext(registry);
+ bindingBuilder.build(endpointReference.getComponent(), reference, endpointReference.getBinding(), context, false);
+ }
+ }
+
+ this.proxyFactory = getProxyFactory(this.compositeContext);
+
+ /*
+ endpointReference.bind(CompositeContext.getCurrentCompositeContext());
+ endpointReference.rebuild();
+ */
+ /*
+ final boolean hasSCDL = in.readBoolean();
+ if (hasSCDL) {
+ this.scdl = in.readUTF();
+ } else {
+ this.scdl = null;
+ }
+ */
+ }
+
+ /**
+ * Read xml string into the endpoint reference
+ */
+ /*
+ public void fromXMLString() throws IOException, XMLStreamException, ContributionReadException {
+
+ XMLStreamReader streamReader = xmlReader;
+
+ if (scdl != null) {
+ Reader reader = new StringReader(scdl);
+
+ if (xmlInputFactory == null) {
+ // this is a reference being read from a external stream
+ // so set up enough of the reference in order to resolved the
+ // xml being read
+ bind(CompositeContext.getCurrentCompositeContext());
+ }
+
+ streamReader = xmlInputFactory.createXMLStreamReader(reader);
+ }
+
+ endpointReference = (RuntimeEndpointReference) staxProcessor.read(streamReader, new ProcessorContext(registry));
+
+ // ok to GC
+ xmlReader = null;
+ scdl = null;
+ }
+ */
+
+ /**
+ * @throws IOException
+ */
+ private synchronized void resolve() throws Exception {
+ /*
+ if ((scdl != null || xmlReader != null) && endpointReference == null) {
+ fromXMLString();
+
+ compositeContext.bindComponent((RuntimeComponent) endpointReference.getComponent());
+
+ RuntimeComponentReference reference = (RuntimeComponentReference)endpointReference.getReference();
+ reference.setComponent((RuntimeComponent)endpointReference.getComponent());
+
+ ReferenceParameters parameters = null;
+ for (Object ext : reference.getExtensions()) {
+ if (ext instanceof ReferenceParameters) {
+ parameters = (ReferenceParameters)ext;
+ break;
+ }
+ }
+
+ if (parameters != null) {
+ this.callbackID = parameters.getCallbackID();
+ }
+
+ Interface i = reference.getInterfaceContract().getInterface();
+ if (i instanceof JavaInterface) {
+ JavaInterface javaInterface = (JavaInterface)i;
+ if (javaInterface.isUnresolved()) {
+ // Allow privileged access to get ClassLoader. Requires RuntimePermission in
+ // security policy.
+ ClassLoader classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+
+ javaInterface.setJavaClass(classLoader.loadClass(javaInterface.getName()));
+ JavaInterfaceFactory javaInterfaceFactory = getJavaInterfaceFactory(compositeContext);
+
+ javaInterfaceFactory.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<B>)javaInterface.getJavaClass();
+ }
+
+ Binding binding = endpointReference.getBinding();
+ if (binding != null) {
+ BindingBuilder bindingBuilder = builders.getBindingBuilder(binding.getType());
+ if (bindingBuilder != null) {
+ BuilderContext context = new BuilderContext(registry);
+ bindingBuilder.build(endpointReference.getComponent(), reference, endpointReference.getBinding(), context);
+ }
+ }
+
+ this.proxyFactory = getProxyFactory(this.compositeContext);
+ } else if (compositeContext == null) {
+ this.compositeContext = CompositeContext.getCurrentCompositeContext();
+ if (this.compositeContext != null) {
+ this.proxyFactory = getProxyFactory(this.compositeContext);
+ }
+ }
+ */
+ }
+
+ private JavaInterfaceFactory getJavaInterfaceFactory(CompositeContext compositeContext) {
+ ExtensionPointRegistry extensionPointRegistry = compositeContext.getExtensionPointRegistry();
+ FactoryExtensionPoint factories = extensionPointRegistry.getExtensionPoint(FactoryExtensionPoint.class);
+ JavaInterfaceFactory javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class);
+ return javaInterfaceFactory;
+ }
+
+ private ProxyFactory getProxyFactory(CompositeContext compositeContext) {
+ ExtensionPointRegistry extensionPointRegistry = compositeContext.getExtensionPointRegistry();
+ return ExtensibleProxyFactory.getInstance(extensionPointRegistry);
+ }
+
+ // ==================================================================================
+
+ /*
+ public XMLStreamReader getXMLReader() {
+ return xmlReader;
+ }
+ */
+
+ public void setBindingURI(String uri) {
+ ((RuntimeEndpointReferenceImpl)endpointReference).setBindingURI(uri);
+ }
+
+}