summaryrefslogtreecommitdiffstats
path: root/branches/sca-android/samples/implementation-pojo-extension
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-09-15 00:26:00 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-09-15 00:26:00 +0000
commitd5f1d093fe6fa491cdec392dca7137639e98d149 (patch)
treeb98c79d8231a2617ee1dce43b1782d30d93686bc /branches/sca-android/samples/implementation-pojo-extension
parentf4e3e383071b6947d56794d9af5e9e6438aa3235 (diff)
Pulled a recent revision of trunk into the sca-android branch, to apply the android patches from JIRA TUSCANY-2440 to it.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@695318 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-android/samples/implementation-pojo-extension')
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/README70
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/build.xml51
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/pom.xml77
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementation.java65
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementationFactory.java36
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationFactoryImpl.java36
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationImpl.java155
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationProcessor.java174
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationInvoker.java68
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProvider.java106
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProviderFactory.java45
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor19
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.ValidationSchema19
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory19
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/pojo.POJOImplementationFactory19
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/main/resources/sample-implementation-pojo.xsd38
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorld.java26
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl.java37
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl2.java37
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldTestCase.java51
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/HelloWorldImpl2.componentType26
-rw-r--r--branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/helloworld.composite33
22 files changed, 1207 insertions, 0 deletions
diff --git a/branches/sca-android/samples/implementation-pojo-extension/README b/branches/sca-android/samples/implementation-pojo-extension/README
new file mode 100644
index 0000000000..3b201779e1
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/README
@@ -0,0 +1,70 @@
+Implementation POJO Sample
+==========================
+This sample demonstrates how new implementation types are constructed for
+Apache Tuscany SCA.
+
+The README in the samples directory (the directory above this) provides
+general instructions about building and running samples. Take a look there
+first.
+
+Sample Overview
+---------------
+This sample contains a POJO implementation type as an example of how to create
+new implementation types.
+
+implementation-pojo-extension/
+ src/
+ main/
+ java/
+ pojo/ - implementation model interfaces
+ impl/ - implementations of the model interfaces
+ provider/ - runtime implementation
+ resources/
+ META-INF/
+ services/ - declares the extension
+ test/
+ java/
+ helloworld/
+ HelloWorldTestCase.java - JUnit test case
+ resources/
+ helloworld.composite - the SCA assembly used during unit testing
+
+ build.xml - the Ant build file
+ pom.xml - the Maven build file
+
+Building The Sample Extension Using Ant
+-----------------------------------------
+With the binary distribution the sample extension can be built using Ant as
+follows
+
+cd implementation-pojo-extension
+ant compile
+
+Building The Sample Using Maven
+-------------------------------------------
+With either the binary or source distributions the sample can be built
+using Maven as follows.
+
+cd implementation-pojo-extension
+mvn
+
+Maven will also test that the sample extension built properly. You should see
+the following output from the test phase.
+
+-------------------------------------------------------
+ T E S T S
+-------------------------------------------------------
+Running helloworld.HelloWorldTestCase
+Initializing POJO
+Initializing POJO
+Executing POJO sayHello
+Initializing POJO
+Initializing POJO
+Executing POJO sayHello
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.616 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+
+This shows that the Junit test cases have run successfully.
diff --git a/branches/sca-android/samples/implementation-pojo-extension/build.xml b/branches/sca-android/samples/implementation-pojo-extension/build.xml
new file mode 100644
index 0000000000..78bae79859
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/build.xml
@@ -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.
+-->
+<project name="implementation-pojo-extension" default="compile">
+ <property name="test.jar" value="sample-implementation-pojo-extension.jar" />
+
+ <target name="init">
+ <mkdir dir="target/classes"/>
+ </target>
+
+ <target name="compile" depends="init">
+ <javac srcdir="src/main/java"
+ destdir="target/classes"
+ debug="on"
+ source="1.5"
+ target="1.5">
+ <classpath>
+ <pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+ </classpath>
+ </javac>
+ <copy todir="target/classes">
+ <fileset dir="src/main/resources"/>
+ </copy>
+ <jar destfile="target/${test.jar}" basedir="target/classes">
+ <manifest>
+ <attribute name="Main-Class" value="${test.class}" />
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="clean">
+ <delete quiet="true" includeemptydirs="true">
+ <fileset dir="target"/>
+ </delete>
+ </target>
+</project>
diff --git a/branches/sca-android/samples/implementation-pojo-extension/pom.xml b/branches/sca-android/samples/implementation-pojo-extension/pom.xml
new file mode 100644
index 0000000000..d7bb120e93
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/pom.xml
@@ -0,0 +1,77 @@
+<?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.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <artifactId>sample-implementation-pojo-extension</artifactId>
+ <name>Apache Tuscany SCA POJO Implementation Extension Sample</name>
+
+ <repositories>
+ <repository>
+ <id>apache.incubator</id>
+ <url>http://people.apache.org/repo/m2-incubating-repository</url>
+ </repository>
+ </repositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-assembly-xml</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-interface-java-xml</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-core-spi</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-host-embedded</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${artifactId}</finalName>
+ </build>
+
+</project>
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementation.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementation.java
new file mode 100644
index 0000000000..7c2f5d236f
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementation.java
@@ -0,0 +1,65 @@
+/*
+ * 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 pojo;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.apache.tuscany.sca.assembly.Implementation;
+
+
+/**
+ * Represents a POJO implementation in an SCA assembly.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface POJOImplementation extends Implementation {
+
+ /**
+ * Returns the POJO class name
+ * @return
+ */
+ public String getPOJOName();
+
+ /**
+ * Sets the POJO class name
+ * @param pojoName
+ */
+ public void setPOJOName(String pojoName);
+
+ /**
+ * Returns the POJO class.
+ * @return
+ */
+ public Class<?> getPOJOClass();
+
+ /**
+ * Sets the POJO class.
+ * @param pojoClass
+ */
+ public void setPOJOClass(Class<?> pojoClass);
+
+ /**
+ * Returns the POJO's methods.
+ * @return
+ */
+ public Map<String, Method> getMethods();
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementationFactory.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementationFactory.java
new file mode 100644
index 0000000000..bbcfb3d0dc
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/POJOImplementationFactory.java
@@ -0,0 +1,36 @@
+/*
+ * 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 pojo;
+
+
+/**
+ * Factory for the POJO implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface POJOImplementationFactory {
+
+ /**
+ * Creates a new POJO implementation model object.
+ * @return a new POJO implementation model object
+ */
+ POJOImplementation createPOJOImplementation();
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationFactoryImpl.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationFactoryImpl.java
new file mode 100644
index 0000000000..0dad270a6c
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationFactoryImpl.java
@@ -0,0 +1,36 @@
+/*
+ * 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 pojo.impl;
+
+import pojo.POJOImplementation;
+import pojo.POJOImplementationFactory;
+
+/**
+ * A factory for the POJO implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public class POJOImplementationFactoryImpl implements POJOImplementationFactory {
+
+ public POJOImplementation createPOJOImplementation() {
+ return new POJOImplementationImpl();
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationImpl.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationImpl.java
new file mode 100644
index 0000000000..f2d6871039
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationImpl.java
@@ -0,0 +1,155 @@
+/*
+ * 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 pojo.impl;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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 pojo.POJOImplementation;
+
+
+/**
+ * Represents a POJO implementation in an SCA assembly.
+ *
+ * @version $Rev$ $Date$
+ */
+class POJOImplementationImpl implements POJOImplementation {
+
+ private String pojoName;
+ private Class<?> pojoClass;
+ private String uri;
+ private Map<String, Method> methods;
+ private List<Service> services = new ArrayList<Service>();
+ private List<Reference> references = new ArrayList<Reference>();
+ private List<Property> properties = new ArrayList<Property>();
+ private boolean unresolved;
+
+ POJOImplementationImpl() {
+ }
+
+ /**
+ * Returns the POJO class name
+ * @return
+ */
+ public String getPOJOName() {
+ return pojoName;
+ }
+
+ /**
+ * Sets the POJO class name
+ * @param pojoName
+ */
+ public void setPOJOName(String pojoName) {
+ this.pojoName = pojoName;
+ setURI(pojoName.replace('.', '/'));
+ }
+
+ /**
+ * Returns the POJO class.
+ * @return
+ */
+ public Class<?> getPOJOClass() {
+ return pojoClass;
+ }
+
+ /**
+ * Sets the POJO class.
+ * @param pojoClass
+ */
+ public void setPOJOClass(Class<?> pojoClass) {
+ this.pojoClass = pojoClass;
+ setPOJOName(pojoClass.getName());
+
+ // Index the POJO's methods
+ methods = new HashMap<String, Method>();
+ Method[] m = pojoClass.getMethods();
+ for (int i = 0; i < m.length; i++) {
+ methods.put(m[i].getName(), m[i]);
+ }
+ }
+
+ /**
+ * Returns the POJO's methods.
+ * @return
+ */
+ public Map<String, Method> getMethods() {
+ return methods;
+ }
+
+ public ConstrainingType getConstrainingType() {
+ // The sample POJO implementation does not support constrainingTypes
+ return null;
+ }
+
+ public List<Property> getProperties() {
+ return properties;
+ }
+
+ public List<Service> getServices() {
+ return services;
+ }
+
+ public List<Reference> getReferences() {
+ return references;
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public void setConstrainingType(ConstrainingType constrainingType) {
+ // The sample POJO implementation does not support constrainingTypes
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ public void setUnresolved(boolean unresolved) {
+ this.unresolved = unresolved;
+ }
+
+ @Override
+ public int hashCode() {
+ return uri.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof POJOImplementationImpl) {
+ return ((POJOImplementationImpl)obj).getURI().equals(uri);
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationProcessor.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationProcessor.java
new file mode 100644
index 0000000000..44a2cc0aa8
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/impl/POJOImplementationProcessor.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 pojo.impl;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+
+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.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.ComponentType;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.xml.PolicyAttachPointProcessor;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
+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.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.monitor.Monitor;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+
+import pojo.POJOImplementation;
+import pojo.POJOImplementationFactory;
+
+/**
+ * Implements a STAX based artifact processor for POJO implementations.
+ *
+ * The artifact processor is responsible for processing <implementation.pojo>
+ * elements in SCA assembly XML composite files and populating the POJO
+ * implementation model, resolving its references to other artifacts in the SCA
+ * contribution, and optionally write the model back to SCA assembly XML.
+ */
+public class POJOImplementationProcessor implements StAXArtifactProcessor<POJOImplementation> {
+ private static final QName IMPLEMENTATION_POJO = new QName("http://pojo", "implementation.pojo");
+
+ private AssemblyFactory assemblyFactory;
+ private JavaInterfaceFactory javaFactory;
+ private POJOImplementationFactory pojoImplementationFactory;
+ private PolicyFactory policyFactory;
+ private PolicyAttachPointProcessor policyProcessor;
+
+ public POJOImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+
+ // Get the assembly and Java interface factories as we'll need them to
+ // create model objects
+ assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
+ policyFactory = modelFactories.getFactory(PolicyFactory.class);
+ pojoImplementationFactory = modelFactories.getFactory(POJOImplementationFactory.class);
+ policyProcessor = new PolicyAttachPointProcessor(policyFactory);
+ }
+
+ public QName getArtifactType() {
+ // Returns the qname of the XML element processed by this processor
+ return IMPLEMENTATION_POJO;
+ }
+
+ public Class<POJOImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return POJOImplementation.class;
+ }
+
+ public POJOImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+
+ // Read an <implementation.pojo> element
+ POJOImplementation implementation = pojoImplementationFactory.createPOJOImplementation();
+
+ // Read policies
+ policyProcessor.readPolicies(implementation, reader);
+
+ // Read the POJO class attribute.
+ String className = reader.getAttributeValue(null, "class");
+ implementation.setPOJOName(className);
+
+ // Mark the POJO model unresolved to track the fact that it's not
+ // completely initialized, its class is not loaded yet and services
+ // and references not initialized either
+ implementation.setUnresolved(true);
+
+ // Skip to end element
+ while (reader.hasNext()) {
+ if (reader.next() == END_ELEMENT && IMPLEMENTATION_POJO.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ return implementation;
+ }
+
+ public void resolve(POJOImplementation implementation, ModelResolver resolver) throws ContributionResolveException {
+
+ // Resolve the POJO implementation
+
+ // First resolve its class
+ ClassReference classReference = new ClassReference(implementation.getPOJOName());
+ classReference = resolver.resolveModel(ClassReference.class, classReference);
+ Class<?> pojoClass = classReference.getJavaClass();
+ if (pojoClass == null) {
+ throw new ContributionResolveException("Class could not be resolved: " + implementation.getPOJOName());
+ }
+ implementation.setPOJOClass(pojoClass);
+
+ // Check to see if we have a .componentType file describing the POJO class
+ ComponentType componentType = assemblyFactory.createComponentType();
+ componentType.setUnresolved(true);
+ componentType.setURI(implementation.getURI() + ".componentType");
+ componentType = resolver.resolveModel(ComponentType.class, componentType);
+ if (!componentType.isUnresolved()) {
+
+ // We have a component type description, merge it into the POJO model
+ implementation.getServices().addAll(componentType.getServices());
+ implementation.getReferences().addAll(componentType.getReferences());
+ implementation.getProperties().addAll(componentType.getProperties());
+
+ } else {
+
+ // We have no component type description, simply introspect the POJO and
+ // create a single Service for it
+ Service service = assemblyFactory.createService();
+ service.setName(pojoClass.getSimpleName());
+ JavaInterface javaInterface;
+ try {
+ javaInterface = javaFactory.createJavaInterface(pojoClass);
+ } catch (InvalidInterfaceException e) {
+ throw new ContributionResolveException(e);
+ }
+ JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
+ interfaceContract.setInterface(javaInterface);
+ service.setInterfaceContract(interfaceContract);
+ implementation.getServices().add(service);
+ }
+
+ // Mark the implementation resolved now
+ implementation.setUnresolved(false);
+ }
+
+ public void write(POJOImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+
+ // Write <implementation.pojo> element
+ policyProcessor.writePolicyPrefixes(implementation, writer);
+ writer.writeStartElement(IMPLEMENTATION_POJO.getNamespaceURI(), IMPLEMENTATION_POJO.getLocalPart());
+ policyProcessor.writePolicyAttributes(implementation, writer);
+
+ if (implementation.getPOJOName() != null) {
+ writer.writeAttribute("class", implementation.getPOJOName());
+ }
+
+ writer.writeEndElement();
+ }
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationInvoker.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationInvoker.java
new file mode 100644
index 0000000000..87333c61f6
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationInvoker.java
@@ -0,0 +1,68 @@
+/*
+ * 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 pojo.provider;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Implements an invoker for POJO component implementations.
+ *
+ * The invoker is responsible for handling invocations of a business operation.
+ * Input business data is passed to the invoke method in a Message object.
+ * The invoke method is responsible for handling the invocation and returning a Message with
+ * the output business data.
+ *
+ * In this example we are simply delegating the operation invocations to the
+ * corresponding methods on the POJO implementation class using Java reflection.
+ *
+ * Depending on the type of implementation being handled, more sophisticated invokers can
+ * use other techniques to delegate the invocation to the implementation artifact directly, call a
+ * runtime engine like a BPEL engine or an XQuery engine (this is what the Tuscany
+ * implementation-bpel and implementation-xquery extensions do) or just completely handle the
+ * invocation in the invoker itself if the implementation has a fixed behavior for example.
+ */
+class POJOImplementationInvoker implements Invoker {
+
+ private Object pojoInstance;
+ private Method method;
+
+ POJOImplementationInvoker(Object pojoInstance, Operation operation, Method method) {
+ this.pojoInstance = pojoInstance;
+ this.method = method;
+ }
+
+ public Message invoke(Message msg) {
+ try {
+ msg.setBody(method.invoke(pojoInstance, (Object[])msg.getBody()));
+ } catch (InvocationTargetException e) {
+ msg.setFaultBody(e);
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ return msg;
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProvider.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProvider.java
new file mode 100644
index 0000000000..73a0d22493
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProvider.java
@@ -0,0 +1,106 @@
+/*
+ * 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 pojo.provider;
+
+import java.lang.reflect.Method;
+
+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;
+import org.osoa.sca.ServiceRuntimeException;
+
+import pojo.POJOImplementation;
+
+/**
+ * An implementation provider for sample CRUD implementations.
+ *
+ * The implementation provider is responsible for handling the lifecycle of a component
+ * implementation and creating operation invokers for the service operations provided
+ * by the implementation.
+ *
+ * The start() and stop() methods are called when a component is started
+ * and stopped. In this example we are using that opportunity to call init and destroy methods
+ * on the POJO instance if these methods exist.
+ *
+ * The createInvoker method is called for each operation provided by the component
+ * implementation. The implementation provider can create an invoker and initialize it
+ * at that time to minimize the amount of work to be performed on each invocation.
+ *
+ * For example here we are looking up the Java method corresponding to the service operation
+ * at passing it to the invoker constructor. This way the invoker won't have to lookup the Java
+ * method on each invocation.
+ */
+class POJOImplementationProvider implements ImplementationProvider {
+
+ private POJOImplementation implementation;
+ private Object pojoInstance;
+
+ /**
+ * Constructs a new CRUD implementation.
+ */
+ POJOImplementationProvider(RuntimeComponent component, POJOImplementation implementation) {
+ this.implementation = implementation;
+
+ // Create a new instance of the POJO
+ try {
+ pojoInstance = implementation.getPOJOClass().newInstance();
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ public void start() {
+ try {
+ // Invoke the POJO's init method
+ Method initMethod = implementation.getMethods().get("init");
+ if (initMethod != null) {
+ initMethod.invoke(pojoInstance);
+ }
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ public void stop() {
+ try {
+ // Invoke the POJO's destroy method
+ Method destroyMethod = implementation.getMethods().get("destroy");
+ if (destroyMethod != null) {
+ destroyMethod.invoke(pojoInstance);
+ }
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ } finally {
+ pojoInstance = null;
+ }
+ }
+
+ public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
+ Method method = implementation.getMethods().get(operation.getName());
+ POJOImplementationInvoker invoker = new POJOImplementationInvoker(pojoInstance, operation, method);
+ return invoker;
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProviderFactory.java b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProviderFactory.java
new file mode 100644
index 0000000000..22f2be09e9
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/java/pojo/provider/POJOImplementationProviderFactory.java
@@ -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 pojo.provider;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+import pojo.POJOImplementation;
+
+/**
+ * A factory for POJO implementation providers.
+ */
+public class POJOImplementationProviderFactory implements ImplementationProviderFactory<POJOImplementation> {
+
+ public POJOImplementationProviderFactory(ExtensionPointRegistry registry) {
+ }
+
+ public Class<POJOImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return POJOImplementation.class;
+ }
+
+ public ImplementationProvider createImplementationProvider(RuntimeComponent component, POJOImplementation implementation) {
+ return new POJOImplementationProvider(component, implementation);
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
new file mode 100644
index 0000000000..8337e81c5f
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
@@ -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 artifact processor extension
+pojo.impl.POJOImplementationProcessor;qname=http://pojo#implementation.pojo,model=pojo.POJOImplementation,factory=pojo.POJOImplementationFactory
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.ValidationSchema b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.ValidationSchema
new file mode 100644
index 0000000000..64dd230a15
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.ValidationSchema
@@ -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.
+
+# URI of the XML schema to be used for validation
+sample-implementation-pojo.xsd
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
new file mode 100644
index 0000000000..b30ea3b9cf
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
@@ -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 implementation extension
+pojo.provider.POJOImplementationProviderFactory;model=pojo.POJOImplementation
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/pojo.POJOImplementationFactory b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/pojo.POJOImplementationFactory
new file mode 100644
index 0000000000..075af98240
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/META-INF/services/pojo.POJOImplementationFactory
@@ -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 implementation model factory
+pojo.impl.POJOImplementationFactoryImpl
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/sample-implementation-pojo.xsd b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/sample-implementation-pojo.xsd
new file mode 100644
index 0000000000..c9d170770b
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/main/resources/sample-implementation-pojo.xsd
@@ -0,0 +1,38 @@
+<?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.
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://pojo"
+ xmlns:sca="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:p="http://pojo"
+ elementFormDefault="qualified">
+
+ <import namespace="http://www.osoa.org/xmlns/sca/1.0"/>
+
+ <element name="implementation.pojo" type="p:POJOImplementation"/>
+
+ <complexType name="POJOImplementation">
+ <complexContent>
+ <extension base="sca:Implementation">
+ <attribute name="class" type="NCName" use="required"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+</schema>
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorld.java b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorld.java
new file mode 100644
index 0000000000..cc32929f09
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorld.java
@@ -0,0 +1,26 @@
+/*
+ * 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 helloworld;
+
+public interface HelloWorld {
+
+ String sayHello(String name);
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl.java b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl.java
new file mode 100644
index 0000000000..0580e30aba
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl.java
@@ -0,0 +1,37 @@
+/*
+ * 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 helloworld;
+
+public class HelloWorldImpl {
+
+ public void init() {
+ System.out.println("Initializing POJO");
+ }
+
+ public void destroy() {
+ System.out.println("Destroying POJO");
+ }
+
+ public String sayHello(String name) {
+ System.out.println("Executing POJO sayHello");
+ return "Hello " + name;
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl2.java b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl2.java
new file mode 100644
index 0000000000..69ab1f567e
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldImpl2.java
@@ -0,0 +1,37 @@
+/*
+ * 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 helloworld;
+
+public class HelloWorldImpl2 {
+
+ public void init() {
+ System.out.println("Initializing POJO");
+ }
+
+ public void destroy() {
+ System.out.println("Destroying POJO");
+ }
+
+ public String sayHello(String name) {
+ System.out.println("Executing POJO sayHello");
+ return "Hello " + name;
+ }
+
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldTestCase.java b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldTestCase.java
new file mode 100644
index 0000000000..d8b5f41adc
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/java/helloworld/HelloWorldTestCase.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 helloworld;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+/**
+ * Tests the POJO implementation extension.
+ */
+public class HelloWorldTestCase extends TestCase {
+
+ private SCADomain scaDomain;
+
+ @Override
+ protected void setUp() throws Exception {
+ scaDomain = SCADomain.newInstance("helloworld/helloworld.composite");
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ scaDomain.close();
+ }
+
+ public void testHello() throws Exception {
+ HelloWorld helloworld = scaDomain.getService(HelloWorld.class, "HelloWorldComponent");
+ assertEquals("Hello petra", helloworld.sayHello("petra"));
+ }
+
+ public void testHello2() throws Exception {
+ HelloWorld helloworld = scaDomain.getService(HelloWorld.class, "HelloWorldComponent2/HelloWorld2");
+ assertEquals("Hello petra", helloworld.sayHello("petra"));
+ }
+}
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/HelloWorldImpl2.componentType b/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/HelloWorldImpl2.componentType
new file mode 100644
index 0000000000..a92c5ab8db
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/HelloWorldImpl2.componentType
@@ -0,0 +1,26 @@
+<?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.
+-->
+<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0">
+
+ <service name="HelloWorld2">
+ <interface.java interface="helloworld.HelloWorld"/>
+ </service>
+
+</componentType> \ No newline at end of file
diff --git a/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/helloworld.composite b/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/helloworld.composite
new file mode 100644
index 0000000000..c38094dfc9
--- /dev/null
+++ b/branches/sca-android/samples/implementation-pojo-extension/src/test/resources/helloworld/helloworld.composite
@@ -0,0 +1,33 @@
+<?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://test/helloworld"
+ xmlns:p="http://pojo"
+ name="helloworld">
+
+ <component name="HelloWorldComponent">
+ <p:implementation.pojo class="helloworld.HelloWorldImpl" />
+ </component>
+
+ <component name="HelloWorldComponent2">
+ <p:implementation.pojo class="helloworld.HelloWorldImpl2" />
+ </component>
+
+</composite>