From bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a Mon Sep 17 00:00:00 2001 From: dims Date: Tue, 17 Jun 2008 00:23:01 +0000 Subject: Move Tuscany from Incubator to top level. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/host/jms/activemq/ActiveMQBroker.java | 57 ++++++++ .../sca/host/jms/activemq/ActiveMQJMSHost.java | 33 +++++ .../host/jms/activemq/ActiveMQModuleActivator.java | 45 ++++++ .../host/jms/activemq/JMSResourceFactoryImpl.java | 159 +++++++++++++++++++++ 4 files changed, 294 insertions(+) create mode 100644 branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQBroker.java create mode 100644 branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQJMSHost.java create mode 100644 branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQModuleActivator.java create mode 100644 branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/JMSResourceFactoryImpl.java (limited to 'branches/sca-java-1.1/modules/host-jms-activemq/src/main/java') diff --git a/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQBroker.java b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQBroker.java new file mode 100644 index 0000000000..29f7eb0a71 --- /dev/null +++ b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQBroker.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.host.jms.activemq; + +import org.apache.activemq.broker.BrokerService; + +/** + */ +public class ActiveMQBroker { + + public static final String CONNECTOR_URL = "tcp://localhost:61619"; + private BrokerService broker; + + public ActiveMQBroker() { + } + + public void start() { + broker = new BrokerService(); + try { + broker.addConnector(CONNECTOR_URL); + broker.start(); + } catch ( Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public void stop() { + if (broker != null) { + try { + broker.stop(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + broker = null; + } + } + + +} diff --git a/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQJMSHost.java b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQJMSHost.java new file mode 100644 index 0000000000..cf03ed8d33 --- /dev/null +++ b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQJMSHost.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.host.jms.activemq; + +import org.apache.tuscany.sca.host.jms.JMSHost; +import org.apache.tuscany.sca.host.jms.JMSResourceFactory; + +public class ActiveMQJMSHost implements JMSHost { + + public JMSResourceFactory createJMSResourceFactory(String connectionFactoryName, String initialContextFactoryName, String jndiURL) { + return new JMSResourceFactoryImpl(connectionFactoryName, initialContextFactoryName, jndiURL); + } + + + +} diff --git a/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQModuleActivator.java b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQModuleActivator.java new file mode 100644 index 0000000000..f3cd71bb78 --- /dev/null +++ b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/ActiveMQModuleActivator.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 org.apache.tuscany.sca.host.jms.activemq; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.ModuleActivator; + +public class ActiveMQModuleActivator implements ModuleActivator { + + private static ActiveMQBroker activeMQHost; + + public void start(ExtensionPointRegistry registry) { + } + + public void stop(ExtensionPointRegistry registry) { + if (activeMQHost != null) { + activeMQHost.stop(); + activeMQHost = null; + } + } + + public static void startBroker() { + if (activeMQHost == null) { + activeMQHost = new ActiveMQBroker(); + activeMQHost.start(); + } + } +} diff --git a/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/JMSResourceFactoryImpl.java b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/JMSResourceFactoryImpl.java new file mode 100644 index 0000000000..77b3503a9d --- /dev/null +++ b/branches/sca-java-1.1/modules/host-jms-activemq/src/main/java/org/apache/tuscany/sca/host/jms/activemq/JMSResourceFactoryImpl.java @@ -0,0 +1,159 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.host.jms.activemq; + +import java.util.Properties; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.Destination; +import javax.jms.JMSException; +import javax.jms.Session; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.apache.tuscany.sca.host.jms.JMSResourceFactory; + +/** + * Abstracts away any JMS provide specific feature from the JMS binding + */ +public class JMSResourceFactoryImpl implements JMSResourceFactory { + + private static final String DEFAULT_ICFN = "org.apache.activemq.jndi.ActiveMQInitialContextFactory"; + private String initialContextFactoryName = DEFAULT_ICFN; + private String connectionFactoryName = "ConnectionFactory"; + private String jndiURL = ActiveMQBroker.CONNECTOR_URL; + + private Connection connection; + private Context context; + private boolean isConnectionStarted; + + public JMSResourceFactoryImpl(String connectionFactoryName, String initialContextFactoryName, String jndiURL) { + if (connectionFactoryName != null) { + this.connectionFactoryName = connectionFactoryName.trim(); + } + if (initialContextFactoryName != null) { + this.initialContextFactoryName = initialContextFactoryName.trim(); + } + if (jndiURL != null) { + this.jndiURL = jndiURL.trim(); + } + } + + /* + * This is a simple implementation where a connection is created per binding Ideally the resource factory should be + * able to leverage the host environment to provide connection pooling if it can. E.g. if Tuscany is running inside + * an AppServer Then we could leverage the JMS resources it provides + * + * @see org.apache.tuscany.binding.jms.JMSResourceFactory#getConnection() + */ + public Connection getConnection() throws NamingException, JMSException { + if (connection == null) { + createConnection(); + } + return connection; + } + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.binding.jms.JMSResourceFactory#createSession() + */ + public Session createSession() throws JMSException, NamingException { + return getConnection().createSession(false, Session.AUTO_ACKNOWLEDGE); + } + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.binding.jms.JMSResourceFactory#startConnection() + */ + public void startConnection() throws JMSException, NamingException { + if (!isConnectionStarted) { + getConnection().start(); + isConnectionStarted = true; + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.binding.jms.JMSResourceFactory#closeConnection() + */ + public void closeConnection() throws JMSException, NamingException { + if (connection != null) { + connection.close(); + } + } + + public void startBroker() { + if (isEmbedded()) { + // ensure the broker has been started + ActiveMQModuleActivator.startBroker(); + } + } + + /** + * TODO: need to find a way to determine whether or not need to start the embedded broker + * for now it always starts it if the activemq icf is being used with our default jndiurl + */ + protected boolean isEmbedded() { + return DEFAULT_ICFN.equals(initialContextFactoryName) && ActiveMQBroker.CONNECTOR_URL.equals(jndiURL); + } + + private void createConnection() throws NamingException, JMSException { + if (context == null) { + createInitialContext(); + } + ConnectionFactory connectionFactory = (ConnectionFactory)context.lookup(connectionFactoryName); + connection = connectionFactory.createConnection(); + } + + private void createInitialContext() throws NamingException { + Properties props = new Properties(); + props.setProperty(Context.INITIAL_CONTEXT_FACTORY, initialContextFactoryName); + props.setProperty(Context.PROVIDER_URL, jndiURL); + + context = new InitialContext(props); + } + + public Destination lookupDestination(String jndiName) throws NamingException { + if (context == null) { + createInitialContext(); + } + + Destination dest = null; + + try { + dest = (Destination)context.lookup(jndiName); + } catch (NamingException ex) { + + } + return dest; + } + + /** + * You can create a destination in ActiveMQ (and have it appear in JNDI) by putting "dynamicQueues/" in front of the + * queue name being looked up + */ + public Destination createDestination(String jndiName) throws NamingException { + return lookupDestination("dynamicQueues/" + jndiName); + } +} -- cgit v1.2.3