001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.activemq.console.command;
018
019 import java.net.URI;
020 import java.net.URISyntaxException;
021 import java.util.ArrayList;
022 import java.util.Iterator;
023 import java.util.List;
024
025 import javax.jms.Connection;
026 import javax.jms.ConnectionFactory;
027 import javax.jms.JMSException;
028
029 import org.apache.activemq.ActiveMQConnectionFactory;
030
031 public abstract class AbstractAmqCommand extends AbstractCommand {
032 private URI brokerUrl;
033 private ConnectionFactory factory;
034 private final List<Connection> connections = new ArrayList<Connection>();
035
036 /**
037 * Establishes a connection to the remote broker specified by the broker
038 * url.
039 *
040 * @return - connection to the broker
041 * @throws JMSException
042 */
043 protected Connection createConnection() throws JMSException {
044 if (getBrokerUrl() == null) {
045 context
046 .printException(new IllegalStateException("You must specify a broker "
047 + "URL to connect to using the --amqurl option."));
048 return null;
049 }
050
051 if (factory == null) {
052 factory = new ActiveMQConnectionFactory(getBrokerUrl());
053 }
054
055 Connection conn = factory.createConnection();
056 connections.add(conn);
057
058 return conn;
059 }
060
061 /**
062 * Establishes a connection to the remote broker specified by the broker
063 * url.
064 *
065 * @param username - username for the connection
066 * @param password - password for the connection
067 * @return - connection to the broker
068 * @throws JMSException
069 */
070 protected Connection createConnection(String username, String password) throws JMSException {
071 if (getBrokerUrl() == null) {
072 context
073 .printException(new IllegalStateException(
074 "You must specify a broker URL to connect to using the --amqurl option."));
075 return null;
076 }
077
078 if (factory == null) {
079 factory = new ActiveMQConnectionFactory(getBrokerUrl());
080 }
081
082 Connection conn = factory.createConnection(username, password);
083 connections.add(conn);
084 conn.start();
085
086 return conn;
087 }
088
089 /**
090 * Close all created connections.
091 */
092 protected void closeAllConnections() {
093 for (Iterator<Connection> i = connections.iterator(); i.hasNext();) {
094 try {
095 i.next().close();
096 } catch (Exception e) {
097 }
098 }
099
100 connections.clear();
101 }
102
103 /**
104 * Handle the --amqurl option.
105 *
106 * @param token - current option
107 * @param tokens - succeeding list of arguments
108 * @throws Exception
109 */
110 protected void handleOption(String token, List tokens) throws Exception {
111 // Try to handle the options first
112 if (token.equals("--amqurl")) {
113 // If no broker url specified, or next token is a new option
114 if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
115 context.printException(new IllegalArgumentException("Broker URL not specified."));
116 tokens.clear();
117 return;
118 }
119
120 // If broker url already specified
121 if (getBrokerUrl() != null) {
122 context
123 .printException(new IllegalArgumentException("Multiple broker URL cannot be specified."));
124 tokens.clear();
125 return;
126 }
127
128 String strBrokerUrl = (String)tokens.remove(0);
129
130 try {
131 setBrokerUrl(new URI(strBrokerUrl));
132 } catch (URISyntaxException e) {
133 context.printException(e);
134 tokens.clear();
135 return;
136 }
137 } else {
138 // Let the super class handle the option
139 super.handleOption(token, tokens);
140 }
141 }
142
143 /**
144 * Set the broker url.
145 *
146 * @param brokerUrl - new broker url
147 */
148 protected void setBrokerUrl(URI brokerUrl) {
149 this.brokerUrl = brokerUrl;
150 }
151
152 /**
153 * Set the broker url.
154 *
155 * @param address - address of the new broker url
156 * @throws URISyntaxException
157 */
158 protected void setBrokerUrl(String address) throws URISyntaxException {
159 this.brokerUrl = new URI(address);
160 }
161
162 /**
163 * Get the current broker url.
164 *
165 * @return current broker url
166 */
167 protected URI getBrokerUrl() {
168 return brokerUrl;
169 }
170 }