You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2008/03/21 04:42:46 UTC

svn commit: r639535 [3/7] - in /incubator/tuscany/sandbox/mobile-android: core-android/ core-android/src/ core-android/src/main/ core-android/src/main/java/ core-android/src/main/java/org/ core-android/src/main/java/org/apache/ core-android/src/main/ja...

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextImpl.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextImpl.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextImpl.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,397 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+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.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.PropertyValueFactory;
+import org.apache.tuscany.sca.context.RequestContextFactory;
+import org.apache.tuscany.sca.core.assembly.CompositeActivator;
+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.JavaInterfaceFactory;
+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.RuntimeComponentService;
+import org.osoa.sca.CallableReference;
+import org.osoa.sca.RequestContext;
+import org.osoa.sca.ServiceReference;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Implementation of ComponentContext that delegates to a ComponentContextProvider.
+ *
+ * @version $Rev: 583217 $ $Date: 2007-10-09 09:35:27 -0700 (Tue, 09 Oct 2007) $
+ */
+public class ComponentContextImpl implements RuntimeComponentContext {
+    private final RuntimeComponent component;
+
+    private final CompositeActivator compositeActivator;
+    private final RequestContextFactory requestContextFactory;
+    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;
+        this.component = component;
+    }
+
+    public String getURI() {
+        return component.getURI();
+    }
+
+    public <B, R extends CallableReference<B>> R cast(B target) throws IllegalArgumentException {
+        return (R)proxyFactory.cast(target);
+    }
+
+    public <B> B getService(Class<B> businessInterface, String referenceName) {
+        ServiceReference<B> serviceRef = getServiceReference(businessInterface, referenceName);
+        return serviceRef.getService();
+    }
+
+    public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, String referenceName) {
+        try {
+            for (ComponentReference ref : component.getReferences()) {
+                if (referenceName.equals(ref.getName())) {
+                    return getServiceReference(businessInterface, (RuntimeComponentReference)ref, null);
+                }
+            }
+            throw new ServiceRuntimeException("Reference not found: " + referenceName);
+        } catch (ServiceRuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 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.
+     * 
+     * @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 ServiceRuntimeException("Property not found: " + propertyName);
+    }
+
+    public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface) {
+        ComponentService service = ComponentContextHelper.getSingleService(component);
+        try {
+            return createSelfReference(businessInterface, service);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e.getMessage(), e);
+        }
+    }
+
+    public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface, String serviceName) {
+        try {
+            for (ComponentService service : component.getServices()) {
+                if (serviceName.equals(service.getName())) {
+                    return createSelfReference(businessInterface, service);
+                }
+            }
+            throw new ServiceRuntimeException("Service not found: " + serviceName);
+        } 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 {
+            RuntimeComponentReference ref =
+                (RuntimeComponentReference)createSelfReference(component, service, businessInterface);
+            ref.setComponent(component);
+            return getServiceReference(businessInterface, ref, null);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+    public RequestContext getRequestContext() {
+        if (requestContextFactory != null) {
+            return requestContextFactory.createRequestContext();
+        } else {
+            return new RequestContextImpl(proxyFactory);
+        }
+    }
+
+    /**
+     * @param businessInterface
+     * @param reference
+     * @return
+     * @throws CloneNotSupportedException
+     * @throws InvalidInterfaceException
+     */
+    public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, RuntimeComponentReference reference, Binding binding) {
+        try {
+            RuntimeComponentReference ref = (RuntimeComponentReference)reference;
+            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);
+            return new ServiceReferenceImpl<B>(businessInterface, component, ref, binding, proxyFactory, compositeActivator);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }    
+
+    /**
+     * Bind a component reference to a component service
+     * @param <B>
+     * @param businessInterface
+     * @param reference
+     * @param service
+     * @return
+     * @throws CloneNotSupportedException
+     * @throws InvalidInterfaceException
+     */
+    public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface,
+                                                       RuntimeComponentReference reference,
+                                                       RuntimeComponent component,
+                                                       RuntimeComponentService service) {
+        try {
+            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.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 new ServiceReferenceImpl<B>(businessInterface, component, ref, proxyFactory, compositeActivator);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+    public <B> CallableReference<B> getCallableReference(Class<B> businessInterface,
+                                                         RuntimeComponent component,
+                                                         RuntimeComponentService service) {
+        try {
+            if (businessInterface == null) {
+                InterfaceContract contract = service.getInterfaceContract();
+                businessInterface = (Class<B>)((JavaInterface)contract.getInterface()).getJavaClass();
+            }
+            RuntimeComponentReference ref =
+                (RuntimeComponentReference)createSelfReference(component, service, businessInterface);
+            ref.setComponent(component);
+            return new CallableReferenceImpl<B>(businessInterface, component, ref, null, proxyFactory,
+                                                compositeActivator);
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+    }
+
+    /**
+     * Create a self-reference for a component service
+     * @param component
+     * @param service
+     * @throws CloneNotSupportedException 
+     * @throws InvalidInterfaceException 
+     */
+    private 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 = javaInterfaceFactory.createJavaInterfaceContract();
+            JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(businessInterface);
+            interfaceContract.setInterface(callInterface);
+            if (callInterface.getCallbackClass() != null) {
+                interfaceContract.setCallbackInterface(javaInterfaceFactory.createJavaInterface(callInterface
+                    .getCallbackClass()));
+            }
+        }
+
+        return interfaceContract;
+    }
+
+    /**
+     * @return the compositeActivator
+     */
+    public CompositeActivator getCompositeActivator() {
+        return compositeActivator;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.runtime.RuntimeComponentContext#start(org.apache.tuscany.sca.runtime.RuntimeComponentReference)
+     */
+    public void start(RuntimeComponentReference reference) {
+        compositeActivator.start(component, reference);
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.runtime.RuntimeComponentContext#read(java.io.Reader)
+     */
+    public RuntimeComponent read(Reader reader) throws IOException {
+        RuntimeComponent component = compositeActivator.getComponentContextHelper().read(reader);
+        compositeActivator.configureComponentContext(component);
+        return component;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.runtime.RuntimeComponentContext#write(org.apache.tuscany.sca.runtime.RuntimeComponentReference, java.io.Writer)
+     */
+    public void write(RuntimeComponentReference reference, Writer writer) throws IOException {
+        compositeActivator.getComponentContextHelper().write(component, reference, writer);
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/DefaultComponentContextFactory.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.context.ComponentContextFactory;
+import org.apache.tuscany.sca.context.RequestContextFactory;
+import org.apache.tuscany.sca.core.assembly.CompositeActivator;
+import org.apache.tuscany.sca.core.invocation.ProxyFactory;
+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;
+
+/**
+ * @version $Rev: 568826 $ $Date: 2007-08-22 22:27:34 -0700 (Wed, 22 Aug 2007) $
+ */
+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;
+
+    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);
+    }
+
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/InstanceWrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/InstanceWrapper.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/InstanceWrapper.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/InstanceWrapper.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+import org.apache.tuscany.sca.core.scope.TargetDestructionException;
+import org.apache.tuscany.sca.core.scope.TargetInitializationException;
+
+
+/**
+ * Provides lifecycle management for an implementation instance associated with
+ * a component for use by the component's associated {@link org.apache.tuscany.sca.core.scope.ScopeContainer}
+ * 
+ * @version $Rev: 568826 $ $Date: 2007-08-22 22:27:34 -0700 (Wed, 22 Aug 2007) $
+ */
+public interface InstanceWrapper<T> {
+
+    /**
+     * @return
+     */
+    T getInstance();
+
+    /**
+     * @throws TargetInitializationException
+     */
+    void start() throws TargetInitializationException;
+
+    /**
+     * @throws TargetDestructionException
+     */
+    void stop() throws TargetDestructionException;
+
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,105 @@
+/*
+ * 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;
+
+import java.util.List;
+
+import javax.security.auth.Subject;
+
+import org.apache.tuscany.sca.core.invocation.CallbackReferenceImpl;
+import org.apache.tuscany.sca.core.invocation.ProxyFactory;
+import org.apache.tuscany.sca.core.invocation.ThreadMessageContext;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.EndpointReference;
+import org.apache.tuscany.sca.runtime.ReferenceParameters;
+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.RuntimeWire;
+import org.osoa.sca.CallableReference;
+import org.osoa.sca.RequestContext;
+
+/**
+ * @version $Rev: 628809 $ $Date: 2008-02-18 08:50:37 -0800 (Mon, 18 Feb 2008) $
+ */
+public class RequestContextImpl implements RequestContext {
+
+    private ProxyFactory proxyFactory;
+
+    public RequestContextImpl(ProxyFactory proxyFactory) {
+        this.proxyFactory = proxyFactory;
+    }
+
+    public Subject getSecuritySubject() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getServiceName() {
+        return ThreadMessageContext.getMessageContext().getTo().getContract().getName();
+    }
+
+    @SuppressWarnings("unchecked")
+    public <B> CallableReference<B> getServiceReference() {
+        Message msgContext = ThreadMessageContext.getMessageContext();
+        // FIXME: [rfeng] Is this the service reference matching the caller side?
+        EndpointReference to = msgContext.getTo();
+        RuntimeComponentService service = (RuntimeComponentService) to.getContract();
+        RuntimeComponent component = (RuntimeComponent) to.getComponent();
+        
+        CallableReference<B> callableReference = component.getComponentContext().getCallableReference(null, component, service);
+        ReferenceParameters parameters = msgContext.getFrom().getReferenceParameters();
+        ((CallableReferenceImpl<B>) callableReference).attachCallbackID(parameters.getCallbackID());
+        if (callableReference.getConversation() != null) {
+            ((CallableReferenceImpl<B>) callableReference).attachConversationID(parameters.getConversationID());
+        }
+        return callableReference;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <CB> CB getCallback() {
+        CallableReference<CB> cb = getCallbackReference(); 
+        if (cb == null) {
+            return null;
+        }
+        return cb.getService();
+    }
+
+    @SuppressWarnings("unchecked")
+    public <CB> CallableReference<CB> getCallbackReference() {
+        Message msgContext = ThreadMessageContext.getMessageContext();
+        EndpointReference to = msgContext.getTo();
+        RuntimeComponentService service = (RuntimeComponentService) to.getContract();
+        RuntimeComponentReference callbackReference = (RuntimeComponentReference)service.getCallbackReference();
+        if (callbackReference == null) {
+            return null;
+        }
+        JavaInterface javaInterface = (JavaInterface) callbackReference.getInterfaceContract().getInterface();
+        Class<CB> javaClass = (Class<CB>)javaInterface.getJavaClass();
+        List<RuntimeWire> wires = callbackReference.getRuntimeWires();
+        CallbackReferenceImpl ref = new CallbackReferenceImpl(javaClass, proxyFactory, wires);
+        //ref.resolveTarget();
+        ReferenceParameters parameters = msgContext.getFrom().getReferenceParameters();
+        ref.attachCallbackID(parameters.getCallbackID());
+        if (ref.getConversation() != null) {
+            ref.attachConversationID(parameters.getConversationID());
+        }
+        return ref;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ServiceReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ServiceReferenceImpl.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ServiceReferenceImpl.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/context/ServiceReferenceImpl.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,132 @@
+/*
+ * 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;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.core.assembly.CompositeActivator;
+import org.apache.tuscany.sca.core.conversation.ConversationState;
+import org.apache.tuscany.sca.core.invocation.ProxyFactory;
+import org.apache.tuscany.sca.runtime.EndpointReference;
+import org.apache.tuscany.sca.runtime.ReferenceParameters;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.osoa.sca.CallableReference;
+import org.osoa.sca.ServiceReference;
+
+/**
+ * Default implementation of a ServiceReference.
+ *
+ * @version $Rev: 636920 $ $Date: 2008-03-13 16:26:30 -0700 (Thu, 13 Mar 2008) $
+ * @param <B> the type of the business interface
+ */
+public class ServiceReferenceImpl<B> extends CallableReferenceImpl<B> implements ServiceReference<B> {
+    private static final long serialVersionUID = 6763709434194361540L;
+
+    protected transient Object callback;
+
+    /*
+     * Public constructor for Externalizable serialization/deserialization
+     */
+    public ServiceReferenceImpl() {
+        super();
+    }
+
+    /*
+     * Public constructor for use by XMLStreamReader2CallableReference
+     */
+    public ServiceReferenceImpl(XMLStreamReader xmlReader) throws Exception {
+        super(xmlReader);
+    }
+
+    /**
+     * @param businessInterface
+     * @param wire
+     * @param proxyFactory
+     */
+    public ServiceReferenceImpl(Class<B> businessInterface, RuntimeWire wire, ProxyFactory proxyFactory) {
+        super(businessInterface, wire, proxyFactory);
+    }
+
+    public ServiceReferenceImpl(Class<B> businessInterface,
+                                RuntimeComponent component,
+                                RuntimeComponentReference reference,
+                                ProxyFactory proxyFactory,
+                                CompositeActivator compositeActivator) {
+        super(businessInterface, component, reference, null, proxyFactory, compositeActivator);
+    }
+
+    public ServiceReferenceImpl(Class<B> businessInterface,
+                                RuntimeComponent component,
+                                RuntimeComponentReference reference,
+                                Binding binding,
+                                ProxyFactory proxyFactory,
+                                CompositeActivator compositeActivator) {
+        super(businessInterface, component, reference, binding, proxyFactory, compositeActivator);
+    }
+
+    public Object getConversationID() {
+        return conversationID;
+    }
+
+    public void setConversationID(Object conversationID) throws IllegalStateException {
+        if (conversation == null || conversation.getState() != ConversationState.ENDED) {
+            this.conversationID = conversationID;
+            this.conversation = null;
+        } else {
+            throw new IllegalStateException("Trying to set the conversationId on a service reference but the state of the conversation " 
+                + conversation.getConversationID()
+                + " is "
+                + conversation.getState());
+        }
+    }
+
+    public void setCallbackID(Object callbackID) {
+        this.callbackID = callbackID;
+    }
+
+    public Object getCallback() {
+        return callback;
+    }
+
+    public void setCallback(Object callback) {
+        if (callback != null && !(callback instanceof CallableReference)) {
+            //FIXME: need to check if callback object supports the callback interface
+            // returned by reference.getInterfaceContract().getCallbackInterface()
+        }
+        this.callback = callback;
+    }
+
+    protected ReferenceParameters getReferenceParameters() {
+        ReferenceParameters parameters = super.getReferenceParameters();
+        if (callback != null) {
+            if (callback instanceof ServiceReference) {
+                EndpointReference callbackRef = ((CallableReferenceImpl)callback).getEndpointReference();
+                parameters.setCallbackReference(callbackRef);
+            } else {
+                EndpointReference callbackRef = getRuntimeWire().getSource().getCallbackEndpoint();
+                parameters.setCallbackReference(callbackRef);
+                parameters.setCallbackObjectID(callback);
+            }
+        }
+        return parameters;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationListener.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationListener.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationListener.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationListener.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,40 @@
+/*
+ * 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.conversation;
+
+/**
+ * Listener for the events of a conversation
+ * 
+ * @version $Rev: 575101 $ $Date: 2007-09-12 15:09:19 -0700 (Wed, 12 Sep 2007) $
+ */
+public interface ConversationListener {
+    /**
+     * The conversation is started
+     */
+    void conversationStarted(ExtendedConversation conversation);
+    /**
+     * The conversation is ended
+     */
+    void conversationEnded(ExtendedConversation conversation);
+    /**
+     * The conversation is expired
+     */
+    void conversationExpired(ExtendedConversation conversation);
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManager.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManager.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManager.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManager.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,71 @@
+/*
+ * 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.conversation;
+
+/**
+ * The manager of conversations
+ * 
+ * @version $Rev: 639271 $ $Date: 2008-03-20 05:54:38 -0700 (Thu, 20 Mar 2008) $
+ */
+public interface ConversationManager {
+    /**
+     * @param conversationID
+     * @return
+     */
+    ExtendedConversation startConversation(Object conversationID);
+
+    /**
+     * @param conversationID
+     */
+    void endConversation(Object conversationID);
+
+    /**
+     * @param conversationID
+     * @return
+     */
+    ExtendedConversation getConversation(Object conversationID);
+
+    /**
+     * @param conversationID
+     */
+    void expireConversation(Object conversationID);
+
+    /**
+     * Add a listener to this conversation
+     * @param listener
+     */
+    void addListener(ConversationListener listener);
+
+    /**
+     * Remove a listener from this conversation
+     * @param listener
+     */
+    void removeListener(ConversationListener listener);
+    
+    /**
+     * @return the default max age for a conversation
+     */
+    long getMaxAge();
+    
+    /**
+     * @return the default max idle time for a conversation
+     */
+    long getMaxIdleTime();
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManagerImpl.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManagerImpl.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationManagerImpl.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,204 @@
+/*
+ * 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.conversation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @version $Rev: 638875 $ $Date: 2008-03-19 08:32:44 -0700 (Wed, 19 Mar 2008) $
+ */
+public class ConversationManagerImpl implements ConversationManager {
+	
+    private List<ConversationListener> listeners = Collections.synchronizedList(new ArrayList<ConversationListener>());
+    private Map<Object, ExtendedConversation> conversations = new ConcurrentHashMap<Object, ExtendedConversation>();
+
+    /**
+     * the default max age. this is set to 1 hour
+     */
+    private static final long DEFAULT_MAX_AGE = 60 * 60 * 1000; ;
+    
+    /**
+     * the default max idle time. this is set to 1 hour
+     */
+    private static final long DEFAULT_MAX_IDLE_TIME = 60 * 60 * 1000; 
+    
+    /**
+     * the globally used max age
+     */
+    private final long maxAge;
+
+    /**
+     * the globally used max idle time
+     */
+    private final long maxIdleTime; 
+
+    /**
+     * the reaper thread
+     */
+    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
+    
+    /**
+     * constructor
+     */
+    public ConversationManagerImpl()
+    {
+    	long mit = DEFAULT_MAX_IDLE_TIME;
+    	long ma = DEFAULT_MAX_AGE;
+    	
+    	String aProperty;
+    	aProperty = System.getProperty("org.apache.tuscany.sca.core.scope.ConversationalScopeContainer.MaxIdleTime");
+    	if (aProperty != null) {
+    		try {
+    			mit = (new Long(aProperty) * 1000);
+    		} catch (NumberFormatException nfe) {
+    			// Ignore
+    		}
+    	}
+
+        aProperty = System.getProperty("org.apache.tuscany.sca.core.scope.ConversationalScopeContainer.MaxAge");
+        if (aProperty != null) {
+            try {
+                ma = (new Long(aProperty) * 1000);
+            } catch (NumberFormatException nfe) {
+                // Ignore
+            }
+        }
+
+        maxAge = ma;
+        maxIdleTime = mit;
+    }
+    
+    /**
+     * @see org.apache.tuscany.sca.core.conversation.ConversationManager#addListener(org.apache.tuscany.sca.core.conversation.ConversationListener)
+     */
+    public void addListener(ConversationListener listener) {
+        listeners.add(listener);
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.core.conversation.ConversationManager#endConversation(org.apache.tuscany.sca.core.conversation.ExtendedConversation)
+     */
+    public void endConversation(Object conversationID) {
+        ExtendedConversation conv = getConversation(conversationID);
+        if (conv != null) {
+            conv.setState(ConversationState.ENDED);
+            for (ConversationListener listener : listeners) {
+                listener.conversationEnded(conv);
+            }
+            conv.setConversationID(null);
+            conversations.remove(conversationID);
+        } else {
+            throw new IllegalStateException("Conversation " + conversationID + " doesn't exist.");
+        }
+    }
+
+    public void expireConversation(Object conversationID) {
+        ExtendedConversation conv = getConversation(conversationID);
+        if (conv != null) {
+            for (ConversationListener listener : listeners) {
+                listener.conversationExpired(conv);
+            }
+            conversations.remove(conversationID);
+        } else {
+            throw new IllegalStateException("Conversation " + conversationID + " doesn't exist.");
+        }
+
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.core.conversation.ConversationManager#getConversation(java.lang.Object)
+     */
+    public ExtendedConversation getConversation(Object conversationID) {
+        return conversations.get(conversationID);
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.core.conversation.ConversationManager#removeListener(org.apache.tuscany.sca.core.conversation.ConversationListener)
+     */
+    public void removeListener(ConversationListener listener) {
+        listeners.remove(listener);
+    }
+
+    /**
+     * starts the reaper thread
+     */
+    public void scheduleConversation(ExtendedConversationImpl aConversation, long time)
+    {
+    	this.scheduler.schedule(aConversation, time, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * stops the reaper thread
+     */
+    public synchronized void stopReaper() {
+
+        // Prevent the scheduler from submitting any additional reapers, 
+    	// initiate an orderly shutdown if a reaper task is in progress. 
+    	this.scheduler.shutdown();
+    }
+    
+
+    /**
+     * @see org.apache.tuscany.sca.core.conversation.ConversationManager#startConversation(java.lang.Object)
+     */
+    public ExtendedConversation startConversation(Object conversationID) {
+    	
+        if (conversationID == null) {
+            conversationID = UUID.randomUUID().toString();
+        }
+        ExtendedConversation conversation = getConversation(conversationID);
+        if (conversation != null && conversation.getState() != ConversationState.ENDED) {
+            throw new IllegalStateException(conversation + " already exists.");
+        }
+                
+        conversation = new ExtendedConversationImpl(
+        		this, conversationID, ConversationState.STARTED);
+        conversations.put(conversationID, conversation);
+        for (ConversationListener listener : listeners) {
+            listener.conversationStarted(conversation);
+        }
+        return conversation;
+    }
+
+    /**
+     * return the default max idle time
+     * @param impProvider the implementation Provider to extract any ConversationAttribute details
+     */
+    public long getMaxIdleTime()
+    {
+        return maxIdleTime;
+    }
+    
+    /**
+     * returns the default max age
+     * @param impProvider the implementation Provider to extract any ConversationAttribute details
+     */
+    public long getMaxAge(){
+        return maxAge;
+    } 
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationState.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationState.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationState.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ConversationState.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,29 @@
+/*
+ * 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.conversation;
+
+/**
+ * The states of a conversation
+ * 
+ * @version $Rev: 575101 $ $Date: 2007-09-12 15:09:19 -0700 (Wed, 12 Sep 2007) $
+ */
+public enum ConversationState {
+    STARTED, ENDED, EXPIRED
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversation.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversation.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversation.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.conversation;
+
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.osoa.sca.Conversation;
+
+/**
+ * An extended interface over org.osoa.Conversation
+ * 
+ * @version $Rev: 620333 $ $Date: 2008-02-10 13:31:04 -0800 (Sun, 10 Feb 2008) $
+ */
+public interface ExtendedConversation extends Conversation {
+    /**
+     * Get the state of a conversation
+     * @return The state
+     */
+    ConversationState getState();
+
+    /**
+     * @param state the state to set
+     */
+    void setState(ConversationState state);
+
+    /**
+     * @param conversationID the conversationID to set
+     */
+    void setConversationID(Object conversationID);
+    
+    
+    /**
+     * will check whether this conversation has expired and update state if it has 
+     * @return true if it has expired
+     */
+    boolean isExpired();
+    
+    /**
+     * updates the last time this conversation was referenced
+     */
+    void updateLastReferencedTime();
+    
+    public void initializeConversationAttributes(RuntimeComponent targetComponent);
+
+    
+    /**
+     * @return true if the conversational attributes have been initialized
+     */
+    public boolean conversationalAttributesInitialized();
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversationImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversationImpl.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversationImpl.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/conversation/ExtendedConversationImpl.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,269 @@
+/*
+ * 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.conversation;
+
+import org.apache.tuscany.sca.core.scope.ScopedImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+
+/**
+ * 
+ * @version $Rev: 637931 $ $Date: 2008-03-17 08:10:55 -0700 (Mon, 17 Mar 2008) $
+ */
+public class ExtendedConversationImpl implements ExtendedConversation, Runnable {
+	
+    private final ConversationManagerImpl manager;
+    private volatile Object conversationID;
+    private ConversationState state;
+
+    /**
+     * syncs access to the state
+     */
+    private final Object stateSync = new Object();
+    
+    /**
+     * the maximum time a conversation can exist
+     */
+    private long expirationTime = 0;
+    
+    /**
+     * the maximum time this conversation can be idle
+     */
+    private long maxIdleTime = 0;
+    
+    /**
+     * the maximum age of this conversation
+     */
+    private long maxAge = 0;
+    
+    /**
+     * the time that this object was created 
+     */
+    private long creationTime;    
+
+    /**
+     * the time that this object was last referenced 
+     */
+    private long lastReferencedTime;
+    
+    /**
+     * boolean to ensure expiry only occurs once
+     */
+    private boolean expired = false;
+    
+    /**
+     * boolean to indicate if the conversation attributes have 
+     * been set. In the case where a remote binding is used 
+     * within a composite the JDKInvocationHandler can create the 
+     * conversation but the conversationAttributes are not available
+     * until the conversation is retrieved by the RuntimeWireInvoker
+     */
+    private boolean conversationAttributesInitialized = false;    
+    
+    /**
+     * Constructor
+     * @param manager the conversation manager
+     * @param conversationID the conversation id associated with this conversation
+     * @param state the initial state of this conversation
+     * @param aMaxAge the maximum age of the conversation
+     * @param aMaxIdleTime the maximum idle time
+     */
+    public ExtendedConversationImpl(ConversationManagerImpl manager, 
+    			Object conversationID, ConversationState state) {
+        super();
+        
+        this.creationTime = System.currentTimeMillis();
+        this.lastReferencedTime = creationTime;
+        this.manager = manager;
+        this.conversationID = conversationID;
+        this.state = state;
+    }
+
+    /**
+     * will check whether this conversation has expired and update state if it has 
+     * @return true if it has expired
+     */
+    public boolean isExpired() {
+        long currentTime;
+        synchronized (stateSync) {
+
+            // if the attributes haven't been initialized then
+            // this conversation object can't expire
+            if (conversationAttributesInitialized == false) {
+                return false;
+            }
+
+            // check state first
+            if (state == ConversationState.EXPIRED) {
+                return true;
+            }
+
+            // check whether the time is finished
+            currentTime = System.currentTimeMillis();
+            if (((this.lastReferencedTime + this.maxIdleTime) <= currentTime)
+                    || (this.expirationTime <= currentTime)) {
+                setState(ConversationState.EXPIRED);
+                return true;
+            }
+        }
+        scheduleNextExpiryTime(currentTime);
+        return false;
+    }
+
+    /**
+     * schedule next expiry time
+     */
+    public void scheduleNextExpiryTime(long currentTime)
+    {
+    	if ((lastReferencedTime + maxIdleTime) < expirationTime){ 
+    		manager.scheduleConversation(this, (lastReferencedTime + maxIdleTime) - currentTime);
+    	}
+    	else{
+    		manager.scheduleConversation(this, expirationTime - currentTime);
+    	}
+    }
+    /**
+     * updates the last time this conversation was referenced
+     */
+    public void updateLastReferencedTime() {
+        this.lastReferencedTime = System.currentTimeMillis();
+        if (conversationAttributesInitialized == true){
+            scheduleNextExpiryTime(lastReferencedTime);
+        }
+    }
+    
+    public ConversationState getState() {
+    	synchronized (stateSync){
+    		return state;
+    	}
+    }
+
+    public void end() {
+        manager.endConversation(conversationID);
+    }
+
+    public Object getConversationID() {
+        return conversationID;
+    }
+
+    /**
+     * @param state the state to set
+     */
+    public void setState(ConversationState state) {
+    	synchronized (stateSync){
+    		this.state = state;
+    	}
+    }
+
+    /**
+     * @param conversationID the conversationID to set
+     */
+    public void setConversationID(Object conversationID) {
+    	synchronized (stateSync){
+    		if (state != ConversationState.ENDED) {
+    			throw new IllegalStateException("The state of conversation " + conversationID + " " + state);
+    		}
+    	}
+        this.conversationID = conversationID;
+    }
+    
+    /**
+     * @param maxAge the maximum age of this conversation
+     */
+    public void initializeConversationAttributes(RuntimeComponent targetComponent){
+        if (targetComponent != null){ 
+            this.maxAge = getMaxIdleTime(targetComponent.getImplementationProvider());
+            this.maxIdleTime = getMaxAge(targetComponent.getImplementationProvider());
+            this.expirationTime = creationTime + maxAge;
+            this.conversationAttributesInitialized = true;
+        }        
+    }
+    
+    /**
+     * @return true if the conversational attributes have been initialized
+     */
+    public boolean conversationalAttributesInitialized(){
+        return this.conversationAttributesInitialized;
+    }
+    
+    /**
+     * return the max idle time
+     * @param impProvider the implementation Provider to extract any ConversationAttribute details
+     */
+    private long getMaxIdleTime(ImplementationProvider impProvider)
+    {
+        // Check to see if the maxIdleTime has been specified using @ConversationAttributes.  
+        // Implementation annotated attributes are honoured first.
+        if ((impProvider != null) &&
+            (impProvider instanceof ScopedImplementationProvider)) {
+            ScopedImplementationProvider aScopedImpl =
+                (ScopedImplementationProvider) impProvider;
+            
+            long maxIdleTime = aScopedImpl.getMaxIdleTime();
+            if (maxIdleTime > 0) {
+                return maxIdleTime;
+            }
+        }
+        return manager.getMaxIdleTime();
+    }
+    
+    /**
+     * returns the max age
+     * @param impProvider the implementation Provider to extract any ConversationAttribute details
+     */
+    private long getMaxAge(ImplementationProvider impProvider){
+
+        // Check to see if the maxAge has been specified using @ConversationAttributes.  
+        // Implementation annotated attributes are honoured first.
+        if ((impProvider != null) &&
+            (impProvider instanceof ScopedImplementationProvider)) {
+            ScopedImplementationProvider aScopedImpl =
+                (ScopedImplementationProvider) impProvider;
+
+            long maxAge = aScopedImpl.getMaxAge();
+            if (maxAge > 0) {
+                return maxAge;
+            }
+        }
+        return manager.getMaxAge();
+    }     
+
+    /**
+     * called when expiring
+     */
+    public void run() 
+    {
+        synchronized (stateSync){
+        	if (!expired){
+        		if (isExpired()) {
+        		    expired = true;
+        			try {
+        				manager.expireConversation(getConversationID());
+        			} catch (IllegalStateException ise) {
+        				// ignore this.. this can occur if another thread has subsequently ended
+        				// the conversation
+        			}
+        		}
+        	}
+        }
+        
+    }
+    
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/BaseEventPublisher.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/BaseEventPublisher.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/BaseEventPublisher.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/BaseEventPublisher.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,89 @@
+/*
+ * 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.event;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.tuscany.sca.event.Event;
+import org.apache.tuscany.sca.event.EventFilter;
+import org.apache.tuscany.sca.event.EventPublisher;
+import org.apache.tuscany.sca.event.RuntimeEventListener;
+import org.apache.tuscany.sca.event.TrueFilter;
+
+/**
+ * Base implementation of an <code>EventPublisher</code>
+ *
+ * @version $Rev: 537240 $ $Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $
+ */
+public abstract class BaseEventPublisher implements EventPublisher {
+    protected static final EventFilter TRUE_FILTER = new TrueFilter();
+    protected Map<EventFilter, List<RuntimeEventListener>> listeners;
+
+    public void addListener(RuntimeEventListener listener) {
+        addListener(TRUE_FILTER, listener);
+    }
+
+    public void removeListener(RuntimeEventListener listener) {
+        assert listener != null : "Listener cannot be null";
+        synchronized (getListeners()) {
+            for (List<RuntimeEventListener> currentList : getListeners().values()) {
+                for (RuntimeEventListener current : currentList) {
+                    if (current == listener) {
+                        currentList.remove(current);
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    public void addListener(EventFilter filter, RuntimeEventListener listener) {
+        assert listener != null : "Listener cannot be null";
+        synchronized (getListeners()) {
+            List<RuntimeEventListener> list = getListeners().get(filter);
+            if (list == null) {
+                list = new CopyOnWriteArrayList<RuntimeEventListener>();
+                listeners.put(filter, list);
+            }
+            list.add(listener);
+        }
+    }
+
+    public void publish(Event event) {
+        assert event != null : "Event object was null";
+        for (Map.Entry<EventFilter, List<RuntimeEventListener>> entry : getListeners().entrySet()) {
+            if (entry.getKey().match(event)) {
+                for (RuntimeEventListener listener : entry.getValue()) {
+                    listener.onEvent(event);
+                }
+            }
+        }
+    }
+
+    protected Map<EventFilter, List<RuntimeEventListener>> getListeners() {
+        if (listeners == null) {
+            listeners = new ConcurrentHashMap<EventFilter, List<RuntimeEventListener>>();
+        }
+        return listeners;
+    }
+
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStart.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStart.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStart.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,54 @@
+/*
+ * 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.event;
+
+import java.net.URI;
+
+import org.apache.tuscany.sca.event.Event;
+
+/**
+ * Propagated when a component starts
+ *
+ * @version $$Rev: 639271 $$ $$Date: 2008-03-20 05:54:38 -0700 (Thu, 20 Mar 2008) $$
+ */
+public class ComponentStart implements Event {
+
+    private Object source;
+    private URI uri;
+
+    /**
+     * Creates a component start event
+     *
+     * @param source       the source of the event
+     * @param componentURI the URI of the component being started
+     */
+    public ComponentStart(Object source, URI componentURI) {
+        this.source = source;
+        this.uri = componentURI;
+    }
+
+    public URI getComponentURI() {
+        return uri;
+    }
+    
+    public Object getSource() {
+        return source;
+    }
+
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStop.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStop.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStop.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ComponentStop.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,53 @@
+/*
+ * 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.event;
+
+import java.net.URI;
+
+import org.apache.tuscany.sca.event.Event;
+
+/**
+ * Propagated when a component stops
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class ComponentStop implements Event {
+
+    private Object source; 
+    private URI uri;
+
+    /**
+     * Creates a component stop event
+     *
+     * @param source    the source of the event
+     * @param componentUri the composite component associated the component being stopped
+     */
+    public ComponentStop(Object source, URI componentUri) {
+        this.source = source;
+        this.uri = componentUri;
+    }
+
+    public URI getComponentURI() {
+        return uri;
+    }
+    
+    public Object getSource() {
+        return source;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationEnd.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationEnd.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationEnd.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationEnd.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,53 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+
+
+/**
+ * Propagated when a conversation is expired
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class ConversationEnd implements Event {
+    
+    private Object source;
+    private Object id;
+
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     * @param id     the id of the conversation being ended
+     */
+    public ConversationEnd(Object source, Object id) {
+        this.source = source;
+        this.id = id;
+    }
+
+    public Object getSource() {
+        return source;
+    }
+    
+    public Object getConversationID() {
+        return id;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationStart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationStart.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationStart.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/ConversationStart.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,52 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+
+/**
+ * Propagated when a conversation has started
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class ConversationStart implements Event {
+    
+    private Object source;
+    private Object id;
+
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     * @param id     the id of the conversation being started
+     */
+    public ConversationStart(Object source, Object id) {
+        this.source = source;
+        this.id = id;
+    }
+
+    public Object getSource() {
+        return source;
+    }
+    
+    public Object getConversationID() {
+        return id;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionEnd.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionEnd.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionEnd.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionEnd.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,53 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+
+
+/**
+ * Propagated when an HTTP-based session is expired
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class HttpSessionEnd implements Event {
+    
+    private Object source;
+    private Object id;
+
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     * @param id     the id of the HTTP session being ended
+     */
+    public HttpSessionEnd(Object source, Object id) {
+        this.source = source;
+        this.id = id;
+    }
+
+    public Object getSource() {
+        return source;
+    }
+    
+    public Object getSessionID() {
+        return id;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionStart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionStart.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionStart.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/HttpSessionStart.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,52 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+
+/**
+ * Propagated when an HTTP-based session has started
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class HttpSessionStart implements Event {
+    
+    private Object source;
+    private Object id;
+
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     * @param id     the id of the HTTP session being started
+     */
+    public HttpSessionStart(Object source, Object id) {
+        this.source = source;
+        this.id = id;
+    }
+
+    public Object getSource() {
+        return source;
+    }
+    
+    public Object getSessionID() {
+        return id;
+    }
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestEnd.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestEnd.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestEnd.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestEnd.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,45 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+/**
+ * Propagated when a request completes or is ended
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class RequestEnd implements Event {
+
+    private Object source;
+    
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     */
+    public RequestEnd(Object source) {
+        this.source = source;
+    }
+    
+    public Object getSource() {
+        return source;
+    }
+
+}

Added: incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestStart.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestStart.java?rev=639535&view=auto
==============================================================================
--- incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestStart.java (added)
+++ incubator/tuscany/sandbox/mobile-android/core-android/src/main/java/org/apache/tuscany/sca/core/event/RequestStart.java Thu Mar 20 20:42:35 2008
@@ -0,0 +1,45 @@
+/*
+ * 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.event;
+
+import org.apache.tuscany.sca.event.Event;
+
+/**
+ * Propagated when a request is started in the runtime
+ *
+ * @version $$Rev: 537240 $$ $$Date: 2007-05-11 10:35:03 -0700 (Fri, 11 May 2007) $$
+ */
+public class RequestStart implements Event {
+    
+    private Object source;
+
+    /**
+     * Creates a new event
+     *
+     * @param source the source of the event
+     */
+    public RequestStart(Object source) {
+        this.source = source;
+    }
+
+    public Object getSource() {
+        return source;
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org