summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-0.91/modules/implementation-resource/src
diff options
context:
space:
mode:
authordims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
committerdims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
commitbdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a (patch)
tree38a92061c0793434c4be189f1d70c3458b6bc41d /branches/sca-java-0.91/modules/implementation-resource/src
Move Tuscany from Incubator to top level.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-0.91/modules/implementation-resource/src')
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/DefaultHTTPResourceBindingFactory.java33
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBinding.java28
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBindingFactory.java33
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingImpl.java77
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingProcessor.java73
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceBindingProviderFactory.java54
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceServiceBindingProvider.java96
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/DefaultResourceImplementationFactory.java53
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/Resource.java38
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementation.java58
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationFactory.java34
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationImpl.java154
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationProcessor.java111
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/module/ResourceImplementationModuleActivator.java91
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProvider.java57
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProviderFactory.java44
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceInvoker.java43
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator19
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/test/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationTestCase.java105
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/test/resources/content/test.html21
-rw-r--r--branches/sca-java-0.91/modules/implementation-resource/src/test/resources/resource.composite40
21 files changed, 1262 insertions, 0 deletions
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/DefaultHTTPResourceBindingFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/DefaultHTTPResourceBindingFactory.java
new file mode 100644
index 0000000000..7de2c3a2ca
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/DefaultHTTPResourceBindingFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.binding.resource;
+
+import org.apache.tuscany.sca.binding.resource.impl.HTTPResourceBindingImpl;
+
+/**
+ * A factory for the sample Echo binding model.
+ */
+public class DefaultHTTPResourceBindingFactory implements HTTPResourceBindingFactory {
+
+ public HTTPResourceBinding createHTTPResourceBinding() {
+ return new HTTPResourceBindingImpl();
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBinding.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBinding.java
new file mode 100644
index 0000000000..8679f0cf84
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBinding.java
@@ -0,0 +1,28 @@
+/*
+ * 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.binding.resource;
+
+import org.apache.tuscany.sca.assembly.Binding;
+
+/**
+ * A model for the HTTP resource binding.
+ */
+public interface HTTPResourceBinding extends Binding {
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBindingFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBindingFactory.java
new file mode 100644
index 0000000000..b2fb2eae1d
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/HTTPResourceBindingFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.binding.resource;
+
+/**
+ * A factory for the HTTP resource binding model.
+ */
+public interface HTTPResourceBindingFactory {
+
+ /**
+ * Creates a new HTTP resource binding.
+ *
+ * @return a new HTTP resource binding
+ */
+ HTTPResourceBinding createHTTPResourceBinding();
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingImpl.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingImpl.java
new file mode 100644
index 0000000000..247041d47f
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingImpl.java
@@ -0,0 +1,77 @@
+/*
+ * 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.binding.resource.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBinding;
+import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.PolicySet;
+
+
+/**
+ * Implementation of the HTTP resource binding model.
+ */
+public class HTTPResourceBindingImpl implements HTTPResourceBinding {
+
+ private String name;
+ private String uri;
+
+ public String getName() {
+ return name;
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public List<PolicySet> getPolicySets() {
+ // The sample binding does not support policies
+ return Collections.emptyList();
+ }
+
+ public List<Intent> getRequiredIntents() {
+ // The sample binding does not support policies
+ return Collections.emptyList();
+ }
+
+ public List<Object> getExtensions() {
+ // The sample binding does not support extensions
+ return Collections.emptyList();
+ }
+
+ public boolean isUnresolved() {
+ return false;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ // The sample binding is always resolved
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingProcessor.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingProcessor.java
new file mode 100644
index 0000000000..80162fa77f
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/impl/HTTPResourceBindingProcessor.java
@@ -0,0 +1,73 @@
+/*
+ * 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.binding.resource.impl;
+
+import static org.osoa.sca.Constants.SCA_NS;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBinding;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBindingFactory;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+
+
+/**
+ * A processor for <binding.resource> elements.
+ */
+public class HTTPResourceBindingProcessor implements StAXArtifactProcessor<HTTPResourceBinding> {
+
+ private QName BINDING_RESOURCE = new QName(SCA_NS, "binding.resource");
+
+ private final HTTPResourceBindingFactory factory;
+
+ public HTTPResourceBindingProcessor(HTTPResourceBindingFactory factory) {
+ this.factory = factory;
+ }
+
+ public QName getArtifactType() {
+ return BINDING_RESOURCE;
+ }
+
+ public Class<HTTPResourceBinding> getModelType() {
+ return HTTPResourceBinding.class;
+ }
+
+ public HTTPResourceBinding read(XMLStreamReader reader) throws ContributionReadException {
+ String uri = reader.getAttributeValue(null, "uri");
+ HTTPResourceBinding echoBinding = factory.createHTTPResourceBinding();
+ if (uri != null) {
+ echoBinding.setURI(uri.trim());
+ }
+ return echoBinding;
+ }
+
+ public void write(HTTPResourceBinding echoBinding, XMLStreamWriter writer) throws ContributionWriteException {
+ }
+
+ public void resolve(HTTPResourceBinding echoBinding, ModelResolver resolver) throws ContributionResolveException {
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceBindingProviderFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceBindingProviderFactory.java
new file mode 100644
index 0000000000..0c2221a6b2
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceBindingProviderFactory.java
@@ -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.binding.resource.provider;
+
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBinding;
+import org.apache.tuscany.sca.http.ServletHost;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+
+/**
+ * Implementation of the Echo binding model.
+ */
+public class HTTPResourceBindingProviderFactory implements BindingProviderFactory<HTTPResourceBinding> {
+
+ private ServletHost servletHost;
+
+ public HTTPResourceBindingProviderFactory(ServletHost servletHost) {
+ this.servletHost = servletHost;
+ }
+
+ public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component, RuntimeComponentReference reference, HTTPResourceBinding binding) {
+ return null;
+ }
+
+ public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component, RuntimeComponentService service, HTTPResourceBinding binding) {
+ return new HTTPResourceServiceBindingProvider(component, service, binding, servletHost);
+ }
+
+ public Class<HTTPResourceBinding> getModelType() {
+ return HTTPResourceBinding.class;
+ }
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceServiceBindingProvider.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceServiceBindingProvider.java
new file mode 100644
index 0000000000..9564175df4
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/binding/resource/provider/HTTPResourceServiceBindingProvider.java
@@ -0,0 +1,96 @@
+/*
+ * 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.binding.resource.provider;
+
+import java.net.URL;
+
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBinding;
+import org.apache.tuscany.sca.http.DefaultResourceServlet;
+import org.apache.tuscany.sca.http.ServletHost;
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementation;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+
+/**
+ * Implementation of the Echo binding provider.
+ */
+public class HTTPResourceServiceBindingProvider implements ServiceBindingProvider {
+
+ private RuntimeComponent component;
+ private RuntimeComponentService service;
+ private HTTPResourceBinding binding;
+ private ServletHost servletHost;
+ private String uri;
+
+ public HTTPResourceServiceBindingProvider(RuntimeComponent component,
+ RuntimeComponentService service,
+ HTTPResourceBinding binding,
+ ServletHost servletHost) {
+ this.component = component;
+ this.service = service;
+ this.binding = binding;
+ this.servletHost = servletHost;
+
+ if (binding.getURI() != null) {
+ uri = binding.getURI();
+ if (!uri.endsWith("/")) {
+ uri += "/";
+ }
+ if (!uri.endsWith("*")) {
+ uri += "*";
+ }
+ } else {
+ uri = "/" + this.component.getName() + "/*";
+ }
+ }
+
+ public InterfaceContract getBindingInterfaceContract() {
+ return service.getInterfaceContract();
+ }
+
+ public void start() {
+
+ // Get the target component implementation, for now we are assuming
+ // that it's an implementation.resource
+ RuntimeComponentService componentService = (RuntimeComponentService) service;
+ RuntimeWire wire = componentService.getRuntimeWire(binding);
+ Implementation implementation = wire.getTarget().getComponent().getImplementation();
+ ResourceImplementation resourceImplementation = (ResourceImplementation)implementation;
+
+ // Get the resource location URL
+ URL locationURL = resourceImplementation.getLocationURL();
+
+ // Register the default resource servlet with the servlet host
+ DefaultResourceServlet resourceServlet = new DefaultResourceServlet(locationURL.toString());
+ servletHost.addServletMapping(uri, resourceServlet);
+
+ }
+
+ public void stop() {
+
+ // Unregister from the hosting server
+ servletHost.removeServletMapping(uri);
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/DefaultResourceImplementationFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/DefaultResourceImplementationFactory.java
new file mode 100644
index 0000000000..a94abfc2a1
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/DefaultResourceImplementationFactory.java
@@ -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.implementation.resource;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBindingFactory;
+import org.apache.tuscany.sca.implementation.resource.impl.ResourceImplementationImpl;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceIntrospector;
+
+
+/**
+ * A default factory for the resource implementation model.
+ */
+public class DefaultResourceImplementationFactory implements ResourceImplementationFactory {
+
+ private AssemblyFactory assemblyFactory;
+ private JavaInterfaceFactory javaFactory;
+ private JavaInterfaceIntrospector introspector;
+ private HTTPResourceBindingFactory bindingFactory;
+
+ public DefaultResourceImplementationFactory(AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaFactory,
+ JavaInterfaceIntrospector introspector,
+ HTTPResourceBindingFactory bindingFactory) {
+ this.assemblyFactory = assemblyFactory;
+ this.javaFactory = javaFactory;
+ this.introspector = introspector;
+ this.bindingFactory = bindingFactory;
+ }
+
+ public ResourceImplementation createResourceImplementation() {
+ return new ResourceImplementationImpl(assemblyFactory, javaFactory, introspector, bindingFactory);
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/Resource.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/Resource.java
new file mode 100644
index 0000000000..2c28d9d823
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/Resource.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.implementation.resource;
+
+import java.net.URL;
+
+/**
+ * The service interface of resource implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface Resource {
+
+ /**
+ * Returns the resource location URL.
+ *
+ * @return
+ */
+ public URL getLocationURL();
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementation.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementation.java
new file mode 100644
index 0000000000..44cb1b56eb
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementation.java
@@ -0,0 +1,58 @@
+/*
+ * 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.implementation.resource;
+
+import java.net.URL;
+
+import org.apache.tuscany.sca.assembly.Implementation;
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ */
+public interface ResourceImplementation extends Implementation {
+
+ /**
+ * Returns the location of the directory containing the resources.
+ *
+ * @return the location of the directory containing the resources
+ */
+ public String getLocation();
+
+ /**
+ * Sets the location of the directory containing the resources.
+ *
+ * @param location the location of the directory containing the resources
+ */
+ public void setLocation(String location);
+
+ /**
+ * Returns the resource location URL.
+ *
+ * @return the location URL
+ */
+ public URL getLocationURL();
+
+ /**
+ * Sets the resource location URL.
+ *
+ * @param url the resource location URL
+ */
+ public void setLocationURL(URL url);
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationFactory.java
new file mode 100644
index 0000000000..d38cbaff7b
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationFactory.java
@@ -0,0 +1,34 @@
+/*
+ * 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.implementation.resource;
+
+
+/**
+ * A factory for the resource implementation model.
+ */
+public interface ResourceImplementationFactory {
+
+ /**
+ * Creates a new resource implementation.
+ * @return a new resource implementation
+ */
+ ResourceImplementation createResourceImplementation();
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationImpl.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationImpl.java
new file mode 100644
index 0000000000..5391cac218
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationImpl.java
@@ -0,0 +1,154 @@
+/*
+ * 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.implementation.resource.impl;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.ConstrainingType;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBinding;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBindingFactory;
+import org.apache.tuscany.sca.implementation.resource.Resource;
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementation;
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceIntrospector;
+import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.PolicySet;
+
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ */
+public class ResourceImplementationImpl implements ResourceImplementation {
+
+ private Service resourceService;
+
+ private String location;
+ private URL url;
+ private boolean unresolved;
+
+ /**
+ * Constructs a new resource implementation.
+ */
+ public ResourceImplementationImpl(AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaFactory,
+ JavaInterfaceIntrospector introspector,
+ HTTPResourceBindingFactory bindingFactory) {
+
+ // Resource implementation always provide a single service exposing
+ // the Resource interface, and have no references and properties
+ resourceService = assemblyFactory.createService();
+ resourceService.setName("Resource");
+
+ // Create the Java interface contract for the Resource service
+ JavaInterface javaInterface;
+ try {
+ javaInterface = introspector.introspect(Resource.class);
+ } catch (InvalidInterfaceException e) {
+ throw new IllegalArgumentException(e);
+ }
+ JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
+ interfaceContract.setInterface(javaInterface);
+ resourceService.setInterfaceContract(interfaceContract);
+
+ // Configure the resource service with a default HTTP resource binding
+ HTTPResourceBinding resourceBinding = bindingFactory.createHTTPResourceBinding();
+ resourceService.getBindings().add(resourceBinding);
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public URL getLocationURL() {
+ return url;
+ }
+
+ public void setLocationURL(URL url) {
+ this.url = url;
+ }
+
+ public ConstrainingType getConstrainingType() {
+ // The resource implementation does not support constrainingTypes
+ return null;
+ }
+
+ public List<Property> getProperties() {
+ // The resource implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public List<Service> getServices() {
+ // The resource implementation does not support services
+ return Collections.singletonList(resourceService);
+ }
+
+ public List<Reference> getReferences() {
+ // The resource implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public String getURI() {
+ return location;
+ }
+
+ public void setConstrainingType(ConstrainingType constrainingType) {
+ // The resource implementation does not support constrainingTypes
+ }
+
+ public void setURI(String uri) {
+ this.location = uri;
+ }
+
+ public List<PolicySet> getPolicySets() {
+ // The resource implementation does not support policy sets
+ return Collections.emptyList();
+ }
+
+ public List<Intent> getRequiredIntents() {
+ // The resource implementation does not support intents
+ return Collections.emptyList();
+ }
+
+ public List<Object> getExtensions() {
+ // The resource implementation does not support extensions
+ return Collections.emptyList();
+ }
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ this.unresolved = unresolved;
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationProcessor.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationProcessor.java
new file mode 100644
index 0000000000..60d7b7fb5d
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/impl/ResourceImplementationProcessor.java
@@ -0,0 +1,111 @@
+/*
+ * 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.implementation.resource.impl;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+
+import java.io.IOException;
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DeployedArtifact;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementation;
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementationFactory;
+
+
+/**
+ * Implements a STAX artifact processor for resource implementations.
+ */
+public class ResourceImplementationProcessor implements StAXArtifactProcessor<ResourceImplementation> {
+ private static final QName IMPLEMENTATION_RESOURCE = new QName("http://www.osoa.org/xmlns/sca/1.0", "implementation.resource");
+
+ private ResourceImplementationFactory resourceFactory;
+ private ContributionFactory contributionFactory;
+
+ public ResourceImplementationProcessor(ResourceImplementationFactory resourceFactory, ContributionFactory contributionFactory) {
+ this.resourceFactory = resourceFactory;
+ this.contributionFactory = contributionFactory;
+ }
+
+ public QName getArtifactType() {
+ // Returns the qname of the XML element processed by this processor
+ return IMPLEMENTATION_RESOURCE;
+ }
+
+ public Class<ResourceImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return ResourceImplementation.class;
+ }
+
+ public ResourceImplementation read(XMLStreamReader reader) throws ContributionReadException {
+ assert IMPLEMENTATION_RESOURCE.equals(reader.getName());
+
+ // Read an <implementation.resource> element
+ try {
+ // Read the directory attribute. This is where the sample
+ // CRUD implementation will persist resources.
+ String location = reader.getAttributeValue(null, "location");
+
+ // Create an initialize the resource implementationmodel
+ ResourceImplementation implementation = resourceFactory.createResourceImplementation();
+ implementation.setLocation(location);
+ implementation.setUnresolved(true);
+
+ // Skip to end element
+ while (reader.hasNext()) {
+ if (reader.next() == END_ELEMENT && IMPLEMENTATION_RESOURCE.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ return implementation;
+ } catch (XMLStreamException e) {
+ throw new ContributionReadException(e);
+ }
+ }
+
+ public void resolve(ResourceImplementation impl, ModelResolver resolver) throws ContributionResolveException {
+
+ // Resolve the resource directory location
+ DeployedArtifact artifact = contributionFactory.createDeployedArtifact();
+ artifact.setURI(impl.getLocation());
+ DeployedArtifact resolved = resolver.resolveModel(DeployedArtifact.class, artifact);
+ if (resolved.getLocation() != null) {
+ try {
+ impl.setLocationURL(new URL(resolved.getLocation()));
+ impl.setUnresolved(false);
+ } catch (IOException e) {
+ throw new ContributionResolveException(e);
+ }
+ }
+ }
+
+ public void write(ResourceImplementation model, XMLStreamWriter outputSource) throws ContributionWriteException {
+ }
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/module/ResourceImplementationModuleActivator.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/module/ResourceImplementationModuleActivator.java
new file mode 100644
index 0000000000..c53bec5234
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/module/ResourceImplementationModuleActivator.java
@@ -0,0 +1,91 @@
+/*
+ * 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.implementation.resource.module;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.binding.resource.DefaultHTTPResourceBindingFactory;
+import org.apache.tuscany.sca.binding.resource.HTTPResourceBindingFactory;
+import org.apache.tuscany.sca.binding.resource.impl.HTTPResourceBindingProcessor;
+import org.apache.tuscany.sca.binding.resource.provider.HTTPResourceBindingProviderFactory;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.core.ModuleActivator;
+import org.apache.tuscany.sca.http.ServletHost;
+import org.apache.tuscany.sca.implementation.resource.DefaultResourceImplementationFactory;
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementationFactory;
+import org.apache.tuscany.sca.implementation.resource.impl.ResourceImplementationProcessor;
+import org.apache.tuscany.sca.implementation.resource.provider.ResourceImplementationProviderFactory;
+import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.introspect.ExtensibleJavaInterfaceIntrospector;
+import org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceIntrospector;
+import org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceIntrospectorExtensionPoint;
+import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
+
+/**
+ * Implements a module activator for the resource implementation extension module.
+ */
+public class ResourceImplementationModuleActivator implements ModuleActivator {
+
+ public Object[] getExtensionPoints() {
+ // This module extension does not contribute any new extension point
+ return null;
+ }
+
+ public void start(ExtensionPointRegistry registry) {
+
+ // Create the resource binding factory
+ ModelFactoryExtensionPoint factories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
+ HTTPResourceBindingFactory bindingFactory = new DefaultHTTPResourceBindingFactory();
+ factories.addFactory(bindingFactory);
+
+ // Create the resource implementation factory
+ AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class);
+ JavaInterfaceFactory javaFactory = new DefaultJavaInterfaceFactory();
+ JavaInterfaceIntrospectorExtensionPoint visitors = registry.getExtensionPoint(JavaInterfaceIntrospectorExtensionPoint.class);
+ JavaInterfaceIntrospector introspector = new ExtensibleJavaInterfaceIntrospector(javaFactory, visitors);
+ ResourceImplementationFactory resourceFactory = new DefaultResourceImplementationFactory(assemblyFactory, javaFactory, introspector, bindingFactory);
+ factories.addFactory(resourceFactory);
+
+ // Add the resource binding extension to the StAXArtifactProcessor
+ // extension point
+ StAXArtifactProcessorExtensionPoint processors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+ HTTPResourceBindingProcessor bindingArtifactProcessor = new HTTPResourceBindingProcessor(bindingFactory);
+ processors.addArtifactProcessor(bindingArtifactProcessor);
+
+ // Add the resource implementation extension to the StAXArtifactProcessor
+ // extension point
+ ContributionFactory contributionFactory = factories.getFactory(ContributionFactory.class);
+ ResourceImplementationProcessor implementationArtifactProcessor = new ResourceImplementationProcessor(resourceFactory, contributionFactory);
+ processors.addArtifactProcessor(implementationArtifactProcessor);
+
+ // Add the provider factories to the provider factory extension point
+ ProviderFactoryExtensionPoint providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
+ ServletHost servletHost = registry.getExtensionPoint(ServletHost.class);
+ providerFactories.addProviderFactory(new HTTPResourceBindingProviderFactory(servletHost));
+ providerFactories.addProviderFactory(new ResourceImplementationProviderFactory());
+
+ }
+
+ public void stop(ExtensionPointRegistry registry) {
+ }
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProvider.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProvider.java
new file mode 100644
index 0000000000..a6294fc327
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProvider.java
@@ -0,0 +1,57 @@
+/*
+ * 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.implementation.resource.provider;
+
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementation;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ */
+public class ResourceImplementationProvider implements ImplementationProvider {
+
+ private ResourceImplementation implementation;
+
+ /**
+ * Constructs a new resource implementation provider.
+ */
+ public ResourceImplementationProvider(RuntimeComponent component, ResourceImplementation implementation) {
+ this.implementation = implementation;
+ }
+
+ public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
+ ResourceInvoker invoker = new ResourceInvoker(implementation.getLocationURL());
+ return invoker;
+ }
+
+ public Invoker createCallbackInvoker(Operation operation) {
+ return null;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProviderFactory.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProviderFactory.java
new file mode 100644
index 0000000000..c5e6d34184
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceImplementationProviderFactory.java
@@ -0,0 +1,44 @@
+/*
+ * 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.implementation.resource.provider;
+
+import org.apache.tuscany.sca.implementation.resource.ResourceImplementation;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+/**
+ * The model representing a resource implementation in an SCA assembly model.
+ */
+public class ResourceImplementationProviderFactory implements ImplementationProviderFactory<ResourceImplementation> {
+
+ /**
+ * Constructs a resource implementation.
+ */
+ public ResourceImplementationProviderFactory() {
+ }
+
+ public ImplementationProvider createImplementationProvider(RuntimeComponent component, ResourceImplementation implementation) {
+ return new ResourceImplementationProvider(component, implementation);
+ }
+
+ public Class<ResourceImplementation> getModelType() {
+ return ResourceImplementation.class;
+ }
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceInvoker.java b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceInvoker.java
new file mode 100644
index 0000000000..96717642b3
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/java/org/apache/tuscany/sca/implementation/resource/provider/ResourceInvoker.java
@@ -0,0 +1,43 @@
+/*
+ * 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.implementation.resource.provider;
+
+import java.net.URL;
+
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+
+/**
+ * Implements an invoker for resource component implementations.
+ */
+public class ResourceInvoker implements Invoker {
+ private URL locationURL;
+
+ public ResourceInvoker(URL locationURL) {
+ this.locationURL = locationURL;
+ }
+
+ public Message invoke(Message msg) {
+ // Return the location URL
+ msg.setBody(locationURL);
+ return msg;
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator b/branches/sca-java-0.91/modules/implementation-resource/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator
new file mode 100644
index 0000000000..f85ec0c7b7
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the ExtensionActivator
+org.apache.tuscany.sca.implementation.resource.module.ResourceImplementationModuleActivator
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/test/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationTestCase.java b/branches/sca-java-0.91/modules/implementation-resource/src/test/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationTestCase.java
new file mode 100644
index 0000000000..9d334c7247
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/test/java/org/apache/tuscany/sca/implementation/resource/ResourceImplementationTestCase.java
@@ -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.implementation.resource;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceImplementationTestCase extends TestCase {
+
+// private static final String REQUEST1_HEADER =
+// "GET /ResourceServiceComponent/test.html HTTP/1.0\n" + "Host: localhost\n"
+// + "Content-Type: text/xml\n"
+// + "Connection: close\n"
+// + "Content-Length: ";
+// private static final String REQUEST1_CONTENT = "";
+// private static final String REQUEST1 =
+// REQUEST1_HEADER + REQUEST1_CONTENT.getBytes().length + "\n\n" + REQUEST1_CONTENT;
+
+ private static final String REQUEST2_HEADER =
+ "GET /webcontent/test.html HTTP/1.0\n" + "Host: localhost\n"
+ + "Content-Type: text/xml\n"
+ + "Connection: close\n"
+ + "Content-Length: ";
+ private static final String REQUEST2_CONTENT = "";
+ private static final String REQUEST2 =
+ REQUEST2_HEADER + REQUEST2_CONTENT.getBytes().length + "\n\n" + REQUEST2_CONTENT;
+
+ private static final int HTTP_PORT = 8085;
+
+ private SCADomain scaDomain;
+
+ protected void setUp() throws Exception {
+ scaDomain = SCADomain.newInstance("resource.composite");
+ }
+
+ protected void tearDown() throws Exception {
+ scaDomain.close();
+ }
+
+ // This works with port 8080 but we can't use that port on the build
+ // machine as it's already in use
+// public void testResourceImplementation() throws Exception {
+// Socket client = new Socket("127.0.0.1", HTTP_PORT);
+// OutputStream os = client.getOutputStream();
+// os.write(REQUEST1.getBytes());
+// os.flush();
+//
+// String document = read(client);
+// assertTrue(document.indexOf("<body><p>hello</body>") != -1);
+// }
+
+ public void testResourceImplementationWithBindingURI() throws Exception {
+ Socket client = new Socket("127.0.0.1", HTTP_PORT);
+ OutputStream os = client.getOutputStream();
+ os.write(REQUEST2.getBytes());
+ os.flush();
+
+ String document = read(client);
+ assertTrue(document.indexOf("<body><p>hello</body>") != -1);
+ }
+
+ private static String read(Socket socket) throws IOException {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+ StringBuffer sb = new StringBuffer();
+ String str;
+ while ((str = reader.readLine()) != null) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+
+}
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/content/test.html b/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/content/test.html
new file mode 100644
index 0000000000..f4b79d7f01
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/content/test.html
@@ -0,0 +1,21 @@
+<html>
+<!--
+ * 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.
+-->
+<body><p>hello</body>
+</html> \ No newline at end of file
diff --git a/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/resource.composite b/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/resource.composite
new file mode 100644
index 0000000000..6fb7052410
--- /dev/null
+++ b/branches/sca-java-0.91/modules/implementation-resource/src/test/resources/resource.composite
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/resource"
+ xmlns:sr="http://sample/resource"
+ name="resource">
+
+ <!-- This works with port 8080 but we can't test this on the build machine
+ as 8080 is already in use -->
+ <!--
+ <component name="ResourceServiceComponent">
+ <implementation.resource location="content"/>
+ </component>
+ -->
+
+ <component name="ResourceServiceComponent2">
+ <service name="Resource">
+ <binding.resource uri="http://localhost:8085/webcontent"/>
+ </service>
+ <implementation.resource location="content"/>
+ </component>
+
+</composite>