You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by li...@apache.org on 2010/06/11 22:09:33 UTC

svn commit: r953860 [2/3] - in /incubator/aries/sandbox/linsun/mds: ./ mds-api/ mds-api/.settings/ mds-api/src/ mds-api/src/main/ mds-api/src/main/java/ mds-api/src/main/java/org/ mds-api/src/main/java/org/apache/ mds-api/src/main/java/org/apache/aries...

Added: incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,197 @@
+/*
+ * 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.aries.mds.itests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Currency;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
+import javax.jms.Session;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+@RunWith(JUnit4TestRunner.class)
+public class MessageDrivenTest extends AbstractIntegrationTest {
+
+    private static final String REQUEST_QUEUE_NAME = "Hello.Queue";
+    public static final String DESTINATION = "destination";
+    public static final String DESTINATION_TYPE = "destinationType";
+    private ConnectionFactory cf;
+   
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        cf = getOsgiService(ConnectionFactory.class);
+
+    }
+    
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        cf = null;
+    }
+    
+    @Test
+    public void test() throws Exception {
+      System.out.println("got setup correctly");
+      sendMessage();
+    }
+
+    private void sendMessage() throws JMSException {
+        Connection connection = null;
+        Session session = null;
+        MessageProducer producer = null;
+        MessageConsumer consumer = null;
+        try {
+            connection = cf.createConnection();
+            connection.start();
+
+           // create request
+            Map<String, Object> request = new TreeMap<String, Object>();
+            request.put("args", new Object[]{"cheese"});
+
+            // create a new temp response queue
+            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+            Destination responseQueue = session.createTemporaryQueue();
+
+            // Create a request messages
+            ObjectMessage requestMessage = session.createObjectMessage();
+            requestMessage.setJMSReplyTo(responseQueue);
+            requestMessage.setObject((Serializable) request);
+
+            // Send the request message
+            producer = session.createProducer(session.createQueue(REQUEST_QUEUE_NAME));
+            producer.send(requestMessage);
+
+            // wait for the response message
+            consumer = session.createConsumer(responseQueue);
+            Message message = consumer.receive(1000);
+
+            // verify message
+            assertNotNull("Did not get a response message", message);
+            assertTrue("Response message is not an ObjectMessage", message instanceof ObjectMessage);
+            ObjectMessage responseMessage = (ObjectMessage) message;
+            if (responseMessage != null) {
+                Serializable object = responseMessage.getObject();
+                assertNotNull("Response ObjectMessage contains a null object");
+                assertTrue("Response ObjectMessage does not contain an instance of Map", object instanceof Map);
+                Map response = (Map) object;
+    
+                // process results
+                String returnValue = (String) response.get("return");
+                assertEquals("test-cheese", returnValue);
+                System.out.println("return value is " + returnValue);
+            }
+        } finally {
+            if (consumer != null) {
+                consumer.close();
+            }
+            if (producer != null) {
+                producer.close();
+            }
+            if (session != null) {
+                session.close();
+            }
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+    
+    @org.ops4j.pax.exam.junit.Configuration
+    public static Option[] configuration() {
+        Option[] options = options(
+            // Log
+            mavenBundle("org.ops4j.pax.logging", "pax-logging-api"),
+            mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
+            // Felix Config Admin
+            mavenBundle("org.apache.felix", "org.apache.felix.configadmin"),
+            // Felix mvn url handler
+            mavenBundle("org.ops4j.pax.url", "pax-url-mvn"),
+
+
+            // this is how you set the default log level when using pax logging (logProfile)
+            systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
+
+            // Bundles
+            mavenBundle("org.apache.aries", "org.apache.aries.util"),
+            mavenBundle("asm", "asm-all"),
+            mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint"),
+            mavenBundle("org.apache.geronimo.specs", "geronimo-annotation_1.0_spec"),
+            mavenBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"),
+            mavenBundle("org.apache.geronimo.specs", "geronimo-j2ee-management_1.1_spec"),
+            mavenBundle("org.apache.activemq", "kahadb"),
+            mavenBundle("org.apache.activemq", "activemq-ra"),
+            mavenBundle("org.apache.activemq", "activemq-core"),
+            mavenBundle("org.apache.geronimo.specs", "geronimo-jms_1.1_spec"),
+            mavenBundle("org.apache.geronimo.specs", "geronimo-j2ee-connector_1.5_spec"),
+            mavenBundle("org.apache.geronimo.components", "geronimo-connector"),
+            mavenBundle("org.apache.geronimo.components", "geronimo-transaction"),
+            mavenBundle("org.apache.xbean", "xbean-asm-shaded"),
+            mavenBundle("org.apache.xbean", "xbean-finder-shaded"),
+            mavenBundle("org.apache.xbean", "xbean-reflect"),
+            mavenBundle("org.apache.xbean", "xbean-naming"),
+            mavenBundle("org.apache.aries.mds", "org.apache.aries.mds.ra"),
+            mavenBundle("org.apache.aries.mds", "org.apache.aries.mds.ra.activemq"),
+            mavenBundle("org.apache.aries.mds", "org.apache.aries.mds.api"),
+            mavenBundle("org.apache.aries.mds", "org.apache.aries.mds.impl"),
+            mavenBundle("org.apache.aries.mds", "org.apache.aries.mds.sample"),
+            mavenBundle("org.osgi", "org.osgi.compendium"),
+            //org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption("-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"),
+
+            equinox().version("3.5.0")
+        );
+        options = updateOptions(options);
+        return options;
+    }
+
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-itest/src/test/java/org/apache/aries/mds/itests/MessageDrivenTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.classpath
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.classpath?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.classpath (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.classpath Fri Jun 11 20:09:30 2010
@@ -0,0 +1,38 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="target/maven-shared-archive-resources" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/activemq/activeio-core/3.1.2/activeio-core-3.1.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/activemq/activemq-core/5.3.1/activemq-core-5.3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/activemq/protobuf/activemq-protobuf/1.0/activemq-protobuf-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/activemq/activemq-ra/5.3.1/activemq-ra-5.3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-net/commons-net/2.0/commons-net-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/components/geronimo-connector/2.1.4/geronimo-connector-2.1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-j2ee-connector_1.5_spec/2.0.0/geronimo-j2ee-connector_1.5_spec-2.0.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-j2ee-management_1.1_spec/1.0.1/geronimo-j2ee-management_1.1_spec-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.1.1/geronimo-jms_1.1_spec-1.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1.1/geronimo-jta_1.1_spec-1.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/components/geronimo-transaction/2.1.4/geronimo-transaction-2.1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/activemq/kahadb/5.3.1/kahadb-5.3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.12/log4j-1.2.12.jar"/>
+  <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/aries/mds/org.apache.aries.mds.ra/0.2-incubating-SNAPSHOT/org.apache.aries.mds.ra-0.2-incubating-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.compendium/4.2.0/org.osgi.compendium-4.2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.core/4.2.0/org.osgi.core-4.2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/osgi/3.5.0.v20090520/osgi-3.5.0.v20090520.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.11/slf4j-api-1.5.11.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-simple/1.5.11/slf4j-simple-1.5.11.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/springframework/spring-beans/2.5.6/spring-beans-2.5.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/springframework/spring-context/2.5.6/spring-context-2.5.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/springframework/spring-core/2.5.6/spring-core-2.5.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/springframework/osgi/spring-osgi-core/1.2.1/spring-osgi-core-1.2.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/springframework/osgi/spring-osgi-io/1.2.1/spring-osgi-io-1.2.1.jar"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+</classpath>
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.project
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.project?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.project (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.project Fri Jun 11 20:09:30 2010
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>org.apache.aries.mds.ra.activemq</name>
+  <comment>This bundle contains the Message driven Service Implementation using ActiveMQ as the provider of JMS broker and resource adapter. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.settings/org.eclipse.jdt.core.prefs?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.settings/org.eclipse.jdt.core.prefs (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/.settings/org.eclipse.jdt.core.prefs Fri Jun 11 20:09:30 2010
@@ -0,0 +1,11 @@
+#Wed May 26 10:26:25 EDT 2010
+encoding//src/main/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.compliance=1.5
+encoding//src/main/resources=${project.build.sourceEncoding}
+encoding//src/test/resources=${project.build.sourceEncoding}
+encoding//src/test/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+encoding//src/test/filtered-resources=${project.build.sourceEncoding}
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+encoding//src/main/filtered-resources=${project.build.sourceEncoding}

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml Fri Jun 11 20:09:30 2010
@@ -0,0 +1,115 @@
+
+	<!--
+		Licensed to the Apache Software Foundation (ASF) under one or more
+		contributor license agreements. See the NOTICE file distributed with
+		this work for additional information regarding copyright ownership.
+		The ASF licenses this file to you under the Apache License, Version
+		2.0 (the "License"); you may not use this file except in compliance
+		with the License. You may obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.aries.mds</groupId>
+		<artifactId>blueprint</artifactId>
+		<version>0.2-incubating-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.apache.aries.mds.ra.activemq</artifactId>
+	<packaging>bundle</packaging>
+	<name>Apache Aries Message Driven Service ActiveMQ Resource Adapter </name>
+	<description>
+      This bundle contains the Message driven Service Implementation using ActiveMQ as the provider of JMS broker and resource adapter
+  </description>
+
+	<properties>
+		<aries.osgi.export.pkg>
+			org.apache.aries.mds.ra.activemq
+      </aries.osgi.export.pkg>
+		<aries.osgi.import>
+			!org.apache.aries.mds.ra.activemq.*,
+			*
+      </aries.osgi.import>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.aries.mds</groupId>
+			<artifactId>org.apache.aries.mds.ra</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>osgi</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-jms_1.1_spec</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.activemq</groupId>
+			<artifactId>activemq-ra</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.activemq</groupId>
+			<artifactId>activemq-core</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.geronimo.components</groupId>
+			<artifactId>geronimo-connector</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.components</groupId>
+			<artifactId>geronimo-transaction</artifactId>
+		</dependency>
+
+
+	</dependencies>
+
+	<build>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+			</resource>
+		</resources>
+	</build>
+</project>

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,311 @@
+/* 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.aries.mds.ra;
+
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+* Swiped verbatim from ActiveMQ... the URI kings.
+*
+* URI relativize(URI, URI) added afterwards to deal with the
+* non-functional URI.relativize(URI) method
+*/
+public class URISupport {
+
+
+   public static class CompositeData {
+       String scheme;
+       String path;
+       URI components[];
+       Map parameters;
+       String fragment;
+       public String host;
+
+       public URI[] getComponents() {
+           return components;
+       }
+       public String getFragment() {
+           return fragment;
+       }
+       public Map getParameters() {
+           return parameters;
+       }
+       public String getScheme() {
+           return scheme;
+       }
+       public String getPath() {
+           return path;
+       }
+       public String getHost() {
+           return host;
+       }
+
+       public URI toURI() throws URISyntaxException {
+           StringBuffer sb = new StringBuffer();
+           if( scheme!=null ) {
+               sb.append(scheme);
+               sb.append(':');
+           }
+
+           if( host!=null && host.length()!=0 ) {
+               sb.append(host);
+           } else {
+               sb.append('(');
+               for (int i = 0; i < components.length; i++) {
+                   if( i!=0 )
+                       sb.append(',');
+                   sb.append(components[i].toString());
+               }
+               sb.append(')');
+           }
+
+           if( path !=null ) {
+               sb.append('/');
+               sb.append(path);
+           }
+           if(!parameters.isEmpty()) {
+               sb.append("?");
+               sb.append(createQueryString(parameters));
+           }
+           if( fragment!=null ) {
+               sb.append("#");
+               sb.append(fragment);
+           }
+           return new URI(sb.toString());
+       }
+   }
+
+   public static Map<String, String> parseQuery(String uri) throws URISyntaxException{
+       try{
+           Map<String, String> rc = new LinkedHashMap<String,String>();
+           if(uri!=null){
+               String[] parameters=uri.split("&");
+               for(int i=0;i<parameters.length;i++){
+                   int p=parameters[i].indexOf("=");
+                   if(p>=0){
+                       String name= URLDecoder.decode(parameters[i].substring(0,p),"UTF-8");
+                       String value=URLDecoder.decode(parameters[i].substring(p+1),"UTF-8");
+                       rc.put(name,value);
+                   }else{
+                       rc.put(parameters[i],null);
+                   }
+               }
+           }
+           return rc;
+       }catch(UnsupportedEncodingException e){
+           throw (URISyntaxException) new URISyntaxException(e.toString(),"Invalid encoding").initCause(e);
+       }
+   }
+
+   public static Map<String, String> parseParamters(URI uri) throws URISyntaxException {
+       return uri.getQuery()==null ? Collections.EMPTY_MAP : parseQuery(stripPrefix(uri.getQuery(), "?"));
+   }
+
+   /**
+    * Removes any URI query from the given uri
+    */
+   public static URI removeQuery(URI uri) throws URISyntaxException {
+       return createURIWithQuery(uri, null);
+   }
+
+   /**
+    * Creates a URI with the given query
+    */
+   public static URI createURIWithQuery(URI uri, String query) throws URISyntaxException {
+       return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), query, uri.getFragment());
+   }
+
+   public static CompositeData parseComposite(URI uri) throws URISyntaxException {
+
+       CompositeData rc = new CompositeData();
+       rc.scheme = uri.getScheme();
+       String ssp = stripPrefix(uri.getSchemeSpecificPart().trim(), "//").trim();
+
+       parseComposite(uri, rc, ssp);
+
+       rc.fragment = uri.getFragment();
+       return rc;
+   }
+
+   private static void parseComposite(URI uri, CompositeData rc, String ssp) throws URISyntaxException {
+       String componentString;
+       String params;
+
+       if(!checkParenthesis(ssp)){
+           throw new URISyntaxException(uri.toString(), "Not a matching number of '(' and ')' parenthesis");
+       }
+
+       int p;
+       int intialParen = ssp.indexOf("(");
+       if( intialParen==0 ) {
+           rc.host = ssp.substring(0, intialParen);
+           p = rc.host.indexOf("/");
+           if( p >= 0 ) {
+               rc.path = rc.host.substring(p);
+               rc.host = rc.host.substring(0,p);
+           }
+           p = ssp.lastIndexOf(")");
+           componentString = ssp.substring(intialParen+1,p);
+           params = ssp.substring(p+1).trim();
+
+       } else {
+           componentString = ssp;
+           params="";
+       }
+
+       String components[] = splitComponents(componentString);
+       rc.components=new URI[components.length];
+       for (int i = 0; i < components.length; i++) {
+           rc.components[i] = new URI(components[i].trim());
+       }
+
+       p = params.indexOf("?");
+       if( p >= 0 ) {
+           if( p > 0) {
+               rc.path = stripPrefix(params.substring(0, p), "/");
+           }
+           rc.parameters = parseQuery(params.substring(p+1));
+       } else {
+           if( params.length() > 0 )
+               rc.path = stripPrefix(params, "/");
+           rc.parameters = new LinkedHashMap();
+       }
+   }
+
+   private static String[] splitComponents(String str) {
+       ArrayList<String> l = new ArrayList<String>();
+
+       int last=0;
+       int depth = 0;
+       char chars[] = str.toCharArray();
+       for( int i=0; i < chars.length; i ++ ) {
+           switch( chars[i] ) {
+           case '(':
+               depth++;
+               break;
+           case ')':
+               depth--;
+               break;
+           case ',':
+               if( depth == 0 ) {
+                   String s = str.substring(last, i);
+                   l.add(s);
+                   last=i+1;
+               }
+           }
+       }
+
+       String s = str.substring(last);
+       if( s.length() !=0 )
+           l.add(s);
+
+       String rc[] = new String[l.size()];
+       l.toArray(rc);
+       return rc;
+   }
+
+   public static String stripPrefix(String value, String prefix) {
+       if( value.startsWith(prefix) )
+           return value.substring(prefix.length());
+       return value;
+   }
+
+   public static URI stripScheme(URI uri) throws URISyntaxException {
+       return new URI(stripPrefix(uri.getRawSchemeSpecificPart().trim(), "//"));
+   }
+
+   public static String createQueryString(Map options) throws URISyntaxException {
+       try {
+           if(options.size()>0) {
+               StringBuffer rc = new StringBuffer();
+               boolean first=true;
+               for (Iterator iter = options.keySet().iterator(); iter.hasNext();) {
+                   if( first )
+                       first=false;
+                   else
+                       rc.append("&");
+
+                   String key = (String) iter.next();
+                   String value = (String)options.get(key);
+                   rc.append(URLEncoder.encode(key, "UTF-8"));
+                   rc.append("=");
+                   rc.append(URLEncoder.encode(value, "UTF-8"));
+               }
+               return rc.toString();
+           } else {
+               return "";
+           }
+       } catch (UnsupportedEncodingException e) {
+           throw (URISyntaxException)new URISyntaxException(e.toString(), "Invalid encoding").initCause(e);
+       }
+   }
+
+   /**
+    * Creates a URI from the original URI and the remaining paramaters
+    * @throws URISyntaxException
+    */
+   public static URI createRemainingURI(URI originalURI, Map params) throws URISyntaxException {
+       String s = createQueryString(params);
+       if( s.length()==0 )
+           s = null;
+       return createURIWithQuery(originalURI, s);
+   }
+
+   static public URI changeScheme(URI bindAddr, String scheme) throws URISyntaxException {
+       return new URI(scheme, bindAddr.getUserInfo(), bindAddr.getHost(), bindAddr.getPort(), bindAddr.getPath(), bindAddr.getQuery(), bindAddr.getFragment());
+   }
+
+   public static boolean checkParenthesis(String str){
+       boolean result=true;
+       if(str!=null){
+           int open=0;
+           int closed=0;
+
+           int i=0;
+           while((i=str.indexOf('(',i)) >=0 ){
+               i++;
+               open++;
+           }
+           i=0;
+           while((i=str.indexOf(')',i)) >=0 ){
+               i++;
+               closed++;
+           }
+           result = open == closed;
+       }
+       return result;
+   }
+
+   public int indexOfParenthesisMatch(String str){
+       int result = -1;
+
+       return result;
+   }
+}
+

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/URISupport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,76 @@
+/**
+ *
+ * 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.aries.mds.ra.activemq;
+
+import org.apache.activemq.broker.BrokerFactory;
+import org.apache.activemq.broker.BrokerFactoryHandler;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.store.jdbc.JDBCPersistenceAdapter;
+import org.apache.activemq.store.memory.MemoryPersistenceAdapter;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+import java.net.URI;
+import java.util.Map;
+import java.util.Properties;
+
+public class ActiveMQ5Factory implements BrokerFactoryHandler {
+    private static final ThreadLocal<Properties> threadProperties = new ThreadLocal<Properties>();
+
+    public static void setThreadProperties(Properties value) {
+        threadProperties.set(value);
+    }
+
+    public BrokerService createBroker(URI brokerURI) throws Exception {
+        URI uri = new URI(brokerURI.getRawSchemeSpecificPart());
+        BrokerService broker = BrokerFactory.createBroker(uri);
+
+        Properties properties = getLowerCaseProperties();
+
+        Object value = properties.get("datasource");
+        if (value instanceof String && value.toString().length() == 0) {
+            value = null;
+        }
+
+        if (value == null) {
+            MemoryPersistenceAdapter persistenceAdapter = new MemoryPersistenceAdapter();
+            broker.setPersistenceAdapter(persistenceAdapter);
+        }
+
+        return broker;
+    }
+
+    private Properties getLowerCaseProperties() {
+        final Properties properties = threadProperties.get();
+        final Properties newProperties = new Properties();
+        if (properties != null) {
+            Object key;
+            for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+                key = entry.getKey();
+                if (key instanceof String) {
+                    key = ((String) key).toLowerCase();
+                }
+                newProperties.put(key, entry.getValue());
+            }
+        }
+        return newProperties;
+    }
+
+
+}
\ No newline at end of file

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQ5Factory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,184 @@
+/**
+ *
+ * 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.aries.mds.ra.activemq;
+
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.util.FactoryFinder;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ActiveMQFactory {
+
+    private static final Method setThreadProperties;
+    private static final Method createBroker;
+    private static final Object instance;
+
+    private static Class clazz;
+    private static String brokerPrefix;
+
+    static {
+
+        try {
+            MyObjectFactory objectFactory = new MyObjectFactory();
+            FactoryFinder.setObjectFactory(objectFactory);
+            
+            clazz = Class.forName("org.apache.aries.mds.ra.activemq.ActiveMQ5Factory");
+            brokerPrefix = "amq5factory:";
+        } catch (java.lang.Throwable t1) {
+            throw new RuntimeException("Unable to load ActiveMQ5Factory");
+        }
+
+        try {
+            instance = clazz.newInstance();
+        } catch (InstantiationException e) {
+            throw new RuntimeException("Unable to create ActiveMQFactory instance");
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException("Unable to access ActiveMQFactory instance");
+        }
+
+        try {
+            setThreadProperties = clazz.getDeclaredMethod("setThreadProperties", new Class[]{Properties.class});
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Unable to create ActiveMQFactory setThreadProperties method");
+        }
+
+        try {
+            createBroker = clazz.getDeclaredMethod("createBroker", new Class[]{URI.class});
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Unable to create ActiveMQFactory setThreadProperties method");
+        }
+    }
+
+    /**
+     * Returns the prefix metafile name of the poperties file that ActiveMQ should be
+     * provided with. This file is located at META-INF/services/org/apache/activemq/broker/
+     * and defines the BrokerFactoryHandler to load.
+     * @return String name - will be either 'amq5factory:' or 'amq4factory:' - note the trailing ':'
+     */
+    public static String getBrokerMetaFile() {
+        return brokerPrefix;
+    }
+
+    public static void setThreadProperties(final Properties p) {
+        try {
+            setThreadProperties.invoke(instance, p);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException("ActiveMQFactory.setThreadProperties.IllegalAccessException", e);
+        } catch (IllegalArgumentException e) {
+            throw new RuntimeException("ActiveMQFactory.setThreadProperties.IllegalArgumentException", e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException("ActiveMQFactory.setThreadProperties.InvocationTargetException", e);
+        }
+    }
+
+    public BrokerService createBroker(final URI brokerURI) throws Exception {
+        try {
+            return (BrokerService) createBroker.invoke(instance, brokerURI);
+        } catch (IllegalAccessException e) {
+            throw new Exception("ActiveMQFactory.createBroker.IllegalAccessException", e);
+        } catch (IllegalArgumentException e) {
+            throw new Exception("ActiveMQFactory.createBroker.IllegalArgumentException", e);
+        } catch (InvocationTargetException e) {
+            throw new Exception("ActiveMQFactory.createBroker.InvocationTargetException", e);
+        }
+    }
+    
+    protected static class MyObjectFactory implements org.apache.activemq.util.FactoryFinder.ObjectFactory {
+
+        final ConcurrentHashMap<String, Class> classMap = new ConcurrentHashMap<String, Class>();
+
+        public Object create(final String path) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException {
+            Class clazz = classMap.get(path);
+            if (clazz == null) {
+                clazz = loadClass(loadProperties(path));
+                classMap.put(path, clazz);
+            }
+            return clazz.newInstance();
+        }
+
+        static public Class loadClass(Properties properties) throws ClassNotFoundException, IOException {
+
+            String className = properties.getProperty("class");
+            if (className == null) {
+                throw new IOException("Expected property is missing: class");
+            }
+            Class clazz = null;
+            ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+            if (loader != null) {
+                try {
+                    clazz = loader.loadClass(className);
+                } catch (ClassNotFoundException e) {
+                    // ignore
+                }
+            }
+            
+            if (clazz == null) {
+                loader = MyObjectFactory.class.getClassLoader();
+                try {
+                    clazz = loader.loadClass(className);
+                } catch (ClassNotFoundException e) {
+                    // ignore
+                }
+            }
+            if (clazz == null) {
+                clazz = FactoryFinder.class.getClassLoader().loadClass(className);
+            }
+
+            return clazz;
+        }
+
+        static public Properties loadProperties(String uri) throws IOException {
+            // lets try the thread context class loader first
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            InputStream in = classLoader.getResourceAsStream(uri);
+            
+            if (in == null) {
+                in = MyObjectFactory.class.getClassLoader().getResourceAsStream(uri);
+            }
+            
+            if (in == null) {
+                in = FactoryFinder.class.getClassLoader().getResourceAsStream(uri);
+                if (in == null) {
+                    throw new IOException("Could not find factory class for resource: " + uri);
+                }
+            }
+
+            // lets load the file
+            BufferedInputStream reader = null;
+            try {
+                reader = new BufferedInputStream(in);
+                Properties properties = new Properties();
+                properties.load(reader);
+                return properties;
+            } finally {
+                try {
+                    reader.close();
+                } catch (Exception e) {
+                }
+            }
+        }
+    }
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java Fri Jun 11 20:09:30 2010
@@ -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 org.apache.aries.mds.ra.activemq;
+
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+
+import org.apache.activemq.ra.ActiveMQResourceAdapter;
+import org.apache.activemq.util.URISupport;
+import org.apache.aries.mds.ra.ResourceAdapterFacade;
+import org.apache.aries.mds.ra.SimpleBootstrapContext;
+import org.apache.aries.mds.ra.SimpleWorkManager;
+import org.apache.geronimo.connector.work.GeronimoWorkManager;
+import org.apache.geronimo.transaction.manager.GeronimoTransactionManager;
+
+
+public class ActiveMQResourceAdapterFacade extends ActiveMQResourceAdapter implements ResourceAdapterFacade {
+   private String dataSource;
+   private BootstrapContext bootstrapContext;
+   private WorkManager workManager;
+   private TransactionManager transactionManager;
+   private ExecutorService threadPool;
+
+   public String getDataSource() {
+       return dataSource;
+   }
+
+   public void setDataSource(String dataSource) {
+       this.dataSource = dataSource;
+   }
+   
+   public BootstrapContext getBootstrapContext() {
+       return bootstrapContext;
+   }
+
+   public void setBootstrapContext(BootstrapContext bootstrapContext) {
+       this.bootstrapContext = bootstrapContext;
+   }
+   
+   public WorkManager getWorkManager() {
+       return workManager;
+   }
+
+   public void setWorkManager(WorkManager workManager) {
+       this.workManager = workManager;
+   }
+   
+   public TransactionManager getTransactionManager() {
+       return transactionManager;
+   }
+
+   public void setTransactionManager(TransactionManager transactionManager) {
+       this.transactionManager = transactionManager;
+   }
+   
+   public void start() throws ResourceAdapterInternalException {
+       if (transactionManager == null) {
+           throw new NullPointerException("transactionManager is null - unable to find TransactionManager in OSGi service registry");
+       }
+       
+       // WorkManager: the resource adapter can use this to dispatch messages or perform tasks
+       if (workManager == null) {
+           // create a thead pool for ActiveMQ
+           // TODO make this configurable
+           threadPool = Executors.newFixedThreadPool(30);
+
+           if (transactionManager instanceof GeronimoTransactionManager) {
+               GeronimoTransactionManager geronimoTransactionManager = (GeronimoTransactionManager) transactionManager;
+               workManager = new GeronimoWorkManager(threadPool, threadPool, threadPool, geronimoTransactionManager);
+           } else {
+               workManager = new SimpleWorkManager(threadPool);
+           }  
+       }
+       
+       if (bootstrapContext == null) {
+           // BootstrapContext: wraps the WorkMananger and XATerminator
+           if (transactionManager instanceof XATerminator) {
+               bootstrapContext = new SimpleBootstrapContext(workManager, (XATerminator) transactionManager);
+           } else {
+               bootstrapContext = new SimpleBootstrapContext(workManager);
+           }           
+       }
+       
+       start(this.bootstrapContext);
+   }
+   
+   public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
+       Properties properties = new Properties();
+
+       // add data source property
+       if (dataSource != null) {
+           properties.put("DataSource", dataSource);
+       }
+
+       // prefix server uri with openejb: so our broker factory is used
+       String brokerXmlConfig = getBrokerXmlConfig();
+       if (brokerXmlConfig != null && brokerXmlConfig.startsWith("broker:")) {
+           try {
+               URISupport.CompositeData compositeData = URISupport.parseComposite(new URI(brokerXmlConfig));
+               compositeData.getParameters().put("persistent", "false");
+               setBrokerXmlConfig(ActiveMQFactory.getBrokerMetaFile() + compositeData.toURI());
+           } catch (URISyntaxException e) {
+               throw new ResourceAdapterInternalException("Invalid BrokerXmlConfig", e);
+           }
+       }
+
+       ActiveMQFactory.setThreadProperties(properties);
+
+       try {
+           super.start(bootstrapContext);
+       } finally {
+           ActiveMQFactory.setThreadProperties(null);
+
+           // reset brokerXmlConfig
+           if (brokerXmlConfig != null) {
+               setBrokerXmlConfig(brokerXmlConfig);
+           }
+       }
+   }
+   
+   public void stop() {
+       super.stop();
+       bootstrapContext = null;
+       workManager = null;
+       transactionManager = null;
+       if (!threadPool.isShutdown()) {
+           threadPool.shutdown();
+       }
+   }
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/java/org/apache/aries/mds/ra/activemq/ActiveMQResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/META-INF/services/org/apache/activemq/broker/amq5factory
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/META-INF/services/org/apache/activemq/broker/amq5factory?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/META-INF/services/org/apache/activemq/broker/amq5factory (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/META-INF/services/org/apache/activemq/broker/amq5factory Fri Jun 11 20:09:30 2010
@@ -0,0 +1 @@
+class=org.apache.aries.mds.ra.activemq.ActiveMQ5Factory
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml Fri Jun 11 20:09:30 2010
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+	<!--
+		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.
+	-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+	xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+	xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+	default-availability="optional">
+	
+    <bean id="activemqResourceAdapter" class="org.apache.aries.mds.ra.activemq.ActiveMQResourceAdapterFacade" init-method="start" destroy-method="stop">
+        <!-- <property name="bootstrapContext" value=""/>
+        <property name="workManager" value=""/> -->
+        <property name="serverUrl" value="tcp://localhost:61616"/>
+        <property name="brokerXmlConfig" value="broker:(tcp://localhost:61616)?useJmx=false"/>
+        <property name="transactionManager" ref="tm"/>
+    </bean>
+
+    <service ref="activemqResourceAdapter" interface="javax.resource.spi.ResourceAdapter">
+        <service-properties>
+			<entry key="serverUrl" value="tcp://localhost:61616" />
+		</service-properties>
+    </service>
+    
+    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
+        <argument value="tcp://localhost:61616"/>
+    </bean>
+    <service ref="connectionFactory" interface="javax.jms.ConnectionFactory"/>
+
+    <reference id="tm" interface="javax.transaction.TransactionManager" timeout="100"/>
+</blueprint>
\ No newline at end of file

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra-activemq/src/main/resources/OSGI-INF/blueprint/config.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: incubator/aries/sandbox/linsun/mds/mds-ra/.classpath
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/.classpath?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/.classpath (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/.classpath Fri Jun 11 20:09:30 2010
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
+	<classpathentry excluding="**/*.java" kind="src" path="target/maven-shared-archive-resources"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-j2ee-connector_1.5_spec/2.0.0/geronimo-j2ee-connector_1.5_spec-2.0.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.1.1/geronimo-jms_1.1_spec-1.1.1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1.1/geronimo-jta_1.1_spec-1.1.1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.compendium/4.2.0/org.osgi.compendium-4.2.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.core/4.2.0/org.osgi.core-4.2.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/eclipse/osgi/3.5.0.v20090520/osgi-3.5.0.v20090520.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.11/slf4j-api-1.5.11.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-simple/1.5.11/slf4j-simple-1.5.11.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

Added: incubator/aries/sandbox/linsun/mds/mds-ra/.project
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/.project?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/.project (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/.project Fri Jun 11 20:09:30 2010
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>org.apache.aries.mds.ra</name>
+  <comment>This bundle contains the Message driven Service Implementation using ActiveMQ as the provider of JMS broker and resource adapter. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-ra/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/.settings/org.eclipse.jdt.core.prefs?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/.settings/org.eclipse.jdt.core.prefs (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/.settings/org.eclipse.jdt.core.prefs Fri Jun 11 20:09:30 2010
@@ -0,0 +1,11 @@
+#Wed May 26 10:26:25 EDT 2010
+encoding//src/main/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.compliance=1.5
+encoding//src/main/resources=${project.build.sourceEncoding}
+encoding//src/test/resources=${project.build.sourceEncoding}
+encoding//src/test/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+encoding//src/test/filtered-resources=${project.build.sourceEncoding}
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+encoding//src/main/filtered-resources=${project.build.sourceEncoding}

Added: incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml Fri Jun 11 20:09:30 2010
@@ -0,0 +1,86 @@
+    <!--
+		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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.aries.mds</groupId>
+		<artifactId>blueprint</artifactId>
+		<version>0.2-incubating-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.apache.aries.mds.ra</artifactId>
+	<packaging>bundle</packaging>
+	<name>Apache Aries Message Driven Service Resource Adapter </name>
+	<description>
+      This bundle contains the Message driven Service Implementation using ActiveMQ as the provider of JMS broker and resource adapter
+  </description>
+
+	<properties>
+		<aries.osgi.export.pkg>
+			org.apache.aries.mds.ra
+      </aries.osgi.export.pkg>
+		<aries.osgi.import>
+			!org.apache.aries.mds.ra.*,
+			*
+      </aries.osgi.import>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>osgi</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-jms_1.1_spec</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-jta_1.1_spec</artifactId>
+		</dependency>
+
+
+	</dependencies>
+
+</project>

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,78 @@
+/**
+ *
+ * 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.aries.mds.ra;
+
+import javax.jms.MessageProducer;
+import javax.jms.JMSException;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.Connection;
+import java.lang.reflect.Method;
+
+public class MdbUtil {
+    public static String getSignature(Method method){
+        StringBuilder builder = new StringBuilder();
+        builder.append(method.getName()).append("(");
+        boolean first = true;
+        for (Class<?> type : method.getParameterTypes()) {
+            if (!first) {
+                builder.append(",");
+            }
+            builder.append(type);
+            first = false;
+        }
+        builder.append(")");
+        return builder.toString();
+    }
+
+    public static void close(MessageProducer closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (JMSException e) {
+            }
+        }
+    }
+
+    public static void close(MessageConsumer closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (JMSException e) {
+            }
+        }
+    }
+
+    public static void close(Session closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (JMSException e) {
+            }
+        }
+    }
+
+    public static void close(Connection closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (JMSException e) {
+            }
+        }
+    }
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/MdbUtil.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,47 @@
+/**
+*
+* 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.aries.mds.ra;
+
+
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+
+
+public interface ResourceAdapterFacade  {
+   public String getDataSource();
+
+   public void setDataSource(String dataSource);
+   
+   public BootstrapContext getBootstrapContext();
+
+   public void setBootstrapContext(BootstrapContext bootstrapContext);
+   
+   public WorkManager getWorkManager();
+
+   public void setWorkManager(WorkManager workManager);
+   
+   public TransactionManager getTransactionManager();
+
+   public void setTransactionManager(TransactionManager transactionManager);
+   
+   public void start() throws ResourceAdapterInternalException;
+ 
+   public void stop();
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/ResourceAdapterFacade.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,50 @@
+/**
+ *
+ * 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.aries.mds.ra;
+
+import java.util.Timer;
+import javax.resource.spi.work.WorkManager;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.BootstrapContext;
+
+public class SimpleBootstrapContext implements BootstrapContext {
+    private final WorkManager workManager;
+    private final XATerminator xaTerminator;
+
+    public SimpleBootstrapContext(WorkManager workManager) {
+        this.workManager = workManager;
+        xaTerminator = null;
+    }
+
+    public SimpleBootstrapContext(WorkManager workManager, XATerminator xaTerminator) {
+        this.workManager = workManager;
+        this.xaTerminator = xaTerminator;
+    }
+
+    public WorkManager getWorkManager() {
+        return workManager;
+    }
+
+    public XATerminator getXATerminator() {
+        return xaTerminator;
+    }
+
+    public Timer createTimer() {
+        return new Timer(true);
+    }
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleBootstrapContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java (added)
+++ incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java Fri Jun 11 20:09:30 2010
@@ -0,0 +1,254 @@
+/*
+ * 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.aries.mds.ra;
+
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import javax.resource.spi.work.ExecutionContext;
+import javax.resource.spi.work.Work;
+import javax.resource.spi.work.WorkAdapter;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkEvent;
+import static javax.resource.spi.work.WorkEvent.WORK_ACCEPTED;
+import static javax.resource.spi.work.WorkEvent.WORK_COMPLETED;
+import static javax.resource.spi.work.WorkEvent.WORK_REJECTED;
+import static javax.resource.spi.work.WorkEvent.WORK_STARTED;
+import javax.resource.spi.work.WorkException;
+import static javax.resource.spi.work.WorkException.INTERNAL;
+import static javax.resource.spi.work.WorkException.START_TIMED_OUT;
+import javax.resource.spi.work.WorkListener;
+import javax.resource.spi.work.WorkManager;
+import javax.resource.spi.work.WorkRejectedException;
+
+import static org.apache.aries.mds.ra.SimpleWorkManager.WorkType.DO;
+import static org.apache.aries.mds.ra.SimpleWorkManager.WorkType.SCHEDULE;
+import static org.apache.aries.mds.ra.SimpleWorkManager.WorkType.START;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SimpleWorkManager implements WorkManager {
+    public enum WorkType {
+        DO, START, SCHEDULE
+    }
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleWorkManager.class);
+
+    /**
+     * All work is performed by this executor
+     */
+    private Executor executor;
+
+    public SimpleWorkManager(Executor executor) {
+        if (executor == null) throw new NullPointerException("executor is null");
+        this.executor = executor;
+    }
+
+    public void doWork(Work work) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        doWork(work, INDEFINITE, null, null);
+    }
+
+    public void doWork(Work work, long startTimeout, ExecutionContext executionContext, WorkListener workListener) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        executeWork(DO, work, startTimeout, executionContext, workListener);
+    }
+
+    public long startWork(Work work) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        return startWork(work, INDEFINITE, null, null);
+    }
+
+    public long startWork(Work work, long startTimeout, ExecutionContext executionContext, WorkListener workListener) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        return executeWork(START, work, startTimeout, executionContext, workListener);
+    }
+
+    public void scheduleWork(Work work) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        scheduleWork(work, INDEFINITE, null, null);
+    }
+
+    public void scheduleWork(Work work, long startTimeout, ExecutionContext executionContext, WorkListener workListener) throws WorkException {
+        if (work == null) throw new NullPointerException("work is null");
+        executeWork(SCHEDULE, work, startTimeout, executionContext, workListener);
+    }
+
+    private long executeWork(WorkType workType, Work work, long startTimeout, ExecutionContext executionContext, WorkListener workListener) throws WorkException {
+        // assure we have a work listener
+        if (workListener == null) workListener = new LoggingWorkListener(workType);
+
+        // reject work with an XID
+        if (executionContext != null && executionContext.getXid() != null) {
+            WorkRejectedException workRejectedException = new WorkRejectedException("SimpleWorkManager can not import an XID", WorkException.TX_RECREATE_FAILED);
+            workListener.workRejected(new WorkEvent(this, WORK_REJECTED, work, workRejectedException));
+            throw workRejectedException;
+        }
+
+        // accecpt all other work
+        workListener.workAccepted(new WorkEvent(this, WORK_ACCEPTED, work, null));
+
+        // execute work
+        Worker worker = new Worker(work, workListener, startTimeout);
+        executor.execute(worker);
+
+        if (workType == DO) {
+            // wait for completion
+            try {
+                worker.waitForCompletion();
+            } catch (InterruptedException e) {
+                WorkException workException = new WorkException("Work submission thread was interrupted", e);
+                workException.setErrorCode(INTERNAL);
+                throw workException;
+            }
+
+            // if work threw an exception, rethrow it
+            WorkException workCompletedException = worker.getWorkException();
+            if (workCompletedException != null) {
+                throw workCompletedException;
+            }
+        } else if (workType == START) {
+            // wait for work to start
+            try {
+                worker.waitForStart();
+            } catch (InterruptedException e) {
+                WorkException workException = new WorkException("Work submission thread was interrupted", e);
+                workException.setErrorCode(INTERNAL);
+                throw workException;
+            }
+
+            // if work threw a rejection exception, rethrow it (it is the exception for timeout) 
+            WorkException workCompletedException = worker.getWorkException();
+            if (workCompletedException instanceof WorkRejectedException) {
+                throw workCompletedException;
+            }
+        }
+
+        return worker.getStartDelay();
+    }
+
+    private class Worker implements Runnable {
+        private final Work work;
+        private final WorkListener workListener;
+        private final long startTimeout;
+        private final long created = System.currentTimeMillis();
+        private final CountDownLatch started = new CountDownLatch(1);
+        private final CountDownLatch completed = new CountDownLatch(1);
+        private long startDelay = UNKNOWN;
+        private WorkException workException;
+
+        public Worker(Work work, WorkListener workListener, long startTimeout) {
+            this.work = work;
+            this.workListener = workListener;
+            if (startTimeout <= 0) {
+                this.startTimeout = INDEFINITE;
+            } else {
+                this.startTimeout = startTimeout;
+            }
+        }
+
+        public void run() {
+            try {
+                // check if we have started within the specified limit
+                startDelay = System.currentTimeMillis() - created;
+                if (startDelay > startTimeout) {
+                    workException = new WorkRejectedException("Work not started within specified timeout " + startTimeout + "ms", START_TIMED_OUT);
+                    workListener.workRejected(new WorkEvent(this, WORK_REJECTED, work, workException, startTimeout));
+                    return;
+                }
+
+                // notify listener that work has been started
+                workListener.workStarted(new WorkEvent(SimpleWorkManager.this, WORK_STARTED, work, null));
+
+                // officially started
+                started.countDown();
+
+                // execute the real work
+                workException = null;
+                try {
+                    work.run();
+                } catch (Throwable e) {
+                    workException = new WorkCompletedException(e);
+                } finally {
+                    // notify listener that work completed (with an optional exception)
+                    workListener.workCompleted(new WorkEvent(SimpleWorkManager.this, WORK_COMPLETED, work, workException));
+                }
+            } finally {
+                // assure that threads waiting for start are released
+                started.countDown();
+
+                // Done
+                completed.countDown();
+            }
+        }
+
+        public long getStartDelay() {
+            return startDelay;
+        }
+
+        public WorkException getWorkException() {
+            return workException;
+        }
+
+        public void waitForStart() throws InterruptedException {
+            started.await();
+        }
+
+        public void waitForCompletion() throws InterruptedException {
+            completed.await();
+        }
+    }
+
+    private static class LoggingWorkListener extends WorkAdapter {
+        private final WorkType workType;
+
+        private LoggingWorkListener(WorkType workType) {
+            this.workType = workType;
+        }
+
+        public void workRejected(WorkEvent event) {
+            // Don't log doWork or startWork since exception is propagated to caller
+            if (workType == DO || workType == START) {
+                return;
+            }
+            WorkException exception = event.getException();
+            if (exception != null) {
+                if (WorkException.START_TIMED_OUT.equals(exception.getErrorCode())) {
+                    LOGGER.error(exception.getMessage());
+                }
+            }
+        }
+
+        public void workCompleted(WorkEvent event) {
+            // Don't log doWork since exception is propagated to caller
+            if (workType == DO) {
+                return;
+            }
+
+            Throwable cause = event.getException();
+            if (cause != null && cause.getCause() != null) {
+                cause = cause.getCause();
+            }
+            if (cause != null) {
+                LOGGER.error(event.getWork().toString(), cause);
+            }
+        }
+    }
+}

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/sandbox/linsun/mds/mds-ra/src/main/java/org/apache/aries/mds/ra/SimpleWorkManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/sandbox/linsun/mds/mds-sample/.classpath
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-sample/.classpath?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-sample/.classpath (added)
+++ incubator/aries/sandbox/linsun/mds/mds-sample/.classpath Fri Jun 11 20:09:30 2010
@@ -0,0 +1,14 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources" including="**/*" excluding="**/*.java"/>
+  <classpathentry kind="src" path="target/maven-shared-archive-resources" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.1.1/geronimo-jms_1.1_spec-1.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.compendium/4.2.0/org.osgi.compendium-4.2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/osgi/org.osgi.core/4.2.0/org.osgi.core-4.2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/osgi/3.5.0.v20090520/osgi-3.5.0.v20090520.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.11/slf4j-api-1.5.11.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-simple/1.5.11/slf4j-simple-1.5.11.jar"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+</classpath>
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-sample/.project
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-sample/.project?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-sample/.project (added)
+++ incubator/aries/sandbox/linsun/mds/mds-sample/.project Fri Jun 11 20:09:30 2010
@@ -0,0 +1,14 @@
+<projectDescription>
+  <name>org.apache.aries.mds.sample</name>
+  <comment>This bundle contains the Message driven service 
+      sample. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: incubator/aries/sandbox/linsun/mds/mds-sample/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/incubator/aries/sandbox/linsun/mds/mds-sample/.settings/org.eclipse.jdt.core.prefs?rev=953860&view=auto
==============================================================================
--- incubator/aries/sandbox/linsun/mds/mds-sample/.settings/org.eclipse.jdt.core.prefs (added)
+++ incubator/aries/sandbox/linsun/mds/mds-sample/.settings/org.eclipse.jdt.core.prefs Fri Jun 11 20:09:30 2010
@@ -0,0 +1,11 @@
+#Wed May 26 10:26:25 EDT 2010
+encoding//src/main/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.compliance=1.5
+encoding//src/main/resources=${project.build.sourceEncoding}
+encoding//src/test/resources=${project.build.sourceEncoding}
+encoding//src/test/java=${project.build.sourceEncoding}
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+encoding//src/test/filtered-resources=${project.build.sourceEncoding}
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+encoding//src/main/filtered-resources=${project.build.sourceEncoding}