summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context')
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ComponentContextFactory.java38
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/CompositeContext.java174
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ContextFactoryExtensionPoint.java51
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/DefaultContextFactoryExtensionPoint.java115
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/PropertyValueFactory.java42
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/RequestContextFactory.java35
-rw-r--r--sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ThreadMessageContext.java138
7 files changed, 593 insertions, 0 deletions
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ComponentContextFactory.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ComponentContextFactory.java
new file mode 100644
index 0000000000..2a690dbf0d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ComponentContextFactory.java
@@ -0,0 +1,38 @@
+/*
+ * 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.context;
+
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.oasisopen.sca.ComponentContext;
+
+/**
+ * Interface implemented by the provider of the ComponentContext.
+ *
+ * @version $Rev$ $Date$
+ * @tuscany.spi.extension.asclient
+ */
+public interface ComponentContextFactory {
+ /**
+ * Create an instance of ComponentContext
+ *
+ * @param component The runtime component
+ * @return An instance of ComponentContext for the component
+ */
+ ComponentContext createComponentContext(CompositeContext compositeContext, RuntimeComponent component);
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/CompositeContext.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/CompositeContext.java
new file mode 100644
index 0000000000..313c4bb64e
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/CompositeContext.java
@@ -0,0 +1,174 @@
+/*
+ * 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.context;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.definitions.Definitions;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.DomainRegistry;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentContext;
+
+/**
+ * The context associated with the Node that provides access to ExtensionPointRegistry and DomainRegistry
+ *
+ * @version $Rev$ $Date$
+ */
+public class CompositeContext {
+ protected ExtensionPointRegistry extensionPointRegistry;
+ protected DomainRegistry domainRegistry;
+ protected ComponentContextFactory componentContextFactory;
+ protected Composite domainComposite;
+ protected String nodeURI;
+ protected String domainURI;
+ protected Definitions systemDefinitions;
+
+ protected Map<String, Object> attributes = new HashMap<String, Object>();
+
+ public CompositeContext(ExtensionPointRegistry registry,
+ DomainRegistry domainRegistry,
+ Composite domainComposite,
+ String domainURI,
+ String nodeURI,
+ Definitions systemDefinitions) {
+ this.extensionPointRegistry = registry;
+ this.domainRegistry = domainRegistry;
+ ContextFactoryExtensionPoint contextFactories = registry.getExtensionPoint(ContextFactoryExtensionPoint.class);
+ this.componentContextFactory = contextFactories.getFactory(ComponentContextFactory.class);
+ this.domainComposite = domainComposite;
+ this.domainURI = domainURI;
+ this.nodeURI = nodeURI;
+ this.systemDefinitions = systemDefinitions;
+ }
+
+ public CompositeContext(ExtensionPointRegistry registry, DomainRegistry domainRegistry) {
+ this(registry, domainRegistry, null, "default", "default", null);
+ }
+
+ /**
+ * @return
+ */
+ public static RuntimeComponent getCurrentComponent() {
+ Message message = ThreadMessageContext.getMessageContext();
+ if (message != null) {
+ Endpoint to = message.getTo();
+ if (to == null) {
+ return null;
+ }
+ RuntimeComponent component = (RuntimeComponent)message.getTo().getComponent();
+ return component;
+ }
+ return null;
+ }
+
+ /**
+ * @return
+ */
+ public static CompositeContext getCurrentCompositeContext() {
+ RuntimeComponent component = getCurrentComponent();
+ if (component != null) {
+ RuntimeComponentContext componentContext = component.getComponentContext();
+ return componentContext.getCompositeContext();
+ }
+ return null;
+ }
+
+ public void bindComponent(RuntimeComponent runtimeComponent) {
+ RuntimeComponentContext componentContext =
+ (RuntimeComponentContext)componentContextFactory.createComponentContext(this, runtimeComponent);
+ runtimeComponent.setComponentContext(componentContext);
+ }
+
+ /**
+ *
+ * @param endpointReference
+ */
+ public void bindEndpointReference(EndpointReference endpointReference) {
+
+ }
+
+ /**
+ * Get the ExtensionPointRegistry for this node
+ * @return The ExtensionPointRegistry
+ */
+ public ExtensionPointRegistry getExtensionPointRegistry() {
+ return extensionPointRegistry;
+ }
+
+ /**
+ * Get the DomainRegistry
+ * @return The DomainRegistry for this node
+ */
+ public DomainRegistry getEndpointRegistry() {
+ return domainRegistry;
+ }
+
+ public Composite getDomainComposite() {
+ return domainComposite;
+ }
+
+ public String getNodeURI() {
+ return nodeURI;
+ }
+
+ public String getDomainURI() {
+ return domainURI;
+ }
+
+ /**
+ * The system definitions that result from starting the runtime.
+ * TODO - these can be null when the SCAClient starts the runtime
+ *
+ * @return systemDefinitions
+ */
+ public Definitions getSystemDefinitions() {
+ return systemDefinitions;
+ }
+
+ /**
+ * Look up an attribute value by name
+ * @param <T>
+ * @param name The name of the attribute
+ * @return The value of the attribute
+ */
+ @SuppressWarnings("unchecked")
+ public <T> T getAttribute(String name) {
+ return (T)attributes.get(name);
+ }
+
+ /**
+ * Set the value of an attribute
+ * @param name The name of the attribute
+ * @param value
+ */
+ public void setAttribute(String name, Object value) {
+ attributes.put(name, value);
+ }
+
+ public Map<String, Object> getAttributes() {
+ return attributes;
+ }
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ContextFactoryExtensionPoint.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ContextFactoryExtensionPoint.java
new file mode 100644
index 0000000000..ddcc46a1ac
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ContextFactoryExtensionPoint.java
@@ -0,0 +1,51 @@
+/*
+ * 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.context;
+
+/**
+ * An extension point for context factories.
+ *
+ * @version $Rev$ $Date$
+ * @tuscany.spi.extension.asclient
+ */
+public interface ContextFactoryExtensionPoint {
+
+ /**
+ * Add a context factory extension.
+ *
+ * @param factory The factory to add
+ */
+ void addFactory(Object factory);
+
+ /**
+ * Remove a context factory extension.
+ *
+ * @param factory The factory to remove
+ */
+ void removeFactory(Object factory);
+
+ /**
+ * Get a factory implementing the given interface.
+ * @param factoryInterface the lookup key (factory interface)
+ * @return The factory
+ */
+ <T> T getFactory(Class<T> factoryInterface);
+
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/DefaultContextFactoryExtensionPoint.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/DefaultContextFactoryExtensionPoint.java
new file mode 100644
index 0000000000..50882c9498
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/DefaultContextFactoryExtensionPoint.java
@@ -0,0 +1,115 @@
+/*
+ * 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.context;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+
+/**
+ * Default implementation of a model factory extension point.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultContextFactoryExtensionPoint implements ContextFactoryExtensionPoint {
+
+ /**
+ * The Map of Factories that have been registered.
+ */
+ private HashMap<Class<?>, Object> factories = new HashMap<Class<?>, Object>();
+
+ private ExtensionPointRegistry registry;
+
+ public DefaultContextFactoryExtensionPoint(ExtensionPointRegistry registry) {
+ this.registry = registry;
+ }
+
+ /**
+ * Add a model factory extension.
+ *
+ * @param factory The factory to add.
+ * @throws IllegalArgumentException if factory is null
+ */
+ public void addFactory(Object factory) throws IllegalArgumentException {
+ if (factory == null) {
+ throw new IllegalArgumentException("Cannot add null as a factory");
+ }
+
+ Class<?>[] interfaces = factory.getClass().getInterfaces();
+ for (int i = 0; i<interfaces.length; i++) {
+ factories.put(interfaces[i], factory);
+ }
+ }
+
+ /**
+ * Remove a model factory extension.
+ *
+ * @param factory The factory to remove
+ * @throws IllegalArgumentException if factory is null
+ */
+ public void removeFactory(Object factory) throws IllegalArgumentException {
+ if (factory == null) {
+ throw new IllegalArgumentException("Cannot remove null as a factory");
+ }
+
+ Class<?>[] interfaces = factory.getClass().getInterfaces();
+ for (int i = 0; i<interfaces.length; i++) {
+ factories.remove(interfaces[i]);
+ }
+ }
+
+ /**
+ * Get a factory implementing the given interface.
+ *
+ * @param factoryInterface The lookup key (factory interface)
+ * @return The factory
+ */
+ public <T> T getFactory(Class<T> factoryInterface) throws IllegalArgumentException {
+ if (factoryInterface == null) {
+ throw new IllegalArgumentException("Cannot get null as a factory");
+ }
+
+ Object factory = factories.get(factoryInterface);
+ if (factory == null) {
+
+ // Dynamically load a factory class declared under META-INF/services
+ try {
+ ServiceDeclaration factoryDeclaration = registry.getServiceDiscovery().getServiceDeclaration(factoryInterface.getName());
+ if (factoryDeclaration != null) {
+ Class<?> factoryClass = factoryDeclaration.loadClass();
+
+ // Default empty constructor
+ Constructor<?> constructor = factoryClass.getConstructor(ExtensionPointRegistry.class);
+ factory = constructor.newInstance(registry);
+
+ // Cache the loaded factory
+ addFactory(factory);
+ }
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ }
+
+ return factoryInterface.cast(factory);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/PropertyValueFactory.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/PropertyValueFactory.java
new file mode 100644
index 0000000000..5b91db124c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/PropertyValueFactory.java
@@ -0,0 +1,42 @@
+/*
+ * 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.context;
+
+import org.apache.tuscany.sca.assembly.ComponentProperty;
+
+/**
+ * Interface implemented by the provider of the property values
+ *
+ * @version $Rev$ $Date$
+ * @tuscany.spi.extension.asclient
+ * @tuscany.spi.extension.inheritfrom
+ */
+public interface PropertyValueFactory {
+
+ /**
+ * This method will create an instance of the value for the specified Property.
+ *
+ * @param property The Property from which to retrieve the property value
+ * @param type The type of the property value being retrieved from the Property
+ * @param <B> Type type of the property value being looked up
+ *
+ * @return the value for the Property
+ */
+ <B> B createPropertyValue(ComponentProperty property, Class<B> type);
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/RequestContextFactory.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/RequestContextFactory.java
new file mode 100644
index 0000000000..4475427d4b
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/RequestContextFactory.java
@@ -0,0 +1,35 @@
+/*
+ * 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.context;
+
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.oasisopen.sca.RequestContext;
+
+/**
+ * Interface implemented by the provider of the RequestContext.
+ *
+ * @version $Rev$ $Date$
+ * @tuscany.spi.extension.asclient
+ */
+public interface RequestContextFactory {
+ /**
+ * @return An instance of RequestContext for the current invocation
+ */
+ RequestContext createRequestContext(RuntimeComponent component);
+}
diff --git a/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ThreadMessageContext.java b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ThreadMessageContext.java
new file mode 100644
index 0000000000..ea1b8b6d30
--- /dev/null
+++ b/sca-java-2.x/branches/2.0/modules/core-spi/src/main/java/org/apache/tuscany/sca/context/ThreadMessageContext.java
@@ -0,0 +1,138 @@
+/*
+ * 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.context;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Message;
+
+/**
+ * Class for tunnelling a WorkContext through the invocation of a user class.
+ *
+ * @version $Rev$ $Date$
+ */
+public final class ThreadMessageContext {
+
+ // TUSCANY-3770: Used as a marker for detecting when thread context information can be removed
+ private static final Message msg = new Message() {
+ private Map<String, Object> headers = new HashMap<String, Object>();
+ public void setTo(Endpoint to) {}
+ public void setOperation(Operation op) {}
+ public void setMessageID(Object messageId) {}
+ public void setFrom(EndpointReference from) {}
+ public <T> void setFaultBody(T fault) {}
+ public <T> void setBody(T body) {}
+ public <T> void setBindingContext(T bindingContext) {}
+ public boolean isFault() {
+ return false;
+ }
+ public Endpoint getTo() {
+ return null;
+ }
+ public Operation getOperation() {
+ return null;
+ }
+ public Object getMessageID() {
+ return null;
+ }
+ public Map<String, Object> getHeaders() {
+ return headers;
+ }
+ public EndpointReference getFrom() {
+ return null;
+ }
+ public <T> T getBody() {
+ return null;
+ }
+ public <T> T getBindingContext() {
+ return null;
+ }
+ };
+
+ private static final ThreadLocal<Message> CONTEXT = new ThreadLocal<Message>(){
+ @Override
+ protected synchronized Message initialValue() {
+ return msg;
+ }
+ };
+
+ private static final ThreadLocal<Message> PREVIOUS_CONTEXT = new ThreadLocal<Message>();
+
+ private ThreadMessageContext() {
+ }
+
+ /**
+ * Set the WorkContext for the current thread.
+ * The current work context is returned and must be restored after the invocation is complete.
+ * Typical usage would be:
+ * <pre>
+ * WorkContext old = PojoWorkContextTunnel.setThreadWorkContext(newContext);
+ * try {
+ * ... invoke user code ...
+ * } finally {
+ * PojoWorkContextTunnel.setThreadWorkContext(old);
+ * }
+ * </pre>
+ * @param context
+ * @return the current work context for the thread; this must be restored after the invocation is made
+ */
+ public static Message setMessageContext(Message context) {
+ Message old = CONTEXT.get();
+ CONTEXT.set(context);
+ PREVIOUS_CONTEXT.set(old);
+
+ // TUSCANY-3770: Remove thread context information when the request invocation has completed
+ if (context == msg) {
+ removeMessageContext();
+ removePreviousMessageContext();
+ }
+ return old;
+ }
+
+ /**
+ * Returns the WorkContext for the current thread.
+ *
+ * @return the WorkContext for the current thread
+ */
+ public static Message getMessageContext() {
+ return CONTEXT.get();
+ }
+
+ public static Message getPreviousMessageContext() {
+ return PREVIOUS_CONTEXT.get();
+ }
+
+ /**
+ * Removes any state from the current thread to ensure that
+ * any associated classloaders can be GCd
+ */
+ // TUSCANY-3770: The thread context information is removed implicitly above
+ public static void removeMessageContext() {
+ CONTEXT.remove();
+ }
+
+ //for performance concerns - set to null rather than call remove
+ public static void removePreviousMessageContext() {
+ PREVIOUS_CONTEXT.set(null);
+ }
+}