diff options
Diffstat (limited to 'java/client/src')
269 files changed, 0 insertions, 51962 deletions
diff --git a/java/client/src/main/grammar/SelectorParser.jj b/java/client/src/main/grammar/SelectorParser.jj deleted file mode 100644 index 4bf9a968d7..0000000000 --- a/java/client/src/main/grammar/SelectorParser.jj +++ /dev/null @@ -1,609 +0,0 @@ -/*
- *
- * 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.
- *
- */
-
- //
- // Original File from r450141 of the Apache ActiveMQ project <http://www.activemq.org/site/home.html>
- //
-
-// ----------------------------------------------------------------------------
-// OPTIONS
-// ----------------------------------------------------------------------------
-options {
- STATIC = false;
- UNICODE_INPUT = true;
-
- // some performance optimizations
- OPTIMIZE_TOKEN_MANAGER = true;
- ERROR_REPORTING = false;
-}
-
-// ----------------------------------------------------------------------------
-// PARSER
-// ----------------------------------------------------------------------------
-
-PARSER_BEGIN(SelectorParser)
-/*
- *
- * 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.qpid.filter.selector;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-
-import org.apache.qpid.AMQInternalException; -import org.apache.qpid.filter.ArithmeticExpression;
-import org.apache.qpid.filter.BooleanExpression;
-import org.apache.qpid.filter.ComparisonExpression;
-import org.apache.qpid.filter.ConstantExpression;
-import org.apache.qpid.filter.Expression;
-import org.apache.qpid.filter.LogicExpression;
-import org.apache.qpid.filter.PropertyExpression;
-import org.apache.qpid.filter.UnaryExpression;
-
-/**
- * JMS Selector Parser generated by JavaCC
- *
- * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
- */
-public class SelectorParser {
-
- public SelectorParser() {
- this(new StringReader(""));
- }
-
- public BooleanExpression parse(String sql) throws AMQInternalException {
- this.ReInit(new StringReader(sql));
-
- try {
- return this.JmsSelector();
- }
- catch (Throwable e) {
- throw new AMQInternalException(sql,e);
- }
-
- }
-
- private BooleanExpression asBooleanExpression(Expression value) throws ParseException {
- if (value instanceof BooleanExpression) {
- return (BooleanExpression) value;
- }
- if (value instanceof PropertyExpression) {
- return UnaryExpression.createBooleanCast( value );
- }
- throw new ParseException("Expression will not result in a boolean value: " + value);
- }
-
-
-}
-
-PARSER_END(SelectorParser)
-
-// ----------------------------------------------------------------------------
-// Tokens
-// ----------------------------------------------------------------------------
-
-/* White Space */
-SPECIAL_TOKEN :
-{
- " " | "\t" | "\n" | "\r" | "\f"
-}
-
-/* Comments */
-SKIP:
-{
- <LINE_COMMENT: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
-}
-
-SKIP:
-{
- <BLOCK_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">
-}
-
-/* Reserved Words */
-TOKEN [IGNORE_CASE] :
-{
- < NOT : "NOT">
- | < AND : "AND">
- | < OR : "OR">
- | < BETWEEN : "BETWEEN">
- | < LIKE : "LIKE">
- | < ESCAPE : "ESCAPE">
- | < IN : "IN">
- | < IS : "IS">
- | < TRUE : "TRUE" >
- | < FALSE : "FALSE" >
- | < NULL : "NULL" >
-}
-
-/* Literals */
-TOKEN [IGNORE_CASE] :
-{
-
- < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* (["l","L"])? >
- | < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
- | < OCTAL_LITERAL: "0" (["0"-"7"])* >
- | < FLOATING_POINT_LITERAL:
- (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? // matches: 5.5 or 5. or 5.5E10 or 5.E10
- | "." (["0"-"9"])+ (<EXPONENT>)? // matches: .5 or .5E10
- | (["0"-"9"])+ <EXPONENT> // matches: 5E10
- >
- | < #EXPONENT: "E" (["+","-"])? (["0"-"9"])+ >
- | < STRING_LITERAL: "'" ( ("''") | ~["'"] )* "'" >
-}
-
-TOKEN [IGNORE_CASE] :
-{
- < ID : ["a"-"z", "_", "$"] (["a"-"z","0"-"9","_", "$"])* >
- | < QUOTED_ID : "\"" ( ("\"\"") | ~["\""] )* "\"" >
-
-}
-
-// ----------------------------------------------------------------------------
-// Grammer
-// ----------------------------------------------------------------------------
-BooleanExpression JmsSelector() :
-{
- Expression left=null;
-}
-{
- (
- left = orExpression()
- )
- {
- return asBooleanExpression(left);
- }
-
-}
-
-Expression orExpression() :
-{
- Expression left;
- Expression right;
-}
-{
- (
- left = andExpression()
- (
- <OR> right = andExpression()
- {
- left = LogicExpression.createOR(asBooleanExpression(left), asBooleanExpression(right));
- }
- )*
- )
- {
- return left;
- }
-
-}
-
-
-Expression andExpression() :
-{
- Expression left;
- Expression right;
-}
-{
- (
- left = equalityExpression()
- (
- <AND> right = equalityExpression()
- {
- left = LogicExpression.createAND(asBooleanExpression(left), asBooleanExpression(right));
- }
- )*
- )
- {
- return left;
- }
-}
-
-Expression equalityExpression() :
-{
- Expression left;
- Expression right;
-}
-{
- (
- left = comparisonExpression()
- (
-
- "=" right = comparisonExpression()
- {
- left = ComparisonExpression.createEqual(left, right);
- }
- |
- "<>" right = comparisonExpression()
- {
- left = ComparisonExpression.createNotEqual(left, right);
- }
- |
- LOOKAHEAD(2)
- <IS> <NULL>
- {
- left = ComparisonExpression.createIsNull(left);
- }
- |
- <IS> <NOT> <NULL>
- {
- left = ComparisonExpression.createIsNotNull(left);
- }
- )*
- )
- {
- return left;
- }
-}
-
-Expression comparisonExpression() :
-{
- Expression left;
- Expression right;
- Expression low;
- Expression high;
- String t, u;
- boolean not;
- ArrayList list;
-}
-{
- (
- left = addExpression()
- (
-
- ">" right = addExpression()
- {
- left = ComparisonExpression.createGreaterThan(left, right);
- }
- |
- ">=" right = addExpression()
- {
- left = ComparisonExpression.createGreaterThanEqual(left, right);
- }
- |
- "<" right = addExpression()
- {
- left = ComparisonExpression.createLessThan(left, right);
- }
- |
- "<=" right = addExpression()
- {
- left = ComparisonExpression.createLessThanEqual(left, right);
- }
- |
- {
- u=null;
- }
- <LIKE> t = stringLitteral()
- [ <ESCAPE> u = stringLitteral() ]
- {
- left = ComparisonExpression.createLike(left, t, u);
- }
- |
- LOOKAHEAD(2)
- {
- u=null;
- }
- <NOT> <LIKE> t = stringLitteral() [ <ESCAPE> u = stringLitteral() ]
- {
- left = ComparisonExpression.createNotLike(left, t, u);
- }
- |
- <BETWEEN> low = addExpression() <AND> high = addExpression()
- {
- left = ComparisonExpression.createBetween(left, low, high);
- }
- |
- LOOKAHEAD(2)
- <NOT> <BETWEEN> low = addExpression() <AND> high = addExpression()
- {
- left = ComparisonExpression.createNotBetween(left, low, high);
- }
- |
- <IN>
- "("
- t = stringLitteral()
- {
- list = new ArrayList();
- list.add( t );
- }
- (
- ","
- t = stringLitteral()
- {
- list.add( t );
- }
-
- )*
- ")"
- {
- left = ComparisonExpression.createInFilter(left, list);
- }
- |
- LOOKAHEAD(2)
- <NOT> <IN>
- "("
- t = stringLitteral()
- {
- list = new ArrayList();
- list.add( t );
- }
- (
- ","
- t = stringLitteral()
- {
- list.add( t );
- }
-
- )*
- ")"
- {
- left = ComparisonExpression.createNotInFilter(left, list);
- }
-
- )*
- )
- {
- return left;
- }
-}
-
-Expression addExpression() :
-{
- Expression left;
- Expression right;
-}
-{
- left = multExpr()
- (
- LOOKAHEAD( ("+"|"-") multExpr())
- (
- "+" right = multExpr()
- {
- left = ArithmeticExpression.createPlus(left, right);
- }
- |
- "-" right = multExpr()
- {
- left = ArithmeticExpression.createMinus(left, right);
- }
- )
-
- )*
- {
- return left;
- }
-}
-
-Expression multExpr() :
-{
- Expression left;
- Expression right;
-}
-{
- left = unaryExpr()
- (
- "*" right = unaryExpr()
- {
- left = ArithmeticExpression.createMultiply(left, right);
- }
- |
- "/" right = unaryExpr()
- {
- left = ArithmeticExpression.createDivide(left, right);
- }
- |
- "%" right = unaryExpr()
- {
- left = ArithmeticExpression.createMod(left, right);
- }
-
- )*
- {
- return left;
- }
-}
-
-
-Expression unaryExpr() :
-{
- String s=null;
- Expression left=null;
-}
-{
- (
- LOOKAHEAD( "+" unaryExpr() )
- "+" left=unaryExpr()
- |
- "-" left=unaryExpr()
- {
- left = UnaryExpression.createNegate(left);
- }
- |
- <NOT> left=unaryExpr()
- {
- left = UnaryExpression.createNOT( asBooleanExpression(left) );
- }
- |
- left = primaryExpr()
- )
- {
- return left;
- }
-
-}
-
-Expression primaryExpr() :
-{
- Expression left=null;
-}
-{
- (
- left = literal()
- |
- left = variable()
- |
- "(" left = orExpression() ")"
- )
- {
- return left;
- }
-}
-
-
-
-ConstantExpression literal() :
-{
- Token t;
- String s;
- ConstantExpression left=null;
-}
-{
- (
- (
- s = stringLitteral()
- {
- left = new ConstantExpression(s);
- }
- )
- |
- (
- t = <DECIMAL_LITERAL>
- {
- left = ConstantExpression.createFromDecimal(t.image);
- }
- )
- |
- (
- t = <HEX_LITERAL>
- {
- left = ConstantExpression.createFromHex(t.image);
- }
- )
- |
- (
- t = <OCTAL_LITERAL>
- {
- left = ConstantExpression.createFromOctal(t.image);
- }
- )
- |
- (
- t = <FLOATING_POINT_LITERAL>
- {
- left = ConstantExpression.createFloat(t.image);
- }
- )
- |
- (
- <TRUE>
- {
- left = ConstantExpression.TRUE;
- }
- )
- |
- (
- <FALSE>
- {
- left = ConstantExpression.FALSE;
- }
- )
- |
- (
- <NULL>
- {
- left = ConstantExpression.NULL;
- }
- )
- )
- {
- return left;
- }
-}
-
-String stringLitteral() :
-{
- Token t;
- StringBuffer rc = new StringBuffer();
- boolean first=true;
-}
-{
- t = <STRING_LITERAL>
- {
- // Decode the sting value.
- String image = t.image;
- for( int i=1; i < image.length()-1; i++ ) {
- char c = image.charAt(i);
- if( c == '\'' )
- i++;
- rc.append(c);
- }
- return rc.toString();
- }
-}
-
-PropertyExpression variable() :
-{
- Token t;
- StringBuffer rc = new StringBuffer();
- PropertyExpression left=null;
-}
-{
- (
- t = <ID>
- {
- left = new PropertyExpression(t.image);
- }
- |
- t = <QUOTED_ID>
- {
- // Decode the sting value.
- String image = t.image;
- for( int i=1; i < image.length()-1; i++ ) {
- char c = image.charAt(i);
- if( c == '"' )
- i++;
- rc.append(c);
- }
- return new PropertyExpression(rc.toString());
- }
-
- )
- {
- return left;
- }
-}
diff --git a/java/client/src/main/java/client.bnd b/java/client/src/main/java/client.bnd deleted file mode 100755 index d2bc4f8d50..0000000000 --- a/java/client/src/main/java/client.bnd +++ /dev/null @@ -1,26 +0,0 @@ -# -# 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. -# - -ver: 0.11.0 - -Bundle-SymbolicName: qpid-client -Bundle-Version: ${ver} -Export-Package: *;version=${ver} -Bundle-RequiredExecutionEnvironment: J2SE-1.5 - diff --git a/java/client/src/main/java/client.log4j b/java/client/src/main/java/client.log4j deleted file mode 100644 index 19cc946118..0000000000 --- a/java/client/src/main/java/client.log4j +++ /dev/null @@ -1,33 +0,0 @@ -#
-# 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.
-#
-log4j.rootLogger=${root.logging.level}
-
-
-#log4j.logger.org.apache.qpid=${amqj.logging.level}, console
-#log4j.additivity.org.apache.qpid=false
-
-log4j.logger.org.apache.qpid=ERROR, console
-log4j.additivity.org.apache.qpid=false
-
-#log4j.logger.org.apache.qpid.client.message.AbstractBytesTypedMessage=DEBUG, console
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Threshold=all
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
diff --git a/java/client/src/main/java/org/apache/mina/transport/socket/nio/ExistingSocketConnector.java b/java/client/src/main/java/org/apache/mina/transport/socket/nio/ExistingSocketConnector.java deleted file mode 100644 index 98716c0c3c..0000000000 --- a/java/client/src/main/java/org/apache/mina/transport/socket/nio/ExistingSocketConnector.java +++ /dev/null @@ -1,478 +0,0 @@ -/* - * 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.mina.transport.socket.nio; - -import edu.emory.mathcs.backport.java.util.concurrent.Executor; -import org.apache.mina.common.ConnectFuture; -import org.apache.mina.common.ExceptionMonitor; -import org.apache.mina.common.IoConnector; -import org.apache.mina.common.IoConnectorConfig; -import org.apache.mina.common.IoHandler; -import org.apache.mina.common.IoServiceConfig; -import org.apache.mina.common.support.BaseIoConnector; -import org.apache.mina.common.support.DefaultConnectFuture; -import org.apache.mina.util.NamePreservingRunnable; -import org.apache.mina.util.NewThreadExecutor; -import org.apache.mina.util.Queue; - -import java.io.IOException; -import java.net.ConnectException; -import java.net.Socket; -import java.net.SocketAddress; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; -import java.util.Iterator; -import java.util.Set; - -/** - * {@link IoConnector} for socket transport (TCP/IP). - * - * @author The Apache Directory Project (mina-dev@directory.apache.org) - * @version $Rev: 627427 $, $Date: 2008-02-13 14:39:10 +0000 (Wed, 13 Feb 2008) $ - */ -public class ExistingSocketConnector extends BaseIoConnector -{ - /** @noinspection StaticNonFinalField */ - private static volatile int nextId = 0; - - private final Object lock = new Object(); - private final int id = nextId++; - private final String threadName = "SocketConnector-" + id; - private SocketConnectorConfig defaultConfig = new SocketConnectorConfig(); - private final Queue connectQueue = new Queue(); - private final SocketIoProcessor[] ioProcessors; - private final int processorCount; - private final Executor executor; - - /** @noinspection FieldAccessedSynchronizedAndUnsynchronized */ - private Selector selector; - private Worker worker; - private int processorDistributor = 0; - private int workerTimeout = 60; // 1 min. - private Socket _openSocket = null; - - /** Create a connector with a single processing thread using a NewThreadExecutor */ - public ExistingSocketConnector() - { - this(1, new NewThreadExecutor()); - } - - /** - * Create a connector with the desired number of processing threads - * - * @param processorCount Number of processing threads - * @param executor Executor to use for launching threads - */ - public ExistingSocketConnector(int processorCount, Executor executor) - { - if (processorCount < 1) - { - throw new IllegalArgumentException("Must have at least one processor"); - } - - this.executor = executor; - this.processorCount = processorCount; - ioProcessors = new SocketIoProcessor[processorCount]; - - for (int i = 0; i < processorCount; i++) - { - ioProcessors[i] = new SocketIoProcessor("SocketConnectorIoProcessor-" + id + "." + i, executor); - } - } - - /** - * How many seconds to keep the connection thread alive between connection requests - * - * @return Number of seconds to keep connection thread alive - */ - public int getWorkerTimeout() - { - return workerTimeout; - } - - /** - * Set how many seconds the connection worker thread should remain alive once idle before terminating itself. - * - * @param workerTimeout Number of seconds to keep thread alive. Must be >=0 - */ - public void setWorkerTimeout(int workerTimeout) - { - if (workerTimeout < 0) - { - throw new IllegalArgumentException("Must be >= 0"); - } - this.workerTimeout = workerTimeout; - } - - public ConnectFuture connect(SocketAddress address, IoHandler handler, IoServiceConfig config) - { - return connect(address, null, handler, config); - } - - public ConnectFuture connect(SocketAddress address, SocketAddress localAddress, - IoHandler handler, IoServiceConfig config) - { - /** Changes here from the Mina OpenSocketConnector. - * Ignoreing all address as they are not needed */ - - if (handler == null) - { - throw new NullPointerException("handler"); - } - - - if (config == null) - { - config = getDefaultConfig(); - } - - if (_openSocket == null) - { - throw new IllegalArgumentException("Specifed Socket not active"); - } - - boolean success = false; - - try - { - DefaultConnectFuture future = new DefaultConnectFuture(); - newSession(_openSocket, handler, config, future); - success = true; - return future; - } - catch (IOException e) - { - return DefaultConnectFuture.newFailedFuture(e); - } - finally - { - if (!success && _openSocket != null) - { - try - { - _openSocket.close(); - } - catch (IOException e) - { - ExceptionMonitor.getInstance().exceptionCaught(e); - } - } - } - } - - public IoServiceConfig getDefaultConfig() - { - return defaultConfig; - } - - /** - * Sets the config this connector will use by default. - * - * @param defaultConfig the default config. - * - * @throws NullPointerException if the specified value is <code>null</code>. - */ - public void setDefaultConfig(SocketConnectorConfig defaultConfig) - { - if (defaultConfig == null) - { - throw new NullPointerException("defaultConfig"); - } - this.defaultConfig = defaultConfig; - } - - private synchronized void startupWorker() throws IOException - { - if (worker == null) - { - selector = Selector.open(); - worker = new Worker(); - executor.execute(new NamePreservingRunnable(worker)); - } - } - - private void registerNew() - { - if (connectQueue.isEmpty()) - { - return; - } - - for (; ;) - { - ConnectionRequest req; - synchronized (connectQueue) - { - req = (ConnectionRequest) connectQueue.pop(); - } - - if (req == null) - { - break; - } - - SocketChannel ch = req.channel; - try - { - ch.register(selector, SelectionKey.OP_CONNECT, req); - } - catch (IOException e) - { - req.setException(e); - } - } - } - - private void processSessions(Set keys) - { - Iterator it = keys.iterator(); - - while (it.hasNext()) - { - SelectionKey key = (SelectionKey) it.next(); - - if (!key.isConnectable()) - { - continue; - } - - SocketChannel ch = (SocketChannel) key.channel(); - ConnectionRequest entry = (ConnectionRequest) key.attachment(); - - boolean success = false; - try - { - ch.finishConnect(); - newSession(ch, entry.handler, entry.config, entry); - success = true; - } - catch (Throwable e) - { - entry.setException(e); - } - finally - { - key.cancel(); - if (!success) - { - try - { - ch.close(); - } - catch (IOException e) - { - ExceptionMonitor.getInstance().exceptionCaught(e); - } - } - } - } - - keys.clear(); - } - - private void processTimedOutSessions(Set keys) - { - long currentTime = System.currentTimeMillis(); - Iterator it = keys.iterator(); - - while (it.hasNext()) - { - SelectionKey key = (SelectionKey) it.next(); - - if (!key.isValid()) - { - continue; - } - - ConnectionRequest entry = (ConnectionRequest) key.attachment(); - - if (currentTime >= entry.deadline) - { - entry.setException(new ConnectException()); - try - { - key.channel().close(); - } - catch (IOException e) - { - ExceptionMonitor.getInstance().exceptionCaught(e); - } - finally - { - key.cancel(); - } - } - } - } - - private void newSession(Socket socket, IoHandler handler, IoServiceConfig config, ConnectFuture connectFuture) - throws IOException - { - SocketSessionImpl session = new SocketSessionImpl(this, - nextProcessor(), - getListeners(), - config, - socket.getChannel(), - handler, - socket.getRemoteSocketAddress()); - - newSession(session, config, connectFuture); - } - - private void newSession(SocketChannel ch, IoHandler handler, IoServiceConfig config, ConnectFuture connectFuture) - throws IOException - - { - SocketSessionImpl session = new SocketSessionImpl(this, - nextProcessor(), - getListeners(), - config, - ch, - handler, - ch.socket().getRemoteSocketAddress()); - - newSession(session, config, connectFuture); - } - - private void newSession(SocketSessionImpl session, IoServiceConfig config, ConnectFuture connectFuture) - throws IOException - { - try - { - getFilterChainBuilder().buildFilterChain(session.getFilterChain()); - config.getFilterChainBuilder().buildFilterChain(session.getFilterChain()); - config.getThreadModel().buildFilterChain(session.getFilterChain()); - } - catch (Throwable e) - { - throw (IOException) new IOException("Failed to create a session.").initCause(e); - } - session.getIoProcessor().addNew(session); - connectFuture.setSession(session); - } - - private SocketIoProcessor nextProcessor() - { - return ioProcessors[processorDistributor++ % processorCount]; - } - - public void setOpenSocket(Socket openSocket) - { - _openSocket = openSocket; - } - - private class Worker implements Runnable - { - private long lastActive = System.currentTimeMillis(); - - public void run() - { - Thread.currentThread().setName(ExistingSocketConnector.this.threadName); - - for (; ;) - { - try - { - int nKeys = selector.select(1000); - - registerNew(); - - if (nKeys > 0) - { - processSessions(selector.selectedKeys()); - } - - processTimedOutSessions(selector.keys()); - - if (selector.keys().isEmpty()) - { - if (System.currentTimeMillis() - lastActive > workerTimeout * 1000L) - { - synchronized (lock) - { - if (selector.keys().isEmpty() && - connectQueue.isEmpty()) - { - worker = null; - try - { - selector.close(); - } - catch (IOException e) - { - ExceptionMonitor.getInstance().exceptionCaught(e); - } - finally - { - selector = null; - } - break; - } - } - } - } - else - { - lastActive = System.currentTimeMillis(); - } - } - catch (IOException e) - { - ExceptionMonitor.getInstance().exceptionCaught(e); - - try - { - Thread.sleep(1000); - } - catch (InterruptedException e1) - { - ExceptionMonitor.getInstance().exceptionCaught(e1); - } - } - } - } - } - - private class ConnectionRequest extends DefaultConnectFuture - { - private final SocketChannel channel; - private final long deadline; - private final IoHandler handler; - private final IoServiceConfig config; - - private ConnectionRequest(SocketChannel channel, IoHandler handler, IoServiceConfig config) - { - this.channel = channel; - long timeout; - if (config instanceof IoConnectorConfig) - { - timeout = ((IoConnectorConfig) config).getConnectTimeoutMillis(); - } - else - { - timeout = ((IoConnectorConfig) getDefaultConfig()).getConnectTimeoutMillis(); - } - this.deadline = System.currentTimeMillis() + timeout; - this.handler = handler; - this.config = config; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQAnyDestination.java b/java/client/src/main/java/org/apache/qpid/client/AMQAnyDestination.java deleted file mode 100644 index 999b22299c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQAnyDestination.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.URISyntaxException; - -import javax.jms.JMSException; -import javax.jms.Queue; -import javax.jms.Topic; - -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.messaging.Address; -import org.apache.qpid.url.BindingURL; - -/** - * In order to support JMS 1.0 the Qpid implementation maps the - * direct exchange to JMS Queue and topic exchange to JMS Topic. - * - * The JMS 1.1 spec provides a javax.Destination as an abstraction - * to represent any type of destination. - * The abstract class AMQDestination has most of the functionality - * to support any destination defined in AMQP 0-10 spec. - */ -public class AMQAnyDestination extends AMQDestination implements Queue, Topic -{ - public AMQAnyDestination(BindingURL binding) - { - super(binding); - } - - public AMQAnyDestination(String str) throws URISyntaxException - { - super(str); - } - - public AMQAnyDestination(Address addr) throws Exception - { - super(addr); - } - - public AMQAnyDestination(AMQShortString exchangeName,AMQShortString exchangeClass, - AMQShortString routingKey,boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, - boolean isDurable, AMQShortString[] bindingKeys) - { - super(exchangeName, exchangeClass, routingKey, isExclusive, isAutoDelete, queueName, isDurable, bindingKeys); - } - - @Override - public boolean isNameRequired() - { - return getAMQQueueName() == null; - } - - public String getTopicName() throws JMSException - { - if (getRoutingKey() != null) - { - return getRoutingKey().asString(); - } - else if (getSubject() != null) - { - return getSubject(); - } - else - { - return null; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQAuthenticationException.java b/java/client/src/main/java/org/apache/qpid/client/AMQAuthenticationException.java deleted file mode 100644 index 6bae0166d1..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQAuthenticationException.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQAuthenticationException represents all failures to authenticate access to a broker. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent failure to authenticate the client. - * </table> - * - * @todo Will this alwyas have the same status code, NOT_ALLOWED 530? Might set this up to always use that code. - */ -public class AMQAuthenticationException extends AMQException -{ - public AMQAuthenticationException(AMQConstant error, String msg, Throwable cause) - { - super(error, msg, cause); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java b/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java deleted file mode 100644 index b31dd2bc91..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java +++ /dev/null @@ -1,414 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.url.URLHelper; -import org.apache.qpid.url.URLSyntaxException; - -public class AMQBrokerDetails implements BrokerDetails -{ - private String _host; - private int _port; - private String _transport; - - private Map<String, String> _options = new HashMap<String, String>(); - - private SSLConfiguration _sslConfiguration; - - public AMQBrokerDetails(){} - - public AMQBrokerDetails(String url) throws URLSyntaxException - { - - // URL should be of format tcp://host:port?option='value',option='value' - try - { - URI connection = new URI(url); - - String transport = connection.getScheme(); - - // Handles some defaults to minimise changes to existing broker URLS e.g. localhost - if (transport != null) - { - //todo this list of valid transports should be enumerated somewhere - if ((!(transport.equalsIgnoreCase(BrokerDetails.VM) || - transport.equalsIgnoreCase(BrokerDetails.TCP) || - transport.equalsIgnoreCase(BrokerDetails.SOCKET)))) - { - if (transport.equalsIgnoreCase("localhost")) - { - connection = new URI(DEFAULT_TRANSPORT + "://" + url); - transport = connection.getScheme(); - } - else - { - if (url.charAt(transport.length()) == ':' && url.charAt(transport.length() + 1) != '/') - { - //Then most likely we have a host:port value - connection = new URI(DEFAULT_TRANSPORT + "://" + url); - transport = connection.getScheme(); - } - else - { - throw URLHelper.parseError(0, transport.length(), "Unknown transport", url); - } - } - } - else if (url.indexOf("//") == -1) - { - throw new URLSyntaxException(url, "Missing '//' after the transport In broker URL",transport.length()+1,1); - } - } - else - { - //Default the transport - connection = new URI(DEFAULT_TRANSPORT + "://" + url); - transport = connection.getScheme(); - } - - if (transport == null) - { - throw URLHelper.parseError(-1, "Unknown transport in broker URL:'" - + url + "' Format: " + URL_FORMAT_EXAMPLE, ""); - } - - setTransport(transport); - - String host = connection.getHost(); - - // Fix for Java 1.5 - if (host == null) - { - host = ""; - - String auth = connection.getAuthority(); - if (auth != null) - { - // contains both host & port myhost:5672 - if (auth.contains(":")) - { - host = auth.substring(0,auth.indexOf(":")); - } - else - { - host = auth; - } - } - - } - - setHost(host); - - int port = connection.getPort(); - - if (port == -1) - { - // Fix for when there is port data but it is not automatically parseable by getPort(). - String auth = connection.getAuthority(); - - if (auth != null && auth.contains(":")) - { - int start = auth.indexOf(":") + 1; - int end = start; - boolean looking = true; - boolean found = false; - // Throw an URL exception if the port number is not specified - if (start == auth.length()) - { - throw URLHelper.parseError(connection.toString().indexOf(auth) + end - 1, - connection.toString().indexOf(auth) + end, "Port number must be specified", - connection.toString()); - } - //Walk the authority looking for a port value. - while (looking) - { - try - { - end++; - Integer.parseInt(auth.substring(start, end)); - - if (end >= auth.length()) - { - looking = false; - found = true; - } - } - catch (NumberFormatException nfe) - { - looking = false; - } - - } - if (found) - { - setPort(Integer.parseInt(auth.substring(start, end))); - } - else - { - throw URLHelper.parseError(connection.toString().indexOf(connection.getAuthority()) + end - 1, - "Illegal character in port number", connection.toString()); - } - - } - else - { - setPort(DEFAULT_PORT); - } - } - else - { - if (!_transport.equalsIgnoreCase(SOCKET)) - { - setPort(port); - } - } - - String queryString = connection.getQuery(); - - URLHelper.parseOptions(_options, queryString); - - //Fragment is #string (not used) - } - catch (URISyntaxException uris) - { - if (uris instanceof URLSyntaxException) - { - throw(URLSyntaxException) uris; - } - - throw URLHelper.parseError(uris.getIndex(), uris.getReason(), uris.getInput()); - } - } - - public AMQBrokerDetails(String host, int port, SSLConfiguration sslConfiguration) - { - _host = host; - _port = port; - _sslConfiguration = sslConfiguration; - } - - public String getHost() - { - return _host; - } - - public void setHost(String _host) - { - this._host = _host; - } - - public int getPort() - { - return _port; - } - - public void setPort(int _port) - { - this._port = _port; - } - - public String getTransport() - { - return _transport; - } - - public void setTransport(String _transport) - { - this._transport = _transport; - } - - - public String getProperty(String key) - { - return _options.get(key); - } - - public void setProperty(String key, String value) - { - _options.put(key, value); - } - - public long getTimeout() - { - if (_options.containsKey(OPTIONS_CONNECT_TIMEOUT)) - { - try - { - return Long.parseLong(_options.get(OPTIONS_CONNECT_TIMEOUT)); - } - catch (NumberFormatException nfe) - { - //Do nothing as we will use the default below. - } - } - - return BrokerDetails.DEFAULT_CONNECT_TIMEOUT; - } - - public boolean getBooleanProperty(String propName) - { - if (_options.containsKey(propName)) - { - return Boolean.parseBoolean(_options.get(propName)); - } - - return false; - } - - public void setTimeout(long timeout) - { - setProperty(OPTIONS_CONNECT_TIMEOUT, Long.toString(timeout)); - } - - public SSLConfiguration getSSLConfiguration() - { - return _sslConfiguration; - } - - public void setSSLConfiguration(SSLConfiguration sslConfig) - { - _sslConfiguration = sslConfig; - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - - sb.append(_transport); - sb.append("://"); - - if (!(_transport.equalsIgnoreCase(VM))) - { - sb.append(_host); - } - - if (!(_transport.equalsIgnoreCase(SOCKET))) - { - sb.append(':'); - sb.append(_port); - } - - sb.append(printOptionsURL()); - - return sb.toString(); - } - - public boolean equals(Object o) - { - if (!(o instanceof BrokerDetails)) - { - return false; - } - - BrokerDetails bd = (BrokerDetails) o; - - return _host.equalsIgnoreCase(bd.getHost()) && - (_port == bd.getPort()) && - _transport.equalsIgnoreCase(bd.getTransport()) && - compareSSLConfigurations(bd.getSSLConfiguration()); - //todo do we need to compare all the options as well? - } - - @Override - public int hashCode() - { - int result = _host != null ? _host.hashCode() : 0; - result = 31 * result + _port; - result = 31 * result + (_transport != null ? _transport.hashCode() : 0); - return result; - } - - private String printOptionsURL() - { - StringBuffer optionsURL = new StringBuffer(); - - optionsURL.append('?'); - - if (!(_options.isEmpty())) - { - - for (String key : _options.keySet()) - { - optionsURL.append(key); - - optionsURL.append("='"); - - optionsURL.append(_options.get(key)); - - optionsURL.append("'"); - - optionsURL.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - } - - //removeKey the extra DEFAULT_OPTION_SEPERATOR or the '?' if there are no options - optionsURL.deleteCharAt(optionsURL.length() - 1); - - return optionsURL.toString(); - } - - // Do we need to do a more in-depth comparison? - private boolean compareSSLConfigurations(SSLConfiguration other) - { - boolean retval = false; - if (_sslConfiguration == null && - other == null) - { - retval = true; - } - else if (_sslConfiguration != null && - other != null) - { - retval = true; - } - - return retval; - } - - public static String checkTransport(String broker) - { - if ((!broker.contains("://"))) - { - return "tcp://" + broker; - } - else - { - return broker; - } - } - - public Map<String, String> getProperties() - { - return _options; - } - - public void setProperties(Map<String, String> props) - { - _options = props; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java deleted file mode 100644 index ab59fee020..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ /dev/null @@ -1,1493 +0,0 @@ -/* -* - * 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.qpid.client; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.net.ConnectException; -import java.net.UnknownHostException; -import java.nio.channels.UnresolvedAddressException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import javax.jms.ConnectionConsumer; -import javax.jms.ConnectionMetaData; -import javax.jms.Destination; -import javax.jms.ExceptionListener; -import javax.jms.IllegalStateException; -import javax.jms.JMSException; -import javax.jms.Queue; -import javax.jms.QueueConnection; -import javax.jms.QueueSession; -import javax.jms.ServerSessionPool; -import javax.jms.Topic; -import javax.jms.TopicConnection; -import javax.jms.TopicSession; -import javax.naming.NamingException; -import javax.naming.Reference; -import javax.naming.Referenceable; -import javax.naming.StringRefAddr; - -import org.apache.qpid.AMQConnectionFailureException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQProtocolException; -import org.apache.qpid.AMQUnresolvedAddressException; -import org.apache.qpid.AMQDisconnectedException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.configuration.ClientProperties; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicQosBody; -import org.apache.qpid.framing.BasicQosOkBody; -import org.apache.qpid.framing.ChannelOpenBody; -import org.apache.qpid.framing.ChannelOpenOkBody; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.framing.TxSelectBody; -import org.apache.qpid.framing.TxSelectOkBody; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.Connection; -import org.apache.qpid.jms.ConnectionListener; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.jms.FailoverPolicy; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.url.URLSyntaxException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AMQConnection extends Closeable implements Connection, QueueConnection, TopicConnection, Referenceable -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQConnection.class); - - - /** - * This is the "root" mutex that must be held when doing anything that could be impacted by failover. This must be - * held by any child objects of this connection such as the session, producers and consumers. - */ - private final Object _failoverMutex = new Object(); - - private final Object _sessionCreationLock = new Object(); - - /** - * A channel is roughly analogous to a session. The server can negotiate the maximum number of channels per session - * and we must prevent the client from opening too many. - */ - private long _maximumChannelCount; - - /** The maximum size of frame supported by the server */ - private long _maximumFrameSize; - - /** - * The protocol handler dispatches protocol events for this connection. For example, when the connection is dropped - * the handler deals with this. It also deals with the initial dispatch of any protocol frames to their appropriate - * handler. - */ - protected AMQProtocolHandler _protocolHandler; - - /** Maps from session id (Integer) to AMQSession instance */ - private final ChannelToSessionMap _sessions = new ChannelToSessionMap(); - - private String _clientName; - - /** The user name to use for authentication */ - private String _username; - - /** The password to use for authentication */ - private String _password; - - /** The virtual path to connect to on the AMQ server */ - private String _virtualHost; - - protected ExceptionListener _exceptionListener; - - private ConnectionListener _connectionListener; - - private ConnectionURL _connectionURL; - - /** - * Whether this connection is started, i.e. whether messages are flowing to consumers. It has no meaning for message - * publication. - */ - protected volatile boolean _started; - - /** Policy dictating how to failover */ - protected FailoverPolicy _failoverPolicy; - - /* - * _Connected should be refactored with a suitable wait object. - */ - protected boolean _connected; - - /* - * The connection meta data - */ - private QpidConnectionMetaData _connectionMetaData; - - /** Configuration info for SSL */ - private SSLConfiguration _sslConfiguration; - - private AMQShortString _defaultTopicExchangeName = ExchangeDefaults.TOPIC_EXCHANGE_NAME; - private AMQShortString _defaultQueueExchangeName = ExchangeDefaults.DIRECT_EXCHANGE_NAME; - private AMQShortString _temporaryTopicExchangeName = ExchangeDefaults.TOPIC_EXCHANGE_NAME; - private AMQShortString _temporaryQueueExchangeName = ExchangeDefaults.DIRECT_EXCHANGE_NAME; - - /** Thread Pool for executing connection level processes. Such as returning bounced messages. */ - private final ExecutorService _taskPool = Executors.newCachedThreadPool(); - private static final long DEFAULT_TIMEOUT = 1000 * 30; - - protected AMQConnectionDelegate _delegate; - - // this connection maximum number of prefetched messages - private int _maxPrefetch; - - //Indicates whether persistent messages are synchronized - private boolean _syncPersistence; - - //Indicates whether we need to sync on every message ack - private boolean _syncAck; - - //Indicates the sync publish options (persistent|all) - //By default it's async publish - private String _syncPublish = ""; - - // Indicates whether to use the old map message format or the - // new amqp-0-10 encoded format. - private boolean _useLegacyMapMessageFormat; - - /** - * @param broker brokerdetails - * @param username username - * @param password password - * @param clientName clientid - * @param virtualHost virtualhost - * - * @throws AMQException - * @throws URLSyntaxException - */ - public AMQConnection(String broker, String username, String password, String clientName, String virtualHost) - throws AMQException, URLSyntaxException - { - this(new AMQConnectionURL( - ConnectionURL.AMQ_PROTOCOL + "://" + username + ":" + password + "@" - + ((clientName == null) ? "" : clientName) + "/" + virtualHost + "?brokerlist='" - + AMQBrokerDetails.checkTransport(broker) + "'"), null); - } - - /** - * @param broker brokerdetails - * @param username username - * @param password password - * @param clientName clientid - * @param virtualHost virtualhost - * - * @throws AMQException - * @throws URLSyntaxException - */ - public AMQConnection(String broker, String username, String password, String clientName, String virtualHost, - SSLConfiguration sslConfig) throws AMQException, URLSyntaxException - { - this(new AMQConnectionURL( - ConnectionURL.AMQ_PROTOCOL + "://" + username + ":" + password + "@" - + ((clientName == null) ? "" : clientName) + "/" + virtualHost + "?brokerlist='" - + AMQBrokerDetails.checkTransport(broker) + "'"), sslConfig); - } - - public AMQConnection(String host, int port, String username, String password, String clientName, String virtualHost) - throws AMQException, URLSyntaxException - { - this(host, port, false, username, password, clientName, virtualHost, null); - } - - public AMQConnection(String host, int port, String username, String password, String clientName, String virtualHost, - SSLConfiguration sslConfig) throws AMQException, URLSyntaxException - { - this(host, port, false, username, password, clientName, virtualHost, sslConfig); - } - - public AMQConnection(String host, int port, boolean useSSL, String username, String password, String clientName, - String virtualHost, SSLConfiguration sslConfig) throws AMQException, URLSyntaxException - { - this(new AMQConnectionURL( - useSSL - ? (ConnectionURL.AMQ_PROTOCOL + "://" + username + ":" + password + "@" - + ((clientName == null) ? "" : clientName) + virtualHost + "?brokerlist='tcp://" + host + ":" + port - + "'" + "," + BrokerDetails.OPTIONS_SSL + "='true'") - : (ConnectionURL.AMQ_PROTOCOL + "://" + username + ":" + password + "@" - + ((clientName == null) ? "" : clientName) + virtualHost + "?brokerlist='tcp://" + host + ":" + port - + "'" + "," + BrokerDetails.OPTIONS_SSL + "='false'")), sslConfig); - } - - public AMQConnection(String connection) throws AMQException, URLSyntaxException - { - this(new AMQConnectionURL(connection), null); - } - - public AMQConnection(String connection, SSLConfiguration sslConfig) throws AMQException, URLSyntaxException - { - this(new AMQConnectionURL(connection), sslConfig); - } - - /** - * @todo Some horrible stuff going on here with setting exceptions to be non-null to detect if an exception - * was thrown during the connection! Intention not clear. Use a flag anyway, not exceptions... Will fix soon. - */ - public AMQConnection(ConnectionURL connectionURL, SSLConfiguration sslConfig) throws AMQException - { - // set this connection maxPrefetch - if (connectionURL.getOption(ConnectionURL.OPTIONS_MAXPREFETCH) != null) - { - _maxPrefetch = Integer.parseInt(connectionURL.getOption(ConnectionURL.OPTIONS_MAXPREFETCH)); - } - else - { - // use the defaul value set for all connections - _maxPrefetch = Integer.parseInt(System.getProperties().getProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, - ClientProperties.MAX_PREFETCH_DEFAULT)); - } - - if (connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_PERSISTENCE) != null) - { - _syncPersistence = - Boolean.parseBoolean(connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_PERSISTENCE)); - _logger.warn("sync_persistence is a deprecated property, " + - "please use sync_publish={persistent|all} instead"); - } - else - { - // use the defaul value set for all connections - _syncPersistence = Boolean.getBoolean(ClientProperties.SYNC_PERSISTENT_PROP_NAME); - if (_syncPersistence) - { - _logger.warn("sync_persistence is a deprecated property, " + - "please use sync_publish={persistent|all} instead"); - } - } - - if (connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_ACK) != null) - { - _syncAck = Boolean.parseBoolean(connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_ACK)); - } - else - { - // use the defaul value set for all connections - _syncAck = Boolean.getBoolean(ClientProperties.SYNC_ACK_PROP_NAME); - } - - if (connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_PUBLISH) != null) - { - _syncPublish = connectionURL.getOption(ConnectionURL.OPTIONS_SYNC_PUBLISH); - } - else - { - // use the default value set for all connections - _syncPublish = System.getProperty((ClientProperties.SYNC_PUBLISH_PROP_NAME),_syncPublish); - } - - if (connectionURL.getOption(ConnectionURL.OPTIONS_USE_LEGACY_MAP_MESSAGE_FORMAT) != null) - { - _useLegacyMapMessageFormat = Boolean.parseBoolean( - connectionURL.getOption(ConnectionURL.OPTIONS_USE_LEGACY_MAP_MESSAGE_FORMAT)); - } - else - { - // use the default value set for all connections - _useLegacyMapMessageFormat = Boolean.getBoolean(ClientProperties.USE_LEGACY_MAP_MESSAGE_FORMAT); - } - - String amqpVersion = System.getProperty((ClientProperties.AMQP_VERSION), "0-10"); - _logger.debug("AMQP version " + amqpVersion); - - _failoverPolicy = new FailoverPolicy(connectionURL, this); - BrokerDetails brokerDetails = _failoverPolicy.getCurrentBrokerDetails(); - if (brokerDetails.getTransport().equals(BrokerDetails.VM) || "0-8".equals(amqpVersion)) - { - _delegate = new AMQConnectionDelegate_8_0(this); - } - else if ("0-9".equals(amqpVersion)) - { - _delegate = new AMQConnectionDelegate_0_9(this); - } - else if ("0-91".equals(amqpVersion) || "0-9-1".equals(amqpVersion)) - { - _delegate = new AMQConnectionDelegate_9_1(this); - } - else - { - _delegate = new AMQConnectionDelegate_0_10(this); - } - - if (_logger.isInfoEnabled()) - { - _logger.info("Connection:" + connectionURL); - } - - _sslConfiguration = sslConfig; - if (connectionURL == null) - { - throw new IllegalArgumentException("Connection must be specified"); - } - - _connectionURL = connectionURL; - - _clientName = connectionURL.getClientName(); - _username = connectionURL.getUsername(); - _password = connectionURL.getPassword(); - - setVirtualHost(connectionURL.getVirtualHost()); - - if (connectionURL.getDefaultQueueExchangeName() != null) - { - _defaultQueueExchangeName = connectionURL.getDefaultQueueExchangeName(); - } - - if (connectionURL.getDefaultTopicExchangeName() != null) - { - _defaultTopicExchangeName = connectionURL.getDefaultTopicExchangeName(); - } - - if (connectionURL.getTemporaryQueueExchangeName() != null) - { - _temporaryQueueExchangeName = connectionURL.getTemporaryQueueExchangeName(); - } - - if (connectionURL.getTemporaryTopicExchangeName() != null) - { - _temporaryTopicExchangeName = connectionURL.getTemporaryTopicExchangeName(); - } - - _protocolHandler = new AMQProtocolHandler(this); - - _logger.info("Connecting with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion()); - - // We are not currently connected - _connected = false; - - boolean retryAllowed = true; - Exception connectionException = null; - while (!_connected && retryAllowed && brokerDetails != null) - { - ProtocolVersion pe = null; - try - { - pe = makeBrokerConnection(brokerDetails); - } - catch (Exception e) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Unable to connect to broker at " + - _failoverPolicy.getCurrentBrokerDetails(), - e); - } - connectionException = e; - } - - if (pe != null) - { - // reset the delegate to the version returned by the - // broker - initDelegate(pe); - } - else if (!_connected) - { - retryAllowed = _failoverPolicy.failoverAllowed(); - brokerDetails = _failoverPolicy.getNextBrokerDetails(); - } - } - - if (_logger.isDebugEnabled()) - { - _logger.debug("Are we connected:" + _connected); - } - - if (!_connected) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Last attempted ProtocolHandler Version:"+_protocolHandler.getProtocolVersion()); - } - - String message = null; - - if (connectionException != null) - { - if (connectionException.getCause() != null) - { - message = connectionException.getCause().getMessage(); - } - else - { - message = connectionException.getMessage(); - } - } - - if ((message == null) || message.equals("")) - { - if (message == null) - { - message = "Unable to Connect"; - } - else // can only be "" if getMessage() returned it therfore lastException != null - { - message = "Unable to Connect:" + connectionException.getClass(); - } - } - - for (Throwable th = connectionException; th != null; th = th.getCause()) - { - if (th instanceof UnresolvedAddressException || - th instanceof UnknownHostException) - { - throw new AMQUnresolvedAddressException - (message, - _failoverPolicy.getCurrentBrokerDetails().toString(), - connectionException); - } - } - - throw new AMQConnectionFailureException(message, connectionException); - } - - _logger.info("Connected with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion()); - - _sessions.setMaxChannelID(_delegate.getMaxChannelID()); - _sessions.setMinChannelID(_delegate.getMinChannelID()); - - _connectionMetaData = new QpidConnectionMetaData(this); - } - - protected boolean checkException(Throwable thrown) - { - Throwable cause = thrown.getCause(); - - if (cause == null) - { - cause = thrown; - } - - return ((cause instanceof ConnectException) || (cause instanceof UnresolvedAddressException)); - } - - private void initDelegate(ProtocolVersion pe) throws AMQProtocolException - { - try - { - String delegateClassName = String.format - ("org.apache.qpid.client.AMQConnectionDelegate_%s_%s", - pe.getMajorVersion(), pe.getMinorVersion()); - _logger.info("Looking up delegate '" + delegateClassName + "' Based on PE:" + pe); - Class c = Class.forName(delegateClassName); - Class partypes[] = new Class[1]; - partypes[0] = AMQConnection.class; - _delegate = (AMQConnectionDelegate) c.getConstructor(partypes).newInstance(this); - //Update our session to use this new protocol version - _protocolHandler.getProtocolSession().setProtocolVersion(_delegate.getProtocolVersion()); - - } - catch (ClassNotFoundException e) - { - throw new AMQProtocolException - (AMQConstant.UNSUPPORTED_CLIENT_PROTOCOL_ERROR, - String.format("Protocol: %s.%s is rquired by the broker but is not " + - "currently supported by this client library implementation", - pe.getMajorVersion(), pe.getMinorVersion()), - e); - } - catch (NoSuchMethodException e) - { - throw new RuntimeException("unable to locate constructor for delegate", e); - } - catch (InstantiationException e) - { - throw new RuntimeException("error instantiating delegate", e); - } - catch (IllegalAccessException e) - { - throw new RuntimeException("error accessing delegate", e); - } - catch (InvocationTargetException e) - { - throw new RuntimeException("error invoking delegate", e); - } - } - - protected AMQConnection(String username, String password, String clientName, String virtualHost) - { - _clientName = clientName; - _username = username; - _password = password; - setVirtualHost(virtualHost); - } - - private void setVirtualHost(String virtualHost) - { - if (virtualHost != null && virtualHost.startsWith("/")) - { - virtualHost = virtualHost.substring(1); - } - - _virtualHost = virtualHost; - } - - public boolean attemptReconnection(String host, int port) - { - BrokerDetails bd = new AMQBrokerDetails(host, port, _sslConfiguration); - - _failoverPolicy.setBroker(bd); - - try - { - makeBrokerConnection(bd); - - return true; - } - catch (Exception e) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Unable to connect to broker at " + bd); - } - - attemptReconnection(); - } - - return false; - } - - public boolean attemptReconnection() - { - BrokerDetails broker = null; - while (_failoverPolicy.failoverAllowed() && (broker = _failoverPolicy.getNextBrokerDetails()) != null) - { - try - { - makeBrokerConnection(broker); - return true; - } - catch (Exception e) - { - if (!(e instanceof AMQException)) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Unable to connect to broker at " + _failoverPolicy.getCurrentBrokerDetails(), e); - } - } - else - { - if (_logger.isInfoEnabled()) - { - _logger.info(e.getMessage() + ":Unable to connect to broker at " - + _failoverPolicy.getCurrentBrokerDetails()); - } - } - } - } - - // connection unsuccessful - return false; - } - - public ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws IOException, AMQException - { - return _delegate.makeBrokerConnection(brokerDetail); - } - - public <T, E extends Exception> T executeRetrySupport(FailoverProtectedOperation<T,E> operation) throws E - { - return _delegate.executeRetrySupport(operation); - } - - /** - * Get the details of the currently active broker - * - * @return null if no broker is active (i.e. no successful connection has been made, or the BrokerDetail instance - * otherwise - */ - public BrokerDetails getActiveBrokerDetails() - { - return _failoverPolicy.getCurrentBrokerDetails(); - } - - public boolean failoverAllowed() - { - if (!_connected) - { - return false; - } - else - { - return _failoverPolicy.failoverAllowed(); - } - } - - public org.apache.qpid.jms.Session createSession(final boolean transacted, final int acknowledgeMode) throws JMSException - { - return createSession(transacted, acknowledgeMode, _maxPrefetch); - } - - public org.apache.qpid.jms.Session createSession(final boolean transacted, final int acknowledgeMode, final int prefetch) - throws JMSException - { - return createSession(transacted, acknowledgeMode, prefetch, prefetch); - } - - public org.apache.qpid.jms.Session createSession(final boolean transacted, final int acknowledgeMode, - final int prefetchHigh, final int prefetchLow) throws JMSException - { - synchronized (_sessionCreationLock) - { - checkNotClosed(); - return _delegate.createSession(transacted, acknowledgeMode, prefetchHigh, prefetchLow); - } - } - - private void createChannelOverWire(int channelId, int prefetchHigh, int prefetchLow, boolean transacted) - throws AMQException, FailoverException - { - - ChannelOpenBody channelOpenBody = getProtocolHandler().getMethodRegistry().createChannelOpenBody(null); - - // TODO: Be aware of possible changes to parameter order as versions change. - - _protocolHandler.syncWrite(channelOpenBody.generateFrame(channelId), ChannelOpenOkBody.class); - - BasicQosBody basicQosBody = getProtocolHandler().getMethodRegistry().createBasicQosBody(0, prefetchHigh, false); - - // todo send low water mark when protocol allows. - // todo Be aware of possible changes to parameter order as versions change. - _protocolHandler.syncWrite(basicQosBody.generateFrame(channelId), BasicQosOkBody.class); - - if (transacted) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Issuing TxSelect for " + channelId); - } - - TxSelectBody body = getProtocolHandler().getMethodRegistry().createTxSelectBody(); - - // TODO: Be aware of possible changes to parameter order as versions change. - _protocolHandler.syncWrite(body.generateFrame(channelId), TxSelectOkBody.class); - } - } - - private void reopenChannel(int channelId, int prefetchHigh, int prefetchLow, boolean transacted) - throws AMQException, FailoverException - { - try - { - createChannelOverWire(channelId, prefetchHigh, prefetchLow, transacted); - } - catch (AMQException e) - { - deregisterSession(channelId); - throw new AMQException(null, "Error reopening channel " + channelId + " after failover: " + e, e); - } - } - - public void setFailoverPolicy(FailoverPolicy policy) - { - _failoverPolicy = policy; - } - - public FailoverPolicy getFailoverPolicy() - { - return _failoverPolicy; - } - - /** - * Returns an AMQQueueSessionAdaptor which wraps an AMQSession and throws IllegalStateExceptions where specified in - * the JMS spec - * - * @param transacted - * @param acknowledgeMode - * - * @return QueueSession - * - * @throws JMSException - */ - public QueueSession createQueueSession(boolean transacted, int acknowledgeMode) throws JMSException - { - return new AMQQueueSessionAdaptor(createSession(transacted, acknowledgeMode)); - } - - /** - * Returns an AMQTopicSessionAdapter which wraps an AMQSession and throws IllegalStateExceptions where specified in - * the JMS spec - * - * @param transacted - * @param acknowledgeMode - * - * @return TopicSession - * - * @throws JMSException - */ - public TopicSession createTopicSession(boolean transacted, int acknowledgeMode) throws JMSException - { - return new AMQTopicSessionAdaptor(createSession(transacted, acknowledgeMode)); - } - - public boolean channelLimitReached() - { - return _sessions.size() >= _maximumChannelCount; - } - - public String getClientID() throws JMSException - { - checkNotClosed(); - - return _clientName; - } - - public void setClientID(String clientID) throws JMSException - { - checkNotClosed(); - // in AMQP it is not possible to change the client ID. If one is not specified - // upon connection construction, an id is generated automatically. Therefore - // we can always throw an exception. - if (!Boolean.getBoolean(ClientProperties.IGNORE_SET_CLIENTID_PROP_NAME)) - { - throw new IllegalStateException("Client name cannot be changed after being set"); - } - else - { - _logger.info("Operation setClientID is ignored using ID: " + getClientID()); - } - } - - public ConnectionMetaData getMetaData() throws JMSException - { - checkNotClosed(); - - return _connectionMetaData; - - } - - public ExceptionListener getExceptionListener() throws JMSException - { - checkNotClosed(); - - return _exceptionListener; - } - - public void setExceptionListener(ExceptionListener listener) throws JMSException - { - checkNotClosed(); - _exceptionListener = listener; - } - - /** - * Start the connection, i.e. start flowing messages. Note that this method must be called only from a single thread - * and is not thread safe (which is legal according to the JMS specification). - * - * @throws JMSException - */ - public void start() throws JMSException - { - checkNotClosed(); - if (!_started) - { - _started = true; - final Iterator it = _sessions.values().iterator(); - while (it.hasNext()) - { - final AMQSession s = (AMQSession) (it.next()); - try - { - s.start(); - } - catch (AMQException e) - { - throw new JMSAMQException(e); - } - } - - } - } - - public void stop() throws JMSException - { - checkNotClosed(); - if (_started) - { - for (Iterator i = _sessions.values().iterator(); i.hasNext();) - { - try - { - ((AMQSession) i.next()).stop(); - } - catch (AMQException e) - { - throw new JMSAMQException(e); - } - } - - _started = false; - } - } - - public void close() throws JMSException - { - close(DEFAULT_TIMEOUT); - } - - public void close(long timeout) throws JMSException - { - close(new ArrayList<AMQSession>(_sessions.values()), timeout); - } - - public void close(List<AMQSession> sessions, long timeout) throws JMSException - { - if (!_closed.getAndSet(true)) - { - _closing.set(true); - try{ - doClose(sessions, timeout); - }finally{ - _closing.set(false); - } - } - } - - private void doClose(List<AMQSession> sessions, long timeout) throws JMSException - { - synchronized (_sessionCreationLock) - { - if (!sessions.isEmpty()) - { - AMQSession session = sessions.remove(0); - synchronized (session.getMessageDeliveryLock()) - { - doClose(sessions, timeout); - } - } - else - { - synchronized (getFailoverMutex()) - { - try - { - long startCloseTime = System.currentTimeMillis(); - - closeAllSessions(null, timeout, startCloseTime); - - //This MUST occur after we have successfully closed all Channels/Sessions - _taskPool.shutdown(); - - if (!_taskPool.isTerminated()) - { - try - { - // adjust timeout - long taskPoolTimeout = adjustTimeout(timeout, startCloseTime); - - _taskPool.awaitTermination(taskPoolTimeout, TimeUnit.MILLISECONDS); - } - catch (InterruptedException e) - { - _logger.info("Interrupted while shutting down connection thread pool."); - } - } - - // adjust timeout - timeout = adjustTimeout(timeout, startCloseTime); - _delegate.closeConnection(timeout); - - //If the taskpool hasn't shutdown by now then give it shutdownNow. - // This will interupt any running tasks. - if (!_taskPool.isTerminated()) - { - List<Runnable> tasks = _taskPool.shutdownNow(); - for (Runnable r : tasks) - { - _logger.warn("Connection close forced taskpool to prevent execution:" + r); - } - } - } - catch (AMQException e) - { - _logger.error("error:", e); - JMSException jmse = new JMSException("Error closing connection: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - } - } - } - - private long adjustTimeout(long timeout, long startTime) - { - long now = System.currentTimeMillis(); - timeout -= now - startTime; - if (timeout < 0) - { - timeout = 0; - } - - return timeout; - } - - /** - * Marks all sessions and their children as closed without sending any protocol messages. Useful when you need to - * mark objects "visible" in userland as closed after failover or other significant event that impacts the - * connection. <p/> The caller must hold the failover mutex before calling this method. - */ - private void markAllSessionsClosed() - { - final LinkedList sessionCopy = new LinkedList(_sessions.values()); - final Iterator it = sessionCopy.iterator(); - while (it.hasNext()) - { - final AMQSession session = (AMQSession) it.next(); - - session.markClosed(); - } - - _sessions.clear(); - } - - /** - * Close all the sessions, either due to normal connection closure or due to an error occurring. - * - * @param cause if not null, the error that is causing this shutdown <p/> The caller must hold the failover mutex - * before calling this method. - */ - private void closeAllSessions(Throwable cause, long timeout, long starttime) throws JMSException - { - final LinkedList sessionCopy = new LinkedList(_sessions.values()); - final Iterator it = sessionCopy.iterator(); - JMSException sessionException = null; - while (it.hasNext()) - { - final AMQSession session = (AMQSession) it.next(); - if (cause != null) - { - session.closed(cause); - } - else - { - try - { - if (starttime != -1) - { - timeout = adjustTimeout(timeout, starttime); - } - - session.close(timeout); - } - catch (JMSException e) - { - _logger.error("Error closing session: " + e); - sessionException = e; - } - } - } - - _sessions.clear(); - if (sessionException != null) - { - throw sessionException; - } - } - - public ConnectionConsumer createConnectionConsumer(Destination destination, String messageSelector, - ServerSessionPool sessionPool, int maxMessages) throws JMSException - { - checkNotClosed(); - - return null; - } - - public ConnectionConsumer createConnectionConsumer(Queue queue, String messageSelector, ServerSessionPool sessionPool, - int maxMessages) throws JMSException - { - checkNotClosed(); - - return null; - } - - public ConnectionConsumer createConnectionConsumer(Topic topic, String messageSelector, ServerSessionPool sessionPool, - int maxMessages) throws JMSException - { - checkNotClosed(); - - return null; - } - - public ConnectionConsumer createDurableConnectionConsumer(Topic topic, String subscriptionName, String messageSelector, - ServerSessionPool sessionPool, int maxMessages) throws JMSException - { - // TODO Auto-generated method stub - checkNotClosed(); - - return null; - } - - public long getMaximumChannelCount() throws JMSException - { - checkNotClosed(); - - return _maximumChannelCount; - } - - public void setConnectionListener(ConnectionListener listener) - { - _connectionListener = listener; - } - - public ConnectionListener getConnectionListener() - { - return _connectionListener; - } - - public void setMaximumChannelCount(long maximumChannelCount) - { - _maximumChannelCount = maximumChannelCount; - } - - public void setMaximumFrameSize(long frameMax) - { - _maximumFrameSize = frameMax; - } - - public long getMaximumFrameSize() - { - return _maximumFrameSize; - } - - public ChannelToSessionMap getSessions() - { - return _sessions; - } - - public String getUsername() - { - return _username; - } - - public void setUsername(String id) - { - _username = id; - } - - public String getPassword() - { - return _password; - } - - public String getVirtualHost() - { - return _virtualHost; - } - - public AMQProtocolHandler getProtocolHandler() - { - return _protocolHandler; - } - - public boolean started() - { - return _started; - } - - public void bytesSent(long writtenBytes) - { - if (_connectionListener != null) - { - _connectionListener.bytesSent(writtenBytes); - } - } - - public void bytesReceived(long receivedBytes) - { - if (_connectionListener != null) - { - _connectionListener.bytesReceived(receivedBytes); - } - } - - /** - * Fire the preFailover event to the registered connection listener (if any) - * - * @param redirect true if this is the result of a redirect request rather than a connection error - * - * @return true if no listener or listener does not veto change - */ - public boolean firePreFailover(boolean redirect) - { - boolean proceed = true; - if (_connectionListener != null) - { - proceed = _connectionListener.preFailover(redirect); - } - - return proceed; - } - - /** - * Fire the preResubscribe event to the registered connection listener (if any). If the listener vetoes - * resubscription then all the sessions are closed. - * - * @return true if no listener or listener does not veto resubscription. - * - * @throws JMSException - */ - public boolean firePreResubscribe() throws JMSException - { - if (_connectionListener != null) - { - boolean resubscribe = _connectionListener.preResubscribe(); - if (!resubscribe) - { - markAllSessionsClosed(); - } - - return resubscribe; - } - else - { - return true; - } - } - - /** Fires a failover complete event to the registered connection listener (if any). */ - public void fireFailoverComplete() - { - if (_connectionListener != null) - { - _connectionListener.failoverComplete(); - } - } - - /** - * In order to protect the consistency of the connection and its child sessions, consumers and producers, the - * "failover mutex" must be held when doing any operations that could be corrupted during failover. - * - * @return a mutex. Guaranteed never to change for the lifetime of this connection even if failover occurs. - */ - public final Object getFailoverMutex() - { - return _failoverMutex; - } - - public void failoverPrep() - { - _delegate.failoverPrep(); - } - - public void resubscribeSessions() throws JMSException, AMQException, FailoverException - { - _delegate.resubscribeSessions(); - } - - /** - * If failover is taking place this will block until it has completed. If failover is not taking place it will - * return immediately. - * - * @throws InterruptedException - */ - public void blockUntilNotFailingOver() throws InterruptedException - { - _protocolHandler.blockUntilNotFailingOver(); - } - - /** - * Invoked by the AMQProtocolSession when a protocol session exception has occurred. This method sends the exception - * to a JMS exception listener, if configured, and propagates the exception to sessions, which in turn will - * propagate to consumers. This allows synchronous consumers to have exceptions thrown to them. - * - * @param cause the exception - */ - public void exceptionReceived(Throwable cause) - { - - if (_logger.isDebugEnabled()) - { - _logger.debug("exceptionReceived done by:" + Thread.currentThread().getName(), cause); - } - - final JMSException je; - if (cause instanceof JMSException) - { - je = (JMSException) cause; - } - else - { - AMQConstant code = null; - - if (cause instanceof AMQException) - { - code = ((AMQException) cause).getErrorCode(); - } - - if (code != null) - { - je = new JMSException(Integer.toString(code.getCode()), "Exception thrown against " + toString() + ": " + cause); - } - else - { - //Should never get here as all AMQEs are required to have an ErrorCode! - // Other than AMQDisconnectedEx! - - if (cause instanceof AMQDisconnectedException) - { - Exception last = _protocolHandler.getStateManager().getLastException(); - if (last != null) - { - _logger.info("StateManager had an exception for us to use a cause of our Disconnected Exception"); - cause = last; - } - } - je = new JMSException("Exception thrown against " + toString() + ": " + cause); - } - - if (cause instanceof Exception) - { - je.setLinkedException((Exception) cause); - } - - je.initCause(cause); - } - - boolean closer = false; - - // in the case of an IOException, MINA has closed the protocol session so we set _closed to true - // so that any generic client code that tries to close the connection will not mess up this error - // handling sequence - if (cause instanceof IOException || cause instanceof AMQDisconnectedException) - { - // If we have an IOE/AMQDisconnect there is no connection to close on. - _closing.set(false); - closer = !_closed.getAndSet(true); - - _protocolHandler.getProtocolSession().notifyError(je); - } - - // get the failover mutex before trying to close - synchronized (getFailoverMutex()) - { - // decide if we are going to close the session - if (hardError(cause)) - { - closer = (!_closed.getAndSet(true)) || closer; - { - _logger.info("Closing AMQConnection due to :" + cause); - } - } - else - { - _logger.info("Not a hard-error connection not closing: " + cause); - } - - // deliver the exception if there is a listener - if (_exceptionListener != null) - { - _exceptionListener.onException(je); - } - else - { - _logger.error("Throwable Received but no listener set: " + cause); - } - - // if we are closing the connection, close sessions first - if (closer) - { - try - { - closeAllSessions(cause, -1, -1); // FIXME: when doing this end up with RejectedExecutionException from executor. - } - catch (JMSException e) - { - _logger.error("Error closing all sessions: " + e, e); - } - } - } - } - - private boolean hardError(Throwable cause) - { - if (cause instanceof AMQException) - { - return ((AMQException) cause).isHardError(); - } - - return true; - } - - void registerSession(int channelId, AMQSession session) - { - _sessions.put(channelId, session); - } - - public void deregisterSession(int channelId) - { - _sessions.remove(channelId); - } - - public String toString() - { - StringBuffer buf = new StringBuffer("AMQConnection:\n"); - if (_failoverPolicy.getCurrentBrokerDetails() == null) - { - buf.append("No active broker connection"); - } - else - { - BrokerDetails bd = _failoverPolicy.getCurrentBrokerDetails(); - buf.append("Host: ").append(String.valueOf(bd.getHost())); - buf.append("\nPort: ").append(String.valueOf(bd.getPort())); - } - - buf.append("\nVirtual Host: ").append(String.valueOf(_virtualHost)); - buf.append("\nClient ID: ").append(String.valueOf(_clientName)); - buf.append("\nActive session count: ").append((_sessions == null) ? 0 : _sessions.size()); - - return buf.toString(); - } - - public String toURL() - { - return _connectionURL.toString(); - } - - public Reference getReference() throws NamingException - { - return new Reference(AMQConnection.class.getName(), new StringRefAddr(AMQConnection.class.getName(), toURL()), - AMQConnectionFactory.class.getName(), null); // factory location - } - - public SSLConfiguration getSSLConfiguration() - { - return _sslConfiguration; - } - - public AMQShortString getDefaultTopicExchangeName() - { - return _defaultTopicExchangeName; - } - - public void setDefaultTopicExchangeName(AMQShortString defaultTopicExchangeName) - { - _defaultTopicExchangeName = defaultTopicExchangeName; - } - - public AMQShortString getDefaultQueueExchangeName() - { - return _defaultQueueExchangeName; - } - - public void setDefaultQueueExchangeName(AMQShortString defaultQueueExchangeName) - { - _defaultQueueExchangeName = defaultQueueExchangeName; - } - - public AMQShortString getTemporaryTopicExchangeName() - { - return _temporaryTopicExchangeName; - } - - public AMQShortString getTemporaryQueueExchangeName() - { - return _temporaryQueueExchangeName; // To change body of created methods use File | Settings | File Templates. - } - - public void setTemporaryTopicExchangeName(AMQShortString temporaryTopicExchangeName) - { - _temporaryTopicExchangeName = temporaryTopicExchangeName; - } - - public void setTemporaryQueueExchangeName(AMQShortString temporaryQueueExchangeName) - { - _temporaryQueueExchangeName = temporaryQueueExchangeName; - } - - public void performConnectionTask(Runnable task) - { - _taskPool.execute(task); - } - - public AMQSession getSession(int channelId) - { - return _sessions.get(channelId); - } - - public ProtocolVersion getProtocolVersion() - { - return _delegate.getProtocolVersion(); - } - - public boolean isFailingOver() - { - return (_protocolHandler.getFailoverLatch() != null); - } - - /** - * Get the maximum number of messages that this connection can pre-fetch. - * - * @return The maximum number of messages that this connection can pre-fetch. - */ - public long getMaxPrefetch() - { - return _maxPrefetch; - } - - /** - * Indicates whether persistent messages are synchronized - * - * @return true if persistent messages are synchronized false otherwise - */ - public boolean getSyncPersistence() - { - return _syncPersistence; - } - - /** - * Indicates whether we need to sync on every message ack - */ - public boolean getSyncAck() - { - return _syncAck; - } - - public String getSyncPublish() - { - return _syncPublish; - } - - public int getNextChannelID() - { - return _sessions.getNextChannelId(); - } - - public boolean isUseLegacyMapMessageFormat() - { - return _useLegacyMapMessageFormat; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate.java deleted file mode 100644 index 9560bd5c7c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.IOException; - -import javax.jms.JMSException; -import javax.jms.XASession; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.Session; - -public interface AMQConnectionDelegate -{ - ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws IOException, AMQException; - - Session createSession(final boolean transacted, final int acknowledgeMode, - final int prefetchHigh, final int prefetchLow) throws JMSException; - - /** - * Create an XASession with default prefetch values of: - * High = MaxPrefetch - * Low = MaxPrefetch / 2 - * @return XASession - * @throws JMSException thrown if there is a problem creating the session. - */ - XASession createXASession() throws JMSException; - - XASession createXASession(int prefetchHigh, int prefetchLow) throws JMSException; - - void failoverPrep(); - - void resubscribeSessions() throws JMSException, AMQException, FailoverException; - - void closeConnection(long timeout) throws JMSException, AMQException; - - <T, E extends Exception> T executeRetrySupport(FailoverProtectedOperation<T,E> operation) throws E; - - int getMaxChannelID(); - - int getMinChannelID(); - - ProtocolVersion getProtocolVersion(); -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java deleted file mode 100644 index d50c9e16fe..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java +++ /dev/null @@ -1,460 +0,0 @@ -package org.apache.qpid.client; -/* - * - * 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. - * - */ - - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CountDownLatch; - -import javax.jms.ExceptionListener; -import javax.jms.JMSException; -import javax.jms.XASession; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.configuration.ClientProperties; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ChannelLimitReachedException; -import org.apache.qpid.jms.Session; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.transport.Connection; -import org.apache.qpid.transport.ConnectionClose; -import org.apache.qpid.transport.ConnectionException; -import org.apache.qpid.transport.ConnectionListener; -import org.apache.qpid.transport.ConnectionSettings; -import org.apache.qpid.transport.ProtocolVersionException; -import org.apache.qpid.transport.TransportException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AMQConnectionDelegate_0_10 implements AMQConnectionDelegate, ConnectionListener -{ - /** - * This class logger. - */ - private static final Logger _logger = LoggerFactory.getLogger(AMQConnectionDelegate_0_10.class); - - /** - * The AMQ Connection. - */ - private AMQConnection _conn; - - /** - * The QpidConeection instance that is mapped with thie JMS connection. - */ - org.apache.qpid.transport.Connection _qpidConnection; - private ConnectionException exception = null; - - static - { - // Register any configured SASL client factories. - org.apache.qpid.client.security.DynamicSaslRegistrar.registerSaslProviders(); - } - - //--- constructor - public AMQConnectionDelegate_0_10(AMQConnection conn) - { - _conn = conn; - _qpidConnection = new Connection(); - _qpidConnection.addConnectionListener(this); - } - - /** - * create a Session and start it if required. - */ - public Session createSession(boolean transacted, int acknowledgeMode, int prefetchHigh, int prefetchLow) - throws JMSException - { - _conn.checkNotClosed(); - - if (_conn.channelLimitReached()) - { - throw new ChannelLimitReachedException(_conn.getMaximumChannelCount()); - } - - int channelId = _conn.getNextChannelID(); - AMQSession session; - try - { - session = new AMQSession_0_10(_qpidConnection, _conn, channelId, transacted, acknowledgeMode, prefetchHigh, - prefetchLow); - _conn.registerSession(channelId, session); - if (_conn._started) - { - session.start(); - } - } - catch (Exception e) - { - _logger.error("exception creating session:", e); - throw new JMSAMQException("cannot create session", e); - } - return session; - } - - /** - * Create an XASession with default prefetch values of: - * High = MaxPrefetch - * Low = MaxPrefetch / 2 - * @return XASession - * @throws JMSException - */ - public XASession createXASession() throws JMSException - { - return createXASession((int) _conn.getMaxPrefetch(), (int) _conn.getMaxPrefetch() / 2); - } - - /** - * create an XA Session and start it if required. - */ - public XASession createXASession(int prefetchHigh, int prefetchLow) throws JMSException - { - _conn.checkNotClosed(); - - if (_conn.channelLimitReached()) - { - throw new ChannelLimitReachedException(_conn.getMaximumChannelCount()); - } - - int channelId = _conn.getNextChannelID(); - XASessionImpl session; - try - { - session = new XASessionImpl(_qpidConnection, _conn, channelId, prefetchHigh, prefetchLow); - _conn.registerSession(channelId, session); - if (_conn._started) - { - session.start(); - } - } - catch (Exception e) - { - throw new JMSAMQException("cannot create session", e); - } - return session; - } - - - /** - * Make a connection with the broker - * - * @param brokerDetail The detail of the broker to connect to. - * @throws IOException - * @throws AMQException - */ - public ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws IOException, AMQException - { - try - { - if (_logger.isDebugEnabled()) - { - _logger.debug("connecting to host: " + brokerDetail.getHost() - + " port: " + brokerDetail.getPort() + " vhost: " - + _conn.getVirtualHost() + " username: " - + _conn.getUsername() + " password: " - + _conn.getPassword()); - } - - ConnectionSettings conSettings = new ConnectionSettings(); - retriveConnectionSettings(conSettings,brokerDetail); - _qpidConnection.connect(conSettings); - - _conn._connected = true; - _conn.setUsername(_qpidConnection.getUserID()); - _conn.setMaximumChannelCount(_qpidConnection.getChannelMax()); - _conn._failoverPolicy.attainedConnection(); - } - catch (ProtocolVersionException pe) - { - return new ProtocolVersion(pe.getMajor(), pe.getMinor()); - } - catch (ConnectionException ce) - { - AMQConstant code = AMQConstant.REPLY_SUCCESS; - if (ce.getClose() != null && ce.getClose().getReplyCode() != null) - { - code = AMQConstant.getConstant(ce.getClose().getReplyCode().getValue()); - } - String msg = "Cannot connect to broker: " + ce.getMessage(); - throw new AMQException(code, msg, ce); - } - - return null; - } - - public void failoverPrep() - { - List<AMQSession> sessions = new ArrayList<AMQSession>(_conn.getSessions().values()); - for (AMQSession s : sessions) - { - s.failoverPrep(); - } - } - - public void resubscribeSessions() throws JMSException, AMQException, FailoverException - { - _logger.info("Resuming connection"); - getQpidConnection().resume(); - List<AMQSession> sessions = new ArrayList<AMQSession>(_conn.getSessions().values()); - _logger.info(String.format("Resubscribing sessions = %s sessions.size=%d", sessions, sessions.size())); - for (AMQSession s : sessions) - { - s.resubscribe(); - } - } - - public void closeConnection(long timeout) throws JMSException, AMQException - { - try - { - _qpidConnection.close(); - } - catch (TransportException e) - { - throw new AMQException(e.getMessage(), e); - } - } - - public void opened(Connection conn) {} - - public void exception(Connection conn, ConnectionException exc) - { - if (exception != null) - { - _logger.error("previous exception", exception); - } - - exception = exc; - } - - public void closed(Connection conn) - { - ConnectionException exc = exception; - exception = null; - - if (exc == null) - { - return; - } - - ConnectionClose close = exc.getClose(); - if (close == null) - { - _conn.getProtocolHandler().setFailoverLatch(new CountDownLatch(1)); - - try - { - if (_conn.firePreFailover(false) && _conn.attemptReconnection()) - { - _conn.failoverPrep(); - _conn.resubscribeSessions(); - _conn.fireFailoverComplete(); - return; - } - } - catch (Exception e) - { - _logger.error("error during failover", e); - } - finally - { - _conn.getProtocolHandler().getFailoverLatch().countDown(); - _conn.getProtocolHandler().setFailoverLatch(null); - } - } - - ExceptionListener listener = _conn._exceptionListener; - if (listener == null) - { - _logger.error("connection exception: " + conn, exc); - } - else - { - String code = null; - if (close != null) - { - code = close.getReplyCode().toString(); - } - - JMSException ex = new JMSException(exc.getMessage(), code); - ex.setLinkedException(exc); - ex.initCause(exc); - listener.onException(ex); - } - } - - public <T, E extends Exception> T executeRetrySupport(FailoverProtectedOperation<T,E> operation) throws E - { - try - { - return operation.execute(); - } - catch (FailoverException e) - { - throw new RuntimeException(e); - } - } - - public int getMaxChannelID() - { - //For a negotiated channelMax N, there are channels 0 to N-1 available. - return _qpidConnection.getChannelMax() - 1; - } - - public int getMinChannelID() - { - return Connection.MIN_USABLE_CHANNEL_NUM; - } - - public ProtocolVersion getProtocolVersion() - { - return ProtocolVersion.v0_10; - } - - private void retriveConnectionSettings(ConnectionSettings conSettings, BrokerDetails brokerDetail) - { - - conSettings.setHost(brokerDetail.getHost()); - conSettings.setPort(brokerDetail.getPort()); - conSettings.setVhost(_conn.getVirtualHost()); - conSettings.setUsername(_conn.getUsername()); - conSettings.setPassword(_conn.getPassword()); - - // ------------ sasl options --------------- - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_MECHS) != null) - { - conSettings.setSaslMechs( - brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_MECHS)); - } - - // Sun SASL Kerberos client uses the - // protocol + servername as the service key. - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_PROTOCOL_NAME) != null) - { - conSettings.setSaslProtocol( - brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_PROTOCOL_NAME)); - } - - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_SERVER_NAME) != null) - { - conSettings.setSaslServerName( - brokerDetail.getProperty(BrokerDetails.OPTIONS_SASL_SERVER_NAME)); - } - - conSettings.setUseSASLEncryption( - brokerDetail.getBooleanProperty(BrokerDetails.OPTIONS_SASL_ENCRYPTION)); - - // ------------- ssl options --------------------- - conSettings.setUseSSL(brokerDetail.getBooleanProperty(BrokerDetails.OPTIONS_SSL)); - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_TRUST_STORE) != null) - { - conSettings.setTrustStorePath( - brokerDetail.getProperty(BrokerDetails.OPTIONS_TRUST_STORE)); - } - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_TRUST_STORE_PASSWORD) != null) - { - conSettings.setTrustStorePassword( - brokerDetail.getProperty(BrokerDetails.OPTIONS_TRUST_STORE_PASSWORD)); - } - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_KEY_STORE) != null) - { - conSettings.setKeyStorePath( - brokerDetail.getProperty(BrokerDetails.OPTIONS_KEY_STORE)); - } - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_KEY_STORE_PASSWORD) != null) - { - conSettings.setKeyStorePassword( - brokerDetail.getProperty(BrokerDetails.OPTIONS_KEY_STORE_PASSWORD)); - } - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_SSL_CERT_ALIAS) != null) - { - conSettings.setCertAlias( - brokerDetail.getProperty(BrokerDetails.OPTIONS_SSL_CERT_ALIAS)); - } - // ---------------------------- - - conSettings.setVerifyHostname(brokerDetail.getBooleanProperty(BrokerDetails.OPTIONS_SSL_VERIFY_HOSTNAME)); - - // Pass client name from connection URL - Map<String, Object> clientProps = new HashMap<String, Object>(); - try - { - clientProps.put("clientName", _conn.getClientID()); - conSettings.setClientProperties(clientProps); - } - catch (JMSException e) - { - // Ignore - } - - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_TCP_NO_DELAY) != null) - { - conSettings.setTcpNodelay( - brokerDetail.getBooleanProperty(BrokerDetails.OPTIONS_TCP_NO_DELAY)); - } - - conSettings.setHeartbeatInterval(getHeartbeatInterval(brokerDetail)); - } - - // The idle_timeout prop is in milisecs while - // the new heartbeat prop is in secs - private int getHeartbeatInterval(BrokerDetails brokerDetail) - { - int heartbeat = 0; - if (brokerDetail.getProperty(BrokerDetails.OPTIONS_IDLE_TIMEOUT) != null) - { - _logger.warn("Broker property idle_timeout=<mili_secs> is deprecated, please use heartbeat=<secs>"); - heartbeat = Integer.parseInt(brokerDetail.getProperty(BrokerDetails.OPTIONS_IDLE_TIMEOUT))/1000; - } - else if (brokerDetail.getProperty(BrokerDetails.OPTIONS_HEARTBEAT) != null) - { - heartbeat = Integer.parseInt(brokerDetail.getProperty(BrokerDetails.OPTIONS_HEARTBEAT)); - } - else if (Integer.getInteger(ClientProperties.IDLE_TIMEOUT_PROP_NAME) != null) - { - heartbeat = Integer.getInteger(ClientProperties.IDLE_TIMEOUT_PROP_NAME)/1000; - _logger.warn("JVM arg -Didle_timeout=<mili_secs> is deprecated, please use -Dqpid.heartbeat=<secs>"); - } - else - { - heartbeat = Integer.getInteger(ClientProperties.HEARTBEAT,ClientProperties.HEARTBEAT_DEFAULT); - } - return heartbeat; - } - - protected org.apache.qpid.transport.Connection getQpidConnection() - { - return _qpidConnection; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_9.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_9.java deleted file mode 100755 index 70ecedfd8b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_9.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.framing.ProtocolVersion; - - -public class AMQConnectionDelegate_0_9 extends AMQConnectionDelegate_8_0 -{ - - public AMQConnectionDelegate_0_9(AMQConnection conn) - { - super(conn); - } - - @Override - public ProtocolVersion getProtocolVersion() - { - return ProtocolVersion.v0_9; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_8_0.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_8_0.java deleted file mode 100644 index 40b332d216..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_8_0.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.IOException; -import java.net.ConnectException; -import java.nio.channels.UnresolvedAddressException; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.Set; - -import javax.jms.JMSException; -import javax.jms.XASession; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.client.failover.FailoverRetrySupport; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.StateWaiter; -import org.apache.qpid.client.transport.TransportConnection; -import org.apache.qpid.framing.BasicQosBody; -import org.apache.qpid.framing.BasicQosOkBody; -import org.apache.qpid.framing.ChannelOpenBody; -import org.apache.qpid.framing.ChannelOpenOkBody; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.framing.TxSelectBody; -import org.apache.qpid.framing.TxSelectOkBody; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ChannelLimitReachedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AMQConnectionDelegate_8_0 implements AMQConnectionDelegate -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQConnectionDelegate_8_0.class); - private AMQConnection _conn; - - - public void closeConnection(long timeout) throws JMSException, AMQException - { - _conn.getProtocolHandler().closeConnection(timeout); - - } - - public AMQConnectionDelegate_8_0(AMQConnection conn) - { - _conn = conn; - } - - protected boolean checkException(Throwable thrown) - { - Throwable cause = thrown.getCause(); - - if (cause == null) - { - cause = thrown; - } - - return ((cause instanceof ConnectException) || (cause instanceof UnresolvedAddressException)); - } - - public ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws AMQException, IOException - { - final Set<AMQState> openOrClosedStates = - EnumSet.of(AMQState.CONNECTION_OPEN, AMQState.CONNECTION_CLOSED); - - - StateWaiter waiter = _conn._protocolHandler.createWaiter(openOrClosedStates); - - // TODO: use system property thingy for this - if (System.getProperty("UseTransportIo", "false").equals("false")) - { - TransportConnection.getInstance(brokerDetail).connect(_conn._protocolHandler, brokerDetail); - } - else - { - _conn.getProtocolHandler().createIoTransportSession(brokerDetail); - } - _conn._protocolHandler.getProtocolSession().init(); - // this blocks until the connection has been set up or when an error - // has prevented the connection being set up - - AMQState state = waiter.await(); - - if(state == AMQState.CONNECTION_OPEN) - { - _conn._failoverPolicy.attainedConnection(); - _conn._connected = true; - return null; - } - else - { - return _conn._protocolHandler.getSuggestedProtocolVersion(); - } - - } - - public org.apache.qpid.jms.Session createSession(final boolean transacted, final int acknowledgeMode, final int prefetch) - throws JMSException - { - return createSession(transacted, acknowledgeMode, prefetch, prefetch); - } - - public XASession createXASession(int prefetchHigh, int prefetchLow) throws JMSException - { - throw new UnsupportedOperationException("0_8 version does not provide XA support"); - } - - public org.apache.qpid.jms.Session createSession(final boolean transacted, final int acknowledgeMode, - final int prefetchHigh, final int prefetchLow) throws JMSException - { - _conn.checkNotClosed(); - - if (_conn.channelLimitReached()) - { - throw new ChannelLimitReachedException(_conn.getMaximumChannelCount()); - } - - return new FailoverRetrySupport<org.apache.qpid.jms.Session, JMSException>( - new FailoverProtectedOperation<org.apache.qpid.jms.Session, JMSException>() - { - public org.apache.qpid.jms.Session execute() throws JMSException, FailoverException - { - int channelId = _conn.getNextChannelID(); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Write channel open frame for channel id " + channelId); - } - - // We must create the session and register it before actually sending the frame to the server to - // open it, so that there is no window where we could receive data on the channel and not be set - // up to handle it appropriately. - AMQSession session = - new AMQSession_0_8(_conn, channelId, transacted, acknowledgeMode, prefetchHigh, - prefetchLow); - // _protocolHandler.addSessionByChannel(channelId, session); - _conn.registerSession(channelId, session); - - boolean success = false; - try - { - createChannelOverWire(channelId, prefetchHigh, prefetchLow, transacted); - success = true; - } - catch (AMQException e) - { - JMSException jmse = new JMSException("Error creating session: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - finally - { - if (!success) - { - _conn.deregisterSession(channelId); - } - } - - if (_conn._started) - { - try - { - session.start(); - } - catch (AMQException e) - { - throw new JMSAMQException(e); - } - } - - return session; - } - }, _conn).execute(); - } - - /** - * Create an XASession with default prefetch values of: - * High = MaxPrefetch - * Low = MaxPrefetch / 2 - * @return XASession - * @throws JMSException thrown if there is a problem creating the session. - */ - public XASession createXASession() throws JMSException - { - return createXASession((int) _conn.getMaxPrefetch(), (int) _conn.getMaxPrefetch() / 2); - } - - private void createChannelOverWire(int channelId, int prefetchHigh, int prefetchLow, boolean transacted) - throws AMQException, FailoverException - { - ChannelOpenBody channelOpenBody = _conn.getProtocolHandler().getMethodRegistry().createChannelOpenBody(null); - // TODO: Be aware of possible changes to parameter order as versions change. - _conn._protocolHandler.syncWrite(channelOpenBody.generateFrame(channelId), ChannelOpenOkBody.class); - - // todo send low water mark when protocol allows. - // todo Be aware of possible changes to parameter order as versions change. - BasicQosBody basicQosBody = _conn.getProtocolHandler().getMethodRegistry().createBasicQosBody(0,prefetchHigh,false); - _conn._protocolHandler.syncWrite(basicQosBody.generateFrame(channelId),BasicQosOkBody.class); - - if (transacted) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Issuing TxSelect for " + channelId); - } - TxSelectBody body = _conn.getProtocolHandler().getMethodRegistry().createTxSelectBody(); - - // TODO: Be aware of possible changes to parameter order as versions change. - _conn._protocolHandler.syncWrite(body.generateFrame(channelId), TxSelectOkBody.class); - } - } - - public void failoverPrep() - { - // do nothing - } - - /** - * For all sessions, and for all consumers in those sessions, resubscribe. This is called during failover handling. - * The caller must hold the failover mutex before calling this method. - */ - public void resubscribeSessions() throws JMSException, AMQException, FailoverException - { - ArrayList sessions = new ArrayList(_conn.getSessions().values()); - _logger.info(MessageFormat.format("Resubscribing sessions = {0} sessions.size={1}", sessions, sessions.size())); // FIXME: removeKey? - for (Iterator it = sessions.iterator(); it.hasNext();) - { - AMQSession s = (AMQSession) it.next(); - // _protocolHandler.addSessionByChannel(s.getChannelId(), s); - reopenChannel(s.getChannelId(), s.getDefaultPrefetchHigh(), s.getDefaultPrefetchLow(), s.getTransacted()); - s.resubscribe(); - } - } - - private void reopenChannel(int channelId, int prefetchHigh, int prefetchLow, boolean transacted) - throws AMQException, FailoverException - { - try - { - createChannelOverWire(channelId, prefetchHigh, prefetchLow, transacted); - } - catch (AMQException e) - { - _conn.deregisterSession(channelId); - throw new AMQException(null, "Error reopening channel " + channelId + " after failover: " + e, e); - } - } - - public <T, E extends Exception> T executeRetrySupport(FailoverProtectedOperation<T,E> operation) throws E - { - while (true) - { - try - { - _conn.blockUntilNotFailingOver(); - } - catch (InterruptedException e) - { - _logger.debug("Interrupted: " + e, e); - - return null; - } - - synchronized (_conn.getFailoverMutex()) - { - try - { - return operation.execute(); - } - catch (FailoverException e) - { - _logger.debug("Failover exception caught during operation: " + e, e); - } - catch (IllegalStateException e) - { - if (!(e.getMessage().startsWith("Fail-over interupted no-op failover support"))) - { - throw e; - } - } - } - } - } - - public int getMaxChannelID() - { - ConnectionTuneParameters params = _conn.getProtocolHandler().getProtocolSession().getConnectionTuneParameters(); - - return params == null ? AMQProtocolSession.MAX_CHANNEL_MAX : params.getChannelMax(); - } - - public int getMinChannelID() - { - return AMQProtocolSession.MIN_USABLE_CHANNEL_NUM; - } - - public ProtocolVersion getProtocolVersion() - { - return ProtocolVersion.v8_0; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_9_1.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_9_1.java deleted file mode 100755 index 442dd7b286..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_9_1.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.framing.ProtocolVersion; - - -public class AMQConnectionDelegate_9_1 extends AMQConnectionDelegate_8_0 -{ - - public AMQConnectionDelegate_9_1(AMQConnection conn) - { - super(conn); - } - - @Override - public ProtocolVersion getProtocolVersion() - { - return ProtocolVersion.v0_91; - } -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionFactory.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionFactory.java deleted file mode 100644 index ec4c668d7e..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionFactory.java +++ /dev/null @@ -1,566 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Hashtable; -import java.util.UUID; - -import javax.jms.*; -import javax.naming.Context; -import javax.naming.Name; -import javax.naming.NamingException; -import javax.naming.RefAddr; -import javax.naming.Reference; -import javax.naming.Referenceable; -import javax.naming.StringRefAddr; -import javax.naming.spi.ObjectFactory; - -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.url.AMQBindingURL; -import org.apache.qpid.url.URLSyntaxException; - - -public class AMQConnectionFactory implements ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory, - ObjectFactory, Referenceable, XATopicConnectionFactory, - XAQueueConnectionFactory, XAConnectionFactory -{ - private String _host; - private int _port; - private String _defaultUsername; - private String _defaultPassword; - private String _virtualPath; - - private ConnectionURL _connectionDetails; - private SSLConfiguration _sslConfig; - - public AMQConnectionFactory() - { - } - - /** - * This is the Only constructor used! - * It is used form the context and from the JNDI objects. - */ - public AMQConnectionFactory(String url) throws URLSyntaxException - { - _connectionDetails = new AMQConnectionURL(url); - } - - /** - * This constructor is never used! - */ - public AMQConnectionFactory(ConnectionURL url) - { - _connectionDetails = url; - } - - /** - * This constructor is never used! - */ - public AMQConnectionFactory(String broker, String username, String password, String clientName, String virtualHost) - throws URLSyntaxException - { - this(new AMQConnectionURL( - ConnectionURL.AMQ_PROTOCOL + "://" + username + ":" + password + "@" + clientName + "/" + virtualHost + "?brokerlist='" + broker + "'")); - } - - /** - * This constructor is never used! - */ - public AMQConnectionFactory(String host, int port, String virtualPath) - { - this(host, port, "guest", "guest", virtualPath); - } - - /** - * This constructor is never used! - */ - public AMQConnectionFactory(String host, int port, String defaultUsername, String defaultPassword, - String virtualPath) - { - _host = host; - _port = port; - _defaultUsername = defaultUsername; - _defaultPassword = defaultPassword; - _virtualPath = virtualPath; - -//todo when setting Host/Port has been resolved then we can use this otherwise those methods won't work with the following line. -// _connectionDetails = new AMQConnectionURL( -// ConnectionURL.AMQ_PROTOCOL + "://" + -// _defaultUsername + ":" + _defaultPassword + "@" + -// virtualPath + "?brokerlist='tcp://" + host + ":" + port + "'"); - } - - /** - * @return The _defaultPassword. - */ - public final String getDefaultPassword(String password) - { - if (_connectionDetails != null) - { - return _connectionDetails.getPassword(); - } - else - { - return _defaultPassword; - } - } - - /** - * @param password The _defaultPassword to set. - */ - public final void setDefaultPassword(String password) - { - if (_connectionDetails != null) - { - _connectionDetails.setPassword(password); - } - _defaultPassword = password; - } - - /** - * Getter for SSLConfiguration - * - * @return SSLConfiguration if set, otherwise null - */ - public final SSLConfiguration getSSLConfiguration() - { - return _sslConfig; - } - - /** - * Setter for SSLConfiguration - * - * @param sslConfig config to store - */ - public final void setSSLConfiguration(SSLConfiguration sslConfig) - { - _sslConfig = sslConfig; - } - - /** - * @return The _defaultPassword. - */ - public final String getDefaultUsername(String password) - { - if (_connectionDetails != null) - { - return _connectionDetails.getUsername(); - } - else - { - return _defaultUsername; - } - } - - /** - * @param username The _defaultUsername to set. - */ - public final void setDefaultUsername(String username) - { - if (_connectionDetails != null) - { - _connectionDetails.setUsername(username); - } - _defaultUsername = username; - } - - /** - * @return The _host . - */ - public final String getHost() - { - //todo this doesn't make sense in a multi broker URL as we have no current as that is done by AMQConnection - return _host; - } - - /** - * @param host The _host to set. - */ - public final void setHost(String host) - { - //todo if _connectionDetails is set then run _connectionDetails.addBrokerDetails() - // Should perhaps have this method changed to setBroker(host,port) - _host = host; - } - - /** - * @return _port The _port to set. - */ - public final int getPort() - { - //todo see getHost - return _port; - } - - /** - * @param port The port to set. - */ - public final void setPort(int port) - { - //todo see setHost - _port = port; - } - - /** - * @return he _virtualPath. - */ - public final String getVirtualPath() - { - if (_connectionDetails != null) - { - return _connectionDetails.getVirtualHost(); - } - else - { - return _virtualPath; - } - } - - /** - * @param path The _virtualPath to set. - */ - public final void setVirtualPath(String path) - { - if (_connectionDetails != null) - { - _connectionDetails.setVirtualHost(path); - } - - _virtualPath = path; - } - - public static String getUniqueClientID() - { - try - { - InetAddress addr = InetAddress.getLocalHost(); - return addr.getHostName() + System.currentTimeMillis(); - } - catch (UnknownHostException e) - { - return "UnknownHost" + UUID.randomUUID(); - } - } - - public Connection createConnection() throws JMSException - { - try - { - if (_connectionDetails != null) - { - if (_connectionDetails.getClientName() == null || _connectionDetails.getClientName().equals("")) - { - _connectionDetails.setClientName(getUniqueClientID()); - } - return new AMQConnection(_connectionDetails, _sslConfig); - } - else - { - return new AMQConnection(_host, _port, _defaultUsername, _defaultPassword, getUniqueClientID(), - _virtualPath); - } - } - catch (Exception e) - { - JMSException jmse = new JMSException("Error creating connection: " + e.getMessage()); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - - - } - - public Connection createConnection(String userName, String password) throws JMSException - { - return createConnection(userName, password, null); - } - - public Connection createConnection(String userName, String password, String id) throws JMSException - { - try - { - if (_connectionDetails != null) - { - _connectionDetails.setUsername(userName); - _connectionDetails.setPassword(password); - - if (id != null && !id.equals("")) - { - _connectionDetails.setClientName(id); - } - else if (_connectionDetails.getClientName() == null || _connectionDetails.getClientName().equals("")) - { - _connectionDetails.setClientName(getUniqueClientID()); - } - return new AMQConnection(_connectionDetails, _sslConfig); - } - else - { - return new AMQConnection(_host, _port, userName, password, (id != null ? id : getUniqueClientID()), _virtualPath); - } - } - catch (Exception e) - { - JMSException jmse = new JMSException("Error creating connection: " + e.getMessage()); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - public QueueConnection createQueueConnection() throws JMSException - { - return (QueueConnection) createConnection(); - } - - public QueueConnection createQueueConnection(String username, String password) throws JMSException - { - return (QueueConnection) createConnection(username, password); - } - - public TopicConnection createTopicConnection() throws JMSException - { - return (TopicConnection) createConnection(); - } - - public TopicConnection createTopicConnection(String username, String password) throws JMSException - { - return (TopicConnection) createConnection(username, password); - } - - - public ConnectionURL getConnectionURL() - { - return _connectionDetails; - } - - public String getConnectionURLString() - { - return _connectionDetails.toString(); - } - - - public final void setConnectionURLString(String url) throws URLSyntaxException - { - _connectionDetails = new AMQConnectionURL(url); - } - - /** - * JNDI interface to create objects from References. - * - * @param obj The Reference from JNDI - * @param name - * @param ctx - * @param env - * - * @return AMQConnection,AMQTopic,AMQQueue, or AMQConnectionFactory. - * - * @throws Exception - */ - public Object getObjectInstance(Object obj, Name name, Context ctx, Hashtable env) throws Exception - { - if (obj instanceof Reference) - { - Reference ref = (Reference) obj; - - if (ref.getClassName().equals(AMQConnection.class.getName())) - { - RefAddr addr = ref.get(AMQConnection.class.getName()); - - if (addr != null) - { - return new AMQConnection((String) addr.getContent()); - } - } - - if (ref.getClassName().equals(AMQQueue.class.getName())) - { - RefAddr addr = ref.get(AMQQueue.class.getName()); - - if (addr != null) - { - return new AMQQueue(new AMQBindingURL((String) addr.getContent())); - } - } - - if (ref.getClassName().equals(AMQTopic.class.getName())) - { - RefAddr addr = ref.get(AMQTopic.class.getName()); - - if (addr != null) - { - return new AMQTopic(new AMQBindingURL((String) addr.getContent())); - } - } - - if (ref.getClassName().equals(AMQConnectionFactory.class.getName())) - { - RefAddr addr = ref.get(AMQConnectionFactory.class.getName()); - - if (addr != null) - { - return new AMQConnectionFactory((String) addr.getContent()); - } - } - - } - return null; - } - - - public Reference getReference() throws NamingException - { - return new Reference( - AMQConnectionFactory.class.getName(), - new StringRefAddr(AMQConnectionFactory.class.getName(), _connectionDetails.getURL()), - AMQConnectionFactory.class.getName(), null); // factory location - } - - // --------------------------------------------------------------------------------------------------- - // the following methods are provided for XA compatibility - // Those methods are only supported by 0_10 and above - // --------------------------------------------------------------------------------------------------- - - /** - * Creates a XAConnection with the default user identity. - * <p> The XAConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @return A newly created XAConnection - * @throws JMSException If creating the XAConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XAConnection createXAConnection() throws JMSException - { - try - { - return new XAConnectionImpl(_connectionDetails, _sslConfig); - } - catch (Exception e) - { - JMSException jmse = new JMSException("Error creating connection: " + e.getMessage()); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - /** - * Creates a XAConnection with the specified user identity. - * <p> The XAConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @param username the caller's user name - * @param password the caller's password - * @return A newly created XAConnection. - * @throws JMSException If creating the XAConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XAConnection createXAConnection(String username, String password) throws JMSException - { - if (_connectionDetails != null) - { - _connectionDetails.setUsername(username); - _connectionDetails.setPassword(password); - - if (_connectionDetails.getClientName() == null || _connectionDetails.getClientName().equals("")) - { - _connectionDetails.setClientName(getUniqueClientID()); - } - } - else - { - throw new JMSException("A URL must be specified to access XA connections"); - } - return createXAConnection(); - } - - - /** - * Creates a XATopicConnection with the default user identity. - * <p> The XATopicConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @return A newly created XATopicConnection - * @throws JMSException If creating the XATopicConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XATopicConnection createXATopicConnection() throws JMSException - { - return (XATopicConnection) createXAConnection(); - } - - /** - * Creates a XATopicConnection with the specified user identity. - * <p> The XATopicConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @param username the caller's user name - * @param password the caller's password - * @return A newly created XATopicConnection. - * @throws JMSException If creating the XATopicConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XATopicConnection createXATopicConnection(String username, String password) throws JMSException - { - return (XATopicConnection) createXAConnection(username, password); - } - - /** - * Creates a XAQueueConnection with the default user identity. - * <p> The XAQueueConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @return A newly created XAQueueConnection - * @throws JMSException If creating the XAQueueConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XAQueueConnection createXAQueueConnection() throws JMSException - { - return (XAQueueConnection) createXAConnection(); - } - - /** - * Creates a XAQueueConnection with the specified user identity. - * <p> The XAQueueConnection is created in stopped mode. No messages - * will be delivered until the <code>Connection.start</code> method - * is explicitly called. - * - * @param username the caller's user name - * @param password the caller's password - * @return A newly created XAQueueConnection. - * @throws JMSException If creating the XAQueueConnection fails due to some internal error. - * @throws JMSSecurityException If client authentication fails due to an invalid user name or password. - */ - public XAQueueConnection createXAQueueConnection(String username, String password) throws JMSException - { - return (XAQueueConnection) createXAConnection(username, password); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionURL.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionURL.java deleted file mode 100644 index 93b4c51a8f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionURL.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import org.apache.qpid.client.url.URLParser; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.url.URLHelper; -import org.apache.qpid.url.URLSyntaxException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class AMQConnectionURL implements ConnectionURL -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQConnectionURL.class); - - private String _url; - private String _failoverMethod; - private Map<String, String> _failoverOptions; - private Map<String, String> _options; - private List<BrokerDetails> _brokers; - private String _clientName; - private String _username; - private String _password; - private String _virtualHost; - private AMQShortString _defaultQueueExchangeName; - private AMQShortString _defaultTopicExchangeName; - private AMQShortString _temporaryTopicExchangeName; - private AMQShortString _temporaryQueueExchangeName; - - public AMQConnectionURL(String fullURL) throws URLSyntaxException - { - if (fullURL == null) throw new IllegalArgumentException("URL cannot be null"); - _url = fullURL; - _options = new HashMap<String, String>(); - _brokers = new LinkedList<BrokerDetails>(); - _failoverOptions = new HashMap<String, String>(); - new URLParser(this); - } - - public String getURL() - { - return _url; - } - - public Map<String,String> getOptions() - { - return _options; - } - - public String getFailoverMethod() - { - return _failoverMethod; - } - - public void setFailoverMethod(String failoverMethod) - { - _failoverMethod = failoverMethod; - } - - public Map<String,String> getFailoverOptions() - { - return _failoverOptions; - } - - public String getFailoverOption(String key) - { - return _failoverOptions.get(key); - } - - public void setFailoverOption(String key, String value) - { - _failoverOptions.put(key, value); - } - - public int getBrokerCount() - { - return _brokers.size(); - } - - public BrokerDetails getBrokerDetails(int index) - { - if (index < _brokers.size()) - { - return _brokers.get(index); - } - else - { - return null; - } - } - - public void addBrokerDetails(BrokerDetails broker) - { - if (!(_brokers.contains(broker))) - { - _brokers.add(broker); - } - } - - public void setBrokerDetails(List<BrokerDetails> brokers) - { - _brokers = brokers; - } - - public List<BrokerDetails> getAllBrokerDetails() - { - return _brokers; - } - - public String getClientName() - { - return _clientName; - } - - public void setClientName(String clientName) - { - _clientName = clientName; - } - - public String getUsername() - { - return _username; - } - - public void setUsername(String username) - { - _username = username; - } - - public String getPassword() - { - return _password; - } - - public void setPassword(String password) - { - _password = password; - } - - public String getVirtualHost() - { - return _virtualHost; - } - - public void setVirtualHost(String virtuaHost) - { - _virtualHost = virtuaHost; - } - - public String getOption(String key) - { - return _options.get(key); - } - - public void setOption(String key, String value) - { - _options.put(key, value); - } - - public AMQShortString getDefaultQueueExchangeName() - { - return _defaultQueueExchangeName; - } - - public void setDefaultQueueExchangeName(AMQShortString defaultQueueExchangeName) - { - _defaultQueueExchangeName = defaultQueueExchangeName; - } - - public AMQShortString getDefaultTopicExchangeName() - { - return _defaultTopicExchangeName; - } - - public void setDefaultTopicExchangeName(AMQShortString defaultTopicExchangeName) - { - _defaultTopicExchangeName = defaultTopicExchangeName; - } - - public AMQShortString getTemporaryQueueExchangeName() - { - return _temporaryQueueExchangeName; - } - - public void setTemporaryQueueExchangeName(AMQShortString temporaryQueueExchangeName) - { - _temporaryQueueExchangeName = temporaryQueueExchangeName; - } - - public AMQShortString getTemporaryTopicExchangeName() - { - return _temporaryTopicExchangeName; - } - - public void setTemporaryTopicExchangeName(AMQShortString temporaryTopicExchangeName) - { - _temporaryTopicExchangeName = temporaryTopicExchangeName; - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - - sb.append(AMQ_PROTOCOL); - sb.append("://"); - - if (_username != null) - { - sb.append(_username); - - if (_password != null) - { - sb.append(':'); - sb.append("********"); - } - - sb.append('@'); - } - - sb.append(_clientName); - - sb.append(_virtualHost); - - sb.append(optionsToString()); - - return sb.toString(); - } - - private String optionsToString() - { - StringBuffer sb = new StringBuffer("?"); - - if (!_options.isEmpty()) - { - for (Map.Entry<String, String> option : _options.entrySet()) - { - sb.append(option.getKey()).append("='").append(option.getValue()).append("'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - } - - sb.append(OPTIONS_BROKERLIST).append("='"); - for (BrokerDetails service : _brokers) - { - sb.append(service.toString()); - sb.append(URLHelper.BROKER_SEPARATOR); - } - - sb.deleteCharAt(sb.length() - 1); - sb.append("'"); - - if (_failoverMethod != null) - { - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - sb.append(OPTIONS_FAILOVER + "='"); - sb.append(_failoverMethod); - sb.append(URLHelper.printOptions(_failoverOptions)); - sb.append("'"); - } - - for (String key : _options.keySet()) - { - if (!key.equals(OPTIONS_FAILOVER) || !key.equals(OPTIONS_BROKERLIST)) - { - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR).append(key).append("='"); - sb.append(_options.get(key)).append("'"); - } - } - - return sb.toString(); - } - - public static void main(String[] args) throws URLSyntaxException - { - String url2 = - "amqp://ritchiem:bob@temp/testHost?brokerlist='tcp://localhost:5672;tcp://fancyserver:3000/',failover='roundrobin'"; - // "amqp://user:pass@clientid/virtualhost?brokerlist='tcp://host:1?option1=\'value\',option2=\'value\';vm://:3?option1=\'value\'',failover='method?option1=\'value\',option2='value''"; - - ConnectionURL connectionurl2 = new AMQConnectionURL(url2); - - System.out.println(url2); - System.out.println(connectionurl2); - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQDestination.java b/java/client/src/main/java/org/apache/qpid/client/AMQDestination.java deleted file mode 100644 index eb9682a3cf..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQDestination.java +++ /dev/null @@ -1,941 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.jms.Destination; -import javax.naming.NamingException; -import javax.naming.Reference; -import javax.naming.Referenceable; -import javax.naming.StringRefAddr; - -import org.apache.qpid.client.messaging.address.AddressHelper; -import org.apache.qpid.client.messaging.address.Link; -import org.apache.qpid.client.messaging.address.Node; -import org.apache.qpid.client.messaging.address.QpidExchangeOptions; -import org.apache.qpid.client.messaging.address.QpidQueueOptions; -import org.apache.qpid.configuration.ClientProperties; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.messaging.Address; -import org.apache.qpid.url.AMQBindingURL; -import org.apache.qpid.url.BindingURL; -import org.apache.qpid.url.URLHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public abstract class AMQDestination implements Destination, Referenceable -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQDestination.class); - - protected AMQShortString _exchangeName; - - protected AMQShortString _exchangeClass; - - protected boolean _isDurable; - - protected boolean _isExclusive; - - protected boolean _isAutoDelete; - - private boolean _browseOnly; - - private boolean _isAddressResolved; - - private AMQShortString _queueName; - - private AMQShortString _routingKey; - - private AMQShortString[] _bindingKeys; - - private String _url; - private AMQShortString _urlAsShortString; - - private boolean _checkedForQueueBinding; - - private boolean _exchangeExistsChecked; - - private byte[] _byteEncoding; - private static final int IS_DURABLE_MASK = 0x1; - private static final int IS_EXCLUSIVE_MASK = 0x2; - private static final int IS_AUTODELETE_MASK = 0x4; - - public static final int QUEUE_TYPE = 1; - public static final int TOPIC_TYPE = 2; - public static final int UNKNOWN_TYPE = 3; - - // ----- Fields required to support new address syntax ------- - - public enum DestSyntax { - BURL,ADDR; - - public static DestSyntax getSyntaxType(String s) - { - if (("BURL").equals(s)) - { - return BURL; - } - else if (("ADDR").equals(s)) - { - return ADDR; - } - else - { - throw new IllegalArgumentException("Invalid Destination Syntax Type" + - " should be one of {BURL|ADDR}"); - } - } - } - - public enum AddressOption { - ALWAYS, NEVER, SENDER, RECEIVER; - - public static AddressOption getOption(String str) - { - if ("always".equals(str)) return ALWAYS; - else if ("never".equals(str)) return NEVER; - else if ("sender".equals(str)) return SENDER; - else if ("receiver".equals(str)) return RECEIVER; - else throw new IllegalArgumentException(str + " is not an allowed value"); - } - } - - protected final static DestSyntax defaultDestSyntax; - - protected DestSyntax _destSyntax = DestSyntax.ADDR; - - protected AddressHelper _addrHelper; - protected Address _address; - protected int _addressType = AMQDestination.UNKNOWN_TYPE; - protected String _name; - protected String _subject; - protected AddressOption _create = AddressOption.NEVER; - protected AddressOption _assert = AddressOption.NEVER; - protected AddressOption _delete = AddressOption.NEVER; - - protected Node _targetNode; - protected Node _sourceNode; - protected Link _targetLink; - protected Link _link; - - // ----- / Fields required to support new address syntax ------- - - static - { - defaultDestSyntax = DestSyntax.getSyntaxType( - System.getProperty(ClientProperties.DEST_SYNTAX, - DestSyntax.ADDR.toString())); - - - } - - public static DestSyntax getDefaultDestSyntax() - { - return defaultDestSyntax; - } - - protected AMQDestination(Address address) throws Exception - { - this._address = address; - getInfoFromAddress(); - _destSyntax = DestSyntax.ADDR; - _logger.debug("Based on " + address + " the selected destination syntax is " + _destSyntax); - } - - public static DestSyntax getDestType(String str) - { - if (str.startsWith("BURL:") || - (!str.startsWith("ADDR:") && defaultDestSyntax == DestSyntax.BURL)) - { - return DestSyntax.BURL; - } - else - { - return DestSyntax.ADDR; - } - } - - public static String stripSyntaxPrefix(String str) - { - if (str.startsWith("BURL:") || str.startsWith("ADDR:")) - { - return str.substring(5,str.length()); - } - else - { - return str; - } - } - - protected AMQDestination(String str) throws URISyntaxException - { - _destSyntax = getDestType(str); - str = stripSyntaxPrefix(str); - if (_destSyntax == DestSyntax.BURL) - { - getInfoFromBindingURL(new AMQBindingURL(str)); - } - else - { - this._address = createAddressFromString(str); - try - { - getInfoFromAddress(); - } - catch(Exception e) - { - URISyntaxException ex = new URISyntaxException(str,"Error parsing address"); - ex.initCause(e); - throw ex; - } - } - _logger.debug("Based on " + str + " the selected destination syntax is " + _destSyntax); - } - - //retained for legacy support - protected AMQDestination(BindingURL binding) - { - getInfoFromBindingURL(binding); - _destSyntax = DestSyntax.BURL; - _logger.debug("Based on " + binding + " the selected destination syntax is " + _destSyntax); - } - - protected void getInfoFromBindingURL(BindingURL binding) - { - _exchangeName = binding.getExchangeName(); - _exchangeClass = binding.getExchangeClass(); - - _isExclusive = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_EXCLUSIVE)); - _isAutoDelete = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_AUTODELETE)); - _isDurable = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_DURABLE)); - _browseOnly = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_BROWSE)); - _queueName = binding.getQueueName() == null ? null : binding.getQueueName(); - _routingKey = binding.getRoutingKey() == null ? null : binding.getRoutingKey(); - _bindingKeys = binding.getBindingKeys() == null || binding.getBindingKeys().length == 0 ? new AMQShortString[0] : binding.getBindingKeys(); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, AMQShortString queueName) - { - this(exchangeName, exchangeClass, routingKey, false, false, queueName, null); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, AMQShortString queueName, AMQShortString[] bindingKeys) - { - this(exchangeName, exchangeClass, routingKey, false, false, queueName,bindingKeys); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString destinationName) - { - this(exchangeName, exchangeClass, destinationName, false, false, null,null); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName) - { - this(exchangeName, exchangeClass, routingKey, isExclusive, isAutoDelete, queueName, false,null); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName,AMQShortString[] bindingKeys) - { - this(exchangeName, exchangeClass, routingKey, isExclusive, isAutoDelete, queueName, false,bindingKeys); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, boolean isDurable){ - this (exchangeName, exchangeClass, routingKey, isExclusive,isAutoDelete,queueName,isDurable,null); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, boolean isDurable,AMQShortString[] bindingKeys) - { - this (exchangeName, exchangeClass, routingKey, isExclusive,isAutoDelete,queueName,isDurable,bindingKeys, false); - } - - protected AMQDestination(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, boolean isDurable,AMQShortString[] bindingKeys, boolean browseOnly) - { - if ( (ExchangeDefaults.DIRECT_EXCHANGE_CLASS.equals(exchangeClass) || - ExchangeDefaults.TOPIC_EXCHANGE_CLASS.equals(exchangeClass)) - && routingKey == null) - { - throw new IllegalArgumentException("routing/binding key must not be null"); - } - if (exchangeName == null) - { - throw new IllegalArgumentException("Exchange name must not be null"); - } - if (exchangeClass == null) - { - throw new IllegalArgumentException("Exchange class must not be null"); - } - _exchangeName = exchangeName; - _exchangeClass = exchangeClass; - _routingKey = routingKey; - _isExclusive = isExclusive; - _isAutoDelete = isAutoDelete; - _queueName = queueName; - _isDurable = isDurable; - _bindingKeys = bindingKeys == null || bindingKeys.length == 0 ? new AMQShortString[0] : bindingKeys; - _destSyntax = DestSyntax.BURL; - _browseOnly = browseOnly; - - if (_logger.isDebugEnabled()) - { - _logger.debug("Based on " + toString() + " the selected destination syntax is " + _destSyntax); - } - } - - public DestSyntax getDestSyntax() - { - return _destSyntax; - } - - protected void setDestSyntax(DestSyntax syntax) - { - _destSyntax = syntax; - } - - public AMQShortString getEncodedName() - { - if(_urlAsShortString == null) - { - toURL(); - } - return _urlAsShortString; - } - - public boolean isDurable() - { - return _isDurable; - } - - public AMQShortString getExchangeName() - { - return _exchangeName; - } - - public AMQShortString getExchangeClass() - { - return _exchangeClass; - } - - public boolean isTopic() - { - return ExchangeDefaults.TOPIC_EXCHANGE_CLASS.equals(_exchangeClass); - } - - public boolean isQueue() - { - return ExchangeDefaults.DIRECT_EXCHANGE_CLASS.equals(_exchangeClass); - } - - public String getQueueName() - { - return _queueName == null ? null : _queueName.toString(); - } - - public AMQShortString getAMQQueueName() - { - return _queueName; - } - - public void setQueueName(AMQShortString queueName) - { - - _queueName = queueName; - // calculated URL now out of date - _url = null; - _urlAsShortString = null; - _byteEncoding = null; - } - - public AMQShortString getRoutingKey() - { - return _routingKey; - } - - public AMQShortString[] getBindingKeys() - { - if (_bindingKeys != null && _bindingKeys.length > 0) - { - return _bindingKeys; - } - else - { - // catering to the common use case where the - //routingKey is the same as the bindingKey. - return new AMQShortString[]{_routingKey}; - } - } - - public boolean isExclusive() - { - return _isExclusive; - } - - public boolean isAutoDelete() - { - return _isAutoDelete; - } - - public abstract boolean isNameRequired(); - - public String toString() - { - if (_destSyntax == DestSyntax.BURL) - { - return toURL(); - } - else - { - return _address.toString(); - } - - } - - public boolean isCheckedForQueueBinding() - { - return _checkedForQueueBinding; - } - - public void setCheckedForQueueBinding(boolean checkedForQueueBinding) - { - _checkedForQueueBinding = checkedForQueueBinding; - } - - - public boolean isExchangeExistsChecked() - { - return _exchangeExistsChecked; - } - - public void setExchangeExistsChecked(final boolean exchangeExistsChecked) - { - _exchangeExistsChecked = exchangeExistsChecked; - } - - public String toURL() - { - String url = _url; - if(url == null) - { - - - StringBuffer sb = new StringBuffer(); - - sb.append(_exchangeClass); - sb.append("://"); - sb.append(_exchangeName); - - sb.append("/"+_routingKey+"/"); - - if (_queueName != null) - { - sb.append(_queueName); - } - - sb.append('?'); - - if (_routingKey != null) - { - sb.append(BindingURL.OPTION_ROUTING_KEY); - sb.append("='"); - sb.append(_routingKey).append("'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - - // We can't allow both routingKey and bindingKey - if (_routingKey == null && _bindingKeys != null && _bindingKeys.length>0) - { - - for (AMQShortString bindingKey:_bindingKeys) - { - sb.append(BindingURL.OPTION_BINDING_KEY); - sb.append("='"); - sb.append(bindingKey); - sb.append("'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - - } - } - - if (_isDurable) - { - sb.append(BindingURL.OPTION_DURABLE); - sb.append("='true'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - - if (_isExclusive) - { - sb.append(BindingURL.OPTION_EXCLUSIVE); - sb.append("='true'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - - if (_isAutoDelete) - { - sb.append(BindingURL.OPTION_AUTODELETE); - sb.append("='true'"); - sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR); - } - - //removeKey the last char '?' if there is no options , ',' if there are. - sb.deleteCharAt(sb.length() - 1); - url = sb.toString(); - _url = url; - _urlAsShortString = new AMQShortString(url); - } - return url; - } - - public byte[] toByteEncoding() - { - byte[] encoding = _byteEncoding; - if(encoding == null) - { - int size = _exchangeClass.length() + 1 + - _exchangeName.length() + 1 + - 0 + // in place of the destination name - (_queueName == null ? 0 : _queueName.length()) + 1 + - 1; - encoding = new byte[size]; - int pos = 0; - - pos = _exchangeClass.writeToByteArray(encoding, pos); - pos = _exchangeName.writeToByteArray(encoding, pos); - - encoding[pos++] = (byte)0; - - if(_queueName == null) - { - encoding[pos++] = (byte)0; - } - else - { - pos = _queueName.writeToByteArray(encoding,pos); - } - byte options = 0; - if(_isDurable) - { - options |= IS_DURABLE_MASK; - } - if(_isExclusive) - { - options |= IS_EXCLUSIVE_MASK; - } - if(_isAutoDelete) - { - options |= IS_AUTODELETE_MASK; - } - encoding[pos] = options; - - - _byteEncoding = encoding; - - } - return encoding; - } - - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (o == null || getClass() != o.getClass()) - { - return false; - } - - final AMQDestination that = (AMQDestination) o; - - if (!_exchangeClass.equals(that._exchangeClass)) - { - return false; - } - if (!_exchangeName.equals(that._exchangeName)) - { - return false; - } - if ((_queueName == null && that._queueName != null) || - (_queueName != null && !_queueName.equals(that._queueName))) - { - return false; - } - - return true; - } - - public int hashCode() - { - int result; - result = _exchangeName == null ? "".hashCode() : _exchangeName.hashCode(); - result = 29 * result + (_exchangeClass == null ? "".hashCode() :_exchangeClass.hashCode()); - //result = 29 * result + _destinationName.hashCode(); - if (_queueName != null) - { - result = 29 * result + _queueName.hashCode(); - } - - return result; - } - - public Reference getReference() throws NamingException - { - return new Reference( - this.getClass().getName(), - new StringRefAddr(this.getClass().getName(), toURL()), - AMQConnectionFactory.class.getName(), - null); // factory location - } - - - public static Destination createDestination(byte[] byteEncodedDestination) - { - AMQShortString exchangeClass; - AMQShortString exchangeName; - AMQShortString routingKey; - AMQShortString queueName; - boolean isDurable; - boolean isExclusive; - boolean isAutoDelete; - - int pos = 0; - exchangeClass = AMQShortString.readFromByteArray(byteEncodedDestination, pos); - pos+= exchangeClass.length() + 1; - exchangeName = AMQShortString.readFromByteArray(byteEncodedDestination, pos); - pos+= exchangeName.length() + 1; - routingKey = AMQShortString.readFromByteArray(byteEncodedDestination, pos); - pos+= (routingKey == null ? 0 : routingKey.length()) + 1; - queueName = AMQShortString.readFromByteArray(byteEncodedDestination, pos); - pos+= (queueName == null ? 0 : queueName.length()) + 1; - int options = byteEncodedDestination[pos]; - isDurable = (options & IS_DURABLE_MASK) != 0; - isExclusive = (options & IS_EXCLUSIVE_MASK) != 0; - isAutoDelete = (options & IS_AUTODELETE_MASK) != 0; - - if (exchangeClass.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS)) - { - return new AMQQueue(exchangeName,routingKey,queueName,isExclusive,isAutoDelete,isDurable); - } - else if (exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS)) - { - return new AMQTopic(exchangeName,routingKey,isAutoDelete,queueName,isDurable); - } - else if (exchangeClass.equals(ExchangeDefaults.HEADERS_EXCHANGE_CLASS)) - { - return new AMQHeadersExchange(routingKey); - } - else - { - return new AMQAnyDestination(exchangeName,exchangeClass, - routingKey,isExclusive, - isAutoDelete,queueName, - isDurable, new AMQShortString[0]); - } - - } - - public static Destination createDestination(BindingURL binding) - { - AMQShortString type = binding.getExchangeClass(); - - if (type.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS)) - { - return new AMQQueue(binding); - } - else if (type.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS)) - { - return new AMQTopic(binding); - } - else if (type.equals(ExchangeDefaults.HEADERS_EXCHANGE_CLASS)) - { - return new AMQHeadersExchange(binding); - } - else - { - return new AMQAnyDestination(binding); - } - } - - public static Destination createDestination(String str) throws Exception - { - DestSyntax syntax = getDestType(str); - str = stripSyntaxPrefix(str); - if (syntax == DestSyntax.BURL) - { - return createDestination(new AMQBindingURL(str)); - } - else - { - Address address = createAddressFromString(str); - return new AMQAnyDestination(address); - } - } - - // ----- new address syntax ----------- - - public static class Binding - { - String exchange; - String bindingKey; - String queue; - Map<String,Object> args; - - public Binding(String exchange, - String queue, - String bindingKey, - Map<String,Object> args) - { - this.exchange = exchange; - this.queue = queue; - this.bindingKey = bindingKey; - this.args = args; - } - - public String getExchange() - { - return exchange; - } - - public String getQueue() - { - return queue; - } - - public String getBindingKey() - { - return bindingKey; - } - - public Map<String, Object> getArgs() - { - return args; - } - } - - public Address getAddress() { - return _address; - } - - protected void setAddress(Address addr) { - _address = addr; - } - - public int getAddressType(){ - return _addressType; - } - - public void setAddressType(int addressType){ - _addressType = addressType; - } - - public String getAddressName() { - return _name; - } - - public void setAddressName(String name){ - _name = name; - } - - public String getSubject() { - return _subject; - } - - public void setSubject(String subject) { - _subject = subject; - } - - public AddressOption getCreate() { - return _create; - } - - public void setCreate(AddressOption option) { - _create = option; - } - - public AddressOption getAssert() { - return _assert; - } - - public void setAssert(AddressOption option) { - _assert = option; - } - - public AddressOption getDelete() { - return _delete; - } - - public void setDelete(AddressOption option) { - _delete = option; - } - - public Node getTargetNode() - { - return _targetNode; - } - - public void setTargetNode(Node node) - { - _targetNode = node; - } - - public Node getSourceNode() - { - return _sourceNode; - } - - public void setSourceNode(Node node) - { - _sourceNode = node; - } - - public Link getLink() - { - return _link; - } - - public void setLink(Link link) - { - _link = link; - } - - public void setExchangeName(AMQShortString name) - { - this._exchangeName = name; - } - - public void setExchangeClass(AMQShortString type) - { - this._exchangeClass = type; - } - - public void setRoutingKey(AMQShortString rk) - { - this._routingKey = rk; - } - - public boolean isAddressResolved() - { - return _isAddressResolved; - } - - public void setAddressResolved(boolean addressResolved) - { - _isAddressResolved = addressResolved; - } - - private static Address createAddressFromString(String str) - { - return Address.parse(str); - } - - private void getInfoFromAddress() throws Exception - { - _name = _address.getName(); - _subject = _address.getSubject(); - - _addrHelper = new AddressHelper(_address); - - _create = _addrHelper.getCreate() != null ? - AddressOption.getOption(_addrHelper.getCreate()):AddressOption.NEVER; - - _assert = _addrHelper.getAssert() != null ? - AddressOption.getOption(_addrHelper.getAssert()):AddressOption.NEVER; - - _delete = _addrHelper.getDelete() != null ? - AddressOption.getOption(_addrHelper.getDelete()):AddressOption.NEVER; - - _browseOnly = _addrHelper.isBrowseOnly(); - - _addressType = _addrHelper.getTargetNodeType(); - _targetNode = _addrHelper.getTargetNode(_addressType); - _sourceNode = _addrHelper.getSourceNode(_addressType); - _link = _addrHelper.getLink(); - } - - // This method is needed if we didn't know the node type at the beginning. - // Therefore we have to query the broker to figure out the type. - // Once the type is known we look for the necessary properties. - public void rebuildTargetAndSourceNodes(int addressType) - { - _targetNode = _addrHelper.getTargetNode(addressType); - _sourceNode = _addrHelper.getSourceNode(addressType); - } - - // ----- / new address syntax ----------- - - public boolean isBrowseOnly() - { - return _browseOnly; - } - - public void setBrowseOnly(boolean b) - { - _browseOnly = b; - } - - public AMQDestination copyDestination() - { - AMQDestination dest = - new AMQAnyDestination(_exchangeName, - _exchangeClass, - _routingKey, - _isExclusive, - _isAutoDelete, - _queueName, - _isDurable, - _bindingKeys - ); - - dest.setDestSyntax(_destSyntax); - dest.setAddress(_address); - dest.setAddressName(_name); - dest.setSubject(_subject); - dest.setCreate(_create); - dest.setAssert(_assert); - dest.setDelete(_create); - dest.setBrowseOnly(_browseOnly); - dest.setAddressType(_addressType); - dest.setTargetNode(_targetNode); - dest.setSourceNode(_sourceNode); - dest.setLink(_link); - dest.setAddressResolved(_isAddressResolved); - return dest; - } - - protected void setAutoDelete(boolean b) - { - _isAutoDelete = b; - } - - protected void setDurable(boolean b) - { - _isDurable = b; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQHeadersExchange.java b/java/client/src/main/java/org/apache/qpid/client/AMQHeadersExchange.java deleted file mode 100644 index b9e9a33cd6..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQHeadersExchange.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.url.BindingURL; - -/** - * A destination backed by a headers exchange - */ -public class AMQHeadersExchange extends AMQDestination -{ - public AMQHeadersExchange(BindingURL binding) - { - this(binding.getExchangeName()); - } - - public AMQHeadersExchange(String name) - { - this(new AMQShortString(name)); - } - - public AMQHeadersExchange(AMQShortString queueName) - { - super(queueName, ExchangeDefaults.HEADERS_EXCHANGE_CLASS, queueName, true, true, null); - } - - public boolean isNameRequired() - { - //Not sure what the best approach is here, probably to treat this like a topic - //and allow server to generate names. As it is AMQ specific it doesn't need to - //fit the JMS API expectations so this is not as yet critical. - return getAMQQueueName() == null; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQNoConsumersException.java b/java/client/src/main/java/org/apache/qpid/client/AMQNoConsumersException.java deleted file mode 100644 index 08867b5de7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQNoConsumersException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQUndeliveredException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQNoConsumersException indicates failure to pass an immediate message to a consumer. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represents failure to pass an immediate message to a consumer. - * <tr><td> - */ -public class AMQNoConsumersException extends AMQUndeliveredException -{ - public AMQNoConsumersException(String msg, Object bounced, Throwable cause) - { - super(AMQConstant.NO_CONSUMERS, msg, bounced, cause); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQNoRouteException.java b/java/client/src/main/java/org/apache/qpid/client/AMQNoRouteException.java deleted file mode 100644 index 42ed9c3df7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQNoRouteException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQUndeliveredException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQNoRouteException indicates that a mandatory message could not be routed. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represents failure to route a mandatory message. - * <tr><td> - */ -public class AMQNoRouteException extends AMQUndeliveredException -{ - public AMQNoRouteException(String msg, Object bounced, Throwable cause) - { - super(AMQConstant.NO_ROUTE, msg, bounced, cause); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQQueue.java b/java/client/src/main/java/org/apache/qpid/client/AMQQueue.java deleted file mode 100644 index 5bd1bd629a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQQueue.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.URISyntaxException; - -import javax.jms.Queue; - -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.url.BindingURL; - -public class AMQQueue extends AMQDestination implements Queue -{ - - public AMQQueue(String address) throws URISyntaxException - { - super(address); - } - - /** - * Create a reference to a non temporary queue using a BindingURL object. - * Note this does not actually imply the queue exists. - * @param binding a BindingURL object - */ - public AMQQueue(BindingURL binding) - { - super(binding); - } - - /** - * Create a reference to a non temporary queue. Note this does not actually imply the queue exists. - * @param name the name of the queue - */ - public AMQQueue(AMQShortString exchangeName, String name) - { - this(exchangeName, new AMQShortString(name)); - } - - - /** - * Create a reference to a non temporary queue. Note this does not actually imply the queue exists. - * @param name the name of the queue - */ - public AMQQueue(AMQShortString exchangeName, AMQShortString name) - { - this(exchangeName, name, false); - } - - public AMQQueue(AMQShortString exchangeName, AMQShortString routingKey, AMQShortString queueName) - { - super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, false, - false, queueName, false); - } - - public AMQQueue(AMQShortString exchangeName, AMQShortString routingKey, AMQShortString queueName,AMQShortString[] bindingKeys) - { - super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, false, - false, queueName, false,bindingKeys); - } - - /** - * Create a reference to a non temporary queue. Note this does not actually imply the queue exists. - * @param name the name of the queue - */ - public AMQQueue(String exchangeName, String name) - { - this(new AMQShortString(exchangeName), new AMQShortString(name), false); - } - - - public AMQQueue(AMQConnection connection, String name) - { - this(connection.getDefaultQueueExchangeName(),name); - } - - public AMQQueue(AMQConnection connection, String name, boolean temporary) - { - this(connection.getDefaultQueueExchangeName(), new AMQShortString(name),temporary); - } - - - /** - * Create a queue with a specified name. - * - * @param name the destination name (used in the routing key) - * @param temporary if true the broker will generate a queue name, also if true then the queue is autodeleted - * and exclusive - */ - public AMQQueue(String exchangeName, String name, boolean temporary) - { - this(new AMQShortString(exchangeName), new AMQShortString(name),temporary); - } - - - /** - * Create a queue with a specified name. - * - * @param name the destination name (used in the routing key) - * @param temporary if true the broker will generate a queue name, also if true then the queue is autodeleted - * and exclusive - */ - public AMQQueue(AMQShortString exchangeName, AMQShortString name, boolean temporary) - { - // queue name is set to null indicating that the broker assigns a name in the case of temporary queues - // temporary queues are typically used as response queues - this(exchangeName, name, temporary?null:name, temporary, temporary, !temporary); - - } - - /** - * Create a reference to a queue. Note this does not actually imply the queue exists. - * @param exchangeName the exchange name we want to send the message to - * @param routingKey the routing key - * @param queueName the queue name - * @param exclusive true if the queue should only permit a single consumer - * @param autoDelete true if the queue should be deleted automatically when the last consumers detaches - */ - public AMQQueue(AMQShortString exchangeName, AMQShortString routingKey, AMQShortString queueName, boolean exclusive, boolean autoDelete) - { - this(exchangeName, routingKey, queueName, exclusive, autoDelete, false); - } - - public AMQQueue(AMQShortString exchangeName, AMQShortString routingKey, AMQShortString queueName, boolean exclusive, boolean autoDelete, boolean durable) - { - this(exchangeName,routingKey,queueName,exclusive,autoDelete,durable,null); - } - - public AMQQueue(AMQShortString exchangeName, AMQShortString routingKey, AMQShortString queueName, boolean exclusive, boolean autoDelete, boolean durable,AMQShortString[] bindingKeys) - { - super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, exclusive, - autoDelete, queueName, durable, bindingKeys); - } - - public AMQShortString getRoutingKey() - { - //return getAMQQueueName(); - if (getAMQQueueName() != null && getAMQQueueName().equals(super.getRoutingKey())) - { - return getAMQQueueName(); - } - else - { - return super.getRoutingKey(); - } - } - - public boolean isNameRequired() - { - //If the name is null, we require one to be generated by the client so that it will# - //remain valid if we failover (see BLZ-24) - return getQueueName() == null; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java b/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java deleted file mode 100644 index d96544adf8..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jms.IllegalStateException; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Queue; -import javax.jms.QueueBrowser; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.concurrent.atomic.AtomicBoolean; - -public class AMQQueueBrowser implements QueueBrowser -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQQueueBrowser.class); - - private AtomicBoolean _isClosed = new AtomicBoolean(); - private final AMQSession _session; - private final AMQQueue _queue; - private final ArrayList<BasicMessageConsumer> _consumers = new ArrayList<BasicMessageConsumer>(); - private final String _messageSelector; - - AMQQueueBrowser(AMQSession session, AMQQueue queue, String messageSelector) throws JMSException - { - _session = session; - _queue = queue; - _messageSelector = ((messageSelector == null) || (messageSelector.trim().length() == 0)) ? null : messageSelector; - // Create Consumer to verify message selector. - BasicMessageConsumer consumer = - (BasicMessageConsumer) _session.createBrowserConsumer(_queue, _messageSelector, false); - // Close this consumer as we are not looking to consume only to establish that, at least for now, - // the QB can be created - consumer.close(); - } - - public Queue getQueue() throws JMSException - { - checkState(); - - return _queue; - } - - private void checkState() throws JMSException - { - if (_isClosed.get()) - { - throw new IllegalStateException("Queue Browser"); - } - - if (_session.isClosed()) - { - throw new IllegalStateException("Session is closed"); - } - - } - - public String getMessageSelector() throws JMSException - { - - checkState(); - - return _messageSelector; - } - - public Enumeration getEnumeration() throws JMSException - { - checkState(); - final BasicMessageConsumer consumer = - (BasicMessageConsumer) _session.createBrowserConsumer(_queue, _messageSelector, false); - - _consumers.add(consumer); - - return new QueueBrowserEnumeration(consumer); - } - - public void close() throws JMSException - { - for (BasicMessageConsumer consumer : _consumers) - { - consumer.close(); - } - - _consumers.clear(); - } - - private class QueueBrowserEnumeration implements Enumeration - { - Message _nextMessage; - private BasicMessageConsumer _consumer; - - public QueueBrowserEnumeration(BasicMessageConsumer consumer) throws JMSException - { - _nextMessage = consumer == null ? null : consumer.receiveBrowse(); - _logger.info("QB:created with first element:" + _nextMessage); - _consumer = consumer; - } - - public boolean hasMoreElements() - { - _logger.info("QB:hasMoreElements:" + (_nextMessage != null)); - return (_nextMessage != null); - } - - public Object nextElement() - { - Message msg = _nextMessage; - try - { - _logger.info("QB:nextElement about to receive"); - _nextMessage = _consumer.receiveBrowse(); - _logger.info("QB:nextElement received:" + _nextMessage); - } - catch (JMSException e) - { - _logger.warn("Exception caught while queue browsing", e); - _nextMessage = null; - } - return msg; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQQueueSessionAdaptor.java b/java/client/src/main/java/org/apache/qpid/client/AMQQueueSessionAdaptor.java deleted file mode 100644 index a8c83d8868..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQQueueSessionAdaptor.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.Serializable; - -import javax.jms.BytesMessage; -import javax.jms.Destination; -import javax.jms.IllegalStateException; -import javax.jms.JMSException; -import javax.jms.MapMessage; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.ObjectMessage; -import javax.jms.Queue; -import javax.jms.QueueBrowser; -import javax.jms.QueueReceiver; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.Session; -import javax.jms.StreamMessage; -import javax.jms.TemporaryQueue; -import javax.jms.TemporaryTopic; -import javax.jms.TextMessage; -import javax.jms.Topic; -import javax.jms.TopicSubscriber; - -/** - * Need this adaptor class to conform to JMS spec and throw IllegalStateException - * from createDurableSubscriber, unsubscribe, createTopic & createTemporaryTopic - */ -public class AMQQueueSessionAdaptor implements QueueSession, AMQSessionAdapter -{ - //holds a session for delegation - protected final AMQSession _session; - - /** - * Construct an adaptor with a session to wrap - * @param session - */ - public AMQQueueSessionAdaptor(Session session) - { - _session = (AMQSession) session; - } - - public TemporaryQueue createTemporaryQueue() throws JMSException { - return _session.createTemporaryQueue(); - } - - public Queue createQueue(String string) throws JMSException { - return _session.createQueue(string); - } - - public QueueReceiver createReceiver(Queue queue) throws JMSException { - return _session.createReceiver(queue); - } - - public QueueReceiver createReceiver(Queue queue, String string) throws JMSException { - return _session.createReceiver(queue, string); - } - - public QueueSender createSender(Queue queue) throws JMSException { - return _session.createSender(queue); - } - - public QueueBrowser createBrowser(Queue queue) throws JMSException { - return _session.createBrowser(queue); - } - - public QueueBrowser createBrowser(Queue queue, String string) throws JMSException { - return _session.createBrowser(queue, string); - } - - public BytesMessage createBytesMessage() throws JMSException { - return _session.createBytesMessage(); - } - - public MapMessage createMapMessage() throws JMSException { - return _session.createMapMessage(); - } - - public Message createMessage() throws JMSException { - return _session.createMessage(); - } - - public ObjectMessage createObjectMessage() throws JMSException { - return _session.createObjectMessage(); - } - - public ObjectMessage createObjectMessage(Serializable serializable) throws JMSException { - return _session.createObjectMessage(serializable); - } - - public StreamMessage createStreamMessage() throws JMSException { - return _session.createStreamMessage(); - } - - public TextMessage createTextMessage() throws JMSException { - return _session.createTextMessage(); - } - - public TextMessage createTextMessage(String string) throws JMSException { - return _session.createTextMessage(string); - } - - public boolean getTransacted() throws JMSException { - return _session.getTransacted(); - } - - public int getAcknowledgeMode() throws JMSException { - return _session.getAcknowledgeMode(); - } - - public void commit() throws JMSException { - _session.commit(); - } - - public void rollback() throws JMSException { - _session.rollback(); - } - - public void close() throws JMSException { - _session.close(); - } - - public void recover() throws JMSException { - _session.recover(); - } - - public MessageListener getMessageListener() throws JMSException { - return _session.getMessageListener(); - } - - public void setMessageListener(MessageListener messageListener) throws JMSException { - _session.setMessageListener(messageListener); - } - - public void run() { - _session.run(); - } - - public MessageProducer createProducer(Destination destination) throws JMSException { - return _session.createProducer(destination); - } - - public MessageConsumer createConsumer(Destination destination) throws JMSException { - return _session.createConsumer(destination); - } - - public MessageConsumer createConsumer(Destination destination, String string) throws JMSException { - return _session.createConsumer(destination,string); - } - - public MessageConsumer createConsumer(Destination destination, String string, boolean b) throws JMSException { - return _session.createConsumer(destination,string,b); - } - - //The following methods cannot be called from a QueueSession as per JMS spec - - public Topic createTopic(String string) throws JMSException { - throw new IllegalStateException("Cannot call createTopic from QueueSession"); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String string) throws JMSException { - throw new IllegalStateException("Cannot call createDurableSubscriber from QueueSession"); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String string, String string1, boolean b) throws JMSException { - throw new IllegalStateException("Cannot call createDurableSubscriber from QueueSession"); - } - - public TemporaryTopic createTemporaryTopic() throws JMSException { - throw new IllegalStateException("Cannot call createTemporaryTopic from QueueSession"); - } - - public void unsubscribe(String string) throws JMSException { - throw new IllegalStateException("Cannot call unsubscribe from QueueSession"); - } - - public AMQSession getSession() - { - return _session; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java deleted file mode 100644 index 25562cfff7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java +++ /dev/null @@ -1,3489 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.Serializable; -import java.net.URISyntaxException; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import javax.jms.BytesMessage; -import javax.jms.Destination; -import javax.jms.IllegalStateException; -import javax.jms.InvalidDestinationException; -import javax.jms.InvalidSelectorException; -import javax.jms.JMSException; -import javax.jms.MapMessage; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.ObjectMessage; -import javax.jms.Queue; -import javax.jms.QueueBrowser; -import javax.jms.QueueReceiver; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.StreamMessage; -import javax.jms.TemporaryQueue; -import javax.jms.TemporaryTopic; -import javax.jms.TextMessage; -import javax.jms.Topic; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; -import javax.jms.TopicSubscriber; -import javax.jms.TransactionRolledBackException; - -import org.apache.qpid.AMQChannelClosedException; -import org.apache.qpid.AMQDisconnectedException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInvalidArgumentException; -import org.apache.qpid.AMQInvalidRoutingKeyException; -import org.apache.qpid.client.AMQDestination.AddressOption; -import org.apache.qpid.client.AMQDestination.DestSyntax; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverNoopSupport; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.client.failover.FailoverRetrySupport; -import org.apache.qpid.client.message.AMQMessageDelegateFactory; -import org.apache.qpid.client.message.AMQPEncodedMapMessage; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.client.message.CloseConsumerMessage; -import org.apache.qpid.client.message.JMSBytesMessage; -import org.apache.qpid.client.message.JMSMapMessage; -import org.apache.qpid.client.message.JMSObjectMessage; -import org.apache.qpid.client.message.JMSStreamMessage; -import org.apache.qpid.client.message.JMSTextMessage; -import org.apache.qpid.client.message.MessageFactoryRegistry; -import org.apache.qpid.client.message.UnprocessedMessage; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.util.FlowControllingBlockingQueue; -import org.apache.qpid.common.AMQPFilterTypes; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; -import org.apache.qpid.framing.MethodRegistry; -import org.apache.qpid.jms.Session; -import org.apache.qpid.thread.Threading; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> - * </table> - * - * @todo Different FailoverSupport implementation are needed on the same method call, in different situations. For - * example, when failing-over and reestablishing the bindings, the bind cannot be interrupted by a second - * fail-over, if it fails with an exception, the fail-over process should also fail. When binding outside of - * the fail-over process, the retry handler could be used to automatically retry the operation once the connection - * has been reestablished. All fail-over protected operations should be placed in private methods, with - * FailoverSupport passed in by the caller to provide the correct support for the calling context. Sometimes the - * fail-over process sets a nowait flag and uses an async method call instead. - * @todo Two new objects created on every failover supported method call. Consider more efficient ways of doing this, - * after looking at worse bottlenecks first. - */ -public abstract class AMQSession<C extends BasicMessageConsumer, P extends BasicMessageProducer> extends Closeable implements Session, QueueSession, TopicSession -{ - public static final class IdToConsumerMap<C extends BasicMessageConsumer> - { - private final BasicMessageConsumer[] _fastAccessConsumers = new BasicMessageConsumer[16]; - private final ConcurrentHashMap<Integer, C> _slowAccessConsumers = new ConcurrentHashMap<Integer, C>(); - - public C get(int id) - { - if ((id & 0xFFFFFFF0) == 0) - { - return (C) _fastAccessConsumers[id]; - } - else - { - return _slowAccessConsumers.get(id); - } - } - - public C put(int id, C consumer) - { - C oldVal; - if ((id & 0xFFFFFFF0) == 0) - { - oldVal = (C) _fastAccessConsumers[id]; - _fastAccessConsumers[id] = consumer; - } - else - { - oldVal = _slowAccessConsumers.put(id, consumer); - } - - return oldVal; - - } - - public C remove(int id) - { - C consumer; - if ((id & 0xFFFFFFF0) == 0) - { - consumer = (C) _fastAccessConsumers[id]; - _fastAccessConsumers[id] = null; - } - else - { - consumer = _slowAccessConsumers.remove(id); - } - - return consumer; - - } - - public Collection<C> values() - { - ArrayList<C> values = new ArrayList<C>(); - - for (int i = 0; i < 16; i++) - { - if (_fastAccessConsumers[i] != null) - { - values.add((C) _fastAccessConsumers[i]); - } - } - values.addAll(_slowAccessConsumers.values()); - - return values; - } - - public void clear() - { - _slowAccessConsumers.clear(); - for (int i = 0; i < 16; i++) - { - _fastAccessConsumers[i] = null; - } - } - } - - final AMQSession<C, P> _thisSession = this; - - /** Used for debugging. */ - private static final Logger _logger = LoggerFactory.getLogger(AMQSession.class); - - /** - * The default value for immediate flag used by producers created by this session is false. That is, a consumer does - * not need to be attached to a queue. - */ - protected final boolean DEFAULT_IMMEDIATE = Boolean.parseBoolean(System.getProperty("qpid.default_immediate", "false")); - - /** - * The default value for mandatory flag used by producers created by this session is true. That is, server will not - * silently drop messages where no queue is connected to the exchange for the message. - */ - protected final boolean DEFAULT_MANDATORY = Boolean.parseBoolean(System.getProperty("qpid.default_mandatory", "true")); - - protected final boolean DEFAULT_WAIT_ON_SEND = Boolean.parseBoolean(System.getProperty("qpid.default_wait_on_send", "false")); - - /** - * The period to wait while flow controlled before sending a log message confirming that the session is still - * waiting on flow control being revoked - */ - protected final long FLOW_CONTROL_WAIT_PERIOD = Long.getLong("qpid.flow_control_wait_notify_period",5000L); - - /** - * The period to wait while flow controlled before declaring a failure - */ - public static final long DEFAULT_FLOW_CONTROL_WAIT_FAILURE = 120000L; - protected final long FLOW_CONTROL_WAIT_FAILURE = Long.getLong("qpid.flow_control_wait_failure", - DEFAULT_FLOW_CONTROL_WAIT_FAILURE); - - protected final boolean DECLARE_QUEUES = - Boolean.parseBoolean(System.getProperty("qpid.declare_queues", "true")); - - protected final boolean DECLARE_EXCHANGES = - Boolean.parseBoolean(System.getProperty("qpid.declare_exchanges", "true")); - - protected final boolean USE_AMQP_ENCODED_MAP_MESSAGE; - - /** System property to enable strict AMQP compliance. */ - public static final String STRICT_AMQP = "STRICT_AMQP"; - - /** Strict AMQP default setting. */ - public static final String STRICT_AMQP_DEFAULT = "false"; - - /** System property to enable failure if strict AMQP compliance is violated. */ - public static final String STRICT_AMQP_FATAL = "STRICT_AMQP_FATAL"; - - /** Strickt AMQP failure default. */ - public static final String STRICT_AMQP_FATAL_DEFAULT = "true"; - - /** System property to enable immediate message prefetching. */ - public static final String IMMEDIATE_PREFETCH = "IMMEDIATE_PREFETCH"; - - /** Immediate message prefetch default. */ - public static final String IMMEDIATE_PREFETCH_DEFAULT = "false"; - - /** The connection to which this session belongs. */ - protected AMQConnection _connection; - - /** Used to indicate whether or not this is a transactional session. */ - protected boolean _transacted; - - /** Holds the sessions acknowledgement mode. */ - protected final int _acknowledgeMode; - - /** Holds this session unique identifier, used to distinguish it from other sessions. */ - protected int _channelId; - - private int _ticket; - - /** Holds the high mark for prefetched message, at which the session is suspended. */ - private int _prefetchHighMark; - - /** Holds the low mark for prefetched messages, below which the session is resumed. */ - private int _prefetchLowMark; - - /** Holds the message listener, if any, which is attached to this session. */ - private MessageListener _messageListener = null; - - /** Used to indicate that this session has been started at least once. */ - private AtomicBoolean _startedAtLeastOnce = new AtomicBoolean(false); - - /** - * Used to reference durable subscribers so that requests for unsubscribe can be handled correctly. Note this only - * keeps a record of subscriptions which have been created in the current instance. It does not remember - * subscriptions between executions of the client. - */ - protected final ConcurrentHashMap<String, TopicSubscriberAdaptor<C>> _subscriptions = - new ConcurrentHashMap<String, TopicSubscriberAdaptor<C>>(); - - /** - * Holds a mapping from message consumers to their identifying names, so that their subscriptions may be looked - * up in the {@link #_subscriptions} map. - */ - protected final ConcurrentHashMap<C, String> _reverseSubscriptionMap = new ConcurrentHashMap<C, String>(); - - /** - * Locks to keep access to subscriber details atomic. - * <p> - * Added for QPID2418 - */ - protected final Lock _subscriberDetails = new ReentrantLock(true); - protected final Lock _subscriberAccess = new ReentrantLock(true); - - /** - * Used to hold incoming messages. - * - * @todo Weaken the type once {@link FlowControllingBlockingQueue} implements Queue. - */ - protected final FlowControllingBlockingQueue _queue; - - /** Holds the highest received delivery tag. */ - private final AtomicLong _highestDeliveryTag = new AtomicLong(-1); - private final AtomicLong _rollbackMark = new AtomicLong(-1); - - /** All the not yet acknowledged message tags */ - protected ConcurrentLinkedQueue<Long> _unacknowledgedMessageTags = new ConcurrentLinkedQueue<Long>(); - - /** All the delivered message tags */ - protected ConcurrentLinkedQueue<Long> _deliveredMessageTags = new ConcurrentLinkedQueue<Long>(); - - /** Holds the dispatcher thread for this session. */ - protected Dispatcher _dispatcher; - - protected Thread _dispatcherThread; - - /** Holds the message factory factory for this session. */ - protected MessageFactoryRegistry _messageFactoryRegistry; - - /** Holds all of the producers created by this session, keyed by their unique identifiers. */ - private Map<Long, MessageProducer> _producers = new ConcurrentHashMap<Long, MessageProducer>(); - - /** - * Used as a source of unique identifiers so that the consumers can be tagged to match them to BasicConsume - * methods. - */ - private int _nextTag = 1; - - /** - * Maps from identifying tags to message consumers, in order to pass dispatch incoming messages to the right - * consumer. - */ - protected final IdToConsumerMap<C> _consumers = new IdToConsumerMap<C>(); - - /** - * Contains a list of consumers which have been removed but which might still have - * messages to acknowledge, eg in client ack or transacted modes - */ - private CopyOnWriteArrayList<C> _removedConsumers = new CopyOnWriteArrayList<C>(); - - /** Provides a count of consumers on destinations, in order to be able to know if a destination has consumers. */ - private ConcurrentHashMap<Destination, AtomicInteger> _destinationConsumerCount = - new ConcurrentHashMap<Destination, AtomicInteger>(); - - /** - * Used as a source of unique identifiers for producers within the session. - * - * <p/> Access to this id does not require to be synchronized since according to the JMS specification only one - * thread of control is allowed to create producers for any given session instance. - */ - private long _nextProducerId; - - /** - * Set when recover is called. This is to handle the case where recover() is called by application code during - * onMessage() processing to ensure that an auto ack is not sent. - */ - private boolean _inRecovery; - - /** Used to indicates that the connection to which this session belongs, has been stopped. */ - private boolean _connectionStopped; - - /** Used to indicate that this session has a message listener attached to it. */ - private boolean _hasMessageListeners; - - /** Used to indicate that this session has been suspended. */ - private boolean _suspended; - - /** - * Used to protect the suspension of this session, so that critical code can be executed during suspension, - * without the session being resumed by other threads. - */ - private final Object _suspensionLock = new Object(); - - /** - * Used to ensure that only the first call to start the dispatcher can unsuspend the channel. - * - * @todo This is accessed only within a synchronized method, so does not need to be atomic. - */ - protected final AtomicBoolean _firstDispatcher = new AtomicBoolean(true); - - /** Used to indicate that the session should start pre-fetching messages as soon as it is started. */ - protected final boolean _immediatePrefetch; - - /** Indicates that warnings should be generated on violations of the strict AMQP. */ - protected final boolean _strictAMQP; - - /** Indicates that runtime exceptions should be generated on vilations of the strict AMQP. */ - protected final boolean _strictAMQPFATAL; - private final Object _messageDeliveryLock = new Object(); - - /** Session state : used to detect if commit is a) required b) allowed , i.e. does the tx span failover. */ - private boolean _dirty; - /** Has failover occured on this session with outstanding actions to commit? */ - private boolean _failedOverDirty; - - private static final class FlowControlIndicator - { - private volatile boolean _flowControl = true; - - public synchronized void setFlowControl(boolean flowControl) - { - _flowControl = flowControl; - notify(); - } - - public boolean getFlowControl() - { - return _flowControl; - } - } - - /** Flow control */ - private FlowControlIndicator _flowControl = new FlowControlIndicator(); - - /** - * Creates a new session on a connection. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknowledgement mode for the session. - * @param messageFactoryRegistry The message factory factory for the session. - * @param defaultPrefetchHighMark The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLowMark The number of prefetched messages at which to resume the session. - */ - protected AMQSession(AMQConnection con, int channelId, boolean transacted, int acknowledgeMode, - MessageFactoryRegistry messageFactoryRegistry, int defaultPrefetchHighMark, int defaultPrefetchLowMark) - { - USE_AMQP_ENCODED_MAP_MESSAGE = con == null ? true : !con.isUseLegacyMapMessageFormat(); - _strictAMQP = Boolean.parseBoolean(System.getProperties().getProperty(STRICT_AMQP, STRICT_AMQP_DEFAULT)); - _strictAMQPFATAL = - Boolean.parseBoolean(System.getProperties().getProperty(STRICT_AMQP_FATAL, STRICT_AMQP_FATAL_DEFAULT)); - _immediatePrefetch = - _strictAMQP - || Boolean.parseBoolean(System.getProperties().getProperty(IMMEDIATE_PREFETCH, IMMEDIATE_PREFETCH_DEFAULT)); - - _connection = con; - _transacted = transacted; - if (transacted) - { - _acknowledgeMode = javax.jms.Session.SESSION_TRANSACTED; - } - else - { - _acknowledgeMode = acknowledgeMode; - } - - _channelId = channelId; - _messageFactoryRegistry = messageFactoryRegistry; - _prefetchHighMark = defaultPrefetchHighMark; - _prefetchLowMark = defaultPrefetchLowMark; - - if (_acknowledgeMode == NO_ACKNOWLEDGE) - { - _queue = - new FlowControllingBlockingQueue(_prefetchHighMark, _prefetchLowMark, - new FlowControllingBlockingQueue.ThresholdListener() - { - private final AtomicBoolean _suspendState = new AtomicBoolean(); - - public void aboveThreshold(int currentValue) - { - // If the session has been closed don't waste time creating a thread to do - // flow control - if (!(_thisSession.isClosed() || _thisSession.isClosing())) - { - // Only execute change if previous state - // was False - if (!_suspendState.getAndSet(true)) - { - if (_logger.isDebugEnabled()) - { - _logger.debug( - "Above threshold(" + _prefetchHighMark - + ") so suspending channel. Current value is " + currentValue); - } - try - { - Threading.getThreadFactory().createThread(new SuspenderRunner(_suspendState)).start(); - } - catch (Exception e) - { - throw new RuntimeException("Failed to create thread", e); - } - } - } - } - - public void underThreshold(int currentValue) - { - // If the session has been closed don't waste time creating a thread to do - // flow control - if (!(_thisSession.isClosed() || _thisSession.isClosing())) - { - // Only execute change if previous state - // was true - if (_suspendState.getAndSet(false)) - { - if (_logger.isDebugEnabled()) - { - - _logger.debug( - "Below threshold(" + _prefetchLowMark - + ") so unsuspending channel. Current value is " + currentValue); - } - try - { - Threading.getThreadFactory().createThread(new SuspenderRunner(_suspendState)).start(); - } - catch (Exception e) - { - throw new RuntimeException("Failed to create thread", e); - } - } - } - } - }); - } - else - { - _queue = new FlowControllingBlockingQueue(_prefetchHighMark, null); - } - - // Add creation logging to tie in with the existing close logging - if (_logger.isInfoEnabled()) - { - _logger.info("Created session:" + this); - } - } - - /** - * Creates a new session on a connection with the default message factory factory. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknowledgement mode for the session. - * @param defaultPrefetchHigh The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLow The number of prefetched messages at which to resume the session. - */ - AMQSession(AMQConnection con, int channelId, boolean transacted, int acknowledgeMode, int defaultPrefetchHigh, - int defaultPrefetchLow) - { - this(con, channelId, transacted, acknowledgeMode, MessageFactoryRegistry.newDefaultRegistry(), defaultPrefetchHigh, - defaultPrefetchLow); - } - - // ===== JMS Session methods. - - /** - * Closes the session with no timeout. - * - * @throws JMSException If the JMS provider fails to close the session due to some internal error. - */ - public void close() throws JMSException - { - close(-1); - } - - public abstract AMQException getLastException(); - - public void checkNotClosed() throws JMSException - { - try - { - super.checkNotClosed(); - } - catch (IllegalStateException ise) - { - AMQException ex = getLastException(); - if (ex != null) - { - IllegalStateException ssnClosed = new IllegalStateException( - "Session has been closed", ex.getErrorCode().toString()); - - ssnClosed.setLinkedException(ex); - ssnClosed.initCause(ex); - throw ssnClosed; - } - else - { - throw ise; - } - } - } - - public BytesMessage createBytesMessage() throws JMSException - { - checkNotClosed(); - JMSBytesMessage msg = new JMSBytesMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - - /** - * Acknowledges all unacknowledged messages on the session, for all message consumers on the session. - * - * @throws IllegalStateException If the session is closed. - */ - public void acknowledge() throws IllegalStateException - { - if (isClosed()) - { - throw new IllegalStateException("Session is already closed"); - } - else if (hasFailedOver()) - { - throw new IllegalStateException("has failed over"); - } - - while (true) - { - Long tag = _unacknowledgedMessageTags.poll(); - if (tag == null) - { - break; - } - acknowledgeMessage(tag, false); - } - } - - /** - * Acknowledge one or many messages. - * - * @param deliveryTag The tag of the last message to be acknowledged. - * @param multiple <tt>true</tt> to acknowledge all messages up to and including the one specified by the - * delivery tag, <tt>false</tt> to just acknowledge that message. - * - * @todo Be aware of possible changes to parameter order as versions change. - */ - public abstract void acknowledgeMessage(long deliveryTag, boolean multiple); - - public MethodRegistry getMethodRegistry() - { - MethodRegistry methodRegistry = getProtocolHandler().getMethodRegistry(); - return methodRegistry; - } - - /** - * Binds the named queue, with the specified routing key, to the named exchange. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param queueName The name of the queue to bind. - * @param routingKey The routing key to bind the queue with. - * @param arguments Additional arguments. - * @param exchangeName The exchange to bind the queue on. - * - * @throws AMQException If the queue cannot be bound for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - * @todo Document the additional arguments that may be passed in the field table. Are these for headers exchanges? - */ - public void bindQueue(final AMQShortString queueName, final AMQShortString routingKey, final FieldTable arguments, - final AMQShortString exchangeName, final AMQDestination destination) throws AMQException - { - bindQueue(queueName, routingKey, arguments, exchangeName, destination, false); - } - - public void bindQueue(final AMQShortString queueName, final AMQShortString routingKey, final FieldTable arguments, - final AMQShortString exchangeName, final AMQDestination destination, - final boolean nowait) throws AMQException - { - /*new FailoverRetrySupport<Object, AMQException>(new FailoverProtectedOperation<Object, AMQException>()*/ - new FailoverNoopSupport<Object, AMQException>(new FailoverProtectedOperation<Object, AMQException>() - { - public Object execute() throws AMQException, FailoverException - { - sendQueueBind(queueName, routingKey, arguments, exchangeName, destination, nowait); - return null; - } - }, _connection).execute(); - } - - public void addBindingKey(C consumer, AMQDestination amqd, String routingKey) throws AMQException - { - if (consumer.getQueuename() != null) - { - bindQueue(consumer.getQueuename(), new AMQShortString(routingKey), new FieldTable(), amqd.getExchangeName(), amqd); - } - } - - public abstract void sendQueueBind(final AMQShortString queueName, final AMQShortString routingKey, final FieldTable arguments, - final AMQShortString exchangeName, AMQDestination destination, - final boolean nowait) throws AMQException, FailoverException; - - /** - * Closes the session. - * - * <p/>Note that this operation succeeds automatically if a fail-over interrupts the synchronous request to close - * the channel. This is because the channel is marked as closed before the request to close it is made, so the - * fail-over should not re-open it. - * - * @param timeout The timeout in milliseconds to wait for the session close acknowledgement from the broker. - * - * @throws JMSException If the JMS provider fails to close the session due to some internal error. - * @todo Be aware of possible changes to parameter order as versions change. - * @todo Not certain about the logic of ignoring the failover exception, because the channel won't be - * re-opened. May need to examine this more carefully. - * @todo Note that taking the failover mutex doesn't prevent this operation being interrupted by a failover, - * because the failover process sends the failover event before acquiring the mutex itself. - */ - public void close(long timeout) throws JMSException - { - close(timeout, true); - } - - private void close(long timeout, boolean sendClose) throws JMSException - { - if (_logger.isInfoEnabled()) - { - // StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - _logger.info("Closing session: " + this); // + ":" - // Arrays.asList(stackTrace).subList(3, stackTrace.length - 1)); - } - - // Ensure we only try and close an open session. - if (!_closed.getAndSet(true)) - { - _closing.set(true); - synchronized (getFailoverMutex()) - { - // We must close down all producers and consumers in an orderly fashion. This is the only method - // that can be called from a different thread of control from the one controlling the session. - synchronized (_messageDeliveryLock) - { - // we pass null since this is not an error case - closeProducersAndConsumers(null); - - try - { - // If the connection is open or we are in the process - // of closing the connection then send a cance - // no point otherwise as the connection will be gone - if (!_connection.isClosed() || _connection.isClosing()) - { - if (sendClose) - { - sendClose(timeout); - } - } - } - catch (AMQException e) - { - JMSException jmse = new JMSException("Error closing session: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - // This is ignored because the channel is already marked as closed so the fail-over process will - // not re-open it. - catch (FailoverException e) - { - _logger.debug( - "Got FailoverException during channel close, ignored as channel already marked as closed."); - } - finally - { - _connection.deregisterSession(_channelId); - } - } - } - } - } - - public abstract void sendClose(long timeout) throws AMQException, FailoverException; - - /** - * Called when the server initiates the closure of the session unilaterally. - * - * @param e the exception that caused this session to be closed. Null causes the - */ - public void closed(Throwable e) throws JMSException - { - // This method needs to be improved. Throwables only arrive here from the mina : exceptionRecived - // calls through connection.closeAllSessions which is also called by the public connection.close() - // with a null cause - // When we are closing the Session due to a protocol session error we simply create a new AMQException - // with the correct error code and text this is cleary WRONG as the instanceof check below will fail. - // We need to determin here if the connection should be - - if (e instanceof AMQDisconnectedException) - { - if (_dispatcher != null) - { - // Failover failed and ain't coming back. Knife the dispatcher. - _dispatcherThread.interrupt(); - } - - } - - //if we don't have an exception then we can perform closing operations - _closing.set(e == null); - - if (!_closed.getAndSet(true)) - { - synchronized (_messageDeliveryLock) - { - // An AMQException has an error code and message already and will be passed in when closure occurs as a - // result of a channel close request - AMQException amqe; - if (e instanceof AMQException) - { - amqe = (AMQException) e; - } - else - { - amqe = new AMQException("Closing session forcibly", e); - } - - _connection.deregisterSession(_channelId); - closeProducersAndConsumers(amqe); - } - } - } - - /** - * Commits all messages done in this transaction and releases any locks currently held. - * - * <p/>If the commit fails, because the commit itself is interrupted by a fail-over between requesting that the - * commit be done, and receiving an acknowledgement that it has been done, then a JMSException will be thrown. - * The client will be unable to determine whether or not the commit actually happened on the broker in this case. - * - * @throws JMSException If the JMS provider fails to commit the transaction due to some internal error. This does - * not mean that the commit is known to have failed, merely that it is not known whether it - * failed or not. - * @todo Be aware of possible changes to parameter order as versions change. - */ - public void commit() throws JMSException - { - checkTransacted(); - - try - { - //Check that we are clean to commit. - if (_failedOverDirty) - { - rollback(); - - throw new TransactionRolledBackException("Connection failover has occured since last send. " + - "Forced rollback"); - } - - - // Acknowledge all delivered messages - while (true) - { - Long tag = _deliveredMessageTags.poll(); - if (tag == null) - { - break; - } - - acknowledgeMessage(tag, false); - } - // Commits outstanding messages and acknowledgments - sendCommit(); - markClean(); - } - catch (AMQException e) - { - throw new JMSAMQException("Failed to commit: " + e.getMessage() + ":" + e.getCause(), e); - } - catch (FailoverException e) - { - throw new JMSAMQException("Fail-over interrupted commit. Status of the commit is uncertain.", e); - } - } - - public abstract void sendCommit() throws AMQException, FailoverException; - - - public void confirmConsumerCancelled(int consumerTag) - { - - // Remove the consumer from the map - C consumer = _consumers.get(consumerTag); - if (consumer != null) - { - if (!consumer.isNoConsume()) // Normal Consumer - { - // Clean the Maps up first - // Flush any pending messages for this consumerTag - if (_dispatcher != null) - { - _logger.info("Dispatcher is not null"); - } - else - { - _logger.info("Dispatcher is null so created stopped dispatcher"); - startDispatcherIfNecessary(true); - } - - _dispatcher.rejectPending(consumer); - } - else // Queue Browser - { - // Just close the consumer - // fixme the CancelOK is being processed before the arriving messages.. - // The dispatcher is still to process them so the server sent in order but the client - // has yet to receive before the close comes in. - - // consumer.markClosed(); - - if (consumer.isAutoClose()) - { - // There is a small window where the message is between the two queues in the dispatcher. - if (consumer.isClosed()) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Closing consumer:" + consumer.debugIdentity()); - } - - deregisterConsumer(consumer); - } - else - { - _queue.add(new CloseConsumerMessage(consumer)); - } - } - } - } - } - - public QueueBrowser createBrowser(Queue queue) throws JMSException - { - if (isStrictAMQP()) - { - throw new UnsupportedOperationException(); - } - - return createBrowser(queue, null); - } - - public QueueBrowser createBrowser(Queue queue, String messageSelector) throws JMSException - { - if (isStrictAMQP()) - { - throw new UnsupportedOperationException(); - } - - checkNotClosed(); - checkValidQueue(queue); - - return new AMQQueueBrowser(this, (AMQQueue) queue, messageSelector); - } - - public MessageConsumer createBrowserConsumer(Destination destination, String messageSelector, boolean noLocal) - throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, noLocal, false, - messageSelector, null, true, true); - } - - public MessageConsumer createConsumer(Destination destination) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, false, (destination instanceof Topic), null, null, - ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public C createExclusiveConsumer(Destination destination) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, false, true, null, null, - ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createConsumer(Destination destination, String messageSelector) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, false, (destination instanceof Topic), - messageSelector, null, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createConsumer(Destination destination, String messageSelector, boolean noLocal) - throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, noLocal, (destination instanceof Topic), - messageSelector, null, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createExclusiveConsumer(Destination destination, String messageSelector, boolean noLocal) - throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, _prefetchHighMark, _prefetchLowMark, noLocal, true, - messageSelector, null, false, false); - } - - public MessageConsumer createConsumer(Destination destination, int prefetch, boolean noLocal, boolean exclusive, - String selector) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, prefetch, prefetch / 2, noLocal, exclusive, selector, null, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createConsumer(Destination destination, int prefetchHigh, int prefetchLow, boolean noLocal, - boolean exclusive, String selector) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, prefetchHigh, prefetchLow, noLocal, exclusive, selector, null, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createConsumer(Destination destination, int prefetch, boolean noLocal, boolean exclusive, - String selector, FieldTable rawSelector) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, prefetch, prefetch / 2, noLocal, exclusive, selector, rawSelector, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), false); - } - - public MessageConsumer createConsumer(Destination destination, int prefetchHigh, int prefetchLow, boolean noLocal, - boolean exclusive, String selector, FieldTable rawSelector) throws JMSException - { - checkValidDestination(destination); - - return createConsumerImpl(destination, prefetchHigh, prefetchLow, noLocal, exclusive, selector, rawSelector, ((destination instanceof AMQDestination) && ((AMQDestination)destination).isBrowseOnly()), - false); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String name) throws JMSException - { - // Delegate the work to the {@link #createDurableSubscriber(Topic, String, String, boolean)} method - return createDurableSubscriber(topic, name, null, false); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String name, String selector, boolean noLocal) - throws JMSException - { - checkNotClosed(); - Topic origTopic = checkValidTopic(topic, true); - - AMQTopic dest = AMQTopic.createDurableTopic(origTopic, name, _connection); - if (dest.getDestSyntax() == DestSyntax.ADDR && - !dest.isAddressResolved()) - { - try - { - handleAddressBasedDestination(dest,false,true); - if (dest.getAddressType() != AMQDestination.TOPIC_TYPE) - { - throw new JMSException("Durable subscribers can only be created for Topics"); - } - dest.getSourceNode().setDurable(true); - } - catch(AMQException e) - { - JMSException ex = new JMSException("Error when verifying destination"); - ex.initCause(e); - ex.setLinkedException(e); - throw ex; - } - } - - String messageSelector = ((selector == null) || (selector.trim().length() == 0)) ? null : selector; - - _subscriberDetails.lock(); - try - { - TopicSubscriberAdaptor<C> subscriber = _subscriptions.get(name); - - // Not subscribed to this name in the current session - if (subscriber == null) - { - // After the address is resolved routing key will not be null. - AMQShortString topicName = dest.getRoutingKey(); - - if (_strictAMQP) - { - if (_strictAMQPFATAL) - { - throw new UnsupportedOperationException("JMS Durable not currently supported by AMQP."); - } - else - { - _logger.warn("Unable to determine if subscription already exists for '" + topicName - + "' for creation durableSubscriber. Requesting queue deletion regardless."); - } - - deleteQueue(dest.getAMQQueueName()); - } - else - { - Map<String,Object> args = new HashMap<String,Object>(); - - // We must always send the selector argument even if empty, so that we can tell when a selector is removed from a - // durable topic subscription that the broker arguments don't match any more. This is because it is not otherwise - // possible to determine when querying the broker whether there are no arguments or just a non-matching selector - // argument, as specifying null for the arguments when querying means they should not be checked at all - args.put(AMQPFilterTypes.JMS_SELECTOR.getValue().toString(), messageSelector == null ? "" : messageSelector); - - // if the queue is bound to the exchange but NOT for this topic and selector, then the JMS spec - // says we must trash the subscription. - boolean isQueueBound = isQueueBound(dest.getExchangeName(), dest.getAMQQueueName()); - boolean isQueueBoundForTopicAndSelector = - isQueueBound(dest.getExchangeName().asString(), dest.getAMQQueueName().asString(), topicName.asString(), args); - - if (isQueueBound && !isQueueBoundForTopicAndSelector) - { - deleteQueue(dest.getAMQQueueName()); - } - } - } - else - { - // Subscribed with the same topic and no current / previous or same selector - if (subscriber.getTopic().equals(topic) - && ((messageSelector == null && subscriber.getMessageSelector() == null) - || (messageSelector != null && messageSelector.equals(subscriber.getMessageSelector())))) - { - throw new IllegalStateException("Already subscribed to topic " + topic + " with subscription name " + name - + (messageSelector != null ? " and selector " + messageSelector : "")); - } - else - { - unsubscribe(name, true); - } - - } - - _subscriberAccess.lock(); - try - { - C consumer = (C) createConsumer(dest, messageSelector, noLocal); - subscriber = new TopicSubscriberAdaptor<C>(dest, consumer); - - // Save subscription information - _subscriptions.put(name, subscriber); - _reverseSubscriptionMap.put(subscriber.getMessageConsumer(), name); - } - finally - { - _subscriberAccess.unlock(); - } - - return subscriber; - } - finally - { - _subscriberDetails.unlock(); - } - } - - public MapMessage createMapMessage() throws JMSException - { - checkNotClosed(); - if (USE_AMQP_ENCODED_MAP_MESSAGE) - { - AMQPEncodedMapMessage msg = new AMQPEncodedMapMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - else - { - JMSMapMessage msg = new JMSMapMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - } - - public javax.jms.Message createMessage() throws JMSException - { - return createBytesMessage(); - } - - public ObjectMessage createObjectMessage() throws JMSException - { - checkNotClosed(); - JMSObjectMessage msg = new JMSObjectMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - - public ObjectMessage createObjectMessage(Serializable object) throws JMSException - { - ObjectMessage msg = createObjectMessage(); - msg.setObject(object); - - return msg; - } - - public P createProducer(Destination destination) throws JMSException - { - return createProducerImpl(destination, DEFAULT_MANDATORY, DEFAULT_IMMEDIATE); - } - - public P createProducer(Destination destination, boolean immediate) throws JMSException - { - return createProducerImpl(destination, DEFAULT_MANDATORY, immediate); - } - - public P createProducer(Destination destination, boolean mandatory, boolean immediate) - throws JMSException - { - return createProducerImpl(destination, mandatory, immediate); - } - - public P createProducer(Destination destination, boolean mandatory, boolean immediate, - boolean waitUntilSent) throws JMSException - { - return createProducerImpl(destination, mandatory, immediate, waitUntilSent); - } - - public TopicPublisher createPublisher(Topic topic) throws JMSException - { - checkNotClosed(); - - return new TopicPublisherAdapter((P) createProducer(topic, false, false), topic); - } - - public Queue createQueue(String queueName) throws JMSException - { - checkNotClosed(); - try - { - if (queueName.indexOf('/') == -1 && queueName.indexOf(';') == -1) - { - DestSyntax syntax = AMQDestination.getDestType(queueName); - if (syntax == AMQDestination.DestSyntax.BURL) - { - // For testing we may want to use the prefix - return new AMQQueue(getDefaultQueueExchangeName(), - new AMQShortString(AMQDestination.stripSyntaxPrefix(queueName))); - } - else - { - AMQQueue queue = new AMQQueue(queueName); - return queue; - - } - } - else - { - return new AMQQueue(queueName); - } - } - catch (URISyntaxException urlse) - { - _logger.error("", urlse); - JMSException jmse = new JMSException(urlse.getReason()); - jmse.setLinkedException(urlse); - jmse.initCause(urlse); - throw jmse; - } - - } - - /** - * Declares the named queue. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param name The name of the queue to declare. - * @param autoDelete - * @param durable Flag to indicate that the queue is durable. - * @param exclusive Flag to indicate that the queue is exclusive to this client. - * - * @throws AMQException If the queue cannot be declared for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - public void createQueue(final AMQShortString name, final boolean autoDelete, final boolean durable, - final boolean exclusive) throws AMQException - { - createQueue(name, autoDelete, durable, exclusive, null); - } - - /** - * Declares the named queue. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param name The name of the queue to declare. - * @param autoDelete - * @param durable Flag to indicate that the queue is durable. - * @param exclusive Flag to indicate that the queue is exclusive to this client. - * @param arguments Arguments used to set special properties of the queue - * - * @throws AMQException If the queue cannot be declared for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - public void createQueue(final AMQShortString name, final boolean autoDelete, final boolean durable, - final boolean exclusive, final Map<String, Object> arguments) throws AMQException - { - new FailoverRetrySupport<Object, AMQException>(new FailoverProtectedOperation<Object, AMQException>() - { - public Object execute() throws AMQException, FailoverException - { - sendCreateQueue(name, autoDelete, durable, exclusive, arguments); - return null; - } - }, _connection).execute(); - } - - public abstract void sendCreateQueue(AMQShortString name, final boolean autoDelete, final boolean durable, - final boolean exclusive, final Map<String, Object> arguments) throws AMQException, FailoverException; - - /** - * Creates a QueueReceiver - * - * @param destination - * - * @return QueueReceiver - a wrapper around our MessageConsumer - * - * @throws JMSException - */ - public QueueReceiver createQueueReceiver(Destination destination) throws JMSException - { - checkValidDestination(destination); - Queue dest = validateQueue(destination); - C consumer = (C) createConsumer(dest); - - return new QueueReceiverAdaptor(dest, consumer); - } - - /** - * Creates a QueueReceiver using a message selector - * - * @param destination - * @param messageSelector - * - * @return QueueReceiver - a wrapper around our MessageConsumer - * - * @throws JMSException - */ - public QueueReceiver createQueueReceiver(Destination destination, String messageSelector) throws JMSException - { - checkValidDestination(destination); - Queue dest = validateQueue(destination); - C consumer = (C) createConsumer(dest, messageSelector); - - return new QueueReceiverAdaptor(dest, consumer); - } - - /** - * Creates a QueueReceiver wrapping a MessageConsumer - * - * @param queue - * - * @return QueueReceiver - * - * @throws JMSException - */ - public QueueReceiver createReceiver(Queue queue) throws JMSException - { - checkNotClosed(); - Queue dest = validateQueue(queue); - C consumer = (C) createConsumer(dest); - - return new QueueReceiverAdaptor(dest, consumer); - } - - /** - * Creates a QueueReceiver wrapping a MessageConsumer using a message selector - * - * @param queue - * @param messageSelector - * - * @return QueueReceiver - * - * @throws JMSException - */ - public QueueReceiver createReceiver(Queue queue, String messageSelector) throws JMSException - { - checkNotClosed(); - Queue dest = validateQueue(queue); - C consumer = (C) createConsumer(dest, messageSelector); - - return new QueueReceiverAdaptor(dest, consumer); - } - - private Queue validateQueue(Destination dest) throws InvalidDestinationException - { - if (dest instanceof AMQDestination && dest instanceof javax.jms.Queue) - { - return (Queue)dest; - } - else - { - throw new InvalidDestinationException("The destination object used is not from this provider or of type javax.jms.Queue"); - } - } - - public QueueSender createSender(Queue queue) throws JMSException - { - checkNotClosed(); - - // return (QueueSender) createProducer(queue); - return new QueueSenderAdapter(createProducer(queue), queue); - } - - public StreamMessage createStreamMessage() throws JMSException - { - // This method needs to be improved. Throwables only arrive here from the mina : exceptionRecived - // calls through connection.closeAllSessions which is also called by the public connection.close() - // with a null cause - // When we are closing the Session due to a protocol session error we simply create a new AMQException - // with the correct error code and text this is cleary WRONG as the instanceof check below will fail. - // We need to determin here if the connection should be - - synchronized (getFailoverMutex()) - { - checkNotClosed(); - - JMSStreamMessage msg = new JMSStreamMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - } - - /** - * Creates a non-durable subscriber - * - * @param topic - * - * @return TopicSubscriber - a wrapper round our MessageConsumer - * - * @throws JMSException - */ - public TopicSubscriber createSubscriber(Topic topic) throws JMSException - { - checkNotClosed(); - Topic dest = checkValidTopic(topic); - - // AMQTopic dest = new AMQTopic(topic.getTopicName()); - return new TopicSubscriberAdaptor(dest, (C) createExclusiveConsumer(dest)); - } - - /** - * Creates a non-durable subscriber with a message selector - * - * @param topic - * @param messageSelector - * @param noLocal - * - * @return TopicSubscriber - a wrapper round our MessageConsumer - * - * @throws JMSException - */ - public TopicSubscriber createSubscriber(Topic topic, String messageSelector, boolean noLocal) throws JMSException - { - checkNotClosed(); - Topic dest = checkValidTopic(topic); - - // AMQTopic dest = new AMQTopic(topic.getTopicName()); - return new TopicSubscriberAdaptor(dest, (C) createExclusiveConsumer(dest, messageSelector, noLocal)); - } - - public TemporaryQueue createTemporaryQueue() throws JMSException - { - checkNotClosed(); - try - { - AMQTemporaryQueue result = new AMQTemporaryQueue(this); - - // this is done so that we can produce to a temporary queue before we create a consumer - result.setQueueName(result.getRoutingKey()); - createQueue(result.getAMQQueueName(), result.isAutoDelete(), - result.isDurable(), result.isExclusive()); - bindQueue(result.getAMQQueueName(), result.getRoutingKey(), - new FieldTable(), result.getExchangeName(), result); - return result; - } - catch (Exception e) - { - JMSException jmse = new JMSException("Cannot create temporary queue"); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - public TemporaryTopic createTemporaryTopic() throws JMSException - { - checkNotClosed(); - - return new AMQTemporaryTopic(this); - } - - public TextMessage createTextMessage() throws JMSException - { - synchronized (getFailoverMutex()) - { - checkNotClosed(); - - JMSTextMessage msg = new JMSTextMessage(getMessageDelegateFactory()); - msg.setAMQSession(this); - return msg; - } - } - - protected Object getFailoverMutex() - { - return _connection.getFailoverMutex(); - } - - public TextMessage createTextMessage(String text) throws JMSException - { - - TextMessage msg = createTextMessage(); - msg.setText(text); - - return msg; - } - - public Topic createTopic(String topicName) throws JMSException - { - checkNotClosed(); - try - { - if (topicName.indexOf('/') == -1 && topicName.indexOf(';') == -1) - { - DestSyntax syntax = AMQDestination.getDestType(topicName); - // for testing we may want to use the prefix to indicate our choice. - topicName = AMQDestination.stripSyntaxPrefix(topicName); - if (syntax == AMQDestination.DestSyntax.BURL) - { - return new AMQTopic(getDefaultTopicExchangeName(), new AMQShortString(topicName)); - } - else - { - return new AMQTopic("ADDR:" + getDefaultTopicExchangeName() + "/" + topicName); - } - } - else - { - return new AMQTopic(topicName); - } - - } - catch (URISyntaxException urlse) - { - _logger.error("", urlse); - JMSException jmse = new JMSException(urlse.getReason()); - jmse.setLinkedException(urlse); - jmse.initCause(urlse); - throw jmse; - } - } - - public void declareExchange(AMQShortString name, AMQShortString type, boolean nowait) throws AMQException - { - declareExchange(name, type, getProtocolHandler(), nowait); - } - - abstract public void sync() throws AMQException; - - public int getAcknowledgeMode() throws JMSException - { - checkNotClosed(); - - return _acknowledgeMode; - } - - public AMQConnection getAMQConnection() - { - return _connection; - } - - public int getChannelId() - { - return _channelId; - } - - public int getDefaultPrefetch() - { - return _prefetchHighMark; - } - - public int getDefaultPrefetchHigh() - { - return _prefetchHighMark; - } - - public int getDefaultPrefetchLow() - { - return _prefetchLowMark; - } - - public AMQShortString getDefaultQueueExchangeName() - { - return _connection.getDefaultQueueExchangeName(); - } - - public AMQShortString getDefaultTopicExchangeName() - { - return _connection.getDefaultTopicExchangeName(); - } - - public MessageListener getMessageListener() throws JMSException - { - // checkNotClosed(); - return _messageListener; - } - - public AMQShortString getTemporaryQueueExchangeName() - { - return _connection.getTemporaryQueueExchangeName(); - } - - public AMQShortString getTemporaryTopicExchangeName() - { - return _connection.getTemporaryTopicExchangeName(); - } - - public int getTicket() - { - return _ticket; - } - - public boolean getTransacted() throws JMSException - { - checkNotClosed(); - - return _transacted; - } - - public boolean hasConsumer(Destination destination) - { - AtomicInteger counter = _destinationConsumerCount.get(destination); - - return (counter != null) && (counter.get() != 0); - } - - public boolean isStrictAMQP() - { - return _strictAMQP; - } - - public boolean isSuspended() - { - return _suspended; - } - - protected void addUnacknowledgedMessage(long id) - { - _unacknowledgedMessageTags.add(id); - } - - protected void addDeliveredMessage(long id) - { - _deliveredMessageTags.add(id); - } - - /** - * Invoked by the MINA IO thread (indirectly) when a message is received from the transport. Puts the message onto - * the queue read by the dispatcher. - * - * @param message the message that has been received - */ - public void messageReceived(UnprocessedMessage message) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Message[" + message.toString() + "] received in session"); - } - _highestDeliveryTag.set(message.getDeliveryTag()); - _queue.add(message); - } - - public void declareAndBind(AMQDestination amqd) - throws - AMQException - { - AMQProtocolHandler protocolHandler = getProtocolHandler(); - declareExchange(amqd, protocolHandler, false); - AMQShortString queueName = declareQueue(amqd, protocolHandler, false); - bindQueue(queueName, amqd.getRoutingKey(), new FieldTable(), amqd.getExchangeName(), amqd); - } - - /** - * Stops message delivery in this session, and restarts message delivery with the oldest unacknowledged message. - * - * <p/>All consumers deliver messages in a serial order. Acknowledging a received message automatically acknowledges - * all messages that have been delivered to the client. - * - * <p/>Restarting a session causes it to take the following actions: - * - * <ul> - * <li>Stop message delivery.</li> - * <li>Mark all messages that might have been delivered but not acknowledged as "redelivered". - * <li>Restart the delivery sequence including all unacknowledged messages that had been previously delivered. - * Redelivered messages do not have to be delivered in exactly their original delivery order.</li> - * </ul> - * - * <p/>If the recover operation is interrupted by a fail-over, between asking that the broker begin recovery and - * receiving acknowledgment that it has then a JMSException will be thrown. In this case it will not be possible - * for the client to determine whether the broker is going to recover the session or not. - * - * @throws JMSException If the JMS provider fails to stop and restart message delivery due to some internal error. - * Not that this does not necessarily mean that the recovery has failed, but simply that it is - * not possible to tell if it has or not. - * @todo Be aware of possible changes to parameter order as versions change. - * - * Strategy for handling recover. - * Flush any acks not yet sent. - * Stop the message flow. - * Clear the dispatch queue and the consumer queues. - * Release/Reject all messages received but not yet acknowledged. - * Start the message flow. - */ - public void recover() throws JMSException - { - // Ensure that the session is open. - checkNotClosed(); - - // Ensure that the session is not transacted. - checkNotTransacted(); - - // flush any acks we are holding in the buffer. - flushAcknowledgments(); - - // this is set only here, and the before the consumer's onMessage is called it is set to false - _inRecovery = true; - try - { - - boolean isSuspended = isSuspended(); - - if (!isSuspended) - { - suspendChannel(true); - } - - syncDispatchQueue(); - - if (_dispatcher != null) - { - _dispatcher.recover(); - } - - sendRecover(); - - markClean(); - - // Set inRecovery to false before you start message flow again again. - _inRecovery = false; - - if (!isSuspended) - { - suspendChannel(false); - } - } - catch (AMQException e) - { - throw new JMSAMQException("Recover failed: " + e.getMessage(), e); - } - catch (FailoverException e) - { - throw new JMSAMQException("Recovery was interrupted by fail-over. Recovery status is not known.", e); - } - - } - - protected abstract void sendRecover() throws AMQException, FailoverException; - - protected abstract void flushAcknowledgments(); - - public void rejectMessage(UnprocessedMessage message, boolean requeue) - { - - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejecting Unacked message:" + message.getDeliveryTag()); - } - - rejectMessage(message.getDeliveryTag(), requeue); - } - - public void rejectMessage(AbstractJMSMessage message, boolean requeue) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejecting Abstract message:" + message.getDeliveryTag()); - } - - rejectMessage(message.getDeliveryTag(), requeue); - - } - - public abstract void rejectMessage(long deliveryTag, boolean requeue); - - /** - * Commits all messages done in this transaction and releases any locks currently held. - * - * <p/>If the rollback fails, because the rollback itself is interrupted by a fail-over between requesting that the - * rollback be done, and receiving an acknowledgement that it has been done, then a JMSException will be thrown. - * The client will be unable to determine whether or not the rollback actually happened on the broker in this case. - * - * @throws JMSException If the JMS provider fails to rollback the transaction due to some internal error. This does - * not mean that the rollback is known to have failed, merely that it is not known whether it - * failed or not. - * @todo Be aware of possible changes to parameter order as versions change. - */ - public void rollback() throws JMSException - { - synchronized (_suspensionLock) - { - checkTransacted(); - - try - { - boolean isSuspended = isSuspended(); - - if (!isSuspended) - { - suspendChannel(true); - } - - // Let the dispatcher know that all the incomming messages - // should be rolled back(reject/release) - _rollbackMark.set(_highestDeliveryTag.get()); - - syncDispatchQueue(); - - _dispatcher.rollback(); - - releaseForRollback(); - - sendRollback(); - - markClean(); - - if (!isSuspended) - { - suspendChannel(false); - } - } - catch (AMQException e) - { - throw new JMSAMQException("Failed to rollback: " + e, e); - } - catch (FailoverException e) - { - throw new JMSAMQException("Fail-over interrupted rollback. Status of the rollback is uncertain.", e); - } - } - } - - public abstract void releaseForRollback(); - - public abstract void sendRollback() throws AMQException, FailoverException; - - public void run() - { - throw new java.lang.UnsupportedOperationException(); - } - - public void setMessageListener(MessageListener listener) throws JMSException - { - // checkNotClosed(); - // - // if (_dispatcher != null && !_dispatcher.connectionStopped()) - // { - // throw new javax.njms.IllegalStateException("Attempt to set listener while session is started."); - // } - // - // // We are stopped - // for (Iterator<BasicMessageConsumer> i = _consumers.values().iterator(); i.hasNext();) - // { - // BasicMessageConsumer consumer = i.next(); - // - // if (consumer.isReceiving()) - // { - // throw new javax.njms.IllegalStateException("Another thread is already receiving synchronously."); - // } - // } - // - // _messageListener = listener; - // - // for (Iterator<BasicMessageConsumer> i = _consumers.values().iterator(); i.hasNext();) - // { - // i.next().setMessageListener(_messageListener); - // } - - } - - /** - * @see #unsubscribe(String, boolean) - */ - public void unsubscribe(String name) throws JMSException - { - unsubscribe(name, false); - } - - /** - * Unsubscribe from a subscription. - * - * @param name the name of the subscription to unsubscribe - * @param safe allows safe unsubscribe operation that will not throw an {@link InvalidDestinationException} if the - * queue is not bound, possibly due to the subscription being closed. - * @throws JMSException on - * @throws InvalidDestinationException - */ - private void unsubscribe(String name, boolean safe) throws JMSException - { - TopicSubscriberAdaptor<C> subscriber; - - _subscriberDetails.lock(); - try - { - checkNotClosed(); - subscriber = _subscriptions.get(name); - if (subscriber != null) - { - // Remove saved subscription information - _subscriptions.remove(name); - _reverseSubscriptionMap.remove(subscriber.getMessageConsumer()); - } - } - finally - { - _subscriberDetails.unlock(); - } - - if (subscriber != null) - { - subscriber.close(); - - // send a queue.delete for the subscription - deleteQueue(AMQTopic.getDurableTopicQueueName(name, _connection)); - } - else - { - if (_strictAMQP) - { - if (_strictAMQPFATAL) - { - throw new UnsupportedOperationException("JMS Durable not currently supported by AMQP."); - } - else - { - _logger.warn("Unable to determine if subscription already exists for '" + name + "' for unsubscribe." - + " Requesting queue deletion regardless."); - } - - deleteQueue(AMQTopic.getDurableTopicQueueName(name, _connection)); - } - else // Queue Browser - { - - if (isQueueBound(getDefaultTopicExchangeName(), AMQTopic.getDurableTopicQueueName(name, _connection))) - { - deleteQueue(AMQTopic.getDurableTopicQueueName(name, _connection)); - } - else if (!safe) - { - throw new InvalidDestinationException("Unknown subscription name: " + name); - } - } - } - } - - protected C createConsumerImpl(final Destination destination, final int prefetchHigh, - final int prefetchLow, final boolean noLocal, final boolean exclusive, String selector, final FieldTable rawSelector, - final boolean noConsume, final boolean autoClose) throws JMSException - { - checkTemporaryDestination(destination); - - final String messageSelector; - - if (_strictAMQP && !((selector == null) || selector.equals(""))) - { - if (_strictAMQPFATAL) - { - throw new UnsupportedOperationException("Selectors not currently supported by AMQP."); - } - else - { - messageSelector = null; - } - } - else - { - messageSelector = selector; - } - - return new FailoverRetrySupport<C, JMSException>( - new FailoverProtectedOperation<C, JMSException>() - { - public C execute() throws JMSException, FailoverException - { - checkNotClosed(); - - AMQDestination amqd = (AMQDestination) destination; - - // TODO: Define selectors in AMQP - // TODO: construct the rawSelector from the selector string if rawSelector == null - final FieldTable ft = FieldTableFactory.newFieldTable(); - // if (rawSelector != null) - // ft.put("headers", rawSelector.getDataAsBytes()); - // rawSelector is used by HeadersExchange and is not a JMS Selector - if (rawSelector != null) - { - ft.addAll(rawSelector); - } - - // We must always send the selector argument even if empty, so that we can tell when a selector is removed from a - // durable topic subscription that the broker arguments don't match any more. This is because it is not otherwise - // possible to determine when querying the broker whether there are no arguments or just a non-matching selector - // argument, as specifying null for the arguments when querying means they should not be checked at all - ft.put(AMQPFilterTypes.JMS_SELECTOR.getValue(), messageSelector == null ? "" : messageSelector); - - C consumer = createMessageConsumer(amqd, prefetchHigh, prefetchLow, - noLocal, exclusive, messageSelector, ft, noConsume, autoClose); - - if (_messageListener != null) - { - consumer.setMessageListener(_messageListener); - } - - try - { - registerConsumer(consumer, false); - } - catch (AMQInvalidArgumentException ise) - { - JMSException jmse = new InvalidSelectorException(ise.getMessage()); - jmse.setLinkedException(ise); - jmse.initCause(ise); - throw jmse; - } - catch (AMQInvalidRoutingKeyException e) - { - JMSException jmse = new InvalidDestinationException("Invalid routing key:" + amqd.getRoutingKey().toString()); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - catch (AMQException e) - { - if (e instanceof AMQChannelClosedException) - { - close(-1, false); - } - - JMSException ex = new JMSException("Error registering consumer: " + e); - ex.setLinkedException(e); - ex.initCause(e); - throw ex; - } - - return consumer; - } - }, _connection).execute(); - } - - public abstract C createMessageConsumer(final AMQDestination destination, final int prefetchHigh, - final int prefetchLow, final boolean noLocal, final boolean exclusive, String selector, final FieldTable arguments, - final boolean noConsume, final boolean autoClose) throws JMSException; - - /** - * Called by the MessageConsumer when closing, to deregister the consumer from the map from consumerTag to consumer - * instance. - * - * @param consumer the consum - */ - void deregisterConsumer(C consumer) - { - if (_consumers.remove(consumer.getConsumerTag()) != null) - { - _subscriberAccess.lock(); - try - { - String subscriptionName = _reverseSubscriptionMap.remove(consumer); - if (subscriptionName != null) - { - _subscriptions.remove(subscriptionName); - } - } - finally - { - _subscriberAccess.unlock(); - } - - Destination dest = consumer.getDestination(); - synchronized (dest) - { - // Provide additional NPE check - // This would occur if the consumer was closed before it was - // fully opened. - if (_destinationConsumerCount.get(dest) != null) - { - if (_destinationConsumerCount.get(dest).decrementAndGet() == 0) - { - _destinationConsumerCount.remove(dest); - } - } - } - - // Consumers that are closed in a transaction must be stored - // so that messages they have received can be acknowledged on commit - if (_transacted) - { - _removedConsumers.add(consumer); - } - } - } - - void deregisterProducer(long producerId) - { - _producers.remove(new Long(producerId)); - } - - boolean isInRecovery() - { - return _inRecovery; - } - - boolean isQueueBound(AMQShortString exchangeName, AMQShortString queueName) throws JMSException - { - return isQueueBound(exchangeName, queueName, null); - } - - /** - * Tests whether or not the specified queue is bound to the specified exchange under a particular routing key. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param exchangeName The exchange name to test for binding against. - * @param queueName The queue name to check if bound. - * @param routingKey The routing key to check if the queue is bound under. - * - * @return <tt>true</tt> if the queue is bound to the exchange and routing key, <tt>false</tt> if not. - * - * @throws JMSException If the query fails for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - public abstract boolean isQueueBound(final AMQShortString exchangeName, final AMQShortString queueName, final AMQShortString routingKey) - throws JMSException; - - public abstract boolean isQueueBound(final AMQDestination destination) throws JMSException; - - public abstract boolean isQueueBound(String exchangeName, String queueName, String bindingKey, Map<String,Object> args) throws JMSException; - - /** - * Called to mark the session as being closed. Useful when the session needs to be made invalid, e.g. after failover - * when the client has veoted resubscription. <p/> The caller of this method must already hold the failover mutex. - */ - void markClosed() - { - _closed.set(true); - _connection.deregisterSession(_channelId); - markClosedProducersAndConsumers(); - - } - - void failoverPrep() - { - syncDispatchQueue(); - } - - void syncDispatchQueue() - { - if (Thread.currentThread() == _dispatcherThread) - { - while (!_closed.get() && !_queue.isEmpty()) - { - Dispatchable disp; - try - { - disp = (Dispatchable) _queue.take(); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - - // Check just in case _queue becomes empty, it shouldn't but - // better than an NPE. - if (disp == null) - { - _logger.debug("_queue became empty during sync."); - break; - } - - disp.dispatch(AMQSession.this); - } - } - else - { - startDispatcherIfNecessary(); - - final CountDownLatch signal = new CountDownLatch(1); - - _queue.add(new Dispatchable() - { - public void dispatch(AMQSession ssn) - { - signal.countDown(); - } - }); - - try - { - signal.await(); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - } - } - - /** - * Resubscribes all producers and consumers. This is called when performing failover. - * - * @throws AMQException - */ - void resubscribe() throws AMQException - { - if (_dirty) - { - _failedOverDirty = true; - } - - _rollbackMark.set(-1); - resubscribeProducers(); - resubscribeConsumers(); - } - - void setHasMessageListeners() - { - _hasMessageListeners = true; - } - - void setInRecovery(boolean inRecovery) - { - _inRecovery = inRecovery; - } - - boolean isStarted() - { - return _startedAtLeastOnce.get(); - } - - /** - * Starts the session, which ensures that it is not suspended and that its event dispatcher is running. - * - * @throws AMQException If the session cannot be started for any reason. - * @todo This should be controlled by _stopped as it pairs with the stop method fixme or check the - * FlowControlledBlockingQueue _queue to see if we have flow controlled. will result in sending Flow messages - * for each subsequent call to flow.. only need to do this if we have called stop. - */ - void start() throws AMQException - { - // Check if the session has perviously been started and suspended, in which case it must be unsuspended. - if (_startedAtLeastOnce.getAndSet(true)) - { - suspendChannel(false); - } - - // If the event dispatcher is not running then start it too. - if (hasMessageListeners()) - { - startDispatcherIfNecessary(); - } - } - - void startDispatcherIfNecessary() - { - //If we are the dispatcher then we don't need to check we are started - if (Thread.currentThread() == _dispatcherThread) - { - return; - } - - // If IMMEDIATE_PREFETCH is not set then we need to start fetching - // This is final per session so will be multi-thread safe. - if (!_immediatePrefetch) - { - // We do this now if this is the first call on a started connection - if (isSuspended() && _startedAtLeastOnce.get() && _firstDispatcher.getAndSet(false)) - { - try - { - suspendChannel(false); - } - catch (AMQException e) - { - _logger.info("Unsuspending channel threw an exception:" + e); - } - } - } - - startDispatcherIfNecessary(false); - } - - synchronized void startDispatcherIfNecessary(boolean initiallyStopped) - { - if (_dispatcher == null) - { - _dispatcher = new Dispatcher(); - try - { - _dispatcherThread = Threading.getThreadFactory().createThread(_dispatcher); - - } - catch(Exception e) - { - throw new Error("Error creating Dispatcher thread",e); - } - _dispatcherThread.setName("Dispatcher-Channel-" + _channelId); - _dispatcherThread.setDaemon(true); - _dispatcher.setConnectionStopped(initiallyStopped); - _dispatcherThread.start(); - if (_dispatcherLogger.isInfoEnabled()) - { - _dispatcherLogger.info(_dispatcherThread.getName() + " created"); - } - } - else - { - _dispatcher.setConnectionStopped(initiallyStopped); - } - } - - void stop() throws AMQException - { - // Stop the server delivering messages to this session. - suspendChannel(true); - - if (_dispatcher != null) - { - _dispatcher.setConnectionStopped(true); - } - } - - /* - * Binds the named queue, with the specified routing key, to the named exchange. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param queueName The name of the queue to bind. - * @param routingKey The routing key to bind the queue with. - * @param arguments Additional arguments. - * @param exchangeName The exchange to bind the queue on. - * - * @throws AMQException If the queue cannot be bound for any reason. - */ - /*private void bindQueue(AMQDestination amqd, AMQShortString queueName, AMQProtocolHandler protocolHandler, FieldTable ft) - throws AMQException, FailoverException - { - AMQFrame queueBind = - QueueBindBody.createAMQFrame(_channelId, getProtocolMajorVersion(), getProtocolMinorVersion(), ft, // arguments - amqd.getExchangeName(), // exchange - false, // nowait - queueName, // queue - amqd.getRoutingKey(), // routingKey - getTicket()); // ticket - - protocolHandler.syncWrite(queueBind, QueueBindOkBody.class); - }*/ - - private void checkNotTransacted() throws JMSException - { - if (getTransacted()) - { - throw new IllegalStateException("Session is transacted"); - } - } - - private void checkTemporaryDestination(Destination destination) throws JMSException - { - if ((destination instanceof TemporaryDestination)) - { - _logger.debug("destination is temporary"); - final TemporaryDestination tempDest = (TemporaryDestination) destination; - if (tempDest.getSession() != this) - { - _logger.debug("destination is on different session"); - throw new JMSException("Cannot consume from a temporary destination created on another session"); - } - - if (tempDest.isDeleted()) - { - _logger.debug("destination is deleted"); - throw new JMSException("Cannot consume from a deleted destination"); - } - } - } - - protected void checkTransacted() throws JMSException - { - if (!getTransacted()) - { - throw new IllegalStateException("Session is not transacted"); - } - } - - private void checkValidDestination(Destination destination) throws InvalidDestinationException - { - if (destination == null) - { - throw new javax.jms.InvalidDestinationException("Invalid Queue"); - } - } - - private void checkValidQueue(Queue queue) throws InvalidDestinationException - { - if (queue == null) - { - throw new javax.jms.InvalidDestinationException("Invalid Queue"); - } - } - - /* - * I could have combined the last 3 methods, but this way it improves readability - */ - protected Topic checkValidTopic(Topic topic, boolean durable) throws JMSException - { - if (topic == null) - { - throw new javax.jms.InvalidDestinationException("Invalid Topic"); - } - - if ((topic instanceof TemporaryDestination) && (((TemporaryDestination) topic).getSession() != this)) - { - throw new javax.jms.InvalidDestinationException( - "Cannot create a subscription on a temporary topic created in another session"); - } - - if ((topic instanceof TemporaryDestination) && durable) - { - throw new javax.jms.InvalidDestinationException - ("Cannot create a durable subscription with a temporary topic: " + topic); - } - - if (!(topic instanceof AMQDestination && topic instanceof javax.jms.Topic)) - { - throw new javax.jms.InvalidDestinationException( - "Cannot create a subscription on topic created for another JMS Provider, class of topic provided is: " - + topic.getClass().getName()); - } - - return topic; - } - - protected Topic checkValidTopic(Topic topic) throws JMSException - { - return checkValidTopic(topic, false); - } - - /** - * Called to close message consumers cleanly. This may or may <b>not</b> be as a result of an error. - * - * @param error not null if this is a result of an error occurring at the connection level - */ - private void closeConsumers(Throwable error) throws JMSException - { - // we need to clone the list of consumers since the close() method updates the _consumers collection - // which would result in a concurrent modification exception - final ArrayList<C> clonedConsumers = new ArrayList<C>(_consumers.values()); - - final Iterator<C> it = clonedConsumers.iterator(); - while (it.hasNext()) - { - final C con = it.next(); - if (error != null) - { - con.notifyError(error); - } - else - { - con.close(false); - } - } - // at this point the _consumers map will be empty - if (_dispatcher != null) - { - _dispatcher.close(); - _dispatcher = null; - } - } - - /** - * Called to close message producers cleanly. This may or may <b>not</b> be as a result of an error. There is - * currently no way of propagating errors to message producers (this is a JMS limitation). - */ - private void closeProducers() throws JMSException - { - // we need to clone the list of producers since the close() method updates the _producers collection - // which would result in a concurrent modification exception - final ArrayList clonedProducers = new ArrayList(_producers.values()); - - final Iterator it = clonedProducers.iterator(); - while (it.hasNext()) - { - final P prod = (P) it.next(); - prod.close(); - } - // at this point the _producers map is empty - } - - /** - * Close all producers or consumers. This is called either in the error case or when closing the session normally. - * - * @param amqe the exception, may be null to indicate no error has occurred - */ - private void closeProducersAndConsumers(AMQException amqe) throws JMSException - { - JMSException jmse = null; - try - { - closeProducers(); - } - catch (JMSException e) - { - _logger.error("Error closing session: " + e, e); - jmse = e; - } - - try - { - closeConsumers(amqe); - } - catch (JMSException e) - { - _logger.error("Error closing session: " + e, e); - if (jmse == null) - { - jmse = e; - } - } - - if (jmse != null) - { - throw jmse; - } - } - - /** - * Register to consume from the queue. - * - * @param queueName - */ - private void consumeFromQueue(C consumer, AMQShortString queueName, - AMQProtocolHandler protocolHandler, boolean nowait, String messageSelector) throws AMQException, FailoverException - { - int tagId = _nextTag++; - - consumer.setConsumerTag(tagId); - // we must register the consumer in the map before we actually start listening - _consumers.put(tagId, consumer); - - synchronized (consumer.getDestination()) - { - _destinationConsumerCount.putIfAbsent(consumer.getDestination(), new AtomicInteger()); - _destinationConsumerCount.get(consumer.getDestination()).incrementAndGet(); - } - - - try - { - sendConsume(consumer, queueName, protocolHandler, nowait, messageSelector, tagId); - } - catch (AMQException e) - { - // clean-up the map in the event of an error - _consumers.remove(tagId); - throw e; - } - } - - public abstract void sendConsume(C consumer, AMQShortString queueName, - AMQProtocolHandler protocolHandler, boolean nowait, String messageSelector, int tag) throws AMQException, FailoverException; - - private P createProducerImpl(Destination destination, boolean mandatory, boolean immediate) - throws JMSException - { - return createProducerImpl(destination, mandatory, immediate, DEFAULT_WAIT_ON_SEND); - } - - private P createProducerImpl(final Destination destination, final boolean mandatory, - final boolean immediate, final boolean waitUntilSent) throws JMSException - { - return new FailoverRetrySupport<P, JMSException>( - new FailoverProtectedOperation<P, JMSException>() - { - public P execute() throws JMSException, FailoverException - { - checkNotClosed(); - long producerId = getNextProducerId(); - P producer = createMessageProducer(destination, mandatory, - immediate, waitUntilSent, producerId); - registerProducer(producerId, producer); - - return producer; - } - }, _connection).execute(); - } - - public abstract P createMessageProducer(final Destination destination, final boolean mandatory, - final boolean immediate, final boolean waitUntilSent, long producerId) throws JMSException; - - private void declareExchange(AMQDestination amqd, AMQProtocolHandler protocolHandler, boolean nowait) throws AMQException - { - declareExchange(amqd.getExchangeName(), amqd.getExchangeClass(), protocolHandler, nowait); - } - - /** - * Returns the number of messages currently queued for the given destination. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param amqd The destination to be checked - * - * @return the number of queued messages. - * - * @throws AMQException If the queue cannot be declared for any reason. - */ - public long getQueueDepth(final AMQDestination amqd) - throws AMQException - { - return new FailoverNoopSupport<Long, AMQException>( - new FailoverProtectedOperation<Long, AMQException>() - { - public Long execute() throws AMQException, FailoverException - { - return requestQueueDepth(amqd); - } - }, _connection).execute(); - - } - - protected abstract Long requestQueueDepth(AMQDestination amqd) throws AMQException, FailoverException; - - /** - * Declares the named exchange and type of exchange. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param name The name of the exchange to declare. - * @param type The type of the exchange to declare. - * @param protocolHandler The protocol handler to process the communication through. - * @param nowait - * - * @throws AMQException If the exchange cannot be declared for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - private void declareExchange(final AMQShortString name, final AMQShortString type, - final AMQProtocolHandler protocolHandler, final boolean nowait) throws AMQException - { - new FailoverNoopSupport<Object, AMQException>(new FailoverProtectedOperation<Object, AMQException>() - { - public Object execute() throws AMQException, FailoverException - { - sendExchangeDeclare(name, type, protocolHandler, nowait); - return null; - } - }, _connection).execute(); - } - - public abstract void sendExchangeDeclare(final AMQShortString name, final AMQShortString type, final AMQProtocolHandler protocolHandler, - final boolean nowait) throws AMQException, FailoverException; - - /** - * Declares a queue for a JMS destination. - * - * <p/>Note that for queues but not topics the name is generated in the client rather than the server. This allows - * the name to be reused on failover if required. In general, the destination indicates whether it wants a name - * generated or not. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param amqd The destination to declare as a queue. - * @param protocolHandler The protocol handler to communicate through. - * - * @return The name of the decalred queue. This is useful where the broker is generating a queue name on behalf of - * the client. - * - * @throws AMQException If the queue cannot be declared for any reason. - * @todo Verify the destiation is valid or throw an exception. - * @todo Be aware of possible changes to parameter order as versions change. - */ - protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean noLocal) throws AMQException - { - return declareQueue(amqd, protocolHandler, noLocal, false); - } - - protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean noLocal, final boolean nowait) - throws AMQException - { - /*return new FailoverRetrySupport<AMQShortString, AMQException>(*/ - return new FailoverNoopSupport<AMQShortString, AMQException>( - new FailoverProtectedOperation<AMQShortString, AMQException>() - { - public AMQShortString execute() throws AMQException, FailoverException - { - // Generate the queue name if the destination indicates that a client generated name is to be used. - if (amqd.isNameRequired()) - { - amqd.setQueueName(protocolHandler.generateQueueName()); - } - - sendQueueDeclare(amqd, protocolHandler, nowait); - - return amqd.getAMQQueueName(); - } - }, _connection).execute(); - } - - public abstract void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean nowait) throws AMQException, FailoverException; - - /** - * Undeclares the specified queue. - * - * <p/>Note that this operation automatically retries in the event of fail-over. - * - * @param queueName The name of the queue to delete. - * - * @throws JMSException If the queue could not be deleted for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - protected void deleteQueue(final AMQShortString queueName) throws JMSException - { - try - { - new FailoverRetrySupport<Object, AMQException>(new FailoverProtectedOperation<Object, AMQException>() - { - public Object execute() throws AMQException, FailoverException - { - sendQueueDelete(queueName); - return null; - } - }, _connection).execute(); - } - catch (AMQException e) - { - throw new JMSAMQException("The queue deletion failed: " + e.getMessage(), e); - } - } - - public abstract void sendQueueDelete(final AMQShortString queueName) throws AMQException, FailoverException; - - private long getNextProducerId() - { - return ++_nextProducerId; - } - - protected AMQProtocolHandler getProtocolHandler() - { - return _connection.getProtocolHandler(); - } - - public byte getProtocolMajorVersion() - { - return getProtocolHandler().getProtocolMajorVersion(); - } - - public byte getProtocolMinorVersion() - { - return getProtocolHandler().getProtocolMinorVersion(); - } - - protected boolean hasMessageListeners() - { - return _hasMessageListeners; - } - - private void markClosedConsumers() throws JMSException - { - if (_dispatcher != null) - { - _dispatcher.close(); - _dispatcher = null; - } - // we need to clone the list of consumers since the close() method updates the _consumers collection - // which would result in a concurrent modification exception - final ArrayList<C> clonedConsumers = new ArrayList<C>(_consumers.values()); - - final Iterator<C> it = clonedConsumers.iterator(); - while (it.hasNext()) - { - final C con = it.next(); - con.markClosed(); - } - // at this point the _consumers map will be empty - } - - private void markClosedProducersAndConsumers() - { - try - { - // no need for a markClosed* method in this case since there is no protocol traffic closing a producer - closeProducers(); - } - catch (JMSException e) - { - _logger.error("Error closing session: " + e, e); - } - - try - { - markClosedConsumers(); - } - catch (JMSException e) - { - _logger.error("Error closing session: " + e, e); - } - } - - /** - * Callers must hold the failover mutex before calling this method. - * - * @param consumer - * - * @throws AMQException - */ - private void registerConsumer(C consumer, boolean nowait) throws AMQException // , FailoverException - { - AMQDestination amqd = consumer.getDestination(); - - AMQProtocolHandler protocolHandler = getProtocolHandler(); - - if (amqd.getDestSyntax() == DestSyntax.ADDR) - { - handleAddressBasedDestination(amqd,true,nowait); - } - else - { - if (DECLARE_EXCHANGES) - { - declareExchange(amqd, protocolHandler, nowait); - } - - if (DECLARE_QUEUES || amqd.isNameRequired()) - { - declareQueue(amqd, protocolHandler, consumer.isNoLocal(), nowait); - } - bindQueue(amqd.getAMQQueueName(), amqd.getRoutingKey(), consumer.getArguments(), amqd.getExchangeName(), amqd, nowait); - } - - AMQShortString queueName = amqd.getAMQQueueName(); - - // store the consumer queue name - consumer.setQueuename(queueName); - - // If IMMEDIATE_PREFETCH is not required then suspsend the channel to delay prefetch - if (!_immediatePrefetch) - { - // The dispatcher will be null if we have just created this session - // so suspend the channel before we register our consumer so that we don't - // start prefetching until a receive/mListener is set. - if (_dispatcher == null) - { - if (!isSuspended()) - { - try - { - suspendChannel(true); - _logger.info( - "Prefetching delayed existing messages will not flow until requested via receive*() or setML()."); - } - catch (AMQException e) - { - _logger.info("Suspending channel threw an exception:" + e); - } - } - } - } - else - { - _logger.info("Immediately prefetching existing messages to new consumer."); - } - - try - { - consumeFromQueue(consumer, queueName, protocolHandler, nowait, consumer._messageSelector); - } - catch (FailoverException e) - { - throw new AMQException(null, "Fail-over exception interrupted basic consume.", e); - } - } - - public abstract void handleAddressBasedDestination(AMQDestination dest, - boolean isConsumer, - boolean noWait) throws AMQException; - - private void registerProducer(long producerId, MessageProducer producer) - { - _producers.put(new Long(producerId), producer); - } - - private void rejectAllMessages(boolean requeue) - { - rejectMessagesForConsumerTag(0, requeue, true); - } - - /** - * @param consumerTag The consumerTag to prune from queue or all if null - * @param requeue Should the removed messages be requeued (or discarded. Possibly to DLQ) - * @param rejectAllConsumers - */ - - private void rejectMessagesForConsumerTag(int consumerTag, boolean requeue, boolean rejectAllConsumers) - { - Iterator messages = _queue.iterator(); - if (_logger.isInfoEnabled()) - { - _logger.info("Rejecting messages from _queue for Consumer tag(" + consumerTag + ") (PDispatchQ) requeue:" - + requeue); - - if (messages.hasNext()) - { - _logger.info("Checking all messages in _queue for Consumer tag(" + consumerTag + ")"); - } - else - { - _logger.info("No messages in _queue to reject"); - } - } - while (messages.hasNext()) - { - UnprocessedMessage message = (UnprocessedMessage) messages.next(); - - if (rejectAllConsumers || (message.getConsumerTag() == consumerTag)) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Removing message(" + System.identityHashCode(message) + ") from _queue DT:" - + message.getDeliveryTag()); - } - - messages.remove(); - - rejectMessage(message, requeue); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejected the message(" + message.toString() + ") for consumer :" + consumerTag); - } - } - } - } - - private void resubscribeConsumers() throws AMQException - { - ArrayList<C> consumers = new ArrayList<C>(_consumers.values()); - _consumers.clear(); - - for (C consumer : consumers) - { - consumer.failedOverPre(); - registerConsumer(consumer, true); - consumer.failedOverPost(); - } - } - - private void resubscribeProducers() throws AMQException - { - ArrayList producers = new ArrayList(_producers.values()); - _logger.info(MessageFormat.format("Resubscribing producers = {0} producers.size={1}", producers, producers.size())); // FIXME: removeKey - for (Iterator it = producers.iterator(); it.hasNext();) - { - P producer = (P) it.next(); - producer.resubscribe(); - } - } - - /** - * Suspends or unsuspends this session. - * - * @param suspend <tt>true</tt> indicates that the session should be suspended, <tt>false<tt> indicates that it - * should be unsuspended. - * - * @throws AMQException If the session cannot be suspended for any reason. - * @todo Be aware of possible changes to parameter order as versions change. - */ - protected void suspendChannel(boolean suspend) throws AMQException // , FailoverException - { - synchronized (_suspensionLock) - { - try - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Setting channel flow : " + (suspend ? "suspended" : "unsuspended")); - } - - _suspended = suspend; - sendSuspendChannel(suspend); - } - catch (FailoverException e) - { - throw new AMQException(null, "Fail-over interrupted suspend/unsuspend channel.", e); - } - } - } - - public abstract void sendSuspendChannel(boolean suspend) throws AMQException, FailoverException; - - Object getMessageDeliveryLock() - { - return _messageDeliveryLock; - } - - /** - * Indicates whether this session consumers pre-fetche messages - * - * @return true if this session consumers pre-fetche messages false otherwise - */ - public boolean prefetch() - { - return getAMQConnection().getMaxPrefetch() > 0; - } - - /** Signifies that the session has pending sends to commit. */ - public void markDirty() - { - _dirty = true; - } - - /** Signifies that the session has no pending sends to commit. */ - public void markClean() - { - _dirty = false; - _failedOverDirty = false; - } - - /** - * Check to see if failover has occured since the last call to markClean(commit or rollback). - * - * @return boolean true if failover has occured. - */ - public boolean hasFailedOver() - { - return _failedOverDirty; - } - - /** - * Check to see if any message have been sent in this transaction and have not been commited. - * - * @return boolean true if a message has been sent but not commited - */ - public boolean isDirty() - { - return _dirty; - } - - public void setTicket(int ticket) - { - _ticket = ticket; - } - - public void setFlowControl(final boolean active) - { - _flowControl.setFlowControl(active); - _logger.warn("Broker enforced flow control " + (active ? "no longer in effect" : "has been enforced")); - } - - public void checkFlowControl() throws InterruptedException, JMSException - { - long expiryTime = 0L; - synchronized (_flowControl) - { - while (!_flowControl.getFlowControl() && - (expiryTime == 0L ? (expiryTime = System.currentTimeMillis() + FLOW_CONTROL_WAIT_FAILURE) - : expiryTime) >= System.currentTimeMillis() ) - { - - _flowControl.wait(FLOW_CONTROL_WAIT_PERIOD); - _logger.warn("Message send delayed by " + (System.currentTimeMillis() + FLOW_CONTROL_WAIT_FAILURE - expiryTime)/1000 + "s due to broker enforced flow control"); - } - if(!_flowControl.getFlowControl()) - { - _logger.error("Message send failed due to timeout waiting on broker enforced flow control"); - throw new JMSException("Unable to send message for " + FLOW_CONTROL_WAIT_FAILURE/1000 + " seconds due to broker enforced flow control"); - } - } - - } - - public interface Dispatchable - { - void dispatch(AMQSession ssn); - } - - public void dispatch(UnprocessedMessage message) - { - if (_dispatcher == null) - { - throw new java.lang.IllegalStateException("dispatcher is not started"); - } - - _dispatcher.dispatchMessage(message); - } - - /** Used for debugging in the dispatcher. */ - private static final Logger _dispatcherLogger = LoggerFactory.getLogger("org.apache.qpid.client.AMQSession.Dispatcher"); - - /** Responsible for decoding a message fragment and passing it to the appropriate message consumer. */ - class Dispatcher implements Runnable - { - - /** Track the 'stopped' state of the dispatcher, a session starts in the stopped state. */ - private final AtomicBoolean _closed = new AtomicBoolean(false); - - private final Object _lock = new Object(); - private String dispatcherID = "" + System.identityHashCode(this); - - public Dispatcher() - { - } - - public void close() - { - _closed.set(true); - _dispatcherThread.interrupt(); - - // fixme awaitTermination - - } - - public void rejectPending(C consumer) - { - synchronized (_lock) - { - boolean stopped = _dispatcher.connectionStopped(); - - if (!stopped) - { - _dispatcher.setConnectionStopped(true); - } - - // Reject messages on pre-receive queue - consumer.rollbackPendingMessages(); - - // Reject messages on pre-dispatch queue - rejectMessagesForConsumerTag(consumer.getConsumerTag(), true, false); - //Let the dispatcher deal with this when it gets to them. - - // closeConsumer - consumer.markClosed(); - - _dispatcher.setConnectionStopped(stopped); - - } - } - - public void rollback() - { - - synchronized (_lock) - { - boolean isStopped = connectionStopped(); - - if (!isStopped) - { - setConnectionStopped(true); - } - - _rollbackMark.set(_highestDeliveryTag.get()); - - _dispatcherLogger.debug("Session Pre Dispatch Queue cleared"); - - for (C consumer : _consumers.values()) - { - if (!consumer.isNoConsume()) - { - consumer.rollback(); - } - else - { - // should perhaps clear the _SQ here. - // consumer._synchronousQueue.clear(); - consumer.clearReceiveQueue(); - } - - } - - for (int i = 0; i < _removedConsumers.size(); i++) - { - // Sends acknowledgement to server - _removedConsumers.get(i).rollback(); - _removedConsumers.remove(i); - } - - setConnectionStopped(isStopped); - } - - } - - public void recover() - { - - synchronized (_lock) - { - boolean isStopped = connectionStopped(); - - if (!isStopped) - { - setConnectionStopped(true); - } - - _dispatcherLogger.debug("Session clearing the consumer queues"); - - for (C consumer : _consumers.values()) - { - List<Long> tags = consumer.drainReceiverQueueAndRetrieveDeliveryTags(); - _unacknowledgedMessageTags.addAll(tags); - } - - setConnectionStopped(isStopped); - } - - } - - - public void run() - { - if (_dispatcherLogger.isInfoEnabled()) - { - _dispatcherLogger.info(_dispatcherThread.getName() + " started"); - } - - UnprocessedMessage message; - - // Allow disptacher to start stopped - synchronized (_lock) - { - while (!_closed.get() && connectionStopped()) - { - try - { - _lock.wait(); - } - catch (InterruptedException e) - { - // ignore - } - } - } - - try - { - Dispatchable disp; - while (!_closed.get() && ((disp = (Dispatchable) _queue.take()) != null)) - { - disp.dispatch(AMQSession.this); - } - } - catch (InterruptedException e) - { - // ignore - } - - if (_dispatcherLogger.isInfoEnabled()) - { - _dispatcherLogger.info(_dispatcherThread.getName() + " thread terminating for channel " + _channelId + ":" + _thisSession); - } - - } - - // only call while holding lock - final boolean connectionStopped() - { - return _connectionStopped; - } - - boolean setConnectionStopped(boolean connectionStopped) - { - boolean currently; - synchronized (_lock) - { - currently = _connectionStopped; - _connectionStopped = connectionStopped; - _lock.notify(); - - if (_dispatcherLogger.isDebugEnabled()) - { - _dispatcherLogger.debug("Set Dispatcher Connection " + (connectionStopped ? "Stopped" : "Started") - + ": Currently " + (currently ? "Stopped" : "Started")); - } - } - - return currently; - } - - private void dispatchMessage(UnprocessedMessage message) - { - long deliveryTag = message.getDeliveryTag(); - - synchronized (_lock) - { - - try - { - while (connectionStopped()) - { - _lock.wait(); - } - } - catch (InterruptedException e) - { - // pass - } - - if (!(message instanceof CloseConsumerMessage) - && tagLE(deliveryTag, _rollbackMark.get())) - { - rejectMessage(message, true); - } - else if (isInRecovery()) - { - _unacknowledgedMessageTags.add(deliveryTag); - } - else - { - synchronized (_messageDeliveryLock) - { - notifyConsumer(message); - } - } - } - - long current = _rollbackMark.get(); - if (updateRollbackMark(current, deliveryTag)) - { - _rollbackMark.compareAndSet(current, deliveryTag); - } - } - - private void notifyConsumer(UnprocessedMessage message) - { - final C consumer = _consumers.get(message.getConsumerTag()); - - if ((consumer == null) || consumer.isClosed()) - { - if (_dispatcherLogger.isInfoEnabled()) - { - if (consumer == null) - { - _dispatcherLogger.info("Dispatcher(" + dispatcherID + ")Received a message(" - + System.identityHashCode(message) + ")" + "[" - + message.getDeliveryTag() + "] from queue " - + message.getConsumerTag() + " )without a handler - rejecting(requeue)..."); - } - else - { - if (consumer.isNoConsume()) - { - _dispatcherLogger.info("Received a message(" - + System.identityHashCode(message) + ")" + "[" - + message.getDeliveryTag() + "] from queue " + " consumer(" - + message.getConsumerTag() + ") is closed and a browser so dropping..."); - //DROP MESSAGE - return; - - } - else - { - _dispatcherLogger.info("Received a message(" - + System.identityHashCode(message) + ")" + "[" - + message.getDeliveryTag() + "] from queue " + " consumer(" - + message.getConsumerTag() + ") is closed rejecting(requeue)..."); - } - } - } - // Don't reject if we're already closing - if (!_closed.get()) - { - rejectMessage(message, true); - } - } - else - { - consumer.notifyMessage(message); - } - } - } - - protected abstract boolean tagLE(long tag1, long tag2); - - protected abstract boolean updateRollbackMark(long current, long deliveryTag); - - public abstract AMQMessageDelegateFactory getMessageDelegateFactory(); - - /*public void requestAccess(AMQShortString realm, boolean exclusive, boolean passive, boolean active, boolean write, - boolean read) throws AMQException - { - getProtocolHandler().writeCommandFrameAndWaitForReply(AccessRequestBody.createAMQFrame(getChannelId(), - getProtocolMajorVersion(), getProtocolMinorVersion(), active, exclusive, passive, read, realm, write), - new BlockingMethodFrameListener(_channelId) - { - - public boolean processMethod(int channelId, AMQMethodBody frame) // throws AMQException - { - if (frame instanceof AccessRequestOkBody) - { - setTicket(((AccessRequestOkBody) frame).getTicket()); - - return true; - } - else - { - return false; - } - } - }); - }*/ - - private class SuspenderRunner implements Runnable - { - private AtomicBoolean _suspend; - - public SuspenderRunner(AtomicBoolean suspend) - { - _suspend = suspend; - } - - public void run() - { - try - { - synchronized (_suspensionLock) - { - // If the session has closed by the time we get here - // then we should not attempt to write to the sesion/channel. - if (!(_thisSession.isClosed() || _thisSession.isClosing())) - { - suspendChannel(_suspend.get()); - } - } - } - catch (AMQException e) - { - _logger.warn("Unable to " + (_suspend.get() ? "suspend" : "unsuspend") + " session " + _thisSession + " due to: " + e); - if (_logger.isDebugEnabled()) - { - _logger.debug("Is the _queue empty?" + _queue.isEmpty()); - _logger.debug("Is the dispatcher closed?" + (_dispatcher == null ? "it's Null" : _dispatcher._closed)); - } - } - } - } - - /** - * Checks if the Session and its parent connection are closed - * - * @return <tt>true</tt> if this is closed, <tt>false</tt> otherwise. - */ - @Override - public boolean isClosed() - { - return _closed.get() || _connection.isClosed(); - } - - /** - * Checks if the Session and its parent connection are capable of performing - * closing operations - * - * @return <tt>true</tt> if we are closing, <tt>false</tt> otherwise. - */ - @Override - public boolean isClosing() - { - return _closing.get()|| _connection.isClosing(); - } - - public boolean isDeclareExchanges() - { - return DECLARE_EXCHANGES; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSessionAdapter.java b/java/client/src/main/java/org/apache/qpid/client/AMQSessionAdapter.java deleted file mode 100644 index 7e257e0c20..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSessionAdapter.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * 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.qpid.client; - -public interface AMQSessionAdapter -{ - public AMQSession getSession(); -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSessionDirtyException.java b/java/client/src/main/java/org/apache/qpid/client/AMQSessionDirtyException.java deleted file mode 100644 index a1b240ed54..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSessionDirtyException.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQSessionDirtyException represents all failures to send data on a transacted session that is - * no longer in a state that the client expects. i.e. failover has occured so previously sent messages - * will not be part of the transaction. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent attempt to perform additional sends on a dirty session. - * </table> - */ -public class AMQSessionDirtyException extends AMQException -{ - public AMQSessionDirtyException(String msg) - { - super(AMQConstant.RESOURCE_ERROR, msg, null); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java deleted file mode 100644 index 1ea92c67f7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java +++ /dev/null @@ -1,1372 +0,0 @@ -/* 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.qpid.client; - -import static org.apache.qpid.transport.Option.BATCH; -import static org.apache.qpid.transport.Option.NONE; -import static org.apache.qpid.transport.Option.SYNC; -import static org.apache.qpid.transport.Option.UNRELIABLE; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.UUID; - -import javax.jms.Destination; -import javax.jms.JMSException; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.AMQDestination.AddressOption; -import org.apache.qpid.client.AMQDestination.Binding; -import org.apache.qpid.client.AMQDestination.DestSyntax; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverNoopSupport; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.client.message.AMQMessageDelegateFactory; -import org.apache.qpid.client.message.FieldTableSupport; -import org.apache.qpid.client.message.MessageFactoryRegistry; -import org.apache.qpid.client.message.UnprocessedMessage_0_10; -import org.apache.qpid.client.messaging.address.Link; -import org.apache.qpid.client.messaging.address.Link.Reliability; -import org.apache.qpid.client.messaging.address.Node.ExchangeNode; -import org.apache.qpid.client.messaging.address.Node.QueueNode; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.transport.ExchangeBoundResult; -import org.apache.qpid.transport.ExchangeQueryResult; -import org.apache.qpid.transport.ExecutionErrorCode; -import org.apache.qpid.transport.ExecutionException; -import org.apache.qpid.transport.MessageAcceptMode; -import org.apache.qpid.transport.MessageAcquireMode; -import org.apache.qpid.transport.MessageCreditUnit; -import org.apache.qpid.transport.MessageFlowMode; -import org.apache.qpid.transport.MessageTransfer; -import org.apache.qpid.transport.Option; -import org.apache.qpid.transport.QueueQueryResult; -import org.apache.qpid.transport.Range; -import org.apache.qpid.transport.RangeSet; -import org.apache.qpid.transport.Session; -import org.apache.qpid.transport.SessionException; -import org.apache.qpid.transport.SessionListener; -import org.apache.qpid.util.Serial; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is a 0.10 Session - */ -public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, BasicMessageProducer_0_10> - implements SessionListener -{ - - /** - * This class logger - */ - private static final Logger _logger = LoggerFactory.getLogger(AMQSession_0_10.class); - - private static Timer timer = new Timer("ack-flusher", true); - private static class Flusher extends TimerTask - { - - private WeakReference<AMQSession_0_10> session; - public Flusher(AMQSession_0_10 session) - { - this.session = new WeakReference<AMQSession_0_10>(session); - } - - public void run() { - AMQSession_0_10 ssn = session.get(); - if (ssn == null) - { - cancel(); - } - else - { - try - { - ssn.flushAcknowledgments(true); - } - catch (Throwable t) - { - _logger.error("error flushing acks", t); - } - } - } - } - - - /** - * The underlying QpidSession - */ - private Session _qpidSession; - - /** - * The latest qpid Exception that has been raised. - */ - private Object _currentExceptionLock = new Object(); - private AMQException _currentException; - - // a ref on the qpid connection - protected org.apache.qpid.transport.Connection _qpidConnection; - - private long maxAckDelay = Long.getLong("qpid.session.max_ack_delay", 1000); - private TimerTask flushTask = null; - private RangeSet unacked = new RangeSet(); - private int unackedCount = 0; - - /** - * USed to store the range of in tx messages - */ - private RangeSet _txRangeSet = new RangeSet(); - private int _txSize = 0; - //--- constructors - - /** - * Creates a new session on a connection. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknowledgement mode for the session. - * @param messageFactoryRegistry The message factory factory for the session. - * @param defaultPrefetchHighMark The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLowMark The number of prefetched messages at which to resume the session. - * @param qpidConnection The qpid connection - */ - AMQSession_0_10(org.apache.qpid.transport.Connection qpidConnection, AMQConnection con, int channelId, - boolean transacted, int acknowledgeMode, MessageFactoryRegistry messageFactoryRegistry, - int defaultPrefetchHighMark, int defaultPrefetchLowMark) - { - - super(con, channelId, transacted, acknowledgeMode, messageFactoryRegistry, defaultPrefetchHighMark, - defaultPrefetchLowMark); - _qpidConnection = qpidConnection; - _qpidSession = _qpidConnection.createSession(1); - _qpidSession.setSessionListener(this); - if (_transacted) - { - _qpidSession.txSelect(); - _qpidSession.setTransacted(true); - } - - if (maxAckDelay > 0) - { - flushTask = new Flusher(this); - timer.schedule(flushTask, new Date(), maxAckDelay); - } - } - - /** - * Creates a new session on a connection with the default 0-10 message factory. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknowledgement mode for the session. - * @param defaultPrefetchHigh The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLow The number of prefetched messages at which to resume the session. - * @param qpidConnection The connection - */ - AMQSession_0_10(org.apache.qpid.transport.Connection qpidConnection, AMQConnection con, int channelId, - boolean transacted, int acknowledgeMode, int defaultPrefetchHigh, int defaultPrefetchLow) - { - - this(qpidConnection, con, channelId, transacted, acknowledgeMode, MessageFactoryRegistry.newDefaultRegistry(), - defaultPrefetchHigh, defaultPrefetchLow); - } - - private void addUnacked(int id) - { - synchronized (unacked) - { - unacked.add(id); - unackedCount++; - } - } - - private void clearUnacked() - { - synchronized (unacked) - { - unacked.clear(); - unackedCount = 0; - } - } - - //------- overwritten methods of class AMQSession - - void failoverPrep() - { - super.failoverPrep(); - clearUnacked(); - } - - /** - * Acknowledge one or many messages. - * - * @param deliveryTag The tag of the last message to be acknowledged. - * @param multiple <tt>true</tt> to acknowledge all messages up to and including the one specified by the - * delivery tag, <tt>false</tt> to just acknowledge that message. - */ - - public void acknowledgeMessage(long deliveryTag, boolean multiple) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Sending ack for delivery tag " + deliveryTag + " on session " + _channelId); - } - // acknowledge this message - if (multiple) - { - for (Long messageTag : _unacknowledgedMessageTags) - { - if( messageTag <= deliveryTag ) - { - addUnacked(messageTag.intValue()); - _unacknowledgedMessageTags.remove(messageTag); - } - } - //empty the list of unack messages - - } - else - { - addUnacked((int) deliveryTag); - _unacknowledgedMessageTags.remove(deliveryTag); - } - - long prefetch = getAMQConnection().getMaxPrefetch(); - - if (unackedCount >= prefetch/2 || maxAckDelay <= 0) - { - flushAcknowledgments(); - } - } - - protected void flushAcknowledgments() - { - flushAcknowledgments(false); - } - - void flushAcknowledgments(boolean setSyncBit) - { - synchronized (unacked) - { - if (unackedCount > 0) - { - messageAcknowledge - (unacked, _acknowledgeMode != org.apache.qpid.jms.Session.NO_ACKNOWLEDGE,setSyncBit); - clearUnacked(); - } - } - } - - void messageAcknowledge(RangeSet ranges, boolean accept) - { - messageAcknowledge(ranges,accept,false); - } - - void messageAcknowledge(RangeSet ranges, boolean accept,boolean setSyncBit) - { - Session ssn = getQpidSession(); - for (Range range : ranges) - { - ssn.processed(range); - } - ssn.flushProcessed(accept ? BATCH : NONE); - if (accept) - { - ssn.messageAccept(ranges, UNRELIABLE,setSyncBit? SYNC : NONE); - } - } - - /** - * Bind a queue with an exchange. - * - * @param queueName Specifies the name of the queue to bind. If the queue name is empty, - * refers to the current - * queue for the session, which is the last declared queue. - * @param exchangeName The exchange name. - * @param routingKey Specifies the routing key for the binding. - * @param arguments 0_8 specific - */ - public void sendQueueBind(final AMQShortString queueName, final AMQShortString routingKey, - final FieldTable arguments, final AMQShortString exchangeName, - final AMQDestination destination, final boolean nowait) - throws AMQException - { - if (destination.getDestSyntax() == DestSyntax.BURL) - { - Map args = FieldTableSupport.convertToMap(arguments); - - for (AMQShortString rk: destination.getBindingKeys()) - { - _logger.debug("Binding queue : " + queueName.toString() + - " exchange: " + exchangeName.toString() + - " using binding key " + rk.asString()); - getQpidSession().exchangeBind(queueName.toString(), - exchangeName.toString(), - rk.toString(), - args); - } - } - else - { - List<Binding> bindings = new ArrayList<Binding>(); - bindings.addAll(destination.getSourceNode().getBindings()); - bindings.addAll(destination.getTargetNode().getBindings()); - - String defaultExchange = destination.getAddressType() == AMQDestination.TOPIC_TYPE ? - destination.getAddressName(): "amq.topic"; - - for (Binding binding: bindings) - { - String queue = binding.getQueue() == null? - queueName.asString(): binding.getQueue(); - - String exchange = binding.getExchange() == null ? - defaultExchange : - binding.getExchange(); - - _logger.debug("Binding queue : " + queue + - " exchange: " + exchange + - " using binding key " + binding.getBindingKey() + - " with args " + printMap(binding.getArgs())); - getQpidSession().exchangeBind(queue, - exchange, - binding.getBindingKey(), - binding.getArgs()); - } - } - - if (!nowait) - { - // We need to sync so that we get notify of an error. - sync(); - } - } - - - /** - * Close this session. - * - * @param timeout no used / 0_8 specific - * @throws AMQException - * @throws FailoverException - */ - public void sendClose(long timeout) throws AMQException, FailoverException - { - if (flushTask != null) - { - flushTask.cancel(); - flushTask = null; - } - flushAcknowledgments(); - try - { - getQpidSession().sync(); - getQpidSession().close(); - } - catch (SessionException se) - { - setCurrentException(se); - } - - AMQException amqe = getCurrentException(); - if (amqe != null) - { - throw amqe; - } - } - - - /** - * Commit the receipt and the delivery of all messages exchanged by this session resources. - */ - public void sendCommit() throws AMQException, FailoverException - { - getQpidSession().setAutoSync(true); - try - { - getQpidSession().txCommit(); - } - finally - { - getQpidSession().setAutoSync(false); - } - // We need to sync so that we get notify of an error. - sync(); - } - - /** - * Create a queue with a given name. - * - * @param name The queue name - * @param autoDelete If this field is set and the exclusive field is also set, - * then the queue is deleted when the connection closes. - * @param durable If set when creating a new queue, - * the queue will be marked as durable. - * @param exclusive Exclusive queues can only be used from one connection at a time. - * @param arguments Exclusive queues can only be used from one connection at a time. - * @throws AMQException - * @throws FailoverException - */ - public void sendCreateQueue(AMQShortString name, final boolean autoDelete, final boolean durable, - final boolean exclusive, Map<String, Object> arguments) throws AMQException, FailoverException - { - getQpidSession().queueDeclare(name.toString(), null, arguments, durable ? Option.DURABLE : Option.NONE, - autoDelete ? Option.AUTO_DELETE : Option.NONE, - exclusive ? Option.EXCLUSIVE : Option.NONE); - // We need to sync so that we get notify of an error. - sync(); - } - - /** - * This method asks the broker to redeliver all unacknowledged messages - * - * @throws AMQException - * @throws FailoverException - */ - public void sendRecover() throws AMQException, FailoverException - { - // release all unacked messages - RangeSet ranges = new RangeSet(); - while (true) - { - Long tag = _unacknowledgedMessageTags.poll(); - if (tag == null) - { - break; - } - ranges.add((int) (long) tag); - } - getQpidSession().messageRelease(ranges, Option.SET_REDELIVERED); - // We need to sync so that we get notify of an error. - sync(); - } - - - public void releaseForRollback() - { - getQpidSession().messageRelease(_txRangeSet, Option.SET_REDELIVERED); - _txRangeSet.clear(); - _txSize = 0; - } - - /** - * Release (0_8 notion of Reject) an acquired message - * - * @param deliveryTag the message ID - * @param requeue always true - */ - public void rejectMessage(long deliveryTag, boolean requeue) - { - // The value of requeue is always true - RangeSet ranges = new RangeSet(); - ranges.add((int) deliveryTag); - getQpidSession().messageRelease(ranges, Option.SET_REDELIVERED); - //I don't think we need to sync - } - - /** - * Create an 0_10 message consumer - */ - public BasicMessageConsumer_0_10 createMessageConsumer(final AMQDestination destination, final int prefetchHigh, - final int prefetchLow, final boolean noLocal, - final boolean exclusive, String messageSelector, - final FieldTable ft, final boolean noConsume, - final boolean autoClose) throws JMSException - { - - final AMQProtocolHandler protocolHandler = getProtocolHandler(); - return new BasicMessageConsumer_0_10(_channelId, _connection, destination, messageSelector, noLocal, - _messageFactoryRegistry, this, protocolHandler, ft, prefetchHigh, - prefetchLow, exclusive, _acknowledgeMode, noConsume, autoClose); - } - - /** - * Bind a queue with an exchange. - */ - - public boolean isQueueBound(final AMQShortString exchangeName, final AMQShortString queueName, final AMQShortString routingKey) - throws JMSException - { - return isQueueBound(exchangeName,queueName,routingKey,null); - } - - public boolean isQueueBound(final AMQDestination destination) throws JMSException - { - return isQueueBound(destination.getExchangeName(),destination.getAMQQueueName(),destination.getRoutingKey(),destination.getBindingKeys()); - } - - public boolean isQueueBound(final AMQShortString exchangeName, final AMQShortString queueName, final AMQShortString routingKey,AMQShortString[] bindingKeys) - throws JMSException - { - String rk = null; - if (bindingKeys != null && bindingKeys.length>0) - { - rk = bindingKeys[0].toString(); - } - else if (routingKey != null) - { - rk = routingKey.toString(); - } - - return isQueueBound(exchangeName.toString(),queueName.toString(),rk,null); - } - - public boolean isQueueBound(final String exchangeName, final String queueName, final String bindingKey,Map<String,Object> args) - throws JMSException - { - boolean res; - ExchangeBoundResult bindingQueryResult = - getQpidSession().exchangeBound(exchangeName,queueName, bindingKey, args).get(); - - if (bindingKey == null) - { - res = !(bindingQueryResult.getExchangeNotFound() || bindingQueryResult.getQueueNotFound()); - } - else - { - if (args == null) - { - res = !(bindingQueryResult.getKeyNotMatched() || bindingQueryResult.getQueueNotFound() || bindingQueryResult - .getQueueNotMatched()); - } - else - { - res = !(bindingQueryResult.getKeyNotMatched() || bindingQueryResult.getQueueNotFound() || bindingQueryResult - .getQueueNotMatched() || bindingQueryResult.getArgsNotMatched()); - } - } - return res; - } - - /** - * This method is invoked when a consumer is created - * Registers the consumer with the broker - */ - public void sendConsume(BasicMessageConsumer_0_10 consumer, AMQShortString queueName, AMQProtocolHandler protocolHandler, - boolean nowait, String messageSelector, int tag) - throws AMQException, FailoverException - { - boolean preAcquire; - - long capacity = getCapacity(consumer.getDestination()); - - try - { - boolean isTopic; - Map<String, Object> arguments = FieldTable.convertToMap(consumer.getArguments()); - - if (consumer.getDestination().getDestSyntax() == AMQDestination.DestSyntax.BURL) - { - isTopic = consumer.getDestination() instanceof AMQTopic || - consumer.getDestination().getExchangeClass().equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS) ; - - preAcquire = isTopic || (!consumer.isNoConsume() && - (consumer.getMessageSelector() == null || consumer.getMessageSelector().equals(""))); - } - else - { - isTopic = consumer.getDestination().getAddressType() == AMQDestination.TOPIC_TYPE; - - preAcquire = !consumer.isNoConsume() && - (isTopic || consumer.getMessageSelector() == null || - consumer.getMessageSelector().equals("")); - - arguments.putAll( - (Map<? extends String, ? extends Object>) consumer.getDestination().getLink().getSubscription().getArgs()); - } - - boolean acceptModeNone = getAcknowledgeMode() == NO_ACKNOWLEDGE; - - if (consumer.getDestination().getLink() != null) - { - acceptModeNone = consumer.getDestination().getLink().getReliability() == Link.Reliability.UNRELIABLE; - } - - getQpidSession().messageSubscribe - (queueName.toString(), String.valueOf(tag), - acceptModeNone ? MessageAcceptMode.NONE : MessageAcceptMode.EXPLICIT, - preAcquire ? MessageAcquireMode.PRE_ACQUIRED : MessageAcquireMode.NOT_ACQUIRED, null, 0, arguments, - consumer.isExclusive() ? Option.EXCLUSIVE : Option.NONE); - } - catch (JMSException e) - { - throw new AMQException(AMQConstant.INTERNAL_ERROR, "problem when registering consumer", e); - } - - String consumerTag = ((BasicMessageConsumer_0_10)consumer).getConsumerTagString(); - - if (capacity == 0) - { - getQpidSession().messageSetFlowMode(consumerTag, MessageFlowMode.CREDIT); - } - else - { - getQpidSession().messageSetFlowMode(consumerTag, MessageFlowMode.WINDOW); - } - getQpidSession().messageFlow(consumerTag, MessageCreditUnit.BYTE, 0xFFFFFFFF, - Option.UNRELIABLE); - - if(capacity > 0 && _dispatcher != null && (isStarted() || _immediatePrefetch)) - { - // set the flow - getQpidSession().messageFlow(consumerTag, - MessageCreditUnit.MESSAGE, - capacity, - Option.UNRELIABLE); - } - - if (!nowait) - { - sync(); - } - } - - private long getCapacity(AMQDestination destination) - { - long capacity = 0; - if (destination.getDestSyntax() == DestSyntax.ADDR && - destination.getLink().getConsumerCapacity() > 0) - { - capacity = destination.getLink().getConsumerCapacity(); - } - else if (prefetch()) - { - capacity = getAMQConnection().getMaxPrefetch(); - } - return capacity; - } - - /** - * Create an 0_10 message producer - */ - public BasicMessageProducer_0_10 createMessageProducer(final Destination destination, final boolean mandatory, - final boolean immediate, final boolean waitUntilSent, - long producerId) throws JMSException - { - try - { - return new BasicMessageProducer_0_10(_connection, (AMQDestination) destination, _transacted, _channelId, this, - getProtocolHandler(), producerId, immediate, mandatory, waitUntilSent); - } - catch (AMQException e) - { - JMSException ex = new JMSException("Error creating producer"); - ex.initCause(e); - ex.setLinkedException(e); - - throw ex; - } - - } - - /** - * creates an exchange if it does not already exist - */ - public void sendExchangeDeclare(final AMQShortString name, - final AMQShortString type, - final AMQProtocolHandler protocolHandler, final boolean nowait) - throws AMQException, FailoverException - { - sendExchangeDeclare(name.asString(), type.asString(), null, null, - nowait); - } - - public void sendExchangeDeclare(final String name, final String type, - final String alternateExchange, final Map<String, Object> args, - final boolean nowait) throws AMQException - { - getQpidSession().exchangeDeclare( - name, - type, - alternateExchange, - args, - name.toString().startsWith("amq.") ? Option.PASSIVE - : Option.NONE); - // We need to sync so that we get notify of an error. - if (!nowait) - { - sync(); - } - } - - /** - * deletes an exchange - */ - public void sendExchangeDelete(final String name, final boolean nowait) - throws AMQException, FailoverException - { - getQpidSession().exchangeDelete(name); - // We need to sync so that we get notify of an error. - if (!nowait) - { - sync(); - } - } - - /** - * Declare a queue with the given queueName - */ - public void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean nowait) - throws AMQException, FailoverException - { - // do nothing this is only used by 0_8 - } - - /** - * Declare a queue with the given queueName - */ - public AMQShortString send0_10QueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean noLocal, final boolean nowait) - throws AMQException - { - AMQShortString queueName; - if (amqd.getAMQQueueName() == null) - { - // generate a name for this queue - queueName = new AMQShortString("TempQueue" + UUID.randomUUID()); - amqd.setQueueName(queueName); - } - else - { - queueName = amqd.getAMQQueueName(); - } - - if (amqd.getDestSyntax() == DestSyntax.BURL) - { - Map<String,Object> arguments = new HashMap<String,Object>(); - if (noLocal) - { - arguments.put("no-local", true); - } - - getQpidSession().queueDeclare(queueName.toString(), "" , arguments, - amqd.isAutoDelete() ? Option.AUTO_DELETE : Option.NONE, - amqd.isDurable() ? Option.DURABLE : Option.NONE, - amqd.isExclusive() ? Option.EXCLUSIVE : Option.NONE); - } - else - { - QueueNode node = (QueueNode)amqd.getSourceNode(); - getQpidSession().queueDeclare(queueName.toString(), node.getAlternateExchange() , - node.getDeclareArgs(), - node.isAutoDelete() ? Option.AUTO_DELETE : Option.NONE, - node.isDurable() ? Option.DURABLE : Option.NONE, - node.isExclusive() ? Option.EXCLUSIVE : Option.NONE); - } - - // passive --> false - if (!nowait) - { - // We need to sync so that we get notify of an error. - sync(); - } - return queueName; - } - - /** - * deletes a queue - */ - public void sendQueueDelete(final AMQShortString queueName) throws AMQException, FailoverException - { - getQpidSession().queueDelete(queueName.toString()); - // ifEmpty --> false - // ifUnused --> false - // We need to sync so that we get notify of an error. - sync(); - } - - /** - * Activate/deactivate the message flow for all the consumers of this session. - */ - public void sendSuspendChannel(boolean suspend) throws AMQException, FailoverException - { - if (suspend) - { - for (BasicMessageConsumer consumer : _consumers.values()) - { - getQpidSession().messageStop(String.valueOf(consumer.getConsumerTag()), - Option.UNRELIABLE); - } - } - else - { - for (BasicMessageConsumer_0_10 consumer : _consumers.values()) - { - String consumerTag = String.valueOf(consumer.getConsumerTag()); - //only set if msg list is null - try - { - long capacity = getCapacity(consumer.getDestination()); - - if (capacity == 0) - { - if (consumer.getMessageListener() != null) - { - getQpidSession().messageFlow(consumerTag, - MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - } - else - { - getQpidSession() - .messageFlow(consumerTag, MessageCreditUnit.MESSAGE, - capacity, - Option.UNRELIABLE); - } - getQpidSession() - .messageFlow(consumerTag, MessageCreditUnit.BYTE, 0xFFFFFFFF, - Option.UNRELIABLE); - } - catch (Exception e) - { - throw new AMQException(AMQConstant.INTERNAL_ERROR, "Error while trying to get the listener", e); - } - } - } - // We need to sync so that we get notify of an error. - sync(); - } - - - public void sendRollback() throws AMQException, FailoverException - { - getQpidSession().txRollback(); - // We need to sync so that we get notify of an error. - sync(); - } - - //------ Private methods - /** - * Access to the underlying Qpid Session - * - * @return The associated Qpid Session. - */ - protected Session getQpidSession() - { - return _qpidSession; - } - - - /** - * Get the latest thrown exception. - * - * @throws SessionException get the latest thrown error. - */ - public AMQException getCurrentException() - { - AMQException amqe = null; - synchronized (_currentExceptionLock) - { - if (_currentException != null) - { - amqe = _currentException; - _currentException = null; - } - } - return amqe; - } - - public void opened(Session ssn) {} - - public void resumed(Session ssn) - { - _qpidConnection = ssn.getConnection(); - } - - public void message(Session ssn, MessageTransfer xfr) - { - messageReceived(new UnprocessedMessage_0_10(xfr)); - } - - public void exception(Session ssn, SessionException exc) - { - setCurrentException(exc); - } - - public void closed(Session ssn) - { - try - { - super.closed(null); - if (flushTask != null) - { - flushTask.cancel(); - flushTask = null; - } - } catch (Exception e) - { - _logger.error("Error closing JMS session", e); - } - } - - public AMQException getLastException() - { - return getCurrentException(); - } - - protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean noLocal, final boolean nowait) - throws AMQException - { - /*return new FailoverRetrySupport<AMQShortString, AMQException>(*/ - return new FailoverNoopSupport<AMQShortString, AMQException>( - new FailoverProtectedOperation<AMQShortString, AMQException>() - { - public AMQShortString execute() throws AMQException, FailoverException - { - // Generate the queue name if the destination indicates that a client generated name is to be used. - if (amqd.isNameRequired()) - { - String binddingKey = ""; - for(AMQShortString key : amqd.getBindingKeys()) - { - binddingKey = binddingKey + "_" + key.toString(); - } - amqd.setQueueName(new AMQShortString( binddingKey + "@" - + amqd.getExchangeName().toString() + "_" + UUID.randomUUID())); - } - return send0_10QueueDeclare(amqd, protocolHandler, noLocal, nowait); - } - }, _connection).execute(); - } - - protected Long requestQueueDepth(AMQDestination amqd) - { - flushAcknowledgments(); - return getQpidSession().queueQuery(amqd.getQueueName()).get().getMessageCount(); - } - - - /** - * Store non committed messages for this session - * With 0.10 messages are consumed with window mode, we must send a completion - * before the window size is reached so credits don't dry up. - * @param id - */ - @Override protected void addDeliveredMessage(long id) - { - _txRangeSet.add((int) id); - _txSize++; - // this is a heuristic, we may want to have that configurable - if (_connection.getMaxPrefetch() == 1 || - _connection.getMaxPrefetch() != 0 && _txSize % (_connection.getMaxPrefetch() / 2) == 0) - { - // send completed so consumer credits don't dry up - messageAcknowledge(_txRangeSet, false); - } - } - - @Override public void commit() throws JMSException - { - checkTransacted(); - try - { - if( _txSize > 0 ) - { - messageAcknowledge(_txRangeSet, true); - _txRangeSet.clear(); - _txSize = 0; - } - sendCommit(); - } - catch (AMQException e) - { - throw new JMSAMQException("Failed to commit: " + e.getMessage(), e); - } - catch (FailoverException e) - { - throw new JMSAMQException("Fail-over interrupted commit. Status of the commit is uncertain.", e); - } - } - - protected final boolean tagLE(long tag1, long tag2) - { - return Serial.le((int) tag1, (int) tag2); - } - - protected final boolean updateRollbackMark(long currentMark, long deliveryTag) - { - return Serial.lt((int) currentMark, (int) deliveryTag); - } - - public void sync() throws AMQException - { - try - { - getQpidSession().sync(); - } - catch (SessionException se) - { - setCurrentException(se); - } - - AMQException amqe = getCurrentException(); - if (amqe != null) - { - throw amqe; - } - } - - public void setCurrentException(SessionException se) - { - synchronized (_currentExceptionLock) - { - ExecutionException ee = se.getException(); - int code = AMQConstant.INTERNAL_ERROR.getCode(); - if (ee != null) - { - code = ee.getErrorCode().getValue(); - } - AMQException amqe = new AMQException(AMQConstant.getConstant(code), se.getMessage(), se.getCause()); - _currentException = amqe; - } - _connection.exceptionReceived(_currentException); - } - - public AMQMessageDelegateFactory getMessageDelegateFactory() - { - return AMQMessageDelegateFactory.FACTORY_0_10; - } - - public boolean isExchangeExist(AMQDestination dest,ExchangeNode node,boolean assertNode) - { - boolean match = true; - ExchangeQueryResult result = getQpidSession().exchangeQuery(dest.getAddressName(), Option.NONE).get(); - match = !result.getNotFound(); - - if (match) - { - if (assertNode) - { - match = (result.getDurable() == node.isDurable()) && - (node.getExchangeType() != null && - node.getExchangeType().equals(result.getType())) && - (matchProps(result.getArguments(),node.getDeclareArgs())); - } - else if (node.getExchangeType() != null) - { - // even if assert is false, better to verify this - match = node.getExchangeType().equals(result.getType()); - if (!match) - { - _logger.debug("Exchange type doesn't match. Expected : " + node.getExchangeType() + - " actual " + result.getType()); - } - } - else - { - _logger.debug("Setting Exchange type " + result.getType()); - node.setExchangeType(result.getType()); - dest.setExchangeClass(new AMQShortString(result.getType())); - } - } - - return match; - } - - public boolean isQueueExist(AMQDestination dest,QueueNode node,boolean assertNode) throws AMQException - { - boolean match = true; - try - { - QueueQueryResult result = getQpidSession().queueQuery(dest.getAddressName(), Option.NONE).get(); - match = dest.getAddressName().equals(result.getQueue()); - - if (match && assertNode) - { - match = (result.getDurable() == node.isDurable()) && - (result.getAutoDelete() == node.isAutoDelete()) && - (result.getExclusive() == node.isExclusive()) && - (matchProps(result.getArguments(),node.getDeclareArgs())); - } - else if (match) - { - // should I use the queried details to update the local data structure. - } - } - catch(SessionException e) - { - if (e.getException().getErrorCode() == ExecutionErrorCode.RESOURCE_DELETED) - { - match = false; - } - else - { - throw new AMQException(AMQConstant.getConstant(e.getException().getErrorCode().getValue()), - "Error querying queue",e); - } - } - - return match; - } - - private boolean matchProps(Map<String,Object> target,Map<String,Object> source) - { - boolean match = true; - for (String key: source.keySet()) - { - match = target.containsKey(key) && - target.get(key).equals(source.get(key)); - - if (!match) - { - StringBuffer buf = new StringBuffer(); - buf.append("Property given in address did not match with the args sent by the broker."); - buf.append(" Expected { ").append(key).append(" : ").append(source.get(key)).append(" }, "); - buf.append(" Actual { ").append(key).append(" : ").append(target.get(key)).append(" }"); - _logger.debug(buf.toString()); - return match; - } - } - - return match; - } - - /** - * 1. Try to resolve the address type (queue or exchange) - * 2. if type == queue, - * 2.1 verify queue exists or create if create == true - * 2.2 If not throw exception - * - * 3. if type == exchange, - * 3.1 verify exchange exists or create if create == true - * 3.2 if not throw exception - * 3.3 if exchange exists (or created) create subscription queue. - */ - - @SuppressWarnings("deprecation") - public void handleAddressBasedDestination(AMQDestination dest, - boolean isConsumer, - boolean noWait) throws AMQException - { - if (dest.isAddressResolved()) - { - if (isConsumer && AMQDestination.TOPIC_TYPE == dest.getAddressType()) - { - createSubscriptionQueue(dest); - } - } - else - { - boolean assertNode = (dest.getAssert() == AddressOption.ALWAYS) || - (isConsumer && dest.getAssert() == AddressOption.RECEIVER) || - (!isConsumer && dest.getAssert() == AddressOption.SENDER); - - boolean createNode = (dest.getCreate() == AddressOption.ALWAYS) || - (isConsumer && dest.getCreate() == AddressOption.RECEIVER) || - (!isConsumer && dest.getCreate() == AddressOption.SENDER); - - - - int type = resolveAddressType(dest); - - if (type == AMQDestination.QUEUE_TYPE && - dest.getLink().getReliability() == Reliability.UNSPECIFIED) - { - dest.getLink().setReliability(Reliability.AT_LEAST_ONCE); - } - else if (type == AMQDestination.TOPIC_TYPE && - dest.getLink().getReliability() == Reliability.UNSPECIFIED) - { - dest.getLink().setReliability(Reliability.UNRELIABLE); - } - else if (type == AMQDestination.TOPIC_TYPE && - dest.getLink().getReliability() == Reliability.AT_LEAST_ONCE) - { - throw new AMQException("AT-LEAST-ONCE is not yet supported for Topics"); - } - - switch (type) - { - case AMQDestination.QUEUE_TYPE: - { - if (isQueueExist(dest,(QueueNode)dest.getSourceNode(),assertNode)) - { - setLegacyFiledsForQueueType(dest); - break; - } - else if(createNode) - { - setLegacyFiledsForQueueType(dest); - send0_10QueueDeclare(dest,null,false,noWait); - sendQueueBind(dest.getAMQQueueName(), dest.getRoutingKey(), - null,dest.getExchangeName(),dest, false); - break; - } - } - - case AMQDestination.TOPIC_TYPE: - { - if (isExchangeExist(dest,(ExchangeNode)dest.getTargetNode(),assertNode)) - { - setLegacyFiledsForTopicType(dest); - verifySubject(dest); - if (isConsumer && !isQueueExist(dest,(QueueNode)dest.getSourceNode(),true)) - { - createSubscriptionQueue(dest); - } - break; - } - else if(createNode) - { - setLegacyFiledsForTopicType(dest); - verifySubject(dest); - sendExchangeDeclare(dest.getAddressName(), - dest.getExchangeClass().asString(), - dest.getTargetNode().getAlternateExchange(), - dest.getTargetNode().getDeclareArgs(), - false); - if (isConsumer && !isQueueExist(dest,(QueueNode)dest.getSourceNode(),true)) - { - createSubscriptionQueue(dest); - } - break; - } - } - - default: - throw new AMQException( - "The name '" + dest.getAddressName() + - "' supplied in the address doesn't resolve to an exchange or a queue"); - } - dest.setAddressResolved(true); - } - } - - public int resolveAddressType(AMQDestination dest) throws AMQException - { - int type = dest.getAddressType(); - String name = dest.getAddressName(); - if (type != AMQDestination.UNKNOWN_TYPE) - { - return type; - } - else - { - ExchangeBoundResult result = getQpidSession().exchangeBound(name,name,null,null).get(); - if (result.getQueueNotFound() && result.getExchangeNotFound()) { - //neither a queue nor an exchange exists with that name; treat it as a queue - type = AMQDestination.QUEUE_TYPE; - } else if (result.getExchangeNotFound()) { - //name refers to a queue - type = AMQDestination.QUEUE_TYPE; - } else if (result.getQueueNotFound()) { - //name refers to an exchange - type = AMQDestination.TOPIC_TYPE; - } else { - //both a queue and exchange exist for that name - throw new AMQException("Ambiguous address, please specify queue or topic as node type"); - } - dest.setAddressType(type); - dest.rebuildTargetAndSourceNodes(type); - return type; - } - } - - private void verifySubject(AMQDestination dest) throws AMQException - { - if (dest.getSubject() == null || dest.getSubject().trim().equals("")) - { - - if ("topic".equals(dest.getExchangeClass().toString())) - { - dest.setRoutingKey(new AMQShortString("#")); - dest.setSubject(dest.getRoutingKey().toString()); - } - else - { - dest.setRoutingKey(new AMQShortString("")); - dest.setSubject(""); - } - } - } - - private void createSubscriptionQueue(AMQDestination dest) throws AMQException - { - QueueNode node = (QueueNode)dest.getSourceNode(); // source node is never null - - if (dest.getQueueName() == null) - { - if (dest.getLink() != null && dest.getLink().getName() != null) - { - dest.setQueueName(new AMQShortString(dest.getLink().getName())); - } - } - node.setExclusive(true); - node.setAutoDelete(!node.isDurable()); - send0_10QueueDeclare(dest,null,false,true); - node.addBinding(new Binding(dest.getAddressName(), - dest.getQueueName(),// should have one by now - dest.getSubject(), - Collections.<String,Object>emptyMap())); - sendQueueBind(dest.getAMQQueueName(), dest.getRoutingKey(), - null,dest.getExchangeName(),dest, false); - } - - public void setLegacyFiledsForQueueType(AMQDestination dest) - { - // legacy support - dest.setQueueName(new AMQShortString(dest.getAddressName())); - dest.setExchangeName(new AMQShortString("")); - dest.setExchangeClass(new AMQShortString("")); - dest.setRoutingKey(dest.getAMQQueueName()); - } - - public void setLegacyFiledsForTopicType(AMQDestination dest) - { - // legacy support - dest.setExchangeName(new AMQShortString(dest.getAddressName())); - ExchangeNode node = (ExchangeNode)dest.getTargetNode(); - dest.setExchangeClass(node.getExchangeType() == null? - ExchangeDefaults.TOPIC_EXCHANGE_CLASS: - new AMQShortString(node.getExchangeType())); - dest.setRoutingKey(new AMQShortString(dest.getSubject())); - } - - /** This should be moved to a suitable utility class */ - private String printMap(Map<String,Object> map) - { - StringBuilder sb = new StringBuilder(); - sb.append("<"); - if (map != null) - { - for(String key : map.keySet()) - { - sb.append(key).append(" = ").append(map.get(key)).append(" "); - } - } - sb.append(">"); - return sb.toString(); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java deleted file mode 100644 index c010e4c7ed..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java +++ /dev/null @@ -1,619 +0,0 @@ -/* - * - * 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.qpid.client; - - -import java.util.Map; - -import javax.jms.Destination; -import javax.jms.JMSException; - -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQUndeliveredException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverProtectedOperation; -import org.apache.qpid.client.failover.FailoverRetrySupport; -import org.apache.qpid.client.message.AMQMessageDelegateFactory; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.client.message.MessageFactoryRegistry; -import org.apache.qpid.client.message.ReturnMessage; -import org.apache.qpid.client.message.UnprocessedMessage; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.listener.SpecificMethodFrameListener; -import org.apache.qpid.common.AMQPFilterTypes; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicAckBody; -import org.apache.qpid.framing.BasicConsumeBody; -import org.apache.qpid.framing.BasicConsumeOkBody; -import org.apache.qpid.framing.BasicQosBody; -import org.apache.qpid.framing.BasicQosOkBody; -import org.apache.qpid.framing.BasicRecoverBody; -import org.apache.qpid.framing.BasicRecoverOkBody; -import org.apache.qpid.framing.BasicRecoverSyncBody; -import org.apache.qpid.framing.BasicRecoverSyncOkBody; -import org.apache.qpid.framing.BasicRejectBody; -import org.apache.qpid.framing.ChannelCloseOkBody; -import org.apache.qpid.framing.ChannelFlowBody; -import org.apache.qpid.framing.ChannelFlowOkBody; -import org.apache.qpid.framing.ExchangeBoundOkBody; -import org.apache.qpid.framing.ExchangeDeclareBody; -import org.apache.qpid.framing.ExchangeDeclareOkBody; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.framing.QueueBindOkBody; -import org.apache.qpid.framing.QueueDeclareBody; -import org.apache.qpid.framing.QueueDeclareOkBody; -import org.apache.qpid.framing.QueueDeleteBody; -import org.apache.qpid.framing.QueueDeleteOkBody; -import org.apache.qpid.framing.TxCommitOkBody; -import org.apache.qpid.framing.TxRollbackBody; -import org.apache.qpid.framing.TxRollbackOkBody; -import org.apache.qpid.framing.amqp_0_9.MethodRegistry_0_9; -import org.apache.qpid.framing.amqp_0_91.MethodRegistry_0_91; -import org.apache.qpid.jms.Session; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class AMQSession_0_8 extends AMQSession<BasicMessageConsumer_0_8, BasicMessageProducer_0_8> -{ - - /** Used for debugging. */ - private static final Logger _logger = LoggerFactory.getLogger(AMQSession.class); - - /** - * Creates a new session on a connection. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknoledgement mode for the session. - * @param messageFactoryRegistry The message factory factory for the session. - * @param defaultPrefetchHighMark The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLowMark The number of prefetched messages at which to resume the session. - */ - AMQSession_0_8(AMQConnection con, int channelId, boolean transacted, int acknowledgeMode, - MessageFactoryRegistry messageFactoryRegistry, int defaultPrefetchHighMark, int defaultPrefetchLowMark) - { - - super(con,channelId,transacted,acknowledgeMode,messageFactoryRegistry,defaultPrefetchHighMark,defaultPrefetchLowMark); - } - - /** - * Creates a new session on a connection with the default message factory factory. - * - * @param con The connection on which to create the session. - * @param channelId The unique identifier for the session. - * @param transacted Indicates whether or not the session is transactional. - * @param acknowledgeMode The acknoledgement mode for the session. - * @param defaultPrefetchHigh The maximum number of messages to prefetched before suspending the session. - * @param defaultPrefetchLow The number of prefetched messages at which to resume the session. - */ - AMQSession_0_8(AMQConnection con, int channelId, boolean transacted, int acknowledgeMode, int defaultPrefetchHigh, - int defaultPrefetchLow) - { - this(con, channelId, transacted, acknowledgeMode, MessageFactoryRegistry.newDefaultRegistry(), defaultPrefetchHigh, - defaultPrefetchLow); - } - - private ProtocolVersion getProtocolVersion() - { - return getProtocolHandler().getProtocolVersion(); - } - - public void acknowledgeMessage(long deliveryTag, boolean multiple) - { - BasicAckBody body = getMethodRegistry().createBasicAckBody(deliveryTag, multiple); - - final AMQFrame ackFrame = body.generateFrame(_channelId); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Sending ack for delivery tag " + deliveryTag + " on channel " + _channelId); - } - - getProtocolHandler().writeFrame(ackFrame); - _unacknowledgedMessageTags.remove(deliveryTag); - } - - public void sendQueueBind(final AMQShortString queueName, final AMQShortString routingKey, final FieldTable arguments, - final AMQShortString exchangeName, final AMQDestination dest, - final boolean nowait) throws AMQException, FailoverException - { - getProtocolHandler().syncWrite(getProtocolHandler().getMethodRegistry().createQueueBindBody - (getTicket(),queueName,exchangeName,routingKey,false,arguments). - generateFrame(_channelId), QueueBindOkBody.class); - } - - public void sendClose(long timeout) throws AMQException, FailoverException - { - // we also need to check the state manager for 08/09 as the - // _connection variable may not be updated in time by the error receiving - // thread. - // We can't close the session if we are alreadying in the process of - // closing/closed the connection. - - if (!(getProtocolHandler().getStateManager().getCurrentState().equals(AMQState.CONNECTION_CLOSED) - || getProtocolHandler().getStateManager().getCurrentState().equals(AMQState.CONNECTION_CLOSING))) - { - - getProtocolHandler().closeSession(this); - getProtocolHandler().syncWrite(getProtocolHandler().getMethodRegistry().createChannelCloseBody(AMQConstant.REPLY_SUCCESS.getCode(), - new AMQShortString("JMS client closing channel"), 0, 0).generateFrame(_channelId), - ChannelCloseOkBody.class, timeout); - // When control resumes at this point, a reply will have been received that - // indicates the broker has closed the channel successfully. - } - } - - public void sendCommit() throws AMQException, FailoverException - { - final AMQProtocolHandler handler = getProtocolHandler(); - - handler.syncWrite(getProtocolHandler().getMethodRegistry().createTxCommitBody().generateFrame(_channelId), TxCommitOkBody.class); - } - - public void sendCreateQueue(AMQShortString name, final boolean autoDelete, final boolean durable, final boolean exclusive, final Map<String, Object> arguments) throws AMQException, - FailoverException - { - FieldTable table = null; - if(arguments != null && !arguments.isEmpty()) - { - table = new FieldTable(); - for(Map.Entry<String, Object> entry : arguments.entrySet()) - { - table.setObject(entry.getKey(), entry.getValue()); - } - } - QueueDeclareBody body = getMethodRegistry().createQueueDeclareBody(getTicket(),name,false,durable,exclusive,autoDelete,false,table); - AMQFrame queueDeclare = body.generateFrame(_channelId); - getProtocolHandler().syncWrite(queueDeclare, QueueDeclareOkBody.class); - } - - public void sendRecover() throws AMQException, FailoverException - { - _unacknowledgedMessageTags.clear(); - - if (isStrictAMQP()) - { - // We can't use the BasicRecoverBody-OK method as it isn't part of the spec. - - BasicRecoverBody body = getMethodRegistry().createBasicRecoverBody(false); - _connection.getProtocolHandler().writeFrame(body.generateFrame(_channelId)); - _logger.warn("Session Recover cannot be guaranteed with STRICT_AMQP. Messages may arrive out of order."); - } - else - { - // in Qpid the 0-8 spec was hacked to have a recover-ok method... this is bad - // in 0-9 we used the cleaner addition of a new sync recover method with its own ok - if(getProtocolHandler().getProtocolVersion().equals(ProtocolVersion.v8_0)) - { - BasicRecoverBody body = getMethodRegistry().createBasicRecoverBody(false); - _connection.getProtocolHandler().syncWrite(body.generateFrame(_channelId), BasicRecoverOkBody.class); - } - else if(getProtocolVersion().equals(ProtocolVersion.v0_9)) - { - BasicRecoverSyncBody body = ((MethodRegistry_0_9)getMethodRegistry()).createBasicRecoverSyncBody(false); - _connection.getProtocolHandler().syncWrite(body.generateFrame(_channelId), BasicRecoverSyncOkBody.class); - } - else if(getProtocolVersion().equals(ProtocolVersion.v0_91)) - { - BasicRecoverSyncBody body = ((MethodRegistry_0_91)getMethodRegistry()).createBasicRecoverSyncBody(false); - _connection.getProtocolHandler().syncWrite(body.generateFrame(_channelId), BasicRecoverSyncOkBody.class); - } - else - { - throw new RuntimeException("Unsupported version of the AMQP Protocol: " + getProtocolVersion()); - } - } - } - - public void releaseForRollback() - { - // Reject all the messages that have been received in this session and - // have not yet been acknowledged. Should look to remove - // _deliveredMessageTags and use _txRangeSet as used by 0-10. - // Otherwise messages will be able to arrive out of order to a second - // consumer on the queue. Whilst this is within the JMS spec it is not - // user friendly and avoidable. - while (true) - { - Long tag = _deliveredMessageTags.poll(); - if (tag == null) - { - break; - } - - rejectMessage(tag, true); - } - } - - public void rejectMessage(long deliveryTag, boolean requeue) - { - if ((_acknowledgeMode == CLIENT_ACKNOWLEDGE) || (_acknowledgeMode == SESSION_TRANSACTED)) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejecting delivery tag:" + deliveryTag + ":SessionHC:" + this.hashCode()); - } - - BasicRejectBody body = getMethodRegistry().createBasicRejectBody(deliveryTag, requeue); - AMQFrame frame = body.generateFrame(_channelId); - - _connection.getProtocolHandler().writeFrame(frame); - } - } - - public boolean isQueueBound(final AMQDestination destination) throws JMSException - { - return isQueueBound(destination.getExchangeName(),destination.getAMQQueueName(),destination.getAMQQueueName()); - } - - - public boolean isQueueBound(final AMQShortString exchangeName, final AMQShortString queueName, final AMQShortString routingKey) - throws JMSException - { - try - { - AMQMethodEvent response = new FailoverRetrySupport<AMQMethodEvent, AMQException>( - new FailoverProtectedOperation<AMQMethodEvent, AMQException>() - { - public AMQMethodEvent execute() throws AMQException, FailoverException - { - AMQFrame boundFrame = getProtocolHandler().getMethodRegistry().createExchangeBoundBody - (exchangeName, routingKey, queueName).generateFrame(_channelId); - - return getProtocolHandler().syncWrite(boundFrame, ExchangeBoundOkBody.class); - - } - }, _connection).execute(); - - // Extract and return the response code from the query. - ExchangeBoundOkBody responseBody = (ExchangeBoundOkBody) response.getMethod(); - - return (responseBody.getReplyCode() == 0); - } - catch (AMQException e) - { - throw new JMSAMQException("Queue bound query failed: " + e.getMessage(), e); - } - } - - @Override public void sendConsume(BasicMessageConsumer_0_8 consumer, - AMQShortString queueName, - AMQProtocolHandler protocolHandler, - boolean nowait, - String messageSelector, - int tag) throws AMQException, FailoverException - { - FieldTable arguments = FieldTableFactory.newFieldTable(); - if ((messageSelector != null) && !messageSelector.equals("")) - { - arguments.put(AMQPFilterTypes.JMS_SELECTOR.getValue(), messageSelector); - } - - if (consumer.isAutoClose()) - { - arguments.put(AMQPFilterTypes.AUTO_CLOSE.getValue(), Boolean.TRUE); - } - - if (consumer.isNoConsume()) - { - arguments.put(AMQPFilterTypes.NO_CONSUME.getValue(), Boolean.TRUE); - } - - BasicConsumeBody body = getMethodRegistry().createBasicConsumeBody(getTicket(), - queueName, - new AMQShortString(String.valueOf(tag)), - consumer.isNoLocal(), - consumer.getAcknowledgeMode() == Session.NO_ACKNOWLEDGE, - consumer.isExclusive(), - nowait, - arguments); - - - AMQFrame jmsConsume = body.generateFrame(_channelId); - - if (nowait) - { - protocolHandler.writeFrame(jmsConsume); - } - else - { - protocolHandler.syncWrite(jmsConsume, BasicConsumeOkBody.class); - } - } - - public void sendExchangeDeclare(final AMQShortString name, final AMQShortString type, final AMQProtocolHandler protocolHandler, - final boolean nowait) throws AMQException, FailoverException - { - ExchangeDeclareBody body = getMethodRegistry().createExchangeDeclareBody(getTicket(),name,type, - name.toString().startsWith("amq."), - false,false,false,false,null); - AMQFrame exchangeDeclare = body.generateFrame(_channelId); - - protocolHandler.syncWrite(exchangeDeclare, ExchangeDeclareOkBody.class); - } - - public void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler, - final boolean nowait) throws AMQException, FailoverException - { - QueueDeclareBody body = getMethodRegistry().createQueueDeclareBody(getTicket(),amqd.getAMQQueueName(),false,amqd.isDurable(),amqd.isExclusive(),amqd.isAutoDelete(),false,null); - - AMQFrame queueDeclare = body.generateFrame(_channelId); - - protocolHandler.syncWrite(queueDeclare, QueueDeclareOkBody.class); - } - - public void sendQueueDelete(final AMQShortString queueName) throws AMQException, FailoverException - { - QueueDeleteBody body = getMethodRegistry().createQueueDeleteBody(getTicket(), - queueName, - false, - false, - true); - AMQFrame queueDeleteFrame = body.generateFrame(_channelId); - - getProtocolHandler().syncWrite(queueDeleteFrame, QueueDeleteOkBody.class); - } - - public void sendSuspendChannel(boolean suspend) throws AMQException, FailoverException - { - ChannelFlowBody body = getMethodRegistry().createChannelFlowBody(!suspend); - AMQFrame channelFlowFrame = body.generateFrame(_channelId); - _connection.getProtocolHandler().syncWrite(channelFlowFrame, ChannelFlowOkBody.class); - } - - public BasicMessageConsumer_0_8 createMessageConsumer(final AMQDestination destination, final int prefetchHigh, - final int prefetchLow, final boolean noLocal, final boolean exclusive, String messageSelector, final FieldTable arguments, - final boolean noConsume, final boolean autoClose) throws JMSException - { - - final AMQProtocolHandler protocolHandler = getProtocolHandler(); - return new BasicMessageConsumer_0_8(_channelId, _connection, destination, messageSelector, noLocal, - _messageFactoryRegistry,this, protocolHandler, arguments, prefetchHigh, prefetchLow, - exclusive, _acknowledgeMode, noConsume, autoClose); - } - - - public BasicMessageProducer_0_8 createMessageProducer(final Destination destination, final boolean mandatory, - final boolean immediate, final boolean waitUntilSent, long producerId) throws JMSException - { - try - { - return new BasicMessageProducer_0_8(_connection, (AMQDestination) destination, _transacted, _channelId, - this, getProtocolHandler(), producerId, immediate, mandatory, waitUntilSent); - } - catch (AMQException e) - { - JMSException ex = new JMSException("Error creating producer"); - ex.initCause(e); - ex.setLinkedException(e); - - throw ex; - } - } - - - @Override public void messageReceived(UnprocessedMessage message) - { - - if (message instanceof ReturnMessage) - { - // Return of the bounced message. - returnBouncedMessage((ReturnMessage) message); - } - else - { - super.messageReceived(message); - } - } - - private void returnBouncedMessage(final ReturnMessage msg) - { - _connection.performConnectionTask(new Runnable() - { - public void run() - { - try - { - // Bounced message is processed here, away from the mina thread - AbstractJMSMessage bouncedMessage = - _messageFactoryRegistry.createMessage(0, false, msg.getExchange(), - msg.getRoutingKey(), msg.getContentHeader(), msg.getBodies()); - AMQConstant errorCode = AMQConstant.getConstant(msg.getReplyCode()); - AMQShortString reason = msg.getReplyText(); - _logger.debug("Message returned with error code " + errorCode + " (" + reason + ")"); - - // @TODO should this be moved to an exception handler of sorts. Somewhere errors are converted to correct execeptions. - if (errorCode == AMQConstant.NO_CONSUMERS) - { - _connection.exceptionReceived(new AMQNoConsumersException("Error: " + reason, bouncedMessage, null)); - } - else if (errorCode == AMQConstant.NO_ROUTE) - { - _connection.exceptionReceived(new AMQNoRouteException("Error: " + reason, bouncedMessage, null)); - } - else - { - _connection.exceptionReceived( - new AMQUndeliveredException(errorCode, "Error: " + reason, bouncedMessage, null)); - } - - } - catch (Exception e) - { - _logger.error( - "Caught exception trying to raise undelivered message exception (dump follows) - ignoring...", - e); - } - } - }); - } - - - - - public void sendRollback() throws AMQException, FailoverException - { - TxRollbackBody body = getMethodRegistry().createTxRollbackBody(); - AMQFrame frame = body.generateFrame(getChannelId()); - getProtocolHandler().syncWrite(frame, TxRollbackOkBody.class); - } - - public void setPrefetchLimits(final int messagePrefetch, final long sizePrefetch) throws AMQException - { - new FailoverRetrySupport<Object, AMQException>( - new FailoverProtectedOperation<Object, AMQException>() - { - public Object execute() throws AMQException, FailoverException - { - - BasicQosBody basicQosBody = getProtocolHandler().getMethodRegistry().createBasicQosBody(sizePrefetch, messagePrefetch, false); - - // todo send low water mark when protocol allows. - // todo Be aware of possible changes to parameter order as versions change. - getProtocolHandler().syncWrite(basicQosBody.generateFrame(getChannelId()), BasicQosOkBody.class); - - return null; - } - }, _connection).execute(); - } - - class QueueDeclareOkHandler extends SpecificMethodFrameListener - { - - private long _messageCount; - private long _consumerCount; - - public QueueDeclareOkHandler() - { - super(getChannelId(), QueueDeclareOkBody.class); - } - - public boolean processMethod(int channelId, AMQMethodBody frame) //throws AMQException - { - boolean matches = super.processMethod(channelId, frame); - if (matches) - { - QueueDeclareOkBody declareOk = (QueueDeclareOkBody) frame; - _messageCount = declareOk.getMessageCount(); - _consumerCount = declareOk.getConsumerCount(); - } - return matches; - } - - } - - protected Long requestQueueDepth(AMQDestination amqd) throws AMQException, FailoverException - { - AMQFrame queueDeclare = - getMethodRegistry().createQueueDeclareBody(getTicket(), - amqd.getAMQQueueName(), - true, - amqd.isDurable(), - amqd.isExclusive(), - amqd.isAutoDelete(), - false, - null).generateFrame(_channelId); - QueueDeclareOkHandler okHandler = new QueueDeclareOkHandler(); - getProtocolHandler().writeCommandFrameAndWaitForReply(queueDeclare, okHandler); - return okHandler._messageCount; - } - - protected final boolean tagLE(long tag1, long tag2) - { - return tag1 <= tag2; - } - - protected final boolean updateRollbackMark(long currentMark, long deliveryTag) - { - return false; - } - - public AMQMessageDelegateFactory getMessageDelegateFactory() - { - return AMQMessageDelegateFactory.FACTORY_0_8; - } - - public void sync() throws AMQException - { - declareExchange(new AMQShortString("amq.direct"), new AMQShortString("direct"), false); - } - - public void handleAddressBasedDestination(AMQDestination dest, - boolean isConsumer, - boolean noWait) throws AMQException - { - throw new UnsupportedOperationException("The new addressing based sytanx is " - + "not supported for AMQP 0-8/0-9 versions"); - } - - protected void flushAcknowledgments() - { - - } - - public boolean isQueueBound(String exchangeName, String queueName, - String bindingKey, Map<String, Object> args) throws JMSException - { - return isQueueBound(exchangeName == null ? null : new AMQShortString(exchangeName), - queueName == null ? null : new AMQShortString(queueName), - bindingKey == null ? null : new AMQShortString(bindingKey)); - } - - - public AMQException getLastException() - { - // if the Connection has closed then we should throw any exception that - // has occurred that we were not waiting for - AMQStateManager manager = _connection.getProtocolHandler() - .getStateManager(); - - Exception e = manager.getLastException(); - if (manager.getCurrentState().equals(AMQState.CONNECTION_CLOSED) - && e != null) - { - if (e instanceof AMQException) - { - return (AMQException) e; - } - else - { - AMQException amqe = new AMQException(AMQConstant - .getConstant(AMQConstant.INTERNAL_ERROR.getCode()), - e.getMessage(), e.getCause()); - return amqe; - } - } - else - { - return null; - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryQueue.java b/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryQueue.java deleted file mode 100644 index f54cb782c8..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryQueue.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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.qpid.client; - -import javax.jms.JMSException; -import javax.jms.TemporaryQueue; - -import org.apache.qpid.framing.AMQShortString; - -import java.util.Random; -import java.util.UUID; - -/** AMQ implementation of a TemporaryQueue. */ -final class AMQTemporaryQueue extends AMQQueue implements TemporaryQueue, TemporaryDestination -{ - - - private final AMQSession _session; - private boolean _deleted; - - /** Create a new instance of an AMQTemporaryQueue */ - public AMQTemporaryQueue(AMQSession session) - { - super(session.getTemporaryQueueExchangeName(), new AMQShortString("TempQueue" + UUID.randomUUID()), true); - _session = session; - } - - /** @see javax.jms.TemporaryQueue#delete() */ - public synchronized void delete() throws JMSException - { - if (_session.hasConsumer(this)) - { - throw new JMSException("Temporary Queue has consumers so cannot be deleted"); - } - _deleted = true; - - // Currently TemporaryQueue is set to be auto-delete which means that the queue will be deleted - // by the server when there are no more subscriptions to that queue. This is probably not - // quite right for JMSCompliance. - } - - public AMQSession getSession() - { - return _session; - } - - public boolean isDeleted() - { - return _deleted; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryTopic.java b/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryTopic.java deleted file mode 100644 index 7b5781530b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQTemporaryTopic.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.JMSException; -import javax.jms.TemporaryTopic; -import java.util.UUID; - -/** - * AMQ implementation of TemporaryTopic. - */ -class AMQTemporaryTopic extends AMQTopic implements TemporaryTopic, TemporaryDestination -{ - - private final AMQSession _session; - private boolean _deleted; - /** - * Create new temporary topic. - */ - public AMQTemporaryTopic(AMQSession session) - { - super(session.getTemporaryTopicExchangeName(),new AMQShortString("tmp_" + UUID.randomUUID())); - _session = session; - } - - /** - * @see javax.jms.TemporaryTopic#delete() - */ - public void delete() throws JMSException - { - if(_session.hasConsumer(this)) - { - throw new JMSException("Temporary Topic has consumers so cannot be deleted"); - } - - _deleted = true; - // Currently TemporaryQueue is set to be auto-delete which means that the queue will be deleted - // by the server when there are no more subscriptions to that queue. This is probably not - // quite right for JMSCompliance. - } - - public AMQSession getSession() - { - return _session; - } - - public boolean isDeleted() - { - return _deleted; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQTopic.java b/java/client/src/main/java/org/apache/qpid/client/AMQTopic.java deleted file mode 100644 index 780dbcafc2..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQTopic.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.net.URISyntaxException; - -import javax.jms.InvalidDestinationException; -import javax.jms.JMSException; -import javax.jms.Topic; - -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.messaging.Address; -import org.apache.qpid.url.BindingURL; - -public class AMQTopic extends AMQDestination implements Topic -{ - public AMQTopic(String address) throws URISyntaxException - { - super(address); - } - - public AMQTopic(Address address) throws Exception - { - super(address); - } - - /** - * Constructor for use in creating a topic using a BindingURL. - * - * @param binding The binding url object. - */ - public AMQTopic(BindingURL binding) - { - super(binding); - } - - public AMQTopic(AMQShortString exchange, AMQShortString routingKey, AMQShortString queueName) - { - super(exchange, ExchangeDefaults.TOPIC_EXCHANGE_CLASS, routingKey, true, true, queueName, false); - } - - public AMQTopic(AMQShortString exchange, AMQShortString routingKey, AMQShortString queueName,AMQShortString[] bindingKeys) - { - super(exchange, ExchangeDefaults.TOPIC_EXCHANGE_CLASS, routingKey, true, true, queueName, false,bindingKeys); - } - - public AMQTopic(AMQConnection conn, String routingKey) - { - this(conn.getDefaultTopicExchangeName(), new AMQShortString(routingKey)); - } - - - public AMQTopic(AMQShortString exchangeName, String routingKey) - { - this(exchangeName, new AMQShortString(routingKey)); - } - - public AMQTopic(AMQShortString exchangeName, AMQShortString routingKey) - { - this(exchangeName, routingKey, null); - } - - public AMQTopic(AMQShortString exchangeName, AMQShortString name, boolean isAutoDelete, AMQShortString queueName, boolean isDurable) - { - super(exchangeName, ExchangeDefaults.TOPIC_EXCHANGE_CLASS, name, true, isAutoDelete, queueName, isDurable); - } - - protected AMQTopic(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, boolean isDurable) - { - super(exchangeName, exchangeClass, routingKey, isExclusive, isAutoDelete, queueName, isDurable ); - } - - protected AMQTopic(AMQShortString exchangeName, AMQShortString exchangeClass, AMQShortString routingKey, boolean isExclusive, - boolean isAutoDelete, AMQShortString queueName, boolean isDurable,AMQShortString[] bindingKeys) - { - super(exchangeName, exchangeClass, routingKey, isExclusive, isAutoDelete, queueName, isDurable,bindingKeys); - } - - public static AMQTopic createDurableTopic(Topic topic, String subscriptionName, AMQConnection connection) - throws JMSException - { - if (topic instanceof AMQDestination && topic instanceof javax.jms.Topic) - { - AMQDestination qpidTopic = (AMQDestination)topic; - if (qpidTopic.getDestSyntax() == DestSyntax.ADDR) - { - try - { - AMQTopic t = new AMQTopic(qpidTopic.getAddress()); - AMQShortString queueName = getDurableTopicQueueName(subscriptionName, connection); - // link is never null if dest was created using an address string. - t.getLink().setName(queueName.asString()); - t.getSourceNode().setAutoDelete(false); - t.getSourceNode().setDurable(true); - - // The legacy fields are also populated just in case. - t.setQueueName(queueName); - t.setAutoDelete(false); - t.setDurable(true); - return t; - } - catch(Exception e) - { - JMSException ex = new JMSException("Error creating durable topic"); - ex.initCause(e); - ex.setLinkedException(e); - throw ex; - } - } - else - { - return new AMQTopic(qpidTopic.getExchangeName(), qpidTopic.getRoutingKey(), false, - getDurableTopicQueueName(subscriptionName, connection), - true); - } - } - else - { - throw new InvalidDestinationException("The destination object used is not from this provider or of type javax.jms.Topic"); - } - } - - public static AMQShortString getDurableTopicQueueName(String subscriptionName, AMQConnection connection) throws JMSException - { - return new AMQShortString(connection.getClientID() + ":" + subscriptionName); - } - - public String getTopicName() throws JMSException - { - if (getRoutingKey() != null) - { - return getRoutingKey().asString(); - } - else if (getSubject() != null) - { - return getSubject(); - } - else - { - return null; - } - } - - @Override - public AMQShortString getExchangeName() - { - if (super.getExchangeName() == null && super.getAddressName() != null) - { - return new AMQShortString(super.getAddressName()); - } - else - { - return _exchangeName; - } - } - - public AMQShortString getRoutingKey() - { - if (super.getRoutingKey() != null) - { - return super.getRoutingKey(); - } - else if (getSubject() != null) - { - return new AMQShortString(getSubject()); - } - else - { - setRoutingKey(new AMQShortString("")); - setSubject(""); - return super.getRoutingKey(); - } - } - - public boolean isNameRequired() - { - return !isDurable(); - } - - /** - * Override since the queue is always private and we must ensure it remains null. If not, - * reuse of the topic when registering consumers will make all consumers listen on the same (private) queue rather - * than getting their own (private) queue. - * <p/> - * This is relatively nasty but it is difficult to come up with a more elegant solution, given - * the requirement in the case on AMQQueue and possibly other AMQDestination subclasses to - * use the underlying queue name even where it is server generated. - */ - public void setQueueName(String queueName) - { - } - - public boolean equals(Object o) - { - return (o instanceof AMQTopic) - && ((AMQTopic)o).getExchangeName().equals(getExchangeName()) - && ((AMQTopic)o).getRoutingKey().equals(getRoutingKey()); - } - - public int hashCode() - { - return getExchangeName().hashCode() + getRoutingKey().hashCode(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQTopicSessionAdaptor.java b/java/client/src/main/java/org/apache/qpid/client/AMQTopicSessionAdaptor.java deleted file mode 100644 index ec482a8f79..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQTopicSessionAdaptor.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.Serializable; - -import javax.jms.BytesMessage; -import javax.jms.Destination; -import javax.jms.IllegalStateException; -import javax.jms.JMSException; -import javax.jms.MapMessage; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.ObjectMessage; -import javax.jms.Queue; -import javax.jms.QueueBrowser; -import javax.jms.Session; -import javax.jms.StreamMessage; -import javax.jms.TemporaryQueue; -import javax.jms.TemporaryTopic; -import javax.jms.TextMessage; -import javax.jms.Topic; -import javax.jms.TopicPublisher; -import javax.jms.TopicSession; -import javax.jms.TopicSubscriber; - -public class AMQTopicSessionAdaptor implements TopicSession, AMQSessionAdapter -{ - protected final AMQSession _session; - - public AMQTopicSessionAdaptor(Session session) - { - _session = (AMQSession) session; - } - - public Topic createTopic(String string) throws JMSException - { - return _session.createTopic(string); - } - - public TopicSubscriber createSubscriber(Topic topic) throws JMSException - { - return _session.createSubscriber(topic); - } - - public TopicSubscriber createSubscriber(Topic topic, String string, boolean b) throws JMSException - { - return _session.createSubscriber(topic, string, b); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String string) throws JMSException - { - return _session.createDurableSubscriber(topic, string); - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String string, String string1, boolean b) throws JMSException - { - return _session.createDurableSubscriber(topic, string, string1, b); - } - - public TopicPublisher createPublisher(Topic topic) throws JMSException - { - return _session.createPublisher(topic); - } - - public TemporaryTopic createTemporaryTopic() throws JMSException - { - return _session.createTemporaryTopic(); - } - - public void unsubscribe(String string) throws JMSException - { - _session.unsubscribe(string); - } - - public BytesMessage createBytesMessage() throws JMSException - { - return _session.createBytesMessage(); - } - - public MapMessage createMapMessage() throws JMSException - { - return _session.createMapMessage(); - } - - public Message createMessage() throws JMSException - { - return _session.createMessage(); - } - - public ObjectMessage createObjectMessage() throws JMSException - { - return _session.createObjectMessage(); - } - - public ObjectMessage createObjectMessage(Serializable serializable) throws JMSException - { - return _session.createObjectMessage(serializable); - } - - public StreamMessage createStreamMessage() throws JMSException - { - return _session.createStreamMessage(); - } - - public TextMessage createTextMessage() throws JMSException - { - return _session.createTextMessage(); - } - - public TextMessage createTextMessage(String string) throws JMSException - { - return _session.createTextMessage(string); - } - - public boolean getTransacted() throws JMSException - { - return _session.getTransacted(); - } - - public int getAcknowledgeMode() throws JMSException - { - return _session.getAcknowledgeMode(); - } - - public void commit() throws JMSException - { - _session.commit(); - } - - public void rollback() throws JMSException - { - _session.rollback(); - } - - public void close() throws JMSException - { - _session.close(); - } - - public void recover() throws JMSException - { - _session.recover(); - } - - public MessageListener getMessageListener() throws JMSException - { - return _session.getMessageListener(); - } - - public void setMessageListener(MessageListener messageListener) throws JMSException - { - _session.setMessageListener(messageListener); - } - - public void run() - { - _session.run(); - } - - public MessageProducer createProducer(Destination destination) throws JMSException - { - return _session.createProducer(destination); - } - - public MessageConsumer createConsumer(Destination destination) throws JMSException - { - return _session.createConsumer(destination); - } - - public MessageConsumer createConsumer(Destination destination, String string) throws JMSException - { - return _session.createConsumer(destination, string); - } - - public MessageConsumer createConsumer(Destination destination, String string, boolean b) throws JMSException - { - return _session.createConsumer(destination, string, b); - } - - //The following methods cannot be called from a TopicSession as per JMS spec - public Queue createQueue(String string) throws JMSException - { - throw new IllegalStateException("Cannot call createQueue from TopicSession"); - } - - public QueueBrowser createBrowser(Queue queue) throws JMSException - { - throw new IllegalStateException("Cannot call createBrowser from TopicSession"); - } - - public QueueBrowser createBrowser(Queue queue, String string) throws JMSException - { - throw new IllegalStateException("Cannot call createBrowser from TopicSession"); - } - - public TemporaryQueue createTemporaryQueue() throws JMSException - { - throw new IllegalStateException("Cannot call createTemporaryQueue from TopicSession"); - } - - public AMQSession getSession() - { - return _session; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQUndefinedDestination.java b/java/client/src/main/java/org/apache/qpid/client/AMQUndefinedDestination.java deleted file mode 100644 index fa2afb3ee4..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/AMQUndefinedDestination.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.framing.AMQShortString; - -public class AMQUndefinedDestination extends AMQDestination -{ - - private static final AMQShortString UNKNOWN_EXCHANGE_CLASS = new AMQShortString("unknown"); - - - public AMQUndefinedDestination(AMQShortString exchange, AMQShortString routingKey, AMQShortString queueName) - { - super(exchange, UNKNOWN_EXCHANGE_CLASS, routingKey, queueName); - } - - public boolean isNameRequired() - { - return getAMQQueueName() == null; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java deleted file mode 100644 index 5d32863f2f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java +++ /dev/null @@ -1,1079 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.message.*; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.framing.*; -import org.apache.qpid.jms.MessageConsumer; -import org.apache.qpid.jms.Session; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.SortedSet; -import java.util.ArrayList; -import java.util.Collections; -import java.util.TreeSet; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; - -public abstract class BasicMessageConsumer<U> extends Closeable implements MessageConsumer -{ - private static final Logger _logger = LoggerFactory.getLogger(BasicMessageConsumer.class); - - /** The connection being used by this consumer */ - protected final AMQConnection _connection; - - protected final String _messageSelector; - - private final boolean _noLocal; - - protected AMQDestination _destination; - - /** - * When true indicates that a blocking receive call is in progress - */ - private final AtomicBoolean _receiving = new AtomicBoolean(false); - /** - * Holds an atomic reference to the listener installed. - */ - private final AtomicReference<MessageListener> _messageListener = new AtomicReference<MessageListener>(); - - /** The consumer tag allows us to close the consumer by sending a jmsCancel method to the broker */ - protected int _consumerTag; - - /** We need to know the channel id when constructing frames */ - protected final int _channelId; - - /** - * Used in the blocking receive methods to receive a message from the Session thread. <p/> Or to notify of errors - * <p/> Argument true indicates we want strict FIFO semantics - */ - protected final BlockingQueue _synchronousQueue; - - protected final MessageFactoryRegistry _messageFactory; - - protected final AMQSession _session; - - protected final AMQProtocolHandler _protocolHandler; - - /** - * We need to store the "raw" field table so that we can resubscribe in the event of failover being required - */ - private final FieldTable _arguments; - - /** - * We store the high water prefetch field in order to be able to reuse it when resubscribing in the event of - * failover - */ - private final int _prefetchHigh; - - /** - * We store the low water prefetch field in order to be able to reuse it when resubscribing in the event of - * failover - */ - private final int _prefetchLow; - - /** - * We store the exclusive field in order to be able to reuse it when resubscribing in the event of failover - */ - protected boolean _exclusive; - - /** - * The acknowledge mode in force for this consumer. Note that the AMQP protocol allows different ack modes per - * consumer whereas JMS defines this at the session level, hence why we associate it with the consumer in our - * implementation. - */ - protected final int _acknowledgeMode; - - /** - * Number of messages unacknowledged in DUPS_OK_ACKNOWLEDGE mode - */ - private int _outstanding; - - /** - * Switch to enable sending of acknowledgements when using DUPS_OK_ACKNOWLEDGE mode. Enabled when _outstannding - * number of msgs >= _prefetchHigh and disabled at < _prefetchLow - */ - private boolean _dups_ok_acknowledge_send; - - /** - * List of tags delievered, The last of which which should be acknowledged on commit in transaction mode. - */ - private ConcurrentLinkedQueue<Long> _receivedDeliveryTags = new ConcurrentLinkedQueue<Long>(); - - /** The last tag that was "multiple" acknowledged on this session (if transacted) */ - private long _lastAcked; - - /** set of tags which have previously been acked; but not part of the multiple ack (transacted mode only) */ - private final SortedSet<Long> _previouslyAcked = new TreeSet<Long>(); - - private final Object _commitLock = new Object(); - - /** - * The thread that was used to call receive(). This is important for being able to interrupt that thread if a - * receive() is in progress. - */ - private Thread _receivingThread; - - - /** - * Used to store this consumer queue name - * Usefull when more than binding key should be used - */ - private AMQShortString _queuename; - - /** - * autoClose denotes that the consumer will automatically cancel itself when there are no more messages to receive - * on the queue. This is used for queue browsing. - */ - private final boolean _autoClose; - - private final boolean _noConsume; - private List<StackTraceElement> _closedStack = null; - - - - protected BasicMessageConsumer(int channelId, AMQConnection connection, AMQDestination destination, - String messageSelector, boolean noLocal, MessageFactoryRegistry messageFactory, - AMQSession session, AMQProtocolHandler protocolHandler, - FieldTable arguments, int prefetchHigh, int prefetchLow, - boolean exclusive, int acknowledgeMode, boolean noConsume, boolean autoClose) - { - _channelId = channelId; - _connection = connection; - _messageSelector = messageSelector; - _noLocal = noLocal; - _destination = destination; - _messageFactory = messageFactory; - _session = session; - _protocolHandler = protocolHandler; - _arguments = arguments; - _prefetchHigh = prefetchHigh; - _prefetchLow = prefetchLow; - _exclusive = exclusive; - - _synchronousQueue = new LinkedBlockingQueue(); - _autoClose = autoClose; - _noConsume = noConsume; - - // Force queue browsers not to use acknowledge modes. - if (_noConsume) - { - _acknowledgeMode = Session.NO_ACKNOWLEDGE; - } - else - { - _acknowledgeMode = acknowledgeMode; - } - } - - public AMQDestination getDestination() - { - return _destination; - } - - public String getMessageSelector() throws JMSException - { - checkPreConditions(); - - return _messageSelector; - } - - public MessageListener getMessageListener() throws JMSException - { - checkPreConditions(); - - return _messageListener.get(); - } - - public int getAcknowledgeMode() - { - return _acknowledgeMode; - } - - protected boolean isMessageListenerSet() - { - return _messageListener.get() != null; - } - - public void setMessageListener(final MessageListener messageListener) throws JMSException - { - checkPreConditions(); - - // if the current listener is non-null and the session is not stopped, then - // it is an error to call this method. - - // i.e. it is only valid to call this method if - // - // (a) the connection is stopped, in which case the dispatcher is not running - // OR - // (b) the listener is null AND we are not receiving synchronously at present - // - - if (!_session.getAMQConnection().started()) - { - _messageListener.set(messageListener); - _session.setHasMessageListeners(); - - if (_logger.isDebugEnabled()) - { - _logger.debug( - "Session stopped : Message listener(" + messageListener + ") set for destination " + _destination); - } - } - else - { - if (_receiving.get()) - { - throw new javax.jms.IllegalStateException("Another thread is already receiving synchronously."); - } - - if (!_messageListener.compareAndSet(null, messageListener)) - { - throw new javax.jms.IllegalStateException("Attempt to alter listener while session is started."); - } - - _logger.debug("Message listener set for destination " + _destination); - - if (messageListener != null) - { - //todo: handle case where connection has already been started, and the dispatcher has alreaded started - // putting values on the _synchronousQueue - - synchronized (_session) - { - _messageListener.set(messageListener); - _session.setHasMessageListeners(); - _session.startDispatcherIfNecessary(); - - // If we already have messages on the queue, deliver them to the listener - Object o = _synchronousQueue.poll(); - while (o != null) - { - notifyMessage((AbstractJMSMessage) o); - o = _synchronousQueue.poll(); - } - } - } - } - } - - protected void preApplicationProcessing(AbstractJMSMessage jmsMsg) throws JMSException - { - if (_session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) - { - _session.addUnacknowledgedMessage(jmsMsg.getDeliveryTag()); - } - - _session.setInRecovery(false); - preDeliver(jmsMsg); - } - - /** - * @param immediate if true then return immediately if the connection is failing over - * - * @return boolean if the acquisition was successful - * - * @throws JMSException if a listener has already been set or another thread is receiving - * @throws InterruptedException if interrupted - */ - private boolean acquireReceiving(boolean immediate) throws JMSException, InterruptedException - { - if (_connection.isFailingOver()) - { - if (immediate) - { - return false; - } - else - { - _connection.blockUntilNotFailingOver(); - } - } - - if (!_receiving.compareAndSet(false, true)) - { - throw new javax.jms.IllegalStateException("Another thread is already receiving."); - } - - if (isMessageListenerSet()) - { - throw new javax.jms.IllegalStateException("A listener has already been set."); - } - - _receivingThread = Thread.currentThread(); - return true; - } - - private void releaseReceiving() - { - _receiving.set(false); - _receivingThread = null; - } - - public FieldTable getArguments() - { - return _arguments; - } - - public int getPrefetch() - { - return _prefetchHigh; - } - - public int getPrefetchHigh() - { - return _prefetchHigh; - } - - public int getPrefetchLow() - { - return _prefetchLow; - } - - public boolean isNoLocal() - { - return _noLocal; - } - - public boolean isExclusive() - { - return _exclusive; - } - - public boolean isReceiving() - { - return _receiving.get(); - } - - public Message receive() throws JMSException - { - return receive(0); - } - - public Message receive(long l) throws JMSException - { - - checkPreConditions(); - - try - { - acquireReceiving(false); - } - catch (InterruptedException e) - { - _logger.warn("Interrupted acquire: " + e); - if (isClosed()) - { - return null; - } - } - - _session.startDispatcherIfNecessary(); - - try - { - Object o = getMessageFromQueue(l); - final AbstractJMSMessage m = returnMessageOrThrow(o); - if (m != null) - { - preApplicationProcessing(m); - postDeliver(m); - } - return m; - } - catch (InterruptedException e) - { - _logger.warn("Interrupted: " + e); - - return null; - } - finally - { - releaseReceiving(); - } - } - - public Object getMessageFromQueue(long l) throws InterruptedException - { - Object o; - if (l > 0) - { - o = _synchronousQueue.poll(l, TimeUnit.MILLISECONDS); - } - else if (l < 0) - { - o = _synchronousQueue.poll(); - } - else - { - o = _synchronousQueue.take(); - } - return o; - } - - abstract Message receiveBrowse() throws JMSException; - - public Message receiveNoWait() throws JMSException - { - checkPreConditions(); - - try - { - if (!acquireReceiving(true)) - { - //If we couldn't acquire the receiving thread then return null. - // This will occur if failing over. - return null; - } - } - catch (InterruptedException e) - { - /* - * This seems slightly shoddy but should never actually be executed - * since we told acquireReceiving to return immediately and it shouldn't - * block on anything. - */ - - return null; - } - - _session.startDispatcherIfNecessary(); - - try - { - Object o = getMessageFromQueue(-1); - final AbstractJMSMessage m = returnMessageOrThrow(o); - if (m != null) - { - preApplicationProcessing(m); - postDeliver(m); - } - - return m; - } - catch (InterruptedException e) - { - _logger.warn("Interrupted: " + e); - - return null; - } - finally - { - releaseReceiving(); - } - } - - /** - * We can get back either a Message or an exception from the queue. This method examines the argument and deals with - * it by throwing it (if an exception) or returning it (in any other case). - * - * @param o the object to return or throw - * @return a message only if o is a Message - * @throws JMSException if the argument is a throwable. If it is a JMSException it is rethrown as is, but if not a - * JMSException is created with the linked exception set appropriately - */ - private AbstractJMSMessage returnMessageOrThrow(Object o) throws JMSException - { - // errors are passed via the queue too since there is no way of interrupting the poll() via the API. - if (o instanceof Throwable) - { - JMSException e = new JMSException("Message consumer forcibly closed due to error: " + o); - e.initCause((Throwable) o); - if (o instanceof Exception) - { - e.setLinkedException((Exception) o); - } - - throw e; - } - else if (o instanceof CloseConsumerMessage) - { - _closed.set(true); - deregisterConsumer(); - return null; - } - else - { - return (AbstractJMSMessage) o; - } - } - - public void close() throws JMSException - { - close(true); - } - - public void close(boolean sendClose) throws JMSException - { - if (_logger.isInfoEnabled()) - { - _logger.info("Closing consumer:" + debugIdentity()); - } - - if (!_closed.getAndSet(true)) - { - _closing.set(true); - if (_logger.isDebugEnabled()) - { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - if (_closedStack != null) - { - _logger.debug(_consumerTag + " previously:" + _closedStack.toString()); - } - else - { - _closedStack = Arrays.asList(stackTrace).subList(3, stackTrace.length - 1); - } - } - - if (sendClose) - { - // The Synchronized block only needs to protect network traffic. - synchronized (_connection.getFailoverMutex()) - { - try - { - // If the session is open or we are in the process - // of closing the session then send a cance - // no point otherwise as the connection will be gone - if (!_session.isClosed() || _session.isClosing()) - { - sendCancel(); - cleanupQueue(); - } - } - catch (AMQException e) - { - throw new JMSAMQException("Error closing consumer: " + e, e); - } - catch (FailoverException e) - { - throw new JMSAMQException("FailoverException interrupted basic cancel.", e); - } - } - } - else - { - // FIXME: wow this is ugly - // //fixme this probably is not right - // if (!isNoConsume()) - { // done in BasicCancelOK Handler but not sending one so just deregister. - deregisterConsumer(); - } - } - - // This will occur if session.close is called closing all consumers we may be blocked waiting for a receive - // so we need to let it know it is time to close. - if ((_messageListener != null) && _receiving.get()) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Interrupting thread: " + _receivingThread); - } - - _receivingThread.interrupt(); - } - } - } - - abstract void sendCancel() throws AMQException, FailoverException; - - abstract void cleanupQueue() throws AMQException, FailoverException; - - /** - * Called when you need to invalidate a consumer. Used for example when failover has occurred and the client has - * vetoed automatic resubscription. The caller must hold the failover mutex. - */ - void markClosed() - { - // synchronized (_closed) - { - _closed.set(true); - - if (_logger.isDebugEnabled()) - { - if (_closedStack != null) - { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - _logger.debug(_consumerTag + " markClosed():" - + Arrays.asList(stackTrace).subList(3, stackTrace.length - 1)); - _logger.debug(_consumerTag + " previously:" + _closedStack.toString()); - } - else - { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - _closedStack = Arrays.asList(stackTrace).subList(3, stackTrace.length - 1); - } - } - } - - deregisterConsumer(); - } - - /** - * @param closeMessage - * this message signals that we should close the browser - */ - public void notifyCloseMessage(CloseConsumerMessage closeMessage) - { - if (isMessageListenerSet()) - { - // Currently only possible to get this msg type with a browser. - // If we get the message here then we should probably just close - // this consumer. - // Though an AutoClose consumer with message listener is quite odd.. - // Just log out the fact so we know where we are - _logger.warn("Using an AutoCloseconsumer with message listener is not supported."); - } - else - { - try - { - _synchronousQueue.put(closeMessage); - } - catch (InterruptedException e) - { - _logger.info(" SynchronousQueue.put interupted. Usually result of connection closing," - + "but we shouldn't have close yet"); - } - } - } - - - /** - * Called from the AMQSession when a message has arrived for this consumer. This methods handles both the case of a - * message listener or a synchronous receive() caller. - * - * @param messageFrame the raw unprocessed mesage - */ - void notifyMessage(U messageFrame) - { - if (messageFrame instanceof CloseConsumerMessage) - { - notifyCloseMessage((CloseConsumerMessage) messageFrame); - return; - } - - - - try - { - AbstractJMSMessage jmsMessage = createJMSMessageFromUnprocessedMessage(_session.getMessageDelegateFactory(), messageFrame); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Message is of type: " + jmsMessage.getClass().getName()); - } - notifyMessage(jmsMessage); - } - catch (Exception e) - { - if (e instanceof InterruptedException) - { - _logger.info("SynchronousQueue.put interupted. Usually result of connection closing"); - } - else - { - _logger.error("Caught exception (dump follows) - ignoring...", e); - } - } - } - - public abstract AbstractJMSMessage createJMSMessageFromUnprocessedMessage(AMQMessageDelegateFactory delegateFactory, U messageFrame) - throws Exception; - - /** @param jmsMessage this message has already been processed so can't redo preDeliver */ - public void notifyMessage(AbstractJMSMessage jmsMessage) - { - try - { - if (isMessageListenerSet()) - { - preApplicationProcessing(jmsMessage); - getMessageListener().onMessage(jmsMessage); - postDeliver(jmsMessage); - } - else - { - // we should not be allowed to add a message is the - // consumer is closed - _synchronousQueue.put(jmsMessage); - } - } - catch (Exception e) - { - if (e instanceof InterruptedException) - { - _logger.info("reNotification : SynchronousQueue.put interupted. Usually result of connection closing"); - } - else - { - _logger.error("reNotification : Caught exception (dump follows) - ignoring...", e); - } - } - } - - void preDeliver(AbstractJMSMessage msg) - { - switch (_acknowledgeMode) - { - - case Session.PRE_ACKNOWLEDGE: - _session.acknowledgeMessage(msg.getDeliveryTag(), false); - break; - - case Session.CLIENT_ACKNOWLEDGE: - // we set the session so that when the user calls acknowledge() it can call the method on session - // to send out the appropriate frame - msg.setAMQSession(_session); - break; - case Session.SESSION_TRANSACTED: - if (isNoConsume()) - { - _session.acknowledgeMessage(msg.getDeliveryTag(), false); - } - else - { - _session.addDeliveredMessage(msg.getDeliveryTag()); - _session.markDirty(); - } - - break; - } - - } - - void postDeliver(AbstractJMSMessage msg) throws JMSException - { - switch (_acknowledgeMode) - { - - case Session.CLIENT_ACKNOWLEDGE: - if (isNoConsume()) - { - _session.acknowledgeMessage(msg.getDeliveryTag(), false); - } - _session.markDirty(); - break; - - case Session.DUPS_OK_ACKNOWLEDGE: - case Session.AUTO_ACKNOWLEDGE: - // we do not auto ack a message if the application code called recover() - if (!_session.isInRecovery()) - { - _session.acknowledgeMessage(msg.getDeliveryTag(), false); - } - - break; - } - } - - - /** - * Acknowledge up to last message delivered (if any). Used when commiting. - * - * @return the lastDeliveryTag to acknowledge - */ - Long getLastDelivered() - { - if (!_receivedDeliveryTags.isEmpty()) - { - Long lastDeliveryTag = _receivedDeliveryTags.poll(); - - while (!_receivedDeliveryTags.isEmpty()) - { - lastDeliveryTag = _receivedDeliveryTags.poll(); - } - - assert _receivedDeliveryTags.isEmpty(); - - return lastDeliveryTag; - } - - return null; - } - - /** - * Acknowledge up to last message delivered (if any). Used when commiting. - */ - void acknowledgeDelivered() - { - synchronized(_commitLock) - { - ArrayList<Long> tagsToAck = new ArrayList<Long>(); - - while (!_receivedDeliveryTags.isEmpty()) - { - tagsToAck.add(_receivedDeliveryTags.poll()); - } - - Collections.sort(tagsToAck); - - long prevAcked = _lastAcked; - long oldAckPoint = -1; - - while(oldAckPoint != prevAcked) - { - oldAckPoint = prevAcked; - - Iterator<Long> tagsToAckIterator = tagsToAck.iterator(); - - while(tagsToAckIterator.hasNext() && tagsToAckIterator.next() == prevAcked+1) - { - tagsToAckIterator.remove(); - prevAcked++; - } - - Iterator<Long> previousAckIterator = _previouslyAcked.iterator(); - while(previousAckIterator.hasNext() && previousAckIterator.next() == prevAcked+1) - { - previousAckIterator.remove(); - prevAcked++; - } - - } - if(prevAcked != _lastAcked) - { - _session.acknowledgeMessage(prevAcked, true); - _lastAcked = prevAcked; - } - - Iterator<Long> tagsToAckIterator = tagsToAck.iterator(); - - while(tagsToAckIterator.hasNext()) - { - Long tag = tagsToAckIterator.next(); - _session.acknowledgeMessage(tag, false); - _previouslyAcked.add(tag); - } - } - } - - - void notifyError(Throwable cause) - { - // synchronized (_closed) - { - _closed.set(true); - if (_logger.isDebugEnabled()) - { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - if (_closedStack != null) - { - _logger.debug(_consumerTag + " notifyError():" - + Arrays.asList(stackTrace).subList(3, stackTrace.length - 1)); - _logger.debug(_consumerTag + " previously" + _closedStack.toString()); - } - else - { - _closedStack = Arrays.asList(stackTrace).subList(3, stackTrace.length - 1); - } - } - } - // QPID-293 can "request redelivery of this error through dispatcher" - - // we have no way of propagating the exception to a message listener - a JMS limitation - so we - // deal with the case where we have a synchronous receive() waiting for a message to arrive - if (!isMessageListenerSet()) - { - // offer only succeeds if there is a thread waiting for an item from the queue - if (_synchronousQueue.offer(cause)) - { - _logger.debug("Passed exception to synchronous queue for propagation to receive()"); - } - } - - deregisterConsumer(); - } - - /** - * Perform cleanup to deregister this consumer. This occurs when closing the consumer in both the clean case and in - * the case of an error occurring. - */ - private void deregisterConsumer() - { - _session.deregisterConsumer(this); - } - - public int getConsumerTag() - { - return _consumerTag; - } - - public void setConsumerTag(int consumerTag) - { - _consumerTag = consumerTag; - } - - public AMQSession getSession() - { - return _session; - } - - private void checkPreConditions() throws JMSException - { - - this.checkNotClosed(); - - if ((_session == null) || _session.isClosed()) - { - throw new javax.jms.IllegalStateException("Invalid Session"); - } - } - - public boolean isAutoClose() - { - return _autoClose; - } - - public boolean isNoConsume() - { - return _noConsume || _destination.isBrowseOnly() ; - } - - public void rollback() - { - rollbackPendingMessages(); - } - - public void rollbackPendingMessages() - { - if (_synchronousQueue.size() > 0) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejecting the messages(" + _synchronousQueue - .size() + ") in _syncQueue (PRQ)" + "for consumer with tag:" + _consumerTag); - } - - Iterator iterator = _synchronousQueue.iterator(); - - int initialSize = _synchronousQueue.size(); - - boolean removed = false; - while (iterator.hasNext()) - { - - Object o = iterator.next(); - if (o instanceof AbstractJMSMessage) - { - _session.rejectMessage(((AbstractJMSMessage) o), true); - - if (_logger.isDebugEnabled()) - { - _logger.debug("Rejected message:" + ((AbstractJMSMessage) o).getDeliveryTag()); - } - - iterator.remove(); - removed = true; - - } - else - { - _logger.error("Queue contained a :" + o.getClass() - + " unable to reject as it is not an AbstractJMSMessage. Will be cleared"); - iterator.remove(); - removed = true; - } - } - - if (removed && (initialSize == _synchronousQueue.size())) - { - _logger.error("Queue had content removed but didn't change in size." + initialSize); - } - - - if (_synchronousQueue.size() != 0) - { - _logger.warn("Queue was not empty after rejecting all messages Remaining:" + _synchronousQueue.size()); - rollback(); - } - - clearReceiveQueue(); - } - } - - public String debugIdentity() - { - return String.valueOf(_consumerTag) + "[" + System.identityHashCode(this) + "]"; - } - - public void clearReceiveQueue() - { - _synchronousQueue.clear(); - } - - - public List<Long> drainReceiverQueueAndRetrieveDeliveryTags() - { - Iterator<AbstractJMSMessage> iterator = _synchronousQueue.iterator(); - List<Long> tags = new ArrayList<Long>(_synchronousQueue.size()); - - while (iterator.hasNext()) - { - - AbstractJMSMessage msg = iterator.next(); - tags.add(msg.getDeliveryTag()); - iterator.remove(); - } - return tags; - } - - public AMQShortString getQueuename() - { - return _queuename; - } - - public void setQueuename(AMQShortString queuename) - { - this._queuename = queuename; - } - - public void addBindingKey(AMQDestination amqd, String routingKey) throws AMQException - { - _session.addBindingKey(this,amqd,routingKey); - } - - /** to be called when a failover has occured */ - public void failedOverPre() - { - clearReceiveQueue(); - // TGM FIXME: think this should just be removed - // clearUnackedMessages(); - } - - public void failedOverPost() {} - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_10.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_10.java deleted file mode 100644 index 964c238946..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_10.java +++ /dev/null @@ -1,529 +0,0 @@ -/* 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.qpid.client; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.qpid.client.AMQDestination.AddressOption; -import org.apache.qpid.client.AMQDestination.DestSyntax; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.message.*; -import org.apache.qpid.client.messaging.address.Node.QueueNode; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.transport.*; -import org.apache.qpid.filter.MessageFilter; -import org.apache.qpid.filter.JMSSelectorFilter; - -import javax.jms.InvalidSelectorException; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import java.util.Iterator; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * This is a 0.10 message consumer. - */ -public class BasicMessageConsumer_0_10 extends BasicMessageConsumer<UnprocessedMessage_0_10> -{ - - /** - * This class logger - */ - protected final Logger _logger = LoggerFactory.getLogger(getClass()); - - /** - * The message selector filter associated with this consumer message selector - */ - private MessageFilter _filter = null; - - /** - * The underlying QpidSession - */ - private AMQSession_0_10 _0_10session; - - /** - * Indicates whether this consumer receives pre-acquired messages - */ - private boolean _preAcquire = true; - - /** - * Indicate whether this consumer is started. - */ - private boolean _isStarted = false; - - /** - * Specify whether this consumer is performing a sync receive - */ - private final AtomicBoolean _syncReceive = new AtomicBoolean(false); - private String _consumerTagString; - - private long capacity = 0; - - //--- constructor - protected BasicMessageConsumer_0_10(int channelId, AMQConnection connection, AMQDestination destination, - String messageSelector, boolean noLocal, MessageFactoryRegistry messageFactory, - AMQSession session, AMQProtocolHandler protocolHandler, - FieldTable arguments, int prefetchHigh, int prefetchLow, - boolean exclusive, int acknowledgeMode, boolean noConsume, boolean autoClose) - throws JMSException - { - super(channelId, connection, destination, messageSelector, noLocal, messageFactory, session, protocolHandler, - arguments, prefetchHigh, prefetchLow, exclusive, acknowledgeMode, noConsume, autoClose); - _0_10session = (AMQSession_0_10) session; - if (messageSelector != null && !messageSelector.equals("")) - { - try - { - _filter = new JMSSelectorFilter(messageSelector); - } - catch (AMQInternalException e) - { - throw new InvalidSelectorException("cannot create consumer because of selector issue"); - } - if (destination instanceof AMQQueue) - { - _preAcquire = false; - } - } - _isStarted = connection.started(); - - // Destination setting overrides connection defaults - if (destination.getDestSyntax() == DestSyntax.ADDR && - destination.getLink().getConsumerCapacity() > 0) - { - capacity = destination.getLink().getConsumerCapacity(); - } - else if (getSession().prefetch()) - { - capacity = _0_10session.getAMQConnection().getMaxPrefetch(); - } - - if (destination.isAddressResolved() && AMQDestination.TOPIC_TYPE == destination.getAddressType()) - { - boolean namedQueue = destination.getLink() != null && destination.getLink().getName() != null ; - - if (!namedQueue) - { - _destination = destination.copyDestination(); - _destination.setQueueName(null); - } - } - } - - - @Override public void setConsumerTag(int consumerTag) - { - super.setConsumerTag(consumerTag); - _consumerTagString = String.valueOf(consumerTag); - } - - public String getConsumerTagString() - { - return _consumerTagString; - } - - /** - * - * This is invoked by the session thread when emptying the session message queue. - * We first check if the message is valid (match the selector) and then deliver it to the - * message listener or to the sync consumer queue. - * - * @param jmsMessage this message has already been processed so can't redo preDeliver - */ - @Override public void notifyMessage(AbstractJMSMessage jmsMessage) - { - try - { - if (checkPreConditions(jmsMessage)) - { - if (isMessageListenerSet() && capacity == 0) - { - _0_10session.getQpidSession().messageFlow(getConsumerTagString(), - MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - _logger.debug("messageOk, trying to notify"); - super.notifyMessage(jmsMessage); - } - } - catch (AMQException e) - { - _logger.error("Receivecd an Exception when receiving message",e); - getSession().getAMQConnection().exceptionReceived(e); - } - } - - //----- overwritten methods - - /** - * This method is invoked when this consumer is stopped. - * It tells the broker to stop delivering messages to this consumer. - */ - @Override void sendCancel() throws AMQException - { - _0_10session.getQpidSession().messageCancel(getConsumerTagString()); - try - { - _0_10session.getQpidSession().sync(); - getSession().confirmConsumerCancelled(getConsumerTag()); // confirm cancel - } - catch (SessionException se) - { - _0_10session.setCurrentException(se); - } - - AMQException amqe = _0_10session.getCurrentException(); - if (amqe != null) - { - throw amqe; - } - } - - @Override void notifyMessage(UnprocessedMessage_0_10 messageFrame) - { - super.notifyMessage(messageFrame); - } - - @Override protected void preApplicationProcessing(AbstractJMSMessage jmsMsg) throws JMSException - { - super.preApplicationProcessing(jmsMsg); - if (!_session.getTransacted() && _session.getAcknowledgeMode() != org.apache.qpid.jms.Session.CLIENT_ACKNOWLEDGE) - { - _session.addUnacknowledgedMessage(jmsMsg.getDeliveryTag()); - } - } - - @Override public AbstractJMSMessage createJMSMessageFromUnprocessedMessage( - AMQMessageDelegateFactory delegateFactory, UnprocessedMessage_0_10 msg) throws Exception - { - AMQMessageDelegate_0_10.updateExchangeTypeMapping(msg.getMessageTransfer().getHeader(), ((AMQSession_0_10)getSession()).getQpidSession()); - return _messageFactory.createMessage(msg.getMessageTransfer()); - } - - // private methods - /** - * Check whether a message can be delivered to this consumer. - * - * @param message The message to be checked. - * @return true if the message matches the selector and can be acquired, false otherwise. - * @throws AMQException If the message preConditions cannot be checked due to some internal error. - */ - private boolean checkPreConditions(AbstractJMSMessage message) throws AMQException - { - boolean messageOk = true; - // TODO Use a tag for fiding out if message filtering is done here or by the broker. - try - { - if (_messageSelector != null && !_messageSelector.equals("")) - { - messageOk = _filter.matches(message); - } - } - catch (Exception e) - { - throw new AMQException(AMQConstant.INTERNAL_ERROR, "Error when evaluating message selector", e); - } - - if (_logger.isDebugEnabled()) - { - _logger.debug("messageOk " + messageOk); - _logger.debug("_preAcquire " + _preAcquire); - } - if (!messageOk) - { - if (_preAcquire) - { - // this is the case for topics - // We need to ack this message - if (_logger.isDebugEnabled()) - { - _logger.debug("filterMessage - trying to ack message"); - } - acknowledgeMessage(message); - } - else - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Message not OK, releasing"); - } - releaseMessage(message); - } - // if we are syncrhonously waiting for a message - // and messages are not prefetched we then need to request another one - if(capacity == 0) - { - _0_10session.getQpidSession().messageFlow(getConsumerTagString(), - MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - } - // now we need to acquire this message if needed - // this is the case of queue with a message selector set - if (!_preAcquire && messageOk && !isNoConsume()) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("filterMessage - trying to acquire message"); - } - messageOk = acquireMessage(message); - _logger.debug("filterMessage - message acquire status : " + messageOk); - } - return messageOk; - } - - - /** - * Acknowledge a message - * - * @param message The message to be acknowledged - * @throws AMQException If the message cannot be acquired due to some internal error. - */ - private void acknowledgeMessage(AbstractJMSMessage message) throws AMQException - { - if (!_preAcquire) - { - RangeSet ranges = new RangeSet(); - ranges.add((int) message.getDeliveryTag()); - _0_10session.messageAcknowledge - (ranges, - _acknowledgeMode != org.apache.qpid.jms.Session.NO_ACKNOWLEDGE); - - AMQException amqe = _0_10session.getCurrentException(); - if (amqe != null) - { - throw amqe; - } - } - } - - /** - * Release a message - * - * @param message The message to be released - * @throws AMQException If the message cannot be released due to some internal error. - */ - private void releaseMessage(AbstractJMSMessage message) throws AMQException - { - if (_preAcquire) - { - RangeSet ranges = new RangeSet(); - ranges.add((int) message.getDeliveryTag()); - _0_10session.getQpidSession().messageRelease(ranges); - _0_10session.sync(); - } - } - - /** - * Acquire a message - * - * @param message The message to be acquired - * @return true if the message has been acquired, false otherwise. - * @throws AMQException If the message cannot be acquired due to some internal error. - */ - private boolean acquireMessage(AbstractJMSMessage message) throws AMQException - { - boolean result = false; - if (!_preAcquire) - { - RangeSet ranges = new RangeSet(); - ranges.add((int) message.getDeliveryTag()); - - Acquired acq = _0_10session.getQpidSession().messageAcquire(ranges).get(); - - RangeSet acquired = acq.getTransfers(); - if (acquired != null && acquired.size() > 0) - { - result = true; - } - } - return result; - } - - - public void setMessageListener(final MessageListener messageListener) throws JMSException - { - super.setMessageListener(messageListener); - if (messageListener != null && capacity == 0) - { - _0_10session.getQpidSession().messageFlow(getConsumerTagString(), - MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - if (messageListener != null && !_synchronousQueue.isEmpty()) - { - Iterator messages=_synchronousQueue.iterator(); - while (messages.hasNext()) - { - AbstractJMSMessage message=(AbstractJMSMessage) messages.next(); - messages.remove(); - _session.rejectMessage(message, true); - } - } - } - - public void failedOverPost() - { - if (_0_10session.isStarted() && _syncReceive.get()) - { - _0_10session.getQpidSession().messageFlow - (getConsumerTagString(), MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - } - - /** - * When messages are not prefetched we need to request a message from the - * broker. - * Note that if the timeout is too short a message may be queued in _synchronousQueue until - * this consumer closes or request it. - * @param l - * @return - * @throws InterruptedException - */ - public Object getMessageFromQueue(long l) throws InterruptedException - { - if (capacity == 0) - { - _syncReceive.set(true); - } - if (_0_10session.isStarted() && capacity == 0 && _synchronousQueue.isEmpty()) - { - _0_10session.getQpidSession().messageFlow(getConsumerTagString(), - MessageCreditUnit.MESSAGE, 1, - Option.UNRELIABLE); - } - Object o = super.getMessageFromQueue(l); - if (o == null && _0_10session.isStarted()) - { - - _0_10session.getQpidSession().messageFlush - (getConsumerTagString(), Option.UNRELIABLE, Option.SYNC); - _0_10session.getQpidSession().sync(); - _0_10session.getQpidSession().messageFlow - (getConsumerTagString(), MessageCreditUnit.BYTE, - 0xFFFFFFFF, Option.UNRELIABLE); - - if (capacity > 0) - { - _0_10session.getQpidSession().messageFlow - (getConsumerTagString(), - MessageCreditUnit.MESSAGE, - capacity, - Option.UNRELIABLE); - } - _0_10session.syncDispatchQueue(); - o = super.getMessageFromQueue(-1); - } - if (capacity == 0) - { - _syncReceive.set(false); - } - return o; - } - - void postDeliver(AbstractJMSMessage msg) throws JMSException - { - super.postDeliver(msg); - if (_acknowledgeMode == org.apache.qpid.jms.Session.NO_ACKNOWLEDGE && !_session.isInRecovery()) - { - _session.acknowledgeMessage(msg.getDeliveryTag(), false); - } - - if (_acknowledgeMode == org.apache.qpid.jms.Session.AUTO_ACKNOWLEDGE && - !_session.isInRecovery() && - _session.getAMQConnection().getSyncAck()) - { - ((AMQSession_0_10) getSession()).flushAcknowledgments(); - ((AMQSession_0_10) getSession()).getQpidSession().sync(); - } - } - - Message receiveBrowse() throws JMSException - { - return receiveNoWait(); - } - - @Override public void rollbackPendingMessages() - { - if (_synchronousQueue.size() > 0) - { - RangeSet ranges = new RangeSet(); - Iterator iterator = _synchronousQueue.iterator(); - while (iterator.hasNext()) - { - - Object o = iterator.next(); - if (o instanceof AbstractJMSMessage) - { - ranges.add((int) ((AbstractJMSMessage) o).getDeliveryTag()); - iterator.remove(); - } - else - { - _logger.error("Queue contained a :" + o.getClass() - + " unable to reject as it is not an AbstractJMSMessage. Will be cleared"); - iterator.remove(); - } - } - - _0_10session.getQpidSession().messageRelease(ranges, Option.SET_REDELIVERED); - clearReceiveQueue(); - } - } - - public boolean isExclusive() - { - AMQDestination dest = this.getDestination(); - if (dest.getDestSyntax() == AMQDestination.DestSyntax.ADDR) - { - if (dest.getAddressType() == AMQDestination.TOPIC_TYPE) - { - return true; - } - else - { - return dest.getLink().getSubscription().isExclusive(); - } - } - else - { - return _exclusive; - } - } - - void cleanupQueue() throws AMQException, FailoverException - { - AMQDestination dest = this.getDestination(); - if (dest != null && dest.getDestSyntax() == AMQDestination.DestSyntax.ADDR) - { - if (dest.getDelete() == AddressOption.ALWAYS || - dest.getDelete() == AddressOption.RECEIVER ) - { - ((AMQSession_0_10) getSession()).getQpidSession().queueDelete( - this.getDestination().getQueueName()); - } - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_8.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_8.java deleted file mode 100644 index 00acd5e866..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer_0_8.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * 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.qpid.client; - -import javax.jms.InvalidSelectorException; -import javax.jms.JMSException; -import javax.jms.Message; - -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.message.*; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.filter.JMSSelectorFilter; -import org.apache.qpid.framing.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BasicMessageConsumer_0_8 extends BasicMessageConsumer<UnprocessedMessage_0_8> -{ - protected final Logger _logger = LoggerFactory.getLogger(getClass()); - - protected BasicMessageConsumer_0_8(int channelId, AMQConnection connection, AMQDestination destination, - String messageSelector, boolean noLocal, MessageFactoryRegistry messageFactory, AMQSession session, - AMQProtocolHandler protocolHandler, FieldTable arguments, int prefetchHigh, int prefetchLow, - boolean exclusive, int acknowledgeMode, boolean noConsume, boolean autoClose) throws JMSException - { - super(channelId, connection, destination,messageSelector,noLocal,messageFactory,session, - protocolHandler, arguments, prefetchHigh, prefetchLow, exclusive, - acknowledgeMode, noConsume, autoClose); - try - { - - if (messageSelector != null && messageSelector.length() > 0) - { - JMSSelectorFilter _filter = new JMSSelectorFilter(messageSelector); - } - } - catch (AMQInternalException e) - { - throw new InvalidSelectorException("cannot create consumer because of selector issue"); - } - } - - void sendCancel() throws AMQException, FailoverException - { - BasicCancelBody body = getSession().getMethodRegistry().createBasicCancelBody(new AMQShortString(String.valueOf(_consumerTag)), false); - - final AMQFrame cancelFrame = body.generateFrame(_channelId); - - _protocolHandler.syncWrite(cancelFrame, BasicCancelOkBody.class); - - if (_logger.isDebugEnabled()) - { - _logger.debug("CancelOk'd for consumer:" + debugIdentity()); - } - } - - public AbstractJMSMessage createJMSMessageFromUnprocessedMessage(AMQMessageDelegateFactory delegateFactory, UnprocessedMessage_0_8 messageFrame)throws Exception - { - - return _messageFactory.createMessage(messageFrame.getDeliveryTag(), - messageFrame.isRedelivered(), messageFrame.getExchange(), - messageFrame.getRoutingKey(), messageFrame.getContentHeader(), messageFrame.getBodies()); - - } - - Message receiveBrowse() throws JMSException - { - return receive(); - } - - void cleanupQueue() throws AMQException, FailoverException - { - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java deleted file mode 100644 index 8756ac4d05..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java +++ /dev/null @@ -1,601 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.io.UnsupportedEncodingException; -import java.util.UUID; - -import javax.jms.BytesMessage; -import javax.jms.DeliveryMode; -import javax.jms.Destination; -import javax.jms.InvalidDestinationException; -import javax.jms.JMSException; -import javax.jms.MapMessage; -import javax.jms.Message; -import javax.jms.ObjectMessage; -import javax.jms.StreamMessage; -import javax.jms.TextMessage; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.client.message.MessageConverter; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.framing.ContentBody; -import org.apache.qpid.util.UUIDGen; -import org.apache.qpid.util.UUIDs; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class BasicMessageProducer extends Closeable implements org.apache.qpid.jms.MessageProducer -{ - enum PublishMode { ASYNC_PUBLISH_ALL, SYNC_PUBLISH_PERSISTENT, SYNC_PUBLISH_ALL }; - - protected final Logger _logger = LoggerFactory.getLogger(getClass()); - - private AMQConnection _connection; - - /** - * If true, messages will not get a timestamp. - */ - protected boolean _disableTimestamps; - - /** - * Priority of messages created by this producer. - */ - private int _messagePriority = Message.DEFAULT_PRIORITY; - - /** - * Time to live of messages. Specified in milliseconds but AMQ has 1 second resolution. - */ - private long _timeToLive; - - /** - * Delivery mode used for this producer. - */ - private int _deliveryMode = DeliveryMode.PERSISTENT; - - /** - * The Destination used for this consumer, if specified upon creation. - */ - protected AMQDestination _destination; - - /** - * Default encoding used for messages produced by this producer. - */ - private String _encoding; - - /** - * Default encoding used for message produced by this producer. - */ - private String _mimeType; - - protected AMQProtocolHandler _protocolHandler; - - /** - * True if this producer was created from a transacted session - */ - private boolean _transacted; - - protected int _channelId; - - /** - * This is an id generated by the session and is used to tie individual producers to the session. This means we - * can deregister a producer with the session when the producer is clsoed. We need to be able to tie producers - * to the session so that when an error is propagated to the session it can close the producer (meaning that - * a client that happens to hold onto a producer reference will get an error if he tries to use it subsequently). - */ - private long _producerId; - - /** - * The session used to create this producer - */ - protected AMQSession _session; - - private final boolean _immediate; - - private final boolean _mandatory; - - private final boolean _waitUntilSent; - - private boolean _disableMessageId; - - private UUIDGen _messageIdGenerator = UUIDs.newGenerator(); - - protected String _userID; // ref user id used in the connection. - - private static final ContentBody[] NO_CONTENT_BODIES = new ContentBody[0]; - - protected PublishMode publishMode = PublishMode.ASYNC_PUBLISH_ALL; - - protected BasicMessageProducer(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId, - AMQSession session, AMQProtocolHandler protocolHandler, long producerId, boolean immediate, boolean mandatory, - boolean waitUntilSent) throws AMQException - { - _connection = connection; - _destination = destination; - _transacted = transacted; - _protocolHandler = protocolHandler; - _channelId = channelId; - _session = session; - _producerId = producerId; - if (destination != null && !(destination instanceof AMQUndefinedDestination)) - { - declareDestination(destination); - } - - _immediate = immediate; - _mandatory = mandatory; - _waitUntilSent = waitUntilSent; - _userID = connection.getUsername(); - setPublishMode(); - } - - void setPublishMode() - { - // Publish mode could be configured at destination level as well. - // Will add support for this when we provide a more robust binding URL - - String syncPub = _connection.getSyncPublish(); - // Support for deprecated option sync_persistence - if (syncPub.equals("persistent") || _connection.getSyncPersistence()) - { - publishMode = PublishMode.SYNC_PUBLISH_PERSISTENT; - } - else if (syncPub.equals("all")) - { - publishMode = PublishMode.SYNC_PUBLISH_ALL; - } - - _logger.info("MessageProducer " + toString() + " using publish mode : " + publishMode); - } - - void resubscribe() throws AMQException - { - if (_destination != null && !(_destination instanceof AMQUndefinedDestination)) - { - declareDestination(_destination); - } - } - - abstract void declareDestination(AMQDestination destination) throws AMQException; - - public void setDisableMessageID(boolean b) throws JMSException - { - checkPreConditions(); - checkNotClosed(); - _disableMessageId = b; - } - - public boolean getDisableMessageID() throws JMSException - { - checkNotClosed(); - - return _disableMessageId; - } - - public void setDisableMessageTimestamp(boolean b) throws JMSException - { - checkPreConditions(); - _disableTimestamps = b; - } - - public boolean getDisableMessageTimestamp() throws JMSException - { - checkNotClosed(); - - return _disableTimestamps; - } - - public void setDeliveryMode(int i) throws JMSException - { - checkPreConditions(); - if ((i != DeliveryMode.NON_PERSISTENT) && (i != DeliveryMode.PERSISTENT)) - { - throw new JMSException("DeliveryMode must be either NON_PERSISTENT or PERSISTENT. Value of " + i - + " is illegal"); - } - - _deliveryMode = i; - } - - public int getDeliveryMode() throws JMSException - { - checkNotClosed(); - - return _deliveryMode; - } - - public void setPriority(int i) throws JMSException - { - checkPreConditions(); - if ((i < 0) || (i > 9)) - { - throw new IllegalArgumentException("Priority of " + i + " is illegal. Value must be in range 0 to 9"); - } - - _messagePriority = i; - } - - public int getPriority() throws JMSException - { - checkNotClosed(); - - return _messagePriority; - } - - public void setTimeToLive(long l) throws JMSException - { - checkPreConditions(); - if (l < 0) - { - throw new IllegalArgumentException("Time to live must be non-negative - supplied value was " + l); - } - - _timeToLive = l; - } - - public long getTimeToLive() throws JMSException - { - checkNotClosed(); - - return _timeToLive; - } - - public Destination getDestination() throws JMSException - { - checkNotClosed(); - - return _destination; - } - - public void close() - { - _closed.set(true); - _session.deregisterProducer(_producerId); - } - - public void send(Message message) throws JMSException - { - checkPreConditions(); - checkInitialDestination(); - - - synchronized (_connection.getFailoverMutex()) - { - sendImpl(_destination, message, _deliveryMode, _messagePriority, _timeToLive, _mandatory, _immediate); - } - } - - public void send(Message message, int deliveryMode) throws JMSException - { - checkPreConditions(); - checkInitialDestination(); - - synchronized (_connection.getFailoverMutex()) - { - sendImpl(_destination, message, deliveryMode, _messagePriority, _timeToLive, _mandatory, _immediate); - } - } - - public void send(Message message, int deliveryMode, boolean immediate) throws JMSException - { - checkPreConditions(); - checkInitialDestination(); - synchronized (_connection.getFailoverMutex()) - { - sendImpl(_destination, message, deliveryMode, _messagePriority, _timeToLive, _mandatory, immediate); - } - } - - public void send(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkPreConditions(); - checkInitialDestination(); - synchronized (_connection.getFailoverMutex()) - { - sendImpl(_destination, message, deliveryMode, priority, timeToLive, _mandatory, _immediate); - } - } - - public void send(Destination destination, Message message) throws JMSException - { - checkPreConditions(); - checkDestination(destination); - synchronized (_connection.getFailoverMutex()) - { - validateDestination(destination); - sendImpl((AMQDestination) destination, message, _deliveryMode, _messagePriority, _timeToLive, _mandatory, - _immediate); - } - } - - public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive) - throws JMSException - { - checkPreConditions(); - checkDestination(destination); - synchronized (_connection.getFailoverMutex()) - { - validateDestination(destination); - sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive, _mandatory, _immediate); - } - } - - public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive, - boolean mandatory) throws JMSException - { - checkPreConditions(); - checkDestination(destination); - synchronized (_connection.getFailoverMutex()) - { - validateDestination(destination); - sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive, mandatory, _immediate); - } - } - - public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive, - boolean mandatory, boolean immediate) throws JMSException - { - checkPreConditions(); - checkDestination(destination); - synchronized (_connection.getFailoverMutex()) - { - validateDestination(destination); - sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive, mandatory, immediate); - } - } - - public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive, - boolean mandatory, boolean immediate, boolean waitUntilSent) throws JMSException - { - checkPreConditions(); - checkDestination(destination); - synchronized (_connection.getFailoverMutex()) - { - validateDestination(destination); - sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive, mandatory, immediate, - waitUntilSent); - } - } - - private AbstractJMSMessage convertToNativeMessage(Message message) throws JMSException - { - if (message instanceof AbstractJMSMessage) - { - return (AbstractJMSMessage) message; - } - else - { - AbstractJMSMessage newMessage; - - if (message instanceof BytesMessage) - { - newMessage = new MessageConverter(_session, (BytesMessage) message).getConvertedMessage(); - } - else if (message instanceof MapMessage) - { - newMessage = new MessageConverter(_session, (MapMessage) message).getConvertedMessage(); - } - else if (message instanceof ObjectMessage) - { - newMessage = new MessageConverter(_session, (ObjectMessage) message).getConvertedMessage(); - } - else if (message instanceof TextMessage) - { - newMessage = new MessageConverter(_session, (TextMessage) message).getConvertedMessage(); - } - else if (message instanceof StreamMessage) - { - newMessage = new MessageConverter(_session, (StreamMessage) message).getConvertedMessage(); - } - else - { - newMessage = new MessageConverter(_session, message).getConvertedMessage(); - } - - if (newMessage != null) - { - return newMessage; - } - else - { - throw new JMSException("Unable to send message, due to class conversion error: " - + message.getClass().getName()); - } - } - } - - private void validateDestination(Destination destination) throws JMSException - { - if (!(destination instanceof AMQDestination)) - { - throw new JMSException("Unsupported destination class: " - + ((destination != null) ? destination.getClass() : null)); - } - - AMQDestination amqDestination = (AMQDestination) destination; - if(!amqDestination.isExchangeExistsChecked()) - { - try - { - declareDestination(amqDestination); - } - catch(Exception e) - { - JMSException ex = new JMSException("Error validating destination"); - ex.initCause(e); - ex.setLinkedException(e); - - throw ex; - } - amqDestination.setExchangeExistsChecked(true); - } - } - - protected void sendImpl(AMQDestination destination, Message message, int deliveryMode, int priority, long timeToLive, - boolean mandatory, boolean immediate) throws JMSException - { - sendImpl(destination, message, deliveryMode, priority, timeToLive, mandatory, immediate, _waitUntilSent); - } - - /** - * The caller of this method must hold the failover mutex. - * - * @param destination - * @param origMessage - * @param deliveryMode - * @param priority - * @param timeToLive - * @param mandatory - * @param immediate - * - * @throws JMSException - */ - protected void sendImpl(AMQDestination destination, Message origMessage, int deliveryMode, int priority, long timeToLive, - boolean mandatory, boolean immediate, boolean wait) throws JMSException - { - checkTemporaryDestination(destination); - origMessage.setJMSDestination(destination); - - AbstractJMSMessage message = convertToNativeMessage(origMessage); - - if (_transacted) - { - if (_session.hasFailedOver() && _session.isDirty()) - { - throw new JMSAMQException("Failover has occurred and session is dirty so unable to send.", - new AMQSessionDirtyException("Failover has occurred and session is dirty " + - "so unable to send.")); - } - } - - UUID messageId = null; - if (_disableMessageId) - { - message.setJMSMessageID((UUID)null); - } - else - { - messageId = _messageIdGenerator.generate(); - message.setJMSMessageID(messageId); - } - - sendMessage(destination, origMessage, message, messageId, deliveryMode, priority, timeToLive, mandatory, immediate, wait); - - if (message != origMessage) - { - _logger.debug("Updating original message"); - origMessage.setJMSPriority(message.getJMSPriority()); - origMessage.setJMSTimestamp(message.getJMSTimestamp()); - _logger.debug("Setting JMSExpiration:" + message.getJMSExpiration()); - origMessage.setJMSExpiration(message.getJMSExpiration()); - origMessage.setJMSMessageID(message.getJMSMessageID()); - } - - if (_transacted) - { - _session.markDirty(); - } - } - - abstract void sendMessage(AMQDestination destination, Message origMessage, AbstractJMSMessage message, - UUID messageId, int deliveryMode, int priority, long timeToLive, boolean mandatory, - boolean immediate, boolean wait) throws JMSException; - - private void checkTemporaryDestination(AMQDestination destination) throws JMSException - { - if (destination instanceof TemporaryDestination) - { - _logger.debug("destination is temporary destination"); - TemporaryDestination tempDest = (TemporaryDestination) destination; - if (tempDest.getSession().isClosed()) - { - _logger.debug("session is closed"); - throw new JMSException("Session for temporary destination has been closed"); - } - - if (tempDest.isDeleted()) - { - _logger.debug("destination is deleted"); - throw new JMSException("Cannot send to a deleted temporary destination"); - } - } - } - - public void setMimeType(String mimeType) throws JMSException - { - checkNotClosed(); - _mimeType = mimeType; - } - - public void setEncoding(String encoding) throws JMSException, UnsupportedEncodingException - { - checkNotClosed(); - _encoding = encoding; - } - - private void checkPreConditions() throws javax.jms.IllegalStateException, JMSException - { - checkNotClosed(); - - if ((_session == null) || _session.isClosed()) - { - throw new javax.jms.IllegalStateException("Invalid Session"); - } - if(_session.getAMQConnection().isClosed()) - { - throw new javax.jms.IllegalStateException("Connection closed"); - } - } - - private void checkInitialDestination() - { - if (_destination == null) - { - throw new UnsupportedOperationException("Destination is null"); - } - } - - private void checkDestination(Destination suppliedDestination) throws InvalidDestinationException - { - if ((_destination != null) && (suppliedDestination != null)) - { - throw new UnsupportedOperationException( - "This message producer was created with a Destination, therefore you cannot use an unidentified Destination"); - } - - if (suppliedDestination == null) - { - throw new InvalidDestinationException("Supplied Destination was invalid"); - } - - } - - public AMQSession getSession() - { - return _session; - } - - public boolean isBound(AMQDestination destination) throws JMSException - { - return _session.isQueueBound(destination.getExchangeName(), null, destination.getRoutingKey()); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java deleted file mode 100644 index 62d1d1698c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java +++ /dev/null @@ -1,269 +0,0 @@ -/* 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.qpid.client; - -import static org.apache.qpid.transport.Option.NONE; -import static org.apache.qpid.transport.Option.SYNC; -import static org.apache.qpid.transport.Option.UNRELIABLE; - -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import javax.jms.DeliveryMode; -import javax.jms.JMSException; -import javax.jms.Message; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.AMQDestination.AddressOption; -import org.apache.qpid.client.AMQDestination.DestSyntax; -import org.apache.qpid.client.message.AMQMessageDelegate_0_10; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.client.messaging.address.Link.Reliability; -import org.apache.qpid.client.messaging.address.Node.QueueNode; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.transport.DeliveryProperties; -import org.apache.qpid.transport.Header; -import org.apache.qpid.transport.MessageAcceptMode; -import org.apache.qpid.transport.MessageAcquireMode; -import org.apache.qpid.transport.MessageDeliveryMode; -import org.apache.qpid.transport.MessageDeliveryPriority; -import org.apache.qpid.transport.MessageProperties; -import org.apache.qpid.transport.Option; -import org.apache.qpid.util.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is a 0_10 message producer. - */ -public class BasicMessageProducer_0_10 extends BasicMessageProducer -{ - private static final Logger _logger = LoggerFactory.getLogger(BasicMessageProducer_0_10.class); - private byte[] userIDBytes; - - BasicMessageProducer_0_10(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId, - AMQSession session, AMQProtocolHandler protocolHandler, long producerId, - boolean immediate, boolean mandatory, boolean waitUntilSent) throws AMQException - { - super(connection, destination, transacted, channelId, session, protocolHandler, producerId, immediate, - mandatory, waitUntilSent); - - userIDBytes = Strings.toUTF8(_userID); - } - - void declareDestination(AMQDestination destination) throws AMQException - { - if (destination.getDestSyntax() == DestSyntax.BURL) - { - if (getSession().isDeclareExchanges()) - { - String name = destination.getExchangeName().toString(); - ((AMQSession_0_10) getSession()).getQpidSession().exchangeDeclare - (name, - destination.getExchangeClass().toString(), - null, null, - name.startsWith("amq.") ? Option.PASSIVE : Option.NONE); - } - } - else - { - try - { - getSession().handleAddressBasedDestination(destination,false,false); - } - catch(Exception e) - { - AMQException ex = new AMQException("Exception occured while verifying destination",e); - throw ex; - } - } - } - - //--- Overwritten methods - - /** - * Sends a message to a given destination - */ - void sendMessage(AMQDestination destination, Message origMessage, AbstractJMSMessage message, - UUID messageId, int deliveryMode, int priority, long timeToLive, boolean mandatory, - boolean immediate, boolean wait) throws JMSException - { - message.prepareForSending(); - - AMQMessageDelegate_0_10 delegate = (AMQMessageDelegate_0_10) message.getDelegate(); - - DeliveryProperties deliveryProp = delegate.getDeliveryProperties(); - MessageProperties messageProps = delegate.getMessageProperties(); - - // On the receiving side, this will be read in to the JMSXUserID as well. - messageProps.setUserId(userIDBytes); - - if (messageId != null) - { - messageProps.setMessageId(messageId); - } - else if (messageProps.hasMessageId()) - { - messageProps.clearMessageId(); - } - - long currentTime = 0; - if (timeToLive > 0 || !_disableTimestamps) - { - currentTime = System.currentTimeMillis(); - } - - if (timeToLive > 0) - { - deliveryProp.setTtl(timeToLive); - message.setJMSExpiration(currentTime + timeToLive); - } - - if (!_disableTimestamps) - { - - deliveryProp.setTimestamp(currentTime); - message.setJMSTimestamp(currentTime); - } - - if (!deliveryProp.hasDeliveryMode() || deliveryProp.getDeliveryMode().getValue() != deliveryMode) - { - MessageDeliveryMode mode; - switch (deliveryMode) - { - case DeliveryMode.PERSISTENT: - mode = MessageDeliveryMode.PERSISTENT; - break; - case DeliveryMode.NON_PERSISTENT: - mode = MessageDeliveryMode.NON_PERSISTENT; - break; - default: - throw new IllegalArgumentException("illegal delivery mode: " + deliveryMode); - } - deliveryProp.setDeliveryMode(mode); - message.setJMSDeliveryMode(deliveryMode); - } - if (!deliveryProp.hasPriority() || deliveryProp.getPriority().getValue() != priority) - { - deliveryProp.setPriority(MessageDeliveryPriority.get((short) priority)); - message.setJMSPriority(priority); - } - String exchangeName = destination.getExchangeName() == null ? "" : destination.getExchangeName().toString(); - if ( deliveryProp.getExchange() == null || ! deliveryProp.getExchange().equals(exchangeName)) - { - deliveryProp.setExchange(exchangeName); - } - String routingKey = destination.getRoutingKey().toString(); - if (deliveryProp.getRoutingKey() == null || ! deliveryProp.getRoutingKey().equals(routingKey)) - { - deliveryProp.setRoutingKey(routingKey); - } - - if (destination.getDestSyntax() == AMQDestination.DestSyntax.ADDR && - (destination.getSubject() != null || - (messageProps.getApplicationHeaders() != null && messageProps.getApplicationHeaders().get("qpid.subject") != null)) - ) - { - Map<String,Object> appProps = messageProps.getApplicationHeaders(); - if (appProps == null) - { - appProps = new HashMap<String,Object>(); - messageProps.setApplicationHeaders(appProps); - } - - if (appProps.get("qpid.subject") == null) - { - // use default subject in address string - appProps.put("qpid.subject",destination.getSubject()); - } - - if (destination.getTargetNode().getType() == AMQDestination.TOPIC_TYPE) - { - deliveryProp.setRoutingKey((String) - messageProps.getApplicationHeaders().get("qpid.subject")); - } - } - - messageProps.setContentLength(message.getContentLength()); - - // send the message - try - { - org.apache.qpid.transport.Session ssn = (org.apache.qpid.transport.Session) - ((AMQSession_0_10) getSession()).getQpidSession(); - - // if true, we need to sync the delivery of this message - boolean sync = false; - - sync = ( (publishMode == PublishMode.SYNC_PUBLISH_ALL) || - (publishMode == PublishMode.SYNC_PUBLISH_PERSISTENT && - deliveryMode == DeliveryMode.PERSISTENT) - ); - - boolean unreliable = (destination.getDestSyntax() == DestSyntax.ADDR) && - (destination.getLink().getReliability() == Reliability.UNRELIABLE); - - org.apache.mina.common.ByteBuffer data = message.getData(); - ByteBuffer buffer = data == null ? ByteBuffer.allocate(0) : data.buf().slice(); - - ssn.messageTransfer(destination.getExchangeName() == null ? "" : destination.getExchangeName().toString(), - MessageAcceptMode.NONE, - MessageAcquireMode.PRE_ACQUIRED, - new Header(deliveryProp, messageProps), - buffer, sync ? SYNC : NONE, unreliable ? UNRELIABLE : NONE); - if (sync) - { - ssn.sync(); - ((AMQSession_0_10) getSession()).getCurrentException(); - } - - } - catch (Exception e) - { - JMSException jmse = new JMSException("Exception when sending message"); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - - public boolean isBound(AMQDestination destination) throws JMSException - { - return _session.isQueueBound(destination); - } - - @Override - public void close() - { - super.close(); - AMQDestination dest = _destination; - if (dest != null && dest.getDestSyntax() == AMQDestination.DestSyntax.ADDR) - { - if (dest.getDelete() == AddressOption.ALWAYS || - dest.getDelete() == AddressOption.SENDER ) - { - ((AMQSession_0_10) getSession()).getQpidSession().queueDelete( - _destination.getQueueName()); - } - } - } -} - diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java deleted file mode 100644 index 27f7486890..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.util.UUID; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Topic; -import javax.jms.Queue; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.client.message.AMQMessageDelegate; -import org.apache.qpid.client.message.AMQMessageDelegate_0_8; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.BasicConsumeBody; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.framing.BasicPublishBody; -import org.apache.qpid.framing.CompositeAMQDataBlock; -import org.apache.qpid.framing.ContentBody; -import org.apache.qpid.framing.ContentHeaderBody; -import org.apache.qpid.framing.ExchangeDeclareBody; - -public class BasicMessageProducer_0_8 extends BasicMessageProducer -{ - - BasicMessageProducer_0_8(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId, - AMQSession session, AMQProtocolHandler protocolHandler, long producerId, boolean immediate, boolean mandatory, - boolean waitUntilSent) throws AMQException - { - super(connection, destination,transacted,channelId,session, protocolHandler, producerId, immediate, mandatory,waitUntilSent); - } - - void declareDestination(AMQDestination destination) - { - - ExchangeDeclareBody body = getSession().getMethodRegistry().createExchangeDeclareBody(_session.getTicket(), - destination.getExchangeName(), - destination.getExchangeClass(), - false, - false, - false, - false, - true, - null); - // Declare the exchange - // Note that the durable and internal arguments are ignored since passive is set to false - - AMQFrame declare = body.generateFrame(_channelId); - - _protocolHandler.writeFrame(declare); - } - - void sendMessage(AMQDestination destination, Message origMessage, AbstractJMSMessage message, - UUID messageId, int deliveryMode,int priority, long timeToLive, boolean mandatory, - boolean immediate, boolean wait) throws JMSException - { - BasicPublishBody body = getSession().getMethodRegistry().createBasicPublishBody(_session.getTicket(), - destination.getExchangeName(), - destination.getRoutingKey(), - mandatory, - immediate); - - AMQFrame publishFrame = body.generateFrame(_channelId); - - message.prepareForSending(); - ByteBuffer payload = message.getData(); - AMQMessageDelegate_0_8 delegate = (AMQMessageDelegate_0_8) message.getDelegate(); - BasicContentHeaderProperties contentHeaderProperties = delegate.getContentHeaderProperties(); - - contentHeaderProperties.setUserId(_userID); - - //Set the JMS_QPID_DESTTYPE for 0-8/9 messages - int type; - if (destination instanceof Topic) - { - type = AMQDestination.TOPIC_TYPE; - } - else if (destination instanceof Queue) - { - type = AMQDestination.QUEUE_TYPE; - } - else - { - type = AMQDestination.UNKNOWN_TYPE; - } - - //Set JMS_QPID_DESTTYPE - delegate.getContentHeaderProperties().getHeaders().setInteger(CustomJMSXProperty.JMS_QPID_DESTTYPE.getShortStringName(), type); - - if (!_disableTimestamps) - { - final long currentTime = System.currentTimeMillis(); - contentHeaderProperties.setTimestamp(currentTime); - - if (timeToLive > 0) - { - contentHeaderProperties.setExpiration(currentTime + timeToLive); - } - else - { - contentHeaderProperties.setExpiration(0); - } - } - - contentHeaderProperties.setDeliveryMode((byte) deliveryMode); - contentHeaderProperties.setPriority((byte) priority); - - final int size = (payload != null) ? payload.limit() : 0; - final int contentBodyFrameCount = calculateContentBodyFrameCount(payload); - final AMQFrame[] frames = new AMQFrame[2 + contentBodyFrameCount]; - - if (payload != null) - { - createContentBodies(payload, frames, 2, _channelId); - } - - if ((contentBodyFrameCount != 0) && _logger.isDebugEnabled()) - { - _logger.debug("Sending content body frames to " + destination); - } - - - // TODO: This is a hacky way of getting the AMQP class-id for the Basic class - int classIfForBasic = getSession().getMethodRegistry().createBasicQosOkBody().getClazz(); - - AMQFrame contentHeaderFrame = - ContentHeaderBody.createAMQFrame(_channelId, - classIfForBasic, 0, contentHeaderProperties, size); - if (_logger.isDebugEnabled()) - { - _logger.debug("Sending content header frame to " + destination); - } - - frames[0] = publishFrame; - frames[1] = contentHeaderFrame; - CompositeAMQDataBlock compositeFrame = new CompositeAMQDataBlock(frames); - - try - { - _session.checkFlowControl(); - } - catch (InterruptedException e) - { - JMSException jmse = new JMSException("Interrupted while waiting for flow control to be removed"); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - - _protocolHandler.writeFrame(compositeFrame, wait); - } - - /** - * Create content bodies. This will split a large message into numerous bodies depending on the negotiated - * maximum frame size. - * - * @param payload - * @param frames - * @param offset - * @param channelId @return the array of content bodies - */ - private void createContentBodies(ByteBuffer payload, AMQFrame[] frames, int offset, int channelId) - { - - if (frames.length == (offset + 1)) - { - frames[offset] = ContentBody.createAMQFrame(channelId, new ContentBody(payload)); - } - else - { - - final long framePayloadMax = _session.getAMQConnection().getMaximumFrameSize() - 1; - long remaining = payload.remaining(); - for (int i = offset; i < frames.length; i++) - { - payload.position((int) framePayloadMax * (i - offset)); - int length = (remaining >= framePayloadMax) ? (int) framePayloadMax : (int) remaining; - payload.limit(payload.position() + length); - frames[i] = ContentBody.createAMQFrame(channelId, new ContentBody(payload.slice())); - - remaining -= length; - } - } - - } - - private int calculateContentBodyFrameCount(ByteBuffer payload) - { - // we substract one from the total frame maximum size to account for the end of frame marker in a body frame - // (0xCE byte). - int frameCount; - if ((payload == null) || (payload.remaining() == 0)) - { - frameCount = 0; - } - else - { - int dataLength = payload.remaining(); - final long framePayloadMax = _session.getAMQConnection().getMaximumFrameSize() - 1; - int lastFrame = ((dataLength % framePayloadMax) > 0) ? 1 : 0; - frameCount = (int) (dataLength / framePayloadMax) + lastFrame; - } - - return frameCount; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/ChannelToSessionMap.java b/java/client/src/main/java/org/apache/qpid/client/ChannelToSessionMap.java deleted file mode 100644 index 2fdb35de49..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/ChannelToSessionMap.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -public final class ChannelToSessionMap -{ - private final AMQSession[] _fastAccessSessions = new AMQSession[16]; - private final LinkedHashMap<Integer, AMQSession> _slowAccessSessions = new LinkedHashMap<Integer, AMQSession>(); - private int _size = 0; - private static final int FAST_CHANNEL_ACCESS_MASK = 0xFFFFFFF0; - private AtomicInteger _idFactory = new AtomicInteger(0); - private int _maxChannelID; - private int _minChannelID; - - public AMQSession get(int channelId) - { - if ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0) - { - return _fastAccessSessions[channelId]; - } - else - { - return _slowAccessSessions.get(channelId); - } - } - - public AMQSession put(int channelId, AMQSession session) - { - AMQSession oldVal; - if ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0) - { - oldVal = _fastAccessSessions[channelId]; - _fastAccessSessions[channelId] = session; - } - else - { - oldVal = _slowAccessSessions.put(channelId, session); - } - if ((oldVal != null) && (session == null)) - { - _size--; - } - else if ((oldVal == null) && (session != null)) - { - _size++; - } - - return session; - - } - - public AMQSession remove(int channelId) - { - AMQSession session; - if ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0) - { - session = _fastAccessSessions[channelId]; - _fastAccessSessions[channelId] = null; - } - else - { - session = _slowAccessSessions.remove(channelId); - } - - if (session != null) - { - _size--; - } - return session; - - } - - public Collection<AMQSession> values() - { - ArrayList<AMQSession> values = new ArrayList<AMQSession>(size()); - - for (int i = 0; i < 16; i++) - { - if (_fastAccessSessions[i] != null) - { - values.add(_fastAccessSessions[i]); - } - } - values.addAll(_slowAccessSessions.values()); - - return values; - } - - public int size() - { - return _size; - } - - public void clear() - { - _size = 0; - _slowAccessSessions.clear(); - for (int i = 0; i < 16; i++) - { - _fastAccessSessions[i] = null; - } - } - - /* - * Synchronized on whole method so that we don't need to consider the - * increment-then-reset path in too much detail - */ - public synchronized int getNextChannelId() - { - int id = _minChannelID; - - boolean done = false; - while (!done) - { - id = _idFactory.getAndIncrement(); - if (id == _maxChannelID) - { - //go back to the start - _idFactory.set(_minChannelID); - } - if ((id & FAST_CHANNEL_ACCESS_MASK) == 0) - { - done = (_fastAccessSessions[id] == null); - } - else - { - done = (!_slowAccessSessions.keySet().contains(id)); - } - } - - return id; - } - - public void setMaxChannelID(int maxChannelID) - { - _maxChannelID = maxChannelID; - } - - public void setMinChannelID(int minChannelID) - { - _minChannelID = minChannelID; - _idFactory.set(_minChannelID); - } -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/client/Closeable.java b/java/client/src/main/java/org/apache/qpid/client/Closeable.java deleted file mode 100644 index e6771e122c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/Closeable.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * - * 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.qpid.client; - -import javax.jms.IllegalStateException; -import javax.jms.JMSException; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Captures the 'closed' state of an object, that is initially open, can be tested to see if it is closed, and provides - * a 'close' method to close it. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Mark an object as closed. - * <tr><td> Check if an object is closed. - * <tr><td> Raise a JMS exception if an object is closed. - * </table> - * - * @todo Might be better to make this an interface. This whole class doesn't really encapsulate a terribly neat - * piece of re-usable functionality. A simple interface defining a close method would suffice. - * - * @todo The convenience method {@link #checkNotClosed} is not that helpfull, what if the caller wants to do something - * other than throw an exception? It doesn't really represent a very usefull re-usable piece of code. Consider - * inlining it and dropping the method. - */ -public abstract class Closeable -{ - /** - * We use an atomic boolean so that we do not have to synchronized access to this flag. Synchronizing access to this - * flag would mean have a synchronized block in every method. - */ - protected final AtomicBoolean _closed = new AtomicBoolean(false); - - /** - * Are we in the process of closing. We have this distinction so we can - * still signal we are in the process of closing so other objects can tell - * the difference and tidy up. - */ - protected final AtomicBoolean _closing = new AtomicBoolean(false); - - /** - * Checks if this is closed, and raises a JMSException if it is. - * - * @throws JMSException If this is closed. - */ - protected void checkNotClosed() throws JMSException - { - if (isClosed()) - { - throw new IllegalStateException("Object " + toString() + " has been closed"); - } - } - - /** - * Checks if this is closed. - * - * @return <tt>true</tt> if this is closed, <tt>false</tt> otherwise. - */ - public boolean isClosed() - { - return _closed.get(); - } - - /** - * Checks if this is closis. - * - * @return <tt>true</tt> if we are closing, <tt>false</tt> otherwise. - */ - public boolean isClosing() - { - return _closing.get(); - } - - - /** - * Closes this object. - * - * @throws JMSException If this cannot be closed for any reason. - */ - public abstract void close() throws JMSException; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/ConnectionTuneParameters.java b/java/client/src/main/java/org/apache/qpid/client/ConnectionTuneParameters.java deleted file mode 100644 index b1ec7216bc..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/ConnectionTuneParameters.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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.qpid.client; - -public class ConnectionTuneParameters -{ - private long _frameMax; - - private int _channelMax; - - private int _heartbeat; - - private long _txnLimit; - - public long getFrameMax() - { - return _frameMax; - } - - public void setFrameMax(long frameMax) - { - _frameMax = frameMax; - } - - public int getChannelMax() - { - return _channelMax; - } - - public void setChannelMax(int channelMax) - { - _channelMax = channelMax; - } - - public int getHeartbeat() - { - return _heartbeat; - } - - public void setHeartbeat(int hearbeat) - { - _heartbeat = hearbeat; - } - - public long getTxnLimit() - { - return _txnLimit; - } - - public void setTxnLimit(long txnLimit) - { - _txnLimit = txnLimit; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/CustomJMSXProperty.java b/java/client/src/main/java/org/apache/qpid/client/CustomJMSXProperty.java deleted file mode 100644 index 7cc548915c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/CustomJMSXProperty.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; - -import org.apache.qpid.framing.AMQShortString; - -public enum CustomJMSXProperty -{ - JMS_AMQP_NULL, - JMS_QPID_DESTTYPE, - JMSXGroupID, - JMSXGroupSeq, - JMSXUserID; - - - private final AMQShortString _nameAsShortString; - - CustomJMSXProperty() - { - _nameAsShortString = new AMQShortString(toString()); - } - - public AMQShortString getShortStringName() - { - return _nameAsShortString; - } - - private static Enumeration _names; - - public static synchronized Enumeration asEnumeration() - { - if(_names == null) - { - CustomJMSXProperty[] properties = values(); - ArrayList<String> nameList = new ArrayList<String>(properties.length); - for(CustomJMSXProperty property : properties) - { - nameList.add(property.toString()); - } - _names = Collections.enumeration(nameList); - } - return _names; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/DispatcherCallback.java b/java/client/src/main/java/org/apache/qpid/client/DispatcherCallback.java deleted file mode 100644 index 81a55006ed..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/DispatcherCallback.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.qpid.client; - -import java.util.Queue; - -public abstract class DispatcherCallback -{ - BasicMessageConsumer _consumer; - - public DispatcherCallback(BasicMessageConsumer mc) - { - _consumer = mc; - } - - abstract public void whilePaused(Queue<MessageConsumerPair> reprocessQueue); - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/JMSAMQException.java b/java/client/src/main/java/org/apache/qpid/client/JMSAMQException.java deleted file mode 100644 index 1151a97cf4..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/JMSAMQException.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; - -import javax.jms.JMSException; - -/** - * JMSException does not accept wrapped exceptions in its constructor. Presumably this is because it is a relatively old - * Java exception class, before this was added as a default to Throwable. This exception class accepts wrapped exceptions - * as well as error messages, through its constructor, but is a JMSException. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Accept wrapped exceptions as a JMSException. - * </table> - */ -public class JMSAMQException extends JMSException -{ - /** - * Creates a JMSException, wrapping another exception class. - * - * @param message The error message. - * @param cause The underlying exception that caused this one. May be null if none is to be set. - */ - public JMSAMQException(String message, Exception cause) - { - super(message); - - if (cause != null) - { - setLinkedException(cause); - initCause(cause); - } - } - - /** - * @param cause The underlying exception. - * - * @deprecated Use the other constructor and write a helpfull message. This one will be deleted. - */ - public JMSAMQException(AMQException cause) - { - super(cause.getMessage(), String.valueOf(cause.getErrorCode())); - setLinkedException(cause); - initCause(cause); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/JmsNotImplementedException.java b/java/client/src/main/java/org/apache/qpid/client/JmsNotImplementedException.java deleted file mode 100644 index 903514c35f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/JmsNotImplementedException.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * 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.qpid.client; - -import javax.jms.JMSException; - -public class JmsNotImplementedException extends JMSException -{ - public JmsNotImplementedException() - { - super("Not implemented"); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/MessageConsumerPair.java b/java/client/src/main/java/org/apache/qpid/client/MessageConsumerPair.java deleted file mode 100644 index 585d6db3fd..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/MessageConsumerPair.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.qpid.client; - -public class MessageConsumerPair -{ - BasicMessageConsumer _consumer; - Object _item; - - public MessageConsumerPair(BasicMessageConsumer consumer, Object item) - { - _consumer = consumer; - _item = item; - } - - public BasicMessageConsumer getConsumer() - { - return _consumer; - } - - public Object getItem() - { - return _item; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/QpidConnectionMetaData.java b/java/client/src/main/java/org/apache/qpid/client/QpidConnectionMetaData.java deleted file mode 100644 index 3bb5707417..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/QpidConnectionMetaData.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * - * 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.qpid.client; - -import java.util.Enumeration; - -import javax.jms.ConnectionMetaData; -import javax.jms.JMSException; - -import org.apache.qpid.common.QpidProperties; - -public class QpidConnectionMetaData implements ConnectionMetaData -{ - - - QpidConnectionMetaData(AMQConnection conn) - { - } - - public int getJMSMajorVersion() throws JMSException - { - return 1; - } - - public int getJMSMinorVersion() throws JMSException - { - return 1; - } - - public String getJMSProviderName() throws JMSException - { - return "Apache " + QpidProperties.getProductName(); - } - - public String getJMSVersion() throws JMSException - { - return "1.1"; - } - - public Enumeration getJMSXPropertyNames() throws JMSException - { - return CustomJMSXProperty.asEnumeration(); - } - - public int getProviderMajorVersion() throws JMSException - { - return 0; - } - - public int getProviderMinorVersion() throws JMSException - { - return 8; - } - - public String getProviderVersion() throws JMSException - { - return QpidProperties.getProductName() + " (Client: [" + getClientVersion() + "] ; Broker [" + getBrokerVersion() + "] ; Protocol: [ " - + getProtocolVersion() + "] )"; - } - - private String getProtocolVersion() - { - // TODO - Implement based on connection negotiated protocol - return "0.8"; - } - - public String getBrokerVersion() - { - // TODO - get broker version - return "<unkown>"; - } - - public String getClientVersion() - { - return QpidProperties.getBuildVersion(); - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/QueueReceiverAdaptor.java b/java/client/src/main/java/org/apache/qpid/client/QueueReceiverAdaptor.java deleted file mode 100644 index 7059588367..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/QueueReceiverAdaptor.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * - * 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.qpid.client; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.Queue; -import javax.jms.QueueReceiver; - -/** - * Class that wraps a MessageConsumer for backwards JMS compatibility - * Returned by methods in AMQSession etc - */ -public class QueueReceiverAdaptor implements QueueReceiver { - - protected MessageConsumer _consumer; - protected Queue _queue; - - protected QueueReceiverAdaptor(Queue queue, MessageConsumer consumer) - { - _consumer = consumer; - _queue = queue; - } - - public String getMessageSelector() throws JMSException - { - checkPreConditions(); - return _consumer.getMessageSelector(); - } - - public MessageListener getMessageListener() throws JMSException - { - checkPreConditions(); - return _consumer.getMessageListener(); - } - - public void setMessageListener(MessageListener messageListener) throws JMSException - { - checkPreConditions(); - _consumer.setMessageListener(messageListener); - } - - public Message receive() throws JMSException - { - checkPreConditions(); - return _consumer.receive(); - } - - public Message receive(long l) throws JMSException - { - checkPreConditions(); - return _consumer.receive(l); - } - - public Message receiveNoWait() throws JMSException - { - checkPreConditions(); - return _consumer.receiveNoWait(); - } - - public void close() throws JMSException - { - _consumer.close(); - } - - /** - * Return the queue associated with this receiver - * @return - * @throws JMSException - */ - public Queue getQueue() throws JMSException - { - checkPreConditions(); - return _queue; - } - - private void checkPreConditions() throws javax.jms.IllegalStateException { - BasicMessageConsumer msgConsumer = (BasicMessageConsumer)_consumer; - - if (msgConsumer.isClosed() ){ - throw new javax.jms.IllegalStateException("Consumer is closed"); - } - - if(_queue == null){ - throw new UnsupportedOperationException("Queue is null"); - } - - AMQSession session = msgConsumer.getSession(); - - if(session == null || session.isClosed()){ - throw new javax.jms.IllegalStateException("Invalid Session"); - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/QueueSenderAdapter.java b/java/client/src/main/java/org/apache/qpid/client/QueueSenderAdapter.java deleted file mode 100644 index 295c6a4091..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/QueueSenderAdapter.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * 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.qpid.client; - -import javax.jms.Destination; -import javax.jms.InvalidDestinationException; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Queue; -import javax.jms.QueueSender; - -public class QueueSenderAdapter implements QueueSender -{ - - private BasicMessageProducer _delegate; - private Queue _queue; - private boolean closed = false; - - public QueueSenderAdapter(BasicMessageProducer msgProducer, Queue queue) - { - _delegate = msgProducer; - _queue = queue; - } - - public Queue getQueue() throws JMSException - { - checkPreConditions(); - - return _queue; - } - - public void send(Message msg) throws JMSException - { - checkQueuePreConditions(_queue); - _delegate.send(msg); - } - - public void send(Queue queue, Message msg) throws JMSException - { - checkQueuePreConditions(queue); - _delegate.send(queue, msg); - } - - public void publish(Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkQueuePreConditions(_queue); - _delegate.send(msg, deliveryMode, priority, timeToLive); - } - - public void send(Queue queue, Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkQueuePreConditions(queue); - _delegate.send(queue, msg, deliveryMode, priority, timeToLive); - } - - public void close() throws JMSException - { - _delegate.close(); - closed = true; - } - - public int getDeliveryMode() throws JMSException - { - checkPreConditions(); - - return _delegate.getDeliveryMode(); - } - - public Destination getDestination() throws JMSException - { - checkPreConditions(); - - return _delegate.getDestination(); - } - - public boolean getDisableMessageID() throws JMSException - { - checkPreConditions(); - - return _delegate.getDisableMessageID(); - } - - public boolean getDisableMessageTimestamp() throws JMSException - { - checkPreConditions(); - - return _delegate.getDisableMessageTimestamp(); - } - - public int getPriority() throws JMSException - { - checkPreConditions(); - - return _delegate.getPriority(); - } - - public long getTimeToLive() throws JMSException - { - checkPreConditions(); - - return _delegate.getTimeToLive(); - } - - public void send(Destination dest, Message msg) throws JMSException - { - checkQueuePreConditions((Queue) dest); - _delegate.send(dest, msg); - } - - public void send(Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkQueuePreConditions(_queue); - _delegate.send(msg, deliveryMode, priority, timeToLive); - } - - public void send(Destination dest, Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkQueuePreConditions((Queue) dest); - _delegate.send(dest, msg, deliveryMode, priority, timeToLive); - } - - public void setDeliveryMode(int deliveryMode) throws JMSException - { - checkPreConditions(); - _delegate.setDeliveryMode(deliveryMode); - } - - public void setDisableMessageID(boolean disableMessageID) throws JMSException - { - checkPreConditions(); - _delegate.setDisableMessageID(disableMessageID); - } - - public void setDisableMessageTimestamp(boolean disableMessageTimestamp) throws JMSException - { - checkPreConditions(); - _delegate.setDisableMessageTimestamp(disableMessageTimestamp); - } - - public void setPriority(int priority) throws JMSException - { - checkPreConditions(); - _delegate.setPriority(priority); - } - - public void setTimeToLive(long timeToLive) throws JMSException - { - checkPreConditions(); - _delegate.setTimeToLive(timeToLive); - } - - private void checkPreConditions() throws JMSException - { - if (closed) - { - throw new javax.jms.IllegalStateException("Publisher is closed"); - } - - AMQSession session = ((BasicMessageProducer) _delegate).getSession(); - - if ((session == null) || session.isClosed()) - { - throw new javax.jms.IllegalStateException("Invalid Session"); - } - } - - private void checkQueuePreConditions(Queue queue) throws JMSException - { - checkPreConditions() ; - - if (queue == null) - { - throw new UnsupportedOperationException("Queue is null."); - } - - if (!(queue instanceof AMQDestination)) - { - throw new InvalidDestinationException("Queue: " + queue + " is not a valid Qpid queue"); - } - - AMQDestination destination = (AMQDestination) queue; - if (!destination.isCheckedForQueueBinding() && checkQueueBeforePublish()) - { - if (_delegate.getSession().isStrictAMQP()) - { - _delegate._logger.warn("AMQP does not support destination validation before publish, "); - destination.setCheckedForQueueBinding(true); - } - else - { - if (_delegate.isBound(destination)) - { - destination.setCheckedForQueueBinding(true); - } - else - { - throw new InvalidDestinationException("Queue: " + queue - + " is not a valid destination (no bindings on server"); - } - } - } - } - - private boolean checkQueueBeforePublish() - { - return "true".equalsIgnoreCase(System.getProperty("org.apache.qpid.client.verifyQueueBindingBeforePublish", "true")); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/SSLConfiguration.java b/java/client/src/main/java/org/apache/qpid/client/SSLConfiguration.java deleted file mode 100644 index 2280cc9870..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/SSLConfiguration.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * 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.qpid.client; - -public class SSLConfiguration { - - private String _keystorePath; - - private String _keystorePassword; - - private String _certType = "SunX509"; - - public void setKeystorePath(String path) - { - _keystorePath = path; - } - - public String getKeystorePath() - { - return _keystorePath; - } - - public void setKeystorePassword(String password) - { - _keystorePassword = password; - } - - public String getKeystorePassword() - { - return _keystorePassword; - } - - public void setCertType(String type) - { - _certType = type; - } - - public String getCertType() - { - return _certType; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/TemporaryDestination.java b/java/client/src/main/java/org/apache/qpid/client/TemporaryDestination.java deleted file mode 100644 index 7f8e80c73a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/TemporaryDestination.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.qpid.client; - -import javax.jms.Destination; -import javax.jms.JMSException; - -/** - * Provides support for covenience interface implemented by both AMQTemporaryTopic and AMQTemporaryQueue - * so that operations related to their "temporary-ness" can be abstracted out. - */ -interface TemporaryDestination extends Destination -{ - - public void delete() throws JMSException; - public AMQSession getSession(); - public boolean isDeleted(); - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/TopicPublisherAdapter.java b/java/client/src/main/java/org/apache/qpid/client/TopicPublisherAdapter.java deleted file mode 100644 index 81b9940ed5..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/TopicPublisherAdapter.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * 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.qpid.client; - -import javax.jms.Destination; -import javax.jms.IllegalStateException; -import javax.jms.InvalidDestinationException; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Topic; -import javax.jms.TopicPublisher; - -public class TopicPublisherAdapter implements TopicPublisher -{ - - private BasicMessageProducer _delegate; - private Topic _topic; - - public TopicPublisherAdapter(BasicMessageProducer msgProducer, Topic topic) - { - _delegate = msgProducer; - _topic = topic; - } - - public Topic getTopic() throws JMSException - { - checkPreConditions(); - return _topic; - } - - public void publish(Message msg) throws JMSException - { - checkPreConditions(); - checkTopic(_topic); - _delegate.send(msg); - } - - public void publish(Topic topic, Message msg) throws JMSException - { - checkPreConditions(); - checkTopic(topic); - _delegate.send(topic, msg); - } - - public void publish(Message msg, int deliveryMode, int priority, long timeToLive) - throws JMSException - { - checkPreConditions(); - checkTopic(_topic); - _delegate.send(msg, deliveryMode, priority, timeToLive); - } - - public int getDeliveryMode() throws JMSException { - checkPreConditions(); - return _delegate.getDeliveryMode(); - } - - public void publish(Topic topic, Message msg, int deliveryMode, int priority, long timeToLive) - throws JMSException - { - checkPreConditions(); - checkTopic(topic); - _delegate.send(topic, msg, deliveryMode, priority, timeToLive); - } - - public void close() throws JMSException - { - _delegate.close(); - } - - public boolean getDisableMessageID() throws JMSException { - checkPreConditions(); - return _delegate.getDisableMessageID(); - } - - public boolean getDisableMessageTimestamp() throws JMSException { - checkPreConditions(); - return _delegate.getDisableMessageTimestamp(); - } - - public Destination getDestination() throws JMSException - { - checkPreConditions(); - return _delegate.getDestination(); - } - - public int getPriority() throws JMSException { - checkPreConditions(); - return _delegate.getPriority(); - } - - public long getTimeToLive() throws JMSException { - checkPreConditions(); - return _delegate.getTimeToLive(); - } - - public void send(Message msg) throws JMSException - { - checkPreConditions(); - checkTopic(_topic); - _delegate.send(msg); - } - - public void send(Destination dest, Message msg) throws JMSException - { - checkPreConditions(); - checkTopic(_topic); - _delegate.send(dest, msg); - } - - public void send(Message msg, int deliveryMode, int priority, long timeToLive) - throws JMSException - { - checkPreConditions(); - checkTopic(_topic); - _delegate.send(msg, deliveryMode, priority, timeToLive); - } - - public void send(Destination dest, Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException - { - checkPreConditions(); - checkTopic(dest); - _delegate.send(dest, msg, deliveryMode, priority, timeToLive); - } - - public void setDeliveryMode(int deliveryMode) throws JMSException - { - checkPreConditions(); - _delegate.setDeliveryMode(deliveryMode); - } - - public void setDisableMessageID(boolean disableMessageID) throws JMSException - { - checkPreConditions(); - _delegate.setDisableMessageID(disableMessageID); - } - - public void setDisableMessageTimestamp(boolean disableMessageTimestamp) throws JMSException - { - checkPreConditions(); - _delegate.setDisableMessageTimestamp(disableMessageTimestamp); - } - - public void setPriority(int priority) throws JMSException - { - checkPreConditions(); - _delegate.setPriority(priority); - } - - public void setTimeToLive(long timeToLive) throws JMSException - { - checkPreConditions(); - _delegate.setTimeToLive(timeToLive); - } - - private void checkPreConditions() throws IllegalStateException - { - if (_delegate.isClosed()) - { - throw new javax.jms.IllegalStateException("Publisher is _closed"); - } - - AMQSession session = _delegate.getSession(); - if (session == null || session.isClosed()) - { - throw new javax.jms.IllegalStateException("Invalid Session"); - } - } - - private void checkTopic(Destination topic) throws InvalidDestinationException - { - if (topic == null) - { - throw new UnsupportedOperationException("Topic is null"); - } - if (!(topic instanceof Topic)) - { - throw new InvalidDestinationException("Destination " + topic + " is not a topic"); - } - if(!(topic instanceof AMQDestination)) - { - throw new InvalidDestinationException("Destination " + topic + " is not a Qpid topic"); - } - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/TopicSubscriberAdaptor.java b/java/client/src/main/java/org/apache/qpid/client/TopicSubscriberAdaptor.java deleted file mode 100644 index 9bdef22f96..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/TopicSubscriberAdaptor.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.Topic; -import javax.jms.TopicSubscriber; - -/** - * Wraps a MessageConsumer to fulfill the extended TopicSubscriber contract - * - */ -class TopicSubscriberAdaptor<C extends BasicMessageConsumer> implements TopicSubscriber -{ - private final Topic _topic; - private final C _consumer; - private final boolean _noLocal; - - TopicSubscriberAdaptor(Topic topic, C consumer, boolean noLocal) - { - _topic = topic; - _consumer = consumer; - _noLocal = noLocal; - } - - TopicSubscriberAdaptor(Topic topic, C consumer) - { - this(topic, consumer, consumer.isNoLocal()); - } - - public Topic getTopic() throws JMSException - { - checkPreConditions(); - return _topic; - } - - public boolean getNoLocal() throws JMSException - { - checkPreConditions(); - return _noLocal; - } - - public String getMessageSelector() throws JMSException - { - checkPreConditions(); - return _consumer.getMessageSelector(); - } - - public MessageListener getMessageListener() throws JMSException - { - checkPreConditions(); - return _consumer.getMessageListener(); - } - - public void setMessageListener(MessageListener messageListener) throws JMSException - { - checkPreConditions(); - _consumer.setMessageListener(messageListener); - } - - public Message receive() throws JMSException - { - checkPreConditions(); - return _consumer.receive(); - } - - public Message receive(long l) throws JMSException - { - return _consumer.receive(l); - } - - public Message receiveNoWait() throws JMSException - { - checkPreConditions(); - return _consumer.receiveNoWait(); - } - - public void close() throws JMSException - { - _consumer.close(); - } - - private void checkPreConditions() throws javax.jms.IllegalStateException{ - C msgConsumer = _consumer; - - if (msgConsumer.isClosed() ){ - throw new javax.jms.IllegalStateException("Consumer is closed"); - } - - if(_topic == null){ - throw new UnsupportedOperationException("Topic is null"); - } - - AMQSession session = msgConsumer.getSession(); - - if(session == null || session.isClosed()){ - throw new javax.jms.IllegalStateException("Invalid Session"); - } - } - - C getMessageConsumer() - { - return _consumer; - } - - public void addBindingKey(Topic topic, String bindingKey) throws AMQException - { - _consumer.addBindingKey((AMQDestination) topic, bindingKey); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/XAConnectionImpl.java b/java/client/src/main/java/org/apache/qpid/client/XAConnectionImpl.java deleted file mode 100644 index 43025bd724..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/XAConnectionImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -/* 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.qpid.client; - -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.AMQException; - -import javax.jms.*; - -/** - * This class implements the javax.njms.XAConnection interface - */ -public class XAConnectionImpl extends AMQConnection implements XAConnection, XAQueueConnection, XATopicConnection -{ - //-- constructor - /** - * Create a XAConnection from a connectionURL - */ - public XAConnectionImpl(ConnectionURL connectionURL, SSLConfiguration sslConfig) throws AMQException - { - super(connectionURL, sslConfig); - } - - //-- interface XAConnection - /** - * Creates an XASession. - * - * @return A newly created XASession. - * @throws JMSException If the XAConnectiono fails to create an XASession due to - * some internal error. - */ - public synchronized XASession createXASession() throws JMSException - { - checkNotClosed(); - return _delegate.createXASession(); - } - - //-- Interface XAQueueConnection - /** - * Creates an XAQueueSession. - * - * @return A newly created XASession. - * @throws JMSException If the XAQueueConnectionImpl fails to create an XASession due to - * some internal error. - */ - public XAQueueSession createXAQueueSession() throws JMSException - { - return (XAQueueSession) createXASession(); - } - - //-- Interface XATopicConnection - /** - * Creates an XAQueueSession. - * - * @return A newly created XASession. - * @throws JMSException If the XAQueueConnectionImpl fails to create an XASession due to - * some internal error. - */ - public XATopicSession createXATopicSession() throws JMSException - { - return (XATopicSession) createXASession(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java b/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java deleted file mode 100644 index 8a75082202..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java +++ /dev/null @@ -1,522 +0,0 @@ -/* 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.qpid.client; - -import javax.transaction.xa.XAException; -import javax.transaction.xa.XAResource; -import javax.transaction.xa.Xid; - -import org.apache.qpid.AMQInvalidArgumentException; -import org.apache.qpid.dtx.XidImpl; -import org.apache.qpid.transport.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is an implementation of javax.njms.XAResource. - */ -public class XAResourceImpl implements XAResource -{ - /** - * this XAResourceImpl's logger - */ - private static final Logger _logger = LoggerFactory.getLogger(XAResourceImpl.class); - - /** - * Reference to the associated XASession - */ - private XASessionImpl _xaSession = null; - - /** - * The XID of this resource - */ - private Xid _xid; - - /** - * The time for this resource - */ - private int _timeout; - - //--- constructor - - /** - * Create an XAResource associated with a XASession - * - * @param xaSession The session XAresource - */ - protected XAResourceImpl(XASessionImpl xaSession) - { - _xaSession = xaSession; - } - - //--- The XAResource - /** - * Commits the global transaction specified by xid. - * - * @param xid A global transaction identifier - * @param b If true, use a one-phase commit protocol to commit the work done on behalf of xid. - * @throws XAException An error has occurred. An error has occurred. Possible XAExceptions are XA_HEURHAZ, - * XA_HEURCOM, XA_HEURRB, XA_HEURMIX, XAER_RMERR, XAER_RMFAIL, XAER_NOTA, XAER_INVAL, or XAER_PROTO. - */ - public void commit(Xid xid, boolean b) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("commit tx branch with xid: ", xid); - } - Future<XaResult> future = - _xaSession.getQpidSession().dtxCommit(convertXid(xid), b ? Option.ONE_PHASE : Option.NONE); - - // now wait on the future for the result - XaResult result = null; - try - { - result = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr(e.getException().getErrorCode()); - } - finally - { - _xid = null; - } - checkStatus(result.getStatus()); - } - - /** - * Ends the work performed on behalf of a transaction branch. - * The resource manager disassociates the XA resource from the transaction branch specified - * and lets the transaction complete. - * <ul> - * <li> If TMSUSPEND is specified in the flags, the transaction branch is temporarily suspended in an incomplete state. - * The transaction context is in a suspended state and must be resumed via the start method with TMRESUME specified. - * <li> If TMFAIL is specified, the portion of work has failed. The resource manager may mark the transaction as rollback-only - * <li> If TMSUCCESS is specified, the portion of work has completed successfully. - * /ul> - * - * @param xid A global transaction identifier that is the same as the identifier used previously in the start method - * @param flag One of TMSUCCESS, TMFAIL, or TMSUSPEND. - * @throws XAException An error has occurred. An error has occurred. Possible XAException values are XAER_RMERR, - * XAER_RMFAILED, XAER_NOTA, XAER_INVAL, XAER_PROTO, or XA_RB*. - */ - public void end(Xid xid, int flag) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("end tx branch with xid: ", xid); - } - switch (flag) - { - case(XAResource.TMSUCCESS): - break; - case(XAResource.TMFAIL): - break; - case(XAResource.TMSUSPEND): - break; - default: - throw new XAException(XAException.XAER_INVAL); - } - _xaSession.flushAcknowledgments(); - Future<XaResult> future = _xaSession.getQpidSession() - .dtxEnd(convertXid(xid), - flag == XAResource.TMFAIL ? Option.FAIL : Option.NONE, - flag == XAResource.TMSUSPEND ? Option.SUSPEND : Option.NONE); - // now wait on the future for the result - XaResult result = null; - try - { - result = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr(e.getException().getErrorCode()); - } - checkStatus(result.getStatus()); - } - - - /** - * Tells the resource manager to forget about a heuristically completed transaction branch. - * - * @param xid String(xid.getGlobalTransactionId() A global transaction identifier - * @throws XAException An error has occurred. Possible exception values are XAER_RMERR, XAER_RMFAIL, - * XAER_NOTA, XAER_INVAL, or XAER_PROTO. - */ - public void forget(Xid xid) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("forget tx branch with xid: ", xid); - } - _xaSession.getQpidSession().dtxForget(convertXid(xid)); - try - { - _xaSession.getQpidSession().sync(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr(e.getException().getErrorCode()); - } - finally - { - _xid = null; - } - } - - - /** - * Obtains the current transaction timeout value set for this XAResource instance. - * If XAResource.setTransactionTimeout was not used prior to invoking this method, - * the return value is the default timeout i.e. 0; - * - * @return The transaction timeout value in seconds. - * @throws XAException An error has occurred. Possible exception values are XAER_RMERR, XAER_RMFAIL. - */ - public int getTransactionTimeout() throws XAException - { - return _timeout; - } - - /** - * This method is called to determine if the resource manager instance represented - * by the target object is the same as the resouce manager instance represented by - * the parameter xaResource. - * - * @param xaResource An XAResource object whose resource manager instance is to - * be compared with the resource manager instance of the target object - * @return <code>true</code> if it's the same RM instance; otherwise <code>false</code>. - * @throws XAException An error has occurred. Possible exception values are XAER_RMERR, XAER_RMFAIL. - */ - public boolean isSameRM(XAResource xaResource) throws XAException - { - // TODO : get the server identity of xaResource and compare it with our own one - return false; - } - - /** - * Prepare for a transaction commit of the transaction specified in <code>Xid</code>. - * - * @param xid A global transaction identifier. - * @return A value indicating the resource manager's vote on the outcome of the transaction. - * The possible values are: XA_RDONLY or XA_OK. - * @throws XAException An error has occurred. Possible exception values are: XAER_RMERR or XAER_NOTA - */ - public int prepare(Xid xid) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("prepare ", xid); - } - Future<XaResult> future = _xaSession.getQpidSession().dtxPrepare(convertXid(xid)); - XaResult result = null; - try - { - result = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr(e.getException().getErrorCode()); - } - DtxXaStatus status = result.getStatus(); - int outcome = XAResource.XA_OK; - switch (status) - { - case XA_OK: - break; - case XA_RDONLY: - outcome = XAResource.XA_RDONLY; - break; - default: - checkStatus(status); - } - return outcome; - } - - /** - * Obtains a list of prepared transaction branches. - * <p/> - * The transaction manager calls this method during recovery to obtain the list of transaction branches - * that are currently in prepared or heuristically completed states. - * - * @param flag One of TMSTARTRSCAN, TMENDRSCAN, TMNOFLAGS. - * TMNOFLAGS must be used when no other flags are set in the parameter. - * @return zero or more XIDs of the transaction branches that are currently in a prepared or heuristically - * completed state. - * @throws XAException An error has occurred. Possible value is XAER_INVAL. - */ - public Xid[] recover(int flag) throws XAException - { - // the flag is ignored - Future<RecoverResult> future = _xaSession.getQpidSession().dtxRecover(); - RecoverResult res = null; - try - { - res = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr( e.getException().getErrorCode()); - } - Xid[] result = new Xid[res.getInDoubt().size()]; - int i = 0; - for (Object obj : res.getInDoubt()) - { - org.apache.qpid.transport.Xid xid = (org.apache.qpid.transport.Xid) obj; - result[i] = new XidImpl(xid.getBranchId(), (int) xid.getFormat(), xid.getGlobalId()); - i++; - } - return result; - } - - /** - * Informs the resource manager to roll back work done on behalf of a transaction branch - * - * @param xid A global transaction identifier. - * @throws XAException An error has occurred. - */ - public void rollback(Xid xid) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("rollback tx branch with xid: ", xid); - } - - Future<XaResult> future = _xaSession.getQpidSession().dtxRollback(convertXid(xid)); - // now wait on the future for the result - XaResult result = null; - try - { - result = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr( e.getException().getErrorCode()); - } - finally - { - _xid = null; - } - checkStatus(result.getStatus()); - } - - /** - * Sets the current transaction timeout value for this XAResource instance. - * Once set, this timeout value is effective until setTransactionTimeout is - * invoked again with a different value. - * To reset the timeout value to the default value used by the resource manager, set the value to zero. - * - * @param timeout The transaction timeout value in seconds. - * @return true if transaction timeout value is set successfully; otherwise false. - * @throws XAException An error has occurred. Possible exception values are XAER_RMERR, XAER_RMFAIL, or XAER_INVAL. - */ - public boolean setTransactionTimeout(int timeout) throws XAException - { - _timeout = timeout; - if (timeout != _timeout && _xid != null) - { - setDtxTimeout(_timeout); - } - return true; - } - - private void setDtxTimeout(int timeout) throws XAException - { - _xaSession.getQpidSession() - .dtxSetTimeout(XidImpl.convert(_xid), timeout); - } - - /** - * Starts work on behalf of a transaction branch specified in xid. - * <ul> - * <li> If TMJOIN is specified, an exception is thrown as it is not supported - * <li> If TMRESUME is specified, the start applies to resuming a suspended transaction specified in the parameter xid. - * <li> If neither TMJOIN nor TMRESUME is specified and the transaction specified by xid has previously been seen by the - * resource manager, the resource manager throws the XAException exception with XAER_DUPID error code. - * </ul> - * - * @param xid A global transaction identifier to be associated with the resource - * @param flag One of TMNOFLAGS, TMJOIN, or TMRESUME - * @throws XAException An error has occurred. Possible exceptions - * are XA_RB*, XAER_RMERR, XAER_RMFAIL, XAER_DUPID, XAER_OUTSIDE, XAER_NOTA, XAER_INVAL, or XAER_PROTO. - */ - public void start(Xid xid, int flag) throws XAException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("start tx branch with xid: ", xid); - } - switch (flag) - { - case(XAResource.TMNOFLAGS): - break; - case(XAResource.TMJOIN): - break; - case(XAResource.TMRESUME): - break; - default: - throw new XAException(XAException.XAER_INVAL); - } - Future<XaResult> future = _xaSession.getQpidSession() - .dtxStart(convertXid(xid), - flag == XAResource.TMJOIN ? Option.JOIN : Option.NONE, - flag == XAResource.TMRESUME ? Option.RESUME : Option.NONE); - // now wait on the future for the result - XaResult result = null; - try - { - result = future.get(); - } - catch (SessionException e) - { - // we need to restore the qpid session that has been closed - _xaSession.createSession(); - convertExecutionErrorToXAErr(e.getException().getErrorCode()); - // TODO: The amqp spec does not allow to make the difference - // between an already known XID and a wrong arguments (join and resume are set) - // TODO: make sure amqp addresses that - } - checkStatus(result.getStatus()); - _xid = xid; - if (_timeout > 0) - { - setDtxTimeout(_timeout); - } - } - - //------------------------------------------------------------------------ - // Private methods - //------------------------------------------------------------------------ - - /** - * Check xa method outcome and, when required, convert the status into the corresponding xa exception - * @param status method status code - * @throws XAException corresponding XA Exception when required - */ - private void checkStatus(DtxXaStatus status) throws XAException - { - switch (status) - { - case XA_OK: - // Do nothing this ok - break; - case XA_RBROLLBACK: - // The tx has been rolled back for an unspecified reason. - throw new XAException(XAException.XA_RBROLLBACK); - case XA_RBTIMEOUT: - // The transaction branch took too long. - throw new XAException(XAException.XA_RBTIMEOUT); - case XA_HEURHAZ: - // The transaction branch may have been heuristically completed. - throw new XAException(XAException.XA_HEURHAZ); - case XA_HEURCOM: - // The transaction branch has been heuristically committed. - throw new XAException(XAException.XA_HEURCOM); - case XA_HEURRB: - // The transaction branch has been heuristically rolled back. - throw new XAException(XAException.XA_HEURRB); - case XA_HEURMIX: - // The transaction branch has been heuristically committed and rolled back. - throw new XAException(XAException.XA_HEURMIX); - case XA_RDONLY: - // The transaction branch was read-only and has been committed. - throw new XAException(XAException.XA_RDONLY); - default: - // this should not happen - if (_logger.isDebugEnabled()) - { - _logger.debug("got unexpected status value: ", status); - } - //A resource manager error has occured in the transaction branch. - throw new XAException(XAException.XAER_RMERR); - } - } - - /** - * Convert execution error to xa exception. - * @param error the execution error code - * @throws XAException - */ - private void convertExecutionErrorToXAErr(ExecutionErrorCode error) throws XAException - { - switch (error) - { - case NOT_ALLOWED: - // The XID already exists. - throw new XAException(XAException.XAER_DUPID); - case NOT_FOUND: - // The XID is not valid. - try - { - throw new XAException(XAException.XAER_NOTA); - } - catch (XAException e) - { - e.printStackTrace(); - throw e; - } - case ILLEGAL_STATE: - // Routine was invoked in an inproper context. - throw new XAException(XAException.XAER_PROTO); - case NOT_IMPLEMENTED: - // the command is not implemented - throw new XAException(XAException.XAER_RMERR); - case COMMAND_INVALID: - // Invalid call - throw new XAException(XAException.XAER_INVAL); - default: - // this should not happen - if (_logger.isDebugEnabled()) - { - _logger.debug("Got unexpected error: " + error); - } - //A resource manager error has occured in the transaction branch. - throw new XAException(XAException.XAER_RMERR); - } - } - - /** - * convert a generic xid into qpid format - * @param xid xid to be converted - * @return the qpid formated xid - * @throws XAException when xid is null - */ - private org.apache.qpid.transport.Xid convertXid(Xid xid) throws XAException - { - if (xid == null) - { - // Invalid arguments were given. - throw new XAException(XAException.XAER_INVAL); - } - return XidImpl.convert(xid); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java b/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java deleted file mode 100644 index 354b67cd35..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -/* 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.qpid.client; - -import org.apache.qpid.client.message.MessageFactoryRegistry; - -import javax.jms.*; -import javax.transaction.xa.XAResource; - -/** - * This is an implementation of the javax.njms.XASEssion interface. - */ -public class XASessionImpl extends AMQSession_0_10 implements XASession, XATopicSession, XAQueueSession -{ - /** - * XAResource associated with this XASession - */ - private final XAResourceImpl _xaResource; - - /** - * This XASession Qpid DtxSession - */ - private org.apache.qpid.transport.Session _qpidDtxSession; - - /** - * The standard session - */ - private Session _jmsSession; - - - //-- Constructors - /** - * Create a JMS XASession - */ - public XASessionImpl(org.apache.qpid.transport.Connection qpidConnection, AMQConnection con, int channelId, - int defaultPrefetchHigh, int defaultPrefetchLow) - { - super(qpidConnection, con, channelId, false, // this is not a transacted session - Session.AUTO_ACKNOWLEDGE, // the ack mode is transacted - MessageFactoryRegistry.newDefaultRegistry(), defaultPrefetchHigh, defaultPrefetchLow); - createSession(); - _xaResource = new XAResourceImpl(this); - } - - //-- public methods - - /** - * Create a qpid session. - */ - public void createSession() - { - _qpidDtxSession = _qpidConnection.createSession(0); - _qpidDtxSession.setSessionListener(this); - _qpidDtxSession.dtxSelect(); - } - - - //--- javax.njms.XASEssion API - - /** - * Gets the session associated with this XASession. - * - * @return The session object. - * @throws JMSException if an internal error occurs. - */ - public Session getSession() throws JMSException - { - if (_jmsSession == null) - { - _jmsSession = getAMQConnection().createSession(true, getAcknowledgeMode()); - } - return _jmsSession; - } - - /** - * Returns an XA resource. - * - * @return An XA resource. - */ - public XAResource getXAResource() - { - return _xaResource; - } - - //-- overwritten mehtods - /** - * Throws a {@link TransactionInProgressException}, since it should - * not be called for an XASession object. - * - * @throws TransactionInProgressException always. - */ - public void commit() throws JMSException - { - throw new TransactionInProgressException( - "XASession: A direct invocation of the commit operation is probibited!"); - } - - /** - * Throws a {@link TransactionInProgressException}, since it should - * not be called for an XASession object. - * - * @throws TransactionInProgressException always. - */ - public void rollback() throws JMSException - { - throw new TransactionInProgressException( - "XASession: A direct invocation of the rollback operation is probibited!"); - } - - /** - * Access to the underlying Qpid Session - * - * @return The associated Qpid Session. - */ - protected org.apache.qpid.transport.Session getQpidSession() - { - return _qpidDtxSession; - } - - //--- interface XAQueueSession - /** - * Gets the topic session associated with this <CODE>XATopicSession</CODE>. - * - * @return the topic session object - * @throws JMSException If an internal error occurs. - */ - public QueueSession getQueueSession() throws JMSException - { - return (QueueSession) getSession(); - } - - //--- interface XATopicSession - - /** - * Gets the topic session associated with this <CODE>XATopicSession</CODE>. - * - * @return the topic session object - * @throws JMSException If an internal error occurs. - */ - public TopicSession getTopicSession() throws JMSException - { - return (TopicSession) getSession(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverException.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverException.java deleted file mode 100644 index 037b0dc2d1..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * 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.qpid.client.failover; - -/** - * FailoverException is used to indicate that a synchronous request has failed to receive the reply that it is waiting - * for because the fail-over process has been started whilst it was waiting for its reply. Synchronous methods generally - * raise this exception to indicate that they must be re-tried once the fail-over process has completed. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Used to indicate failure of a synchronous request due to fail-over. - * </table> - * - * @todo This exception is created and passed as an argument to a method, rather than thrown. The exception is being - * used to represent an event, passed out to other threads. Use of exceptions as arguments rather than as - * exceptions is extremly confusing. Ideally use a condition or set a flag and check it instead. - * This exceptions-as-events pattern seems to be in a similar style to Mina code, which is not pretty, but - * potentially acceptable for that reason. We have the option of extending the mina model to add more events - * to it, that is, anything that is interested in handling failover as an event occurs below the main - * amq event handler, which knows the specific interface of the qpid handlers, which can pass this down as - * an explicit event, without it being an exception. Add failover method to BlockingMethodFrameListener, - * have it set a flag or interrupt the waiting thread, which then creates and raises this exception. - */ -public class FailoverException extends Exception -{ - public FailoverException(String message) - { - super(message); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverHandler.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverHandler.java deleted file mode 100644 index f74dbba939..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverHandler.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * - * 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.qpid.client.failover; - -import org.apache.qpid.AMQDisconnectedException; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQState; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.CountDownLatch; - -/** - * FailoverHandler is a continuation that performs the failover procedure on a protocol session. As described in the - * class level comment for {@link AMQProtocolHandler}, a protocol connection can span many physical transport - * connections, failing over to a new connection if the transport connection fails. The procedure to establish a new - * connection is expressed as a continuation, in order that it may be run in a seperate thread to the i/o thread that - * detected the failure and is used to handle the communication to establish a new connection. - * - * </p>The reason this needs to be a separate thread is because this work cannot be done inside the i/o processor - * thread. The significant task is the connection setup which involves a protocol exchange until a particular state - * is achieved. This procedure waits until the state is achieved which would prevent the i/o thread doing the work - * it needs to do to achieve the new state. - * - * <p/>The failover procedure does the following: - * - * <ol> - * <li>Sets the failing over condition to true.</li> - * <li>Creates a {@link FailoverException} and gets the protocol connection handler to propagate this event to all - * interested parties.</li> - * <li>Takes the failover mutex on the protocol connection handler.</li> - * <li>Abandons the fail over if any of the interested parties vetoes it. The mutex is released and the condition - * reset.</li> - * <li>Creates a new {@link AMQStateManager} and re-established the connection through it.</li> - * <li>Informs the AMQConnection if the connection cannot be re-established.</li> - * <li>Recreates all sessions from the old connection to the new.</li> - * <li>Resets the failing over condition and releases the mutex.</li> - * </ol> - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Update fail-over state <td> {@link AMQProtocolHandler} - * </table> - * - * @todo The failover latch and mutex are used like a lock and condition. If the retrotranlator supports lock/condition - * then could change over to using them. 1.4 support still needed. - * - * @todo If the condition is set to null on a vetoes fail-over and there are already other threads waiting on the - * condition, they will never be released. It might be an idea to reset the condition in a finally block. - * - * @todo Creates a {@link AMQDisconnectedException} and passes it to the AMQConnection. No need to use an - * exception-as-argument here, could just as easily call a specific method for this purpose on AMQConnection. - * - * @todo Creates a {@link FailoverException} and propagates it to the MethodHandlers. No need to use an - * exception-as-argument here, could just as easily call a specific method for this purpose on - * {@link org.apache.qpid.protocol.AMQMethodListener}. - */ -public class FailoverHandler implements Runnable -{ - /** Used for debugging. */ - private static final Logger _logger = LoggerFactory.getLogger(FailoverHandler.class); - - /** Holds the protocol handler for the failed connection, upon which the new connection is to be set up. */ - private AMQProtocolHandler _amqProtocolHandler; - - /** Used to hold the host to fail over to. This is optional and if not set a reconnect to the previous host is tried. */ - private String _host; - - /** Used to hold the port to fail over to. */ - private int _port; - - /** - * Creates a failover handler on a protocol session, for a particular MINA session (network connection). - * - * @param amqProtocolHandler The protocol handler that spans the failover. - */ - public FailoverHandler(AMQProtocolHandler amqProtocolHandler) - { - _amqProtocolHandler = amqProtocolHandler; - } - - /** - * Performs the failover procedure. See the class level comment, {@link FailoverHandler}, for a description of the - * failover procedure. - */ - public void run() - { - if (Thread.currentThread().isDaemon()) - { - throw new IllegalStateException("FailoverHandler must run on a non-daemon thread."); - } - - // Create a latch, upon which tasks that must not run in parallel with a failover can wait for completion of - // the fail over. - _amqProtocolHandler.setFailoverLatch(new CountDownLatch(1)); - - // We wake up listeners. If they can handle failover, they will extend the - // FailoverRetrySupport class and will in turn block on the latch until failover - // has completed before retrying the operation. - _amqProtocolHandler.notifyFailoverStarting(); - - // Since failover impacts several structures we protect them all with a single mutex. These structures - // are also in child objects of the connection. This allows us to manipulate them without affecting - // client code which runs in a separate thread. - synchronized (_amqProtocolHandler.getConnection().getFailoverMutex()) - { - //Clear the exception now that we have the failover mutex there can be no one else waiting for a frame so - // we can clear the exception. - _amqProtocolHandler.failoverInProgress(); - - // We switch in a new state manager temporarily so that the interaction to get to the "connection open" - // state works, without us having to terminate any existing "state waiters". We could theoretically - // have a state waiter waiting until the connection is closed for some reason. Or in future we may have - // a slightly more complex state model therefore I felt it was worthwhile doing this. - AMQStateManager existingStateManager = _amqProtocolHandler.getStateManager(); - - - // Use a fresh new StateManager for the reconnection attempts - _amqProtocolHandler.setStateManager(new AMQStateManager()); - - - if (!_amqProtocolHandler.getConnection().firePreFailover(_host != null)) - { - _logger.info("Failover process veto-ed by client"); - - //Restore Existing State Manager - _amqProtocolHandler.setStateManager(existingStateManager); - - //todo: ritchiem these exceptions are useless... Would be better to attempt to propogate exception that - // prompted the failover event. - if (_host != null) - { - _amqProtocolHandler.getConnection().exceptionReceived(new AMQDisconnectedException("Redirect was vetoed by client", null)); - } - else - { - _amqProtocolHandler.getConnection().exceptionReceived(new AMQDisconnectedException("Failover was vetoed by client", null)); - } - - _amqProtocolHandler.getFailoverLatch().countDown(); - _amqProtocolHandler.setFailoverLatch(null); - - return; - } - - _logger.info("Starting failover process"); - - boolean failoverSucceeded; - // when host is non null we have a specified failover host otherwise we all the client to cycle through - // all specified hosts - - // if _host has value then we are performing a redirect. - if (_host != null) - { - failoverSucceeded = _amqProtocolHandler.getConnection().attemptReconnection(_host, _port); - } - else - { - failoverSucceeded = _amqProtocolHandler.getConnection().attemptReconnection(); - } - - if (!failoverSucceeded) - { - //Restore Existing State Manager - _amqProtocolHandler.setStateManager(existingStateManager); - - _amqProtocolHandler.getConnection().exceptionReceived( - new AMQDisconnectedException("Server closed connection and no failover " + - "was successful", null)); - } - else - { - // Set the new Protocol Session in the StateManager. - existingStateManager.setProtocolSession(_amqProtocolHandler.getProtocolSession()); - - // Now that the ProtocolHandler has been reconnected clean up - // the state of the old state manager. As if we simply reinstate - // it any old exception that had occured prior to failover may - // prohibit reconnection. - // e.g. During testing when the broker is shutdown gracefully. - // The broker - // Clear any exceptions we gathered - if (existingStateManager.getCurrentState() != AMQState.CONNECTION_OPEN) - { - // Clear the state of the previous state manager as it may - // have received an exception - existingStateManager.clearLastException(); - existingStateManager.changeState(AMQState.CONNECTION_OPEN); - } - - - //Restore Existing State Manager - _amqProtocolHandler.setStateManager(existingStateManager); - try - { - if (_amqProtocolHandler.getConnection().firePreResubscribe()) - { - _logger.info("Resubscribing on new connection"); - _amqProtocolHandler.getConnection().resubscribeSessions(); - } - else - { - _logger.info("Client vetoed automatic resubscription"); - } - - _amqProtocolHandler.getConnection().fireFailoverComplete(); - _amqProtocolHandler.setFailoverState(FailoverState.NOT_STARTED); - _logger.info("Connection failover completed successfully"); - } - catch (Exception e) - { - _logger.info("Failover process failed - exception being propagated by protocol handler"); - _amqProtocolHandler.setFailoverState(FailoverState.FAILED); - /*try - {*/ - _amqProtocolHandler.exception(e); - /*} - catch (Exception ex) - { - _logger.error("Error notifying protocol session of error: " + ex, ex); - }*/ - } - } - } - - _amqProtocolHandler.getFailoverLatch().countDown(); - } - - /** - * Sets the host name to fail over to. This is optional and if not set a reconnect to the previous host is tried. - * - * @param host The host name to fail over to. - */ - public void setHost(String host) - { - _host = host; - } - - /** - * Sets the port to fail over to. - * - * @param port The port to fail over to. - */ - public void setPort(int port) - { - _port = port; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverNoopSupport.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverNoopSupport.java deleted file mode 100644 index 51cc94965a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverNoopSupport.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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.qpid.client.failover; - -import org.apache.qpid.client.AMQConnection; - -/** - * FailoverNoopSupport is a {@link FailoverSupport} implementation that does not really provide any failover support - * at all. It wraps a {@link FailoverProtectedOperation} but should that operation throw {@link FailoverException} this - * support class simply re-raises that exception as an IllegalStateException. This support wrapper should only be - * used where the caller can be certain that the failover protected operation cannot acutally throw a failover exception, - * for example, because the caller already holds a lock preventing that condition from arising. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Perform a fail-over protected operation raising providing no handling of fail-over conditions. - * </table> - */ -public class FailoverNoopSupport<T, E extends Exception> implements FailoverSupport<T, E> -{ - /** The protected operation that is to be retried in the event of fail-over. */ - FailoverProtectedOperation<T, E> operation; - - /** The connection on which the fail-over protected operation is to be performed. */ - AMQConnection connection; - - /** - * Creates an automatic retrying fail-over handler for the specified operation. - * - * @param operation The fail-over protected operation to wrap in this handler. - */ - public FailoverNoopSupport(FailoverProtectedOperation<T, E> operation, AMQConnection con) - { - this.operation = operation; - this.connection = con; - } - - /** - * Delegates to another continuation which is to be provided with fail-over handling. - * - * @return The return value from the delegated to continuation. - * @throws E Any exception that the delegated to continuation may raise. - */ - public T execute() throws E - { - try - { - return operation.execute(); - } - catch (FailoverException e) - { - throw new IllegalStateException("Fail-over interupted no-op failover support. " - + "No-op support should only be used where the caller is certain fail-over cannot occur.", e); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverProtectedOperation.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverProtectedOperation.java deleted file mode 100644 index e9c5f24791..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverProtectedOperation.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.qpid.client.failover; - -/** - * FailoverProtectedOperation is a continuation for an operation that may throw a {@link FailoverException} because - * it has been interrupted by the fail-over process. The {@link FailoverRetrySupport} class defines support wrappers - * for failover protected operations, in order to provide different handling schemes when failovers occurr. - * - * <p/>The type of checked exception that the operation may perform has been generified, in order that fail over - * protected operations can be defined that raise arbitrary exceptions. The actuall exception types used should not - * be sub-classes of FailoverException, or else catching FailoverException in the {@link FailoverRetrySupport} classes - * will mask the exception. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Perform an operation that may be interrupted by fail-over. - * </table> - */ -public interface FailoverProtectedOperation<T, E extends Exception> -{ - /** - * Performs the continuations work. - * - * @return Provdes scope for the continuation to return an arbitrary value. - * - * @throws FailoverException If the operation is interrupted by a fail-over notification. - */ - public abstract T execute() throws E, FailoverException; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverRetrySupport.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverRetrySupport.java deleted file mode 100644 index e9e52cc97c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverRetrySupport.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * 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.qpid.client.failover; - -import org.apache.qpid.client.AMQConnection; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * FailoverRetrySupport is a continuation that wraps another continuation, delaying its execution until it is notified - * that a blocking condition has been met, and executing the continuation within a mutex. If the continuation fails, due - * to the original condition being broken, whilst the continuation is waiting for a reponse to a synchronous request, - * FailoverRetrySupport automatcally rechecks the condition and re-acquires the mutex and re-runs the continution. This - * automatic retrying is continued until the continuation succeeds, or throws an exception (different to - * FailoverException, which is used to signal the failure of the original condition). - * - * <p/>The blocking condition used is that the connection is not currently failing over, and the mutex used is the - * connection failover mutex, which guards against the fail-over process being run during fail-over vulnerable methods. - * These are used like a lock and condition variable. - * - * <p/>The wrapped operation may throw a FailoverException, this is an exception that can be raised by a - * {@link org.apache.qpid.client.protocol.BlockingMethodFrameListener}, in response to it being notified that a - * fail-over wants to start whilst it was waiting. Methods that are vulnerable to fail-over are those that are - * synchronous, where a failure will prevent them from getting the reply they are waiting for and asynchronous - * methods that should not be attempted when a fail-over is in progress. - * - * <p/>Wrapping a synchronous method in a FailoverRetrySupport will have the effect that the operation will not be - * started during fail-over, but be delayed until any current fail-over has completed. Should a fail-over process want - * to start whilst waiting for the synchrnous reply, the FailoverRetrySupport will detect this and rety the operation - * until it succeeds. Synchronous methods are usually coordinated with a - * {@link org.apache.qpid.client.protocol.BlockingMethodFrameListener} which is notified when a fail-over process wants - * to start and throws a FailoverException in response to this. - * - * <p/>Wrapping an asynchronous method in a FailoverRetrySupport will have the effect that the operation will not be - * started during fail-over, but be delayed until any current fail-over has completed. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a continuation synchronized on a fail-over lock and condition. - * <tr><td> Automatically retry the continuation accross fail-overs until it succeeds, or raises an exception. - * </table> - * - * @todo Another continuation. Could use an interface Continuation (as described in other todos, for example, see - * {@link org.apache.qpid.pool.Job}). Then have a wrapping continuation (this), which blocks on an arbitrary - * Condition or Latch (specified in constructor call), that this blocks on before calling the wrapped Continuation. - * Must work on Java 1.4, so check retrotranslator works on Lock/Condition or latch first. Argument and return type - * to match wrapped condition as type parameters. Rename to AsyncConditionalContinuation or something like that. - * - * @todo InterruptedException not handled well. - */ -public class FailoverRetrySupport<T, E extends Exception> implements FailoverSupport<T, E> -{ - /** Used for debugging. */ - private static final Logger _log = LoggerFactory.getLogger(FailoverRetrySupport.class); - - /** The protected operation that is to be retried in the event of fail-over. */ - FailoverProtectedOperation<T, E> operation; - - /** The connection on which the fail-over protected operation is to be performed. */ - AMQConnection connection; - - /** - * Creates an automatic retrying fail-over handler for the specified operation. - * - * @param operation The fail-over protected operation to wrap in this handler. - */ - public FailoverRetrySupport(FailoverProtectedOperation<T, E> operation, AMQConnection con) - { - this.operation = operation; - this.connection = con; - } - - /** - * Delays a continuation until the "not failing over" condition is met on the specified connection. Repeats - * until the operation throws AMQException or succeeds without being interrupted by fail-over. - * - * @return The result of executing the continuation. - * - * @throws E Any underlying exception is allowed to fall through. - */ - public T execute() throws E - { - return connection.executeRetrySupport(operation); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverState.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverState.java deleted file mode 100644 index 807a5f7d13..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverState.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * 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.qpid.client.failover; - -/** - * Defines the possible states of the failover process; not started, in progress, failed. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent a one of the states of the fail-over process. - * </table> - */ -public final class FailoverState -{ - /** The string description on this state. */ - private final String _state; - - /** Failover has not yet been attempted on this connection. */ - public static final FailoverState NOT_STARTED = new FailoverState("NOT STARTED"); - - /** Failover has been requested on this connection but has not completed. */ - public static final FailoverState IN_PROGRESS = new FailoverState("IN PROGRESS"); - - /** Failover has been attempted and failed. */ - public static final FailoverState FAILED = new FailoverState("FAILED"); - - /** - * Creates a type safe enumeration of a fail-over state. - * - * @param state The fail-over state description string. - */ - private FailoverState(String state) - { - _state = state; - } - - /** - * Prints this state, mainly for debugging purposes. - * - * @return The string description of this state. - */ - public String toString() - { - return "FailoverState: " + _state; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverSupport.java b/java/client/src/main/java/org/apache/qpid/client/failover/FailoverSupport.java deleted file mode 100644 index ef2e7e1d65..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/failover/FailoverSupport.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.qpid.client.failover; - -/** - * FailoverSupport defines an interface for different types of fail-over handlers, that provide different types of - * behaviour for handling fail-overs during operations that can be interrupted by the fail-over process. For example, - * the support could automatically retry once the fail-over process completes, could prevent an operation from being - * started whilst fail-over is running, or could quietly abandon the operation or raise an exception, and so on. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Perform a fail-over protected operation with handling for fail-over conditions. - * </table> - * - * @todo Continuation, extend some sort of re-usable Continuation interface, which might look very like this one. - */ -public interface FailoverSupport<T, E extends Exception> -{ - /** - * Delegates to another continuation which is to be provided with fail-over handling. - * - * @return The return value from the delegated to continuation. - * - * @throws E Any exception that the delegated to continuation may raise. - */ - public T execute() throws E; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/AccessRequestOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/AccessRequestOkMethodHandler.java deleted file mode 100644 index af47673a43..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/AccessRequestOkMethodHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.apache.qpid.client.handler; -/* - * - * 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. - * - */ - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.qpid.framing.*; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.AMQException; - -public class AccessRequestOkMethodHandler implements StateAwareMethodListener<AccessRequestOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(AccessRequestOkMethodHandler.class); - - private static AccessRequestOkMethodHandler _handler = new AccessRequestOkMethodHandler(); - - public static AccessRequestOkMethodHandler getInstance() - { - return _handler; - } - - public void methodReceived(AMQProtocolSession session, AccessRequestOkBody method, int channelId) - throws AMQException - { - _logger.debug("AccessRequestOk method received"); - session.setTicket(method.getTicket(), channelId); - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/BasicCancelOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/BasicCancelOkMethodHandler.java deleted file mode 100644 index 5cb9412d51..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/BasicCancelOkMethodHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.BasicCancelOkBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BasicCancelOkMethodHandler implements StateAwareMethodListener<BasicCancelOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(BasicCancelOkMethodHandler.class); - - private static final BasicCancelOkMethodHandler _instance = new BasicCancelOkMethodHandler(); - - public static BasicCancelOkMethodHandler getInstance() - { - return _instance; - } - - private BasicCancelOkMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, BasicCancelOkBody body, int channelId) - throws AMQException - { - if (_logger.isInfoEnabled()) - { - _logger.info("New BasicCancelOk method received for consumer:" + body.getConsumerTag()); - } - - session.confirmConsumerCancelled(channelId, body.getConsumerTag()); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/BasicDeliverMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/BasicDeliverMethodHandler.java deleted file mode 100644 index 6237234c4d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/BasicDeliverMethodHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.message.UnprocessedMessage_0_8; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.BasicDeliverBody; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BasicDeliverMethodHandler implements StateAwareMethodListener<BasicDeliverBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(BasicDeliverMethodHandler.class); - - private static final BasicDeliverMethodHandler _instance = new BasicDeliverMethodHandler(); - - public static BasicDeliverMethodHandler getInstance() - { - return _instance; - } - - public void methodReceived(AMQProtocolSession session, BasicDeliverBody body, int channelId) - throws AMQException - { - final UnprocessedMessage_0_8 msg = new UnprocessedMessage_0_8( - body.getDeliveryTag(), - body.getConsumerTag().toIntValue(), - body.getExchange(), - body.getRoutingKey(), - body.getRedelivered()); - _logger.debug("New JmsDeliver method received:" + session); - session.unprocessedMessageReceived(channelId, msg); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/BasicReturnMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/BasicReturnMethodHandler.java deleted file mode 100644 index 3bbc9209c5..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/BasicReturnMethodHandler.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.message.ReturnMessage; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.BasicReturnBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BasicReturnMethodHandler implements StateAwareMethodListener<BasicReturnBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(BasicReturnMethodHandler.class); - - private static final BasicReturnMethodHandler _instance = new BasicReturnMethodHandler(); - - public static BasicReturnMethodHandler getInstance() - { - return _instance; - } - - - public void methodReceived(AMQProtocolSession session, BasicReturnBody body, int channelId) - throws AMQException - { - _logger.debug("New JmsBounce method received"); - final ReturnMessage msg = new ReturnMessage( - body.getExchange(), - body.getRoutingKey(), - body.getReplyText(), - body.getReplyCode() - ); - - session.unprocessedMessageReceived(channelId, msg); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseMethodHandler.java deleted file mode 100644 index 2cf19bf391..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseMethodHandler.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQChannelClosedException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInvalidRoutingKeyException; -import org.apache.qpid.client.AMQNoConsumersException; -import org.apache.qpid.client.AMQNoRouteException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ChannelCloseBody; -import org.apache.qpid.framing.ChannelCloseOkBody; -import org.apache.qpid.protocol.AMQConstant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ChannelCloseMethodHandler implements StateAwareMethodListener<ChannelCloseBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ChannelCloseMethodHandler.class); - - private static ChannelCloseMethodHandler _handler = new ChannelCloseMethodHandler(); - - public static ChannelCloseMethodHandler getInstance() - { - return _handler; - } - - public void methodReceived(AMQProtocolSession session, ChannelCloseBody method, int channelId) - throws AMQException - { - _logger.debug("ChannelClose method received"); - - AMQConstant errorCode = AMQConstant.getConstant(method.getReplyCode()); - AMQShortString reason = method.getReplyText(); - if (_logger.isDebugEnabled()) - { - _logger.debug("Channel close reply code: " + errorCode + ", reason: " + reason); - } - - ChannelCloseOkBody body = session.getMethodRegistry().createChannelCloseOkBody(); - AMQFrame frame = body.generateFrame(channelId); - session.writeFrame(frame); - try - { - if (errorCode != AMQConstant.REPLY_SUCCESS) - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Channel close received with errorCode " + errorCode + ", and reason " + reason); - } - - if (errorCode == AMQConstant.NO_CONSUMERS) - { - throw new AMQNoConsumersException("Error: " + reason, null, null); - } - else if (errorCode == AMQConstant.NO_ROUTE) - { - throw new AMQNoRouteException("Error: " + reason, null, null); - } - else if (errorCode == AMQConstant.INVALID_ARGUMENT) - { - _logger.debug("Broker responded with Invalid Argument."); - - throw new org.apache.qpid.AMQInvalidArgumentException(String.valueOf(reason), null); - } - else if (errorCode == AMQConstant.INVALID_ROUTING_KEY) - { - _logger.debug("Broker responded with Invalid Routing Key."); - - throw new AMQInvalidRoutingKeyException(String.valueOf(reason), null); - } - else - { - - throw new AMQChannelClosedException(errorCode, "Error: " + reason, null); - } - - } - } - finally - { - // fixme why is this only done when the close is expected... - // should the above forced closes not also cause a close? - // ---------- - // Closing the session only when it is expected allows the errors to be processed - // Calling this here will prevent failover. So we should do this for all exceptions - // that should never cause failover. Such as authentication errors. - // ---- - // 2009-09-07 - ritchiem - // calling channelClosed will only close this session and will not - // prevent failover. If we don't close the session here then we will - // have problems during the session close as it will attempt to - // close the session that the broker has closed, - - session.channelClosed(channelId, errorCode, String.valueOf(reason)); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseOkMethodHandler.java deleted file mode 100644 index 72936779c2..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseOkMethodHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.ChannelCloseOkBody; -import org.apache.qpid.protocol.AMQConstant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ChannelCloseOkMethodHandler implements StateAwareMethodListener<ChannelCloseOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ChannelCloseOkMethodHandler.class); - - private static final ChannelCloseOkMethodHandler _instance = new ChannelCloseOkMethodHandler(); - - public static ChannelCloseOkMethodHandler getInstance() - { - return _instance; - } - - public void methodReceived(AMQProtocolSession session, ChannelCloseOkBody method, int channelId) - throws AMQException - { - _logger.info("Received channel-close-ok for channel-id " + channelId); - - session.channelClosed(channelId, AMQConstant.REPLY_SUCCESS, "Channel closed successfully"); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowMethodHandler.java deleted file mode 100644 index 2153b9cc8c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowMethodHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.apache.qpid.client.handler; - -import org.apache.qpid.framing.ChannelFlowBody; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.AMQException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/* -* -* 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. -* -*/ - -public class ChannelFlowMethodHandler implements StateAwareMethodListener<ChannelFlowBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ChannelFlowMethodHandler.class); - private static final ChannelFlowMethodHandler _instance = new ChannelFlowMethodHandler(); - - public static ChannelFlowMethodHandler getInstance() - { - return _instance; - } - - private ChannelFlowMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ChannelFlowBody body, int channelId) - throws AMQException - { - session.setFlowControl(channelId, body.getActive()); - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowOkMethodHandler.java deleted file mode 100644 index 6f66a972d5..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ChannelFlowOkMethodHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.ChannelFlowOkBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ChannelFlowOkMethodHandler implements StateAwareMethodListener<ChannelFlowOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ChannelFlowOkMethodHandler.class); - private static final ChannelFlowOkMethodHandler _instance = new ChannelFlowOkMethodHandler(); - - public static ChannelFlowOkMethodHandler getInstance() - { - return _instance; - } - - private ChannelFlowOkMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ChannelFlowOkBody body, int channelId) - throws AMQException - { - - _logger.debug("Received Channel.Flow-Ok message, active = " + body.getActive()); - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java deleted file mode 100644 index ec98783a8a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java +++ /dev/null @@ -1,543 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import java.util.Map; -import java.util.HashMap; - -import org.apache.qpid.framing.*; -import org.apache.qpid.AMQException; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQMethodNotImplementedException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClientMethodDispatcherImpl implements MethodDispatcher -{ - - private static final BasicCancelOkMethodHandler _basicCancelOkMethodHandler = BasicCancelOkMethodHandler.getInstance(); - private static final BasicDeliverMethodHandler _basicDeliverMethodHandler = BasicDeliverMethodHandler.getInstance(); - private static final BasicReturnMethodHandler _basicReturnMethodHandler = BasicReturnMethodHandler.getInstance(); - private static final ChannelCloseMethodHandler _channelCloseMethodHandler = ChannelCloseMethodHandler.getInstance(); - private static final ChannelCloseOkMethodHandler _channelCloseOkMethodHandler = ChannelCloseOkMethodHandler.getInstance(); - private static final ChannelFlowOkMethodHandler _channelFlowOkMethodHandler = ChannelFlowOkMethodHandler.getInstance(); - private static final ChannelFlowMethodHandler _channelFlowMethodHandler = ChannelFlowMethodHandler.getInstance(); - private static final ConnectionCloseMethodHandler _connectionCloseMethodHandler = ConnectionCloseMethodHandler.getInstance(); - private static final ConnectionOpenOkMethodHandler _connectionOpenOkMethodHandler = ConnectionOpenOkMethodHandler.getInstance(); - private static final ConnectionRedirectMethodHandler _connectionRedirectMethodHandler = ConnectionRedirectMethodHandler.getInstance(); - private static final ConnectionSecureMethodHandler _connectionSecureMethodHandler = ConnectionSecureMethodHandler.getInstance(); - private static final ConnectionStartMethodHandler _connectionStartMethodHandler = ConnectionStartMethodHandler.getInstance(); - private static final ConnectionTuneMethodHandler _connectionTuneMethodHandler = ConnectionTuneMethodHandler.getInstance(); - private static final ExchangeBoundOkMethodHandler _exchangeBoundOkMethodHandler = ExchangeBoundOkMethodHandler.getInstance(); - private static final QueueDeleteOkMethodHandler _queueDeleteOkMethodHandler = QueueDeleteOkMethodHandler.getInstance(); - - private static final Logger _logger = LoggerFactory.getLogger(ClientMethodDispatcherImpl.class); - - private static interface DispatcherFactory - { - public ClientMethodDispatcherImpl createMethodDispatcher(AMQProtocolSession session); - } - - private static final Map<ProtocolVersion, DispatcherFactory> _dispatcherFactories = - new HashMap<ProtocolVersion, DispatcherFactory>(); - - static - { - _dispatcherFactories.put(ProtocolVersion.v8_0, - new DispatcherFactory() - { - public ClientMethodDispatcherImpl createMethodDispatcher(AMQProtocolSession session) - { - return new ClientMethodDispatcherImpl_8_0(session); - } - }); - - _dispatcherFactories.put(ProtocolVersion.v0_9, - new DispatcherFactory() - { - public ClientMethodDispatcherImpl createMethodDispatcher(AMQProtocolSession session) - { - return new ClientMethodDispatcherImpl_0_9(session); - } - }); - - - _dispatcherFactories.put(ProtocolVersion.v0_91, - new DispatcherFactory() - { - public ClientMethodDispatcherImpl createMethodDispatcher(AMQProtocolSession session) - { - return new ClientMethodDispatcherImpl_0_91(session); - } - }); - - } - - public static ClientMethodDispatcherImpl newMethodDispatcher(ProtocolVersion version, AMQProtocolSession session) - { - if (_logger.isInfoEnabled()) - { - _logger.info("New Method Dispatcher:" + session); - } - - DispatcherFactory factory = _dispatcherFactories.get(version); - return factory.createMethodDispatcher(session); - } - - AMQProtocolSession _session; - - public ClientMethodDispatcherImpl(AMQProtocolSession session) - { - _session = session; - } - - public AMQStateManager getStateManager() - { - return _session.getStateManager(); - } - - public boolean dispatchAccessRequestOk(AccessRequestOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicCancelOk(BasicCancelOkBody body, int channelId) throws AMQException - { - _basicCancelOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchBasicConsumeOk(BasicConsumeOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicDeliver(BasicDeliverBody body, int channelId) throws AMQException - { - _basicDeliverMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchBasicGetEmpty(BasicGetEmptyBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicGetOk(BasicGetOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicQosOk(BasicQosOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicReturn(BasicReturnBody body, int channelId) throws AMQException - { - _basicReturnMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchChannelClose(ChannelCloseBody body, int channelId) throws AMQException - { - _channelCloseMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchChannelCloseOk(ChannelCloseOkBody body, int channelId) throws AMQException - { - _channelCloseOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchChannelFlow(ChannelFlowBody body, int channelId) throws AMQException - { - _channelFlowMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchChannelFlowOk(ChannelFlowOkBody body, int channelId) throws AMQException - { - _channelFlowOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchChannelOpenOk(ChannelOpenOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchConnectionClose(ConnectionCloseBody body, int channelId) throws AMQException - { - _connectionCloseMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchConnectionCloseOk(ConnectionCloseOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchConnectionOpenOk(ConnectionOpenOkBody body, int channelId) throws AMQException - { - _connectionOpenOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchConnectionRedirect(ConnectionRedirectBody body, int channelId) throws AMQException - { - _connectionRedirectMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchConnectionSecure(ConnectionSecureBody body, int channelId) throws AMQException - { - _connectionSecureMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchConnectionStart(ConnectionStartBody body, int channelId) throws AMQException - { - _connectionStartMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchConnectionTune(ConnectionTuneBody body, int channelId) throws AMQException - { - _connectionTuneMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchQueueDeleteOk(QueueDeleteOkBody body, int channelId) throws AMQException - { - _queueDeleteOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchQueuePurgeOk(QueuePurgeOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchStreamCancelOk(StreamCancelOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchStreamConsumeOk(StreamConsumeOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchAccessRequest(AccessRequestBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicAck(BasicAckBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicCancel(BasicCancelBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicConsume(BasicConsumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicGet(BasicGetBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicPublish(BasicPublishBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicQos(BasicQosBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicRecover(BasicRecoverBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicReject(BasicRejectBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchChannelOpen(ChannelOpenBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchConnectionOpen(ConnectionOpenBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchConnectionSecureOk(ConnectionSecureOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchConnectionStartOk(ConnectionStartOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchConnectionTuneOk(ConnectionTuneOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchDtxSelect(DtxSelectBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchDtxStart(DtxStartBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchExchangeBound(ExchangeBoundBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchExchangeDeclare(ExchangeDeclareBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchExchangeDelete(ExchangeDeleteBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileAck(FileAckBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileCancel(FileCancelBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileConsume(FileConsumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFilePublish(FilePublishBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileQos(FileQosBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileReject(FileRejectBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueueBind(QueueBindBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueueDeclare(QueueDeclareBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueueDelete(QueueDeleteBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueuePurge(QueuePurgeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamCancel(StreamCancelBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamConsume(StreamConsumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamPublish(StreamPublishBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamQos(StreamQosBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchTunnelRequest(TunnelRequestBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchTxCommit(TxCommitBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchTxRollback(TxRollbackBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchTxSelect(TxSelectBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchDtxSelectOk(DtxSelectOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchDtxStartOk(DtxStartOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchExchangeBoundOk(ExchangeBoundOkBody body, int channelId) throws AMQException - { - _exchangeBoundOkMethodHandler.methodReceived(_session, body, channelId); - return true; - } - - public boolean dispatchExchangeDeclareOk(ExchangeDeclareOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchExchangeDeleteOk(ExchangeDeleteOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchFileCancelOk(FileCancelOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileConsumeOk(FileConsumeOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileDeliver(FileDeliverBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileOpen(FileOpenBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileOpenOk(FileOpenOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileQosOk(FileQosOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileReturn(FileReturnBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchFileStage(FileStageBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueueBindOk(QueueBindOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchQueueDeclareOk(QueueDeclareOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchStreamDeliver(StreamDeliverBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamQosOk(StreamQosOkBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchStreamReturn(StreamReturnBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchTxCommitOk(TxCommitOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTxRollbackOk(TxRollbackOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTxSelectOk(TxSelectOkBody body, int channelId) throws AMQException - { - return false; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_9.java b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_9.java deleted file mode 100644 index d3e9fba8ed..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_9.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.framing.*; -import org.apache.qpid.framing.amqp_0_9.MethodDispatcher_0_9; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQMethodNotImplementedException; -import org.apache.qpid.client.protocol.AMQProtocolSession; - -public class ClientMethodDispatcherImpl_0_9 extends ClientMethodDispatcherImpl implements MethodDispatcher_0_9 -{ - public ClientMethodDispatcherImpl_0_9(AMQProtocolSession session) - { - super(session); - } - - public boolean dispatchBasicRecoverSyncOk(BasicRecoverSyncOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicRecoverSync(BasicRecoverSyncBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchChannelOk(ChannelOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelPing(ChannelPingBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelPong(ChannelPongBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelResume(ChannelResumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageAppend(MessageAppendBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageCancel(MessageCancelBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageCheckpoint(MessageCheckpointBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageClose(MessageCloseBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageConsume(MessageConsumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageEmpty(MessageEmptyBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageGet(MessageGetBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageOffset(MessageOffsetBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageOk(MessageOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageOpen(MessageOpenBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageQos(MessageQosBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageRecover(MessageRecoverBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageReject(MessageRejectBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageResume(MessageResumeBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageTransfer(MessageTransferBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchQueueUnbind(QueueUnbindBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchQueueUnbindOk(QueueUnbindOkBody body, int channelId) throws AMQException - { - return false; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_91.java b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_91.java deleted file mode 100644 index f15340ae00..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_0_91.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.framing.*; -import org.apache.qpid.framing.amqp_0_91.MethodDispatcher_0_91; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQMethodNotImplementedException; -import org.apache.qpid.client.protocol.AMQProtocolSession; - -public class ClientMethodDispatcherImpl_0_91 extends ClientMethodDispatcherImpl implements MethodDispatcher_0_91 -{ - public ClientMethodDispatcherImpl_0_91(AMQProtocolSession session) - { - super(session); - } - - public boolean dispatchBasicRecoverSyncOk(BasicRecoverSyncOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchBasicRecoverSync(BasicRecoverSyncBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchChannelOk(ChannelOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelPing(ChannelPingBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelPong(ChannelPongBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelResume(ChannelResumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageAppend(MessageAppendBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageCancel(MessageCancelBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageCheckpoint(MessageCheckpointBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageClose(MessageCloseBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageConsume(MessageConsumeBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageEmpty(MessageEmptyBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageGet(MessageGetBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageOffset(MessageOffsetBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageOk(MessageOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageOpen(MessageOpenBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageQos(MessageQosBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageRecover(MessageRecoverBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchMessageReject(MessageRejectBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageResume(MessageResumeBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchMessageTransfer(MessageTransferBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchQueueUnbind(QueueUnbindBody body, int channelId) throws AMQException - { - throw new AMQMethodNotImplementedException(body); - } - - public boolean dispatchBasicRecoverOk(BasicRecoverOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchQueueUnbindOk(QueueUnbindOkBody body, int channelId) throws AMQException - { - return false; - } - -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_8_0.java b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_8_0.java deleted file mode 100644 index 19f758817d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl_8_0.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.framing.*; -import org.apache.qpid.framing.amqp_8_0.MethodDispatcher_8_0; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; - -public class ClientMethodDispatcherImpl_8_0 extends ClientMethodDispatcherImpl implements MethodDispatcher_8_0 -{ - public ClientMethodDispatcherImpl_8_0(AMQProtocolSession session) - { - super(session); - } - - public boolean dispatchBasicRecoverOk(BasicRecoverOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchChannelAlert(ChannelAlertBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestContent(TestContentBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestContentOk(TestContentOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestInteger(TestIntegerBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestIntegerOk(TestIntegerOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestString(TestStringBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestStringOk(TestStringOkBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestTable(TestTableBody body, int channelId) throws AMQException - { - return false; - } - - public boolean dispatchTestTableOk(TestTableOkBody body, int channelId) throws AMQException - { - return false; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java deleted file mode 100644 index b392604822..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQConnectionClosedException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQSecurityException; -import org.apache.qpid.client.AMQAuthenticationException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ConnectionCloseBody; -import org.apache.qpid.framing.ConnectionCloseOkBody; -import org.apache.qpid.protocol.AMQConstant; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConnectionCloseMethodHandler implements StateAwareMethodListener<ConnectionCloseBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ConnectionCloseMethodHandler.class); - - private static ConnectionCloseMethodHandler _handler = new ConnectionCloseMethodHandler(); - - public static ConnectionCloseMethodHandler getInstance() - { - return _handler; - } - - private ConnectionCloseMethodHandler() - { - } - - public void methodReceived(AMQProtocolSession session, ConnectionCloseBody method, int channelId) - throws AMQException - { - _logger.info("ConnectionClose frame received"); - - // does it matter - // stateManager.changeState(AMQState.CONNECTION_CLOSING); - - AMQConstant errorCode = AMQConstant.getConstant(method.getReplyCode()); - AMQShortString reason = method.getReplyText(); - - AMQException error = null; - - try - { - - ConnectionCloseOkBody closeOkBody = session.getMethodRegistry().createConnectionCloseOkBody(); - // TODO: check whether channel id of zero is appropriate - // Be aware of possible changes to parameter order as versions change. - session.writeFrame(closeOkBody.generateFrame(0)); - - if (errorCode != AMQConstant.REPLY_SUCCESS) - { - if (errorCode == AMQConstant.NOT_ALLOWED) - { - _logger.info("Error :" + errorCode + ":" + Thread.currentThread().getName()); - - error = new AMQAuthenticationException(errorCode, reason == null ? null : reason.toString(), null); - } - else if (errorCode == AMQConstant.ACCESS_REFUSED) - { - _logger.info("Error :" + errorCode + ":" + Thread.currentThread().getName()); - - error = new AMQSecurityException(reason == null ? null : reason.toString(), null); - } - else - { - _logger.info("Connection close received with error code " + errorCode); - - error = new AMQConnectionClosedException(errorCode, "Error: " + reason, null); - } - } - } - finally - { - - if (error != null) - { - session.notifyError(error); - } - - // Close the protocol Session, including any open TCP connections - session.closeProtocolSession(); - - // Closing the session should not introduce a race condition as this thread will continue to propgate any - // exception in to the exceptionCaught method of the SessionHandler. - // Any sessionClosed event should occur after this. - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionOpenOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionOpenOkMethodHandler.java deleted file mode 100644 index e40cafd72f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionOpenOkMethodHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.ConnectionOpenOkBody; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.StateAwareMethodListener; - -public class ConnectionOpenOkMethodHandler implements StateAwareMethodListener<ConnectionOpenOkBody> -{ - private static final ConnectionOpenOkMethodHandler _instance = new ConnectionOpenOkMethodHandler(); - - public static ConnectionOpenOkMethodHandler getInstance() - { - return _instance; - } - - private ConnectionOpenOkMethodHandler() - { - } - - public void methodReceived(AMQProtocolSession session, ConnectionOpenOkBody body, int channelId) - { - session.getStateManager().changeState(AMQState.CONNECTION_OPEN); - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionRedirectMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionRedirectMethodHandler.java deleted file mode 100644 index 472c471fd6..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionRedirectMethodHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.ConnectionRedirectBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConnectionRedirectMethodHandler implements StateAwareMethodListener<ConnectionRedirectBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ConnectionRedirectMethodHandler.class); - - private static final int DEFAULT_REDIRECT_PORT = 5672; - - private static ConnectionRedirectMethodHandler _handler = new ConnectionRedirectMethodHandler(); - - public static ConnectionRedirectMethodHandler getInstance() - { - return _handler; - } - - private ConnectionRedirectMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ConnectionRedirectBody method, int channelId) - throws AMQException - { - _logger.info("ConnectionRedirect frame received"); - - String host = method.getHost().toString(); - // the host is in the form hostname:port with the port being optional - int portIndex = host.indexOf(':'); - - int port; - if (portIndex == -1) - { - port = DEFAULT_REDIRECT_PORT; - } - else - { - port = Integer.parseInt(host.substring(portIndex + 1)); - host = host.substring(0, portIndex); - - } - - session.failover(host, port); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionSecureMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionSecureMethodHandler.java deleted file mode 100644 index 9a9bee757b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionSecureMethodHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.ConnectionSecureBody; -import org.apache.qpid.framing.ConnectionSecureOkBody; - -public class ConnectionSecureMethodHandler implements StateAwareMethodListener<ConnectionSecureBody> -{ - private static final ConnectionSecureMethodHandler _instance = new ConnectionSecureMethodHandler(); - - public static ConnectionSecureMethodHandler getInstance() - { - return _instance; - } - - public void methodReceived(AMQProtocolSession session, ConnectionSecureBody body, int channelId) - throws AMQException - { - SaslClient client = session.getSaslClient(); - if (client == null) - { - throw new AMQException(null, "No SASL client set up - cannot proceed with authentication", null); - } - - - - try - { - // Evaluate server challenge - byte[] response = client.evaluateChallenge(body.getChallenge()); - - ConnectionSecureOkBody secureOkBody = session.getMethodRegistry().createConnectionSecureOkBody(response); - - session.writeFrame(secureOkBody.generateFrame(channelId)); - } - catch (SaslException e) - { - throw new AMQException(null, "Error processing SASL challenge: " + e, e); - } - - - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionStartMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionStartMethodHandler.java deleted file mode 100644 index c81ad6422f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionStartMethodHandler.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.security.AMQCallbackHandler; -import org.apache.qpid.client.security.CallbackHandlerRegistry; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.common.ClientProperties; -import org.apache.qpid.common.QpidProperties; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ConnectionStartBody; -import org.apache.qpid.framing.ConnectionStartOkBody; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; -import org.apache.qpid.framing.ProtocolVersion; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; - -import java.io.UnsupportedEncodingException; -import java.util.HashSet; -import java.util.StringTokenizer; - -public class ConnectionStartMethodHandler implements StateAwareMethodListener<ConnectionStartBody> -{ - private static final Logger _log = LoggerFactory.getLogger(ConnectionStartMethodHandler.class); - - private static final ConnectionStartMethodHandler _instance = new ConnectionStartMethodHandler(); - - public static ConnectionStartMethodHandler getInstance() - { - return _instance; - } - - private ConnectionStartMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ConnectionStartBody body, int channelId) - throws AMQException - { - _log.debug("public void methodReceived(AMQStateManager stateManager, AMQProtocolSession protocolSession, " - + "AMQMethodEvent evt): called"); - - ProtocolVersion pv = new ProtocolVersion((byte) body.getVersionMajor(), (byte) body.getVersionMinor()); - - // 0-9-1 is indistinguishable from 0-9 using only major and minor ... if we established the connection as 0-9-1 - // and now get back major = 0 , minor = 9 then we can assume it means 0-9-1 - - if(pv.equals(ProtocolVersion.v0_9) && session.getProtocolVersion().equals(ProtocolVersion.v0_91)) - { - pv = ProtocolVersion.v0_91; - } - - // For the purposes of interop, we can make the client accept the broker's version string. - // If it does, it then internally records the version as being the latest one that it understands. - // It needs to do this since frame lookup is done by version. - if (Boolean.getBoolean("qpid.accept.broker.version") && !pv.isSupported()) - { - - pv = ProtocolVersion.getLatestSupportedVersion(); - } - - if (pv.isSupported()) - { - session.setProtocolVersion(pv); - - try - { - // Used to hold the SASL mechanism to authenticate with. - String mechanism; - - if (body.getMechanisms()== null) - { - throw new AMQException(null, "mechanism not specified in ConnectionStart method frame", null); - } - else - { - mechanism = chooseMechanism(body.getMechanisms()); - _log.debug("mechanism = " + mechanism); - } - - if (mechanism == null) - { - throw new AMQException(null, "No supported security mechanism found, passed: " + new String(body.getMechanisms()), null); - } - - byte[] saslResponse; - try - { - SaslClient sc = - Sasl.createSaslClient(new String[] { mechanism }, null, "AMQP", "localhost", null, - createCallbackHandler(mechanism, session)); - if (sc == null) - { - throw new AMQException(null, "Client SASL configuration error: no SaslClient could be created for mechanism " + mechanism - + ". Please ensure all factories are registered. See DynamicSaslRegistrar for " - + " details of how to register non-standard SASL client providers.", null); - } - - session.setSaslClient(sc); - saslResponse = (sc.hasInitialResponse() ? sc.evaluateChallenge(new byte[0]) : null); - } - catch (SaslException e) - { - session.setSaslClient(null); - throw new AMQException(null, "Unable to create SASL client: " + e, e); - } - - if (body.getLocales() == null) - { - throw new AMQException(null, "Locales is not defined in Connection Start method", null); - } - - final String locales = new String(body.getLocales(), "utf8"); - final StringTokenizer tokenizer = new StringTokenizer(locales, " "); - if (tokenizer.hasMoreTokens()) - { - tokenizer.nextToken(); - } - else - { - throw new AMQException(null, "No locales sent from server, passed: " + locales, null); - } - - session.getStateManager().changeState(AMQState.CONNECTION_NOT_TUNED); - FieldTable clientProperties = FieldTableFactory.newFieldTable(); - - clientProperties.setString(new AMQShortString(ClientProperties.instance.toString()), - session.getClientID()); - clientProperties.setString(new AMQShortString(ClientProperties.product.toString()), - QpidProperties.getProductName()); - clientProperties.setString(new AMQShortString(ClientProperties.version.toString()), - QpidProperties.getReleaseVersion()); - clientProperties.setString(new AMQShortString(ClientProperties.platform.toString()), getFullSystemInfo()); - - - ConnectionStartOkBody connectionStartOkBody = session.getMethodRegistry().createConnectionStartOkBody(clientProperties,new AMQShortString(mechanism),saslResponse,new AMQShortString(locales)); - // AMQP version change: Hardwire the version to 0-8 (major=8, minor=0) - // TODO: Connect this to the session version obtained from ProtocolInitiation for this session. - // Be aware of possible changes to parameter order as versions change. - session.writeFrame(connectionStartOkBody.generateFrame(channelId)); - - } - catch (UnsupportedEncodingException e) - { - throw new AMQException(null, "Unable to decode data: " + e, e); - } - } - else - { - _log.error("Broker requested Protocol [" + body.getVersionMajor() + "-" + body.getVersionMinor() - + "] which is not supported by this version of the client library"); - - session.closeProtocolSession(); - } - } - - private String getFullSystemInfo() - { - StringBuffer fullSystemInfo = new StringBuffer(); - fullSystemInfo.append(System.getProperty("java.runtime.name")); - fullSystemInfo.append(", " + System.getProperty("java.runtime.version")); - fullSystemInfo.append(", " + System.getProperty("java.vendor")); - fullSystemInfo.append(", " + System.getProperty("os.arch")); - fullSystemInfo.append(", " + System.getProperty("os.name")); - fullSystemInfo.append(", " + System.getProperty("os.version")); - fullSystemInfo.append(", " + System.getProperty("sun.os.patch.level")); - - return fullSystemInfo.toString(); - } - - private String chooseMechanism(byte[] availableMechanisms) throws UnsupportedEncodingException - { - final String mechanisms = new String(availableMechanisms, "utf8"); - StringTokenizer tokenizer = new StringTokenizer(mechanisms, " "); - HashSet mechanismSet = new HashSet(); - while (tokenizer.hasMoreTokens()) - { - mechanismSet.add(tokenizer.nextToken()); - } - - String preferredMechanisms = CallbackHandlerRegistry.getInstance().getMechanisms(); - StringTokenizer prefTokenizer = new StringTokenizer(preferredMechanisms, " "); - while (prefTokenizer.hasMoreTokens()) - { - String mech = prefTokenizer.nextToken(); - if (mechanismSet.contains(mech)) - { - return mech; - } - } - - return null; - } - - private AMQCallbackHandler createCallbackHandler(String mechanism, AMQProtocolSession protocolSession) - throws AMQException - { - Class mechanismClass = CallbackHandlerRegistry.getInstance().getCallbackHandlerClass(mechanism); - try - { - Object instance = mechanismClass.newInstance(); - AMQCallbackHandler cbh = (AMQCallbackHandler) instance; - cbh.initialise(protocolSession); - - return cbh; - } - catch (Exception e) - { - throw new AMQException(null, "Unable to create callback handler: " + e, e); - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionTuneMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionTuneMethodHandler.java deleted file mode 100644 index d1b2caf987..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionTuneMethodHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.ConnectionTuneParameters; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConnectionTuneMethodHandler implements StateAwareMethodListener<ConnectionTuneBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ConnectionTuneMethodHandler.class); - - private static final ConnectionTuneMethodHandler _instance = new ConnectionTuneMethodHandler(); - - public static ConnectionTuneMethodHandler getInstance() - { - return _instance; - } - - protected ConnectionTuneMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ConnectionTuneBody frame, int channelId) - { - _logger.debug("ConnectionTune frame received"); - final MethodRegistry methodRegistry = session.getMethodRegistry(); - - - ConnectionTuneParameters params = session.getConnectionTuneParameters(); - if (params == null) - { - params = new ConnectionTuneParameters(); - } - - int maxChannelNumber = frame.getChannelMax(); - //0 implies no limit, except that forced by protocol limitations (0xFFFF) - params.setChannelMax(maxChannelNumber == 0 ? AMQProtocolSession.MAX_CHANNEL_MAX : maxChannelNumber); - - params.setFrameMax(frame.getFrameMax()); - params.setHeartbeat(Integer.getInteger("amqj.heartbeat.delay", frame.getHeartbeat())); - session.setConnectionTuneParameters(params); - - session.getStateManager().changeState(AMQState.CONNECTION_NOT_OPENED); - - ConnectionTuneOkBody tuneOkBody = methodRegistry.createConnectionTuneOkBody(params.getChannelMax(), - params.getFrameMax(), - params.getHeartbeat()); - // Be aware of possible changes to parameter order as versions change. - session.writeFrame(tuneOkBody.generateFrame(channelId)); - - String host = session.getAMQConnection().getVirtualHost(); - AMQShortString virtualHost = new AMQShortString("/" + host); - - ConnectionOpenBody openBody = methodRegistry.createConnectionOpenBody(virtualHost,null,true); - - // Be aware of possible changes to parameter order as versions change. - session.writeFrame(openBody.generateFrame(channelId)); - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ExchangeBoundOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/ExchangeBoundOkMethodHandler.java deleted file mode 100644 index 690d782b40..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/ExchangeBoundOkMethodHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.ExchangeBoundOkBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Apache Software Foundation - */ -public class ExchangeBoundOkMethodHandler implements StateAwareMethodListener<ExchangeBoundOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ExchangeBoundOkMethodHandler.class); - private static final ExchangeBoundOkMethodHandler _instance = new ExchangeBoundOkMethodHandler(); - - public static ExchangeBoundOkMethodHandler getInstance() - { - return _instance; - } - - private ExchangeBoundOkMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, ExchangeBoundOkBody body, int channelId) - throws AMQException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Received Exchange.Bound-Ok message, response code: " + body.getReplyCode() + " text: " - + body.getReplyText()); - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/QueueDeleteOkMethodHandler.java b/java/client/src/main/java/org/apache/qpid/client/handler/QueueDeleteOkMethodHandler.java deleted file mode 100644 index 01d82c9b55..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/handler/QueueDeleteOkMethodHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * 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.qpid.client.handler; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.QueueDeleteOkBody; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Apache Software Foundation - */ -public class QueueDeleteOkMethodHandler implements StateAwareMethodListener<QueueDeleteOkBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(QueueDeleteOkMethodHandler.class); - private static final QueueDeleteOkMethodHandler _instance = new QueueDeleteOkMethodHandler(); - - public static QueueDeleteOkMethodHandler getInstance() - { - return _instance; - } - - private QueueDeleteOkMethodHandler() - { } - - public void methodReceived(AMQProtocolSession session, QueueDeleteOkBody body, int channelId) - throws AMQException - { - if (_logger.isDebugEnabled()) - { - _logger.debug("Received Queue.Delete-Ok message, message count: " + body.getMessageCount()); - } - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate.java deleted file mode 100644 index c2821591d8..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.qpid.client.AMQSession; - -import javax.jms.Destination; -import javax.jms.JMSException; - -import java.nio.ByteBuffer; -import java.util.Enumeration; -import java.util.Map; -import java.util.UUID; - -public interface AMQMessageDelegate -{ - void acknowledgeThis() throws JMSException; - - String getJMSMessageID() throws JMSException; - - void setJMSMessageID(String string) throws JMSException; - - long getJMSTimestamp() throws JMSException; - - void setJMSTimestamp(long l) throws JMSException; - - byte[] getJMSCorrelationIDAsBytes() throws JMSException; - - void setJMSCorrelationIDAsBytes(byte[] bytes) throws JMSException; - - void setJMSCorrelationID(String string) throws JMSException; - - String getJMSCorrelationID() throws JMSException; - - Destination getJMSReplyTo() throws JMSException; - - void setJMSReplyTo(Destination destination) throws JMSException; - - Destination getJMSDestination() throws JMSException; - - int getJMSDeliveryMode() throws JMSException; - - void setJMSDeliveryMode(int i) throws JMSException; - - String getJMSType() throws JMSException; - - void setJMSType(String string) throws JMSException; - - long getJMSExpiration() throws JMSException; - - void setJMSExpiration(long l) throws JMSException; - - int getJMSPriority() throws JMSException; - - void setJMSPriority(int i) throws JMSException; - - void clearProperties() throws JMSException; - - boolean propertyExists(String string) throws JMSException; - - boolean getBooleanProperty(String string) throws JMSException; - - byte getByteProperty(String string) throws JMSException; - - short getShortProperty(String string) throws JMSException; - - int getIntProperty(String string) throws JMSException; - - long getLongProperty(String string) throws JMSException; - - float getFloatProperty(String string) throws JMSException; - - double getDoubleProperty(String string) throws JMSException; - - String getStringProperty(String string) throws JMSException; - - Object getObjectProperty(String string) throws JMSException; - - Enumeration getPropertyNames() throws JMSException; - - void setBooleanProperty(String string, boolean b) throws JMSException; - - void setByteProperty(String string, byte b) throws JMSException; - - void setShortProperty(String string, short i) throws JMSException; - - void setIntProperty(String string, int i) throws JMSException; - - void setLongProperty(String string, long l) throws JMSException; - - void setFloatProperty(String string, float v) throws JMSException; - - void setDoubleProperty(String string, double v) throws JMSException; - - void setStringProperty(String string, String string1) throws JMSException; - - void setObjectProperty(String string, Object object) throws JMSException; - - void acknowledge() throws JMSException; - - public void setJMSDestination(Destination destination); - - public void setContentType(String contentType); - public String getContentType(); - - public void setEncoding(String encoding); - public String getEncoding(); - - - String getReplyToString(); - - void removeProperty(final String propertyName) throws JMSException; - - void setAMQSession(final AMQSession s); - - AMQSession getAMQSession(); - - long getDeliveryTag(); - - void setJMSMessageID(final UUID messageId) throws JMSException; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegateFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegateFactory.java deleted file mode 100644 index 8c3f2fd08f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegateFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.AMQException; - -public interface AMQMessageDelegateFactory<D extends AMQMessageDelegate> -{ - public static AMQMessageDelegateFactory DEFAULT_FACTORY = null; - - public static AMQMessageDelegateFactory<AMQMessageDelegate_0_8> FACTORY_0_8 = - new AMQMessageDelegateFactory<AMQMessageDelegate_0_8>() - { - public AMQMessageDelegate_0_8 createDelegate() - { - return new AMQMessageDelegate_0_8(); - } - }; - - public static AMQMessageDelegateFactory<AMQMessageDelegate_0_10> FACTORY_0_10 = - new AMQMessageDelegateFactory<AMQMessageDelegate_0_10>() - { - public AMQMessageDelegate_0_10 createDelegate() - { - return new AMQMessageDelegate_0_10(); - } - }; - - - public D createDelegate(); - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_10.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_10.java deleted file mode 100644 index fb7b191656..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_10.java +++ /dev/null @@ -1,980 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.lang.ref.SoftReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import javax.jms.DeliveryMode; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageFormatException; -import javax.jms.MessageNotWriteableException; -import javax.jms.Session; - -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQPInvalidClassException; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.AMQSession_0_10; -import org.apache.qpid.client.CustomJMSXProperty; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.jms.Message; -import org.apache.qpid.transport.DeliveryProperties; -import org.apache.qpid.transport.ExchangeQueryResult; -import org.apache.qpid.transport.Future; -import org.apache.qpid.transport.Header; -import org.apache.qpid.transport.MessageDeliveryMode; -import org.apache.qpid.transport.MessageDeliveryPriority; -import org.apache.qpid.transport.MessageProperties; -import org.apache.qpid.transport.ReplyTo; - -/** - * This extends AbstractAMQMessageDelegate which contains common code between - * both the 0_8 and 0_10 Message types. - * - */ -public class AMQMessageDelegate_0_10 extends AbstractAMQMessageDelegate -{ - private static final Map<ReplyTo, SoftReference<Destination>> _destinationCache = Collections.synchronizedMap(new HashMap<ReplyTo, SoftReference<Destination>>()); - - public static final String JMS_TYPE = "x-jms-type"; - - - private boolean _readableProperties = false; - - private Destination _destination; - - - private MessageProperties _messageProps; - private DeliveryProperties _deliveryProps; - /** If the acknowledge mode is CLIENT_ACKNOWLEDGE the session is required */ - private AMQSession _session; - private final long _deliveryTag; - - - protected AMQMessageDelegate_0_10() - { - this(new MessageProperties(), new DeliveryProperties(), -1); - _readableProperties = false; - } - - protected AMQMessageDelegate_0_10(MessageProperties messageProps, DeliveryProperties deliveryProps, long deliveryTag) - { - _messageProps = messageProps; - _deliveryProps = deliveryProps; - _deliveryTag = deliveryTag; - _readableProperties = (_messageProps != null); - - AMQDestination dest; - - dest = generateDestination(new AMQShortString(_deliveryProps.getExchange()), - new AMQShortString(_deliveryProps.getRoutingKey())); - setJMSDestination(dest); - } - - /** - * Use the 0-10 ExchangeQuery call to validate the exchange type. - * - * This is used primarily to provide the correct JMSDestination value. - * - * The query is performed synchronously iff the map exchange is not already - * present in the exchange Map. - * - * @param header The message headers, from which the exchange name can be extracted - * @param session The 0-10 session to use to call ExchangeQuery - */ - public static void updateExchangeTypeMapping(Header header, org.apache.qpid.transport.Session session) - { - DeliveryProperties deliveryProps = header.get(DeliveryProperties.class); - if (deliveryProps != null) - { - String exchange = deliveryProps.getExchange(); - checkAndUpdateExchange(exchange,session); - - } - - MessageProperties msgProps = header.get(MessageProperties.class); - if (msgProps != null && msgProps.getReplyTo() != null) - { - String exchange = msgProps.getReplyTo().getExchange(); - checkAndUpdateExchange(exchange,session); - - } - } - - private static void checkAndUpdateExchange(String exchange, org.apache.qpid.transport.Session session) - { - if (exchange != null && !exchangeMapContains(exchange)) - { - Future<ExchangeQueryResult> future = - session.exchangeQuery(exchange.toString()); - ExchangeQueryResult res = future.get(); - - updateExchangeType(exchange, res.getType()); - } - } - - - public String getJMSMessageID() throws JMSException - { - UUID id = _messageProps.getMessageId(); - return id == null ? null : "ID:" + id; - } - - public void setJMSMessageID(String messageId) throws JMSException - { - if(messageId == null) - { - _messageProps.clearMessageId(); - } - else - { - if(messageId.startsWith("ID:")) - { - try - { - _messageProps.setMessageId(UUID.fromString(messageId.substring(3))); - } - catch(IllegalArgumentException ex) - { - throw new JMSException("MessageId '"+messageId+"' is not of the correct format, it must be ID: followed by a UUID"); - } - } - else - { - throw new JMSException("MessageId '"+messageId+"' is not of the correct format, it must be ID: followed by a UUID"); - } - } - } - - public void setJMSMessageID(UUID messageId) throws JMSException - { - if(messageId == null) - { - _messageProps.clearMessageId(); - } - else - { - _messageProps.setMessageId(messageId); - } - } - - - public long getJMSTimestamp() throws JMSException - { - return _deliveryProps.getTimestamp(); - } - - public void setJMSTimestamp(long timestamp) throws JMSException - { - _deliveryProps.setTimestamp(timestamp); - } - - public byte[] getJMSCorrelationIDAsBytes() throws JMSException - { - return _messageProps.getCorrelationId(); - } - - public void setJMSCorrelationIDAsBytes(byte[] bytes) throws JMSException - { - _messageProps.setCorrelationId(bytes); - } - - public void setJMSCorrelationID(String correlationId) throws JMSException - { - - setJMSCorrelationIDAsBytes(correlationId == null ? null : correlationId.getBytes()); - } - - public String getJMSCorrelationID() throws JMSException - { - - byte[] correlationIDAsBytes = getJMSCorrelationIDAsBytes(); - return correlationIDAsBytes == null ? null : new String(correlationIDAsBytes); - } - - public Destination getJMSReplyTo() - { - ReplyTo replyTo = _messageProps.getReplyTo(); - - if (replyTo == null) - { - return null; - } - else - { - Destination dest = null; - SoftReference<Destination> ref = _destinationCache.get(replyTo); - if (ref != null) - { - dest = ref.get(); - } - if (dest == null) - { - String exchange = replyTo.getExchange(); - String routingKey = replyTo.getRoutingKey(); - - dest = generateDestination(new AMQShortString(exchange), new AMQShortString(routingKey)); - _destinationCache.put(replyTo, new SoftReference<Destination>(dest)); - } - - return dest; - } - } - - public void setJMSReplyTo(Destination destination) throws JMSException - { - if (destination == null) - { - _messageProps.setReplyTo(null); - return; - } - - if (!(destination instanceof AMQDestination)) - { - throw new IllegalArgumentException( - "ReplyTo destination may only be an AMQDestination - passed argument was type " + destination.getClass()); - } - - final AMQDestination amqd = (AMQDestination) destination; - - if (amqd.getDestSyntax() == AMQDestination.DestSyntax.ADDR) - { - try - { - int type = ((AMQSession_0_10)_session).resolveAddressType(amqd); - if (type == AMQDestination.QUEUE_TYPE) - { - ((AMQSession_0_10)_session).setLegacyFiledsForQueueType(amqd); - } - else - { - ((AMQSession_0_10)_session).setLegacyFiledsForTopicType(amqd); - } - } - catch(AMQException ex) - { - JMSException e = new JMSException("Error occured while figuring out the node type"); - e.initCause(ex); - e.setLinkedException(ex); - throw e; - } - } - - final ReplyTo replyTo = new ReplyTo(amqd.getExchangeName().toString(), amqd.getRoutingKey().toString()); - _destinationCache.put(replyTo, new SoftReference<Destination>(destination)); - _messageProps.setReplyTo(replyTo); - - } - - public Destination getJMSDestination() throws JMSException - { - return _destination; - } - - public void setJMSDestination(Destination destination) - { - _destination = destination; - } - - public void setContentType(String contentType) - { - _messageProps.setContentType(contentType); - } - - public String getContentType() - { - return _messageProps.getContentType(); - } - - public void setEncoding(String encoding) - { - if(encoding == null || encoding.length() == 0) - { - _messageProps.clearContentEncoding(); - } - else - { - _messageProps.setContentEncoding(encoding); - } - } - - public String getEncoding() - { - return _messageProps.getContentEncoding(); - } - - public String getReplyToString() - { - Destination replyTo = getJMSReplyTo(); - if(replyTo != null) - { - return ((AMQDestination)replyTo).toURL(); - } - else - { - return null; - } - - } - - public int getJMSDeliveryMode() throws JMSException - { - - MessageDeliveryMode deliveryMode = _deliveryProps.getDeliveryMode(); - if(deliveryMode != null) - { - switch(deliveryMode) - { - case PERSISTENT : - return DeliveryMode.PERSISTENT; - case NON_PERSISTENT: - return DeliveryMode.NON_PERSISTENT; - default: - throw new JMSException("Unknown Message Delivery Mode: " + _deliveryProps.getDeliveryMode()); - } - } - else - { - return Message.DEFAULT_DELIVERY_MODE; - } - - } - - public void setJMSDeliveryMode(int deliveryMode) throws JMSException - { - switch(deliveryMode) - { - case DeliveryMode.PERSISTENT: - _deliveryProps.setDeliveryMode(MessageDeliveryMode.PERSISTENT); - break; - case DeliveryMode.NON_PERSISTENT: - _deliveryProps.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT); - break; - default: - throw new JMSException("Unknown JMS Delivery Mode: " + deliveryMode); - } - - } - - - public String getJMSType() throws JMSException - { - if(getApplicationHeaders().containsKey(JMS_TYPE)) - { - return getStringProperty(JMS_TYPE); - } - else - { - return null; - } - } - - private Map<String, Object> getApplicationHeaders() - { - Map<String, Object> map = _messageProps.getApplicationHeaders(); - return map == null ? Collections.EMPTY_MAP : map; - } - - public void setJMSType(String type) throws JMSException - { - Map<String, Object> headers = _messageProps.getApplicationHeaders(); - if(type == null) - { - if(headers != null) - { - headers.remove(JMS_TYPE); - } - } - else - { - if(headers == null) - { - headers = new HashMap<String,Object>(); - _messageProps.setApplicationHeaders(headers); - - } - headers.put(JMS_TYPE, type); - } - } - - public long getJMSExpiration() throws JMSException - { - return _deliveryProps.getExpiration(); - } - - public void setJMSExpiration(long l) throws JMSException - { - _deliveryProps.setExpiration(l); - } - - - - public boolean propertyExists(String propertyName) throws JMSException - { - return getApplicationHeaders().containsKey(propertyName); - } - - public boolean getBooleanProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Object o = getApplicationHeaders().get(propertyName); - - if(o instanceof Boolean) - { - return ((Boolean)o).booleanValue(); - } - else if(o instanceof String) - { - return Boolean.valueOf((String) o).booleanValue(); - } - else if(getApplicationHeaders().containsKey(propertyName)) - { - throw new MessageFormatException("getBooleanProperty(\""+propertyName+"\") failed as value is not boolean: " + o); - } - else - { - return Boolean.valueOf(null); - } - } - - public byte getByteProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Byte) - { - return ((Byte)o).byteValue(); - } - else if(o instanceof String) - { - return Byte.valueOf((String) o).byteValue(); - } - else if(getApplicationHeaders().containsKey(propertyName)) - { - throw new MessageFormatException("getByteProperty(\""+propertyName+"\") failed as value is not a byte: " + o); - } - else - { - return Byte.valueOf(null); - } - } - - public short getShortProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Short) - { - return ((Short)o).shortValue(); - } - else - { - try - { - return Short.valueOf(getByteProperty(propertyName)); - } - catch(MessageFormatException e) - { - throw new MessageFormatException("getShortProperty(\""+propertyName+"\") failed as value is not a short: " + o); - } - } - - - } - - public int getIntProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Integer) - { - return ((Integer)o).intValue(); - } - else - { - try - { - return Integer.valueOf(getShortProperty(propertyName)); - } - catch(MessageFormatException e) - { - throw new MessageFormatException("getIntProperty(\""+propertyName+"\") failed as value is not an int: " + o); - } - - } - } - - public long getLongProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Long) - { - return ((Long)o).longValue(); - } - else - { - try - { - return Long.valueOf(getIntProperty(propertyName)); - } - catch(MessageFormatException e) - { - throw new MessageFormatException("getLongProperty(\""+propertyName+"\") failed as value is not a long: " + o); - } - - } - } - - public float getFloatProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Float) - { - return ((Float)o).floatValue(); - } - else if(o instanceof String) - { - return Float.valueOf((String) o).floatValue(); - } - else if(getApplicationHeaders().containsKey(propertyName)) - { - throw new MessageFormatException("getFloatProperty(\""+propertyName+"\") failed as value is not a float: " + o); - } - else - { - throw new NullPointerException("No such property: " + propertyName); - } - - } - - public double getDoubleProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof Double) - { - return ((Double)o).doubleValue(); - } - else if (o instanceof String) - { - return Double.valueOf((String)o); - } - else - { - try - { - return Double.valueOf(getFloatProperty(propertyName)); - } - catch(MessageFormatException e) - { - throw new MessageFormatException("getDoubleProperty(\""+propertyName+"\") failed as value is not a double: " + o); - } - - } - } - - public String getStringProperty(String propertyName) throws JMSException - { - if (propertyName.equals(CustomJMSXProperty.JMSXUserID.toString())) - { - return new String(_messageProps.getUserId()); - } - else - { - checkPropertyName(propertyName); - Map<String, Object> propertyMap = getApplicationHeaders(); - - Object o = propertyMap.get(propertyName); - - if(o instanceof String) - { - return (String) o; - } - else if(o == null) - { - return null; - } - else if(o.getClass().isArray()) - { - throw new MessageFormatException("getString(\""+propertyName+"\") failed as value of type " + o.getClass()+ " is an array."); - } - else - { - return String.valueOf(o); - } - - } - } - - public Object getObjectProperty(String propertyName) throws JMSException - { - checkPropertyName(propertyName); - Map<String, Object> propertyMap = getApplicationHeaders(); - - return propertyMap.get(propertyName); - - } - - public Enumeration getPropertyNames() throws JMSException - { - List<String> props = new ArrayList<String>(); - Map<String, Object> propertyMap = getApplicationHeaders(); - for (String prop: getApplicationHeaders().keySet()) - { - Object value = propertyMap.get(prop); - if (value instanceof Boolean || value instanceof Number - || value instanceof String) - { - props.add(prop); - } - } - - return java.util.Collections.enumeration(props); - } - - public void setBooleanProperty(String propertyName, boolean b) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, b); - } - - public void setByteProperty(String propertyName, byte b) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, b); - } - - public void setShortProperty(String propertyName, short i) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, i); - } - - public void setIntProperty(String propertyName, int i) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, i); - } - - public void setLongProperty(String propertyName, long l) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, l); - } - - public void setFloatProperty(String propertyName, float f) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, f); - } - - public void setDoubleProperty(String propertyName, double v) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, v); - } - - public void setStringProperty(String propertyName, String value) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - setApplicationHeader(propertyName, value); - } - - private static final Set<Class> ALLOWED = new HashSet(); - static - { - ALLOWED.add(Boolean.class); - ALLOWED.add(Byte.class); - ALLOWED.add(Short.class); - ALLOWED.add(Integer.class); - ALLOWED.add(Long.class); - ALLOWED.add(Float.class); - ALLOWED.add(Double.class); - ALLOWED.add(Character.class); - ALLOWED.add(String.class); - ALLOWED.add(byte[].class); - } - - public void setObjectProperty(String propertyName, Object object) throws JMSException - { - checkPropertyName(propertyName); - checkWritableProperties(); - if (object == null) - { - throw new MessageFormatException(AMQPInvalidClassException.INVALID_OBJECT_MSG + "null"); - } - else if (!ALLOWED.contains(object.getClass())) - { - throw new MessageFormatException(AMQPInvalidClassException.INVALID_OBJECT_MSG + object.getClass()); - } - setApplicationHeader(propertyName, object); - } - - private void setApplicationHeader(String propertyName, Object object) - { - Map<String, Object> headers = _messageProps.getApplicationHeaders(); - if(headers == null) - { - headers = new HashMap<String,Object>(); - _messageProps.setApplicationHeaders(headers); - } - headers.put(propertyName, object); - } - - public void removeProperty(String propertyName) throws JMSException - { - Map<String, Object> headers = _messageProps.getApplicationHeaders(); - if(headers != null) - { - headers.remove(propertyName); - } - } - - - - protected void checkWritableProperties() throws MessageNotWriteableException - { - if (_readableProperties) - { - throw new MessageNotWriteableException("You need to call clearProperties() to make the message writable"); - } - } - - - public int getJMSPriority() throws JMSException - { - MessageDeliveryPriority messageDeliveryPriority = _deliveryProps.getPriority(); - return messageDeliveryPriority == null ? Message.DEFAULT_PRIORITY : messageDeliveryPriority.getValue(); - } - - public void setJMSPriority(int i) throws JMSException - { - _deliveryProps.setPriority(MessageDeliveryPriority.get((short)i)); - } - - public void clearProperties() throws JMSException - { - if(!getApplicationHeaders().isEmpty()) - { - getApplicationHeaders().clear(); - } - - _readableProperties = false; - } - - - public void acknowledgeThis() throws JMSException - { - // the JMS 1.1 spec says in section 3.6 that calls to acknowledge are ignored when client acknowledge - // is not specified. In our case, we only set the session field where client acknowledge mode is specified. - if (_session != null && _session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) - { - if (_session.getAMQConnection().isClosed()) - { - throw new javax.jms.IllegalStateException("Connection is already closed"); - } - - // we set multiple to true here since acknowledgment implies acknowledge of all previous messages - // received on the session - _session.acknowledgeMessage(_deliveryTag, true); - } - } - - public void acknowledge() throws JMSException - { - if (_session != null && _session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) - { - _session.acknowledge(); - } - } - - - /** - * The session is set when CLIENT_ACKNOWLEDGE mode is used so that the CHANNEL ACK can be sent when the user calls - * acknowledge() - * - * @param s the AMQ session that delivered this message - */ - public void setAMQSession(AMQSession s) - { - _session = s; - } - - public AMQSession getAMQSession() - { - return _session; - } - - /** - * Get the AMQ message number assigned to this message - * - * @return the message number - */ - public long getDeliveryTag() - { - return _deliveryTag; - } - - - - - - - protected void checkPropertyName(CharSequence propertyName) - { - if (propertyName == null) - { - throw new IllegalArgumentException("Property name must not be null"); - } - else if (propertyName.length() == 0) - { - throw new IllegalArgumentException("Property name must not be the empty string"); - } - - checkIdentiferFormat(propertyName); - } - - protected void checkIdentiferFormat(CharSequence propertyName) - { -// JMS requirements 3.5.1 Property Names -// Identifiers: -// - An identifier is an unlimited-length character sequence that must begin -// with a Java identifier start character; all following characters must be Java -// identifier part characters. An identifier start character is any character for -// which the method Character.isJavaIdentifierStart returns true. This includes -// '_' and '$'. An identifier part character is any character for which the -// method Character.isJavaIdentifierPart returns true. -// - Identifiers cannot be the names NULL, TRUE, or FALSE. -// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or -// ESCAPE. -// Identifiers are either header field references or property references. The -// type of a property value in a message selector corresponds to the type -// used to set the property. If a property that does not exist in a message is -// referenced, its value is NULL. The semantics of evaluating NULL values -// in a selector are described in Section 3.8.1.2, Null Values. -// The conversions that apply to the get methods for properties do not -// apply when a property is used in a message selector expression. For -// example, suppose you set a property as a string value, as in the -// following: -// myMessage.setStringProperty("NumberOfOrders", "2"); -// The following expression in a message selector would evaluate to false, -// because a string cannot be used in an arithmetic expression: -// "NumberOfOrders > 1" -// Identifiers are case sensitive. -// Message header field references are restricted to JMSDeliveryMode, -// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and -// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be -// null and if so are treated as a NULL value. - - if (Boolean.getBoolean("strict-jms")) - { - // JMS start character - if (!(Character.isJavaIdentifierStart(propertyName.charAt(0)))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character"); - } - - // JMS part character - int length = propertyName.length(); - for (int c = 1; c < length; c++) - { - if (!(Character.isJavaIdentifierPart(propertyName.charAt(c)))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character"); - } - } - - // JMS invalid names - if ((propertyName.equals("NULL") - || propertyName.equals("TRUE") - || propertyName.equals("FALSE") - || propertyName.equals("NOT") - || propertyName.equals("AND") - || propertyName.equals("OR") - || propertyName.equals("BETWEEN") - || propertyName.equals("LIKE") - || propertyName.equals("IN") - || propertyName.equals("IS") - || propertyName.equals("ESCAPE"))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS"); - } - } - - } - - - public MessageProperties getMessageProperties() - { - return _messageProps; - } - - - public DeliveryProperties getDeliveryProperties() - { - return _deliveryProps; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_8.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_8.java deleted file mode 100644 index cec4268a7b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQMessageDelegate_0_8.java +++ /dev/null @@ -1,576 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.net.URISyntaxException; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Map; -import java.util.UUID; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageNotWriteableException; -import javax.jms.Session; - -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.client.CustomJMSXProperty; -import org.apache.qpid.client.JMSAMQException; -import org.apache.qpid.collections.ReferenceMap; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.framing.ContentHeaderProperties; -import org.apache.qpid.url.AMQBindingURL; -import org.apache.qpid.url.BindingURL; - -public class AMQMessageDelegate_0_8 extends AbstractAMQMessageDelegate -{ - private static final Map _destinationCache = Collections.synchronizedMap(new ReferenceMap()); - - public static final String JMS_TYPE = "x-jms-type"; - - - private boolean _readableProperties = false; - - private Destination _destination; - private JMSHeaderAdapter _headerAdapter; - private static final boolean STRICT_AMQP_COMPLIANCE = - Boolean.parseBoolean(System.getProperties().getProperty(AMQSession.STRICT_AMQP, AMQSession.STRICT_AMQP_DEFAULT)); - - private ContentHeaderProperties _contentHeaderProperties; - /** If the acknowledge mode is CLIENT_ACKNOWLEDGE the session is required */ - private AMQSession _session; - private final long _deliveryTag; - - // The base set of items that needs to be set. - private AMQMessageDelegate_0_8(BasicContentHeaderProperties properties, long deliveryTag) - { - _contentHeaderProperties = properties; - _deliveryTag = deliveryTag; - _readableProperties = (_contentHeaderProperties != null); - _headerAdapter = new JMSHeaderAdapter(_readableProperties ? ((BasicContentHeaderProperties) _contentHeaderProperties).getHeaders() - : (new BasicContentHeaderProperties()).getHeaders() ); - } - - // Used for the creation of new messages - protected AMQMessageDelegate_0_8() - { - this(new BasicContentHeaderProperties(), -1); - _readableProperties = false; - _headerAdapter = new JMSHeaderAdapter(((BasicContentHeaderProperties) _contentHeaderProperties).getHeaders()); - - } - - // Used when generating a received message object - protected AMQMessageDelegate_0_8(long deliveryTag, BasicContentHeaderProperties contentHeader, AMQShortString exchange, - AMQShortString routingKey) - { - this(contentHeader, deliveryTag); - - Integer type = contentHeader.getHeaders().getInteger(CustomJMSXProperty.JMS_QPID_DESTTYPE.getShortStringName()); - - AMQDestination dest = null; - - // If we have a type set the attempt to use that. - if (type != null) - { - switch (type.intValue()) - { - case AMQDestination.QUEUE_TYPE: - dest = new AMQQueue(exchange, routingKey, routingKey); - break; - case AMQDestination.TOPIC_TYPE: - dest = new AMQTopic(exchange, routingKey, null); - break; - default: - // Use the generateDestination method - dest = null; - } - } - - if (dest == null) - { - dest = generateDestination(exchange, routingKey); - } - - setJMSDestination(dest); - } - - - - public String getJMSMessageID() throws JMSException - { - return getContentHeaderProperties().getMessageIdAsString(); - } - - public void setJMSMessageID(String messageId) throws JMSException - { - if (messageId != null) - { - getContentHeaderProperties().setMessageId(messageId); - } - } - - public void setJMSMessageID(UUID messageId) throws JMSException - { - if (messageId != null) - { - getContentHeaderProperties().setMessageId("ID:" + messageId); - } - } - - - public long getJMSTimestamp() throws JMSException - { - return getContentHeaderProperties().getTimestamp(); - } - - public void setJMSTimestamp(long timestamp) throws JMSException - { - getContentHeaderProperties().setTimestamp(timestamp); - } - - public byte[] getJMSCorrelationIDAsBytes() throws JMSException - { - return getContentHeaderProperties().getCorrelationIdAsString().getBytes(); - } - - public void setJMSCorrelationIDAsBytes(byte[] bytes) throws JMSException - { - getContentHeaderProperties().setCorrelationId(new String(bytes)); - } - - public void setJMSCorrelationID(String correlationId) throws JMSException - { - getContentHeaderProperties().setCorrelationId(correlationId); - } - - public String getJMSCorrelationID() throws JMSException - { - return getContentHeaderProperties().getCorrelationIdAsString(); - } - - public Destination getJMSReplyTo() throws JMSException - { - String replyToEncoding = getContentHeaderProperties().getReplyToAsString(); - if (replyToEncoding == null) - { - return null; - } - else - { - Destination dest = (Destination) _destinationCache.get(replyToEncoding); - if (dest == null) - { - try - { - BindingURL binding = new AMQBindingURL(replyToEncoding); - dest = AMQDestination.createDestination(binding); - } - catch (URISyntaxException e) - { - throw new JMSAMQException("Illegal value in JMS_ReplyTo property: " + replyToEncoding, e); - } - - _destinationCache.put(replyToEncoding, dest); - } - - return dest; - } - } - - public void setJMSReplyTo(Destination destination) throws JMSException - { - if (destination == null) - { - getContentHeaderProperties().setReplyTo((String) null); - return; // We're done here - } - - if (!(destination instanceof AMQDestination)) - { - throw new IllegalArgumentException( - "ReplyTo destination may only be an AMQDestination - passed argument was type " + destination.getClass()); - } - - final AMQDestination amqd = (AMQDestination) destination; - - final AMQShortString encodedDestination = amqd.getEncodedName(); - _destinationCache.put(encodedDestination, destination); - getContentHeaderProperties().setReplyTo(encodedDestination); - } - - public Destination getJMSDestination() throws JMSException - { - return _destination; - } - - public void setJMSDestination(Destination destination) - { - _destination = destination; - } - - public void setContentType(String contentType) - { - getContentHeaderProperties().setContentType(contentType); - } - - public String getContentType() - { - return getContentHeaderProperties().getContentTypeAsString(); - } - - public void setEncoding(String encoding) - { - getContentHeaderProperties().setEncoding(encoding); - } - - public String getEncoding() - { - return getContentHeaderProperties().getEncodingAsString(); - } - - public String getReplyToString() - { - return getContentHeaderProperties().getReplyToAsString(); - } - - public int getJMSDeliveryMode() throws JMSException - { - return getContentHeaderProperties().getDeliveryMode(); - } - - public void setJMSDeliveryMode(int i) throws JMSException - { - getContentHeaderProperties().setDeliveryMode((byte) i); - } - - public BasicContentHeaderProperties getContentHeaderProperties() - { - return (BasicContentHeaderProperties) _contentHeaderProperties; - } - - - public String getJMSType() throws JMSException - { - return getContentHeaderProperties().getTypeAsString(); - } - - public void setJMSType(String string) throws JMSException - { - getContentHeaderProperties().setType(string); - } - - public long getJMSExpiration() throws JMSException - { - return getContentHeaderProperties().getExpiration(); - } - - public void setJMSExpiration(long l) throws JMSException - { - getContentHeaderProperties().setExpiration(l); - } - - - - public boolean propertyExists(String propertyName) throws JMSException - { - return getJmsHeaders().propertyExists(propertyName); - } - - public boolean getBooleanProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getBoolean(propertyName); - } - - public byte getByteProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getByte(propertyName); - } - - public short getShortProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getShort(propertyName); - } - - public int getIntProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getInteger(propertyName); - } - - public long getLongProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getLong(propertyName); - } - - public float getFloatProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getFloat(propertyName); - } - - public double getDoubleProperty(String propertyName) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getDouble(propertyName); - } - - public String getStringProperty(String propertyName) throws JMSException - { - //NOTE: if the JMSX Property is a non AMQP property then we must check _strictAMQP and throw as below. - if (propertyName.equals(CustomJMSXProperty.JMSXUserID.toString())) - { - return ((BasicContentHeaderProperties) _contentHeaderProperties).getUserIdAsString(); - } - else - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - return getJmsHeaders().getString(propertyName); - } - } - - public Object getObjectProperty(String propertyName) throws JMSException - { - return getJmsHeaders().getObject(propertyName); - } - - public Enumeration getPropertyNames() throws JMSException - { - return getJmsHeaders().getPropertyNames(); - } - - public void setBooleanProperty(String propertyName, boolean b) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setBoolean(propertyName, b); - } - - public void setByteProperty(String propertyName, byte b) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setByte(propertyName, new Byte(b)); - } - - public void setShortProperty(String propertyName, short i) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setShort(propertyName, new Short(i)); - } - - public void setIntProperty(String propertyName, int i) throws JMSException - { - checkWritableProperties(); - getJmsHeaders().setInteger(propertyName, new Integer(i)); - } - - public void setLongProperty(String propertyName, long l) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setLong(propertyName, new Long(l)); - } - - public void setFloatProperty(String propertyName, float f) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setFloat(propertyName, new Float(f)); - } - - public void setDoubleProperty(String propertyName, double v) throws JMSException - { - if (STRICT_AMQP_COMPLIANCE) - { - throw new UnsupportedOperationException("JMS Proprerties not supported in AMQP"); - } - - checkWritableProperties(); - getJmsHeaders().setDouble(propertyName, new Double(v)); - } - - public void setStringProperty(String propertyName, String value) throws JMSException - { - checkWritableProperties(); - getJmsHeaders().setString(propertyName, value); - } - - public void setObjectProperty(String propertyName, Object object) throws JMSException - { - checkWritableProperties(); - getJmsHeaders().setObject(propertyName, object); - } - - public void removeProperty(String propertyName) throws JMSException - { - getJmsHeaders().remove(propertyName); - } - - - private JMSHeaderAdapter getJmsHeaders() - { - return _headerAdapter; - } - - protected void checkWritableProperties() throws MessageNotWriteableException - { - if (_readableProperties) - { - throw new MessageNotWriteableException("You need to call clearProperties() to make the message writable"); - } - _contentHeaderProperties.updated(); - } - - - public int getJMSPriority() throws JMSException - { - return getContentHeaderProperties().getPriority(); - } - - public void setJMSPriority(int i) throws JMSException - { - getContentHeaderProperties().setPriority((byte) i); - } - - public void clearProperties() throws JMSException - { - getJmsHeaders().clear(); - - _readableProperties = false; - } - - - public void acknowledgeThis() throws JMSException - { - // the JMS 1.1 spec says in section 3.6 that calls to acknowledge are ignored when client acknowledge - // is not specified. In our case, we only set the session field where client acknowledge mode is specified. - if (_session != null && _session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) - { - if (_session.getAMQConnection().isClosed()) - { - throw new javax.jms.IllegalStateException("Connection is already closed"); - } - - // we set multiple to true here since acknowledgement implies acknowledge of all previous messages - // received on the session - _session.acknowledgeMessage(_deliveryTag, true); - } - } - - public void acknowledge() throws JMSException - { - if (_session != null && _session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) - { - _session.acknowledge(); - } - } - - - /** - * The session is set when CLIENT_ACKNOWLEDGE mode is used so that the CHANNEL ACK can be sent when the user calls - * acknowledge() - * - * @param s the AMQ session that delivered this message - */ - public void setAMQSession(AMQSession s) - { - _session = s; - } - - public AMQSession getAMQSession() - { - return _session; - } - - /** - * Get the AMQ message number assigned to this message - * - * @return the message number - */ - public long getDeliveryTag() - { - return _deliveryTag; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessage.java deleted file mode 100644 index 58f108f1a4..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessage.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.apache.qpid.client.message; -/* - * - * 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. - * - */ - - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.jms.JMSException; -import javax.jms.MessageFormatException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.transport.codec.BBDecoder; -import org.apache.qpid.transport.codec.BBEncoder; - -public class AMQPEncodedMapMessage extends JMSMapMessage -{ - public static final String MIME_TYPE = "amqp/map"; - - public AMQPEncodedMapMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - this(delegateFactory, null); - } - - AMQPEncodedMapMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) throws JMSException - { - super(delegateFactory, data); - } - - AMQPEncodedMapMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - super(delegate, data); - } - - @ Override - protected String getMimeType() - { - return MIME_TYPE; - } - - @ Override - public void setObject(String propName, Object value) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - if ((value instanceof Boolean) || (value instanceof Byte) || (value instanceof Short) || (value instanceof Integer) - || (value instanceof Long) || (value instanceof Character) || (value instanceof Float) - || (value instanceof Double) || (value instanceof String) || (value instanceof byte[]) - || (value instanceof List) || (value instanceof Map) || (value instanceof UUID) || (value == null)) - { - _map.put(propName, value); - } - else - { - throw new MessageFormatException("Cannot set property " + propName + " to value " + value + "of type " - + value.getClass().getName() + "."); - } - } - - // The super clas methods resets the buffer - @ Override - public ByteBuffer getData() - { - writeMapToData(); - return _data; - } - - @ Override - protected void populateMapFromData() throws JMSException - { - if (_data != null) - { - _data.rewind(); - BBDecoder decoder = new BBDecoder(); - decoder.init(_data.buf()); - _map = decoder.readMap(); - } - else - { - _map.clear(); - } - } - - @ Override - protected void writeMapToData() - { - BBEncoder encoder = new BBEncoder(1024); - encoder.writeMap(_map); - _data = ByteBuffer.wrap(encoder.segment()); - } - - // for testing - Map<String,Object> getMap() - { - return _map; - } - - void setMap(Map<String,Object> map) - { - _map = map; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessageFactory.java deleted file mode 100644 index 4978d1ce85..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AMQPEncodedMapMessageFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.apache.qpid.client.message; -/* - * - * 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. - * - */ - - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; - -public class AMQPEncodedMapMessageFactory extends AbstractJMSMessageFactory -{ - - @Override - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, - ByteBuffer data) throws AMQException - { - return new AMQPEncodedMapMessage(delegate,data); - } - - @Override - public AbstractJMSMessage createMessage( - AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new AMQPEncodedMapMessage(delegateFactory); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractAMQMessageDelegate.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractAMQMessageDelegate.java deleted file mode 100644 index 89fbc9722c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractAMQMessageDelegate.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.qpid.client.AMQAnyDestination; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; - -/** - * This abstract class provides exchange lookup functionality that is shared - * between all MessageDelegates. Update facilities are provided so that the 0-10 - * code base can update the mappings. The 0-8 code base does not have the - * facility to update the exchange map so it can only use the default mappings. - * - * That said any updates that a 0-10 client performs will also benefit any 0-8 - * connections in this VM. - * - */ -public abstract class AbstractAMQMessageDelegate implements AMQMessageDelegate -{ - - private static Map<String, Integer> _exchangeTypeToDestinationType = new ConcurrentHashMap<String, Integer>(); - private static Map<String,ExchangeInfo> _exchangeMap = new ConcurrentHashMap<String, ExchangeInfo>(); - - /** - * Add default Mappings for the Direct, Default, Topic and Fanout exchanges. - */ - static - { - _exchangeTypeToDestinationType.put("", AMQDestination.QUEUE_TYPE); - _exchangeTypeToDestinationType.put(ExchangeDefaults.DIRECT_EXCHANGE_CLASS.toString(), AMQDestination.QUEUE_TYPE); - _exchangeTypeToDestinationType.put(ExchangeDefaults.TOPIC_EXCHANGE_CLASS.toString(), AMQDestination.TOPIC_TYPE); - _exchangeTypeToDestinationType.put(ExchangeDefaults.FANOUT_EXCHANGE_CLASS.toString(), AMQDestination.TOPIC_TYPE); - _exchangeTypeToDestinationType.put(ExchangeDefaults.HEADERS_EXCHANGE_CLASS.toString(), AMQDestination.QUEUE_TYPE); - - _exchangeMap.put("", new ExchangeInfo("","",AMQDestination.QUEUE_TYPE)); - - _exchangeMap.put(ExchangeDefaults.DIRECT_EXCHANGE_NAME.toString(), - new ExchangeInfo(ExchangeDefaults.DIRECT_EXCHANGE_NAME.toString(), - ExchangeDefaults.DIRECT_EXCHANGE_CLASS.toString(), - AMQDestination.QUEUE_TYPE)); - - _exchangeMap.put(ExchangeDefaults.TOPIC_EXCHANGE_NAME.toString(), - new ExchangeInfo(ExchangeDefaults.TOPIC_EXCHANGE_NAME.toString(), - ExchangeDefaults.TOPIC_EXCHANGE_CLASS.toString(), - AMQDestination.TOPIC_TYPE)); - - _exchangeMap.put(ExchangeDefaults.FANOUT_EXCHANGE_NAME.toString(), - new ExchangeInfo(ExchangeDefaults.FANOUT_EXCHANGE_NAME.toString(), - ExchangeDefaults.FANOUT_EXCHANGE_CLASS.toString(), - AMQDestination.TOPIC_TYPE)); - - _exchangeMap.put(ExchangeDefaults.HEADERS_EXCHANGE_NAME.toString(), - new ExchangeInfo(ExchangeDefaults.HEADERS_EXCHANGE_NAME.toString(), - ExchangeDefaults.HEADERS_EXCHANGE_CLASS.toString(), - AMQDestination.QUEUE_TYPE)); - - } - - /** - * Called when a Destination is requried. - * - * This will create the AMQDestination that is the correct type and value - * based on the incomming values. - * @param exchange The exchange name - * @param routingKey The routing key to be used for the Destination - * @return AMQDestination of the correct subtype - */ - protected AMQDestination generateDestination(AMQShortString exchange, AMQShortString routingKey) - { - AMQDestination dest; - ExchangeInfo exchangeInfo = _exchangeMap.get(exchange.asString()); - - if (exchangeInfo == null) - { - exchangeInfo = new ExchangeInfo(exchange.asString(),"",AMQDestination.UNKNOWN_TYPE); - } - - if ("topic".equals(exchangeInfo.exchangeType)) - { - dest = new AMQTopic(exchange, routingKey, null); - } - else if ("direct".equals(exchangeInfo.exchangeType)) - { - dest = new AMQQueue(exchange, routingKey, routingKey); - } - else - { - dest = new AMQAnyDestination(exchange, - new AMQShortString(exchangeInfo.exchangeType), - routingKey, - false, - false, - routingKey, - false, - new AMQShortString[] {routingKey}); - } - - return dest; - } - - /** - * Update the exchange name to type mapping. - * - * If the newType is not known then an UNKNOWN_TYPE is created. Only if the - * exchange is of a known type: amq.direct, amq.topic, amq.fanout can we - * create a suitable AMQDestination representation - * - * @param exchange the name of the exchange - * @param newtype the AMQP exchange class name i.e. direct - */ - protected static void updateExchangeType(String exchange, String newtype) - { - Integer type = _exchangeTypeToDestinationType.get(newtype); - if (type == null) - { - type = AMQDestination.UNKNOWN_TYPE; - } - - _exchangeMap.put(exchange, new ExchangeInfo(exchange,newtype,type)); - } - - /** - * Accessor method to allow lookups of the given exchange name. - * - * This check allows the prevention of extra work required such as asking - * the broker for the exchange class name. - * - * @param exchange the exchange name to lookup - * @return true if there is a mapping for this exchange - */ - protected static boolean exchangeMapContains(String exchange) - { - return _exchangeMap.containsKey(exchange); - } -} - -class ExchangeInfo -{ - String exchangeName; - String exchangeType; - int destType = AMQDestination.QUEUE_TYPE; - - public ExchangeInfo(String exchangeName, String exchangeType, - int destType) - { - super(); - this.exchangeName = exchangeName; - this.exchangeType = exchangeType; - this.destType = destType; - } - - public String getExchangeName() - { - return exchangeName; - } - - public void setExchangeName(String exchangeName) - { - this.exchangeName = exchangeName; - } - - public String getExchangeType() - { - return exchangeType; - } - - public void setExchangeType(String exchangeType) - { - this.exchangeType = exchangeType; - } - - public int getDestType() - { - return destType; - } - - public void setDestType(int destType) - { - this.destType = destType; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesMessage.java deleted file mode 100644 index 3846ee043d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesMessage.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.io.IOException; -import java.nio.charset.Charset; - -import javax.jms.JMSException; -import javax.jms.MessageEOFException; - -import org.apache.mina.common.ByteBuffer; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.transport.util.Functions; - -/** - * @author Apache Software Foundation - */ -public abstract class AbstractBytesMessage extends AbstractJMSMessage -{ - - /** - * The default initial size of the buffer. The buffer expands automatically. - */ - private static final int DEFAULT_BUFFER_INITIAL_SIZE = 1024; - - AbstractBytesMessage(AMQMessageDelegateFactory delegateFactory) - { - this(delegateFactory, null); - } - - /** - * Construct a bytes message with existing data. - * - * @param delegateFactory - * @param data the data that comprises this message. If data is null, you get a 1024 byte buffer that is - */ - AbstractBytesMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - super(delegateFactory, data); // this instanties a content header - setContentType(getMimeType()); - - if (_data == null) - { - allocateInitialBuffer(); - } - } - - protected void allocateInitialBuffer() - { - _data = ByteBuffer.allocate(DEFAULT_BUFFER_INITIAL_SIZE); - _data.setAutoExpand(true); - } - - AbstractBytesMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - super(delegate, data); - setContentType(getMimeType()); - } - - - public void clearBodyImpl() throws JMSException - { - allocateInitialBuffer(); - } - - public String toBodyString() throws JMSException - { - try - { - if (_data != null) - { - return Functions.str(_data.buf(), 100,0); - } - else - { - return ""; - } - - } - catch (Exception e) - { - JMSException jmse = new JMSException(e.toString()); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - - } - - /** - * Check that there is at least a certain number of bytes available to read - * - * @param len the number of bytes - * @throws javax.jms.MessageEOFException if there are less than len bytes available to read - */ - protected void checkAvailable(int len) throws MessageEOFException - { - if (_data.remaining() < len) - { - throw new MessageEOFException("Unable to read " + len + " bytes"); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesTypedMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesTypedMessage.java deleted file mode 100644 index 85818dcd2b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesTypedMessage.java +++ /dev/null @@ -1,804 +0,0 @@ -/* - * 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.qpid.client.message; - -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; - -import javax.jms.JMSException; -import javax.jms.MessageEOFException; -import javax.jms.MessageFormatException; -import javax.jms.MessageNotReadableException; -import javax.jms.MessageNotWriteableException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -/** - * @author Apache Software Foundation - */ -public abstract class AbstractBytesTypedMessage extends AbstractBytesMessage -{ - - protected static final byte BOOLEAN_TYPE = (byte) 1; - - protected static final byte BYTE_TYPE = (byte) 2; - - protected static final byte BYTEARRAY_TYPE = (byte) 3; - - protected static final byte SHORT_TYPE = (byte) 4; - - protected static final byte CHAR_TYPE = (byte) 5; - - protected static final byte INT_TYPE = (byte) 6; - - protected static final byte LONG_TYPE = (byte) 7; - - protected static final byte FLOAT_TYPE = (byte) 8; - - protected static final byte DOUBLE_TYPE = (byte) 9; - - protected static final byte STRING_TYPE = (byte) 10; - - protected static final byte NULL_STRING_TYPE = (byte) 11; - - /** - * This is set when reading a byte array. The readBytes(byte[]) method supports multiple calls to read - * a byte array in multiple chunks, hence this is used to track how much is left to be read - */ - private int _byteArrayRemaining = -1; - - AbstractBytesTypedMessage(AMQMessageDelegateFactory delegateFactory) - { - - this(delegateFactory, null); - } - - /** - * Construct a stream message with existing data. - * - * @param delegateFactory - * @param data the data that comprises this message. If data is null, you get a 1024 byte buffer that is - */ - AbstractBytesTypedMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - - super(delegateFactory, data); // this instanties a content header - } - - AbstractBytesTypedMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - - super(delegate, data); - } - - - protected byte readWireType() throws MessageFormatException, MessageEOFException, - MessageNotReadableException - { - checkReadable(); - checkAvailable(1); - return _data.get(); - } - - protected void writeTypeDiscriminator(byte type) throws MessageNotWriteableException - { - checkWritable(); - _data.put(type); - _changedData = true; - } - - protected boolean readBoolean() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - boolean result; - try - { - switch (wireType) - { - case BOOLEAN_TYPE: - checkAvailable(1); - result = readBooleanImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Boolean.parseBoolean(readStringImpl()); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a boolean"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - private boolean readBooleanImpl() - { - return _data.get() != 0; - } - - protected byte readByte() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - byte result; - try - { - switch (wireType) - { - case BYTE_TYPE: - checkAvailable(1); - result = readByteImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Byte.parseByte(readStringImpl()); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a byte"); - } - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - return result; - } - - private byte readByteImpl() - { - return _data.get(); - } - - protected short readShort() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - short result; - try - { - switch (wireType) - { - case SHORT_TYPE: - checkAvailable(2); - result = readShortImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Short.parseShort(readStringImpl()); - break; - case BYTE_TYPE: - checkAvailable(1); - result = readByteImpl(); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a short"); - } - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - return result; - } - - private short readShortImpl() - { - return _data.getShort(); - } - - /** - * Note that this method reads a unicode character as two bytes from the stream - * - * @return the character read from the stream - * @throws javax.jms.JMSException - */ - protected char readChar() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - try - { - if(wireType == NULL_STRING_TYPE){ - throw new NullPointerException(); - } - - if (wireType != CHAR_TYPE) - { - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a char"); - } - else - { - checkAvailable(2); - return readCharImpl(); - } - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - private char readCharImpl() - { - return _data.getChar(); - } - - protected int readInt() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - int result; - try - { - switch (wireType) - { - case INT_TYPE: - checkAvailable(4); - result = readIntImpl(); - break; - case SHORT_TYPE: - checkAvailable(2); - result = readShortImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Integer.parseInt(readStringImpl()); - break; - case BYTE_TYPE: - checkAvailable(1); - result = readByteImpl(); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to an int"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - protected int readIntImpl() - { - return _data.getInt(); - } - - protected long readLong() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - long result; - try - { - switch (wireType) - { - case LONG_TYPE: - checkAvailable(8); - result = readLongImpl(); - break; - case INT_TYPE: - checkAvailable(4); - result = readIntImpl(); - break; - case SHORT_TYPE: - checkAvailable(2); - result = readShortImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Long.parseLong(readStringImpl()); - break; - case BYTE_TYPE: - checkAvailable(1); - result = readByteImpl(); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a long"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - private long readLongImpl() - { - return _data.getLong(); - } - - protected float readFloat() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - float result; - try - { - switch (wireType) - { - case FLOAT_TYPE: - checkAvailable(4); - result = readFloatImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Float.parseFloat(readStringImpl()); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a float"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - private float readFloatImpl() - { - return _data.getFloat(); - } - - protected double readDouble() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - double result; - try - { - switch (wireType) - { - case DOUBLE_TYPE: - checkAvailable(8); - result = readDoubleImpl(); - break; - case FLOAT_TYPE: - checkAvailable(4); - result = readFloatImpl(); - break; - case STRING_TYPE: - checkAvailable(1); - result = Double.parseDouble(readStringImpl()); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a double"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - private double readDoubleImpl() - { - return _data.getDouble(); - } - - protected String readString() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - String result; - try - { - switch (wireType) - { - case STRING_TYPE: - checkAvailable(1); - result = readStringImpl(); - break; - case NULL_STRING_TYPE: - result = null; - throw new NullPointerException("data is null"); - case BOOLEAN_TYPE: - checkAvailable(1); - result = String.valueOf(readBooleanImpl()); - break; - case LONG_TYPE: - checkAvailable(8); - result = String.valueOf(readLongImpl()); - break; - case INT_TYPE: - checkAvailable(4); - result = String.valueOf(readIntImpl()); - break; - case SHORT_TYPE: - checkAvailable(2); - result = String.valueOf(readShortImpl()); - break; - case BYTE_TYPE: - checkAvailable(1); - result = String.valueOf(readByteImpl()); - break; - case FLOAT_TYPE: - checkAvailable(4); - result = String.valueOf(readFloatImpl()); - break; - case DOUBLE_TYPE: - checkAvailable(8); - result = String.valueOf(readDoubleImpl()); - break; - case CHAR_TYPE: - checkAvailable(2); - result = String.valueOf(readCharImpl()); - break; - default: - _data.position(position); - throw new MessageFormatException("Unable to convert " + wireType + " to a String"); - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - protected String readStringImpl() throws JMSException - { - try - { - return _data.getString(Charset.forName("UTF-8").newDecoder()); - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Error decoding byte stream as a UTF8 string: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - protected int readBytes(byte[] bytes) throws JMSException - { - if (bytes == null) - { - throw new IllegalArgumentException("byte array must not be null"); - } - checkReadable(); - // first call - if (_byteArrayRemaining == -1) - { - // type discriminator checked separately so you get a MessageFormatException rather than - // an EOF even in the case where both would be applicable - checkAvailable(1); - byte wireType = readWireType(); - if (wireType != BYTEARRAY_TYPE) - { - throw new MessageFormatException("Unable to convert " + wireType + " to a byte array"); - } - checkAvailable(4); - int size = _data.getInt(); - // length of -1 indicates null - if (size == -1) - { - return -1; - } - else - { - if (size > _data.remaining()) - { - throw new MessageEOFException("Byte array has stated length " + size + " but message only contains " + - _data.remaining() + " bytes"); - } - else - { - _byteArrayRemaining = size; - } - } - } - else if (_byteArrayRemaining == 0) - { - _byteArrayRemaining = -1; - return -1; - } - - int returnedSize = readBytesImpl(bytes); - if (returnedSize < bytes.length) - { - _byteArrayRemaining = -1; - } - return returnedSize; - } - - private int readBytesImpl(byte[] bytes) - { - int count = (_byteArrayRemaining >= bytes.length ? bytes.length : _byteArrayRemaining); - _byteArrayRemaining -= count; - - if (count == 0) - { - return 0; - } - else - { - _data.get(bytes, 0, count); - return count; - } - } - - protected Object readObject() throws JMSException - { - int position = _data.position(); - byte wireType = readWireType(); - Object result = null; - try - { - switch (wireType) - { - case BOOLEAN_TYPE: - checkAvailable(1); - result = readBooleanImpl(); - break; - case BYTE_TYPE: - checkAvailable(1); - result = readByteImpl(); - break; - case BYTEARRAY_TYPE: - checkAvailable(4); - int size = _data.getInt(); - if (size == -1) - { - result = null; - } - else - { - _byteArrayRemaining = size; - byte[] bytesResult = new byte[size]; - readBytesImpl(bytesResult); - result = bytesResult; - } - break; - case SHORT_TYPE: - checkAvailable(2); - result = readShortImpl(); - break; - case CHAR_TYPE: - checkAvailable(2); - result = readCharImpl(); - break; - case INT_TYPE: - checkAvailable(4); - result = readIntImpl(); - break; - case LONG_TYPE: - checkAvailable(8); - result = readLongImpl(); - break; - case FLOAT_TYPE: - checkAvailable(4); - result = readFloatImpl(); - break; - case DOUBLE_TYPE: - checkAvailable(8); - result = readDoubleImpl(); - break; - case NULL_STRING_TYPE: - result = null; - break; - case STRING_TYPE: - checkAvailable(1); - result = readStringImpl(); - break; - } - return result; - } - catch (RuntimeException e) - { - _data.position(position); - throw e; - } - } - - protected void writeBoolean(boolean b) throws JMSException - { - writeTypeDiscriminator(BOOLEAN_TYPE); - _data.put(b ? (byte) 1 : (byte) 0); - } - - protected void writeByte(byte b) throws JMSException - { - writeTypeDiscriminator(BYTE_TYPE); - _data.put(b); - } - - protected void writeShort(short i) throws JMSException - { - writeTypeDiscriminator(SHORT_TYPE); - _data.putShort(i); - } - - protected void writeChar(char c) throws JMSException - { - writeTypeDiscriminator(CHAR_TYPE); - _data.putChar(c); - } - - protected void writeInt(int i) throws JMSException - { - writeTypeDiscriminator(INT_TYPE); - writeIntImpl(i); - } - - protected void writeIntImpl(int i) - { - _data.putInt(i); - } - - protected void writeLong(long l) throws JMSException - { - writeTypeDiscriminator(LONG_TYPE); - _data.putLong(l); - } - - protected void writeFloat(float v) throws JMSException - { - writeTypeDiscriminator(FLOAT_TYPE); - _data.putFloat(v); - } - - protected void writeDouble(double v) throws JMSException - { - writeTypeDiscriminator(DOUBLE_TYPE); - _data.putDouble(v); - } - - protected void writeString(String string) throws JMSException - { - if (string == null) - { - writeTypeDiscriminator(NULL_STRING_TYPE); - } - else - { - writeTypeDiscriminator(STRING_TYPE); - try - { - writeStringImpl(string); - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Unable to encode string: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - } - - protected void writeStringImpl(String string) - throws CharacterCodingException - { - _data.putString(string, Charset.forName("UTF-8").newEncoder()); - // we must write the null terminator ourselves - _data.put((byte) 0); - } - - protected void writeBytes(byte[] bytes) throws JMSException - { - writeBytes(bytes, 0, bytes == null ? 0 : bytes.length); - } - - protected void writeBytes(byte[] bytes, int offset, int length) throws JMSException - { - writeTypeDiscriminator(BYTEARRAY_TYPE); - if (bytes == null) - { - _data.putInt(-1); - } - else - { - _data.putInt(length); - _data.put(bytes, offset, length); - } - } - - protected void writeObject(Object object) throws JMSException - { - checkWritable(); - Class clazz; - - if (object == null) - { - // string handles the output of null values - clazz = String.class; - } - else - { - clazz = object.getClass(); - } - - if (clazz == Byte.class) - { - writeByte((Byte) object); - } - else if (clazz == Boolean.class) - { - writeBoolean((Boolean) object); - } - else if (clazz == byte[].class) - { - writeBytes((byte[]) object); - } - else if (clazz == Short.class) - { - writeShort((Short) object); - } - else if (clazz == Character.class) - { - writeChar((Character) object); - } - else if (clazz == Integer.class) - { - writeInt((Integer) object); - } - else if (clazz == Long.class) - { - writeLong((Long) object); - } - else if (clazz == Float.class) - { - writeFloat((Float) object); - } - else if (clazz == Double.class) - { - writeDouble((Double) object); - } - else if (clazz == String.class) - { - writeString((String) object); - } - else - { - throw new MessageFormatException("Only primitives plus byte arrays and String are valid types"); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java deleted file mode 100644 index 6ba55b207a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java +++ /dev/null @@ -1,536 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.io.IOException; -import java.util.Enumeration; -import java.util.UUID; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageNotReadableException; -import javax.jms.MessageNotWriteableException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public abstract class AbstractJMSMessage implements org.apache.qpid.jms.Message -{ - - - - protected ByteBuffer _data; - protected boolean _readableMessage = false; - protected boolean _changedData = true; - - /** If the acknowledge mode is CLIENT_ACKNOWLEDGE the session is required */ - - - - - protected AMQMessageDelegate _delegate; - private boolean _redelivered; - - protected AbstractJMSMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - _delegate = delegateFactory.createDelegate(); - _data = data; - if (_data != null) - { - _data.acquire(); - } - - - _readableMessage = (data != null); - _changedData = (data == null); - - } - - protected AbstractJMSMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - - _delegate = delegate; - - _data = data; - if (_data != null) - { - _data.acquire(); - } - - _readableMessage = data != null; - - } - - public String getJMSMessageID() throws JMSException - { - return _delegate.getJMSMessageID(); - } - - public void setJMSMessageID(String messageId) throws JMSException - { - _delegate.setJMSMessageID(messageId); - } - - public void setJMSMessageID(UUID messageId) throws JMSException - { - _delegate.setJMSMessageID(messageId); - } - - - public long getJMSTimestamp() throws JMSException - { - return _delegate.getJMSTimestamp(); - } - - public void setJMSTimestamp(long timestamp) throws JMSException - { - _delegate.setJMSTimestamp(timestamp); - } - - public byte[] getJMSCorrelationIDAsBytes() throws JMSException - { - return _delegate.getJMSCorrelationIDAsBytes(); - } - - public void setJMSCorrelationIDAsBytes(byte[] bytes) throws JMSException - { - _delegate.setJMSCorrelationIDAsBytes(bytes); - } - - public void setJMSCorrelationID(String correlationId) throws JMSException - { - _delegate.setJMSCorrelationID(correlationId); - } - - public String getJMSCorrelationID() throws JMSException - { - return _delegate.getJMSCorrelationID(); - } - - public Destination getJMSReplyTo() throws JMSException - { - return _delegate.getJMSReplyTo(); - } - - public void setJMSReplyTo(Destination destination) throws JMSException - { - _delegate.setJMSReplyTo(destination); - } - - public Destination getJMSDestination() throws JMSException - { - return _delegate.getJMSDestination(); - } - - public void setJMSDestination(Destination destination) - { - _delegate.setJMSDestination(destination); - } - - public int getJMSDeliveryMode() throws JMSException - { - return _delegate.getJMSDeliveryMode(); - } - - public void setJMSDeliveryMode(int i) throws JMSException - { - _delegate.setJMSDeliveryMode(i); - } - - - public boolean getJMSRedelivered() throws JMSException - { - return _redelivered; - } - - public void setJMSRedelivered(boolean b) throws JMSException - { - _redelivered = b; - } - - - public String getJMSType() throws JMSException - { - return _delegate.getJMSType(); - } - - public void setJMSType(String string) throws JMSException - { - _delegate.setJMSType(string); - } - - public long getJMSExpiration() throws JMSException - { - return _delegate.getJMSExpiration(); - } - - public void setJMSExpiration(long l) throws JMSException - { - _delegate.setJMSExpiration(l); - } - - public int getJMSPriority() throws JMSException - { - return _delegate.getJMSPriority(); - } - - public void setJMSPriority(int i) throws JMSException - { - _delegate.setJMSPriority(i); - } - - - public boolean propertyExists(String propertyName) throws JMSException - { - return _delegate.propertyExists(propertyName); - } - - public boolean getBooleanProperty(final String s) - throws JMSException - { - return _delegate.getBooleanProperty(s); - } - - public byte getByteProperty(final String s) - throws JMSException - { - return _delegate.getByteProperty(s); - } - - public short getShortProperty(final String s) - throws JMSException - { - return _delegate.getShortProperty(s); - } - - public int getIntProperty(final String s) - throws JMSException - { - return _delegate.getIntProperty(s); - } - - public long getLongProperty(final String s) - throws JMSException - { - return _delegate.getLongProperty(s); - } - - public float getFloatProperty(final String s) - throws JMSException - { - return _delegate.getFloatProperty(s); - } - - public double getDoubleProperty(final String s) - throws JMSException - { - return _delegate.getDoubleProperty(s); - } - - public String getStringProperty(final String s) - throws JMSException - { - return _delegate.getStringProperty(s); - } - - public Object getObjectProperty(final String s) - throws JMSException - { - return _delegate.getObjectProperty(s); - } - - public Enumeration getPropertyNames() - throws JMSException - { - return _delegate.getPropertyNames(); - } - - public void setBooleanProperty(final String s, final boolean b) - throws JMSException - { - _delegate.setBooleanProperty(s, b); - } - - public void setByteProperty(final String s, final byte b) - throws JMSException - { - _delegate.setByteProperty(s, b); - } - - public void setShortProperty(final String s, final short i) - throws JMSException - { - _delegate.setShortProperty(s, i); - } - - public void setIntProperty(final String s, final int i) - throws JMSException - { - _delegate.setIntProperty(s, i); - } - - public void setLongProperty(final String s, final long l) - throws JMSException - { - _delegate.setLongProperty(s, l); - } - - public void setFloatProperty(final String s, final float v) - throws JMSException - { - _delegate.setFloatProperty(s, v); - } - - public void setDoubleProperty(final String s, final double v) - throws JMSException - { - _delegate.setDoubleProperty(s, v); - } - - public void setStringProperty(final String s, final String s1) - throws JMSException - { - _delegate.setStringProperty(s, s1); - } - - public void setObjectProperty(final String s, final Object o) - throws JMSException - { - _delegate.setObjectProperty(s, o); - } - - - - public void clearProperties() throws JMSException - { - _delegate.clearProperties(); - } - - public void clearBody() throws JMSException - { - clearBodyImpl(); - _readableMessage = false; - - } - - - public void acknowledgeThis() throws JMSException - { - _delegate.acknowledgeThis(); - } - - public void acknowledge() throws JMSException - { - _delegate.acknowledge(); - } - - /** - * This forces concrete classes to implement clearBody() - * - * @throws JMSException - */ - public abstract void clearBodyImpl() throws JMSException; - - /** - * Get a String representation of the body of the message. Used in the toString() method which outputs this before - * message properties. - */ - public abstract String toBodyString() throws JMSException; - - protected abstract String getMimeType(); - - - - public String toString() - { - try - { - StringBuffer buf = new StringBuffer("Body:\n"); - - buf.append(toBodyString()); - buf.append("\nJMS Correlation ID: ").append(getJMSCorrelationID()); - buf.append("\nJMS timestamp: ").append(getJMSTimestamp()); - buf.append("\nJMS expiration: ").append(getJMSExpiration()); - buf.append("\nJMS priority: ").append(getJMSPriority()); - buf.append("\nJMS delivery mode: ").append(getJMSDeliveryMode()); - buf.append("\nJMS reply to: ").append(getReplyToString()); - buf.append("\nJMS Redelivered: ").append(_redelivered); - buf.append("\nJMS Destination: ").append(getJMSDestination()); - buf.append("\nJMS Type: ").append(getJMSType()); - buf.append("\nJMS MessageID: ").append(getJMSMessageID()); - buf.append("\nJMS Content-Type: ").append(getContentType()); - buf.append("\nAMQ message number: ").append(getDeliveryTag()); - - buf.append("\nProperties:"); - final Enumeration propertyNames = getPropertyNames(); - if (!propertyNames.hasMoreElements()) - { - buf.append("<NONE>"); - } - else - { - buf.append('\n'); - while(propertyNames.hasMoreElements()) - { - String propertyName = (String) propertyNames.nextElement(); - buf.append("\t").append(propertyName).append(" = ").append(getObjectProperty(propertyName)).append("\n"); - } - - } - - return buf.toString(); - } - catch (JMSException e) - { - throw new RuntimeException(e); - } - } - - - public AMQMessageDelegate getDelegate() - { - return _delegate; - } - - public ByteBuffer getData() - { - // make sure we rewind the data just in case any method has moved the - // position beyond the start - if (_data != null) - { - reset(); - } - - return _data; - } - - protected void checkReadable() throws MessageNotReadableException - { - if (!_readableMessage) - { - throw new MessageNotReadableException("You need to call reset() to make the message readable"); - } - } - - protected void checkWritable() throws MessageNotWriteableException - { - if (_readableMessage) - { - throw new MessageNotWriteableException("You need to call clearBody() to make the message writable"); - } - } - - public void reset() - { - if (!_changedData) - { - _data.rewind(); - } - else - { - _data.flip(); - _changedData = false; - } - } - - public int getContentLength() - { - if(_data != null) - { - return _data.remaining(); - } - else - { - return 0; - } - } - - public void receivedFromServer() - { - _changedData = false; - } - - /** - * The session is set when CLIENT_ACKNOWLEDGE mode is used so that the CHANNEL ACK can be sent when the user calls - * acknowledge() - * - * @param s the AMQ session that delivered this message - */ - public void setAMQSession(AMQSession s) - { - _delegate.setAMQSession(s); - } - - public AMQSession getAMQSession() - { - return _delegate.getAMQSession(); - } - - /** - * Get the AMQ message number assigned to this message - * - * @return the message number - */ - public long getDeliveryTag() - { - return _delegate.getDeliveryTag(); - } - - /** Invoked prior to sending the message. Allows the message to be modified if necessary before sending. */ - public void prepareForSending() throws JMSException - { - } - - - public void setContentType(String contentType) - { - _delegate.setContentType(contentType); - } - - public String getContentType() - { - return _delegate.getContentType(); - } - - public void setEncoding(String encoding) - { - _delegate.setEncoding(encoding); - } - - public String getEncoding() - { - return _delegate.getEncoding(); - } - - public String getReplyToString() - { - return _delegate.getReplyToString(); - } - - protected void removeProperty(final String propertyName) throws JMSException - { - _delegate.removeProperty(propertyName); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java deleted file mode 100644 index 40c1df0c5d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.mina.common.ByteBuffer; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ContentBody; -import org.apache.qpid.framing.ContentHeaderBody; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.transport.MessageProperties; -import org.apache.qpid.transport.DeliveryProperties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jms.JMSException; - -import java.util.Iterator; -import java.util.List; - -public abstract class AbstractJMSMessageFactory implements MessageFactory -{ - private static final Logger _logger = LoggerFactory.getLogger(AbstractJMSMessageFactory.class); - - protected AbstractJMSMessage create08MessageWithBody(long messageNbr, ContentHeaderBody contentHeader, - AMQShortString exchange, AMQShortString routingKey, - List bodies) throws AMQException - { - ByteBuffer data; - final boolean debug = _logger.isDebugEnabled(); - - // we optimise the non-fragmented case to avoid copying - if ((bodies != null) && (bodies.size() == 1)) - { - if (debug) - { - _logger.debug("Non-fragmented message body (bodySize=" + contentHeader.bodySize + ")"); - } - - data = ((ContentBody) bodies.get(0)).payload; - } - else if (bodies != null) - { - if (debug) - { - _logger.debug("Fragmented message body (" + bodies - .size() + " frames, bodySize=" + contentHeader.bodySize + ")"); - } - - data = ByteBuffer.allocate((int) contentHeader.bodySize); // XXX: Is cast a problem? - final Iterator it = bodies.iterator(); - while (it.hasNext()) - { - ContentBody cb = (ContentBody) it.next(); - final ByteBuffer payload = cb.payload; - if(payload.isDirect() || payload.isReadOnly()) - { - data.put(payload); - } - else - { - data.put(payload.array(), payload.arrayOffset(), payload.limit()); - } - - payload.release(); - } - - data.flip(); - } - else // bodies == null - { - data = ByteBuffer.allocate(0); - } - - if (debug) - { - _logger.debug("Creating message from buffer with position=" + data.position() + " and remaining=" + data - .remaining()); - } - - AMQMessageDelegate delegate = new AMQMessageDelegate_0_8(messageNbr, - (BasicContentHeaderProperties) contentHeader.getProperties(), - exchange, routingKey); - - return createMessage(delegate, data); - } - - protected abstract AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException; - - - protected AbstractJMSMessage create010MessageWithBody(long messageNbr, MessageProperties msgProps, - DeliveryProperties deliveryProps, - java.nio.ByteBuffer body) throws AMQException - { - ByteBuffer data; - final boolean debug = _logger.isDebugEnabled(); - - - if (body != null) - { - data = ByteBuffer.wrap(body); - } - else // body == null - { - data = ByteBuffer.allocate(0); - } - - if (debug) - { - _logger.debug("Creating message from buffer with position=" + data.position() + " and remaining=" + data - .remaining()); - } - AMQMessageDelegate delegate = new AMQMessageDelegate_0_10(msgProps, deliveryProps, messageNbr); - - AbstractJMSMessage message = createMessage(delegate, data); - return message; - } - - private static final String asString(byte[] bytes) - { - if (bytes == null) - { - return null; - } - else - { - return new String(bytes); - } - } - - - public AbstractJMSMessage createMessage(long messageNbr, boolean redelivered, ContentHeaderBody contentHeader, - AMQShortString exchange, AMQShortString routingKey, List bodies) - throws JMSException, AMQException - { - final AbstractJMSMessage msg = create08MessageWithBody(messageNbr, contentHeader, exchange, routingKey, bodies); - msg.setJMSRedelivered(redelivered); - msg.receivedFromServer(); - return msg; - } - - public AbstractJMSMessage createMessage(long messageNbr, boolean redelivered, MessageProperties msgProps, - DeliveryProperties deliveryProps, java.nio.ByteBuffer body) - throws JMSException, AMQException - { - final AbstractJMSMessage msg = - create010MessageWithBody(messageNbr,msgProps,deliveryProps, body); - msg.setJMSRedelivered(redelivered); - msg.receivedFromServer(); - return msg; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/CloseConsumerMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/CloseConsumerMessage.java deleted file mode 100644 index 4af04912e5..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/CloseConsumerMessage.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.qpid.client.BasicMessageConsumer; - -public final class CloseConsumerMessage extends UnprocessedMessage -{ - - public CloseConsumerMessage(BasicMessageConsumer consumer) - { - super(consumer.getConsumerTag()); - } - - - public long getDeliveryTag() - { - return 0; - } - - public boolean isRedelivered() - { - return false; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java b/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java deleted file mode 100644 index 49ae8c14b2..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.apache.qpid.client.message; -/* - * - * 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. - * - */ - -import java.util.HashMap; -import java.util.Map; - -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; - -public class FieldTableSupport -{ - public static FieldTable convertToFieldTable(Map<String,?> props) - { - FieldTable ft = new FieldTable(); - if (props != null) - { - for (String key : props.keySet()) - { - ft.setObject(key, props.get(key)); - } - } - return ft; - } - - public static Map<String,Object> convertToMap(FieldTable ft) - { - Map<String,Object> map = new HashMap<String,Object>(); - for (AMQShortString key: ft.keySet() ) - { - map.put(key.asString(), ft.getObject(key)); - } - - return map; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessage.java deleted file mode 100644 index b87275a9ce..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessage.java +++ /dev/null @@ -1,386 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.nio.CharBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CharsetEncoder; - -import javax.jms.BytesMessage; -import javax.jms.JMSException; -import javax.jms.MessageFormatException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSBytesMessage extends AbstractBytesMessage implements BytesMessage -{ - public static final String MIME_TYPE = "application/octet-stream"; - - - - public JMSBytesMessage(AMQMessageDelegateFactory delegateFactory) - { - this(delegateFactory,null); - - } - - /** - * Construct a bytes message with existing data. - * - * @param delegateFactory - * @param data the data that comprises this message. If data is null, you get a 1024 byte buffer that is - */ - JMSBytesMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - - super(delegateFactory, data); // this instanties a content header - } - - JMSBytesMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - super(delegate, data); - } - - - public void reset() - { - super.reset(); - _readableMessage = true; - } - - protected String getMimeType() - { - return MIME_TYPE; - } - - public long getBodyLength() throws JMSException - { - checkReadable(); - return _data.limit(); - } - - public boolean readBoolean() throws JMSException - { - checkReadable(); - checkAvailable(1); - return _data.get() != 0; - } - - public byte readByte() throws JMSException - { - checkReadable(); - checkAvailable(1); - return _data.get(); - } - - public int readUnsignedByte() throws JMSException - { - checkReadable(); - checkAvailable(1); - return _data.getUnsigned(); - } - - public short readShort() throws JMSException - { - checkReadable(); - checkAvailable(2); - return _data.getShort(); - } - - public int readUnsignedShort() throws JMSException - { - checkReadable(); - checkAvailable(2); - return _data.getUnsignedShort(); - } - - /** - * Note that this method reads a unicode character as two bytes from the stream - * - * @return the character read from the stream - * @throws JMSException - */ - public char readChar() throws JMSException - { - checkReadable(); - checkAvailable(2); - return _data.getChar(); - } - - public int readInt() throws JMSException - { - checkReadable(); - checkAvailable(4); - return _data.getInt(); - } - - public long readLong() throws JMSException - { - checkReadable(); - checkAvailable(8); - return _data.getLong(); - } - - public float readFloat() throws JMSException - { - checkReadable(); - checkAvailable(4); - return _data.getFloat(); - } - - public double readDouble() throws JMSException - { - checkReadable(); - checkAvailable(8); - return _data.getDouble(); - } - - public String readUTF() throws JMSException - { - checkReadable(); - // we check only for one byte since theoretically the string could be only a - // single byte when using UTF-8 encoding - - try - { - short length = readShort(); - if(length == 0) - { - return ""; - } - else - { - CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); - ByteBuffer encodedString = _data.slice(); - encodedString.limit(length); - _data.position(_data.position()+length); - CharBuffer string = decoder.decode(encodedString.buf()); - - return string.toString(); - } - - - - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Error decoding byte stream as a UTF8 string: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - public int readBytes(byte[] bytes) throws JMSException - { - if (bytes == null) - { - throw new IllegalArgumentException("byte array must not be null"); - } - checkReadable(); - int count = (_data.remaining() >= bytes.length ? bytes.length : _data.remaining()); - if (count == 0) - { - return -1; - } - else - { - _data.get(bytes, 0, count); - return count; - } - } - - public int readBytes(byte[] bytes, int maxLength) throws JMSException - { - if (bytes == null) - { - throw new IllegalArgumentException("byte array must not be null"); - } - if (maxLength > bytes.length) - { - throw new IllegalArgumentException("maxLength must be <= bytes.length"); - } - checkReadable(); - int count = (_data.remaining() >= maxLength ? maxLength : _data.remaining()); - if (count == 0) - { - return -1; - } - else - { - _data.get(bytes, 0, count); - return count; - } - } - - public void writeBoolean(boolean b) throws JMSException - { - checkWritable(); - _changedData = true; - _data.put(b ? (byte) 1 : (byte) 0); - } - - public void writeByte(byte b) throws JMSException - { - checkWritable(); - _changedData = true; - _data.put(b); - } - - public void writeShort(short i) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putShort(i); - } - - public void writeChar(char c) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putChar(c); - } - - public void writeInt(int i) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putInt(i); - } - - public void writeLong(long l) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putLong(l); - } - - public void writeFloat(float v) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putFloat(v); - } - - public void writeDouble(double v) throws JMSException - { - checkWritable(); - _changedData = true; - _data.putDouble(v); - } - - public void writeUTF(String string) throws JMSException - { - checkWritable(); - try - { - CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); - java.nio.ByteBuffer encodedString = encoder.encode(CharBuffer.wrap(string)); - - _data.putShort((short)encodedString.limit()); - _data.put(encodedString); - _changedData = true; - //_data.putString(string, Charset.forName("UTF-8").newEncoder()); - // we must add the null terminator manually - //_data.put((byte)0); - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Unable to encode string: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - public void writeBytes(byte[] bytes) throws JMSException - { - checkWritable(); - _data.put(bytes); - _changedData = true; - } - - public void writeBytes(byte[] bytes, int offset, int length) throws JMSException - { - checkWritable(); - _data.put(bytes, offset, length); - _changedData = true; - } - - public void writeObject(Object object) throws JMSException - { - checkWritable(); - if (object == null) - { - throw new NullPointerException("Argument must not be null"); - } - Class clazz = object.getClass(); - if (clazz == Byte.class) - { - writeByte((Byte) object); - } - else if (clazz == Boolean.class) - { - writeBoolean((Boolean) object); - } - else if (clazz == byte[].class) - { - writeBytes((byte[]) object); - } - else if (clazz == Short.class) - { - writeShort((Short) object); - } - else if (clazz == Character.class) - { - writeChar((Character) object); - } - else if (clazz == Integer.class) - { - writeInt((Integer) object); - } - else if (clazz == Long.class) - { - writeLong((Long) object); - } - else if (clazz == Float.class) - { - writeFloat((Float) object); - } - else if (clazz == Double.class) - { - writeDouble((Double) object); - } - else if (clazz == String.class) - { - writeUTF((String) object); - } - else - { - throw new MessageFormatException("Only primitives plus byte arrays and String are valid types"); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessageFactory.java deleted file mode 100644 index cb04ebee1b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSBytesMessageFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSBytesMessageFactory extends AbstractJMSMessageFactory -{ - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - return new JMSBytesMessage(delegate, data); - } - - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new JMSBytesMessage(delegateFactory); - } - - // 0_10 specific - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSHeaderAdapter.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSHeaderAdapter.java deleted file mode 100644 index e295d4a2a0..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSHeaderAdapter.java +++ /dev/null @@ -1,553 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.util.Enumeration; - -import javax.jms.JMSException; -import javax.jms.MessageFormatException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQPInvalidClassException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; - - -public final class JMSHeaderAdapter -{ - private final FieldTable _headers; - - public JMSHeaderAdapter(FieldTable headers) - { - _headers = headers; - } - - - public FieldTable getHeaders() - { - return _headers; - } - - public boolean getBoolean(String string) throws JMSException - { - checkPropertyName(string); - Boolean b = getHeaders().getBoolean(string); - - if (b == null) - { - if (getHeaders().containsKey(string)) - { - Object str = getHeaders().getObject(string); - - if (str == null || !(str instanceof String)) - { - throw new MessageFormatException("getBoolean can't use " + string + " item."); - } - else - { - return Boolean.valueOf((String) str); - } - } - else - { - b = Boolean.valueOf(null); - } - } - - return b; - } - - public boolean getBoolean(AMQShortString string) throws JMSException - { - checkPropertyName(string); - Boolean b = getHeaders().getBoolean(string); - - if (b == null) - { - if (getHeaders().containsKey(string)) - { - Object str = getHeaders().getObject(string); - - if (str == null || !(str instanceof String)) - { - throw new MessageFormatException("getBoolean can't use " + string + " item."); - } - else - { - return Boolean.valueOf((String) str); - } - } - else - { - b = Boolean.valueOf(null); - } - } - - return b; - } - - public char getCharacter(String string) throws JMSException - { - checkPropertyName(string); - Character c = getHeaders().getCharacter(string); - - if (c == null) - { - if (getHeaders().isNullStringValue(string)) - { - throw new NullPointerException("Cannot convert null char"); - } - else - { - throw new MessageFormatException("getChar can't use " + string + " item."); - } - } - else - { - return (char) c; - } - } - - public byte[] getBytes(String string) throws JMSException - { - return getBytes(new AMQShortString(string)); - } - - public byte[] getBytes(AMQShortString string) throws JMSException - { - checkPropertyName(string); - - byte[] bs = getHeaders().getBytes(string); - - if (bs == null) - { - throw new MessageFormatException("getBytes can't use " + string + " item."); - } - else - { - return bs; - } - } - - public byte getByte(String string) throws JMSException - { - checkPropertyName(string); - Byte b = getHeaders().getByte(string); - if (b == null) - { - if (getHeaders().containsKey(string)) - { - Object str = getHeaders().getObject(string); - - if (str == null || !(str instanceof String)) - { - throw new MessageFormatException("getByte can't use " + string + " item."); - } - else - { - return Byte.valueOf((String) str); - } - } - else - { - b = Byte.valueOf(null); - } - } - - return b; - } - - public short getShort(String string) throws JMSException - { - checkPropertyName(string); - Short s = getHeaders().getShort(string); - - if (s == null) - { - s = Short.valueOf(getByte(string)); - } - - return s; - } - - public int getInteger(String string) throws JMSException - { - checkPropertyName(string); - Integer i = getHeaders().getInteger(string); - - if (i == null) - { - i = Integer.valueOf(getShort(string)); - } - - return i; - } - - public long getLong(String string) throws JMSException - { - checkPropertyName(string); - Long l = getHeaders().getLong(string); - - if (l == null) - { - l = Long.valueOf(getInteger(string)); - } - - return l; - } - - public float getFloat(String string) throws JMSException - { - checkPropertyName(string); - Float f = getHeaders().getFloat(string); - - if (f == null) - { - if (getHeaders().containsKey(string)) - { - Object str = getHeaders().getObject(string); - - if (str == null || !(str instanceof String)) - { - throw new MessageFormatException("getFloat can't use " + string + " item."); - } - else - { - return Float.valueOf((String) str); - } - } - else - { - throw new NullPointerException("No such property: " + string); - } - - } - - return f; - } - - public double getDouble(String string) throws JMSException - { - checkPropertyName(string); - Double d = getHeaders().getDouble(string); - - if (d == null) - { - d = Double.valueOf(getFloat(string)); - } - - return d; - } - - public String getString(String string) throws JMSException - { - checkPropertyName(string); - String s = getHeaders().getString(string); - - if (s == null) - { - if (getHeaders().containsKey(string)) - { - Object o = getHeaders().getObject(string); - if (o instanceof byte[]) - { - throw new MessageFormatException("getObject couldn't find " + string + " item."); - } - else - { - if (o == null) - { - return null; - } - else - { - s = String.valueOf(o); - } - } - }//else return s // null; - } - - return s; - } - - public Object getObject(String string) throws JMSException - { - checkPropertyName(string); - return getHeaders().getObject(string); - } - - public void setBoolean(AMQShortString string, boolean b) throws JMSException - { - checkPropertyName(string); - getHeaders().setBoolean(string, b); - } - - public void setBoolean(String string, boolean b) throws JMSException - { - checkPropertyName(string); - getHeaders().setBoolean(string, b); - } - - public void setChar(String string, char c) throws JMSException - { - checkPropertyName(string); - getHeaders().setChar(string, c); - } - - public Object setBytes(AMQShortString string, byte[] bytes) - { - checkPropertyName(string); - return getHeaders().setBytes(string, bytes); - } - - public Object setBytes(String string, byte[] bytes) - { - checkPropertyName(string); - return getHeaders().setBytes(string, bytes); - } - - public Object setBytes(String string, byte[] bytes, int start, int length) - { - checkPropertyName(string); - return getHeaders().setBytes(string, bytes, start, length); - } - - public void setByte(String string, byte b) throws JMSException - { - checkPropertyName(string); - getHeaders().setByte(string, b); - } - - public void setByte(AMQShortString string, byte b) throws JMSException - { - checkPropertyName(string); - getHeaders().setByte(string, b); - } - - - public void setShort(String string, short i) throws JMSException - { - checkPropertyName(string); - getHeaders().setShort(string, i); - } - - public void setInteger(String string, int i) throws JMSException - { - checkPropertyName(string); - getHeaders().setInteger(string, i); - } - - public void setInteger(AMQShortString string, int i) throws JMSException - { - checkPropertyName(string); - getHeaders().setInteger(string, i); - } - - public void setLong(String string, long l) throws JMSException - { - checkPropertyName(string); - getHeaders().setLong(string, l); - } - - public void setFloat(String string, float v) throws JMSException - { - checkPropertyName(string); - getHeaders().setFloat(string, v); - } - - public void setDouble(String string, double v) throws JMSException - { - checkPropertyName(string); - getHeaders().setDouble(string, v); - } - - public void setString(String string, String string1) throws JMSException - { - checkPropertyName(string); - getHeaders().setString(string, string1); - } - - public void setString(AMQShortString string, String string1) throws JMSException - { - checkPropertyName(string); - getHeaders().setString(string, string1); - } - - public void setObject(String string, Object object) throws JMSException - { - checkPropertyName(string); - try - { - getHeaders().setObject(string, object); - } - catch (AMQPInvalidClassException aice) - { - MessageFormatException mfe = new MessageFormatException(AMQPInvalidClassException.INVALID_OBJECT_MSG + (object == null ? "null" : object.getClass())); - mfe.setLinkedException(aice); - mfe.initCause(aice); - throw mfe; - } - } - - public boolean itemExists(String string) throws JMSException - { - checkPropertyName(string); - return getHeaders().containsKey(string); - } - - public Enumeration getPropertyNames() - { - return getHeaders().getPropertyNames(); - } - - public void clear() - { - getHeaders().clear(); - } - - public boolean propertyExists(AMQShortString propertyName) - { - checkPropertyName(propertyName); - return getHeaders().propertyExists(propertyName); - } - - public boolean propertyExists(String propertyName) - { - checkPropertyName(propertyName); - return getHeaders().propertyExists(propertyName); - } - - public Object put(Object key, Object value) - { - checkPropertyName(key.toString()); - return getHeaders().setObject(key.toString(), value); - } - - public Object remove(AMQShortString propertyName) - { - checkPropertyName(propertyName); - return getHeaders().remove(propertyName); - } - - public Object remove(String propertyName) - { - checkPropertyName(propertyName); - return getHeaders().remove(propertyName); - } - - public boolean isEmpty() - { - return getHeaders().isEmpty(); - } - - public void writeToBuffer(ByteBuffer data) - { - getHeaders().writeToBuffer(data); - } - - public Enumeration getMapNames() - { - return getPropertyNames(); - } - - protected void checkPropertyName(CharSequence propertyName) - { - if (propertyName == null) - { - throw new IllegalArgumentException("Property name must not be null"); - } - else if (propertyName.length() == 0) - { - throw new IllegalArgumentException("Property name must not be the empty string"); - } - - checkIdentiferFormat(propertyName); - } - - protected void checkIdentiferFormat(CharSequence propertyName) - { -// JMS requirements 3.5.1 Property Names -// Identifiers: -// - An identifier is an unlimited-length character sequence that must begin -// with a Java identifier start character; all following characters must be Java -// identifier part characters. An identifier start character is any character for -// which the method Character.isJavaIdentifierStart returns true. This includes -// '_' and '$'. An identifier part character is any character for which the -// method Character.isJavaIdentifierPart returns true. -// - Identifiers cannot be the names NULL, TRUE, or FALSE. -// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or -// ESCAPE. -// Identifiers are either header field references or property references. The -// type of a property value in a message selector corresponds to the type -// used to set the property. If a property that does not exist in a message is -// referenced, its value is NULL. The semantics of evaluating NULL values -// in a selector are described in Section 3.8.1.2, Null Values. -// The conversions that apply to the get methods for properties do not -// apply when a property is used in a message selector expression. For -// example, suppose you set a property as a string value, as in the -// following: -// myMessage.setStringProperty("NumberOfOrders", "2"); -// The following expression in a message selector would evaluate to false, -// because a string cannot be used in an arithmetic expression: -// "NumberOfOrders > 1" -// Identifiers are case sensitive. -// Message header field references are restricted to JMSDeliveryMode, -// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and -// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be -// null and if so are treated as a NULL value. - - if (Boolean.getBoolean("strict-jms")) - { - // JMS start character - if (!(Character.isJavaIdentifierStart(propertyName.charAt(0)))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character"); - } - - // JMS part character - int length = propertyName.length(); - for (int c = 1; c < length; c++) - { - if (!(Character.isJavaIdentifierPart(propertyName.charAt(c)))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character"); - } - } - - // JMS invalid names - if ((propertyName.equals("NULL") - || propertyName.equals("TRUE") - || propertyName.equals("FALSE") - || propertyName.equals("NOT") - || propertyName.equals("AND") - || propertyName.equals("OR") - || propertyName.equals("BETWEEN") - || propertyName.equals("LIKE") - || propertyName.equals("IN") - || propertyName.equals("IS") - || propertyName.equals("ESCAPE"))) - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS"); - } - } - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java deleted file mode 100644 index 306ffeeadf..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java +++ /dev/null @@ -1,512 +0,0 @@ -/* - * 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.qpid.client.message; - -import org.apache.mina.common.ByteBuffer; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jms.JMSException; -import javax.jms.MessageFormatException; - -import java.nio.charset.CharacterCodingException; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - -public class JMSMapMessage extends AbstractBytesTypedMessage implements javax.jms.MapMessage -{ - private static final Logger _logger = LoggerFactory.getLogger(JMSMapMessage.class); - - public static final String MIME_TYPE = "jms/map-message"; - - protected Map<String, Object> _map = new HashMap<String, Object>(); - - public JMSMapMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - this(delegateFactory, null); - } - - JMSMapMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) throws JMSException - { - - super(delegateFactory, data); // this instantiates a content header - if(data != null) - { - populateMapFromData(); - } - - } - - JMSMapMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - - super(delegate, data); - try - { - populateMapFromData(); - } - catch (JMSException je) - { - throw new AMQException(null, "Error populating MapMessage from ByteBuffer", je); - - } - - } - - - public String toBodyString() throws JMSException - { - return _map == null ? "" : _map.toString(); - } - - protected String getMimeType() - { - return MIME_TYPE; - } - - public ByteBuffer getData() - { - // What if _data is null? - writeMapToData(); - - return super.getData(); - } - - @Override - public void clearBodyImpl() throws JMSException - { - super.clearBodyImpl(); - _map.clear(); - } - - public boolean getBoolean(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Boolean) - { - return ((Boolean) value).booleanValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Boolean.valueOf((String) value); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to boolean."); - } - - } - - public byte getByte(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Byte) - { - return ((Byte) value).byteValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Byte.valueOf((String) value).byteValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to byte."); - } - } - - public short getShort(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Short) - { - return ((Short) value).shortValue(); - } - else if (value instanceof Byte) - { - return ((Byte) value).shortValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Short.valueOf((String) value).shortValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to short."); - } - - } - - public int getInt(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Integer) - { - return ((Integer) value).intValue(); - } - else if (value instanceof Short) - { - return ((Short) value).intValue(); - } - else if (value instanceof Byte) - { - return ((Byte) value).intValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Integer.valueOf((String) value).intValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to int."); - } - - } - - public long getLong(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Long) - { - return ((Long) value).longValue(); - } - else if (value instanceof Integer) - { - return ((Integer) value).longValue(); - } - - if (value instanceof Short) - { - return ((Short) value).longValue(); - } - - if (value instanceof Byte) - { - return ((Byte) value).longValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Long.valueOf((String) value).longValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to long."); - } - - } - - public char getChar(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (!_map.containsKey(propName)) - { - throw new MessageFormatException("Property " + propName + " not present"); - } - else if (value instanceof Character) - { - return ((Character) value).charValue(); - } - else if (value == null) - { - throw new NullPointerException("Property " + propName + " has null value and therefore cannot " - + "be converted to char."); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to boolan."); - } - - } - - public float getFloat(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Float) - { - return ((Float) value).floatValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Float.valueOf((String) value).floatValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to float."); - } - } - - public double getDouble(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (value instanceof Double) - { - return ((Double) value).doubleValue(); - } - else if (value instanceof Float) - { - return ((Float) value).doubleValue(); - } - else if ((value instanceof String) || (value == null)) - { - return Double.valueOf((String) value).doubleValue(); - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to double."); - } - } - - public String getString(String propName) throws JMSException - { - Object value = _map.get(propName); - - if ((value instanceof String) || (value == null)) - { - return (String) value; - } - else if (value instanceof byte[]) - { - throw new MessageFormatException("Property " + propName + " of type byte[] " + "cannot be converted to String."); - } - else - { - return value.toString(); - } - - } - - public byte[] getBytes(String propName) throws JMSException - { - Object value = _map.get(propName); - - if (!_map.containsKey(propName)) - { - throw new MessageFormatException("Property " + propName + " not present"); - } - else if ((value instanceof byte[]) || (value == null)) - { - return (byte[]) value; - } - else - { - throw new MessageFormatException("Property " + propName + " of type " + value.getClass().getName() - + " cannot be converted to byte[]."); - } - } - - public Object getObject(String propName) throws JMSException - { - return _map.get(propName); - } - - public Enumeration getMapNames() throws JMSException - { - return Collections.enumeration(_map.keySet()); - } - - public void setBoolean(String propName, boolean b) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, b); - } - - public void setByte(String propName, byte b) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, b); - } - - public void setShort(String propName, short i) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, i); - } - - public void setChar(String propName, char c) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, c); - } - - public void setInt(String propName, int i) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, i); - } - - public void setLong(String propName, long l) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, l); - } - - public void setFloat(String propName, float v) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, v); - } - - public void setDouble(String propName, double v) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, v); - } - - public void setString(String propName, String string1) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, string1); - } - - public void setBytes(String propName, byte[] bytes) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - _map.put(propName, bytes); - } - - public void setBytes(String propName, byte[] bytes, int offset, int length) throws JMSException - { - if ((offset == 0) && (length == bytes.length)) - { - setBytes(propName, bytes); - } - else - { - byte[] newBytes = new byte[length]; - System.arraycopy(bytes, offset, newBytes, 0, length); - setBytes(propName, newBytes); - } - } - - public void setObject(String propName, Object value) throws JMSException - { - checkWritable(); - checkPropertyName(propName); - if ((value instanceof Boolean) || (value instanceof Byte) || (value instanceof Short) || (value instanceof Integer) - || (value instanceof Long) || (value instanceof Character) || (value instanceof Float) - || (value instanceof Double) || (value instanceof String) || (value instanceof byte[]) || (value == null)) - { - _map.put(propName, value); - } - else - { - throw new MessageFormatException("Cannot set property " + propName + " to value " + value + "of type " - + value.getClass().getName() + "."); - } - } - - protected void checkPropertyName(String propName) - { - if ((propName == null) || propName.equals("")) - { - throw new IllegalArgumentException("Property name cannot be null, or the empty String."); - } - } - - public boolean itemExists(String propName) throws JMSException - { - return _map.containsKey(propName); - } - - protected void populateMapFromData() throws JMSException - { - if (_data != null) - { - _data.rewind(); - - final int entries = readIntImpl(); - for (int i = 0; i < entries; i++) - { - String propName = readStringImpl(); - Object value = readObject(); - _map.put(propName, value); - } - } - else - { - _map.clear(); - } - } - - protected void writeMapToData() - { - allocateInitialBuffer(); - final int size = _map.size(); - writeIntImpl(size); - for (Map.Entry<String, Object> entry : _map.entrySet()) - { - try - { - writeStringImpl(entry.getKey()); - } - catch (CharacterCodingException e) - { - throw new IllegalArgumentException("Cannot encode property key name " + entry.getKey(), e); - - } - - try - { - writeObject(entry.getValue()); - } - catch (JMSException e) - { - Object value = entry.getValue(); - throw new IllegalArgumentException("Cannot encode property key name " + entry.getKey() + " value : " + value - + " (type: " + value.getClass().getName() + ").", e); - } - } - - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java deleted file mode 100644 index eccb90560b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.qpid.client.message; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSMapMessageFactory extends AbstractJMSMessageFactory -{ - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new JMSMapMessage(delegateFactory); - } - - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - return new JMSMapMessage(delegate, data); - - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessage.java deleted file mode 100644 index 637d9dd692..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessage.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -import javax.jms.JMSException; -import javax.jms.MessageFormatException; -import javax.jms.ObjectMessage; - -import org.apache.mina.common.ByteBuffer; - -import org.apache.qpid.AMQException; - -public class JMSObjectMessage extends AbstractJMSMessage implements ObjectMessage -{ - public static final String MIME_TYPE = "application/java-object-stream"; - - - private static final int DEFAULT_BUFFER_SIZE = 1024; - - /** - * Creates empty, writable message for use by producers - * @param delegateFactory - */ - public JMSObjectMessage(AMQMessageDelegateFactory delegateFactory) - { - this(delegateFactory, null); - } - - private JMSObjectMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - super(delegateFactory, data); - if (data == null) - { - _data = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE); - _data.setAutoExpand(true); - } - - setContentType(getMimeType()); - } - - /** - * Creates read only message for delivery to consumers - */ - - JMSObjectMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - super(delegate, data); - } - - - public void clearBodyImpl() throws JMSException - { - if (_data != null) - { - _data.release(); - _data = null; - } - - - - } - - public String toBodyString() throws JMSException - { - return String.valueOf(getObject()); - } - - public String getMimeType() - { - return MIME_TYPE; - } - - public void setObject(Serializable serializable) throws JMSException - { - checkWritable(); - - if (_data == null) - { - _data = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE); - _data.setAutoExpand(true); - } - else - { - _data.rewind(); - } - - try - { - ObjectOutputStream out = new ObjectOutputStream(_data.asOutputStream()); - out.writeObject(serializable); - out.flush(); - out.close(); - } - catch (IOException e) - { - MessageFormatException mfe = new MessageFormatException("Message not serializable: " + e); - mfe.setLinkedException(e); - mfe.initCause(e); - throw mfe; - } - - } - - public Serializable getObject() throws JMSException - { - ObjectInputStream in = null; - if (_data == null) - { - return null; - } - - try - { - _data.rewind(); - in = new ObjectInputStream(_data.asInputStream()); - - return (Serializable) in.readObject(); - } - catch (IOException e) - { - MessageFormatException mfe = new MessageFormatException("Could not deserialize message: " + e); - mfe.setLinkedException(e); - mfe.initCause(e); - throw mfe; - } - catch (ClassNotFoundException e) - { - MessageFormatException mfe = new MessageFormatException("Could not deserialize message: " + e); - mfe.setLinkedException(e); - mfe.initCause(e); - throw mfe; - } - finally - { - // _data.rewind(); - close(in); - } - } - - private static void close(InputStream in) - { - try - { - if (in != null) - { - in.close(); - } - } - catch (IOException ignore) - { } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessageFactory.java deleted file mode 100644 index 03851dfa01..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSObjectMessageFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSObjectMessageFactory extends AbstractJMSMessageFactory -{ - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - return new JMSObjectMessage(delegate, data); - } - - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new JMSObjectMessage(delegateFactory); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessage.java deleted file mode 100644 index ad2620852b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessage.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; -import javax.jms.StreamMessage; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -/** - * @author Apache Software Foundation - */ -public class JMSStreamMessage extends AbstractBytesTypedMessage implements StreamMessage -{ - public static final String MIME_TYPE="jms/stream-message"; - - - - /** - * This is set when reading a byte array. The readBytes(byte[]) method supports multiple calls to read - * a byte array in multiple chunks, hence this is used to track how much is left to be read - */ - private int _byteArrayRemaining = -1; - - public JMSStreamMessage(AMQMessageDelegateFactory delegateFactory) - { - this(delegateFactory,null); - - } - - /** - * Construct a stream message with existing data. - * - * @param delegateFactory - * @param data the data that comprises this message. If data is null, you get a 1024 byte buffer that is - */ - JMSStreamMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data) - { - - super(delegateFactory, data); // this instanties a content header - } - - JMSStreamMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - - super(delegate, data); - } - - - public void reset() - { - super.reset(); - _readableMessage = true; - } - - protected String getMimeType() - { - return MIME_TYPE; - } - - - - public boolean readBoolean() throws JMSException - { - return super.readBoolean(); - } - - - public byte readByte() throws JMSException - { - return super.readByte(); - } - - public short readShort() throws JMSException - { - return super.readShort(); - } - - /** - * Note that this method reads a unicode character as two bytes from the stream - * - * @return the character read from the stream - * @throws JMSException - */ - public char readChar() throws JMSException - { - return super.readChar(); - } - - public int readInt() throws JMSException - { - return super.readInt(); - } - - public long readLong() throws JMSException - { - return super.readLong(); - } - - public float readFloat() throws JMSException - { - return super.readFloat(); - } - - public double readDouble() throws JMSException - { - return super.readDouble(); - } - - public String readString() throws JMSException - { - return super.readString(); - } - - public int readBytes(byte[] bytes) throws JMSException - { - return super.readBytes(bytes); - } - - - public Object readObject() throws JMSException - { - return super.readObject(); - } - - public void writeBoolean(boolean b) throws JMSException - { - super.writeBoolean(b); - } - - public void writeByte(byte b) throws JMSException - { - super.writeByte(b); - } - - public void writeShort(short i) throws JMSException - { - super.writeShort(i); - } - - public void writeChar(char c) throws JMSException - { - super.writeChar(c); - } - - public void writeInt(int i) throws JMSException - { - super.writeInt(i); - } - - public void writeLong(long l) throws JMSException - { - super.writeLong(l); - } - - public void writeFloat(float v) throws JMSException - { - super.writeFloat(v); - } - - public void writeDouble(double v) throws JMSException - { - super.writeDouble(v); - } - - public void writeString(String string) throws JMSException - { - super.writeString(string); - } - - public void writeBytes(byte[] bytes) throws JMSException - { - super.writeBytes(bytes); - } - - public void writeBytes(byte[] bytes, int offset, int length) throws JMSException - { - super.writeBytes(bytes,offset,length); - } - - public void writeObject(Object object) throws JMSException - { - super.writeObject(object); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessageFactory.java deleted file mode 100644 index 5e25db9ae0..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessageFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSStreamMessageFactory extends AbstractJMSMessageFactory -{ - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - return new JMSStreamMessage(delegate, data); - } - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new JMSStreamMessage(delegateFactory); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessage.java deleted file mode 100644 index fc2006a119..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessage.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.io.UnsupportedEncodingException; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.client.CustomJMSXProperty; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.util.Strings; - -public class JMSTextMessage extends AbstractJMSMessage implements javax.jms.TextMessage -{ - private static final String MIME_TYPE = "text/plain"; - - private String _decodedValue; - - /** - * This constant represents the name of a property that is set when the message payload is null. - */ - private static final String PAYLOAD_NULL_PROPERTY = CustomJMSXProperty.JMS_AMQP_NULL.toString(); - private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); - - public JMSTextMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - this(delegateFactory, null, null); - } - - JMSTextMessage(AMQMessageDelegateFactory delegateFactory, ByteBuffer data, String encoding) throws JMSException - { - super(delegateFactory, data); // this instantiates a content header - setContentType(getMimeType()); - setEncoding(encoding); - } - - JMSTextMessage(AMQMessageDelegate delegate, ByteBuffer data) - throws AMQException - { - super(delegate, data); - setContentType(getMimeType()); - _data = data; - } - - - public void clearBodyImpl() throws JMSException - { - if (_data != null) - { - _data.release(); - _data = null; - } - - _decodedValue = null; - } - - public String toBodyString() throws JMSException - { - return getText(); - } - - protected String getMimeType() - { - return MIME_TYPE; - } - - public void setText(String text) throws JMSException - { - checkWritable(); - - clearBody(); - try - { - if (text != null) - { - final String encoding = getEncoding(); - if (encoding == null || encoding.equalsIgnoreCase("UTF-8")) - { - _data = ByteBuffer.wrap(Strings.toUTF8(text)); - setEncoding("UTF-8"); - } - else - { - _data = ByteBuffer.wrap(text.getBytes(encoding)); - } - _data.position(_data.limit()); - _changedData=true; - } - _decodedValue = text; - } - catch (UnsupportedEncodingException e) - { - // should never occur - JMSException jmse = new JMSException("Unable to decode text data"); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - public String getText() throws JMSException - { - if (_data == null && _decodedValue == null) - { - return null; - } - else if (_decodedValue != null) - { - return _decodedValue; - } - else - { - _data.rewind(); - - if (propertyExists(PAYLOAD_NULL_PROPERTY) && getBooleanProperty(PAYLOAD_NULL_PROPERTY)) - { - return null; - } - if (getEncoding() != null) - { - try - { - _decodedValue = _data.getString(Charset.forName(getEncoding()).newDecoder()); - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Could not decode string data: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - else - { - try - { - _decodedValue = _data.getString(DEFAULT_CHARSET.newDecoder()); - } - catch (CharacterCodingException e) - { - JMSException jmse = new JMSException("Could not decode string data: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - return _decodedValue; - } - } - - @Override - public void prepareForSending() throws JMSException - { - super.prepareForSending(); - if (_data == null) - { - setBooleanProperty(PAYLOAD_NULL_PROPERTY, true); - } - else - { - removeProperty(PAYLOAD_NULL_PROPERTY); - } - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessageFactory.java deleted file mode 100644 index 1f4d64c78f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/JMSTextMessageFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; - -public class JMSTextMessageFactory extends AbstractJMSMessageFactory -{ - - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException - { - return new JMSTextMessage(delegateFactory); - } - - protected AbstractJMSMessage createMessage(AMQMessageDelegate delegate, ByteBuffer data) throws AMQException - { - return new JMSTextMessage(delegate, data); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/MessageConverter.java b/java/client/src/main/java/org/apache/qpid/client/message/MessageConverter.java deleted file mode 100644 index e606ef11c9..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/MessageConverter.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.qpid.client.AMQSession; - -import javax.jms.*; - -import java.util.Enumeration; - -public class MessageConverter -{ - - /** - * Log4J logger - */ - protected final Logger _logger = LoggerFactory.getLogger(getClass()); - - /** - * AbstractJMSMessage which will hold the converted message - */ - private AbstractJMSMessage _newMessage; - - public MessageConverter(AbstractJMSMessage message) throws JMSException - { - _newMessage = message; - } - - public MessageConverter(AMQSession session, BytesMessage bytesMessage) throws JMSException - { - bytesMessage.reset(); - - JMSBytesMessage nativeMsg = (JMSBytesMessage) session.createBytesMessage(); - - byte[] buf = new byte[1024]; - - int len; - - while ((len = bytesMessage.readBytes(buf)) != -1) - { - nativeMsg.writeBytes(buf, 0, len); - } - - _newMessage = nativeMsg; - setMessageProperties(bytesMessage); - } - - public MessageConverter(AMQSession session, MapMessage message) throws JMSException - { - MapMessage nativeMessage = session.createMapMessage(); - - Enumeration mapNames = message.getMapNames(); - while (mapNames.hasMoreElements()) - { - String name = (String) mapNames.nextElement(); - nativeMessage.setObject(name, message.getObject(name)); - } - - _newMessage = (AbstractJMSMessage) nativeMessage; - setMessageProperties(message); - } - - public MessageConverter(AMQSession session, ObjectMessage origMessage) throws JMSException - { - - ObjectMessage nativeMessage = session.createObjectMessage(); - - nativeMessage.setObject(origMessage.getObject()); - - _newMessage = (AbstractJMSMessage) nativeMessage; - setMessageProperties(origMessage); - - } - - public MessageConverter(AMQSession session, TextMessage message) throws JMSException - { - TextMessage nativeMessage = session.createTextMessage(); - - nativeMessage.setText(message.getText()); - - _newMessage = (AbstractJMSMessage) nativeMessage; - setMessageProperties(message); - } - - public MessageConverter(AMQSession session, StreamMessage message) throws JMSException - { - StreamMessage nativeMessage = session.createStreamMessage(); - - try - { - message.reset(); - while (true) - { - nativeMessage.writeObject(message.readObject()); - } - } - catch (MessageEOFException e) - { - // we're at the end so don't mind the exception - } - - _newMessage = (AbstractJMSMessage) nativeMessage; - setMessageProperties(message); - } - - public MessageConverter(AMQSession session, Message message) throws JMSException - { - // Send a message with just properties. - // Throwing away content - Message nativeMessage = session.createMessage(); - - _newMessage = (AbstractJMSMessage) nativeMessage; - setMessageProperties(message); - } - - public AbstractJMSMessage getConvertedMessage() - { - return _newMessage; - } - - /** - * Sets all message properties - */ - protected void setMessageProperties(Message message) throws JMSException - { - setNonJMSProperties(message); - setJMSProperties(message); - } - - /** - * Sets all non-JMS defined properties on converted message - */ - protected void setNonJMSProperties(Message message) throws JMSException - { - Enumeration propertyNames = message.getPropertyNames(); - while (propertyNames.hasMoreElements()) - { - String propertyName = String.valueOf(propertyNames.nextElement()); - // TODO: Shouldn't need to check for JMS properties here as don't think getPropertyNames() should return them - if (!propertyName.startsWith("JMSX_")) - { - Object value = message.getObjectProperty(propertyName); - _newMessage.setObjectProperty(propertyName, value); - } - } - } - - /** - * Exposed JMS defined properties on converted message: - * JMSDestination - we don't set here - * JMSDeliveryMode - set - * JMSExpiration - we don't set here - * JMSPriority - we don't set here - * JMSMessageID - we don't set here - * JMSTimestamp - we don't set here - * JMSCorrelationID - set - * JMSReplyTo - set - * JMSType - set - * JMSRedlivered - we don't set here - */ - protected void setJMSProperties(Message message) throws JMSException - { - _newMessage.setJMSDeliveryMode(message.getJMSDeliveryMode()); - - if (message.getJMSReplyTo() != null) - { - _newMessage.setJMSReplyTo(message.getJMSReplyTo()); - } - - _newMessage.setJMSType(message.getJMSType()); - - _newMessage.setJMSCorrelationID(message.getJMSCorrelationID()); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/MessageFactory.java b/java/client/src/main/java/org/apache/qpid/client/message/MessageFactory.java deleted file mode 100644 index f3d96cd855..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/MessageFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.util.List; - -import javax.jms.JMSException; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ContentHeaderBody; -import org.apache.qpid.transport.DeliveryProperties; -import org.apache.qpid.transport.MessageProperties; - - -public interface MessageFactory -{ - AbstractJMSMessage createMessage(long deliveryTag, boolean redelivered, - ContentHeaderBody contentHeader, - AMQShortString exchange, AMQShortString routingKey, - List bodies) - throws JMSException, AMQException; - - AbstractJMSMessage createMessage(long deliveryTag, boolean redelivered, - MessageProperties msgProps, - DeliveryProperties deliveryProps, - java.nio.ByteBuffer body) - throws JMSException, AMQException; - - AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/MessageFactoryRegistry.java b/java/client/src/main/java/org/apache/qpid/client/message/MessageFactoryRegistry.java deleted file mode 100644 index cdb75fc9a9..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/MessageFactoryRegistry.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.nio.ByteBuffer; - -import javax.jms.JMSException; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicContentHeaderProperties; -import org.apache.qpid.framing.ContentHeaderBody; -import org.apache.qpid.transport.Struct; -import org.apache.qpid.transport.MessageProperties; -import org.apache.qpid.transport.MessageTransfer; -import org.apache.qpid.transport.DeliveryProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MessageFactoryRegistry -{ - /** - * This class logger - */ - protected final Logger _logger = LoggerFactory.getLogger(getClass()); - - private final Map<String, MessageFactory> _mimeStringToFactoryMap = new HashMap<String, MessageFactory>(); - private final Map<AMQShortString, MessageFactory> _mimeShortStringToFactoryMap = - new HashMap<AMQShortString, MessageFactory>(); - private final MessageFactory _default = new JMSBytesMessageFactory(); - - /** - * Construct a new registry with the default message factories registered - * - * @return a message factory registry - */ - public static MessageFactoryRegistry newDefaultRegistry() - { - MessageFactoryRegistry mf = new MessageFactoryRegistry(); - mf.registerFactory(JMSMapMessage.MIME_TYPE, new JMSMapMessageFactory()); - mf.registerFactory("text/plain", new JMSTextMessageFactory()); - mf.registerFactory("text/xml", new JMSTextMessageFactory()); - mf.registerFactory(JMSBytesMessage.MIME_TYPE, new JMSBytesMessageFactory()); - mf.registerFactory(JMSObjectMessage.MIME_TYPE, new JMSObjectMessageFactory()); - mf.registerFactory(JMSStreamMessage.MIME_TYPE, new JMSStreamMessageFactory()); - mf.registerFactory(AMQPEncodedMapMessage.MIME_TYPE, new AMQPEncodedMapMessageFactory()); - mf.registerFactory(null, mf._default); - - return mf; - } - - - public void registerFactory(String mimeType, MessageFactory mf) - { - if (mf == null) - { - throw new IllegalArgumentException("Message factory must not be null"); - } - - _mimeStringToFactoryMap.put(mimeType, mf); - _mimeShortStringToFactoryMap.put(new AMQShortString(mimeType), mf); - } - - public MessageFactory deregisterFactory(String mimeType) - { - _mimeShortStringToFactoryMap.remove(new AMQShortString(mimeType)); - - return _mimeStringToFactoryMap.remove(mimeType); - } - - /** - * Create a message. This looks up the MIME type from the content header and instantiates the appropriate - * concrete message type. - * - * @param deliveryTag the AMQ message id - * @param redelivered true if redelivered - * @param contentHeader the content header that was received - * @param bodies a list of ContentBody instances @return the message. - * @throws AMQException - * @throws JMSException - */ - public AbstractJMSMessage createMessage(long deliveryTag, boolean redelivered, AMQShortString exchange, - AMQShortString routingKey, ContentHeaderBody contentHeader, List bodies) - throws AMQException, JMSException - { - BasicContentHeaderProperties properties = (BasicContentHeaderProperties) contentHeader.getProperties(); - - // Get the message content type. This may be null for pure AMQP messages, but will always be set for JMS over - // AMQP. When the type is null, it can only be assumed that the message is a byte message. - AMQShortString contentTypeShortString = properties.getContentType(); - contentTypeShortString = (contentTypeShortString == null) ? new AMQShortString( - JMSBytesMessage.MIME_TYPE) : contentTypeShortString; - - MessageFactory mf = _mimeShortStringToFactoryMap.get(contentTypeShortString); - if (mf == null) - { - mf = _default; - } - - return mf.createMessage(deliveryTag, redelivered, contentHeader, exchange, routingKey, bodies); - } - - public AbstractJMSMessage createMessage(MessageTransfer transfer) throws AMQException, JMSException - { - - MessageProperties mprop = transfer.getHeader().get(MessageProperties.class); - String messageType = ""; - if ( mprop == null || mprop.getContentType() == null) - { - _logger.debug("no message type specified, building a byte message"); - messageType = JMSBytesMessage.MIME_TYPE; - } - else - { - messageType = mprop.getContentType(); - } - MessageFactory mf = _mimeStringToFactoryMap.get(messageType); - if (mf == null) - { - mf = _default; - } - - boolean redelivered = false; - DeliveryProperties deliverProps; - if((deliverProps = transfer.getHeader().get(DeliveryProperties.class)) != null) - { - redelivered = deliverProps.getRedelivered(); - } - return mf.createMessage(transfer.getId(), - redelivered, - mprop == null? new MessageProperties():mprop, - deliverProps == null? new DeliveryProperties():deliverProps, - transfer.getBody()); - } - - - public AbstractJMSMessage createMessage(AMQMessageDelegateFactory delegateFactory, String mimeType) throws AMQException, JMSException - { - if (mimeType == null) - { - throw new IllegalArgumentException("Mime type must not be null"); - } - - MessageFactory mf = _mimeStringToFactoryMap.get(mimeType); - if (mf == null) - { - mf = _default; - } - - return mf.createMessage(delegateFactory); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/ReturnMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/ReturnMessage.java deleted file mode 100644 index 6e5f33a65c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/ReturnMessage.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apache.qpid.client.message; -/* - * - * 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. - * - */ - - -import org.apache.qpid.framing.AMQShortString; - -public class ReturnMessage extends UnprocessedMessage_0_8 -{ - final private AMQShortString _replyText; - final private int _replyCode; - - public ReturnMessage(AMQShortString exchange, AMQShortString routingKey, AMQShortString replyText, int replyCode) - { - super(-1,0,exchange,routingKey,false); - _replyText = replyText; - _replyCode = replyCode; - } - - public int getReplyCode() - { - return _replyCode; - } - - public AMQShortString getReplyText() - { - return _replyText; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage.java deleted file mode 100644 index e2cb36a030..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.BasicMessageConsumer; - - -/** - * This class contains everything needed to process a JMS message. It assembles the deliver body, the content header and - * the content body/ies. - * - * Note that the actual work of creating a JMS message for the client code's use is done outside of the MINA dispatcher - * thread in order to minimise the amount of work done in the MINA dispatcher thread. - */ -public abstract class UnprocessedMessage implements AMQSession.Dispatchable -{ - private final int _consumerTag; - - - public UnprocessedMessage(int consumerTag) - { - _consumerTag = consumerTag; - } - - - abstract public long getDeliveryTag(); - - - public int getConsumerTag() - { - return _consumerTag; - } - - public void dispatch(AMQSession ssn) - { - ssn.dispatch(this); - } - -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_10.java b/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_10.java deleted file mode 100644 index f31bc88509..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_10.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import org.apache.qpid.transport.MessageTransfer; - -/** - * This class contains everything needed to process a JMS message. It assembles the deliver body, the content header and - * the content body/ies. - * - * Note that the actual work of creating a JMS message for the client code's use is done outside of the MINA dispatcher - * thread in order to minimise the amount of work done in the MINA dispatcher thread. - */ -public class UnprocessedMessage_0_10 extends UnprocessedMessage -{ - private MessageTransfer _transfer; - - public UnprocessedMessage_0_10(MessageTransfer xfr) - { - super(Integer.parseInt(xfr.getDestination())); - _transfer = xfr; - } - - // additional 0_10 method - - public long getDeliveryTag() - { - return _transfer.getId(); - } - - public MessageTransfer getMessageTransfer() - { - return _transfer; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_8.java b/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_8.java deleted file mode 100644 index 685e646d85..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/message/UnprocessedMessage_0_8.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.BasicDeliverBody; -import org.apache.qpid.framing.ContentBody; -import org.apache.qpid.framing.ContentHeaderBody; - -/** - * This class contains everything needed to process a JMS message. It assembles the deliver body, the content header and - * the content body/ies. - * - * Note that the actual work of creating a JMS message for the client code's use is done outside of the MINA dispatcher - * thread in order to minimise the amount of work done in the MINA dispatcher thread. - */ -public class UnprocessedMessage_0_8 extends UnprocessedMessage -{ - private long _bytesReceived = 0; - - - private AMQShortString _exchange; - private AMQShortString _routingKey; - private final long _deliveryId; - protected boolean _redelivered; - - private BasicDeliverBody _deliverBody; - private ContentHeaderBody _contentHeader; - - /** List of ContentBody instances. Due to fragmentation you don't know how big this will be in general */ - private List<ContentBody> _bodies; - - public UnprocessedMessage_0_8(long deliveryId, int consumerTag, AMQShortString exchange, AMQShortString routingKey, boolean redelivered) - { - super(consumerTag); - _exchange = exchange; - _routingKey = routingKey; - - _redelivered = redelivered; - _deliveryId = deliveryId; - } - - - public AMQShortString getExchange() - { - return _exchange; - } - - public AMQShortString getRoutingKey() - { - return _routingKey; - } - - public long getDeliveryTag() - { - return _deliveryId; - } - - public boolean isRedelivered() - { - return _redelivered; - } - - - public void receiveBody(ContentBody body) - { - - if (body.payload != null) - { - final long payloadSize = body.payload.remaining(); - - if (_bodies == null) - { - if (payloadSize == getContentHeader().bodySize) - { - _bodies = Collections.singletonList(body); - } - else - { - _bodies = new ArrayList<ContentBody>(); - _bodies.add(body); - } - - } - else - { - _bodies.add(body); - } - _bytesReceived += payloadSize; - } - } - - public void setMethodBody(BasicDeliverBody deliverBody) - { - _deliverBody = deliverBody; - } - - public void setContentHeader(ContentHeaderBody contentHeader) - { - this._contentHeader = contentHeader; - } - - public boolean isAllBodyDataReceived() - { - return _bytesReceived == getContentHeader().bodySize; - } - - public BasicDeliverBody getDeliverBody() - { - return _deliverBody; - } - - public ContentHeaderBody getContentHeader() - { - return _contentHeader; - } - - public List<ContentBody> getBodies() - { - return _bodies; - } - - public String toString() - { - StringBuilder buf = new StringBuilder(); - - if (_contentHeader != null) - { - buf.append("ContentHeader " + _contentHeader); - } - if(_deliverBody != null) - { - buf.append("Delivery tag " + _deliverBody.getDeliveryTag()); - buf.append("Consumer tag " + _deliverBody.getConsumerTag()); - buf.append("Deliver Body " + _deliverBody); - } - - return buf.toString(); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/messaging/address/AddressHelper.java b/java/client/src/main/java/org/apache/qpid/client/messaging/address/AddressHelper.java deleted file mode 100644 index 368ec60525..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/messaging/address/AddressHelper.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * - * 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.qpid.client.messaging.address; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQDestination.Binding; -import org.apache.qpid.client.messaging.address.Link.Reliability; -import org.apache.qpid.client.messaging.address.Link.Subscription; -import org.apache.qpid.client.messaging.address.Node.ExchangeNode; -import org.apache.qpid.client.messaging.address.Node.QueueNode; -import org.apache.qpid.client.messaging.address.Node.UnknownNodeType; -import org.apache.qpid.configuration.Accessor; -import org.apache.qpid.configuration.Accessor.MapAccessor; -import org.apache.qpid.messaging.Address; - -/** - * Utility class for extracting information from the address class - */ -public class AddressHelper -{ - public static final String NODE = "node"; - public static final String LINK = "link"; - public static final String X_DECLARE = "x-declare"; - public static final String X_BINDINGS = "x-bindings"; - public static final String X_SUBSCRIBE = "x-subscribes"; - public static final String CREATE = "create"; - public static final String ASSERT = "assert"; - public static final String DELETE = "delete"; - public static final String FILTER = "filter"; - public static final String NO_LOCAL = "no-local"; - public static final String DURABLE = "durable"; - public static final String EXCLUSIVE = "exclusive"; - public static final String AUTO_DELETE = "auto-delete"; - public static final String TYPE = "type"; - public static final String ALT_EXCHANGE = "alternate-exchange"; - public static final String BINDINGS = "bindings"; - public static final String BROWSE = "browse"; - public static final String MODE = "mode"; - public static final String CAPACITY = "capacity"; - public static final String CAPACITY_SOURCE = "source"; - public static final String CAPACITY_TARGET = "target"; - public static final String NAME = "name"; - public static final String EXCHANGE = "exchange"; - public static final String QUEUE = "queue"; - public static final String KEY = "key"; - public static final String ARGUMENTS = "arguments"; - public static final String RELIABILITY = "reliability"; - - private Address address; - private Accessor addressProps; - private Accessor nodeProps; - private Accessor linkProps; - - public AddressHelper(Address address) - { - this.address = address; - addressProps = new MapAccessor(address.getOptions()); - Map node_props = address.getOptions() == null - || address.getOptions().get(NODE) == null ? null - : (Map) address.getOptions().get(NODE); - - if (node_props != null) - { - nodeProps = new MapAccessor(node_props); - } - - Map link_props = address.getOptions() == null - || address.getOptions().get(LINK) == null ? null - : (Map) address.getOptions().get(LINK); - - if (link_props != null) - { - linkProps = new MapAccessor(link_props); - } - } - - public String getCreate() - { - return addressProps.getString(CREATE); - } - - public String getAssert() - { - return addressProps.getString(ASSERT); - } - - public String getDelete() - { - return addressProps.getString(DELETE); - } - - public boolean isNoLocal() - { - Boolean b = nodeProps.getBoolean(NO_LOCAL); - return b == null ? false : b; - } - - public boolean isBrowseOnly() - { - String mode = addressProps.getString(MODE); - return mode != null && mode.equals(BROWSE) ? true : false; - } - - @SuppressWarnings("unchecked") - public List<Binding> getBindings(Map props) - { - List<Binding> bindings = new ArrayList<Binding>(); - List<Map> bindingList = (List<Map>) props.get(X_BINDINGS); - if (bindingList != null) - { - for (Map bindingMap : bindingList) - { - Binding binding = new Binding( - (String) bindingMap.get(EXCHANGE), - (String) bindingMap.get(QUEUE), - (String) bindingMap.get(KEY), - bindingMap.get(ARGUMENTS) == null ? Collections.EMPTY_MAP - : (Map<String, Object>) bindingMap - .get(ARGUMENTS)); - bindings.add(binding); - } - } - return bindings; - } - - public Map getDeclareArgs(Map props) - { - if (props != null && props.get(X_DECLARE) != null) - { - return (Map) props.get(X_DECLARE); - - } else - { - return Collections.EMPTY_MAP; - } - } - - public int getTargetNodeType() throws Exception - { - if (nodeProps == null || nodeProps.getString(TYPE) == null) - { - // need to query and figure out - return AMQDestination.UNKNOWN_TYPE; - } else if (nodeProps.getString(TYPE).equals("queue")) - { - return AMQDestination.QUEUE_TYPE; - } else if (nodeProps.getString(TYPE).equals("topic")) - { - return AMQDestination.TOPIC_TYPE; - } else - { - throw new Exception("unkown exchange type"); - } - } - - public Node getTargetNode(int addressType) - { - // target node here is the default exchange - if (nodeProps == null || addressType == AMQDestination.QUEUE_TYPE) - { - return new ExchangeNode(); - } else if (addressType == AMQDestination.TOPIC_TYPE) - { - Map node = (Map) address.getOptions().get(NODE); - return createExchangeNode(node); - } else - { - // don't know yet - return null; - } - } - - private Node createExchangeNode(Map parent) - { - Map declareArgs = getDeclareArgs(parent); - MapAccessor argsMap = new MapAccessor(declareArgs); - ExchangeNode node = new ExchangeNode(); - node.setExchangeType(argsMap.getString(TYPE) == null ? null : argsMap - .getString(TYPE)); - fillInCommonNodeArgs(node, parent, argsMap); - return node; - } - - private Node createQueueNode(Map parent) - { - Map declareArgs = getDeclareArgs(parent); - MapAccessor argsMap = new MapAccessor(declareArgs); - QueueNode node = new QueueNode(); - node.setAlternateExchange(argsMap.getString(ALT_EXCHANGE)); - node.setExclusive(argsMap.getBoolean(EXCLUSIVE) == null ? false - : argsMap.getBoolean(EXCLUSIVE)); - fillInCommonNodeArgs(node, parent, argsMap); - - return node; - } - - private void fillInCommonNodeArgs(Node node, Map parent, MapAccessor argsMap) - { - node.setDurable(getDurability(parent)); - node.setAutoDelete(argsMap.getBoolean(AUTO_DELETE) == null ? false - : argsMap.getBoolean(AUTO_DELETE)); - node.setAlternateExchange(argsMap.getString(ALT_EXCHANGE)); - node.setBindings(getBindings(parent)); - if (getDeclareArgs(parent).containsKey(ARGUMENTS)) - { - node.setDeclareArgs((Map<String,Object>)getDeclareArgs(parent).get(ARGUMENTS)); - } - } - - private boolean getDurability(Map map) - { - Accessor access = new MapAccessor(map); - Boolean result = access.getBoolean(DURABLE); - return (result == null) ? false : result.booleanValue(); - } - - /** - * if the type == queue x-declare args from the node props is used. if the - * type == exchange x-declare args from the link props is used else just - * create a default temp queue. - */ - public Node getSourceNode(int addressType) - { - if (addressType == AMQDestination.QUEUE_TYPE && nodeProps != null) - { - return createQueueNode((Map) address.getOptions().get(NODE)); - } - if (addressType == AMQDestination.TOPIC_TYPE && linkProps != null) - { - return createQueueNode((Map) address.getOptions().get(LINK)); - } else - { - // need to query the info - return new QueueNode(); - } - } - - public Link getLink() throws Exception - { - Link link = new Link(); - link.setSubscription(new Subscription()); - if (linkProps != null) - { - link.setDurable(linkProps.getBoolean(DURABLE) == null ? false - : linkProps.getBoolean(DURABLE)); - link.setName(linkProps.getString(NAME)); - - String reliability = linkProps.getString(RELIABILITY); - if ( reliability != null) - { - if (reliability.equalsIgnoreCase("unreliable")) - { - link.setReliability(Reliability.UNRELIABLE); - } - else if (reliability.equalsIgnoreCase("at-least-once")) - { - link.setReliability(Reliability.AT_LEAST_ONCE); - } - else - { - throw new Exception("The reliability mode '" + - reliability + "' is not yet supported"); - } - - } - - if (((Map) address.getOptions().get(LINK)).get(CAPACITY) instanceof Map) - { - MapAccessor capacityProps = new MapAccessor( - (Map) ((Map) address.getOptions().get(LINK)) - .get(CAPACITY)); - link - .setConsumerCapacity(capacityProps - .getInt(CAPACITY_SOURCE) == null ? 0 - : capacityProps.getInt(CAPACITY_SOURCE)); - link - .setProducerCapacity(capacityProps - .getInt(CAPACITY_TARGET) == null ? 0 - : capacityProps.getInt(CAPACITY_TARGET)); - } - else - { - int cap = linkProps.getInt(CAPACITY) == null ? 0 : linkProps - .getInt(CAPACITY); - link.setConsumerCapacity(cap); - link.setProducerCapacity(cap); - } - link.setFilter(linkProps.getString(FILTER)); - // so far filter type not used - - if (((Map) address.getOptions().get(LINK)).containsKey(X_SUBSCRIBE)) - { - Map x_subscribe = (Map)((Map) address.getOptions().get(LINK)).get(X_SUBSCRIBE); - - if (x_subscribe.containsKey(ARGUMENTS)) - { - link.getSubscription().setArgs((Map<String,Object>)x_subscribe.get(ARGUMENTS)); - } - - boolean exclusive = x_subscribe.containsKey(EXCLUSIVE) ? - Boolean.parseBoolean((String)x_subscribe.get(EXCLUSIVE)): false; - - link.getSubscription().setExclusive(exclusive); - } - } - - return link; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/messaging/address/Link.java b/java/client/src/main/java/org/apache/qpid/client/messaging/address/Link.java deleted file mode 100644 index 5f97d625b4..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/messaging/address/Link.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * - * 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.qpid.client.messaging.address; - -import static org.apache.qpid.client.messaging.address.Link.Reliability.UNSPECIFIED; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.qpid.client.messaging.address.Node.QueueNode; - -public class Link -{ - public enum FilterType { SQL92, XQUERY, SUBJECT } - - public enum Reliability { UNRELIABLE, AT_MOST_ONCE, AT_LEAST_ONCE, EXACTLY_ONCE, UNSPECIFIED } - - protected String name; - protected String _filter; - protected FilterType _filterType = FilterType.SUBJECT; - protected boolean _isNoLocal; - protected boolean _isDurable; - protected int _consumerCapacity = 0; - protected int _producerCapacity = 0; - protected Node node; - protected Subscription subscription; - protected Reliability reliability = UNSPECIFIED; - - public Reliability getReliability() - { - return reliability; - } - - public void setReliability(Reliability reliability) - { - this.reliability = reliability; - } - - public Node getNode() - { - return node; - } - - public void setNode(Node node) - { - this.node = node; - } - - public boolean isDurable() - { - return _isDurable; - } - - public void setDurable(boolean durable) - { - _isDurable = durable; - } - - public String getFilter() - { - return _filter; - } - - public void setFilter(String filter) - { - this._filter = filter; - } - - public FilterType getFilterType() - { - return _filterType; - } - - public void setFilterType(FilterType type) - { - _filterType = type; - } - - public boolean isNoLocal() - { - return _isNoLocal; - } - - public void setNoLocal(boolean noLocal) - { - _isNoLocal = noLocal; - } - - public int getConsumerCapacity() - { - return _consumerCapacity; - } - - public void setConsumerCapacity(int capacity) - { - _consumerCapacity = capacity; - } - - public int getProducerCapacity() - { - return _producerCapacity; - } - - public void setProducerCapacity(int capacity) - { - _producerCapacity = capacity; - } - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public Subscription getSubscription() - { - return this.subscription; - } - - public void setSubscription(Subscription subscription) - { - this.subscription = subscription; - } - - public static class Subscription - { - private Map<String,Object> args = new HashMap<String,Object>(); - private boolean exclusive = false; - - public Map<String, Object> getArgs() - { - return args; - } - - public void setArgs(Map<String, Object> args) - { - this.args = args; - } - - public boolean isExclusive() - { - return exclusive; - } - - public void setExclusive(boolean exclusive) - { - this.exclusive = exclusive; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/messaging/address/Node.java b/java/client/src/main/java/org/apache/qpid/client/messaging/address/Node.java deleted file mode 100644 index c98b194334..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/messaging/address/Node.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * - * 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.qpid.client.messaging.address; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import javax.naming.OperationNotSupportedException; - -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQDestination.Binding; - -public abstract class Node -{ - protected int _nodeType = AMQDestination.UNKNOWN_TYPE; - protected boolean _isDurable; - protected boolean _isAutoDelete; - protected String _alternateExchange; - protected List<Binding> _bindings = new ArrayList<Binding>(); - protected Map<String,Object> _declareArgs = Collections.emptyMap(); - - public int getType() - { - return _nodeType; - } - - public boolean isDurable() - { - return _isDurable; - } - - public void setDurable(boolean durable) - { - _isDurable = durable; - } - - public boolean isAutoDelete() - { - return _isAutoDelete; - } - - public void setAutoDelete(boolean autoDelete) - { - _isAutoDelete = autoDelete; - } - - public String getAlternateExchange() - { - return _alternateExchange; - } - - public void setAlternateExchange(String altExchange) - { - _alternateExchange = altExchange; - } - - public List<Binding> getBindings() - { - return _bindings; - } - - public void setBindings(List<Binding> bindings) - { - _bindings = bindings; - } - - public void addBinding(Binding binding) { - this._bindings.add(binding); - } - - public Map<String,Object> getDeclareArgs() - { - return _declareArgs; - } - - public void setDeclareArgs(Map<String,Object> options) - { - _declareArgs = options; - } - - public static class QueueNode extends Node - { - protected boolean _isExclusive; - protected QpidQueueOptions _queueOptions = new QpidQueueOptions(); - - public QueueNode() - { - _nodeType = AMQDestination.QUEUE_TYPE; - } - - public boolean isExclusive() - { - return _isExclusive; - } - - public void setExclusive(boolean exclusive) - { - _isExclusive = exclusive; - } - } - - public static class ExchangeNode extends Node - { - protected QpidExchangeOptions _exchangeOptions = new QpidExchangeOptions(); - protected String _exchangeType; - - public ExchangeNode() - { - _nodeType = AMQDestination.TOPIC_TYPE; - } - - public String getExchangeType() - { - return _exchangeType; - } - - public void setExchangeType(String exchangeType) - { - _exchangeType = exchangeType; - } - - } - - public static class UnknownNodeType extends Node - { - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidExchangeOptions.java b/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidExchangeOptions.java deleted file mode 100644 index 3ad9aff9ea..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidExchangeOptions.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * 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.qpid.client.messaging.address; - -import java.util.HashMap; - -public class QpidExchangeOptions extends HashMap<String,Object> -{ - public static final String QPID_MSG_SEQUENCE = "qpid.msg_sequence"; - public static final String QPID_INITIAL_VALUE_EXCHANGE = "qpid.ive"; - public static final String QPID_EXCLUSIVE_BINDING = "qpid.exclusive-binding"; - - public void setMessageSequencing() - { - this.put(QPID_MSG_SEQUENCE, 1); - } - - public void setInitialValueExchange() - { - this.put(QPID_INITIAL_VALUE_EXCHANGE, 1); - } - - public void setExclusiveBinding() - { - this.put(QPID_EXCLUSIVE_BINDING, 1); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidQueueOptions.java b/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidQueueOptions.java deleted file mode 100644 index 04aa7d146f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/messaging/address/QpidQueueOptions.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * - * 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.qpid.client.messaging.address; - -import java.util.HashMap; - -public class QpidQueueOptions extends HashMap<String,Object> -{ - public static final String QPID_MAX_COUNT = "qpid.max_count"; - public static final String QPID_MAX_SIZE = "qpid.max_size"; - public static final String QPID_POLICY_TYPE = "qpid.policy_type"; - public static final String QPID_PERSIST_LAST_NODE = "qpid.persist_last_node"; - public static final String QPID_LVQ_KEY = "qpid.LVQ_key"; - public static final String QPID_LAST_VALUE_QUEUE = "qpid.last_value_queue"; - public static final String QPID_LAST_VALUE_QUEUE_NO_BROWSE = "qpid.last_value_queue_no_browse"; - public static final String QPID_QUEUE_EVENT_GENERATION = "qpid.queue_event_generation"; - - public void validatePolicyType(String type) - { - if (type == null || - !("reject".equals(type) || "flow_to_disk".equals(type) || - "ring".equals(type) || "ring_strict".equals(type))) - { - throw new IllegalArgumentException("Invalid Queue Policy Type" + - " should be one of {reject|flow_to_disk|ring|ring_strict}"); - } - } - - public void setPolicyType(String s) - { - validatePolicyType(s); - this.put(QPID_POLICY_TYPE, s); - } - - public void setMaxCount(Integer i) - { - this.put(QPID_MAX_COUNT, i); - } - - public void setMaxSize(Integer i) - { - this.put(QPID_MAX_SIZE, i); - } - - public void setPersistLastNode() - { - this.put(QPID_PERSIST_LAST_NODE, 1); - } - - public void setOrderingPolicy(String s) - { - if (QpidQueueOptions.QPID_LAST_VALUE_QUEUE.equals(s)) - { - this.put(QPID_LAST_VALUE_QUEUE, 1); - } - else if (QpidQueueOptions.QPID_LAST_VALUE_QUEUE_NO_BROWSE.equals(s)) - { - this.put(QPID_LAST_VALUE_QUEUE_NO_BROWSE,1); - } - else - { - throw new IllegalArgumentException("Invalid Ordering Policy" + - " should be one of {" + QpidQueueOptions.QPID_LAST_VALUE_QUEUE + "|" + - QPID_LAST_VALUE_QUEUE_NO_BROWSE + "}"); - } - } - - public void setLvqKey(String key) - { - this.put(QPID_LVQ_KEY, key); - } - - public void setQueueEvents(String value) - { - if (value != null && (value.equals("1") || value.equals("2"))) - { - this.put(QPID_QUEUE_EVENT_GENERATION, value); - } - else - { - throw new IllegalArgumentException("Invalid value for " + - QPID_QUEUE_EVENT_GENERATION + " should be one of {1|2}"); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java deleted file mode 100644 index eb5af119b2..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java +++ /dev/null @@ -1,881 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import java.io.IOException; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import org.apache.mina.filter.codec.ProtocolCodecException; -import org.apache.qpid.AMQConnectionClosedException; -import org.apache.qpid.AMQDisconnectedException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQTimeoutException; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.failover.FailoverHandler; -import org.apache.qpid.client.failover.FailoverState; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.StateWaiter; -import org.apache.qpid.client.state.listener.SpecificMethodFrameListener; -import org.apache.qpid.codec.AMQCodecFactory; -import org.apache.qpid.framing.AMQBody; -import org.apache.qpid.framing.AMQDataBlock; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ConnectionCloseBody; -import org.apache.qpid.framing.ConnectionCloseOkBody; -import org.apache.qpid.framing.HeartbeatBody; -import org.apache.qpid.framing.MethodRegistry; -import org.apache.qpid.framing.ProtocolInitiation; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.pool.Job; -import org.apache.qpid.pool.ReferenceCountingExecutorService; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.apache.qpid.protocol.AMQMethodListener; -import org.apache.qpid.protocol.ProtocolEngine; -import org.apache.qpid.thread.Threading; -import org.apache.qpid.transport.NetworkDriver; -import org.apache.qpid.transport.network.io.IoTransport; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * AMQProtocolHandler is the client side protocol handler for AMQP, it handles all protocol events received from the - * network by MINA. The primary purpose of AMQProtocolHandler is to translate the generic event model of MINA into the - * specific event model of AMQP, by revealing the type of the received events (from decoded data), and passing the - * event on to more specific handlers for the type. In this sense, it channels the richer event model of AMQP, - * expressed in terms of methods and so on, through the cruder, general purpose event model of MINA, expressed in - * terms of "message received" and so on. - * - * <p/>There is a 1:1 mapping between an AMQProtocolHandler and an {@link AMQConnection}. The connection class is - * exposed to the end user of the AMQP client API, and also implements the JMS Connection API, so provides the public - * API calls through which an individual connection can be manipulated. This protocol handler talks to the network - * through MINA, in a behind the scenes role; it is not an exposed part of the client API. - * - * <p/>There is a 1:many mapping between an AMQProtocolHandler and a set of {@link AMQSession}s. At the MINA level, - * there is one session per connection. At the AMQP level there can be many channels which are also called sessions in - * JMS parlance. The {@link AMQSession}s are managed through an {@link AMQProtocolSession} instance. The protocol - * session is similar to the MINA per-connection session, except that it can span the lifecycle of multiple MINA sessions - * in the event of failover. See below for more information about this. - * - * <p/>Mina provides a session container that can be used to store/retrieve arbitrary objects as String named - * attributes. A more convenient, type-safe, container for session data is provided in the form of - * {@link AMQProtocolSession}. - * - * <p/>A common way to use MINA is to have a single instance of the event handler, and for MINA to pass in its session - * object with every event, and for per-connection data to be held in the MINA session (perhaps using a type-safe wrapper - * as described above). This event handler is different, because dealing with failover complicates things. To the - * end client of an AMQConnection, a failed over connection is still handled through the same connection instance, but - * behind the scenes a new transport connection, and MINA session will have been created. The MINA session object cannot - * be used to track the state of the fail-over process, because it is destroyed and a new one is created, as the old - * connection is shutdown and a new one created. For this reason, an AMQProtocolHandler is created per AMQConnection - * and the protocol session data is held outside of the MINA IOSession. - * - * <p/>This handler is responsible for setting up the filter chain to filter all events for this handler through. - * The filter chain is set up as a stack of event handers that perform the following functions (working upwards from - * the network traffic at the bottom), handing off incoming events to an asynchronous thread pool to do the work, - * optionally handling secure sockets encoding/decoding, encoding/decoding the AMQP format itself. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Maintain fail-over state. - * <tr><td> - * </table> - * - * @todo Use a single handler instance, by shifting everything to do with the 'protocol session' state, including - * failover state, into AMQProtocolSession, and tracking that from AMQConnection? The lifecycles of - * AMQProtocolSesssion and AMQConnection will be the same, so if there is high cohesion between them, they could - * be merged, although there is sense in keeping the session model separate. Will clarify things by having data - * held per protocol handler, per protocol session, per network connection, per channel, in separate classes, so - * that lifecycles of the fields match lifecycles of their containing objects. - */ -public class AMQProtocolHandler implements ProtocolEngine -{ - /** Used for debugging. */ - private static final Logger _logger = LoggerFactory.getLogger(AMQProtocolHandler.class); - private static final Logger _protocolLogger = LoggerFactory.getLogger("qpid.protocol"); - private static final boolean PROTOCOL_DEBUG = (System.getProperty("amqj.protocol.logging.level") != null); - - private static final long MAXIMUM_STATE_WAIT_TIME = Long.parseLong(System.getProperty("amqj.MaximumStateWait", "30000")); - - /** - * The connection that this protocol handler is associated with. There is a 1-1 mapping between connection - * instances and protocol handler instances. - */ - private AMQConnection _connection; - - /** Our wrapper for a protocol session that provides access to session values in a typesafe manner. */ - private volatile AMQProtocolSession _protocolSession; - - /** Holds the state of the protocol session. */ - private AMQStateManager _stateManager; - - /** Holds the method listeners, */ - private final CopyOnWriteArraySet<AMQMethodListener> _frameListeners = new CopyOnWriteArraySet<AMQMethodListener>(); - - /** - * We create the failover handler when the session is created since it needs a reference to the IoSession in order - * to be able to send errors during failover back to the client application. The session won't be available in the - * case where we failing over due to a Connection.Redirect message from the broker. - */ - private FailoverHandler _failoverHandler; - - /** - * This flag is used to track whether failover is being attempted. It is used to prevent the application constantly - * attempting failover where it is failing. - */ - private FailoverState _failoverState = FailoverState.NOT_STARTED; - - /** Used to provide a condition to wait upon for operations that are required to wait for failover to complete. */ - private CountDownLatch _failoverLatch; - - /** The last failover exception that occurred */ - private FailoverException _lastFailoverException; - - /** Defines the default timeout to use for synchronous protocol commands. */ - private final long DEFAULT_SYNC_TIMEOUT = Long.getLong("amqj.default_syncwrite_timeout", 1000 * 30); - - /** Object to lock on when changing the latch */ - private Object _failoverLatchChange = new Object(); - private AMQCodecFactory _codecFactory; - private Job _readJob; - private Job _writeJob; - private ReferenceCountingExecutorService _poolReference = ReferenceCountingExecutorService.getInstance(); - private NetworkDriver _networkDriver; - private ProtocolVersion _suggestedProtocolVersion; - - private long _writtenBytes; - private long _readBytes; - - /** - * Creates a new protocol handler, associated with the specified client connection instance. - * - * @param con The client connection that this is the event handler for. - */ - public AMQProtocolHandler(AMQConnection con) - { - _connection = con; - _protocolSession = new AMQProtocolSession(this, _connection); - _stateManager = new AMQStateManager(_protocolSession); - _codecFactory = new AMQCodecFactory(false, _protocolSession); - _poolReference.setThreadFactory(new ThreadFactory() - { - - public Thread newThread(final Runnable runnable) - { - try - { - return Threading.getThreadFactory().createThread(runnable); - } - catch (Exception e) - { - throw new RuntimeException("Failed to create thread", e); - } - } - }); - _readJob = new Job(_poolReference, Job.MAX_JOB_EVENTS, true); - _writeJob = new Job(_poolReference, Job.MAX_JOB_EVENTS, false); - _poolReference.acquireExecutorService(); - _failoverHandler = new FailoverHandler(this); - } - - /** - * Called when we want to create a new IoTransport session - * @param brokerDetail - */ - public void createIoTransportSession(BrokerDetails brokerDetail) - { - _protocolSession = new AMQProtocolSession(this, _connection); - _stateManager.setProtocolSession(_protocolSession); - IoTransport.connect_0_9(getProtocolSession(), - brokerDetail.getHost(), - brokerDetail.getPort(), - brokerDetail.getBooleanProperty(BrokerDetails.OPTIONS_SSL)); - _protocolSession.init(); - } - - /** - * Called when the network connection is closed. This can happen, either because the client explicitly requested - * that the connection be closed, in which case nothing is done, or because the connection died. In the case - * where the connection died, an attempt to failover automatically to a new connection may be started. The failover - * process will be started, provided that it is the clients policy to allow failover, and provided that a failover - * has not already been started or failed. - * - * @todo Clarify: presumably exceptionCaught is called when the client is sending during a connection failure and - * not otherwise? The above comment doesn't make that clear. - */ - public void closed() - { - if (_connection.isClosed()) - { - _logger.debug("Session closed called by client"); - } - else - { - _logger.debug("Session closed called with failover state currently " + _failoverState); - - // reconnetablility was introduced here so as not to disturb the client as they have made their intentions - // known through the policy settings. - - if ((_failoverState != FailoverState.IN_PROGRESS) && _connection.failoverAllowed()) - { - _logger.debug("FAILOVER STARTING"); - if (_failoverState == FailoverState.NOT_STARTED) - { - _failoverState = FailoverState.IN_PROGRESS; - startFailoverThread(); - } - else - { - _logger.debug("Not starting failover as state currently " + _failoverState); - } - } - else - { - _logger.debug("Failover not allowed by policy."); // or already in progress? - - if (_logger.isDebugEnabled()) - { - _logger.debug(_connection.getFailoverPolicy().toString()); - } - - if (_failoverState != FailoverState.IN_PROGRESS) - { - _logger.debug("sessionClose() not allowed to failover"); - _connection.exceptionReceived(new AMQDisconnectedException( - "Server closed connection and reconnection " + "not permitted.", - _stateManager.getLastException())); - } - else - { - _logger.debug("sessionClose() failover in progress"); - } - } - } - - _logger.debug("Protocol Session [" + this + "] closed"); - } - - /** See {@link FailoverHandler} to see rationale for separate thread. */ - private void startFailoverThread() - { - if(!_connection.isClosed()) - { - final Thread failoverThread; - try - { - failoverThread = Threading.getThreadFactory().createThread(_failoverHandler); - } - catch (Exception e) - { - throw new RuntimeException("Failed to create thread", e); - } - failoverThread.setName("Failover"); - // Do not inherit daemon-ness from current thread as this can be a daemon - // thread such as a AnonymousIoService thread. - failoverThread.setDaemon(false); - failoverThread.start(); - } - } - - public void readerIdle() - { - _logger.debug("Protocol Session [" + this + "] idle: reader"); - // failover: - HeartbeatDiagnostics.timeout(); - _logger.warn("Timed out while waiting for heartbeat from peer."); - _networkDriver.close(); - } - - public void writerIdle() - { - _logger.debug("Protocol Session [" + this + "] idle: reader"); - writeFrame(HeartbeatBody.FRAME); - HeartbeatDiagnostics.sent(); - } - - /** - * Invoked when any exception is thrown by the NetworkDriver - */ - public void exception(Throwable cause) - { - if (_failoverState == FailoverState.NOT_STARTED) - { - // if (!(cause instanceof AMQUndeliveredException) && (!(cause instanceof AMQAuthenticationException))) - if ((cause instanceof AMQConnectionClosedException) || cause instanceof IOException) - { - _logger.info("Exception caught therefore going to attempt failover: " + cause, cause); - // this will attempt failover - _networkDriver.close(); - closed(); - } - else - { - - if (cause instanceof ProtocolCodecException) - { - _logger.info("Protocol Exception caught NOT going to attempt failover as " + - "cause isn't AMQConnectionClosedException: " + cause, cause); - - AMQException amqe = new AMQException("Protocol handler error: " + cause, cause); - propagateExceptionToAllWaiters(amqe); - } - _connection.exceptionReceived(cause); - - } - - // FIXME Need to correctly handle other exceptions. Things like ... - // if (cause instanceof AMQChannelClosedException) - // which will cause the JMSSession to end due to a channel close and so that Session needs - // to be removed from the map so we can correctly still call close without an exception when trying to close - // the server closed session. See also CloseChannelMethodHandler as the sessionClose is never called on exception - } - // we reach this point if failover was attempted and failed therefore we need to let the calling app - // know since we cannot recover the situation - else if (_failoverState == FailoverState.FAILED) - { - _logger.error("Exception caught by protocol handler: " + cause, cause); - - // we notify the state manager of the error in case we have any clients waiting on a state - // change. Those "waiters" will be interrupted and can handle the exception - AMQException amqe = new AMQException("Protocol handler error: " + cause, cause); - propagateExceptionToAllWaiters(amqe); - _connection.exceptionReceived(cause); - } - } - - /** - * There are two cases where we have other threads potentially blocking for events to be handled by this class. - * These are for the state manager (waiting for a state change) or a frame listener (waiting for a particular type - * of frame to arrive). When an error occurs we need to notify these waiters so that they can react appropriately. - * - * This should be called only when the exception is fatal for the connection. - * - * @param e the exception to propagate - * - * @see #propagateExceptionToFrameListeners - */ - public void propagateExceptionToAllWaiters(Exception e) - { - getStateManager().error(e); - - propagateExceptionToFrameListeners(e); - } - - /** - * This caters for the case where we only need to propagate an exception to the the frame listeners to interupt any - * protocol level waits. - * - * This will would normally be used to notify all Frame Listeners that Failover is about to occur and they should - * stop waiting and relinquish the Failover lock {@see FailoverHandler}. - * - * Once the {@link FailoverHandler} has re-established the connection then the listeners will be able to re-attempt - * their protocol request and so listen again for the correct frame. - * - * @param e the exception to propagate - */ - public void propagateExceptionToFrameListeners(Exception e) - { - synchronized (_frameListeners) - { - if (!_frameListeners.isEmpty()) - { - final Iterator it = _frameListeners.iterator(); - while (it.hasNext()) - { - final AMQMethodListener ml = (AMQMethodListener) it.next(); - ml.error(e); - } - } - } - } - - public void notifyFailoverStarting() - { - // Set the last exception in the sync block to ensure the ordering with add. - // either this gets done and the add does the ml.error - // or the add completes first and the iterator below will do ml.error - synchronized (_frameListeners) - { - _lastFailoverException = new FailoverException("Failing over about to start"); - } - - //Only notify the Frame listeners that failover is going to occur as the State listeners shouldn't be - // interrupted unless failover cannot restore the state. - propagateExceptionToFrameListeners(_lastFailoverException); - } - - public void failoverInProgress() - { - _lastFailoverException = null; - } - - private static int _messageReceivedCount; - - - public void received(ByteBuffer msg) - { - try - { - _readBytes += msg.remaining(); - final ArrayList<AMQDataBlock> dataBlocks = _codecFactory.getDecoder().decodeBuffer(msg); - - Job.fireAsynchEvent(_poolReference.getPool(), _readJob, new Runnable() - { - - public void run() - { - // Decode buffer - - for (AMQDataBlock message : dataBlocks) - { - - try - { - if (PROTOCOL_DEBUG) - { - _protocolLogger.info(String.format("RECV: [%s] %s", this, message)); - } - - if(message instanceof AMQFrame) - { - final boolean debug = _logger.isDebugEnabled(); - final long msgNumber = ++_messageReceivedCount; - - if (debug && ((msgNumber % 1000) == 0)) - { - _logger.debug("Received " + _messageReceivedCount + " protocol messages"); - } - - AMQFrame frame = (AMQFrame) message; - - final AMQBody bodyFrame = frame.getBodyFrame(); - - HeartbeatDiagnostics.received(bodyFrame instanceof HeartbeatBody); - - bodyFrame.handle(frame.getChannel(), _protocolSession); - - _connection.bytesReceived(_readBytes); - } - else if (message instanceof ProtocolInitiation) - { - // We get here if the server sends a response to our initial protocol header - // suggesting an alternate ProtocolVersion; the server will then close the - // connection. - ProtocolInitiation protocolInit = (ProtocolInitiation) message; - _suggestedProtocolVersion = protocolInit.checkVersion(); - _logger.info("Broker suggested using protocol version:" + _suggestedProtocolVersion); - - // get round a bug in old versions of qpid whereby the connection is not closed - _stateManager.changeState(AMQState.CONNECTION_CLOSED); - } - } - catch (Exception e) - { - _logger.error("Exception processing frame", e); - propagateExceptionToFrameListeners(e); - exception(e); - } - } - } - }); - } - catch (Exception e) - { - propagateExceptionToFrameListeners(e); - exception(e); - } - } - - public void methodBodyReceived(final int channelId, final AMQBody bodyFrame) - throws AMQException - { - - if (_logger.isDebugEnabled()) - { - _logger.debug("(" + System.identityHashCode(this) + ")Method frame received: " + bodyFrame); - } - - final AMQMethodEvent<AMQMethodBody> evt = - new AMQMethodEvent<AMQMethodBody>(channelId, (AMQMethodBody) bodyFrame); - - try - { - - boolean wasAnyoneInterested = getStateManager().methodReceived(evt); - synchronized (_frameListeners) - { - if (!_frameListeners.isEmpty()) - { - //This iterator is safe from the error state as the frame listeners always add before they send so their - // will be ready and waiting for this response. - Iterator it = _frameListeners.iterator(); - while (it.hasNext()) - { - final AMQMethodListener listener = (AMQMethodListener) it.next(); - wasAnyoneInterested = listener.methodReceived(evt) || wasAnyoneInterested; - } - } - } - if (!wasAnyoneInterested) - { - throw new AMQException(null, "AMQMethodEvent " + evt + " was not processed by any listener. Listeners:" - + _frameListeners, null); - } - } - catch (AMQException e) - { - propagateExceptionToFrameListeners(e); - - exception(e); - } - - } - - private static int _messagesOut; - - public StateWaiter createWaiter(Set<AMQState> states) throws AMQException - { - return getStateManager().createWaiter(states); - } - - /** - * Convenience method that writes a frame to the protocol session. Equivalent to calling - * getProtocolSession().write(). - * - * @param frame the frame to write - */ - public void writeFrame(AMQDataBlock frame) - { - writeFrame(frame, false); - } - - public void writeFrame(AMQDataBlock frame, boolean wait) - { - final ByteBuffer buf = frame.toNioByteBuffer(); - _writtenBytes += buf.remaining(); - Job.fireAsynchEvent(_poolReference.getPool(), _writeJob, new Runnable() - { - public void run() - { - _networkDriver.send(buf); - } - }); - if (PROTOCOL_DEBUG) - { - _protocolLogger.debug(String.format("SEND: [%s] %s", this, frame)); - } - - final long sentMessages = _messagesOut++; - - final boolean debug = _logger.isDebugEnabled(); - - if (debug && ((sentMessages % 1000) == 0)) - { - _logger.debug("Sent " + _messagesOut + " protocol messages"); - } - - _connection.bytesSent(_writtenBytes); - - if (wait) - { - _networkDriver.flush(); - } - } - - /** - * Convenience method that writes a frame to the protocol session and waits for a particular response. Equivalent to - * calling getProtocolSession().write() then waiting for the response. - * - * @param frame - * @param listener the blocking listener. Note the calling thread will block. - */ - public AMQMethodEvent writeCommandFrameAndWaitForReply(AMQFrame frame, BlockingMethodFrameListener listener) - throws AMQException, FailoverException - { - return writeCommandFrameAndWaitForReply(frame, listener, DEFAULT_SYNC_TIMEOUT); - } - - /** - * Convenience method that writes a frame to the protocol session and waits for a particular response. Equivalent to - * calling getProtocolSession().write() then waiting for the response. - * - * @param frame - * @param listener the blocking listener. Note the calling thread will block. - */ - public AMQMethodEvent writeCommandFrameAndWaitForReply(AMQFrame frame, BlockingMethodFrameListener listener, - long timeout) throws AMQException, FailoverException - { - try - { - synchronized (_frameListeners) - { - if (_lastFailoverException != null) - { - throw _lastFailoverException; - } - - if(_stateManager.getCurrentState() == AMQState.CONNECTION_CLOSED || - _stateManager.getCurrentState() == AMQState.CONNECTION_CLOSING) - { - Exception e = _stateManager.getLastException(); - if (e != null) - { - if (e instanceof AMQException) - { - AMQException amqe = (AMQException) e; - - throw amqe.cloneForCurrentThread(); - } - else - { - throw new AMQException(AMQConstant.INTERNAL_ERROR, e.getMessage(), e); - } - } - } - - _frameListeners.add(listener); - //FIXME: At this point here we should check or before add we should check _stateManager is in an open - // state so as we don't check we are likely just to time out here as I believe is being seen in QPID-1255 - } - writeFrame(frame); - - return listener.blockForFrame(timeout); - // When control resumes before this line, a reply will have been received - // that matches the criteria defined in the blocking listener - } - finally - { - // If we don't removeKey the listener then no-one will - _frameListeners.remove(listener); - } - - } - - /** More convenient method to write a frame and wait for it's response. */ - public AMQMethodEvent syncWrite(AMQFrame frame, Class responseClass) throws AMQException, FailoverException - { - return syncWrite(frame, responseClass, DEFAULT_SYNC_TIMEOUT); - } - - /** More convenient method to write a frame and wait for it's response. */ - public AMQMethodEvent syncWrite(AMQFrame frame, Class responseClass, long timeout) throws AMQException, FailoverException - { - return writeCommandFrameAndWaitForReply(frame, new SpecificMethodFrameListener(frame.getChannel(), responseClass), - timeout); - } - - public void closeSession(AMQSession session) throws AMQException - { - _protocolSession.closeSession(session); - } - - /** - * Closes the connection. - * - * <p/>If a failover exception occurs whilst closing the connection it is ignored, as the connection is closed - * anyway. - * - * @param timeout The timeout to wait for an acknowledgement to the close request. - * - * @throws AMQException If the close fails for any reason. - */ - public void closeConnection(long timeout) throws AMQException - { - ConnectionCloseBody body = _protocolSession.getMethodRegistry().createConnectionCloseBody(AMQConstant.REPLY_SUCCESS.getCode(), // replyCode - new AMQShortString("JMS client is closing the connection."), 0, 0); - - final AMQFrame frame = body.generateFrame(0); - - //If the connection is already closed then don't do a syncWrite - if (!getStateManager().getCurrentState().equals(AMQState.CONNECTION_CLOSED)) - { - try - { - syncWrite(frame, ConnectionCloseOkBody.class, timeout); - _networkDriver.close(); - closed(); - } - catch (AMQTimeoutException e) - { - closed(); - } - catch (FailoverException e) - { - _logger.debug("FailoverException interrupted connection close, ignoring as connection close anyway."); - } - } - _poolReference.releaseExecutorService(); - } - - /** @return the number of bytes read from this protocol session */ - public long getReadBytes() - { - return _readBytes; - } - - /** @return the number of bytes written to this protocol session */ - public long getWrittenBytes() - { - return _writtenBytes; - } - - public void failover(String host, int port) - { - _failoverHandler.setHost(host); - _failoverHandler.setPort(port); - // see javadoc for FailoverHandler to see rationale for separate thread - startFailoverThread(); - } - - public void blockUntilNotFailingOver() throws InterruptedException - { - synchronized(_failoverLatchChange) - { - if (_failoverLatch != null) - { - if(!_failoverLatch.await(MAXIMUM_STATE_WAIT_TIME, TimeUnit.MILLISECONDS)) - { - - } - } - } - } - - public AMQShortString generateQueueName() - { - return _protocolSession.generateQueueName(); - } - - public CountDownLatch getFailoverLatch() - { - return _failoverLatch; - } - - public void setFailoverLatch(CountDownLatch failoverLatch) - { - synchronized (_failoverLatchChange) - { - _failoverLatch = failoverLatch; - } - } - - public AMQConnection getConnection() - { - return _connection; - } - - public AMQStateManager getStateManager() - { - return _stateManager; - } - - public void setStateManager(AMQStateManager stateManager) - { - _stateManager = stateManager; - _stateManager.setProtocolSession(_protocolSession); - } - - public AMQProtocolSession getProtocolSession() - { - return _protocolSession; - } - - FailoverState getFailoverState() - { - return _failoverState; - } - - public void setFailoverState(FailoverState failoverState) - { - _failoverState = failoverState; - } - - public byte getProtocolMajorVersion() - { - return _protocolSession.getProtocolMajorVersion(); - } - - public byte getProtocolMinorVersion() - { - return _protocolSession.getProtocolMinorVersion(); - } - - public MethodRegistry getMethodRegistry() - { - return _protocolSession.getMethodRegistry(); - } - - public ProtocolVersion getProtocolVersion() - { - return _protocolSession.getProtocolVersion(); - } - - public SocketAddress getRemoteAddress() - { - return _networkDriver.getRemoteAddress(); - } - - public SocketAddress getLocalAddress() - { - return _networkDriver.getLocalAddress(); - } - - public void setNetworkDriver(NetworkDriver driver) - { - _networkDriver = driver; - } - - /** @param delay delay in seconds (not ms) */ - void initHeartbeats(int delay) - { - if (delay > 0) - { - getNetworkDriver().setMaxWriteIdle(delay); - getNetworkDriver().setMaxReadIdle(HeartbeatConfig.CONFIG.getTimeout(delay)); - HeartbeatDiagnostics.init(delay, HeartbeatConfig.CONFIG.getTimeout(delay)); - } - } - - public NetworkDriver getNetworkDriver() - { - return _networkDriver; - } - - public ProtocolVersion getSuggestedProtocolVersion() - { - return _suggestedProtocolVersion; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java deleted file mode 100644 index 7976760696..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jms.JMSException; -import javax.security.sasl.SaslClient; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.ConnectionTuneParameters; -import org.apache.qpid.client.message.UnprocessedMessage; -import org.apache.qpid.client.message.UnprocessedMessage_0_8; -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.framing.*; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.protocol.AMQVersionAwareProtocolSession; -import org.apache.qpid.transport.Sender; -import org.apache.qpid.client.handler.ClientMethodDispatcherImpl; - -/** - * Wrapper for protocol session that provides type-safe access to session attributes. <p/> The underlying protocol - * session is still available but clients should not use it to obtain session attributes. - */ -public class AMQProtocolSession implements AMQVersionAwareProtocolSession -{ - protected static final int LAST_WRITE_FUTURE_JOIN_TIMEOUT = 1000 * 60 * 2; - - protected static final Logger _logger = LoggerFactory.getLogger(AMQProtocolSession.class); - - public static final String PROTOCOL_INITIATION_RECEIVED = "ProtocolInitiatiionReceived"; - - //Usable channels are numbered 1 to <ChannelMax> - public static final int MAX_CHANNEL_MAX = 0xFFFF; - public static final int MIN_USABLE_CHANNEL_NUM = 1; - - protected static final String CONNECTION_TUNE_PARAMETERS = "ConnectionTuneParameters"; - - protected static final String AMQ_CONNECTION = "AMQConnection"; - - protected static final String SASL_CLIENT = "SASLClient"; - - /** - * The handler from which this session was created and which is used to handle protocol events. We send failover - * events to the handler. - */ - protected final AMQProtocolHandler _protocolHandler; - - /** Maps from the channel id to the AMQSession that it represents. */ - protected ConcurrentMap<Integer, AMQSession> _channelId2SessionMap = new ConcurrentHashMap<Integer, AMQSession>(); - - protected ConcurrentMap _closingChannels = new ConcurrentHashMap(); - - /** - * Maps from a channel id to an unprocessed message. This is used to tie together the JmsDeliverBody (which arrives - * first) with the subsequent content header and content bodies. - */ - private final ConcurrentMap<Integer, UnprocessedMessage> _channelId2UnprocessedMsgMap = new ConcurrentHashMap<Integer, UnprocessedMessage>(); - private final UnprocessedMessage[] _channelId2UnprocessedMsgArray = new UnprocessedMessage[16]; - - /** Counter to ensure unique queue names */ - protected int _queueId = 1; - protected final Object _queueIdLock = new Object(); - - private ProtocolVersion _protocolVersion; -// private VersionSpecificRegistry _registry = -// MainRegistry.getVersionSpecificRegistry(ProtocolVersion.getLatestSupportedVersion()); - - private MethodRegistry _methodRegistry = - MethodRegistry.getMethodRegistry(ProtocolVersion.getLatestSupportedVersion()); - - private MethodDispatcher _methodDispatcher; - - protected final AMQConnection _connection; - - private ConnectionTuneParameters _connectionTuneParameters; - - private SaslClient _saslClient; - - private static final int FAST_CHANNEL_ACCESS_MASK = 0xFFFFFFF0; - - public AMQProtocolSession(AMQProtocolHandler protocolHandler, AMQConnection connection) - { - _protocolHandler = protocolHandler; - _protocolVersion = connection.getProtocolVersion(); - _logger.info("Using ProtocolVersion for Session:" + _protocolVersion); - _methodDispatcher = ClientMethodDispatcherImpl.newMethodDispatcher(ProtocolVersion.getLatestSupportedVersion(), - this); - _connection = connection; - } - - public void init() - { - // start the process of setting up the connection. This is the first place that - // data is written to the server. - _protocolHandler.writeFrame(new ProtocolInitiation(_connection.getProtocolVersion())); - } - - public String getClientID() - { - try - { - return getAMQConnection().getClientID(); - } - catch (JMSException e) - { - // we never throw a JMSException here - return null; - } - } - - public void setClientID(String clientID) throws JMSException - { - getAMQConnection().setClientID(clientID); - } - - public AMQStateManager getStateManager() - { - return _protocolHandler.getStateManager(); - } - - public String getVirtualHost() - { - return getAMQConnection().getVirtualHost(); - } - - public String getUsername() - { - return getAMQConnection().getUsername(); - } - - public String getPassword() - { - return getAMQConnection().getPassword(); - } - - public SaslClient getSaslClient() - { - return _saslClient; - } - - /** - * Store the SASL client currently being used for the authentication handshake - * - * @param client if non-null, stores this in the session. if null clears any existing client being stored - */ - public void setSaslClient(SaslClient client) - { - _saslClient = client; - } - - public ConnectionTuneParameters getConnectionTuneParameters() - { - return _connectionTuneParameters; - } - - public void setConnectionTuneParameters(ConnectionTuneParameters params) - { - _connectionTuneParameters = params; - AMQConnection con = getAMQConnection(); - - con.setMaximumChannelCount(params.getChannelMax()); - con.setMaximumFrameSize(params.getFrameMax()); - _protocolHandler.initHeartbeats((int) params.getHeartbeat()); - } - - /** - * Callback invoked from the BasicDeliverMethodHandler when a message has been received. This is invoked on the MINA - * dispatcher thread. - * - * @param message - * - * @throws AMQException if this was not expected - */ - public void unprocessedMessageReceived(final int channelId, UnprocessedMessage message) throws AMQException - { - if ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0) - { - _channelId2UnprocessedMsgArray[channelId] = message; - } - else - { - _channelId2UnprocessedMsgMap.put(channelId, message); - } - } - - public void contentHeaderReceived(int channelId, ContentHeaderBody contentHeader) throws AMQException - { - final UnprocessedMessage_0_8 msg = (UnprocessedMessage_0_8) ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0 ? _channelId2UnprocessedMsgArray[channelId] - : _channelId2UnprocessedMsgMap.get(channelId)); - - if (msg == null) - { - throw new AMQException(null, "Error: received content header without having received a BasicDeliver frame first on session:" + this, null); - } - - if (msg.getContentHeader() != null) - { - throw new AMQException(null, "Error: received duplicate content header or did not receive correct number of content body frames on session:" + this, null); - } - - msg.setContentHeader(contentHeader); - if (contentHeader.bodySize == 0) - { - deliverMessageToAMQSession(channelId, msg); - } - } - - public void contentBodyReceived(final int channelId, ContentBody contentBody) throws AMQException - { - UnprocessedMessage_0_8 msg; - final boolean fastAccess = (channelId & FAST_CHANNEL_ACCESS_MASK) == 0; - if (fastAccess) - { - msg = (UnprocessedMessage_0_8) _channelId2UnprocessedMsgArray[channelId]; - } - else - { - msg = (UnprocessedMessage_0_8) _channelId2UnprocessedMsgMap.get(channelId); - } - - if (msg == null) - { - throw new AMQException(null, "Error: received content body without having received a JMSDeliver frame first", null); - } - - if (msg.getContentHeader() == null) - { - if (fastAccess) - { - _channelId2UnprocessedMsgArray[channelId] = null; - } - else - { - _channelId2UnprocessedMsgMap.remove(channelId); - } - throw new AMQException(null, "Error: received content body without having received a ContentHeader frame first", null); - } - - msg.receiveBody(contentBody); - - if (msg.isAllBodyDataReceived()) - { - deliverMessageToAMQSession(channelId, msg); - } - } - - public void heartbeatBodyReceived(int channelId, HeartbeatBody body) throws AMQException - { - - } - - /** - * Deliver a message to the appropriate session, removing the unprocessed message from our map - * - * @param channelId the channel id the message should be delivered to - * @param msg the message - */ - private void deliverMessageToAMQSession(int channelId, UnprocessedMessage msg) - { - AMQSession session = getSession(channelId); - session.messageReceived(msg); - if ((channelId & FAST_CHANNEL_ACCESS_MASK) == 0) - { - _channelId2UnprocessedMsgArray[channelId] = null; - } - else - { - _channelId2UnprocessedMsgMap.remove(channelId); - } - } - - protected AMQSession getSession(int channelId) - { - return _connection.getSession(channelId); - } - - /** - * Convenience method that writes a frame to the protocol session. Equivalent to calling - * getProtocolSession().write(). - * - * @param frame the frame to write - */ - public void writeFrame(AMQDataBlock frame) - { - _protocolHandler.writeFrame(frame); - } - - public void writeFrame(AMQDataBlock frame, boolean wait) - { - _protocolHandler.writeFrame(frame, wait); - } - - /** - * Starts the process of closing a session - * - * @param session the AMQSession being closed - */ - public void closeSession(AMQSession session) - { - _logger.debug("closeSession called on protocol session for session " + session.getChannelId()); - final int channelId = session.getChannelId(); - if (channelId <= 0) - { - throw new IllegalArgumentException("Attempt to close a channel with id < 0"); - } - // we need to know when a channel is closing so that we can respond - // with a channel.close frame when we receive any other type of frame - // on that channel - _closingChannels.putIfAbsent(channelId, session); - } - - /** - * Called from the ChannelClose handler when a channel close frame is received. This method decides whether this is - * a response or an initiation. The latter case causes the AMQSession to be closed and an exception to be thrown if - * appropriate. - * - * @param channelId the id of the channel (session) - * - * @return true if the client must respond to the server, i.e. if the server initiated the channel close, false if - * the channel close is just the server responding to the client's earlier request to close the channel. - */ - public boolean channelClosed(int channelId, AMQConstant code, String text) throws AMQException - { - - // if this is not a response to an earlier request to close the channel - if (_closingChannels.remove(channelId) == null) - { - final AMQSession session = getSession(channelId); - try - { - session.closed(new AMQException(code, text, null)); - } - catch (JMSException e) - { - throw new AMQException(null, "JMSException received while closing session", e); - } - - return true; - } - else - { - return false; - } - } - - public AMQConnection getAMQConnection() - { - return _connection; - } - - public void closeProtocolSession() throws AMQException - { - _protocolHandler.closeConnection(0); - } - - public void failover(String host, int port) - { - _protocolHandler.failover(host, port); - } - - protected AMQShortString generateQueueName() - { - int id; - synchronized (_queueIdLock) - { - id = _queueId++; - } - // convert '.', '/', ':' and ';' to single '_', for spec compliance and readability - String localAddress = _protocolHandler.getLocalAddress().toString().replaceAll("[./:;]", "_"); - String queueName = "tmp_" + localAddress + "_" + id; - return new AMQShortString(queueName.replaceAll("_+", "_")); - } - - public void confirmConsumerCancelled(int channelId, AMQShortString consumerTag) - { - final AMQSession session = getSession(channelId); - - session.confirmConsumerCancelled(consumerTag.toIntValue()); - } - - public void setProtocolVersion(final ProtocolVersion pv) - { - _logger.info("Setting ProtocolVersion to :" + pv); - _protocolVersion = pv; - _methodRegistry = MethodRegistry.getMethodRegistry(pv); - _methodDispatcher = ClientMethodDispatcherImpl.newMethodDispatcher(pv, this); - } - - public byte getProtocolMinorVersion() - { - return _protocolVersion.getMinorVersion(); - } - - public byte getProtocolMajorVersion() - { - return _protocolVersion.getMajorVersion(); - } - - public ProtocolVersion getProtocolVersion() - { - return _protocolVersion; - } - - public MethodRegistry getMethodRegistry() - { - return _methodRegistry; - } - - public MethodDispatcher getMethodDispatcher() - { - return _methodDispatcher; - } - - public void setTicket(int ticket, int channelId) - { - final AMQSession session = getSession(channelId); - session.setTicket(ticket); - } - - public void setMethodDispatcher(MethodDispatcher methodDispatcher) - { - _methodDispatcher = methodDispatcher; - } - - public void setFlowControl(final int channelId, final boolean active) - { - final AMQSession session = getSession(channelId); - session.setFlowControl(active); - } - - public void methodFrameReceived(final int channel, final AMQMethodBody amqMethodBody) throws AMQException - { - _protocolHandler.methodBodyReceived(channel, amqMethodBody); - } - - public void notifyError(Exception error) - { - _protocolHandler.propagateExceptionToAllWaiters(error); - } - - public void setSender(Sender<java.nio.ByteBuffer> sender) - { - // No-op, interface munging - } - - - @Override - public String toString() - { - return "AMQProtocolSession[" + _connection + ']'; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/BlockingMethodFrameListener.java b/java/client/src/main/java/org/apache/qpid/client/protocol/BlockingMethodFrameListener.java deleted file mode 100644 index 2bc609ebf2..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/BlockingMethodFrameListener.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQTimeoutException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.util.BlockingWaiter; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.apache.qpid.protocol.AMQMethodListener; - -/** - * BlockingMethodFrameListener is a 'rendezvous' which acts as a {@link AMQMethodListener} that delegates handling of - * incoming methods to a method listener implemented as a sub-class of this and hands off the processed method or - * error to a consumer. The producer of the event does not have to wait for the consumer to take the event, so this - * differs from a 'rendezvous' in that sense. - * - * <p/>BlockingMethodFrameListeners are used to coordinate waiting for replies to method calls that expect a response. - * They are always used in a 'one-shot' manner, that is, to recieve just one response. Usually the caller has to register - * them as method listeners with an event dispatcher and remember to de-register them (in a finally block) once they - * have been completed. - * - * <p/>The {@link #processMethod} must return <tt>true</tt> on any incoming method that it handles. This indicates to - * this listeners that the method it is waiting for has arrived. Incoming methods are also filtered by channel prior to - * being passed to the {@link #processMethod} method, so responses are only received for a particular channel. The - * channel id must be passed to the constructor. - * - * <p/>Errors from the producer are rethrown to the consumer. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Accept notification of AMQP method events. <td> {@link AMQMethodEvent} - * <tr><td> Delegate handling of the method to another method listener. <td> {@link AMQMethodBody} - * <tr><td> Block until a method is handled by the delegated to handler. - * <tr><td> Propagate the most recent exception to the consumer. - * </table> - * - * @todo Might be neater if this method listener simply wrapped another that provided the method handling using a - * methodRecevied method. The processMethod takes an additional channelId, however none of the implementations - * seem to use it. So wrapping the listeners is possible. - * @todo If the retrotranslator can handle it, could use a SynchronousQueue to implement this rendezvous. Need to - * check that SynchronousQueue has a non-blocking put method available. - */ -public abstract class BlockingMethodFrameListener extends BlockingWaiter<AMQMethodEvent> implements AMQMethodListener -{ - - /** Holds the channel id for the channel upon which this listener is waiting for a response. */ - protected int _channelId; - - /** - * Creates a new method listener, that filters incoming method to just those that match the specified channel id. - * - * @param channelId The channel id to filter incoming methods with. - */ - public BlockingMethodFrameListener(int channelId) - { - _channelId = channelId; - } - - /** - * Delegates any additional handling of the incoming methods to another handler. - * - * @param channelId The channel id of the incoming method. - * @param frame The method body. - * - * @return <tt>true</tt> if the method was handled, <tt>false</tt> otherwise. - */ - public abstract boolean processMethod(int channelId, AMQMethodBody frame); - - public boolean process(AMQMethodEvent evt) - { - AMQMethodBody method = evt.getMethod(); - - return (evt.getChannelId() == _channelId) && processMethod(evt.getChannelId(), method); - } - - /** - * Informs this listener that an AMQP method has been received. - * - * @param evt The AMQP method. - * - * @return <tt>true</tt> if this listener has handled the method, <tt>false</tt> otherwise. - */ - public boolean methodReceived(AMQMethodEvent evt) - { - return received(evt); - } - - /** - * Blocks until a method is received that is handled by the delegated to method listener, or the specified timeout - * has passed. - * - * @param timeout The timeout in milliseconds. - * - * @return The AMQP method that was received. - * - * @throws AMQException - * @throws FailoverException - */ - public AMQMethodEvent blockForFrame(long timeout) throws AMQException, FailoverException - { - try - { - return (AMQMethodEvent) block(timeout); - } - finally - { - //Prevent any more errors being notified to this waiter. - close(); - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatConfig.java b/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatConfig.java deleted file mode 100644 index 35ea44a331..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class HeartbeatConfig -{ - private static final Logger _logger = LoggerFactory.getLogger(HeartbeatConfig.class); - static final HeartbeatConfig CONFIG = new HeartbeatConfig(); - - /** - * The factor used to get the timeout from the delay between heartbeats. - */ - private float timeoutFactor = 2; - - HeartbeatConfig() - { - String property = System.getProperty("amqj.heartbeat.timeoutFactor"); - if (property != null) - { - try - { - timeoutFactor = Float.parseFloat(property); - } - catch (NumberFormatException e) - { - _logger.warn("Invalid timeout factor (amqj.heartbeat.timeoutFactor): " + property); - } - } - } - - float getTimeoutFactor() - { - return timeoutFactor; - } - - int getTimeout(int writeDelay) - { - return (int) (timeoutFactor * writeDelay); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatDiagnostics.java b/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatDiagnostics.java deleted file mode 100644 index d44faeab04..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/HeartbeatDiagnostics.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -class HeartbeatDiagnostics -{ - private static final Diagnostics _impl = init(); - - private static Diagnostics init() - { - return Boolean.getBoolean("amqj.heartbeat.diagnostics") ? new On() : new Off(); - } - - static void sent() - { - _impl.sent(); - } - - static void timeout() - { - _impl.timeout(); - } - - static void received(boolean heartbeat) - { - _impl.received(heartbeat); - } - - static void init(int delay, int timeout) - { - _impl.init(delay, timeout); - } - - private static interface Diagnostics - { - void sent(); - void timeout(); - void received(boolean heartbeat); - void init(int delay, int timeout); - } - - private static class On implements Diagnostics - { - private final String[] messages = new String[50]; - private int i; - - private void save(String msg) - { - messages[i++] = msg; - if(i >= messages.length){ - i = 0;//i.e. a circular buffer - } - } - - public void sent() - { - save(System.currentTimeMillis() + ": sent heartbeat"); - } - - public void timeout() - { - for(int i = 0; i < messages.length; i++) - { - if(messages[i] != null) - { - System.out.println(messages[i]); - } - } - System.out.println(System.currentTimeMillis() + ": timed out"); - } - - public void received(boolean heartbeat) - { - save(System.currentTimeMillis() + ": received " + (heartbeat ? "heartbeat" : "data")); - } - - public void init(int delay, int timeout) - { - System.out.println(System.currentTimeMillis() + ": initialised delay=" + delay + ", timeout=" + timeout); - } - } - - private static class Off implements Diagnostics - { - public void sent() - { - - } - public void timeout() - { - - } - public void received(boolean heartbeat) - { - - } - - public void init(int delay, int timeout) - { - - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/ProtocolBufferMonitorFilter.java b/java/client/src/main/java/org/apache/qpid/client/protocol/ProtocolBufferMonitorFilter.java deleted file mode 100644 index bbd0a7b144..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/protocol/ProtocolBufferMonitorFilter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import org.apache.mina.common.IoFilterAdapter; -import org.apache.mina.common.IoSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A MINA filter that monitors the numbers of messages pending to be sent by MINA. It outputs a message - * when a threshold has been exceeded, and has a frequency configuration so that messages are not output - * too often. - * - */ -public class ProtocolBufferMonitorFilter extends IoFilterAdapter -{ - private static final Logger _logger = LoggerFactory.getLogger(ProtocolBufferMonitorFilter.class); - - public static final long DEFAULT_FREQUENCY = 5000; - - public static final int DEFAULT_THRESHOLD = 3000; - - private int _bufferedMessages = 0; - - private int _threshold; - - private long _lastMessageOutputTime; - - private long _outputFrequencyInMillis; - - public ProtocolBufferMonitorFilter() - { - _threshold = DEFAULT_THRESHOLD; - _outputFrequencyInMillis = DEFAULT_FREQUENCY; - } - - public ProtocolBufferMonitorFilter(int threshold, long frequency) - { - _threshold = threshold; - _outputFrequencyInMillis = frequency; - } - - public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception - { - _bufferedMessages++; - if (_bufferedMessages > _threshold) - { - long now = System.currentTimeMillis(); - if ((now - _lastMessageOutputTime) > _outputFrequencyInMillis) - { - _logger.warn("Protocol message buffer exceeded threshold of " + _threshold + ". Current backlog: " - + _bufferedMessages); - _lastMessageOutputTime = now; - } - } - - nextFilter.messageReceived(session, message); - } - - public void messageSent(NextFilter nextFilter, IoSession session, Object message) throws Exception - { - _bufferedMessages--; - nextFilter.messageSent(session, message); - } - - public int getBufferedMessages() - { - return _bufferedMessages; - } - - public int getThreshold() - { - return _threshold; - } - - public void setThreshold(int threshold) - { - _threshold = threshold; - } - - public long getOutputFrequencyInMillis() - { - return _outputFrequencyInMillis; - } - - public void setOutputFrequencyInMillis(long outputFrequencyInMillis) - { - _outputFrequencyInMillis = outputFrequencyInMillis; - } - - public long getLastMessageOutputTime() - { - return _lastMessageOutputTime; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/AMQCallbackHandler.java b/java/client/src/main/java/org/apache/qpid/client/security/AMQCallbackHandler.java deleted file mode 100644 index fbca444208..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/AMQCallbackHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import javax.security.auth.callback.CallbackHandler; - -import org.apache.qpid.client.protocol.AMQProtocolSession; - -public interface AMQCallbackHandler extends CallbackHandler -{ - void initialise(AMQProtocolSession protocolSession); -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.java b/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.java deleted file mode 100644 index 140cbdeb75..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import org.apache.qpid.util.FileUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -/** - * CallbackHandlerRegistry is a registry for call back handlers for user authentication and interaction during user - * authentication. It is capable of reading its configuration from a properties file containing call back handler - * implementing class names for different SASL mechanism names. Instantiating this registry also has the effect of - * configuring and registering the SASL client factory implementations using {@link DynamicSaslRegistrar}. - * - * <p/>The callback configuration should be specified in a properties file, refered to by the System property - * "amp.callbackhandler.properties". The format of the properties file is: - * - * <p/><pre> - * CallbackHanlder.mechanism=fully.qualified.class.name - * </pre> - * - * <p/>Where mechanism is an IANA-registered mechanism name and the fully qualified class name refers to a - * class that implements org.apache.qpid.client.security.AMQCallbackHanlder and provides a call back handler for the - * specified mechanism. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Parse callback properties. - * <tr><td> Provide mapping from SASL mechanisms to callback implementations. - * </table> - */ -public class CallbackHandlerRegistry -{ - private static final Logger _logger = LoggerFactory.getLogger(CallbackHandlerRegistry.class); - - /** The name of the system property that holds the name of the callback handler properties file. */ - private static final String FILE_PROPERTY = "amq.callbackhandler.properties"; - - /** The default name of the callback handler properties resource. */ - public static final String DEFAULT_RESOURCE_NAME = "org/apache/qpid/client/security/CallbackHandlerRegistry.properties"; - - /** A static reference to the singleton instance of this registry. */ - private static CallbackHandlerRegistry _instance = new CallbackHandlerRegistry(); - - /** Holds a map from SASL mechanism names to call back handlers. */ - private Map<String, Class> _mechanismToHandlerClassMap = new HashMap<String, Class>(); - - /** Holds a space delimited list of mechanisms that callback handlers exist for. */ - private String _mechanisms; - - /** - * Gets the singleton instance of this registry. - * - * @return The singleton instance of this registry. - */ - public static CallbackHandlerRegistry getInstance() - { - return _instance; - } - - /** - * Gets the callback handler class for a given SASL mechanism name. - * - * @param mechanism The SASL mechanism name. - * - * @return The callback handler class for the mechanism, or null if none is configured for that mechanism. - */ - public Class getCallbackHandlerClass(String mechanism) - { - return (Class) _mechanismToHandlerClassMap.get(mechanism); - } - - /** - * Gets a space delimited list of supported SASL mechanisms. - * - * @return A space delimited list of supported SASL mechanisms. - */ - public String getMechanisms() - { - return _mechanisms; - } - - /** - * Creates the call back handler registry from its configuration resource or file. This also has the side effect - * of configuring and registering the SASL client factory implementations using {@link DynamicSaslRegistrar}. - */ - private CallbackHandlerRegistry() - { - // Register any configured SASL client factories. - DynamicSaslRegistrar.registerSaslProviders(); - - String filename = System.getProperty(FILE_PROPERTY); - InputStream is = - FileUtils.openFileOrDefaultResource(filename, DEFAULT_RESOURCE_NAME, - CallbackHandlerRegistry.class.getClassLoader()); - - try - { - Properties props = new Properties(); - props.load(is); - parseProperties(props); - _logger.info("Callback handlers available for SASL mechanisms: " + _mechanisms); - } - catch (IOException e) - { - _logger.error("Error reading properties: " + e, e); - } - finally - { - if (is != null) - { - try - { - is.close(); - - } - catch (IOException e) - { - _logger.error("Unable to close properties stream: " + e, e); - } - } - } - } - - /*private InputStream openPropertiesInputStream(String filename) - { - boolean useDefault = true; - InputStream is = null; - if (filename != null) - { - try - { - is = new BufferedInputStream(new FileInputStream(new File(filename))); - useDefault = false; - } - catch (FileNotFoundException e) - { - _logger.error("Unable to read from file " + filename + ": " + e, e); - } - } - - if (useDefault) - { - is = CallbackHandlerRegistry.class.getResourceAsStream(DEFAULT_RESOURCE_NAME); - } - - return is; - }*/ - - /** - * Scans the specified properties as a mapping from IANA registered SASL mechanism to call back handler - * implementations, that provide the necessary call back handling for obtaining user log in credentials - * during authentication for the specified mechanism, and builds a map from mechanism names to handler - * classes. - * - * @param props - */ - private void parseProperties(Properties props) - { - Enumeration e = props.propertyNames(); - while (e.hasMoreElements()) - { - String propertyName = (String) e.nextElement(); - int period = propertyName.indexOf("."); - if (period < 0) - { - _logger.warn("Unable to parse property " + propertyName + " when configuring SASL providers"); - - continue; - } - - String mechanism = propertyName.substring(period + 1); - String className = props.getProperty(propertyName); - Class clazz = null; - try - { - clazz = Class.forName(className); - if (!AMQCallbackHandler.class.isAssignableFrom(clazz)) - { - _logger.warn("SASL provider " + clazz + " does not implement " + AMQCallbackHandler.class - + ". Skipping"); - - continue; - } - - _mechanismToHandlerClassMap.put(mechanism, clazz); - if (_mechanisms == null) - { - _mechanisms = mechanism; - } - else - { - // one time cost - _mechanisms = _mechanisms + " " + mechanism; - } - } - catch (ClassNotFoundException ex) - { - _logger.warn("Unable to load class " + className + ". Skipping that SASL provider"); - - continue; - } - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.properties b/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.properties deleted file mode 100644 index 1fcfde3579..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.properties +++ /dev/null @@ -1,22 +0,0 @@ -# -# 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. -# -CallbackHandler.CRAM-MD5-HASHED=org.apache.qpid.client.security.UsernameHashedPasswordCallbackHandler -CallbackHandler.CRAM-MD5=org.apache.qpid.client.security.UsernamePasswordCallbackHandler -CallbackHandler.AMQPLAIN=org.apache.qpid.client.security.UsernamePasswordCallbackHandler -CallbackHandler.PLAIN=org.apache.qpid.client.security.UsernamePasswordCallbackHandler diff --git a/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.java b/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.java deleted file mode 100644 index 2b4261b4b7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import org.apache.qpid.util.FileUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.security.sasl.SaslClientFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.security.Security; -import java.util.Enumeration; -import java.util.Map; -import java.util.Properties; -import java.util.TreeMap; - -/** - * DynamicSaslRegistrar provides a collection of helper methods for reading a configuration file that contains a mapping - * from SASL mechanism names to implementing client factory class names and registering a security provider with the - * Java runtime system, that uses the configured client factory implementations. - * - * <p/>The sasl configuration should be specified in a properties file, refered to by the System property - * "amp.dynamicsaslregistrar.properties". The format of the properties file is: - * - * <p/><pre> - * mechanism=fully.qualified.class.name - * </pre> - * - * <p/>Where mechanism is an IANA-registered mechanism name and the fully qualified class name refers to a class that - * implements javax.security.sasl.SaslClientFactory and provides the specified mechanism. - * - * <p><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations <tr><td> Parse SASL - * mechanism properties. <tr><td> Create and register security provider for SASL mechanisms. </table> - */ -public class DynamicSaslRegistrar -{ - private static final Logger _logger = LoggerFactory.getLogger(DynamicSaslRegistrar.class); - - /** The name of the system property that holds the name of the SASL configuration properties. */ - private static final String FILE_PROPERTY = "amq.dynamicsaslregistrar.properties"; - - /** The default name of the SASL properties file resource. */ - public static final String DEFAULT_RESOURCE_NAME = "org/apache/qpid/client/security/DynamicSaslRegistrar.properties"; - - /** Reads the properties file, and creates a dynamic security provider to register the SASL implementations with. */ - public static void registerSaslProviders() - { - _logger.debug("public static void registerSaslProviders(): called"); - - // Open the SASL properties file, using the default name is one is not specified. - String filename = System.getProperty(FILE_PROPERTY); - InputStream is = - FileUtils.openFileOrDefaultResource(filename, DEFAULT_RESOURCE_NAME, - DynamicSaslRegistrar.class.getClassLoader()); - - try - { - Properties props = new Properties(); - props.load(is); - - _logger.debug("props = " + props); - - Map<String, Class<? extends SaslClientFactory>> factories = parseProperties(props); - - if (factories.size() > 0) - { - // Ensure we are used before the defaults - if (Security.insertProviderAt(new JCAProvider(factories), 1) == -1) - { - _logger.error("Unable to load custom SASL providers."); - } - else - { - _logger.info("Additional SASL providers successfully registered."); - } - } - else - { - _logger.warn("No additional SASL providers registered."); - } - } - catch (IOException e) - { - _logger.error("Error reading properties: " + e, e); - } - finally - { - if (is != null) - { - try - { - is.close(); - - } - catch (IOException e) - { - _logger.error("Unable to close properties stream: " + e, e); - } - } - } - } - - /** - * Either attempts to open the specified filename as an input stream, or uses the default SASL configuration - * resource. - * - * @param filename The name of the file to get the SASL properties from, null to use the default. - * - * @return An input stream to read the dynamic SASL configuration from, or null if one could not be opened. - */ - /*private static InputStream openPropertiesInputStream(String filename) - { - InputStream is = null; - - // Flag to indicate whether the default resource should be used. By default this is true, so that the default - // is used when opening the file fails. - boolean useDefault = true; - - // Try to open the file if one was specified. - if (filename != null) - { - try - { - is = new BufferedInputStream(new FileInputStream(new File(filename))); - - // Clear the default flag because the file was succesfully opened. - useDefault = false; - } - catch (FileNotFoundException e) - { - _logger.error("Unable to read from file " + filename + ": " + e, e); - } - } - - // Load the default resource if a file was not specified, or if opening the file failed. - if (useDefault) - { - is = CallbackHandlerRegistry.class.getResourceAsStream(DEFAULT_RESOURCE_NAME); - } - - return is; - }*/ - - /** - * Parses the specified properties as a mapping from IANA registered SASL mechanism names to implementing client - * factories. If the client factories cannot be instantiated or do not implement SaslClientFactory then the - * properties refering to them are ignored. - * - * @param props The properties to scan for Sasl client factory implementations. - * - * @return A map from SASL mechanism names to implementing client factory classes. - * - * @todo Why tree map here? Do really want mechanisms in alphabetical order? Seems more likely that the declared - * order of the mechanisms is intended to be preserved, so that they are registered in the declared order of - * preference. Consider LinkedHashMap instead. - */ - private static Map<String, Class<? extends SaslClientFactory>> parseProperties(Properties props) - { - Enumeration e = props.propertyNames(); - - TreeMap<String, Class<? extends SaslClientFactory>> factoriesToRegister = - new TreeMap<String, Class<? extends SaslClientFactory>>(); - - while (e.hasMoreElements()) - { - String mechanism = (String) e.nextElement(); - String className = props.getProperty(mechanism); - try - { - Class<?> clazz = Class.forName(className); - if (!(SaslClientFactory.class.isAssignableFrom(clazz))) - { - _logger.error("Class " + clazz + " does not implement " + SaslClientFactory.class + " - skipping"); - - continue; - } - - _logger.debug("Registering class "+ clazz.getName() +" for mechanism "+mechanism); - factoriesToRegister.put(mechanism, (Class<? extends SaslClientFactory>) clazz); - } - catch (Exception ex) - { - _logger.error("Error instantiating SaslClientFactory calss " + className + " - skipping"); - } - } - - return factoriesToRegister; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.properties b/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.properties deleted file mode 100644 index b903208927..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.properties +++ /dev/null @@ -1,21 +0,0 @@ -# -# 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. -# -AMQPLAIN=org.apache.qpid.client.security.amqplain.AmqPlainSaslClientFactory -CRAM-MD5-HASHED=org.apache.qpid.client.security.crammd5hashed.CRAMMD5HashedSaslClientFactory -ANONYMOUS=org.apache.qpid.client.security.anonymous.AnonymousSaslClientFactory diff --git a/java/client/src/main/java/org/apache/qpid/client/security/JCAProvider.java b/java/client/src/main/java/org/apache/qpid/client/security/JCAProvider.java deleted file mode 100644 index 828d26ed0d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/JCAProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.security.sasl.SaslClientFactory; - -import java.security.Provider; -import java.security.Security; -import java.util.Map; - -/** - * JCAProvider is a security provider for SASL client factories that is configured from a map of SASL mechanism names - * to client factories implementation class names. It is intended that the map of client factories can be read from a - * configuration file or other application configuration mechanism. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Register SASL mechanism implementations. - * </table> - */ -public class JCAProvider extends Provider -{ - private static final Logger log = LoggerFactory.getLogger(JCAProvider.class); - - /** - * Creates the security provider with a map from SASL mechanisms to implementing factories. - * - * @param providerMap The map from SASL mechanims to implementing factory classes. - */ - public JCAProvider(Map<String, Class<? extends SaslClientFactory>> providerMap) - { - super("AMQSASLProvider-Client", 1.0, "A JCA provider that registers all " - + "AMQ SASL providers that want to be registered"); - register(providerMap); -// Security.addProvider(this); - } - - /** - * Registers client factory classes for a map of mechanism names to client factory classes. - * - * @param providerMap The map from SASL mechanims to implementing factory classes. - */ - private void register(Map<String, Class<? extends SaslClientFactory>> providerMap) - { - for (Map.Entry<String, Class<? extends SaslClientFactory>> me : providerMap.entrySet()) - { - put( "SaslClientFactory."+me.getKey(), me.getValue().getName()); - log.debug("Registered SASL Client factory for " + me.getKey() + " as " + me.getValue().getName()); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/UsernameHashedPasswordCallbackHandler.java b/java/client/src/main/java/org/apache/qpid/client/security/UsernameHashedPasswordCallbackHandler.java deleted file mode 100644 index 66176dac3c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/UsernameHashedPasswordCallbackHandler.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import org.apache.qpid.client.protocol.AMQProtocolSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.auth.callback.UnsupportedCallbackException; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class UsernameHashedPasswordCallbackHandler implements AMQCallbackHandler -{ - private static final Logger _logger = LoggerFactory.getLogger(UsernameHashedPasswordCallbackHandler.class); - - private AMQProtocolSession _protocolSession; - - public void initialise(AMQProtocolSession protocolSession) - { - _protocolSession = protocolSession; - } - - public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException - { - for (int i = 0; i < callbacks.length; i++) - { - Callback cb = callbacks[i]; - if (cb instanceof NameCallback) - { - ((NameCallback) cb).setName(_protocolSession.getUsername()); - } - else if (cb instanceof PasswordCallback) - { - try - { - ((PasswordCallback) cb).setPassword(getHash(_protocolSession.getPassword())); - } - catch (NoSuchAlgorithmException e) - { - UnsupportedCallbackException uce = new UnsupportedCallbackException(cb); - uce.initCause(e); - throw uce; - } - } - else - { - throw new UnsupportedCallbackException(cb); - } - } - } - - private char[] getHash(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException - { - - byte[] data = text.getBytes("utf-8"); - - MessageDigest md = MessageDigest.getInstance("MD5"); - - for (byte b : data) - { - md.update(b); - } - - byte[] digest = md.digest(); - - char[] hash = new char[digest.length]; - - int index = 0; - for (byte b : digest) - { - hash[index++] = (char) b; - } - - return hash; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/UsernamePasswordCallbackHandler.java b/java/client/src/main/java/org/apache/qpid/client/security/UsernamePasswordCallbackHandler.java deleted file mode 100644 index c50c62710f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/UsernamePasswordCallbackHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * 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.qpid.client.security; - -import java.io.IOException; - -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.auth.callback.UnsupportedCallbackException; - -import org.apache.qpid.client.protocol.AMQProtocolSession; - -public class UsernamePasswordCallbackHandler implements AMQCallbackHandler -{ - private AMQProtocolSession _protocolSession; - - public void initialise(AMQProtocolSession protocolSession) - { - _protocolSession = protocolSession; - } - - public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException - { - for (int i = 0; i < callbacks.length; i++) - { - Callback cb = callbacks[i]; - if (cb instanceof NameCallback) - { - ((NameCallback)cb).setName(_protocolSession.getUsername()); - } - else if (cb instanceof PasswordCallback) - { - ((PasswordCallback)cb).setPassword(_protocolSession.getPassword().toCharArray()); - } - else - { - throw new UnsupportedCallbackException(cb); - } - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClient.java b/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClient.java deleted file mode 100644 index f8a25c630c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClient.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * 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.qpid.client.security.amqplain; - -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.CallbackHandler; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; - -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; - -/** - * Implements the "AMQPlain" authentication protocol that uses FieldTables to send username and pwd. - * - */ -public class AmqPlainSaslClient implements SaslClient -{ - /** - * The name of this mechanism - */ - public static final String MECHANISM = "AMQPLAIN"; - - private CallbackHandler _cbh; - - public AmqPlainSaslClient(CallbackHandler cbh) - { - _cbh = cbh; - } - - public String getMechanismName() - { - return "AMQPLAIN"; - } - - public boolean hasInitialResponse() - { - return true; - } - - public byte[] evaluateChallenge(byte[] challenge) throws SaslException - { - // we do not care about the prompt or the default name - NameCallback nameCallback = new NameCallback("prompt", "defaultName"); - PasswordCallback pwdCallback = new PasswordCallback("prompt", false); - Callback[] callbacks = new Callback[]{nameCallback, pwdCallback}; - try - { - _cbh.handle(callbacks); - } - catch (Exception e) - { - throw new SaslException("Error handling SASL callbacks: " + e, e); - } - FieldTable table = FieldTableFactory.newFieldTable(); - table.setString("LOGIN", nameCallback.getName()); - table.setString("PASSWORD", new String(pwdCallback.getPassword())); - return table.getDataAsBytes(); - } - - public boolean isComplete() - { - return true; - } - - public byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException - { - throw new SaslException("Not supported"); - } - - public byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException - { - throw new SaslException("Not supported"); - } - - public Object getNegotiatedProperty(String propName) - { - return null; - } - - public void dispose() throws SaslException - { - _cbh = null; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClientFactory.java b/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClientFactory.java deleted file mode 100644 index 30cc786890..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/amqplain/AmqPlainSaslClientFactory.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * 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.qpid.client.security.amqplain; - -import java.util.Map; - -import javax.security.auth.callback.CallbackHandler; -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslClientFactory; -import javax.security.sasl.SaslException; - -public class AmqPlainSaslClientFactory implements SaslClientFactory -{ - public SaslClient createSaslClient(String[] mechanisms, String authorizationId, String protocol, String serverName, Map props, CallbackHandler cbh) throws SaslException - { - for (int i = 0; i < mechanisms.length; i++) - { - if (mechanisms[i].equals(AmqPlainSaslClient.MECHANISM)) - { - if (cbh == null) - { - throw new SaslException("CallbackHandler must not be null"); - } - return new AmqPlainSaslClient(cbh); - } - } - return null; - } - - public String[] getMechanismNames(Map props) - { - if (props.containsKey(Sasl.POLICY_NOPLAINTEXT) || - props.containsKey(Sasl.POLICY_NODICTIONARY) || - props.containsKey(Sasl.POLICY_NOACTIVE)) - { - // returned array must be non null according to interface documentation - return new String[0]; - } - else - { - return new String[]{AmqPlainSaslClient.MECHANISM}; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClient.java b/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClient.java deleted file mode 100644 index 0f56b2ef6c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClient.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * 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.qpid.client.security.anonymous; - -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; - -public class AnonymousSaslClient implements SaslClient -{ - public String getMechanismName() { - return "ANONYMOUS"; - } - public boolean hasInitialResponse() { - return true; - } - public byte[] evaluateChallenge(byte[] challenge) throws SaslException { - return new byte[0]; - } - public boolean isComplete() { - return true; - } - public byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException - { - throw new IllegalStateException("No security layer supported"); - } - public byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException - { - throw new IllegalStateException("No security layer supported"); - } - public Object getNegotiatedProperty(String propName) { - return null; - } - public void dispose() throws SaslException {} -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClientFactory.java b/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClientFactory.java deleted file mode 100644 index de698f87c6..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/anonymous/AnonymousSaslClientFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * 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.qpid.client.security.anonymous; - -import java.util.Arrays; -import java.util.Map; - -import javax.security.sasl.Sasl; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslClientFactory; -import javax.security.sasl.SaslException; -import javax.security.auth.callback.CallbackHandler; - -public class AnonymousSaslClientFactory implements SaslClientFactory -{ - public SaslClient createSaslClient(String[] mechanisms, String authId, - String protocol, String server, - Map props, CallbackHandler cbh) throws SaslException - { - if (Arrays.asList(mechanisms).contains("ANONYMOUS")) { - return new AnonymousSaslClient(); - } else { - return null; - } - } - public String[] getMechanismNames(Map props) - { - if (props == null || props.isEmpty()) { - return new String[]{"ANONYMOUS"}; - } else { - return new String[0]; - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/security/crammd5hashed/CRAMMD5HashedSaslClientFactory.java b/java/client/src/main/java/org/apache/qpid/client/security/crammd5hashed/CRAMMD5HashedSaslClientFactory.java deleted file mode 100644 index 22bb1ac156..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/security/crammd5hashed/CRAMMD5HashedSaslClientFactory.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.qpid.client.security.crammd5hashed; - -import org.apache.qpid.client.security.amqplain.AmqPlainSaslClient; - -import javax.security.sasl.SaslClientFactory; -import javax.security.sasl.SaslClient; -import javax.security.sasl.SaslException; -import javax.security.sasl.Sasl; -import javax.security.auth.callback.CallbackHandler; -import java.util.Map; -import java.security.Security; - -public class CRAMMD5HashedSaslClientFactory implements SaslClientFactory -{ - /** The name of this mechanism */ - public static final String MECHANISM = "CRAM-MD5-HASHED"; - - - public SaslClient createSaslClient(String[] mechanisms, String authorizationId, String protocol, String serverName, Map<String, ?> props, CallbackHandler cbh) throws SaslException - { - for (int i = 0; i < mechanisms.length; i++) - { - if (mechanisms[i].equals(MECHANISM)) - { - if (cbh == null) - { - throw new SaslException("CallbackHandler must not be null"); - } - - String[] mechs = {"CRAM-MD5"}; - return Sasl.createSaslClient(mechs, authorizationId, protocol, serverName, props, cbh); - } - } - return null; - } - - public String[] getMechanismNames(Map props) - { - if (props != null) - { - if (props.containsKey(Sasl.POLICY_NOPLAINTEXT) || - props.containsKey(Sasl.POLICY_NODICTIONARY) || - props.containsKey(Sasl.POLICY_NOACTIVE)) - { - // returned array must be non null according to interface documentation - return new String[0]; - } - } - - return new String[]{MECHANISM}; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/AMQMethodNotImplementedException.java b/java/client/src/main/java/org/apache/qpid/client/state/AMQMethodNotImplementedException.java deleted file mode 100644 index 2c99b9a97b..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/AMQMethodNotImplementedException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * 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.qpid.client.state; - -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.AMQException; - -public class AMQMethodNotImplementedException extends AMQException -{ - public AMQMethodNotImplementedException(AMQMethodBody body) - { - super(null, "Unexpected Method Received: " + body.getClass().getName(), null); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/AMQState.java b/java/client/src/main/java/org/apache/qpid/client/state/AMQState.java deleted file mode 100644 index d32d10542f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/AMQState.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * 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.qpid.client.state; - -/** - * States used in the AMQ protocol. Used by the finite state machine to determine - * valid responses. - */ -public enum AMQState -{ - - CONNECTION_NOT_STARTED(1, "CONNECTION_NOT_STARTED"), - - CONNECTION_NOT_TUNED(2, "CONNECTION_NOT_TUNED"), - - CONNECTION_NOT_OPENED(3, "CONNECTION_NOT_OPENED"), - - CONNECTION_OPEN(4, "CONNECTION_OPEN"), - - CONNECTION_CLOSING(5, "CONNECTION_CLOSING"), - - CONNECTION_CLOSED(6, "CONNECTION_CLOSED"); - - - private final int _id; - - private final String _name; - - private AMQState(int id, String name) - { - _id = id; - _name = name; - } - - public String toString() - { - return "AMQState: id = " + _id + " name: " + _name; - } - - - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateChangedEvent.java b/java/client/src/main/java/org/apache/qpid/client/state/AMQStateChangedEvent.java deleted file mode 100644 index edef54ccd6..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateChangedEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * 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.qpid.client.state; - -/** - * An event that is fired when the protocol state has changed. - * - */ -public class AMQStateChangedEvent -{ - private final AMQState _oldState; - - private final AMQState _newState; - - public AMQStateChangedEvent(AMQState oldState, AMQState newState) - { - _oldState = oldState; - _newState = newState; - } - - public AMQState getOldState() - { - return _oldState; - } - - public AMQState getNewState() - { - return _newState; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateListener.java b/java/client/src/main/java/org/apache/qpid/client/state/AMQStateListener.java deleted file mode 100644 index 110471aad0..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * 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.qpid.client.state; - -public interface AMQStateListener -{ - void stateChanged(AMQStateChangedEvent evt); -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateManager.java b/java/client/src/main/java/org/apache/qpid/client/state/AMQStateManager.java deleted file mode 100644 index 9c7d62670c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/AMQStateManager.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * - * 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.qpid.client.state; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.framing.*; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.apache.qpid.protocol.AMQMethodListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Set; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.io.IOException; - -/** - * The state manager is responsible for managing the state of the protocol session. <p/> - * For each {@link org.apache.qpid.client.protocol.AMQProtocolHandler} there is a separate state manager. - * - * The AMQStateManager is now attached to the {@link org.apache.qpid.client.protocol.AMQProtocolHandler} and that is the sole point of reference so that - * As the {@link AMQProtocolSession} changes due to failover the AMQStateManager need not be copied around. - * - * The StateManager works by any component can wait for a state change to occur by using the following sequence. - * - * <li>StateWaiter waiter = stateManager.createWaiter(Set<AMQState> states); - * <li> // Perform action that will cause state change - * <li>waiter.await(); - * - * The two step process is required as there is an inherit race condition between starting a process that will cause - * the state to change and then attempting to wait for that change. The interest in the change must be first set up so - * that any asynchrous errors that occur can be delivered to the correct waiters. - */ -public class AMQStateManager implements AMQMethodListener -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQStateManager.class); - - private AMQProtocolSession _protocolSession; - - /** The current state */ - private AMQState _currentState; - - private final Object _stateLock = new Object(); - - private static final long MAXIMUM_STATE_WAIT_TIME = Long.parseLong(System.getProperty("amqj.MaximumStateWait", "30000")); - - protected final List<StateWaiter> _waiters = new CopyOnWriteArrayList<StateWaiter>(); - private Exception _lastException; - - public AMQStateManager() - { - this(null); - } - - public AMQStateManager(AMQProtocolSession protocolSession) - { - this(AMQState.CONNECTION_NOT_STARTED, protocolSession); - } - - protected AMQStateManager(AMQState state, AMQProtocolSession protocolSession) - { - _protocolSession = protocolSession; - _currentState = state; - } - - public AMQState getCurrentState() - { - return _currentState; - } - - public void changeState(AMQState newState) - { - _logger.debug("State changing to " + newState + " from old state " + _currentState); - - synchronized (_stateLock) - { - _currentState = newState; - - _logger.debug("Notififying State change to " + _waiters.size() + " : " + _waiters); - - for (StateWaiter waiter : _waiters) - { - waiter.received(newState); - } - } - } - - public <B extends AMQMethodBody> boolean methodReceived(AMQMethodEvent<B> evt) throws AMQException - { - B method = evt.getMethod(); - - // StateAwareMethodListener handler = findStateTransitionHandler(_currentState, evt.getMethod()); - method.execute(_protocolSession.getMethodDispatcher(), evt.getChannelId()); - return true; - } - - /** - * Setting of the ProtocolSession will be required when Failover has been successfuly compeleted. - * - * The new {@link AMQProtocolSession} that has been re-established needs to be provided as that is now the - * connection to the network. - * - * @param session The new protocol session - */ - public void setProtocolSession(AMQProtocolSession session) - { - if (_logger.isInfoEnabled()) - { - _logger.info("Setting ProtocolSession:" + session); - } - _protocolSession = session; - } - - /** - * Propogate error to waiters - * - * @param error The error to propogate. - */ - public void error(Exception error) - { - if (error instanceof AMQException) - { - // AMQException should be being notified before closing the - // ProtocolSession. Which will change the State to CLOSED. - // if we have a hard error. - if (((AMQException)error).isHardError()) - { - changeState(AMQState.CONNECTION_CLOSING); - } - } - else - { - // Be on the safe side here and mark the connection closed - changeState(AMQState.CONNECTION_CLOSED); - } - - if (_waiters.size() == 0) - { - _logger.error("No Waiters for error saving as last error:" + error.getMessage()); - _lastException = error; - } - for (StateWaiter waiter : _waiters) - { - _logger.error("Notifying Waiters(" + _waiters + ") for error:" + error.getMessage()); - waiter.error(error); - } - } - - /** - * This provides a single place that the maximum time for state change to occur can be accessed. - * It is currently set via System property amqj.MaximumStateWait - * - * @return long Milliseconds value for a timeout - */ - public long getWaitTimeout() - { - return MAXIMUM_STATE_WAIT_TIME; - } - - /** - * Create and add a new waiter to the notifcation list. - * - * @param states The waiter will attempt to wait for one of these desired set states to be achived. - * - * @return the created StateWaiter. - */ - public StateWaiter createWaiter(Set<AMQState> states) - { - final StateWaiter waiter; - synchronized (_stateLock) - { - waiter = new StateWaiter(this, _currentState, states); - - _waiters.add(waiter); - } - - return waiter; - } - - /** - * Remove the waiter from the notification list. - * - * @param waiter The waiter to remove. - */ - public void removeWaiter(StateWaiter waiter) - { - synchronized (_stateLock) - { - _waiters.remove(waiter); - } - } - - public Exception getLastException() - { - return _lastException; - } - - public void clearLastException() - { - _lastException = null; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/StateAwareMethodListener.java b/java/client/src/main/java/org/apache/qpid/client/state/StateAwareMethodListener.java deleted file mode 100644 index 17d04f4fa3..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/StateAwareMethodListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * 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.qpid.client.state; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.protocol.AMQMethodEvent; - -/** - * A frame listener that is informed of the protocl state when invoked and has - * the opportunity to update state. - * - */ -public interface StateAwareMethodListener<B extends AMQMethodBody> -{ - - void methodReceived(AMQProtocolSession session, B body, int channelId) throws AMQException; - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/StateWaiter.java b/java/client/src/main/java/org/apache/qpid/client/state/StateWaiter.java deleted file mode 100644 index 79f438d35d..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/StateWaiter.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * - * 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.qpid.client.state; - -import org.apache.qpid.client.util.BlockingWaiter; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.AMQException; -import org.slf4j.LoggerFactory; -import org.slf4j.Logger; - -import java.util.Set; - -/** - * This is an implementation of the {@link BlockingWaiter} to provide error handing and a waiting mechanism for state - * changes. - * - * On construction the current state and a set of States to await for is provided. - * - * When await() is called the state at constuction is compared against the awaitStates. If the state at construction is - * a desired state then await() returns immediately. - * - * Otherwise it will block for the set timeout for a desired state to be achieved. - * - * The state changes are notified via the {@link #process} method. - * - * Any notified error is handled by the BlockingWaiter and thrown from the {@link #block} method. - * - */ -public class StateWaiter extends BlockingWaiter<AMQState> -{ - private static final Logger _logger = LoggerFactory.getLogger(StateWaiter.class); - - Set<AMQState> _awaitStates; - private AMQState _startState; - private AMQStateManager _stateManager; - - /** - * - * @param stateManager The StateManager - * @param currentState - * @param awaitStates - */ - public StateWaiter(AMQStateManager stateManager, AMQState currentState, Set<AMQState> awaitStates) - { - _logger.info("New StateWaiter :" + currentState + ":" + awaitStates); - _stateManager = stateManager; - _awaitStates = awaitStates; - _startState = currentState; - } - - /** - * When the state is changed this StateWaiter is notified to process the change. - * - * @param state The new state that has been achieved. - * @return - */ - public boolean process(AMQState state) - { - return _awaitStates.contains(state); - } - - /** - * Await for the requried State to be achieved within the default timeout. - * @return The achieved state that was requested. - * @throws AMQException The exception that prevented the required state from being achived. - */ - public AMQState await() throws AMQException - { - return await(_stateManager.getWaitTimeout()); - } - - /** - * Await for the requried State to be achieved. - * - * <b>It is the responsibility of this class to remove the waiter from the StateManager - * - * @param timeout The time in milliseconds to wait for any of the states to be achived. - * @return The achieved state that was requested. - * @throws AMQException The exception that prevented the required state from being achived. - */ - public AMQState await(long timeout) throws AMQException - { - try - { - if (process(_startState)) - { - return _startState; - } - - try - { - return (AMQState) block(timeout); - } - catch (FailoverException e) - { - _logger.error("Failover occured whilst waiting for states:" + _awaitStates); - - return null; - } - } - finally - { - //Prevent any more errors being notified to this waiter. - close(); - - //Remove the waiter from the notifcation list in the statee manager - _stateManager.removeWaiter(this); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/state/listener/SpecificMethodFrameListener.java b/java/client/src/main/java/org/apache/qpid/client/state/listener/SpecificMethodFrameListener.java deleted file mode 100644 index f0d7feb059..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/state/listener/SpecificMethodFrameListener.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * 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.qpid.client.state.listener; - - -import org.apache.qpid.client.protocol.BlockingMethodFrameListener; -import org.apache.qpid.framing.AMQMethodBody; - -public class SpecificMethodFrameListener extends BlockingMethodFrameListener -{ - private final Class _expectedClass; - - public SpecificMethodFrameListener(int channelId, Class expectedClass) - { - super(channelId); - _expectedClass = expectedClass; - } - - public boolean processMethod(int channelId, AMQMethodBody frame) - { - return _expectedClass.isInstance(frame); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/AMQNoTransportForProtocolException.java b/java/client/src/main/java/org/apache/qpid/client/transport/AMQNoTransportForProtocolException.java deleted file mode 100644 index 6e47e2ce28..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/AMQNoTransportForProtocolException.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import org.apache.qpid.jms.BrokerDetails; - -/** - * AMQNoTransportForProtocolException represents a connection failure where there is no transport medium to connect - * to the broker available. This may be the case if their is a error in the connection url, or an unsupported transport - * type is specified. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent absence of a transport medium. - * </table> - * - * @todo Error code never used. This is not an AMQException. - */ -public class AMQNoTransportForProtocolException extends AMQTransportConnectionException -{ - BrokerDetails _details; - - public AMQNoTransportForProtocolException(BrokerDetails details, String message, Throwable cause) - { - super(null, message, cause); - - _details = details; - } - - public String toString() - { - if (_details != null) - { - return super.toString() + _details.toString(); - } - else - { - return super.toString(); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/AMQTransportConnectionException.java b/java/client/src/main/java/org/apache/qpid/client/transport/AMQTransportConnectionException.java deleted file mode 100644 index 6bef6216bd..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/AMQTransportConnectionException.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import org.apache.qpid.AMQException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQTransportConnectionException indicates a failure to establish a connection through the transporting medium, to - * an AMQP broker. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent failure to connect through the transport medium. - * </table> - * - * @todo Error code never used. This is not an AMQException. - */ -public class AMQTransportConnectionException extends AMQException -{ - public AMQTransportConnectionException(AMQConstant errorCode, String message, Throwable cause) - { - super(errorCode, message, cause); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/ITransportConnection.java b/java/client/src/main/java/org/apache/qpid/client/transport/ITransportConnection.java deleted file mode 100644 index 7a24d6e15a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/ITransportConnection.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import java.io.IOException; - -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.jms.BrokerDetails; - -public interface ITransportConnection -{ - void connect(AMQProtocolHandler protocolHandler, BrokerDetails brokerDetail) - throws IOException; -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/SocketTransportConnection.java b/java/client/src/main/java/org/apache/qpid/client/transport/SocketTransportConnection.java deleted file mode 100644 index 1ac8f62e32..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/SocketTransportConnection.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import java.io.IOException; -import java.net.InetSocketAddress; - -import org.apache.mina.common.ByteBuffer; -import org.apache.mina.common.IoConnector; -import org.apache.mina.common.SimpleByteBufferAllocator; -import org.apache.qpid.client.SSLConfiguration; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.ssl.SSLContextFactory; -import org.apache.qpid.transport.network.mina.MINANetworkDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SocketTransportConnection implements ITransportConnection -{ - private static final Logger _logger = LoggerFactory.getLogger(SocketTransportConnection.class); - private static final int DEFAULT_BUFFER_SIZE = 32 * 1024; - - private SocketConnectorFactory _socketConnectorFactory; - - static interface SocketConnectorFactory - { - IoConnector newSocketConnector(); - } - - public SocketTransportConnection(SocketConnectorFactory socketConnectorFactory) - { - _socketConnectorFactory = socketConnectorFactory; - } - - public void connect(AMQProtocolHandler protocolHandler, BrokerDetails brokerDetail) throws IOException - { - ByteBuffer.setUseDirectBuffers(Boolean.getBoolean("amqj.enableDirectBuffers")); - - // the MINA default is currently to use the pooled allocator although this may change in future - // once more testing of the performance of the simple allocator has been done - if (!Boolean.getBoolean("amqj.enablePooledAllocator")) - { - _logger.info("Using SimpleByteBufferAllocator"); - ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); - } - - final IoConnector ioConnector = _socketConnectorFactory.newSocketConnector(); - final InetSocketAddress address; - - if (brokerDetail.getTransport().equals(BrokerDetails.SOCKET)) - { - address = null; - } - else - { - address = new InetSocketAddress(brokerDetail.getHost(), brokerDetail.getPort()); - _logger.info("Attempting connection to " + address); - } - - SSLConfiguration sslConfig = protocolHandler.getConnection().getSSLConfiguration(); - SSLContextFactory sslFactory = null; - if (sslConfig != null) - { - sslFactory = new SSLContextFactory(sslConfig.getKeystorePath(), sslConfig.getKeystorePassword(), sslConfig.getCertType()); - } - - MINANetworkDriver driver = new MINANetworkDriver(ioConnector); - driver.open(brokerDetail.getPort(), address.getAddress(), protocolHandler, null, sslFactory); - protocolHandler.setNetworkDriver(driver); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/TransportConnection.java b/java/client/src/main/java/org/apache/qpid/client/transport/TransportConnection.java deleted file mode 100644 index aef3a563af..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/TransportConnection.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import java.io.IOException; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.mina.common.IoConnector; -import org.apache.mina.common.IoHandlerAdapter; -import org.apache.mina.common.IoServiceConfig; -import org.apache.mina.transport.socket.nio.ExistingSocketConnector; -import org.apache.mina.transport.socket.nio.MultiThreadSocketConnector; -import org.apache.mina.transport.socket.nio.SocketConnector; -import org.apache.mina.transport.vmpipe.VmPipeAcceptor; -import org.apache.mina.transport.vmpipe.VmPipeAddress; -import org.apache.qpid.client.vmbroker.AMQVMBrokerCreationException; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.protocol.ProtocolEngineFactory; -import org.apache.qpid.thread.QpidThreadExecutor; -import org.apache.qpid.transport.network.mina.MINANetworkDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The TransportConnection is a helper class responsible for connecting to an AMQ server. It sets up the underlying - * connector, which currently always uses TCP/IP sockets. It creates the "protocol handler" which deals with MINA - * protocol events. <p/> Could be extended in future to support different transport types by turning this into concrete - * class/interface combo. - */ -public class TransportConnection -{ - private static ITransportConnection _instance; - - private static final Map _inVmPipeAddress = new HashMap(); - private static VmPipeAcceptor _acceptor; - private static int _currentInstance = -1; - private static int _currentVMPort = -1; - - private static final int TCP = 0; - private static final int VM = 1; - private static final int SOCKET = 2; - - private static Logger _logger = LoggerFactory.getLogger(TransportConnection.class); - - private static final String DEFAULT_QPID_SERVER = "org.apache.qpid.server.protocol.AMQProtocolEngineFactory"; - - private static Map<String, Socket> _openSocketRegister = new ConcurrentHashMap<String, Socket>(); - - public static void registerOpenSocket(String socketID, Socket openSocket) - { - _openSocketRegister.put(socketID, openSocket); - } - - public static Socket removeOpenSocket(String socketID) - { - return _openSocketRegister.remove(socketID); - } - - public static synchronized ITransportConnection getInstance(final BrokerDetails details) throws AMQTransportConnectionException - { - int transport = getTransport(details.getTransport()); - - if (transport == -1) - { - throw new AMQNoTransportForProtocolException(details, null, null); - } - - switch (transport) - { - case SOCKET: - return new SocketTransportConnection(new SocketTransportConnection.SocketConnectorFactory() - { - public IoConnector newSocketConnector() - { - ExistingSocketConnector connector = new ExistingSocketConnector(1,new QpidThreadExecutor()); - - Socket socket = TransportConnection.removeOpenSocket(details.getHost()); - - if (socket != null) - { - _logger.info("Using existing Socket:" + socket); - - ((ExistingSocketConnector) connector).setOpenSocket(socket); - } - else - { - throw new IllegalArgumentException("Active Socket must be provided for broker " + - "with 'socket://<SocketID>' transport:" + details); - } - return connector; - } - }); - case TCP: - return new SocketTransportConnection(new SocketTransportConnection.SocketConnectorFactory() - { - public IoConnector newSocketConnector() - { - SocketConnector result; - // FIXME - this needs to be sorted to use the new Mina MultiThread SA. - if (Boolean.getBoolean("qpidnio")) - { - _logger.warn("Using Qpid MultiThreaded NIO - " + (System.getProperties().containsKey("qpidnio") - ? "Qpid NIO is new default" - : "Sysproperty 'qpidnio' is set")); - result = new MultiThreadSocketConnector(1, new QpidThreadExecutor()); - } - else - { - _logger.info("Using Mina NIO"); - result = new SocketConnector(1, new QpidThreadExecutor()); // non-blocking connector - } - // Don't have the connector's worker thread wait around for other connections (we only use - // one SocketConnector per connection at the moment anyway). This allows short-running - // clients (like unit tests) to complete quickly. - result.setWorkerTimeout(0); - return result; - } - }); - case VM: - { - return getVMTransport(details, Boolean.getBoolean("amqj.AutoCreateVMBroker")); - } - default: - throw new AMQNoTransportForProtocolException(details, "Transport not recognised:" + transport, null); - } - } - - private static int getTransport(String transport) - { - if (transport.equals(BrokerDetails.SOCKET)) - { - return SOCKET; - } - - if (transport.equals(BrokerDetails.TCP)) - { - return TCP; - } - - if (transport.equals(BrokerDetails.VM)) - { - return VM; - } - - return -1; - } - - private static ITransportConnection getVMTransport(BrokerDetails details, boolean AutoCreate) - throws AMQVMBrokerCreationException - { - int port = details.getPort(); - - synchronized (_inVmPipeAddress) - { - if (!_inVmPipeAddress.containsKey(port)) - { - if (AutoCreate) - { - _logger.warn("Auto Creating InVM Broker on port:" + port); - createVMBroker(port); - } - else - { - throw new AMQVMBrokerCreationException(null, port, "VM Broker on port " + port - + " does not exist. Auto create disabled.", null); - } - } - } - - return new VmPipeTransportConnection(port); - } - - public static void createVMBroker(int port) throws AMQVMBrokerCreationException - { - synchronized(TransportConnection.class) - { - if (_acceptor == null) - { - _acceptor = new VmPipeAcceptor(); - - IoServiceConfig config = _acceptor.getDefaultConfig(); - } - } - synchronized (_inVmPipeAddress) - { - - if (!_inVmPipeAddress.containsKey(port)) - { - _logger.info("Creating InVM Qpid.AMQP listening on port " + port); - IoHandlerAdapter provider = null; - try - { - VmPipeAddress pipe = new VmPipeAddress(port); - - provider = createBrokerInstance(port); - - _acceptor.bind(pipe, provider); - - _inVmPipeAddress.put(port, pipe); - _logger.info("Created InVM Qpid.AMQP listening on port " + port); - } - catch (IOException e) - { - _logger.error("Got IOException.", e); - - // Try and unbind provider - try - { - VmPipeAddress pipe = new VmPipeAddress(port); - - try - { - _acceptor.unbind(pipe); - } - catch (Exception ignore) - { - // ignore - } - - if (provider == null) - { - provider = createBrokerInstance(port); - } - - _acceptor.bind(pipe, provider); - _inVmPipeAddress.put(port, pipe); - _logger.info("Created InVM Qpid.AMQP listening on port " + port); - } - catch (IOException justUseFirstException) - { - String because; - if (e.getCause() == null) - { - because = e.toString(); - } - else - { - because = e.getCause().toString(); - } - - throw new AMQVMBrokerCreationException(null, port, because + " Stopped binding of InVM Qpid.AMQP", e); - } - } - - } - else - { - _logger.info("InVM Qpid.AMQP on port " + port + " already exits."); - } - } - } - - private static IoHandlerAdapter createBrokerInstance(int port) throws AMQVMBrokerCreationException - { - String protocolProviderClass = System.getProperty("amqj.protocolprovider.class", DEFAULT_QPID_SERVER); - _logger.info("Creating Qpid protocol provider: " + protocolProviderClass); - - // can't use introspection to get Provider as it is a server class. - // need to go straight to IoHandlerAdapter but that requries the queues and exchange from the ApplicationRegistry which we can't access. - - // get right constructor and pass in instancec ID - "port" - IoHandlerAdapter provider; - try - { - Class[] cnstr = {Integer.class}; - Object[] params = {port}; - - provider = new MINANetworkDriver(); - ProtocolEngineFactory engineFactory = (ProtocolEngineFactory) Class.forName(protocolProviderClass).getConstructor(cnstr).newInstance(params); - ((MINANetworkDriver) provider).setProtocolEngineFactory(engineFactory, true); - // Give the broker a second to create - _logger.info("Created VMBroker Instance:" + port); - } - catch (Exception e) - { - _logger.info("Unable to create InVM Qpid.AMQP on port " + port + ". Because: " + e.getCause()); - String because; - if (e.getCause() == null) - { - because = e.toString(); - } - else - { - because = e.getCause().toString(); - } - - AMQVMBrokerCreationException amqbce = - new AMQVMBrokerCreationException(null, port, because + " Stopped InVM Qpid.AMQP creation", e); - throw amqbce; - } - - return provider; - } - - public static void killAllVMBrokers() - { - _logger.info("Killing all VM Brokers"); - synchronized(TransportConnection.class) - { - if (_acceptor != null) - { - _acceptor.unbindAll(); - } - synchronized (_inVmPipeAddress) - { - _inVmPipeAddress.clear(); - } - _acceptor = null; - } - _currentInstance = -1; - _currentVMPort = -1; - } - - public static void killVMBroker(int port) - { - synchronized (_inVmPipeAddress) - { - VmPipeAddress pipe = (VmPipeAddress) _inVmPipeAddress.get(port); - if (pipe != null) - { - _logger.info("Killing VM Broker:" + port); - _inVmPipeAddress.remove(port); - // This does need to be sychronized as otherwise mina can hang - // if a new connection is made - _acceptor.unbind(pipe); - } - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/transport/VmPipeTransportConnection.java b/java/client/src/main/java/org/apache/qpid/client/transport/VmPipeTransportConnection.java deleted file mode 100644 index 87cc2e7a5a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/transport/VmPipeTransportConnection.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * 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.qpid.client.transport; - -import java.io.IOException; - -import org.apache.mina.common.ConnectFuture; -import org.apache.mina.transport.vmpipe.QpidVmPipeConnector; -import org.apache.mina.transport.vmpipe.VmPipeAddress; -import org.apache.mina.transport.vmpipe.VmPipeConnector; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.transport.network.mina.MINANetworkDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class VmPipeTransportConnection implements ITransportConnection -{ - private static final Logger _logger = LoggerFactory.getLogger(VmPipeTransportConnection.class); - - private int _port; - - private MINANetworkDriver _networkDriver; - - public VmPipeTransportConnection(int port) - { - _port = port; - } - - public void connect(AMQProtocolHandler protocolHandler, BrokerDetails brokerDetail) throws IOException - { - final VmPipeConnector ioConnector = new QpidVmPipeConnector(); - - final VmPipeAddress address = new VmPipeAddress(_port); - _logger.info("Attempting connection to " + address); - _networkDriver = new MINANetworkDriver(ioConnector, protocolHandler); - protocolHandler.setNetworkDriver(_networkDriver); - ConnectFuture future = ioConnector.connect(address, _networkDriver); - // wait for connection to complete - future.join(); - // we call getSession which throws an IOException if there has been an error connecting - future.getSession(); - _networkDriver.setProtocolEngine(protocolHandler); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/url/URLParser.java b/java/client/src/main/java/org/apache/qpid/client/url/URLParser.java deleted file mode 100644 index f3f74dd332..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/url/URLParser.java +++ /dev/null @@ -1,253 +0,0 @@ -package org.apache.qpid.client.url; -/* - * - * 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. - * - */ - - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.StringTokenizer; - -import org.apache.qpid.client.AMQBrokerDetails; -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.client.AMQConnectionURL; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.url.URLHelper; -import org.apache.qpid.url.URLSyntaxException; - -public class URLParser -{ - private AMQConnectionURL _url; - - public URLParser(AMQConnectionURL url)throws URLSyntaxException - { - _url = url; - parseURL(_url.getURL()); - } - - private void parseURL(String fullURL) throws URLSyntaxException - { - // Connection URL format - // amqp://[user:pass@][clientid]/virtualhost?brokerlist='tcp://host:port?option=\'value\',option=\'value\';vm://:3/virtualpath?option=\'value\'',failover='method?option=\'value\',option='value''" - // Options are of course optional except for requiring a single broker in the broker list. - try - { - URI connection = new URI(fullURL); - - if ((connection.getScheme() == null) || !(connection.getScheme().equalsIgnoreCase(AMQConnectionURL.AMQ_PROTOCOL))) - { - throw new URISyntaxException(fullURL, "Not an AMQP URL"); - } - - if ((connection.getHost() == null) || connection.getHost().equals("")) - { - String tmp = connection.getAuthority(); - // hack to read a clientid such as "my_clientID" - if (tmp != null && tmp.indexOf('@') < tmp.length()-1) - { - _url.setClientName(tmp.substring(tmp.indexOf('@')+1,tmp.length())); - } - else - { - String uid = AMQConnectionFactory.getUniqueClientID(); - if (uid == null) - { - throw URLHelper.parseError(-1, "Client Name not specified", fullURL); - } - else - { - _url.setClientName(uid); - } - } - - } - else - { - _url.setClientName(connection.getHost()); - } - - String userInfo = connection.getUserInfo(); - - if (userInfo == null) - { - // Fix for Java 1.5 which doesn't parse UserInfo for non http URIs - userInfo = connection.getAuthority(); - - if (userInfo != null) - { - int atIndex = userInfo.indexOf('@'); - - if (atIndex != -1) - { - userInfo = userInfo.substring(0, atIndex); - } - else - { - userInfo = null; - } - } - - } - - if (userInfo == null) - { - throw URLHelper.parseError(AMQConnectionURL.AMQ_PROTOCOL.length() + 3, "User information not found on url", fullURL); - } - else - { - parseUserInfo(userInfo); - } - - String virtualHost = connection.getPath(); - - if ((virtualHost != null) && (!virtualHost.equals(""))) - { - _url.setVirtualHost(virtualHost); - } - else - { - int authLength = connection.getAuthority().length(); - int start = AMQConnectionURL.AMQ_PROTOCOL.length() + 3; - int testIndex = start + authLength; - if ((testIndex < fullURL.length()) && (fullURL.charAt(testIndex) == '?')) - { - throw URLHelper.parseError(start, testIndex - start, "Virtual host found", fullURL); - } - else - { - throw URLHelper.parseError(-1, "Virtual host not specified", fullURL); - } - - } - - URLHelper.parseOptions(_url.getOptions(), connection.getQuery()); - - processOptions(); - } - catch (URISyntaxException uris) - { - if (uris instanceof URLSyntaxException) - { - throw (URLSyntaxException) uris; - } - - int slash = fullURL.indexOf("\\"); - - if (slash == -1) - { - throw URLHelper.parseError(uris.getIndex(), uris.getReason(), uris.getInput()); - } - else - { - if ((slash != 0) && (fullURL.charAt(slash - 1) == ':')) - { - throw URLHelper.parseError(slash - 2, fullURL.indexOf('?') - slash + 2, - "Virtual host looks like a windows path, forward slash not allowed in URL", fullURL); - } - else - { - throw URLHelper.parseError(slash, "Forward slash not allowed in URL", fullURL); - } - } - - } - } - - private void parseUserInfo(String userinfo) throws URLSyntaxException - { - // user info = user:pass - - int colonIndex = userinfo.indexOf(':'); - - if (colonIndex == -1) - { - throw URLHelper.parseError(AMQConnectionURL.AMQ_PROTOCOL.length() + 3, userinfo.length(), - "Null password in user information not allowed.", _url.getURL()); - } - else - { - _url.setUsername(userinfo.substring(0, colonIndex)); - _url.setPassword(userinfo.substring(colonIndex + 1)); - } - - } - - private void processOptions() throws URLSyntaxException - { - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_BROKERLIST)) - { - String brokerlist = _url.getOptions().get(AMQConnectionURL.OPTIONS_BROKERLIST); - - // brokerlist tcp://host:port?option='value',option='value';vm://:3/virtualpath?option='value' - StringTokenizer st = new StringTokenizer(brokerlist, "" + URLHelper.BROKER_SEPARATOR); - - while (st.hasMoreTokens()) - { - String broker = st.nextToken(); - - _url.addBrokerDetails(new AMQBrokerDetails(broker)); - } - - _url.getOptions().remove(AMQConnectionURL.OPTIONS_BROKERLIST); - } - - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_FAILOVER)) - { - String failover = _url.getOptions().get(AMQConnectionURL.OPTIONS_FAILOVER); - - // failover='method?option='value',option='value'' - - int methodIndex = failover.indexOf('?'); - - if (methodIndex > -1) - { - _url.setFailoverMethod(failover.substring(0, methodIndex)); - URLHelper.parseOptions(_url.getFailoverOptions(), failover.substring(methodIndex + 1)); - } - else - { - _url.setFailoverMethod(failover); - } - - _url.getOptions().remove(AMQConnectionURL.OPTIONS_FAILOVER); - } - - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_DEFAULT_TOPIC_EXCHANGE)) - { - _url.setDefaultTopicExchangeName(new AMQShortString(_url.getOptions().get(AMQConnectionURL.OPTIONS_DEFAULT_TOPIC_EXCHANGE))); - } - - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_DEFAULT_QUEUE_EXCHANGE)) - { - _url.setDefaultQueueExchangeName(new AMQShortString(_url.getOptions().get(AMQConnectionURL.OPTIONS_DEFAULT_QUEUE_EXCHANGE))); - } - - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_TEMPORARY_QUEUE_EXCHANGE)) - { - _url.setTemporaryQueueExchangeName(new AMQShortString(_url.getOptions().get(AMQConnectionURL.OPTIONS_TEMPORARY_QUEUE_EXCHANGE))); - } - - if (_url.getOptions().containsKey(AMQConnectionURL.OPTIONS_TEMPORARY_TOPIC_EXCHANGE)) - { - _url.setTemporaryTopicExchangeName(new AMQShortString(_url.getOptions().get(AMQConnectionURL.OPTIONS_TEMPORARY_TOPIC_EXCHANGE))); - } - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/url/URLParser_0_10.java b/java/client/src/main/java/org/apache/qpid/client/url/URLParser_0_10.java deleted file mode 100644 index 605e9ee154..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/url/URLParser_0_10.java +++ /dev/null @@ -1,423 +0,0 @@ -/* 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.qpid.client.url; - -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.qpid.client.AMQBrokerDetails; -import org.apache.qpid.jms.BrokerDetails; - -/** - * The format Qpid URL is based on the AMQP one. - * The grammar is as follows: - * <p> qpid_url = "qpid:" [client_props "@"] port_addr_list ["/" future-parameters] - * <p> port_addr_list = [port_addr ","]* port_addr - * <p> port_addr = tcp_port_addr | tls_prot_addr | future_prot_addr - * <p> tcp_port_addr = tcp_id tcp_addr - * <p> tcp_id = "tcp:" | "" - * <p> tcp_addr = host [":" port] - * <p> host = <as per http://www.apps.ietf.org/> - * <p> port = number - * <p> tls_prot_addr = tls_id tls_addr - * <p> tls_id = "tls:" | "" - * <p> tls_addr = host [":" port] - * <p> future_prot_addr = future_prot_id future_prot_addr - * <p> future_prot_id = <placeholder, must end in ":". Example "sctp:"> - * <p> future_prot_addr = <placeholder, protocl-specific address> - * <p> future_parameters = <placeholder, not used in failover addresses> - * <p> client_props = [client_prop ";"]* client_prop - * <p> client_prop = prop "=" val - * <p> prop = chars as per <as per http://www.apps.ietf.org/> - * <p> val = valid as per <as per http://www.apps.ietf.org/> - * <p/> - * Ex: qpid:virtualhost=tcp:host-foo,test,client_id=foo@tcp:myhost.com:5672,virtualhost=prod; - * keystore=/opt/keystore@client_id2@tls:mysecurehost.com:5672 - */ -public class URLParser_0_10 -{ - private static final char[] URL_START_SEQ = new char[]{'q', 'p', 'i', 'd', ':'}; - private static final char PROPERTY_EQUALS_CHAR = '='; - private static final char PROPERTY_SEPARATOR_CHAR = ';'; - private static final char ADDRESS_SEPERATOR_CHAR = ','; - - //private static final char CLIENT_ID_TRANSPORT_SEPARATOR_CHAR = ':'; - private static final char TRANSPORT_HOST_SEPARATOR_CHAR = ':'; - private static final char HOST_PORT_SEPARATOR_CHAR = ':'; - private static final char AT_CHAR = '@'; - private static final char END_OF_URL_MARKER = '^'; - - enum URLParserState - { - QPID_URL_START, - ADDRESS_START, - PROPERTY_NAME, - PROPERTY_EQUALS, - PROPERTY_VALUE, - PROPERTY_SEPARATOR, - AT_CHAR, - TRANSPORT, - TRANSPORT_HOST_SEPARATOR, - HOST, - HOST_PORT_SEPARATOR, - PORT, - ADDRESS_END, - ADDRESS_SEPERATOR, - QPID_URL_END, - ERROR - } - - //-- Constructors - - private char[] _url; - private List<BrokerDetails> _brokerDetailList = new ArrayList<BrokerDetails>(); - private String _error; - private int _index = 0; - private BrokerDetails _currentBroker; - private String _currentPropName; - private boolean _endOfURL = false; - private URLParserState _currentParserState; - - public URLParser_0_10(String url) throws MalformedURLException - { - _url = (url + END_OF_URL_MARKER).toCharArray(); - _endOfURL = false; - _currentParserState = URLParserState.QPID_URL_START; - URLParserState prevState = _currentParserState; // for error handling - try - { - while (_currentParserState != URLParserState.ERROR && _currentParserState != URLParserState.QPID_URL_END) - { - prevState = _currentParserState; - _currentParserState = next(); - } - - if (_currentParserState == URLParserState.ERROR) - { - _error = - "Invalid URL format [current_state = " + prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index + ") due to " + _error; - MalformedURLException ex; - ex = new MalformedURLException(_error); - throw ex; - } - } - catch (ArrayIndexOutOfBoundsException e) - { - _error = "Invalid URL format [current_state = " + prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index + ")"; - MalformedURLException ex = new MalformedURLException(_error); - throw ex; - } - } - - //-- interface QpidURL - public List<BrokerDetails> getAllBrokerDetails() - { - return _brokerDetailList; - } - - public String getURL() - { - return new String(_url); - } - - private URLParserState next() - { - switch (_currentParserState) - { - case QPID_URL_START: - return checkSequence(URL_START_SEQ, URLParserState.ADDRESS_START); - case ADDRESS_START: - return startAddress(); - case PROPERTY_NAME: - return extractPropertyName(); - case PROPERTY_EQUALS: - _index++; // skip the equal sign - return URLParserState.PROPERTY_VALUE; - case PROPERTY_VALUE: - return extractPropertyValue(); - case PROPERTY_SEPARATOR: - _index++; // skip "," - return URLParserState.PROPERTY_NAME; - case AT_CHAR: - _index++; // skip the @ sign - return URLParserState.TRANSPORT; - case TRANSPORT: - return extractTransport(); - case TRANSPORT_HOST_SEPARATOR: - _index++; // skip ":" - return URLParserState.HOST; - case HOST: - return extractHost(); - case HOST_PORT_SEPARATOR: - _index++; // skip ":" - return URLParserState.PORT; - case PORT: - return extractPort(); - case ADDRESS_END: - return endAddress(); - case ADDRESS_SEPERATOR: - _index++; // skip "," - return URLParserState.ADDRESS_START; - default: - return URLParserState.ERROR; - } - } - - private URLParserState checkSequence(char[] expected, URLParserState nextPart) - { - for (char expectedChar : expected) - { - if (expectedChar != _url[_index]) - { - _error = "Excepted (" + expectedChar + ") at position " + _index + ", got (" + _url[_index] + ")"; - return URLParserState.ERROR; - } - _index++; - } - return nextPart; - } - - private URLParserState startAddress() - { - _currentBroker = new AMQBrokerDetails(); - - for (int j = _index; j < _url.length; j++) - { - if (_url[j] == PROPERTY_EQUALS_CHAR) - { - return URLParserState.PROPERTY_NAME; - } - else if (_url[j] == ADDRESS_SEPERATOR_CHAR) - { - return URLParserState.TRANSPORT; - } - } - return URLParserState.TRANSPORT; - } - - private URLParserState endAddress() - { - _brokerDetailList.add(_currentBroker); - if (_endOfURL) - { - return URLParserState.QPID_URL_END; - } - else - { - return URLParserState.ADDRESS_SEPERATOR; - } - } - - private URLParserState extractPropertyName() - { - StringBuilder b = new StringBuilder(); - char next = _url[_index]; - while (next != PROPERTY_EQUALS_CHAR && next != AT_CHAR) - { - b.append(next); - next = _url[++_index]; - } - _currentPropName = b.toString(); - if (_currentPropName.trim().equals("")) - { - _error = "Property name cannot be empty"; - return URLParserState.ERROR; - } - else if (next == PROPERTY_EQUALS_CHAR) - { - return URLParserState.PROPERTY_EQUALS; - } - else - { - return URLParserState.AT_CHAR; - } - } - - private URLParserState extractPropertyValue() - { - StringBuilder b = new StringBuilder(); - char next = _url[_index]; - while (next != PROPERTY_SEPARATOR_CHAR && next != AT_CHAR) - { - b.append(next); - next = _url[++_index]; - } - String propValue = b.toString(); - if (propValue.trim().equals("")) - { - _error = "Property values cannot be empty"; - return URLParserState.ERROR; - } - else - { - _currentBroker.setProperty(_currentPropName, propValue); - if (next == PROPERTY_SEPARATOR_CHAR) - { - return URLParserState.PROPERTY_SEPARATOR; - } - else - { - return URLParserState.AT_CHAR; - } - } - } - - private URLParserState extractTransport() - { - String transport = buildUntil(TRANSPORT_HOST_SEPARATOR_CHAR); - if (transport.trim().equals("")) - { - _error = "Transport cannot be empty"; - return URLParserState.ERROR; - } - else if (!(transport.trim().equals(BrokerDetails.PROTOCOL_TCP) || transport.trim() - .equals(BrokerDetails.PROTOCOL_TLS))) - { - _error = "Transport cannot be " + transport + " value must be tcp or tls"; - return URLParserState.ERROR; - } - else - { - _currentBroker.setTransport(transport); - return URLParserState.TRANSPORT_HOST_SEPARATOR; - } - } - - private URLParserState extractHost() - { - char nextSep = 'c'; - String host; - URLParserState nextState; - - for (int i = _index; i < _url.length; i++) - { - if (_url[i] == HOST_PORT_SEPARATOR_CHAR) - { - nextSep = HOST_PORT_SEPARATOR_CHAR; - break; - } - else if (_url[i] == ADDRESS_SEPERATOR_CHAR) - { - nextSep = ADDRESS_SEPERATOR_CHAR; - break; - } - } - - if (nextSep == HOST_PORT_SEPARATOR_CHAR) - { - host = buildUntil(HOST_PORT_SEPARATOR_CHAR); - nextState = URLParserState.HOST_PORT_SEPARATOR; - } - else if (nextSep == ADDRESS_SEPERATOR_CHAR) - { - host = buildUntil(ADDRESS_SEPERATOR_CHAR); - nextState = URLParserState.ADDRESS_END; - } - else - { - host = buildUntil(END_OF_URL_MARKER); - nextState = URLParserState.ADDRESS_END; - _endOfURL = true; - } - - if (host.trim().equals("")) - { - _error = "Host cannot be empty"; - return URLParserState.ERROR; - } - else - { - _currentBroker.setHost(host); - return nextState; - } - } - - - private URLParserState extractPort() - { - - StringBuilder b = new StringBuilder(); - try - { - char next = _url[_index]; - while (next != ADDRESS_SEPERATOR_CHAR && next != END_OF_URL_MARKER ) - { - b.append(next); - next = _url[++_index]; - } - } - catch (ArrayIndexOutOfBoundsException e) - { - _endOfURL = true; - } - String portStr = b.toString(); - if (portStr.trim().equals("")) - { - _error = "Host cannot be empty"; - return URLParserState.ERROR; - } - else - { - try - { - int port = Integer.parseInt(portStr); - _currentBroker.setPort(port); - if( _url[_index] == END_OF_URL_MARKER ) - { - _endOfURL = true; - } - return URLParserState.ADDRESS_END; - } - catch (NumberFormatException e) - { - _error = "Illegal number for port"; - return URLParserState.ERROR; - } - } - } - - private String buildUntil(char c) - { - StringBuilder b = new StringBuilder(); - char next = _url[_index]; - while (next != c) - { - b.append(next); - next = _url[++_index]; - } - return b.toString(); - } - - public static void main(String[] args) - { - String testurl = "qpid:password=pass;username=name@tcp:test1"; - try - { - URLParser_0_10 impl = new URLParser_0_10(testurl); - for (BrokerDetails d : impl.getAllBrokerDetails()) - { - System.out.println(d); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java b/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java deleted file mode 100644 index 208658a5ff..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * - * 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.qpid.client.util; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQTimeoutException; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.protocol.AMQMethodEvent; -import org.apache.qpid.protocol.AMQMethodListener; - -/** - * BlockingWaiter is a 'rendezvous' which delegates handling of - * incoming Objects to a listener implemented as a sub-class of this and hands off the process or - * error to a consumer. The producer of the event does not have to wait for the consumer to take the event, so this - * differs from a 'rendezvous' in that sense. - * - * <p/>BlockingWaiters are used to coordinate when waiting for an an event that expect a response. - * They are always used in a 'one-shot' manner, that is, to recieve just one response. Usually the caller has to register - * them as method listeners with an event dispatcher and remember to de-register them (in a finally block) once they - * have been completed. - * - * <p/>The {@link #process} must return <tt>true</tt> on any incoming method that it handles. This indicates to - * this listeners that the object just processed ends the waiting process. - * - * <p/>Errors from the producer are rethrown to the consumer. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations </td> - * <tr><td> Accept generic objects as events for processing via {@link #process}. <td> - * <tr><td> Delegate handling and undserstanding of the object to a concrete implementation. <td> - * <tr><td> Block until {@link #process} determines that waiting is no longer required <td> - * <tr><td> Propagate the most recent exception to the consumer.<td> - * </table> - * - * @todo Interuption is caught but not handled. This could be allowed to fall through. This might actually be usefull - * for fail-over where a thread is blocking when failure happens, it could be interrupted to abandon or retry - * when this happens. At the very least, restore the interrupted status flag. - * @todo If the retrotranslator can handle it, could use a SynchronousQueue to implement this rendezvous. Need to - * check that SynchronousQueue has a non-blocking put method available. - */ -public abstract class BlockingWaiter<T> -{ - /** This flag is used to indicate that the blocked for method has been received. */ - private volatile boolean _ready = false; - - /** This flag is used to indicate that the received error has been processed. */ - private volatile boolean _errorAck = false; - - /** Used to protect the shared event and ready flag between the producer and consumer. */ - private final ReentrantLock _lock = new ReentrantLock(); - - /** Used to signal that a method has been received */ - private final Condition _receivedCondition = _lock.newCondition(); - - /** Used to signal that a error has been processed */ - private final Condition _errorConditionAck = _lock.newCondition(); - - /** Used to hold the most recent exception that is passed to the {@link #error(Exception)} method. */ - private volatile Exception _error; - - /** Holds the incomming Object. */ - protected Object _doneObject = null; - private AtomicBoolean _waiting = new AtomicBoolean(false); - private boolean _closed = false; - - /** - * Delegates processing of the incomming object to the handler. - * - * @param object The object to process. - * - * @return <tt>true</tt> if the waiting is complete, <tt>false</tt> if waiting should continue. - */ - public abstract boolean process(T object); - - /** - * An Object has been received and should be processed to see if our wait condition has been reached. - * - * @param object The object received. - * - * @return <tt>true</tt> if the waiting is complete, <tt>false</tt> if waiting should continue. - */ - public boolean received(T object) - { - - boolean ready = process(object); - - if (ready) - { - // we only update the flag from inside the synchronized block - // so that the blockForFrame method cannot "miss" an update - it - // will only ever read the flag from within the synchronized block - _lock.lock(); - try - { - _doneObject = object; - _ready = ready; - _receivedCondition.signal(); - } - finally - { - _lock.unlock(); - } - } - - return ready; - } - - /** - * Blocks until an object is received that is handled by process, or the specified timeout - * has passed. - * - * Once closed any attempt to wait will throw an exception. - * - * @param timeout The timeout in milliseconds. - * - * @return The object that resolved the blocking. - * - * @throws AMQException - * @throws FailoverException - */ - public Object block(long timeout) throws AMQException, FailoverException - { - long nanoTimeout = TimeUnit.MILLISECONDS.toNanos(timeout); - - _lock.lock(); - - try - { - if (_closed) - { - throw throwClosedException(); - } - - if (_error == null) - { - _waiting.set(true); - - while (!_ready) - { - try - { - if (timeout == -1) - { - _receivedCondition.await(); - } - else - { - nanoTimeout = _receivedCondition.awaitNanos(nanoTimeout); - - if (nanoTimeout <= 0 && !_ready && _error == null) - { - _error = new AMQTimeoutException("Server did not respond in a timely fashion", null); - _ready = true; - } - } - } - catch (InterruptedException e) - { - System.err.println(e.getMessage()); - // IGNORE -- //fixme this isn't ideal as being interrupted isn't equivellant to sucess - // if (!_ready && timeout != -1) - // { - // _error = new AMQException("Server did not respond timely"); - // _ready = true; - // } - } - } - } - - if (_error != null) - { - if (_error instanceof AMQException) - { - throw (AMQException) _error; - } - else if (_error instanceof FailoverException) - { - // This should ensure that FailoverException is not wrapped and can be caught. - throw (FailoverException) _error; // needed to expose FailoverException. - } - else - { - throw new AMQException("Woken up due to " + _error.getClass(), _error); - } - } - - } - finally - { - _waiting.set(false); - - //Release Error handling thread - if (_error != null) - { - _errorAck = true; - _errorConditionAck.signal(); - - _error = null; - } - _lock.unlock(); - } - - return _doneObject; - } - - /** - * This is a callback, called when an error has occured that should interupt any waiter. - * It is also called from within this class to avoid code repetition but it should only be called by the MINA threads. - * - * Once closed any notification of an exception will be ignored. - * - * @param e The exception being propogated. - */ - public void error(Exception e) - { - // set the error so that the thread that is blocking (against blockForFrame()) - // can pick up the exception and rethrow to the caller - - _lock.lock(); - - try - { - if (_closed) - { - return; - } - - if (_error == null) - { - _error = e; - } - else - { - System.err.println("WARNING: new error '" + e == null ? "null" : e.getMessage() + "' arrived while old one not yet processed:" + _error.getMessage()); - } - - if (_waiting.get()) - { - - _ready = true; - _receivedCondition.signal(); - - while (!_errorAck) - { - try - { - _errorConditionAck.await(); - } - catch (InterruptedException e1) - { - System.err.println(e.getMessage()); - } - } - _errorAck = false; - } - } - finally - { - _lock.unlock(); - } - } - - /** - * Close this Waiter so that no more errors are processed. - * This is a preventative method to ensure that a second error thread does not get stuck in the error method after - * the await has returned. This has not happend but in practise but if two errors occur on the Connection at - * the same time then it is conceiveably possible for the second to get stuck if the first one is processed by a - * waiter. - * - * Once closed any attempt to wait will throw an exception. - * Any notification of an exception will be ignored. - */ - public void close() - { - _lock.lock(); - try - { - //if we have already closed then our job is done. - if (_closed) - { - return; - } - - //Close Waiter so no more exceptions are processed - _closed = true; - - //Wake up any await() threads - - //If we are waiting then use the error() to wake them up. - if (_waiting.get()) - { - error(throwClosedException()); - } - //If they are not waiting then there is nothing to do. - - // Wake up any error handling threads - - if (!_errorAck) - { - _errorAck = true; - _errorConditionAck.signal(); - - _error = null; - } - } - finally - { - _lock.unlock(); - } - } - - /** - * Helper method to generate the a closed Exception. - * - * todo: This should be converted to something more friendly. - * - * @return AMQException to throw to waiters when the Waiter is closed. - */ - private AMQException throwClosedException() - { - return new AMQException(null, "Waiter was closed.", null); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/client/util/FlowControllingBlockingQueue.java b/java/client/src/main/java/org/apache/qpid/client/util/FlowControllingBlockingQueue.java deleted file mode 100644 index ee7fc533a3..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/util/FlowControllingBlockingQueue.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * - * 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.qpid.client.util; - -import java.util.Iterator; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A blocking queue that emits events above a user specified threshold allowing the caller to take action (e.g. flow - * control) to try to prevent the queue growing (much) further. The underlying queue itself is not bounded therefore the - * caller is not obliged to react to the events. <p/> This implementation is <b>only</b> safe where we have a single - * thread adding items and a single (different) thread removing items. - * - * @todo Make this implement java.util.Queue and hide the implementation. Then different queue types can be substituted. - */ -public class FlowControllingBlockingQueue -{ - private static final Logger _logger = LoggerFactory.getLogger(FlowControllingBlockingQueue.class); - - /** This queue is bounded and is used to store messages before being dispatched to the consumer */ - private final Queue _queue = new ConcurrentLinkedQueue(); - - private final int _flowControlHighThreshold; - private final int _flowControlLowThreshold; - - private final ThresholdListener _listener; - - /** We require a separate count so we can track whether we have reached the threshold */ - private int _count; - - private boolean disableFlowControl; - - public boolean isEmpty() - { - return _queue.isEmpty(); - } - - public interface ThresholdListener - { - void aboveThreshold(int currentValue); - - void underThreshold(int currentValue); - } - - public FlowControllingBlockingQueue(int threshold, ThresholdListener listener) - { - this(threshold, threshold, listener); - } - - public FlowControllingBlockingQueue(int highThreshold, int lowThreshold, ThresholdListener listener) - { - _flowControlHighThreshold = highThreshold; - _flowControlLowThreshold = lowThreshold; - _listener = listener; - if (highThreshold == 0) - { - disableFlowControl = true; - } - } - - public Object take() throws InterruptedException - { - Object o = _queue.poll(); - if(o == null) - { - synchronized(this) - { - while((o = _queue.poll())==null) - { - wait(); - } - } - } - if (!disableFlowControl && _listener != null) - { - synchronized (_listener) - { - if (_count-- == _flowControlLowThreshold) - { - _listener.underThreshold(_count); - } - } - - } - - return o; - } - - public void add(Object o) - { - synchronized(this) - { - _queue.add(o); - - notifyAll(); - } - if (!disableFlowControl && _listener != null) - { - synchronized (_listener) - { - if (++_count == _flowControlHighThreshold) - { - _listener.aboveThreshold(_count); - } - } - } - } - - public Iterator iterator() - { - return _queue.iterator(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/client/vmbroker/AMQVMBrokerCreationException.java b/java/client/src/main/java/org/apache/qpid/client/vmbroker/AMQVMBrokerCreationException.java deleted file mode 100644 index dc0d9b8c78..0000000000 --- a/java/client/src/main/java/org/apache/qpid/client/vmbroker/AMQVMBrokerCreationException.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * 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.qpid.client.vmbroker; - -import org.apache.qpid.client.transport.AMQTransportConnectionException; -import org.apache.qpid.protocol.AMQConstant; - -/** - * AMQVMBrokerCreationException represents failure to create an in VM broker on the vm transport medium. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent failure to create an in VM broker. - * </table> - * - * @todo Error code never used. This is not an AMQException. - */ -public class AMQVMBrokerCreationException extends AMQTransportConnectionException -{ - private int _port; - - /** - * @param port - * - * @deprecated - */ - public AMQVMBrokerCreationException(int port) - { - this(null, port, "Unable to create vm broker", null); - } - - public AMQVMBrokerCreationException(AMQConstant errorCode, int port, String message, Throwable cause) - { - super(errorCode, message, cause); - _port = port; - } - - public String toString() - { - return super.toString() + " on port " + _port; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/collections/KeyValue.java b/java/client/src/main/java/org/apache/qpid/collections/KeyValue.java deleted file mode 100644 index e890aba968..0000000000 --- a/java/client/src/main/java/org/apache/qpid/collections/KeyValue.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2003-2004 The Apache Software Foundation - * - * Licensed 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.qpid.collections; - -/** - * Defines a simple key value pair. - * <p> - * A Map Entry has considerable additional semantics over and above a simple - * key-value pair. This interface defines the minimum key value, with just the - * two get methods. - * - * @since Commons Collections 3.0 - * @version $Revision$ $Date$ - * - * @author Stephen Colebourne - */ -public interface KeyValue { - - /** - * Gets the key from the pair. - * - * @return the key - */ - Object getKey(); - - /** - * Gets the value from the pair. - * - * @return the value - */ - Object getValue(); - -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/collections/ReferenceMap.java b/java/client/src/main/java/org/apache/qpid/collections/ReferenceMap.java deleted file mode 100644 index 1516c56e42..0000000000 --- a/java/client/src/main/java/org/apache/qpid/collections/ReferenceMap.java +++ /dev/null @@ -1,957 +0,0 @@ -/* - * Copyright 2001-2004 The Apache Software Foundation - * - * Licensed 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.qpid.collections; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; -import java.util.AbstractCollection; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.apache.qpid.collections.keyvalue.DefaultMapEntry; - -/** - * Hash-based {@link Map} implementation that allows - * mappings to be removed by the garbage collector.<p> - * - * When you construct a <code>ReferenceMap</code>, you can - * specify what kind of references are used to store the - * map's keys and values. If non-hard references are - * used, then the garbage collector can remove mappings - * if a key or value becomes unreachable, or if the - * JVM's memory is running low. For information on how - * the different reference types behave, see - * {@link Reference}.<p> - * - * Different types of references can be specified for keys - * and values. The keys can be configured to be weak but - * the values hard, in which case this class will behave - * like a <a href="http://java.sun.com/j2se/1.4/docs/api/java/util/WeakHashMap.html"> - * <code>WeakHashMap</code></a>. However, you - * can also specify hard keys and weak values, or any other - * combination. The default constructor uses hard keys - * and soft values, providing a memory-sensitive cache.<p> - * - * The algorithms used are basically the same as those - * in {@link java.util.HashMap}. In particular, you - * can specify a load factor and capacity to suit your - * needs. All optional {@link Map} operations are - * supported.<p> - * - * However, this {@link Map} implementation does <I>not</I> - * allow null elements. Attempting to add a null key or - * or a null value to the map will raise a - * <code>NullPointerException</code>.<p> - * - * As usual, this implementation is not synchronized. You - * can use {@link java.util.Collections#synchronizedMap} to - * provide synchronized access to a <code>ReferenceMap</code>. - * - * @see java.lang.ref.Reference - * - * @deprecated Moved to map subpackage. Due to be removed in v4.0. - * @since Commons Collections 2.1 - * @version $Revision$ $Date$ - * - * @author Paul Jack - */ -public class ReferenceMap extends AbstractMap { - - /** - * For serialization. - */ - private static final long serialVersionUID = -3370601314380922368L; - - - /** - * Constant indicating that hard references should be used. - */ - final public static int HARD = 0; - - - /** - * Constant indicating that soft references should be used. - */ - final public static int SOFT = 1; - - - /** - * Constant indicating that weak references should be used. - */ - final public static int WEAK = 2; - - - // --- serialized instance variables: - - - /** - * The reference type for keys. Must be HARD, SOFT, WEAK. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private int keyType; - - - /** - * The reference type for values. Must be HARD, SOFT, WEAK. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private int valueType; - - - /** - * The threshold variable is calculated by multiplying - * table.length and loadFactor. - * Note: I originally marked this field as final, but then this class - * didn't compile under JDK1.2.2. - * @serial - */ - private float loadFactor; - - /** - * Should the value be automatically purged when the associated key has been collected? - */ - private boolean purgeValues = false; - - - // -- Non-serialized instance variables - - /** - * ReferenceQueue used to eliminate stale mappings. - * See purge. - */ - private transient ReferenceQueue queue = new ReferenceQueue(); - - - /** - * The hash table. Its length is always a power of two. - */ - private transient Entry[] table; - - - /** - * Number of mappings in this map. - */ - private transient int size; - - - /** - * When size reaches threshold, the map is resized. - * See resize(). - */ - private transient int threshold; - - - /** - * Number of times this map has been modified. - */ - private transient volatile int modCount; - - - /** - * Cached key set. May be null if key set is never accessed. - */ - private transient Set keySet; - - - /** - * Cached entry set. May be null if entry set is never accessed. - */ - private transient Set entrySet; - - - /** - * Cached values. May be null if values() is never accessed. - */ - private transient Collection values; - - - /** - * Constructs a new <code>ReferenceMap</code> that will - * use hard references to keys and soft references to values. - */ - public ReferenceMap() { - this(HARD, SOFT); - } - - /** - * Constructs a new <code>ReferenceMap</code> that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap(int keyType, int valueType, boolean purgeValues) { - this(keyType, valueType); - this.purgeValues = purgeValues; - } - - /** - * Constructs a new <code>ReferenceMap</code> that will - * use the specified types of references. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - */ - public ReferenceMap(int keyType, int valueType) { - this(keyType, valueType, 16, 0.75f); - } - - /** - * Constructs a new <code>ReferenceMap</code> with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - * @param purgeValues should the value be automatically purged when the - * key is garbage collected - */ - public ReferenceMap( - int keyType, - int valueType, - int capacity, - float loadFactor, - boolean purgeValues) { - this(keyType, valueType, capacity, loadFactor); - this.purgeValues = purgeValues; - } - - /** - * Constructs a new <code>ReferenceMap</code> with the - * specified reference types, load factor and initial - * capacity. - * - * @param keyType the type of reference to use for keys; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param valueType the type of reference to use for values; - * must be {@link #HARD}, {@link #SOFT}, {@link #WEAK} - * @param capacity the initial capacity for the map - * @param loadFactor the load factor for the map - */ - public ReferenceMap(int keyType, int valueType, int capacity, float loadFactor) { - super(); - - verify("keyType", keyType); - verify("valueType", valueType); - - if (capacity <= 0) { - throw new IllegalArgumentException("capacity must be positive"); - } - if ((loadFactor <= 0.0f) || (loadFactor >= 1.0f)) { - throw new IllegalArgumentException("Load factor must be greater than 0 and less than 1."); - } - - this.keyType = keyType; - this.valueType = valueType; - - int v = 1; - while (v < capacity) v *= 2; - - this.table = new Entry[v]; - this.loadFactor = loadFactor; - this.threshold = (int)(v * loadFactor); - } - - - // used by constructor - private static void verify(String name, int type) { - if ((type < HARD) || (type > WEAK)) { - throw new IllegalArgumentException(name + - " must be HARD, SOFT, WEAK."); - } - } - - - /** - * Writes this object to the given output stream. - * - * @param out the output stream to write to - * @throws IOException if the stream raises it - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - out.writeInt(table.length); - - // Have to use null-terminated list because size might shrink - // during iteration - - for (Iterator iter = entrySet().iterator(); iter.hasNext();) { - Map.Entry entry = (Map.Entry)iter.next(); - out.writeObject(entry.getKey()); - out.writeObject(entry.getValue()); - } - out.writeObject(null); - } - - - /** - * Reads the contents of this object from the given input stream. - * - * @param inp the input stream to read from - * @throws IOException if the stream raises it - * @throws ClassNotFoundException if the stream raises it - */ - private void readObject(ObjectInputStream inp) throws IOException, ClassNotFoundException { - inp.defaultReadObject(); - table = new Entry[inp.readInt()]; - threshold = (int)(table.length * loadFactor); - queue = new ReferenceQueue(); - Object key = inp.readObject(); - while (key != null) { - Object value = inp.readObject(); - put(key, value); - key = inp.readObject(); - } - } - - - /** - * Constructs a reference of the given type to the given - * referent. The reference is registered with the queue - * for later purging. - * - * @param type HARD, SOFT or WEAK - * @param referent the object to refer to - * @param hash the hash code of the <I>key</I> of the mapping; - * this number might be different from referent.hashCode() if - * the referent represents a value and not a key - */ - private Object toReference(int type, Object referent, int hash) { - switch (type) { - case HARD: return referent; - case SOFT: return new SoftRef(hash, referent, queue); - case WEAK: return new WeakRef(hash, referent, queue); - default: throw new Error(); - } - } - - - /** - * Returns the entry associated with the given key. - * - * @param key the key of the entry to look up - * @return the entry associated with that key, or null - * if the key is not in this map - */ - private Entry getEntry(Object key) { - if (key == null) return null; - int hash = key.hashCode(); - int index = indexFor(hash); - for (Entry entry = table[index]; entry != null; entry = entry.next) { - if ((entry.hash == hash) && key.equals(entry.getKey())) { - return entry; - } - } - return null; - } - - - /** - * Converts the given hash code into an index into the - * hash table. - */ - private int indexFor(int hash) { - // mix the bits to avoid bucket collisions... - hash += ~(hash << 15); - hash ^= (hash >>> 10); - hash += (hash << 3); - hash ^= (hash >>> 6); - hash += ~(hash << 11); - hash ^= (hash >>> 16); - return hash & (table.length - 1); - } - - - - /** - * Resizes this hash table by doubling its capacity. - * This is an expensive operation, as entries must - * be copied from the old smaller table to the new - * bigger table. - */ - private void resize() { - Entry[] old = table; - table = new Entry[old.length * 2]; - - for (int i = 0; i < old.length; i++) { - Entry next = old[i]; - while (next != null) { - Entry entry = next; - next = next.next; - int index = indexFor(entry.hash); - entry.next = table[index]; - table[index] = entry; - } - old[i] = null; - } - threshold = (int)(table.length * loadFactor); - } - - - - /** - * Purges stale mappings from this map. - * <p> - * Ordinarily, stale mappings are only removed during - * a write operation, although this method is called for both - * read and write operations to maintain a consistent state. - * <p> - * Note that this method is not synchronized! Special - * care must be taken if, for instance, you want stale - * mappings to be removed on a periodic basis by some - * background thread. - */ - private void purge() { - Reference ref = queue.poll(); - while (ref != null) { - purge(ref); - ref = queue.poll(); - } - } - - - private void purge(Reference ref) { - // The hashCode of the reference is the hashCode of the - // mapping key, even if the reference refers to the - // mapping value... - int hash = ref.hashCode(); - int index = indexFor(hash); - Entry previous = null; - Entry entry = table[index]; - while (entry != null) { - if (entry.purge(ref)) { - if (previous == null) table[index] = entry.next; - else previous.next = entry.next; - this.size--; - return; - } - previous = entry; - entry = entry.next; - } - - } - - - /** - * Returns the size of this map. - * - * @return the size of this map - */ - public int size() { - purge(); - return size; - } - - - /** - * Returns <code>true</code> if this map is empty. - * - * @return <code>true</code> if this map is empty - */ - public boolean isEmpty() { - purge(); - return size == 0; - } - - - /** - * Returns <code>true</code> if this map contains the given key. - * - * @return true if the given key is in this map - */ - public boolean containsKey(Object key) { - purge(); - Entry entry = getEntry(key); - if (entry == null) return false; - return entry.getValue() != null; - } - - - /** - * Returns the value associated with the given key, if any. - * - * @return the value associated with the given key, or <code>null</code> - * if the key maps to no value - */ - public Object get(Object key) { - purge(); - Entry entry = getEntry(key); - if (entry == null) return null; - return entry.getValue(); - } - - - /** - * Associates the given key with the given value.<p> - * Neither the key nor the value may be null. - * - * @param key the key of the mapping - * @param value the value of the mapping - * @return the last value associated with that key, or - * null if no value was associated with the key - * @throws NullPointerException if either the key or value - * is null - */ - public Object put(Object key, Object value) { - if (key == null) throw new NullPointerException("null keys not allowed"); - if (value == null) throw new NullPointerException("null values not allowed"); - - purge(); - if (size + 1 > threshold) resize(); - - int hash = key.hashCode(); - int index = indexFor(hash); - Entry entry = table[index]; - while (entry != null) { - if ((hash == entry.hash) && key.equals(entry.getKey())) { - Object result = entry.getValue(); - entry.setValue(value); - return result; - } - entry = entry.next; - } - this.size++; - modCount++; - key = toReference(keyType, key, hash); - value = toReference(valueType, value, hash); - table[index] = new Entry(key, hash, value, table[index]); - return null; - } - - - /** - * Removes the key and its associated value from this map. - * - * @param key the key to remove - * @return the value associated with that key, or null if - * the key was not in the map - */ - public Object remove(Object key) { - if (key == null) return null; - purge(); - int hash = key.hashCode(); - int index = indexFor(hash); - Entry previous = null; - Entry entry = table[index]; - while (entry != null) { - if ((hash == entry.hash) && key.equals(entry.getKey())) { - if (previous == null) table[index] = entry.next; - else previous.next = entry.next; - this.size--; - modCount++; - return entry.getValue(); - } - previous = entry; - entry = entry.next; - } - return null; - } - - - /** - * Clears this map. - */ - public void clear() { - Arrays.fill(table, null); - size = 0; - while (queue.poll() != null); // drain the queue - } - - - /** - * Returns a set view of this map's entries. - * - * @return a set view of this map's entries - */ - public Set entrySet() { - if (entrySet != null) { - return entrySet; - } - entrySet = new AbstractSet() { - public int size() { - return ReferenceMap.this.size(); - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public boolean contains(Object o) { - if (o == null) return false; - if (!(o instanceof Map.Entry)) return false; - Map.Entry e = (Map.Entry)o; - Entry e2 = getEntry(e.getKey()); - return (e2 != null) && e.equals(e2); - } - - public boolean remove(Object o) { - boolean r = contains(o); - if (r) { - Map.Entry e = (Map.Entry)o; - ReferenceMap.this.remove(e.getKey()); - } - return r; - } - - public Iterator iterator() { - return new EntryIterator(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] arr) { - ArrayList list = new ArrayList(); - Iterator iterator = iterator(); - while (iterator.hasNext()) { - Entry e = (Entry)iterator.next(); - list.add(new DefaultMapEntry(e.getKey(), e.getValue())); - } - return list.toArray(arr); - } - }; - return entrySet; - } - - - /** - * Returns a set view of this map's keys. - * - * @return a set view of this map's keys - */ - public Set keySet() { - if (keySet != null) return keySet; - keySet = new AbstractSet() { - public int size() { - return ReferenceMap.this.size(); - } - - public Iterator iterator() { - return new KeyIterator(); - } - - public boolean contains(Object o) { - return containsKey(o); - } - - - public boolean remove(Object o) { - Object r = ReferenceMap.this.remove(o); - return r != null; - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] array) { - Collection c = new ArrayList(size()); - for (Iterator it = iterator(); it.hasNext(); ) { - c.add(it.next()); - } - return c.toArray(array); - } - }; - return keySet; - } - - - /** - * Returns a collection view of this map's values. - * - * @return a collection view of this map's values. - */ - public Collection values() { - if (values != null) return values; - values = new AbstractCollection() { - public int size() { - return ReferenceMap.this.size(); - } - - public void clear() { - ReferenceMap.this.clear(); - } - - public Iterator iterator() { - return new ValueIterator(); - } - - public Object[] toArray() { - return toArray(new Object[0]); - } - - public Object[] toArray(Object[] array) { - Collection c = new ArrayList(size()); - for (Iterator it = iterator(); it.hasNext(); ) { - c.add(it.next()); - } - return c.toArray(array); - } - }; - return values; - } - - - // If getKey() or getValue() returns null, it means - // the mapping is stale and should be removed. - private class Entry implements Map.Entry, KeyValue { - - Object key; - Object value; - int hash; - Entry next; - - - public Entry(Object key, int hash, Object value, Entry next) { - this.key = key; - this.hash = hash; - this.value = value; - this.next = next; - } - - - public Object getKey() { - return (keyType > HARD) ? ((Reference)key).get() : key; - } - - - public Object getValue() { - return (valueType > HARD) ? ((Reference)value).get() : value; - } - - - public Object setValue(Object object) { - Object old = getValue(); - if (valueType > HARD) ((Reference)value).clear(); - value = toReference(valueType, object, hash); - return old; - } - - - public boolean equals(Object o) { - if (o == null) return false; - if (o == this) return true; - if (!(o instanceof Map.Entry)) return false; - - Map.Entry entry = (Map.Entry)o; - Object key = entry.getKey(); - Object value = entry.getValue(); - if ((key == null) || (value == null)) return false; - return key.equals(getKey()) && value.equals(getValue()); - } - - - public int hashCode() { - Object v = getValue(); - return hash ^ ((v == null) ? 0 : v.hashCode()); - } - - - public String toString() { - return getKey() + "=" + getValue(); - } - - - boolean purge(Reference ref) { - boolean r = (keyType > HARD) && (key == ref); - r = r || ((valueType > HARD) && (value == ref)); - if (r) { - if (keyType > HARD) ((Reference)key).clear(); - if (valueType > HARD) { - ((Reference)value).clear(); - } else if (purgeValues) { - value = null; - } - } - return r; - } - } - - - private class EntryIterator implements Iterator { - // These fields keep track of where we are in the table. - int index; - Entry entry; - Entry previous; - - // These Object fields provide hard references to the - // current and next entry; this assures that if hasNext() - // returns true, next() will actually return a valid element. - Object nextKey, nextValue; - Object currentKey, currentValue; - - int expectedModCount; - - - public EntryIterator() { - index = (size() != 0 ? table.length : 0); - // have to do this here! size() invocation above - // may have altered the modCount. - expectedModCount = modCount; - } - - - public boolean hasNext() { - checkMod(); - while (nextNull()) { - Entry e = entry; - int i = index; - while ((e == null) && (i > 0)) { - i--; - e = table[i]; - } - entry = e; - index = i; - if (e == null) { - currentKey = null; - currentValue = null; - return false; - } - nextKey = e.getKey(); - nextValue = e.getValue(); - if (nextNull()) entry = entry.next; - } - return true; - } - - - private void checkMod() { - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - - private boolean nextNull() { - return (nextKey == null) || (nextValue == null); - } - - protected Entry nextEntry() { - checkMod(); - if (nextNull() && !hasNext()) throw new NoSuchElementException(); - previous = entry; - entry = entry.next; - currentKey = nextKey; - currentValue = nextValue; - nextKey = null; - nextValue = null; - return previous; - } - - - public Object next() { - return nextEntry(); - } - - - public void remove() { - checkMod(); - if (previous == null) throw new IllegalStateException(); - ReferenceMap.this.remove(currentKey); - previous = null; - currentKey = null; - currentValue = null; - expectedModCount = modCount; - } - - } - - - private class ValueIterator extends EntryIterator { - public Object next() { - return nextEntry().getValue(); - } - } - - - private class KeyIterator extends EntryIterator { - public Object next() { - return nextEntry().getKey(); - } - } - - - - // These two classes store the hashCode of the key of - // of the mapping, so that after they're dequeued a quick - // lookup of the bucket in the table can occur. - - - private static class SoftRef extends SoftReference { - private int hash; - - - public SoftRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - - public int hashCode() { - return hash; - } - } - - - private static class WeakRef extends WeakReference { - private int hash; - - - public WeakRef(int hash, Object r, ReferenceQueue q) { - super(r, q); - this.hash = hash; - } - - - public int hashCode() { - return hash; - } - } - - -} diff --git a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractKeyValue.java b/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractKeyValue.java deleted file mode 100644 index a7ca67ad15..0000000000 --- a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractKeyValue.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2003-2006 The Apache Software Foundation - * - * Licensed 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.qpid.collections.keyvalue; - -import org.apache.qpid.collections.KeyValue; - - -/** - * Abstract pair class to assist with creating <code>KeyValue</code> - * and {@link java.util.Map.Entry Map.Entry} implementations. - * - * @since Commons Collections 3.0 - * @version $Revision$ $Date$ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public abstract class AbstractKeyValue implements KeyValue { - - /** The key */ - protected Object key; - /** The value */ - protected Object value; - - /** - * Constructs a new pair with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - protected AbstractKeyValue(Object key, Object value) { - super(); - this.key = key; - this.value = value; - } - - /** - * Gets the key from the pair. - * - * @return the key - */ - public Object getKey() { - return key; - } - - /** - * Gets the value from the pair. - * - * @return the value - */ - public Object getValue() { - return value; - } - - /** - * Gets a debugging String view of the pair. - * - * @return a String view of the entry - */ - public String toString() { - return new StringBuffer() - .append(getKey()) - .append('=') - .append(getValue()) - .toString(); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractMapEntry.java b/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractMapEntry.java deleted file mode 100644 index f4717a1c20..0000000000 --- a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/AbstractMapEntry.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2003-2006 The Apache Software Foundation - * - * Licensed 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.qpid.collections.keyvalue; - -import java.util.Map; - -import org.apache.qpid.collections.keyvalue.AbstractKeyValue; - -/** - * Abstract Pair class to assist with creating correct - * {@link java.util.Map.Entry Map.Entry} implementations. - * - * @since Commons Collections 3.0 - * @version $Revision$ $Date$ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public abstract class AbstractMapEntry extends AbstractKeyValue implements Map.Entry { - - /** - * Constructs a new entry with the given key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - protected AbstractMapEntry(Object key, Object value) { - super(key, value); - } - - // Map.Entry interface - //------------------------------------------------------------------------- - /** - * Sets the value stored in this <code>Map.Entry</code>. - * <p> - * This <code>Map.Entry</code> is not connected to a Map, so only the - * local data is changed. - * - * @param value the new value - * @return the previous value - */ - public Object setValue(Object value) { - Object answer = this.value; - this.value = value; - return answer; - } - - /** - * Compares this <code>Map.Entry</code> with another <code>Map.Entry</code>. - * <p> - * Implemented per API documentation of {@link java.util.Map.Entry#equals(Object)} - * - * @param obj the object to compare to - * @return true if equal key and value - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof Map.Entry == false) { - return false; - } - Map.Entry other = (Map.Entry) obj; - return - (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) && - (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue())); - } - - /** - * Gets a hashCode compatible with the equals method. - * <p> - * Implemented per API documentation of {@link java.util.Map.Entry#hashCode()} - * - * @return a suitable hash code - */ - public int hashCode() { - return (getKey() == null ? 0 : getKey().hashCode()) ^ - (getValue() == null ? 0 : getValue().hashCode()); - } - -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/DefaultMapEntry.java b/java/client/src/main/java/org/apache/qpid/collections/keyvalue/DefaultMapEntry.java deleted file mode 100644 index f0f04a366a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/collections/keyvalue/DefaultMapEntry.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2001-2006 The Apache Software Foundation - * - * Licensed 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.qpid.collections.keyvalue; - -import java.util.Map; - -import org.apache.qpid.collections.KeyValue; -import org.apache.qpid.collections.keyvalue.AbstractMapEntry; - -/** - * A restricted implementation of {@link java.util.Map.Entry} that prevents - * the <code>Map.Entry</code> contract from being broken. - * - * @since Commons Collections 3.0 - * @version $Revision$ $Date$ - * - * @author James Strachan - * @author Michael A. Smith - * @author Neil O'Toole - * @author Stephen Colebourne - */ -public final class DefaultMapEntry extends AbstractMapEntry { - - /** - * Constructs a new entry with the specified key and given value. - * - * @param key the key for the entry, may be null - * @param value the value for the entry, may be null - */ - public DefaultMapEntry(final Object key, final Object value) { - super(key, value); - } - - /** - * Constructs a new entry from the specified <code>KeyValue</code>. - * - * @param pair the pair to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultMapEntry(final KeyValue pair) { - super(pair.getKey(), pair.getValue()); - } - - /** - * Constructs a new entry from the specified <code>Map.Entry</code>. - * - * @param entry the entry to copy, must not be null - * @throws NullPointerException if the entry is null - */ - public DefaultMapEntry(final Map.Entry entry) { - super(entry.getKey(), entry.getValue()); - } - -}
\ No newline at end of file diff --git a/java/client/src/main/java/org/apache/qpid/filter/ArithmeticExpression.java b/java/client/src/main/java/org/apache/qpid/filter/ArithmeticExpression.java deleted file mode 100644 index a86613f10c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/ArithmeticExpression.java +++ /dev/null @@ -1,268 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - - -/** - * An expression which performs an operation on two expression values - */ -public abstract class ArithmeticExpression extends BinaryExpression -{ - - protected static final int INTEGER = 1; - protected static final int LONG = 2; - protected static final int DOUBLE = 3; - - - public ArithmeticExpression(Expression left, Expression right) - { - super(left, right); - } - - public static Expression createPlus(Expression left, Expression right) - { - return new ArithmeticExpression(left, right) - { - protected Object evaluate(Object lvalue, Object rvalue) - { - if (lvalue instanceof String) - { - String text = (String) lvalue; - return text + rvalue; - } - else if (lvalue instanceof Number) - { - return plus((Number) lvalue, asNumber(rvalue)); - } - - throw new RuntimeException("Cannot call plus operation on: " + lvalue + " and: " + rvalue); - } - - public String getExpressionSymbol() - { - return "+"; - } - }; - } - - public static Expression createMinus(Expression left, Expression right) - { - return new ArithmeticExpression(left, right) - { - protected Object evaluate(Object lvalue, Object rvalue) - { - if (lvalue instanceof Number) - { - return minus((Number) lvalue, asNumber(rvalue)); - } - - throw new RuntimeException("Cannot call minus operation on: " + lvalue + " and: " + rvalue); - } - - public String getExpressionSymbol() - { - return "-"; - } - }; - } - - public static Expression createMultiply(Expression left, Expression right) - { - return new ArithmeticExpression(left, right) - { - - protected Object evaluate(Object lvalue, Object rvalue) - { - if (lvalue instanceof Number) - { - return multiply((Number) lvalue, asNumber(rvalue)); - } - - throw new RuntimeException("Cannot call multiply operation on: " + lvalue + " and: " + rvalue); - } - - public String getExpressionSymbol() - { - return "*"; - } - }; - } - - public static Expression createDivide(Expression left, Expression right) - { - return new ArithmeticExpression(left, right) - { - - protected Object evaluate(Object lvalue, Object rvalue) - { - if (lvalue instanceof Number) - { - return divide((Number) lvalue, asNumber(rvalue)); - } - - throw new RuntimeException("Cannot call divide operation on: " + lvalue + " and: " + rvalue); - } - - public String getExpressionSymbol() - { - return "/"; - } - }; - } - - public static Expression createMod(Expression left, Expression right) - { - return new ArithmeticExpression(left, right) - { - - protected Object evaluate(Object lvalue, Object rvalue) - { - if (lvalue instanceof Number) - { - return mod((Number) lvalue, asNumber(rvalue)); - } - - throw new RuntimeException("Cannot call mod operation on: " + lvalue + " and: " + rvalue); - } - - public String getExpressionSymbol() - { - return "%"; - } - }; - } - - protected Number plus(Number left, Number right) - { - switch (numberType(left, right)) - { - - case ArithmeticExpression.INTEGER: - return new Integer(left.intValue() + right.intValue()); - - case ArithmeticExpression.LONG: - return new Long(left.longValue() + right.longValue()); - - default: - return new Double(left.doubleValue() + right.doubleValue()); - } - } - - protected Number minus(Number left, Number right) - { - switch (numberType(left, right)) - { - - case ArithmeticExpression.INTEGER: - return new Integer(left.intValue() - right.intValue()); - - case ArithmeticExpression.LONG: - return new Long(left.longValue() - right.longValue()); - - default: - return new Double(left.doubleValue() - right.doubleValue()); - } - } - - protected Number multiply(Number left, Number right) - { - switch (numberType(left, right)) - { - - case ArithmeticExpression.INTEGER: - return new Integer(left.intValue() * right.intValue()); - - case ArithmeticExpression.LONG: - return new Long(left.longValue() * right.longValue()); - - default: - return new Double(left.doubleValue() * right.doubleValue()); - } - } - - protected Number divide(Number left, Number right) - { - return new Double(left.doubleValue() / right.doubleValue()); - } - - protected Number mod(Number left, Number right) - { - return new Double(left.doubleValue() % right.doubleValue()); - } - - private int numberType(Number left, Number right) - { - if (isDouble(left) || isDouble(right)) - { - return ArithmeticExpression.DOUBLE; - } - else if ((left instanceof Long) || (right instanceof Long)) - { - return ArithmeticExpression.LONG; - } - else - { - return ArithmeticExpression.INTEGER; - } - } - - private boolean isDouble(Number n) - { - return (n instanceof Float) || (n instanceof Double); - } - - protected Number asNumber(Object value) - { - if (value instanceof Number) - { - return (Number) value; - } - else - { - throw new RuntimeException("Cannot convert value: " + value + " into a number"); - } - } - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Object lvalue = left.evaluate(message); - if (lvalue == null) - { - return null; - } - - Object rvalue = right.evaluate(message); - if (rvalue == null) - { - return null; - } - - return evaluate(lvalue, rvalue); - } - - /** - * @param lvalue - * @param rvalue - * @return - */ - protected abstract Object evaluate(Object lvalue, Object rvalue); - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/BinaryExpression.java b/java/client/src/main/java/org/apache/qpid/filter/BinaryExpression.java deleted file mode 100644 index f97f858fad..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/BinaryExpression.java +++ /dev/null @@ -1,103 +0,0 @@ -/* 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.qpid.filter; - -/** - * An expression which performs an operation on two expression values. - */ -public abstract class BinaryExpression implements Expression -{ - protected Expression left; - protected Expression right; - - public BinaryExpression(Expression left, Expression right) - { - this.left = left; - this.right = right; - } - - public Expression getLeft() - { - return left; - } - - public Expression getRight() - { - return right; - } - - /** - * @see Object#toString() - */ - public String toString() - { - return "(" + left.toString() + " " + getExpressionSymbol() + " " + right.toString() + ")"; - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#hashCode() - */ - public int hashCode() - { - return toString().hashCode(); - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#equals(Object) - */ - public boolean equals(Object o) - { - - if ((o == null) || !this.getClass().equals(o.getClass())) - { - return false; - } - - return toString().equals(o.toString()); - - } - - /** - * Returns the symbol that represents this binary expression. For example, addition is - * represented by "+" - * - * @return - */ - public abstract String getExpressionSymbol(); - - /** - * @param expression - */ - public void setRight(Expression expression) - { - right = expression; - } - - /** - * @param expression - */ - public void setLeft(Expression expression) - { - left = expression; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/BooleanExpression.java b/java/client/src/main/java/org/apache/qpid/filter/BooleanExpression.java deleted file mode 100644 index 14a5c7ea87..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/BooleanExpression.java +++ /dev/null @@ -1,33 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - - -/** - * A BooleanExpression is an expression that always - * produces a Boolean result. - */ -public interface BooleanExpression extends Expression -{ - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException; - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/ComparisonExpression.java b/java/client/src/main/java/org/apache/qpid/filter/ComparisonExpression.java deleted file mode 100644 index 55fca853ef..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/ComparisonExpression.java +++ /dev/null @@ -1,589 +0,0 @@ -/* 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.qpid.filter; - -import java.util.HashSet; -import java.util.List; -import java.util.regex.Pattern; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - -/** - * A filter performing a comparison of two objects - */ -public abstract class ComparisonExpression extends BinaryExpression implements BooleanExpression -{ - - public static BooleanExpression createBetween(Expression value, Expression left, Expression right) - { - return LogicExpression.createAND(ComparisonExpression.createGreaterThanEqual(value, left), ComparisonExpression.createLessThanEqual(value, right)); - } - - public static BooleanExpression createNotBetween(Expression value, Expression left, Expression right) - { - return LogicExpression.createOR(ComparisonExpression.createLessThan(value, left), ComparisonExpression.createGreaterThan(value, right)); - } - - private static final HashSet REGEXP_CONTROL_CHARS = new HashSet(); - - static - { - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('.')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('\\')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('[')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character(']')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('^')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('$')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('?')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('*')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('+')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('{')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('}')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('|')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('(')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character(')')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character(':')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('&')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('<')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('>')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('=')); - ComparisonExpression.REGEXP_CONTROL_CHARS.add(new Character('!')); - } - - static class LikeExpression extends UnaryExpression implements BooleanExpression - { - - Pattern likePattern; - - /** - * @param right - */ - public LikeExpression(Expression right, String like, int escape) - { - super(right); - - StringBuffer regexp = new StringBuffer(like.length() * 2); - regexp.append("\\A"); // The beginning of the input - for (int i = 0; i < like.length(); i++) - { - char c = like.charAt(i); - if (escape == (0xFFFF & c)) - { - i++; - if (i >= like.length()) - { - // nothing left to escape... - break; - } - - char t = like.charAt(i); - regexp.append("\\x"); - regexp.append(Integer.toHexString(0xFFFF & t)); - } - else if (c == '%') - { - regexp.append(".*?"); // Do a non-greedy match - } - else if (c == '_') - { - regexp.append("."); // match one - } - else if (ComparisonExpression.REGEXP_CONTROL_CHARS.contains(new Character(c))) - { - regexp.append("\\x"); - regexp.append(Integer.toHexString(0xFFFF & c)); - } - else - { - regexp.append(c); - } - } - - regexp.append("\\z"); // The end of the input - - likePattern = Pattern.compile(regexp.toString(), Pattern.DOTALL); - } - - /** - * org.apache.activemq.filter.UnaryExpression#getExpressionSymbol() - */ - public String getExpressionSymbol() - { - return "LIKE"; - } - - /** - * org.apache.activemq.filter.Expression#evaluate(MessageEvaluationContext) - */ - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - - Object rv = this.getRight().evaluate(message); - - if (rv == null) - { - return null; - } - - if (!(rv instanceof String)) - { - return - Boolean.FALSE; - // throw new RuntimeException("LIKE can only operate on String identifiers. LIKE attemped on: '" + rv.getClass()); - } - - return likePattern.matcher((String) rv).matches() ? Boolean.TRUE : Boolean.FALSE; - } - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException - { - Object object = evaluate(message); - - return (object != null) && (object == Boolean.TRUE); - } - } - - public static BooleanExpression createLike(Expression left, String right, String escape) - { - if ((escape != null) && (escape.length() != 1)) - { - throw new RuntimeException( - "The ESCAPE string litteral is invalid. It can only be one character. Litteral used: " + escape); - } - - int c = -1; - if (escape != null) - { - c = 0xFFFF & escape.charAt(0); - } - - return new LikeExpression(left, right, c); - } - - public static BooleanExpression createNotLike(Expression left, String right, String escape) - { - return UnaryExpression.createNOT(ComparisonExpression.createLike(left, right, escape)); - } - - public static BooleanExpression createInFilter(Expression left, List elements) - { - - if (!(left instanceof PropertyExpression)) - { - throw new RuntimeException("Expected a property for In expression, got: " + left); - } - - return UnaryExpression.createInExpression((PropertyExpression) left, elements, false); - - } - - public static BooleanExpression createNotInFilter(Expression left, List elements) - { - - if (!(left instanceof PropertyExpression)) - { - throw new RuntimeException("Expected a property for In expression, got: " + left); - } - - return UnaryExpression.createInExpression((PropertyExpression) left, elements, true); - - } - - public static BooleanExpression createIsNull(Expression left) - { - return ComparisonExpression.doCreateEqual(left, ConstantExpression.NULL); - } - - public static BooleanExpression createIsNotNull(Expression left) - { - return UnaryExpression.createNOT(ComparisonExpression.doCreateEqual(left, ConstantExpression.NULL)); - } - - public static BooleanExpression createNotEqual(Expression left, Expression right) - { - return UnaryExpression.createNOT(ComparisonExpression.createEqual(left, right)); - } - - public static BooleanExpression createEqual(Expression left, Expression right) - { - ComparisonExpression.checkEqualOperand(left); - ComparisonExpression.checkEqualOperand(right); - ComparisonExpression.checkEqualOperandCompatability(left, right); - - return ComparisonExpression.doCreateEqual(left, right); - } - - private static BooleanExpression doCreateEqual(Expression left, Expression right) - { - return new ComparisonExpression(left, right) - { - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Object lv = left.evaluate(message); - Object rv = right.evaluate(message); - - // Iff one of the values is null - if ((lv == null) ^ (rv == null)) - { - return Boolean.FALSE; - } - - if ((lv == rv) || lv.equals(rv)) - { - return Boolean.TRUE; - } - - if ((lv instanceof Comparable) && (rv instanceof Comparable)) - { - return compare((Comparable) lv, (Comparable) rv); - } - - return Boolean.FALSE; - } - - protected boolean asBoolean(int answer) - { - return answer == 0; - } - - public String getExpressionSymbol() - { - return "="; - } - }; - } - - public static BooleanExpression createGreaterThan(final Expression left, final Expression right) - { - ComparisonExpression.checkLessThanOperand(left); - ComparisonExpression.checkLessThanOperand(right); - - return new ComparisonExpression(left, right) - { - protected boolean asBoolean(int answer) - { - return answer > 0; - } - - public String getExpressionSymbol() - { - return ">"; - } - }; - } - - public static BooleanExpression createGreaterThanEqual(final Expression left, final Expression right) - { - ComparisonExpression.checkLessThanOperand(left); - ComparisonExpression.checkLessThanOperand(right); - - return new ComparisonExpression(left, right) - { - protected boolean asBoolean(int answer) - { - return answer >= 0; - } - - public String getExpressionSymbol() - { - return ">="; - } - }; - } - - public static BooleanExpression createLessThan(final Expression left, final Expression right) - { - ComparisonExpression.checkLessThanOperand(left); - ComparisonExpression.checkLessThanOperand(right); - - return new ComparisonExpression(left, right) - { - - protected boolean asBoolean(int answer) - { - return answer < 0; - } - - public String getExpressionSymbol() - { - return "<"; - } - - }; - } - - public static BooleanExpression createLessThanEqual(final Expression left, final Expression right) - { - ComparisonExpression.checkLessThanOperand(left); - ComparisonExpression.checkLessThanOperand(right); - - return new ComparisonExpression(left, right) - { - - protected boolean asBoolean(int answer) - { - return answer <= 0; - } - - public String getExpressionSymbol() - { - return "<="; - } - }; - } - - /** - * Only Numeric expressions can be used in >, >=, < or <= expressions.s - * - * @param expr - */ - public static void checkLessThanOperand(Expression expr) - { - if (expr instanceof ConstantExpression) - { - Object value = ((ConstantExpression) expr).getValue(); - if (value instanceof Number) - { - return; - } - - // Else it's boolean or a String.. - throw new RuntimeException("Value '" + expr + "' cannot be compared."); - } - - if (expr instanceof BooleanExpression) - { - throw new RuntimeException("Value '" + expr + "' cannot be compared."); - } - } - - /** - * Validates that the expression can be used in == or <> expression. - * Cannot not be NULL TRUE or FALSE litterals. - * - * @param expr - */ - public static void checkEqualOperand(Expression expr) - { - if (expr instanceof ConstantExpression) - { - Object value = ((ConstantExpression) expr).getValue(); - if (value == null) - { - throw new RuntimeException("'" + expr + "' cannot be compared."); - } - } - } - - /** - * - * @param left - * @param right - */ - private static void checkEqualOperandCompatability(Expression left, Expression right) - { - if ((left instanceof ConstantExpression) && (right instanceof ConstantExpression)) - { - if ((left instanceof BooleanExpression) && !(right instanceof BooleanExpression)) - { - throw new RuntimeException("'" + left + "' cannot be compared with '" + right + "'"); - } - } - } - - /** - * @param left - * @param right - */ - public ComparisonExpression(Expression left, Expression right) - { - super(left, right); - } - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Comparable lv = (Comparable) left.evaluate(message); - if (lv == null) - { - return null; - } - - Comparable rv = (Comparable) right.evaluate(message); - if (rv == null) - { - return null; - } - - return compare(lv, rv); - } - - protected Boolean compare(Comparable lv, Comparable rv) - { - Class lc = lv.getClass(); - Class rc = rv.getClass(); - // If the the objects are not of the same type, - // try to convert up to allow the comparison. - if (lc != rc) - { - if (lc == Byte.class) - { - if (rc == Short.class) - { - lv = new Short(((Number) lv).shortValue()); - } - else if (rc == Integer.class) - { - lv = new Integer(((Number) lv).intValue()); - } - else if (rc == Long.class) - { - lv = new Long(((Number) lv).longValue()); - } - else if (rc == Float.class) - { - lv = new Float(((Number) lv).floatValue()); - } - else if (rc == Double.class) - { - lv = new Double(((Number) lv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else if (lc == Short.class) - { - if (rc == Integer.class) - { - lv = new Integer(((Number) lv).intValue()); - } - else if (rc == Long.class) - { - lv = new Long(((Number) lv).longValue()); - } - else if (rc == Float.class) - { - lv = new Float(((Number) lv).floatValue()); - } - else if (rc == Double.class) - { - lv = new Double(((Number) lv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else if (lc == Integer.class) - { - if (rc == Long.class) - { - lv = new Long(((Number) lv).longValue()); - } - else if (rc == Float.class) - { - lv = new Float(((Number) lv).floatValue()); - } - else if (rc == Double.class) - { - lv = new Double(((Number) lv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else if (lc == Long.class) - { - if (rc == Integer.class) - { - rv = new Long(((Number) rv).longValue()); - } - else if (rc == Float.class) - { - lv = new Float(((Number) lv).floatValue()); - } - else if (rc == Double.class) - { - lv = new Double(((Number) lv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else if (lc == Float.class) - { - if (rc == Integer.class) - { - rv = new Float(((Number) rv).floatValue()); - } - else if (rc == Long.class) - { - rv = new Float(((Number) rv).floatValue()); - } - else if (rc == Double.class) - { - lv = new Double(((Number) lv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else if (lc == Double.class) - { - if (rc == Integer.class) - { - rv = new Double(((Number) rv).doubleValue()); - } - else if (rc == Long.class) - { - rv = new Double(((Number) rv).doubleValue()); - } - else if (rc == Float.class) - { - rv = new Float(((Number) rv).doubleValue()); - } - else - { - return Boolean.FALSE; - } - } - else - { - return Boolean.FALSE; - } - } - - return asBoolean(lv.compareTo(rv)) ? Boolean.TRUE : Boolean.FALSE; - } - - protected abstract boolean asBoolean(int answer); - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException - { - Object object = evaluate(message); - - return (object != null) && (object == Boolean.TRUE); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/ConstantExpression.java b/java/client/src/main/java/org/apache/qpid/filter/ConstantExpression.java deleted file mode 100644 index 3874d13431..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/ConstantExpression.java +++ /dev/null @@ -1,204 +0,0 @@ -/* 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.qpid.filter; - -import java.math.BigDecimal; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - -/** - * Represents a constant expression - */ -public class ConstantExpression implements Expression -{ - - static class BooleanConstantExpression extends ConstantExpression implements BooleanExpression - { - public BooleanConstantExpression(Object value) - { - super(value); - } - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException - { - Object object = evaluate(message); - - return (object != null) && (object == Boolean.TRUE); - } - } - - public static final BooleanConstantExpression NULL = new BooleanConstantExpression(null); - public static final BooleanConstantExpression TRUE = new BooleanConstantExpression(Boolean.TRUE); - public static final BooleanConstantExpression FALSE = new BooleanConstantExpression(Boolean.FALSE); - - private Object value; - - public static ConstantExpression createFromDecimal(String text) - { - - // Strip off the 'l' or 'L' if needed. - if (text.endsWith("l") || text.endsWith("L")) - { - text = text.substring(0, text.length() - 1); - } - - Number value; - try - { - value = new Long(text); - } - catch (NumberFormatException e) - { - // The number may be too big to fit in a long. - value = new BigDecimal(text); - } - - long l = value.longValue(); - if ((Integer.MIN_VALUE <= l) && (l <= Integer.MAX_VALUE)) - { - value = new Integer(value.intValue()); - } - - return new ConstantExpression(value); - } - - public static ConstantExpression createFromHex(String text) - { - Number value = new Long(Long.parseLong(text.substring(2), 16)); - long l = value.longValue(); - if ((Integer.MIN_VALUE <= l) && (l <= Integer.MAX_VALUE)) - { - value = new Integer(value.intValue()); - } - - return new ConstantExpression(value); - } - - public static ConstantExpression createFromOctal(String text) - { - Number value = new Long(Long.parseLong(text, 8)); - long l = value.longValue(); - if ((Integer.MIN_VALUE <= l) && (l <= Integer.MAX_VALUE)) - { - value = new Integer(value.intValue()); - } - - return new ConstantExpression(value); - } - - public static ConstantExpression createFloat(String text) - { - Number value = new Double(text); - - return new ConstantExpression(value); - } - - public ConstantExpression(Object value) - { - this.value = value; - } - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - return value; - } - - public Object getValue() - { - return value; - } - - /** - * @see Object#toString() - */ - public String toString() - { - if (value == null) - { - return "NULL"; - } - - if (value instanceof Boolean) - { - return ((Boolean) value).booleanValue() ? "TRUE" : "FALSE"; - } - - if (value instanceof String) - { - return ConstantExpression.encodeString((String) value); - } - - return value.toString(); - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#hashCode() - */ - public int hashCode() - { - return toString().hashCode(); - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#equals(Object) - */ - public boolean equals(Object o) - { - - if ((o == null) || !this.getClass().equals(o.getClass())) - { - return false; - } - - return toString().equals(o.toString()); - - } - - /** - * Encodes the value of string so that it looks like it would look like - * when it was provided in a selector. - * - * @param s - * @return - */ - public static String encodeString(String s) - { - StringBuffer b = new StringBuffer(); - b.append('\''); - for (int i = 0; i < s.length(); i++) - { - char c = s.charAt(i); - if (c == '\'') - { - b.append(c); - } - - b.append(c); - } - - b.append('\''); - - return b.toString(); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/Expression.java b/java/client/src/main/java/org/apache/qpid/filter/Expression.java deleted file mode 100644 index 8208f49688..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/Expression.java +++ /dev/null @@ -1,35 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - - -/** - * Represents an expression - */ -public interface Expression -{ - /** - * @param message The message to evaluate - * @return the value of this expression - * @throws AMQInternalException - */ - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException; -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/JMSSelectorFilter.java b/java/client/src/main/java/org/apache/qpid/filter/JMSSelectorFilter.java deleted file mode 100644 index 4159986090..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/JMSSelectorFilter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.apache.qpid.filter.selector.SelectorParser; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class JMSSelectorFilter implements MessageFilter -{ - /** - * this JMSSelectorFilter's logger - */ - private static final Logger _logger = LoggerFactory.getLogger(JMSSelectorFilter.class); - - private String _selector; - private BooleanExpression _matcher; - - public JMSSelectorFilter(String selector) throws AMQInternalException - { - _selector = selector; - if (JMSSelectorFilter._logger.isDebugEnabled()) - { - JMSSelectorFilter._logger.debug("Created JMSSelectorFilter with selector:" + _selector); - } - _matcher = new SelectorParser().parse(selector); - } - - public boolean matches(AbstractJMSMessage message) - { - try - { - boolean match = _matcher.matches(message); - if (JMSSelectorFilter._logger.isDebugEnabled()) - { - JMSSelectorFilter._logger.debug(message + " match(" + match + ") selector(" + System - .identityHashCode(_selector) + "):" + _selector); - } - return match; - } - catch (AMQInternalException e) - { - JMSSelectorFilter._logger.warn("Caght exception when evaluating message selector for message " + message, e); - } - return false; - } - - public String getSelector() - { - return _selector; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/LogicExpression.java b/java/client/src/main/java/org/apache/qpid/filter/LogicExpression.java deleted file mode 100644 index 7ef85cbacb..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/LogicExpression.java +++ /dev/null @@ -1,108 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - - -/** - * A filter performing a comparison of two objects - */ -public abstract class LogicExpression extends BinaryExpression implements BooleanExpression -{ - - public static BooleanExpression createOR(BooleanExpression lvalue, BooleanExpression rvalue) - { - return new LogicExpression(lvalue, rvalue) - { - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - - Boolean lv = (Boolean) left.evaluate(message); - // Can we do an OR shortcut?? - if ((lv != null) && lv.booleanValue()) - { - return Boolean.TRUE; - } - - Boolean rv = (Boolean) right.evaluate(message); - - return (rv == null) ? null : rv; - } - - public String getExpressionSymbol() - { - return "OR"; - } - }; - } - - public static BooleanExpression createAND(BooleanExpression lvalue, BooleanExpression rvalue) - { - return new LogicExpression(lvalue, rvalue) - { - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - - Boolean lv = (Boolean) left.evaluate(message); - - // Can we do an AND shortcut?? - if (lv == null) - { - return null; - } - - if (!lv.booleanValue()) - { - return Boolean.FALSE; - } - - Boolean rv = (Boolean) right.evaluate(message); - - return (rv == null) ? null : rv; - } - - public String getExpressionSymbol() - { - return "AND"; - } - }; - } - - /** - * @param left - * @param right - */ - public LogicExpression(BooleanExpression left, BooleanExpression right) - { - super(left, right); - } - - public abstract Object evaluate(AbstractJMSMessage message) throws AMQInternalException; - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException - { - Object object = evaluate(message); - - return (object != null) && (object == Boolean.TRUE); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/MessageFilter.java b/java/client/src/main/java/org/apache/qpid/filter/MessageFilter.java deleted file mode 100644 index 62e4a28c1e..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/MessageFilter.java +++ /dev/null @@ -1,27 +0,0 @@ -/* 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.qpid.filter; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - - -public interface MessageFilter -{ - boolean matches(AbstractJMSMessage message) throws AMQInternalException; -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/PropertyExpression.java b/java/client/src/main/java/org/apache/qpid/filter/PropertyExpression.java deleted file mode 100644 index b7b6bd57bc..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/PropertyExpression.java +++ /dev/null @@ -1,297 +0,0 @@ -/* 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.qpid.filter; - -import java.util.HashMap; - -import javax.jms.JMSException; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Represents a property expression - */ -public class PropertyExpression implements Expression -{ - // Constants - defined the same as JMS - private static final int NON_PERSISTENT = 1; - private static final int DEFAULT_PRIORITY = 4; - - private static final Logger _logger = LoggerFactory.getLogger(PropertyExpression.class); - - private static final HashMap<String, Expression> JMS_PROPERTY_EXPRESSIONS = new HashMap<String, Expression>(); - - static - { - JMS_PROPERTY_EXPRESSIONS.put("JMSDestination", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - //TODO - return null; - } - }); - JMS_PROPERTY_EXPRESSIONS.put("JMSReplyTo", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - return message.getReplyToString(); - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSType", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - return message.getJMSType(); - } - catch (JMSException e) - { - _logger.warn("Error evaluating property", e); - - return null; - } - - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSDeliveryMode", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - int mode = message.getJMSDeliveryMode(); - if (_logger.isDebugEnabled()) - { - _logger.debug("JMSDeliveryMode is :" + mode); - } - - return mode; - } - catch (JMSException e) - { - _logger.warn("Error evaluating property",e); - } - - return NON_PERSISTENT; - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSPriority", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - return message.getJMSPriority(); - } - catch (Exception e) - { - _logger.warn("Error evaluating property",e); - } - - return DEFAULT_PRIORITY; - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("AMQMessageID", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - - try - { - return message.getJMSMessageID(); - } - catch (JMSException e) - { - _logger.warn("Error evaluating property",e); - - return null; - } - - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSTimestamp", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - return message.getJMSTimestamp(); - } - catch (Exception e) - { - _logger.warn("Error evaluating property",e); - - return null; - } - - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSCorrelationID", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - - try - { - return message.getJMSCorrelationID(); - } - catch (JMSException e) - { - _logger.warn("Error evaluating property",e); - - return null; - } - - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSExpiration", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - - try - { - return message.getJMSExpiration(); - } - catch (JMSException e) - { - _logger.warn("Error evaluating property",e); - return null; - } - - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSRedelivered", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - return message.getJMSRedelivered(); - } - catch (JMSException e) - { - _logger.warn("Error evaluating property",e); - return null; - } - } - }); - - JMS_PROPERTY_EXPRESSIONS.put("JMSMessageID", new Expression() - { - public Object evaluate(AbstractJMSMessage message) - { - try - { - return message.getJMSMessageID(); - } - catch (Exception e) - { - _logger.warn("Error evaluating property",e); - - return null; - } - - } - }); - - } - - private final String name; - private final Expression jmsPropertyExpression; - - public PropertyExpression(String name) - { - this.name = name; - jmsPropertyExpression = JMS_PROPERTY_EXPRESSIONS.get(name); - } - - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - - if (jmsPropertyExpression != null) - { - return jmsPropertyExpression.evaluate(message); - } - else - { - - try - { - - if (_logger.isDebugEnabled()) - { - _logger.debug("Looking up property:" + name); - _logger.debug("Properties are:" + message.getPropertyNames()); - } - return message.getObjectProperty(name); - } - catch(JMSException e) - { - throw new AMQInternalException("Exception evaluating properties for filter", e); - } - } - } - - public String getName() - { - return name; - } - - /** - * @see java.lang.Object#toString() - */ - public String toString() - { - return name; - } - - /** - * @see java.lang.Object#hashCode() - */ - public int hashCode() - { - return name.hashCode(); - } - - /** - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object o) - { - if ((o == null) || !this.getClass().equals(o.getClass())) - { - return false; - } - return name.equals(((PropertyExpression) o).name); - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/filter/UnaryExpression.java b/java/client/src/main/java/org/apache/qpid/filter/UnaryExpression.java deleted file mode 100644 index 0fc3382b7e..0000000000 --- a/java/client/src/main/java/org/apache/qpid/filter/UnaryExpression.java +++ /dev/null @@ -1,321 +0,0 @@ -/* 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.qpid.filter; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -import org.apache.qpid.AMQInternalException; -import org.apache.qpid.client.message.AbstractJMSMessage; - -/** - * An expression which performs an operation on two expression values - */ -public abstract class UnaryExpression implements Expression -{ - - private static final BigDecimal BD_LONG_MIN_VALUE = BigDecimal.valueOf(Long.MIN_VALUE); - protected Expression right; - - public static Expression createNegate(Expression left) - { - return new UnaryExpression(left) - { - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Object rvalue = right.evaluate(message); - if (rvalue == null) - { - return null; - } - - if (rvalue instanceof Number) - { - return UnaryExpression.negate((Number) rvalue); - } - - return null; - } - - public String getExpressionSymbol() - { - return "-"; - } - }; - } - - public static BooleanExpression createInExpression(PropertyExpression right, List elements, final boolean not) - { - - // Use a HashSet if there are many elements. - Collection t; - if (elements.size() == 0) - { - t = null; - } - else if (elements.size() < 5) - { - t = elements; - } - else - { - t = new HashSet(elements); - } - - final Collection inList = t; - - return new BooleanUnaryExpression(right) - { - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - - Object rvalue = right.evaluate(message); - if (rvalue == null) - { - return null; - } - - if (rvalue.getClass() != String.class) - { - return null; - } - - if (((inList != null) && inList.contains(rvalue)) ^ not) - { - return Boolean.TRUE; - } - else - { - return Boolean.FALSE; - } - - } - - public String toString() - { - StringBuffer answer = new StringBuffer(); - answer.append(right); - answer.append(" "); - answer.append(getExpressionSymbol()); - answer.append(" ( "); - - int count = 0; - for (Iterator i = inList.iterator(); i.hasNext();) - { - Object o = (Object) i.next(); - if (count != 0) - { - answer.append(", "); - } - - answer.append(o); - count++; - } - - answer.append(" )"); - - return answer.toString(); - } - - public String getExpressionSymbol() - { - if (not) - { - return "NOT IN"; - } - else - { - return "IN"; - } - } - }; - } - - abstract static class BooleanUnaryExpression extends UnaryExpression implements BooleanExpression - { - public BooleanUnaryExpression(Expression left) - { - super(left); - } - - public boolean matches(AbstractJMSMessage message) throws AMQInternalException - { - Object object = evaluate(message); - - return (object != null) && (object == Boolean.TRUE); - } - } - - ; - - public static BooleanExpression createNOT(BooleanExpression left) - { - return new BooleanUnaryExpression(left) - { - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Boolean lvalue = (Boolean) right.evaluate(message); - if (lvalue == null) - { - return null; - } - - return lvalue.booleanValue() ? Boolean.FALSE : Boolean.TRUE; - } - - public String getExpressionSymbol() - { - return "NOT"; - } - }; - } - public static BooleanExpression createBooleanCast(Expression left) - { - return new BooleanUnaryExpression(left) - { - public Object evaluate(AbstractJMSMessage message) throws AMQInternalException - { - Object rvalue = right.evaluate(message); - if (rvalue == null) - { - return null; - } - - if (!rvalue.getClass().equals(Boolean.class)) - { - return Boolean.FALSE; - } - - return ((Boolean) rvalue).booleanValue() ? Boolean.TRUE : Boolean.FALSE; - } - - public String toString() - { - return right.toString(); - } - - public String getExpressionSymbol() - { - return ""; - } - }; - } - - private static Number negate(Number left) - { - Class clazz = left.getClass(); - if (clazz == Integer.class) - { - return new Integer(-left.intValue()); - } - else if (clazz == Long.class) - { - return new Long(-left.longValue()); - } - else if (clazz == Float.class) - { - return new Float(-left.floatValue()); - } - else if (clazz == Double.class) - { - return new Double(-left.doubleValue()); - } - else if (clazz == BigDecimal.class) - { - // We ussually get a big deciamal when we have Long.MIN_VALUE constant in the - // Selector. Long.MIN_VALUE is too big to store in a Long as a positive so we store it - // as a Big decimal. But it gets Negated right away.. to here we try to covert it back - // to a Long. - BigDecimal bd = (BigDecimal) left; - bd = bd.negate(); - - if (UnaryExpression.BD_LONG_MIN_VALUE.compareTo(bd) == 0) - { - return new Long(Long.MIN_VALUE); - } - - return bd; - } - else - { - throw new RuntimeException("Don't know how to negate: " + left); - } - } - - public UnaryExpression(Expression left) - { - this.right = left; - } - - public Expression getRight() - { - return right; - } - - public void setRight(Expression expression) - { - right = expression; - } - - /** - * @see Object#toString() - */ - public String toString() - { - return "(" + getExpressionSymbol() + " " + right.toString() + ")"; - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#hashCode() - */ - public int hashCode() - { - return toString().hashCode(); - } - - /** - * TODO: more efficient hashCode() - * - * @see Object#equals(Object) - */ - public boolean equals(Object o) - { - - if ((o == null) || !this.getClass().equals(o.getClass())) - { - return false; - } - - return toString().equals(o.toString()); - - } - - /** - * Returns the symbol that represents this binary expression. For example, addition is - * represented by "+" - * - * @return - */ - public abstract String getExpressionSymbol(); - -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/BrokerDetails.java b/java/client/src/main/java/org/apache/qpid/jms/BrokerDetails.java deleted file mode 100644 index 6d81f728c9..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/BrokerDetails.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * - * 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.qpid.jms; - -import java.util.Map; - -import org.apache.qpid.client.SSLConfiguration; - -public interface BrokerDetails -{ - - /* - * Known URL Options - * @see ConnectionURL - */ - public static final String OPTIONS_RETRY = "retries"; - public static final String OPTIONS_CONNECT_TIMEOUT = "connecttimeout"; - public static final String OPTIONS_CONNECT_DELAY = "connectdelay"; - public static final String OPTIONS_IDLE_TIMEOUT = "idle_timeout"; // deprecated - public static final String OPTIONS_HEARTBEAT = "heartbeat"; - public static final String OPTIONS_SASL_MECHS = "sasl_mechs"; - public static final String OPTIONS_SASL_ENCRYPTION = "sasl_encryption"; - public static final String OPTIONS_SSL = "ssl"; - public static final String OPTIONS_TCP_NO_DELAY = "tcp_nodelay"; - public static final String OPTIONS_SASL_PROTOCOL_NAME = "sasl_protocol"; - public static final String OPTIONS_SASL_SERVER_NAME = "sasl_server"; - - public static final String OPTIONS_TRUST_STORE = "trust_store"; - public static final String OPTIONS_TRUST_STORE_PASSWORD = "trust_store_password"; - public static final String OPTIONS_KEY_STORE = "key_store"; - public static final String OPTIONS_KEY_STORE_PASSWORD = "key_store_password"; - public static final String OPTIONS_SSL_VERIFY_HOSTNAME = "ssl_verify_hostname"; - public static final String OPTIONS_SSL_CERT_ALIAS = "ssl_cert_alias"; - - public static final int DEFAULT_PORT = 5672; - - public static final String SOCKET = "socket"; - public static final String TCP = "tcp"; - public static final String VM = "vm"; - - public static final String DEFAULT_TRANSPORT = TCP; - - public static final String URL_FORMAT_EXAMPLE = - "<transport>://<hostname>[:<port Default=\"" + DEFAULT_PORT + "\">][?<option>='<value>'[,<option>='<value>']]"; - - public static final long DEFAULT_CONNECT_TIMEOUT = 30000L; - public static final boolean USE_SSL_DEFAULT = false; - - // pulled these properties from the new BrokerDetails class in the qpid package - public static final String PROTOCOL_TCP = "tcp"; - public static final String PROTOCOL_TLS = "tls"; - - public static final String VIRTUAL_HOST = "virtualhost"; - public static final String CLIENT_ID = "client_id"; - public static final String USERNAME = "username"; - public static final String PASSWORD = "password"; - - String getHost(); - - void setHost(String host); - - int getPort(); - - void setPort(int port); - - String getTransport(); - - void setTransport(String transport); - - String getProperty(String key); - - void setProperty(String key, String value); - - /** - * Ex: keystore path - * - * @return the Properties associated with this connection. - */ - public Map<String,String> getProperties(); - - /** - * Sets the properties associated with this connection - * - * @param props the new p[roperties. - */ - public void setProperties(Map<String,String> props); - - long getTimeout(); - - void setTimeout(long timeout); - - SSLConfiguration getSSLConfiguration(); - - void setSSLConfiguration(SSLConfiguration sslConfiguration); - - boolean getBooleanProperty(String propName); - - String toString(); - - boolean equals(Object o); -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/ChannelLimitReachedException.java b/java/client/src/main/java/org/apache/qpid/jms/ChannelLimitReachedException.java deleted file mode 100644 index e8c2b9d682..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/ChannelLimitReachedException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * 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.qpid.jms; - -import javax.jms.ResourceAllocationException; - -/** - * Indicates that the maximum number of sessions per connection limit has been reached. - */ -public class ChannelLimitReachedException extends ResourceAllocationException -{ - private static final String ERROR_CODE = "1"; - - private long _limit; - - public ChannelLimitReachedException(long limit) - { - super("Unable to create session, the maximum number of sessions per connection is " + - limit + ". You must either close one or more sessions or increase the " + - "maximum number of sessions available per connection.", ERROR_CODE); - _limit = limit; - } - - public long getLimit() - { - return _limit; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/Connection.java b/java/client/src/main/java/org/apache/qpid/jms/Connection.java deleted file mode 100644 index 616c6dbbec..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/Connection.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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.qpid.jms; - -import javax.jms.JMSException; - -public interface Connection extends javax.jms.Connection -{ - /** - * @return the maximum number of sessions supported by this Connection - */ - long getMaximumChannelCount() throws JMSException; - - void setConnectionListener(ConnectionListener listener); - - /** - * Get the connection listener that has been registered with this connection, if any - * - * @return the listener or null if none has been set - */ - ConnectionListener getConnectionListener(); - - /** - * Create a session specifying the prefetch limit of messages. - * - * @param transacted - * @param acknowledgeMode - * @param prefetch the maximum number of messages to buffer in the client. This - * applies as a total across all consumers - * @return - * @throws JMSException - */ - org.apache.qpid.jms.Session createSession(boolean transacted, int acknowledgeMode, - int prefetch) throws JMSException; - - - /** - * Create a session specifying the prefetch limit of messages. - * - * @param transacted - * @param acknowledgeMode - * @param prefetchHigh the maximum number of messages to buffer in the client. - * This applies as a total across all consumers - * @param prefetchLow the number of messages that must be in the buffer in the client to renable message flow. - * This applies as a total across all consumers - * @return - * @throws JMSException - */ - org.apache.qpid.jms.Session createSession(boolean transacted, int acknowledgeMode, - int prefetchHigh, int prefetchLow) throws JMSException; -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/ConnectionListener.java b/java/client/src/main/java/org/apache/qpid/jms/ConnectionListener.java deleted file mode 100644 index 11c235901c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/ConnectionListener.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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.qpid.jms; - -public interface ConnectionListener -{ - /** - * Called when bytes have been transmitted to the server - * @param count the number of bytes sent in total since the connection was opened - */ - void bytesSent(long count); - - /** - * Called when some bytes have been received on a connection - * @param count the number of bytes received in total since the connection was opened - */ - void bytesReceived(long count); - - /** - * Called after the infrastructure has detected that failover is required but before attempting failover. - * @param redirect true if the broker requested redirect. false if failover is occurring due to a connection error. - * @return true to continue failing over, false to veto failover and raise a connection exception - */ - boolean preFailover(boolean redirect); - - /** - * Called after connection has been made to another broker after failover has been started but before - * any resubscription has been done. - * @return true to continue with resubscription, false to prevent automatic resubscription. This is useful in - * cases where the application wants to handle resubscription. Note that in the latter case all sessions, producers - * and consumers are invalidated. - */ - boolean preResubscribe(); - - /** - * Called once failover has completed successfully. This is called irrespective of whether the client has - * vetoed automatic resubscription. - */ - void failoverComplete(); -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/ConnectionURL.java b/java/client/src/main/java/org/apache/qpid/jms/ConnectionURL.java deleted file mode 100644 index 0e8ca60686..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/ConnectionURL.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * - * 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.qpid.jms; - -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ProtocolVersion; - -import java.util.List; - -/** - Connection URL format - amqp://[user:pass@][clientid]/virtualhost?brokerlist='tcp://host:port?option=\'value\'&option=\'value\';vm://:3/virtualpath?option=\'value\''&failover='method?option=\'value\'&option='value''" - Options are of course optional except for requiring a single broker in the broker list. - The option seperator is defined to be either '&' or ',' - */ -public interface ConnectionURL -{ - public static final String AMQ_PROTOCOL = "amqp"; - public static final String OPTIONS_SYNC_PERSISTENCE = "sync_persistence"; - public static final String OPTIONS_MAXPREFETCH = "maxprefetch"; - public static final String OPTIONS_SYNC_ACK = "sync_ack"; - public static final String OPTIONS_SYNC_PUBLISH = "sync_publish"; - public static final String OPTIONS_USE_LEGACY_MAP_MESSAGE_FORMAT = "use_legacy_map_msg_format"; - public static final String OPTIONS_BROKERLIST = "brokerlist"; - public static final String OPTIONS_FAILOVER = "failover"; - public static final String OPTIONS_FAILOVER_CYCLE = "cyclecount"; - public static final String OPTIONS_DEFAULT_TOPIC_EXCHANGE = "defaultTopicExchange"; - public static final String OPTIONS_DEFAULT_QUEUE_EXCHANGE = "defaultQueueExchange"; - public static final String OPTIONS_TEMPORARY_TOPIC_EXCHANGE = "temporaryTopicExchange"; - public static final String OPTIONS_TEMPORARY_QUEUE_EXCHANGE = "temporaryQueueExchange"; - public static final byte URL_0_8 = 1; - public static final byte URL_0_10 = 2; - - String getURL(); - - String getFailoverMethod(); - - String getFailoverOption(String key); - - int getBrokerCount(); - - BrokerDetails getBrokerDetails(int index); - - void addBrokerDetails(BrokerDetails broker); - - void setBrokerDetails(List<BrokerDetails> brokers); - - List<BrokerDetails> getAllBrokerDetails(); - - String getClientName(); - - void setClientName(String clientName); - - String getUsername(); - - void setUsername(String username); - - String getPassword(); - - void setPassword(String password); - - String getVirtualHost(); - - void setVirtualHost(String virtualHost); - - String getOption(String key); - - void setOption(String key, String value); - - AMQShortString getDefaultQueueExchangeName(); - - AMQShortString getDefaultTopicExchangeName(); - - AMQShortString getTemporaryQueueExchangeName(); - - AMQShortString getTemporaryTopicExchangeName(); - -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/FailoverPolicy.java b/java/client/src/main/java/org/apache/qpid/jms/FailoverPolicy.java deleted file mode 100644 index 56abf03c81..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/FailoverPolicy.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * - * 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.qpid.jms; - -import org.apache.qpid.jms.failover.FailoverExchangeMethod; -import org.apache.qpid.jms.failover.FailoverMethod; -import org.apache.qpid.jms.failover.FailoverRoundRobinServers; -import org.apache.qpid.jms.failover.FailoverSingleServer; -import org.apache.qpid.jms.failover.NoFailover; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FailoverPolicy -{ - private static final Logger _logger = LoggerFactory.getLogger(FailoverPolicy.class); - - private static final long MINUTE = 60000L; - - private static final long DEFAULT_METHOD_TIMEOUT = 1 * MINUTE; - - private FailoverMethod[] _methods = new FailoverMethod[1]; - - private int _currentMethod; - - private int _methodsRetries; - - private int _currentRetry; - - private boolean _timing; - - private long _lastMethodTime; - private long _lastFailTime; - - public FailoverPolicy(ConnectionURL connectionDetails, Connection conn) - { - FailoverMethod method; - - // todo This should be integrated in to the connection url when it supports - // multiple strategies. - - _methodsRetries = 0; - - if (connectionDetails.getFailoverMethod() == null) - { - if (connectionDetails.getBrokerCount() > 1) - { - method = new FailoverRoundRobinServers(connectionDetails); - } - else - { - method = new FailoverSingleServer(connectionDetails); - } - } - else - { - String failoverMethod = connectionDetails.getFailoverMethod(); - - /* - if (failoverMethod.equals(FailoverMethod.RANDOM)) - { - //todo write a random connection Failover - } - */ - if (failoverMethod.equals(FailoverMethod.SINGLE_BROKER)) - { - method = new FailoverSingleServer(connectionDetails); - } - else - { - if (failoverMethod.equals(FailoverMethod.ROUND_ROBIN)) - { - method = new FailoverRoundRobinServers(connectionDetails); - } - else if (failoverMethod.equals(FailoverMethod.FAILOVER_EXCHANGE)) - { - method = new FailoverExchangeMethod(connectionDetails, conn); - } - else if (failoverMethod.equals(FailoverMethod.NO_FAILOVER)) - { - method = new NoFailover(connectionDetails); - } - else - { - try - { - Class[] constructorSpec = { ConnectionURL.class }; - Object[] params = { connectionDetails }; - - method = - (FailoverMethod) ClassLoader.getSystemClassLoader().loadClass(failoverMethod) - .getConstructor(constructorSpec).newInstance(params); - } - catch (Exception cnfe) - { - throw new IllegalArgumentException("Unknown failover method:" + failoverMethod, cnfe); - } - } - } - } - - if (method == null) - { - throw new IllegalArgumentException("Unknown failover method specified."); - } - - reset(); - - _methods[_currentMethod] = method; - } - - public FailoverPolicy(FailoverMethod method) - { - this(method, 0); - } - - public FailoverPolicy(FailoverMethod method, int retries) - { - _methodsRetries = retries; - - reset(); - - _methods[_currentMethod] = method; - } - - private void reset() - { - _currentMethod = 0; - _currentRetry = 0; - _timing = false; - - } - - public boolean failoverAllowed() - { - boolean failoverAllowed; - - if (_timing) - { - long now = System.currentTimeMillis(); - - if ((now - _lastMethodTime) >= DEFAULT_METHOD_TIMEOUT) - { - _logger.info("Failover method timeout"); - _lastMethodTime = now; - - if (!nextMethod()) - { - return false; - } - - } - else - { - _lastMethodTime = now; - } - } - else - { - _timing = true; - _lastMethodTime = System.currentTimeMillis(); - _lastFailTime = _lastMethodTime; - } - - if (_methods[_currentMethod].failoverAllowed()) - { - failoverAllowed = true; - } - else - { - if (_currentMethod < (_methods.length - 1)) - { - nextMethod(); - _logger.info("Changing method to " + _methods[_currentMethod].methodName()); - - return failoverAllowed(); - } - else - { - return cycleMethods(); - } - } - - return failoverAllowed; - } - - private boolean nextMethod() - { - if (_currentMethod < (_methods.length - 1)) - { - _currentMethod++; - _methods[_currentMethod].reset(); - - return true; - } - else - { - return cycleMethods(); - } - } - - private boolean cycleMethods() - { - if (_currentRetry < _methodsRetries) - { - _currentRetry++; - - _currentMethod = 0; - - _logger.info("Retrying methods starting with " + _methods[_currentMethod].methodName()); - _methods[_currentMethod].reset(); - - return failoverAllowed(); - } - else - { - _logger.debug("All failover methods exhausted"); - - return false; - } - } - - /** - * Notification that connection was successful. - */ - public void attainedConnection() - { - _currentRetry = 0; - - _methods[_currentMethod].attainedConnection(); - - _timing = false; - } - - public BrokerDetails getCurrentBrokerDetails() - { - return _methods[_currentMethod].getCurrentBrokerDetails(); - } - - public BrokerDetails getNextBrokerDetails() - { - return _methods[_currentMethod].getNextBrokerDetails(); - } - - public void setBroker(BrokerDetails broker) - { - _methods[_currentMethod].setBroker(broker); - } - - public void addMethod(FailoverMethod method) - { - int len = _methods.length + 1; - FailoverMethod[] newMethods = new FailoverMethod[len]; - System.arraycopy(_methods, 0, newMethods, 0, _methods.length); - int index = len - 1; - newMethods[index] = method; - _methods = newMethods; - } - - public void setMethodRetries(int retries) - { - _methodsRetries = retries; - } - - public FailoverMethod getCurrentMethod() - { - if ((_currentMethod >= 0) && (_currentMethod < (_methods.length))) - { - return _methods[_currentMethod]; - } - else - { - return null; - } - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - - sb.append("Failover Policy:\n"); - - if (failoverAllowed()) - { - sb.append("Failover allowed\n"); - } - else - { - sb.append("Failover not allowed\n"); - } - - sb.append("Failover policy methods\n"); - for (int i = 0; i < _methods.length; i++) - { - - if (i == _currentMethod) - { - sb.append(">"); - } - - sb.append(_methods[i].toString()); - } - - return sb.toString(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/Message.java b/java/client/src/main/java/org/apache/qpid/jms/Message.java deleted file mode 100644 index 53c615a1fd..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/Message.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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.qpid.jms; - -import javax.jms.JMSException; - -public interface Message extends javax.jms.Message -{ - public static final String JMS_TYPE = "x-jms-type"; - - public void acknowledgeThis() throws JMSException; -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/MessageConsumer.java b/java/client/src/main/java/org/apache/qpid/jms/MessageConsumer.java deleted file mode 100644 index caac2b5c1f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/MessageConsumer.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * 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.qpid.jms; - -/** - */ -public interface MessageConsumer extends javax.jms.MessageConsumer -{ -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/MessageProducer.java b/java/client/src/main/java/org/apache/qpid/jms/MessageProducer.java deleted file mode 100644 index b830c377b8..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/MessageProducer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * 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.qpid.jms; - -import java.io.UnsupportedEncodingException; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; - -/** - */ -public interface MessageProducer extends javax.jms.MessageProducer -{ - /** - * Set the default MIME type for messages produced by this producer. This reduces the overhead of each message. - * @param mimeType - */ - void setMimeType(String mimeType) throws JMSException; - - /** - * Set the default encoding for messages produced by this producer. This reduces the overhead of each message. - * @param encoding the encoding as understood by XXXX how do I specify this?? RG - * @throws UnsupportedEncodingException if the encoding is not understood - */ - void setEncoding(String encoding) throws UnsupportedEncodingException, JMSException; - - void send(Destination destination, Message message, int deliveryMode, - int priority, long timeToLive, boolean immediate) - throws JMSException; - - void send(Destination destination, Message message, int deliveryMode, - int priority, long timeToLive, boolean mandatory, boolean immediate) - throws JMSException; - - void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive, - boolean mandatory, boolean immediate, boolean waitUntilSent) throws JMSException; - -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/Session.java b/java/client/src/main/java/org/apache/qpid/jms/Session.java deleted file mode 100644 index 5287381fae..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/Session.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * - * 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.qpid.jms; - -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; - - -public interface Session extends javax.jms.Session -{ - /** - * Indicates that no client acknowledgements are required. Broker assumes that once it has delivered - * a message packet successfully it is acknowledged. - */ - static final int NO_ACKNOWLEDGE = 257; - - /** - * Pre acknowledge means that an ack is sent per message but sent before user code has processed - * the message (i.e. before the onMessage() call or the receive() method has returned). - */ - static final int PRE_ACKNOWLEDGE = 258; - - MessageConsumer createConsumer(Destination destination, - int prefetch, - boolean noLocal, - boolean exclusive, - String selector) throws JMSException; - - MessageConsumer createConsumer(Destination destination, - int prefetchHigh, - int prefetchLow, - boolean noLocal, - boolean exclusive, - String selector) throws JMSException; - - /** - * @return the prefetch value used by default for consumers created on this session. - */ - int getDefaultPrefetch(); - - /** - * @return the High water prefetch value used by default for consumers created on this session. - */ - int getDefaultPrefetchHigh(); - - /** - * @return the Low water prefetch value used by default for consumers created on this session. - */ - int getDefaultPrefetchLow(); - - /** - * Create a producer - * @param destination - * @param mandatory the value of the mandatory flag used by default on the producer - * @param immediate the value of the immediate flag used by default on the producer - * @return - * @throws JMSException - */ - MessageProducer createProducer(Destination destination, boolean mandatory, boolean immediate) - throws JMSException; - - /** - * Create a producer - * @param destination - * @param immediate the value of the immediate flag used by default on the producer - * @return - * @throws JMSException - */ - MessageProducer createProducer(Destination destination, boolean immediate) - throws JMSException; - - AMQShortString getTemporaryTopicExchangeName(); - - AMQShortString getDefaultQueueExchangeName(); - - AMQShortString getDefaultTopicExchangeName(); - - AMQShortString getTemporaryQueueExchangeName(); -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/TopicSubscriber.java b/java/client/src/main/java/org/apache/qpid/jms/TopicSubscriber.java deleted file mode 100644 index 1dbe464230..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/TopicSubscriber.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.apache.qpid.jms; -/* - * - * 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. - * - */ - - -import org.apache.qpid.AMQException; - -import javax.jms.Topic; - -public interface TopicSubscriber extends javax.jms.TopicSubscriber -{ - - void addBindingKey(Topic topic, String bindingKey) throws AMQException; -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverExchangeMethod.java b/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverExchangeMethod.java deleted file mode 100644 index ef30f2adbc..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverExchangeMethod.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * - * 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.qpid.jms.failover; - -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.List; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.Session; - -import org.apache.qpid.client.AMQAnyDestination; -import org.apache.qpid.client.AMQBrokerDetails; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.Connection; -import org.apache.qpid.jms.ConnectionURL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * When using the Failover exchange a single broker is supplied in the URL. - * The connection will then connect to the cluster using the above broker details. - * Once connected, the membership details of the cluster will be obtained via - * subscribing to a queue bound to the failover exchange. - * - * The failover exchange will provide a list of broker URLs in the format "transport:ip:port" - * Out of this list we only select brokers that match the transport of the original - * broker supplied in the connection URL. - * - * Also properties defined for the original broker will be applied to all the brokers selected - * from the list. - */ - -public class FailoverExchangeMethod implements FailoverMethod, MessageListener -{ - private static final Logger _logger = LoggerFactory.getLogger(FailoverExchangeMethod.class); - - /** This is not safe to use until attainConnection is called */ - private Connection _conn; - - /** Protects the broker list when modifications happens */ - private Object _brokerListLock = new Object(); - - /** The session used to subscribe to failover exchange */ - private Session _ssn; - - private BrokerDetails _originalBrokerDetail; - - /** The index into the hostDetails array of the broker to which we are connected */ - private int _currentBrokerIndex = 0; - - /** The broker currently selected **/ - private BrokerDetails _currentBrokerDetail; - - /** Array of BrokerDetail used to make connections. */ - private ConnectionURL _connectionDetails; - - /** Denotes the number of failed attempts **/ - private int _failedAttemps = 0; - - public FailoverExchangeMethod(ConnectionURL connectionDetails, Connection conn) - { - _connectionDetails = connectionDetails; - _originalBrokerDetail = _connectionDetails.getBrokerDetails(0); - - // This is not safe to use until attainConnection is called, as this ref will not initialized fully. - // The reason being this constructor is called inside the AMWConnection constructor. - // It would be best if we find a way to pass this ref after AMQConnection is fully initialized. - _conn = conn; - } - - private void subscribeForUpdates() throws JMSException - { - if (_ssn == null) - { - _ssn = _conn.createSession(false,Session.AUTO_ACKNOWLEDGE); - MessageConsumer cons = _ssn.createConsumer( - new AMQAnyDestination(new AMQShortString("amq.failover"), - new AMQShortString("amq.failover"), - new AMQShortString(""), - true,true,null,false, - new AMQShortString[0])); - cons.setMessageListener(this); - } - } - - public void onMessage(Message m) - { - _logger.info("Failover exchange notified cluster membership change"); - - String currentBrokerIP = ""; - try - { - currentBrokerIP = InetAddress.getByName(_currentBrokerDetail.getHost()).getHostAddress(); - } - catch(Exception e) - { - _logger.warn("Unable to resolve current broker host name",e); - } - - List<BrokerDetails> brokerList = new ArrayList<BrokerDetails>(); - try - { - List<String> list = (List<String>)m.getObjectProperty("amq.failover"); - for (String brokerEntry:list) - { - String[] urls = brokerEntry.substring(5) .split(","); - // Iterate until you find the correct transport - // Need to reconsider the logic when the C++ broker supports - // SSL URLs. - for (String url:urls) - { - String[] tokens = url.split(":"); - if (tokens[0].equalsIgnoreCase(_originalBrokerDetail.getTransport())) - { - BrokerDetails broker = new AMQBrokerDetails(); - broker.setTransport(tokens[0]); - broker.setHost(tokens[1]); - broker.setPort(Integer.parseInt(tokens[2])); - broker.setProperties(_originalBrokerDetail.getProperties()); - broker.setSSLConfiguration(_originalBrokerDetail.getSSLConfiguration()); - brokerList.add(broker); - - if (currentBrokerIP.equals(broker.getHost()) && - _currentBrokerDetail.getPort() == broker.getPort()) - { - _currentBrokerIndex = brokerList.indexOf(broker); - } - - break; - } - } - } - } - catch(JMSException e) - { - _logger.error("Error parsing the message sent by failover exchange",e); - } - - synchronized (_brokerListLock) - { - _connectionDetails.setBrokerDetails(brokerList); - } - - _logger.info("============================================================"); - _logger.info("Updated cluster membership details " + _connectionDetails); - _logger.info("============================================================"); - } - - public void attainedConnection() - { - try - { - _failedAttemps = 0; - _logger.info("============================================================"); - _logger.info("Attained connection "); - _logger.info("============================================================"); - subscribeForUpdates(); - } - catch (JMSException e) - { - throw new RuntimeException("Unable to subscribe for cluster membership updates",e); - } - } - - public BrokerDetails getCurrentBrokerDetails() - { - synchronized (_brokerListLock) - { - _currentBrokerDetail = _connectionDetails.getBrokerDetails(_currentBrokerIndex); - return _currentBrokerDetail; - } - } - - public BrokerDetails getNextBrokerDetails() - { - BrokerDetails broker = null; - - synchronized(_brokerListLock) - { - if (_currentBrokerIndex == (_connectionDetails.getBrokerCount() - 1)) - { - _currentBrokerIndex = 0; - } - else - { - _currentBrokerIndex++; - } - - broker = _connectionDetails.getBrokerDetails(_currentBrokerIndex); - - // When the broker list is updated it will include the current broker as well - // There is no point trying it again, so trying the next one. - if (_currentBrokerDetail != null && - broker.getHost().equals(_currentBrokerDetail.getHost()) && - broker.getPort() == _currentBrokerDetail.getPort()) - { - if (_connectionDetails.getBrokerCount() > 1) - { - return getNextBrokerDetails(); - } - else - { - _failedAttemps ++; - return null; - } - } - } - - String delayStr = broker.getProperty(BrokerDetails.OPTIONS_CONNECT_DELAY); - if (delayStr != null) - { - Long delay = Long.parseLong(delayStr); - _logger.info("Delay between connect retries:" + delay); - try - { - Thread.sleep(delay); - } - catch (InterruptedException ie) - { - return null; - } - } - else - { - _logger.info("No delay between connect retries, use tcp://host:port?connectdelay='value' to enable."); - } - - _failedAttemps ++; - _currentBrokerDetail = broker; - - return broker; - } - - public boolean failoverAllowed() - { - // We allow to Failover provided - // our broker list is not empty and - // we haven't gone through all of them - - boolean b = _connectionDetails.getBrokerCount() > 0 && - _failedAttemps <= _connectionDetails.getBrokerCount(); - - - _logger.info("============================================================"); - _logger.info(toString()); - _logger.info("FailoverAllowed " + b); - _logger.info("============================================================"); - - return b; - } - - public void reset() - { - _failedAttemps = 0; - } - - public void setBroker(BrokerDetails broker) - { - // not sure if this method is needed - } - - public void setRetries(int maxRetries) - { - // no max retries we keep trying as long - // as we get updates - } - - public String methodName() - { - return "Failover Exchange"; - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - sb.append("FailoverExchange:\n"); - sb.append("\n Current Broker Index:"); - sb.append(_currentBrokerIndex); - sb.append("\n Failed Attempts:"); - sb.append(_failedAttemps); - sb.append("\n Orignal broker details:"); - sb.append(_originalBrokerDetail).append("\n"); - sb.append("\n -------- Broker List -----------\n"); - for (int i = 0; i < _connectionDetails.getBrokerCount(); i++) - { - if (i == _currentBrokerIndex) - { - sb.append(">"); - } - - sb.append(_connectionDetails.getBrokerDetails(i)); - sb.append("\n"); - } - sb.append("--------------------------------\n"); - return sb.toString(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverMethod.java b/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverMethod.java deleted file mode 100644 index 1cef067e5f..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverMethod.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * - * 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.qpid.jms.failover; - -import org.apache.qpid.jms.BrokerDetails; - -public interface FailoverMethod -{ - public static final String SINGLE_BROKER = "singlebroker"; - public static final String ROUND_ROBIN = "roundrobin"; - public static final String FAILOVER_EXCHANGE= "failover_exchange"; - public static final String RANDOM = "random"; - public static final String NO_FAILOVER = "nofailover"; - - /** - * Reset the Failover to initial conditions - */ - void reset(); - - /** - * Check if failover is possible for this method - * - * @return true if failover is allowed - */ - boolean failoverAllowed(); - - /** - * Notification to the Failover method that a connection has been attained. - */ - void attainedConnection(); - - /** - * If there is no current BrokerDetails the null will be returned. - * @return The current BrokerDetail value to use - */ - BrokerDetails getCurrentBrokerDetails(); - - /** - * Move to the next BrokerDetails if one is available. - * @return the next BrokerDetail or null if there is none. - */ - BrokerDetails getNextBrokerDetails(); - - /** - * Set the currently active broker to be the new value. - * @param broker The new BrokerDetail value - */ - void setBroker(BrokerDetails broker); - - /** - * Set the retries for this method - * @param maxRetries the maximum number of time to retry this Method - */ - void setRetries(int maxRetries); - - /** - * @return The name of this method for display purposes. - */ - String methodName(); -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverRoundRobinServers.java b/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverRoundRobinServers.java deleted file mode 100644 index 41ba4974ec..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverRoundRobinServers.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * - * 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.qpid.jms.failover; - -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FailoverRoundRobinServers implements FailoverMethod -{ - private static final Logger _logger = LoggerFactory.getLogger(FailoverRoundRobinServers.class); - - /** The default number of times to cycle through all servers */ - public static final int DEFAULT_CYCLE_RETRIES = 1; - /** The default number of times to retry each server */ - public static final int DEFAULT_SERVER_RETRIES = 0; - - /** The index into the hostDetails array of the broker to which we are connected */ - private int _currentBrokerIndex = 0; - - /** The number of times to retry connecting for each server */ - private int _serverRetries; - - /** The current number of retry attempts made */ - private int _currentServerRetry = 0; - - /** The number of times to cycle through the servers */ - private int _cycleRetries; - - /** The current number of cycles performed. */ - private int _currentCycleRetries = 0; - - /** Array of BrokerDetail used to make connections. */ - protected ConnectionURL _connectionDetails; - - public FailoverRoundRobinServers(ConnectionURL connectionDetails) - { - if (!(connectionDetails.getBrokerCount() > 0)) - { - throw new IllegalArgumentException("At least one broker details must be specified."); - } - - _connectionDetails = connectionDetails; - - // There is no current broker at startup so set it to -1. - _currentBrokerIndex = 0; - - String cycleRetries = _connectionDetails.getFailoverOption(ConnectionURL.OPTIONS_FAILOVER_CYCLE); - - _cycleRetries = DEFAULT_CYCLE_RETRIES; - - if (cycleRetries != null) - { - try - { - _cycleRetries = Integer.parseInt(cycleRetries); - } - catch (NumberFormatException nfe) - { - _logger.warn("Cannot set cycle Retries, " + cycleRetries + " is not a number. Using default: " + DEFAULT_CYCLE_RETRIES); - } - } - - _currentCycleRetries = 0; - - _serverRetries = 0; - _currentServerRetry = 0; - } - - public void reset() - { - _currentBrokerIndex = 0; - _currentCycleRetries = 0; - _currentServerRetry = 0; - } - - public boolean failoverAllowed() - { - _logger.info("==== Checking failoverAllowed() ===="); - _logger.info(toString()); - _logger.info("===================================="); - return ((_currentCycleRetries < _cycleRetries) || (_currentServerRetry < _serverRetries)); - } - - public void attainedConnection() - { - _currentCycleRetries = 0; - _currentServerRetry = 0; - } - - public BrokerDetails getCurrentBrokerDetails() - { - return _connectionDetails.getBrokerDetails(_currentBrokerIndex); - } - - public BrokerDetails getNextBrokerDetails() - { - boolean doDelay = false; - - if (_currentBrokerIndex == (_connectionDetails.getBrokerCount() - 1)) - { - if (_currentServerRetry < _serverRetries) - { - _logger.info("Trying " + _connectionDetails.getBrokerDetails(_currentBrokerIndex)); - doDelay= _currentBrokerIndex != 0; - _currentServerRetry++; - } - else - { - _currentCycleRetries++; - // failed to connect to first broker - _currentBrokerIndex = 0; - - setBroker(_connectionDetails.getBrokerDetails(_currentBrokerIndex)); - - // This is zero rather than -1 as we are already retrieving the details. - _currentServerRetry = 0; - } - // else - should force client to stop as max retries has been reached. - } - else - { - if (_currentServerRetry < _serverRetries) - { - _logger.info("Trying " + _connectionDetails.getBrokerDetails(_currentBrokerIndex)); - doDelay= _currentBrokerIndex != 0; - - _currentServerRetry++; - } - else - { - _currentBrokerIndex++; - - setBroker(_connectionDetails.getBrokerDetails(_currentBrokerIndex)); - // This is zero rather than -1 as we are already retrieving the details. - _currentServerRetry = 0; - } - } - - BrokerDetails broker = _connectionDetails.getBrokerDetails(_currentBrokerIndex); - - String delayStr = broker.getProperty(BrokerDetails.OPTIONS_CONNECT_DELAY); - if (delayStr != null && doDelay) - { - Long delay = Long.parseLong(delayStr); - _logger.info("Delay between connect retries:" + delay); - try - { - Thread.sleep(delay); - } - catch (InterruptedException ie) - { - return null; - } - } - else - { - // Only display if option not set. Not if deDelay==false. - if (delayStr == null) - { - _logger.info("No delay between connect retries, use tcp://host:port?connectdelay='value' to enable."); - } - } - - return broker; - } - - public void setBroker(BrokerDetails broker) - { - - _connectionDetails.addBrokerDetails(broker); - - int index = _connectionDetails.getAllBrokerDetails().indexOf(broker); - - String serverRetries = broker.getProperty(BrokerDetails.OPTIONS_RETRY); - - if (serverRetries != null) - { - try - { - _serverRetries = Integer.parseInt(serverRetries); - } - catch (NumberFormatException nfe) - { - _serverRetries = DEFAULT_SERVER_RETRIES; - } - } - - _currentServerRetry = 0; - _currentBrokerIndex = index; - } - - public void setRetries(int maxRetries) - { - _cycleRetries = maxRetries; - } - - public String methodName() - { - return "Cycle Servers"; - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - - sb.append("Cycle Servers:\n"); - - sb.append("Cycle Retries:"); - sb.append(_cycleRetries); - sb.append("\nCurrent Cycle:"); - sb.append(_currentCycleRetries); - sb.append("\nServer Retries:"); - sb.append(_serverRetries); - sb.append("\nCurrent Retry:"); - sb.append(_currentServerRetry); - sb.append("\nCurrent Broker:"); - sb.append(_currentBrokerIndex); - sb.append("\n"); - - for (int i = 0; i < _connectionDetails.getBrokerCount(); i++) - { - if (i == _currentBrokerIndex) - { - sb.append(">"); - } - - sb.append(_connectionDetails.getBrokerDetails(i)); - sb.append("\n"); - } - - return sb.toString(); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverSingleServer.java b/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverSingleServer.java deleted file mode 100644 index d033a49f5c..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/failover/FailoverSingleServer.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * - * 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.qpid.jms.failover; - -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FailoverSingleServer implements FailoverMethod -{ - private static final Logger _logger = LoggerFactory.getLogger(FailoverSingleServer.class); - - /** The default number of times to rety a conection to this server */ - public static final int DEFAULT_SERVER_RETRIES = 0; - - /** The details of the Single Server */ - private BrokerDetails _brokerDetail; - - /** The number of times to retry connecting to the sever */ - protected int _retries; - - /** The current number of attempts made to the server */ - protected int _currentRetries = 0; - - - public FailoverSingleServer(ConnectionURL connectionDetails) - { - if (connectionDetails.getBrokerCount() > 0) - { - setBroker(connectionDetails.getBrokerDetails(0)); - } - else - { - throw new IllegalArgumentException("BrokerDetails details required for connection."); - } - } - - public FailoverSingleServer(BrokerDetails brokerDetail) - { - setBroker(brokerDetail); - } - - public void reset() - { - _currentRetries = 0; - } - - public boolean failoverAllowed() - { - return _currentRetries < _retries; - } - - public void attainedConnection() - { - reset(); - } - - public BrokerDetails getCurrentBrokerDetails() - { - return _brokerDetail; - } - - public BrokerDetails getNextBrokerDetails() - { - if (_currentRetries == _retries) - { - return null; - } - else - { - if (_currentRetries < _retries) - { - _currentRetries++; - } - } - - - String delayStr = _brokerDetail.getProperty(BrokerDetails.OPTIONS_CONNECT_DELAY); - if (delayStr != null && _currentRetries > 0) - { - Long delay = Long.parseLong(delayStr); - _logger.info("Delay between connect retries:" + delay); - try - { - - Thread.sleep(delay); - } - catch (InterruptedException ie) - { - return null; - } - } - else - { - _logger.info("No delay between connect retries, use tcp://host:port?connectdelay='value' to enable."); - } - - return _brokerDetail; - } - - public void setBroker(BrokerDetails broker) - { - if (broker == null) - { - throw new IllegalArgumentException("BrokerDetails details cannot be null"); - } - _brokerDetail = broker; - - String retries = broker.getProperty(BrokerDetails.OPTIONS_RETRY); - if (retries != null) - { - try - { - _retries = Integer.parseInt(retries); - } - catch (NumberFormatException nfe) - { - _retries = DEFAULT_SERVER_RETRIES; - } - } - else - { - _retries = DEFAULT_SERVER_RETRIES; - } - - reset(); - } - - public void setRetries(int retries) - { - _retries = retries; - } - - public String methodName() - { - return "Single Server"; - } - - public String toString() - { - return methodName()+":\n" + - "Max Retries:" + _retries + - "\nCurrent Retry:" + _currentRetries + - "\n" + _brokerDetail + "\n"; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/jms/failover/NoFailover.java b/java/client/src/main/java/org/apache/qpid/jms/failover/NoFailover.java deleted file mode 100644 index 1231324397..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jms/failover/NoFailover.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * 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.qpid.jms.failover; - -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; - -/** - * Extend the Single Server Model to gain retry functionality but once connected do not attempt to failover. - */ -public class NoFailover extends FailoverSingleServer -{ - private boolean _connected = false; - - public NoFailover(BrokerDetails brokerDetail) - { - super(brokerDetail); - } - - public NoFailover(ConnectionURL connectionDetails) - { - super(connectionDetails); - } - - @Override - public void attainedConnection() - { - _connected=true; - _currentRetries = _retries; - } - - @Override - public String methodName() - { - return "NoFailover"; - } - - @Override - public String toString() - { - return super.toString() + (_connected ? "Connection attained." : "Never connected.") + "\n"; - } - -} diff --git a/java/client/src/main/java/org/apache/qpid/jndi/Example.properties b/java/client/src/main/java/org/apache/qpid/jndi/Example.properties deleted file mode 100644 index def53d8494..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jndi/Example.properties +++ /dev/null @@ -1,40 +0,0 @@ -# -# 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. -# -java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialConextFactory - -# use the following property to configure the default connector -#java.naming.provider.url - ignored. - -# register some connection factories -# connectionfactory.[jndiname] = [ConnectionURL] -connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1' - -# register some queues in JNDI using the form -# queue.[jndiName] = [physicalName] -queue.MyQueue = example.MyQueue - -# register some topics in JNDI using the form -# topic.[jndiName] = [physicalName] -topic.ibmStocks = stocks.nyse.ibm - -# Register an AMQP destination in JNDI -# NOTE: Qpid currently only supports direct,topics and headers -# destination.[jniName] = [BindingURL] -destination.direct = direct://amq.direct//directQueue -destination.directQueue = direct://amq.direct//message_queue?routingkey="routing_key" diff --git a/java/client/src/main/java/org/apache/qpid/jndi/NameParserImpl.java b/java/client/src/main/java/org/apache/qpid/jndi/NameParserImpl.java deleted file mode 100644 index a3174aec7a..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jndi/NameParserImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * - * 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.qpid.jndi; - -import javax.naming.CompositeName; -import javax.naming.Name; -import javax.naming.NameParser; -import javax.naming.NamingException; - -/** - * A default implementation of {@link NameParser} - * <p/> - * Based on class from ActiveMQ. - */ -public class NameParserImpl implements NameParser -{ - public Name parse(String name) throws NamingException - { - return new CompositeName(name); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java b/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java deleted file mode 100644 index fec5af55c1..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java +++ /dev/null @@ -1,369 +0,0 @@ -/* - * - * 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.qpid.jndi; - -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -import javax.jms.ConnectionFactory; -import javax.jms.Destination; -import javax.jms.Queue; -import javax.jms.Topic; -import javax.naming.Context; -import javax.naming.NamingException; -import javax.naming.spi.InitialContextFactory; - -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQHeadersExchange; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.url.AMQBindingURL; -import org.apache.qpid.url.BindingURL; -import org.apache.qpid.url.URLSyntaxException; -import org.apache.qpid.util.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PropertiesFileInitialContextFactory implements InitialContextFactory -{ - protected final Logger _logger = LoggerFactory.getLogger(PropertiesFileInitialContextFactory.class); - - private String CONNECTION_FACTORY_PREFIX = "connectionfactory."; - private String DESTINATION_PREFIX = "destination."; - private String QUEUE_PREFIX = "queue."; - private String TOPIC_PREFIX = "topic."; - - public Context getInitialContext(Hashtable environment) throws NamingException - { - Map data = new ConcurrentHashMap(); - - try - { - - String file = null; - if (environment.containsKey(Context.PROVIDER_URL)) - { - file = (String) environment.get(Context.PROVIDER_URL); - } - else - { - file = System.getProperty(Context.PROVIDER_URL); - } - - if (file != null) - { - _logger.info("Loading Properties from:" + file); - - // Load the properties specified - BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file)); - Properties p = new Properties(); - try - { - p.load(inputStream); - } - finally - { - inputStream.close(); - } - - Strings.Resolver resolver = new Strings.ChainedResolver - (Strings.SYSTEM_RESOLVER, new Strings.PropertiesResolver(p)); - - for (Map.Entry me : p.entrySet()) - { - String key = (String) me.getKey(); - String value = (String) me.getValue(); - String expanded = Strings.expand(value, resolver); - environment.put(key, expanded); - if (System.getProperty(key) == null) - { - System.setProperty(key, expanded); - } - } - _logger.info("Loaded Context Properties:" + environment.toString()); - } - else - { - _logger.info("No Provider URL specified."); - } - } - catch (IOException ioe) - { - _logger.warn("Unable to load property file specified in Provider_URL:" + environment.get(Context.PROVIDER_URL) +"\n" + - "Due to:"+ioe.getMessage()); - } - - createConnectionFactories(data, environment); - - createDestinations(data, environment); - - createQueues(data, environment); - - createTopics(data, environment); - - return createContext(data, environment); - } - - // Implementation methods - // ------------------------------------------------------------------------- - protected ReadOnlyContext createContext(Map data, Hashtable environment) - { - return new ReadOnlyContext(environment, data); - } - - protected void createConnectionFactories(Map data, Hashtable environment) - { - for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();) - { - Map.Entry entry = (Map.Entry) iter.next(); - String key = entry.getKey().toString(); - if (key.startsWith(CONNECTION_FACTORY_PREFIX)) - { - String jndiName = key.substring(CONNECTION_FACTORY_PREFIX.length()); - ConnectionFactory cf = createFactory(entry.getValue().toString().trim()); - if (cf != null) - { - data.put(jndiName, cf); - } - } - } - } - - protected void createDestinations(Map data, Hashtable environment) - { - for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();) - { - Map.Entry entry = (Map.Entry) iter.next(); - String key = entry.getKey().toString(); - if (key.startsWith(DESTINATION_PREFIX)) - { - String jndiName = key.substring(DESTINATION_PREFIX.length()); - Destination dest = createDestination(entry.getValue().toString().trim()); - if (dest != null) - { - data.put(jndiName, dest); - } - } - } - } - - protected void createQueues(Map data, Hashtable environment) - { - for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();) - { - Map.Entry entry = (Map.Entry) iter.next(); - String key = entry.getKey().toString(); - if (key.startsWith(QUEUE_PREFIX)) - { - String jndiName = key.substring(QUEUE_PREFIX.length()); - Queue q = createQueue(entry.getValue().toString().trim()); - if (q != null) - { - data.put(jndiName, q); - } - } - } - } - - protected void createTopics(Map data, Hashtable environment) - { - for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();) - { - Map.Entry entry = (Map.Entry) iter.next(); - String key = entry.getKey().toString(); - if (key.startsWith(TOPIC_PREFIX)) - { - String jndiName = key.substring(TOPIC_PREFIX.length()); - Topic t = createTopic(entry.getValue().toString().trim()); - if (t != null) - { - if (_logger.isDebugEnabled()) - { - StringBuffer b = new StringBuffer(); - b.append("Creating the topic: " + jndiName + " with the following binding keys "); - for (AMQShortString binding:((AMQTopic)t).getBindingKeys()) - { - b.append(binding.toString()).append(","); - } - - _logger.debug(b.toString()); - } - data.put(jndiName, t); - } - } - } - } - - /** - * Factory method to create new Connection Factory instances - */ - protected ConnectionFactory createFactory(String url) - { - try - { - return new AMQConnectionFactory(url); - } - catch (URLSyntaxException urlse) - { - _logger.warn("Unable to createFactories:" + urlse); - } - - return null; - } - - /** - * Factory method to create new Destination instances from an AMQP BindingURL - */ - protected Destination createDestination(String str) - { - try - { - return AMQDestination.createDestination(str); - } - catch (Exception e) - { - _logger.warn("Unable to create destination:" + e, e); - - return null; - } - } - - /** - * Factory method to create new Queue instances - */ - protected Queue createQueue(Object value) - { - if (value instanceof AMQShortString) - { - return new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, (AMQShortString) value); - } - else if (value instanceof String) - { - return new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString((String) value)); - } - else if (value instanceof BindingURL) - { - return new AMQQueue((BindingURL) value); - } - - return null; - } - - /** - * Factory method to create new Topic instances - */ - protected Topic createTopic(Object value) - { - if (value instanceof AMQShortString) - { - return new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, (AMQShortString) value); - } - else if (value instanceof String) - { - String[] keys = ((String)value).split(","); - AMQShortString[] bindings = new AMQShortString[keys.length]; - int i = 0; - for (String key:keys) - { - bindings[i] = new AMQShortString(key.trim()); - i++; - } - // The Destination has a dual nature. If this was used for a producer the key is used - // for the routing key. If it was used for the consumer it becomes the bindingKey - return new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME,bindings[0],null,bindings); - } - else if (value instanceof BindingURL) - { - return new AMQTopic((BindingURL) value); - } - - return null; - } - - /** - * Factory method to create new HeaderExcahnge instances - */ - protected Destination createHeaderExchange(Object value) - { - if (value instanceof String) - { - return new AMQHeadersExchange((String) value); - } - else if (value instanceof BindingURL) - { - return new AMQHeadersExchange((BindingURL) value); - } - - return null; - } - - // Properties - // ------------------------------------------------------------------------- - public String getConnectionPrefix() - { - return CONNECTION_FACTORY_PREFIX; - } - - public void setConnectionPrefix(String connectionPrefix) - { - this.CONNECTION_FACTORY_PREFIX = connectionPrefix; - } - - public String getDestinationPrefix() - { - return DESTINATION_PREFIX; - } - - public void setDestinationPrefix(String destinationPrefix) - { - this.DESTINATION_PREFIX = destinationPrefix; - } - - public String getQueuePrefix() - { - return QUEUE_PREFIX; - } - - public void setQueuePrefix(String queuePrefix) - { - this.QUEUE_PREFIX = queuePrefix; - } - - public String getTopicPrefix() - { - return TOPIC_PREFIX; - } - - public void setTopicPrefix(String topicPrefix) - { - this.TOPIC_PREFIX = topicPrefix; - } -} diff --git a/java/client/src/main/java/org/apache/qpid/jndi/ReadOnlyContext.java b/java/client/src/main/java/org/apache/qpid/jndi/ReadOnlyContext.java deleted file mode 100644 index 1719ea1219..0000000000 --- a/java/client/src/main/java/org/apache/qpid/jndi/ReadOnlyContext.java +++ /dev/null @@ -1,527 +0,0 @@ -/* - * - * 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.qpid.jndi; - -import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Map; - -import javax.naming.Binding; -import javax.naming.CompositeName; -import javax.naming.Context; -import javax.naming.LinkRef; -import javax.naming.Name; -import javax.naming.NameClassPair; -import javax.naming.NameNotFoundException; -import javax.naming.NameParser; -import javax.naming.NamingEnumeration; -import javax.naming.NamingException; -import javax.naming.NotContextException; -import javax.naming.OperationNotSupportedException; -import javax.naming.Reference; -import javax.naming.spi.NamingManager; - -/** - * Based on class from ActiveMQ. - * A read-only Context - * <p/> - * This version assumes it and all its subcontext are read-only and any attempt - * to modify (e.g. through bind) will result in an OperationNotSupportedException. - * Each Context in the tree builds a cache of the entries in all sub-contexts - * to optimise the performance of lookup. - * </p> - * <p>This implementation is intended to optimise the performance of lookup(String) - * to about the level of a HashMap get. It has been observed that the scheme - * resolution phase performed by the JVM takes considerably longer, so for - * optimum performance lookups should be coded like:</p> - * <code> - * Context componentContext = (Context)new InitialContext().lookup("java:comp"); - * String envEntry = (String) componentContext.lookup("env/myEntry"); - * String envEntry2 = (String) componentContext.lookup("env/myEntry2"); - * </code> - */ -public class ReadOnlyContext implements Context, Serializable -{ - private static final long serialVersionUID = -5754338187296859149L; - protected static final NameParser nameParser = new NameParserImpl(); - - protected final Hashtable environment; // environment for this context - protected final Map bindings; // bindings at my level - protected final Map treeBindings; // all bindings under me - - private boolean frozen = false; - private String nameInNamespace = ""; - public static final String SEPARATOR = "/"; - - public ReadOnlyContext() - { - environment = new Hashtable(); - bindings = new HashMap(); - treeBindings = new HashMap(); - } - - public ReadOnlyContext(Hashtable env) - { - if (env == null) - { - this.environment = new Hashtable(); - } - else - { - this.environment = new Hashtable(env); - } - - this.bindings = Collections.EMPTY_MAP; - this.treeBindings = Collections.EMPTY_MAP; - } - - public ReadOnlyContext(Hashtable environment, Map bindings) - { - if (environment == null) - { - this.environment = new Hashtable(); - } - else - { - this.environment = new Hashtable(environment); - } - - this.bindings = bindings; - treeBindings = new HashMap(); - frozen = true; - } - - public ReadOnlyContext(Hashtable environment, Map bindings, String nameInNamespace) - { - this(environment, bindings); - this.nameInNamespace = nameInNamespace; - } - - protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env) - { - this.bindings = clone.bindings; - this.treeBindings = clone.treeBindings; - this.environment = new Hashtable(env); - } - - protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env, String nameInNamespace) - { - this(clone, env); - this.nameInNamespace = nameInNamespace; - } - - public void freeze() - { - frozen = true; - } - - boolean isFrozen() - { - return frozen; - } - - /** - * internalBind is intended for use only during setup or possibly by suitably synchronized superclasses. - * It binds every possible lookup into a map in each context. To do this, each context - * strips off one name segment and if necessary creates a new context for it. Then it asks that context - * to bind the remaining name. It returns a map containing all the bindings from the next context, plus - * the context it just created (if it in fact created it). (the names are suitably extended by the segment - * originally lopped off). - * - * @param name - * @param value - * @return - * @throws javax.naming.NamingException - */ - protected Map internalBind(String name, Object value) throws NamingException - { - assert (name != null) && (name.length() > 0); - assert !frozen; - - Map newBindings = new HashMap(); - int pos = name.indexOf('/'); - if (pos == -1) - { - if (treeBindings.put(name, value) != null) - { - throw new NamingException("Something already bound at " + name); - } - - bindings.put(name, value); - newBindings.put(name, value); - } - else - { - String segment = name.substring(0, pos); - assert segment != null; - assert !segment.equals(""); - Object o = treeBindings.get(segment); - if (o == null) - { - o = newContext(); - treeBindings.put(segment, o); - bindings.put(segment, o); - newBindings.put(segment, o); - } - else if (!(o instanceof ReadOnlyContext)) - { - throw new NamingException("Something already bound where a subcontext should go"); - } - - ReadOnlyContext readOnlyContext = (ReadOnlyContext) o; - String remainder = name.substring(pos + 1); - Map subBindings = readOnlyContext.internalBind(remainder, value); - for (Iterator iterator = subBindings.entrySet().iterator(); iterator.hasNext();) - { - Map.Entry entry = (Map.Entry) iterator.next(); - String subName = segment + "/" + (String) entry.getKey(); - Object bound = entry.getValue(); - treeBindings.put(subName, bound); - newBindings.put(subName, bound); - } - } - - return newBindings; - } - - protected ReadOnlyContext newContext() - { - return new ReadOnlyContext(); - } - - public Object addToEnvironment(String propName, Object propVal) throws NamingException - { - return environment.put(propName, propVal); - } - - public Hashtable getEnvironment() throws NamingException - { - return (Hashtable) environment.clone(); - } - - public Object removeFromEnvironment(String propName) throws NamingException - { - return environment.remove(propName); - } - - public Object lookup(String name) throws NamingException - { - if (name.length() == 0) - { - return this; - } - - Object result = treeBindings.get(name); - if (result == null) - { - result = bindings.get(name); - } - - if (result == null) - { - int pos = name.indexOf(':'); - if (pos > 0) - { - String scheme = name.substring(0, pos); - Context ctx = NamingManager.getURLContext(scheme, environment); - if (ctx == null) - { - throw new NamingException("scheme " + scheme + " not recognized"); - } - - return ctx.lookup(name); - } - else - { - // Split out the first name of the path - // and look for it in the bindings map. - CompositeName path = new CompositeName(name); - - if (path.size() == 0) - { - return this; - } - else - { - String first = path.get(0); - Object obj = bindings.get(first); - if (obj == null) - { - throw new NameNotFoundException(name); - } - else if ((obj instanceof Context) && (path.size() > 1)) - { - Context subContext = (Context) obj; - obj = subContext.lookup(path.getSuffix(1)); - } - - return obj; - } - } - } - - if (result instanceof LinkRef) - { - LinkRef ref = (LinkRef) result; - result = lookup(ref.getLinkName()); - } - - if (result instanceof Reference) - { - try - { - result = NamingManager.getObjectInstance(result, null, null, this.environment); - } - catch (NamingException e) - { - throw e; - } - catch (Exception e) - { - throw (NamingException) new NamingException("could not look up : " + name).initCause(e); - } - } - - if (result instanceof ReadOnlyContext) - { - String prefix = getNameInNamespace(); - if (prefix.length() > 0) - { - prefix = prefix + SEPARATOR; - } - - result = new ReadOnlyContext((ReadOnlyContext) result, environment, prefix + name); - } - - return result; - } - - public Object lookup(Name name) throws NamingException - { - return lookup(name.toString()); - } - - public Object lookupLink(String name) throws NamingException - { - return lookup(name); - } - - public Name composeName(Name name, Name prefix) throws NamingException - { - Name result = (Name) prefix.clone(); - result.addAll(name); - - return result; - } - - public String composeName(String name, String prefix) throws NamingException - { - CompositeName result = new CompositeName(prefix); - result.addAll(new CompositeName(name)); - - return result.toString(); - } - - public NamingEnumeration list(String name) throws NamingException - { - Object o = lookup(name); - if (o == this) - { - return new ListEnumeration(); - } - else if (o instanceof Context) - { - return ((Context) o).list(""); - } - else - { - throw new NotContextException(); - } - } - - public NamingEnumeration listBindings(String name) throws NamingException - { - Object o = lookup(name); - if (o == this) - { - return new ListBindingEnumeration(); - } - else if (o instanceof Context) - { - return ((Context) o).listBindings(""); - } - else - { - throw new NotContextException(); - } - } - - public Object lookupLink(Name name) throws NamingException - { - return lookupLink(name.toString()); - } - - public NamingEnumeration list(Name name) throws NamingException - { - return list(name.toString()); - } - - public NamingEnumeration listBindings(Name name) throws NamingException - { - return listBindings(name.toString()); - } - - public void bind(Name name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void bind(String name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void close() throws NamingException - { - // ignore - } - - public Context createSubcontext(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public Context createSubcontext(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void destroySubcontext(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void destroySubcontext(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public String getNameInNamespace() throws NamingException - { - return nameInNamespace; - } - - public NameParser getNameParser(Name name) throws NamingException - { - return nameParser; - } - - public NameParser getNameParser(String name) throws NamingException - { - return nameParser; - } - - public void rebind(Name name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rebind(String name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rename(Name oldName, Name newName) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rename(String oldName, String newName) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void unbind(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void unbind(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - private abstract class LocalNamingEnumeration implements NamingEnumeration - { - private Iterator i = bindings.entrySet().iterator(); - - public boolean hasMore() throws NamingException - { - return i.hasNext(); - } - - public boolean hasMoreElements() - { - return i.hasNext(); - } - - protected Map.Entry getNext() - { - return (Map.Entry) i.next(); - } - - public void close() throws NamingException - { } - } - - private class ListEnumeration extends LocalNamingEnumeration - { - public Object next() throws NamingException - { - return nextElement(); - } - - public Object nextElement() - { - Map.Entry entry = getNext(); - - return new NameClassPair((String) entry.getKey(), entry.getValue().getClass().getName()); - } - } - - private class ListBindingEnumeration extends LocalNamingEnumeration - { - public Object next() throws NamingException - { - return nextElement(); - } - - public Object nextElement() - { - Map.Entry entry = getNext(); - - return new Binding((String) entry.getKey(), entry.getValue()); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/naming/ReadOnlyContext.java b/java/client/src/main/java/org/apache/qpid/naming/ReadOnlyContext.java deleted file mode 100644 index 59ec4cfba7..0000000000 --- a/java/client/src/main/java/org/apache/qpid/naming/ReadOnlyContext.java +++ /dev/null @@ -1,509 +0,0 @@ -/* 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.qpid.naming; - -import org.apache.qpid.jndi.NameParserImpl; - -import javax.naming.*; -import javax.naming.spi.NamingManager; -import java.io.Serializable; -import java.util.*; - -/** - * Based on class from ActiveMQ. - * A read-only Context - * <p/> - * This version assumes it and all its subcontext are read-only and any attempt - * to modify (e.g. through bind) will result in an OperationNotSupportedException. - * Each Context in the tree builds a cache of the entries in all sub-contexts - * to optimise the performance of lookup. - * </p> - * <p>This implementation is intended to optimise the performance of lookup(String) - * to about the level of a HashMap get. It has been observed that the scheme - * resolution phase performed by the JVM takes considerably longer, so for - * optimum performance lookups should be coded like:</p> - * <code> - * Context componentContext = (Context)new InitialContext().lookup("java:comp"); - * String envEntry = (String) componentContext.lookup("env/myEntry"); - * String envEntry2 = (String) componentContext.lookup("env/myEntry2"); - * </code> - */ -public class ReadOnlyContext implements Context, Serializable -{ - private static final long serialVersionUID = -5754338187296859149L; - protected static final NameParser nameParser = new NameParserImpl(); - - protected final Hashtable environment; // environment for this context - protected final Map bindings; // bindings at my level - protected final Map treeBindings; // all bindings under me - - private boolean frozen = false; - private String nameInNamespace = ""; - public static final String SEPARATOR = "/"; - - public ReadOnlyContext() - { - environment = new Hashtable(); - bindings = new HashMap(); - treeBindings = new HashMap(); - } - - public ReadOnlyContext(Hashtable env) - { - if (env == null) - { - this.environment = new Hashtable(); - } - else - { - this.environment = new Hashtable(env); - } - - this.bindings = Collections.EMPTY_MAP; - this.treeBindings = Collections.EMPTY_MAP; - } - - public ReadOnlyContext(Hashtable environment, Map bindings) - { - if (environment == null) - { - this.environment = new Hashtable(); - } - else - { - this.environment = new Hashtable(environment); - } - - this.bindings = bindings; - treeBindings = new HashMap(); - frozen = true; - } - - public ReadOnlyContext(Hashtable environment, Map bindings, String nameInNamespace) - { - this(environment, bindings); - this.nameInNamespace = nameInNamespace; - } - - protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env) - { - this.bindings = clone.bindings; - this.treeBindings = clone.treeBindings; - this.environment = new Hashtable(env); - } - - protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env, String nameInNamespace) - { - this(clone, env); - this.nameInNamespace = nameInNamespace; - } - - public void freeze() - { - frozen = true; - } - - boolean isFrozen() - { - return frozen; - } - - /** - * internalBind is intended for use only during setup or possibly by suitably synchronized superclasses. - * It binds every possible lookup into a map in each context. To do this, each context - * strips off one name segment and if necessary creates a new context for it. Then it asks that context - * to bind the remaining name. It returns a map containing all the bindings from the next context, plus - * the context it just created (if it in fact created it). (the names are suitably extended by the segment - * originally lopped off). - * - * @param name - * @param value - * @return - * @throws javax.naming.NamingException - */ - protected Map internalBind(String name, Object value) throws NamingException - { - assert (name != null) && (name.length() > 0); - assert !frozen; - - Map newBindings = new HashMap(); - int pos = name.indexOf('/'); - if (pos == -1) - { - if (treeBindings.put(name, value) != null) - { - throw new NamingException("Something already bound at " + name); - } - - bindings.put(name, value); - newBindings.put(name, value); - } - else - { - String segment = name.substring(0, pos); - assert segment != null; - assert !segment.equals(""); - Object o = treeBindings.get(segment); - if (o == null) - { - o = newContext(); - treeBindings.put(segment, o); - bindings.put(segment, o); - newBindings.put(segment, o); - } - else if (!(o instanceof ReadOnlyContext)) - { - throw new NamingException("Something already bound where a subcontext should go"); - } - - ReadOnlyContext readOnlyContext = (ReadOnlyContext) o; - String remainder = name.substring(pos + 1); - Map subBindings = readOnlyContext.internalBind(remainder, value); - for (Iterator iterator = subBindings.entrySet().iterator(); iterator.hasNext();) - { - Map.Entry entry = (Map.Entry) iterator.next(); - String subName = segment + "/" + (String) entry.getKey(); - Object bound = entry.getValue(); - treeBindings.put(subName, bound); - newBindings.put(subName, bound); - } - } - - return newBindings; - } - - protected ReadOnlyContext newContext() - { - return new ReadOnlyContext(); - } - - public Object addToEnvironment(String propName, Object propVal) throws NamingException - { - return environment.put(propName, propVal); - } - - public Hashtable getEnvironment() throws NamingException - { - return (Hashtable) environment.clone(); - } - - public Object removeFromEnvironment(String propName) throws NamingException - { - return environment.remove(propName); - } - - public Object lookup(String name) throws NamingException - { - if (name.length() == 0) - { - return this; - } - - Object result = treeBindings.get(name); - if (result == null) - { - result = bindings.get(name); - } - - if (result == null) - { - int pos = name.indexOf(':'); - if (pos > 0) - { - String scheme = name.substring(0, pos); - Context ctx = NamingManager.getURLContext(scheme, environment); - if (ctx == null) - { - throw new NamingException("scheme " + scheme + " not recognized"); - } - - return ctx.lookup(name); - } - else - { - // Split out the first name of the path - // and look for it in the bindings map. - CompositeName path = new CompositeName(name); - - if (path.size() == 0) - { - return this; - } - else - { - String first = path.get(0); - Object obj = bindings.get(first); - if (obj == null) - { - throw new NameNotFoundException(name); - } - else if ((obj instanceof Context) && (path.size() > 1)) - { - Context subContext = (Context) obj; - obj = subContext.lookup(path.getSuffix(1)); - } - - return obj; - } - } - } - - if (result instanceof LinkRef) - { - LinkRef ref = (LinkRef) result; - result = lookup(ref.getLinkName()); - } - - if (result instanceof Reference) - { - try - { - result = NamingManager.getObjectInstance(result, null, null, this.environment); - } - catch (NamingException e) - { - throw e; - } - catch (Exception e) - { - throw (NamingException) new NamingException("could not look up : " + name).initCause(e); - } - } - - if (result instanceof ReadOnlyContext) - { - String prefix = getNameInNamespace(); - if (prefix.length() > 0) - { - prefix = prefix + SEPARATOR; - } - - result = new ReadOnlyContext((ReadOnlyContext) result, environment, prefix + name); - } - - return result; - } - - public Object lookup(Name name) throws NamingException - { - return lookup(name.toString()); - } - - public Object lookupLink(String name) throws NamingException - { - return lookup(name); - } - - public Name composeName(Name name, Name prefix) throws NamingException - { - Name result = (Name) prefix.clone(); - result.addAll(name); - - return result; - } - - public String composeName(String name, String prefix) throws NamingException - { - CompositeName result = new CompositeName(prefix); - result.addAll(new CompositeName(name)); - - return result.toString(); - } - - public NamingEnumeration list(String name) throws NamingException - { - Object o = lookup(name); - if (o == this) - { - return new ReadOnlyContext.ListEnumeration(); - } - else if (o instanceof Context) - { - return ((Context) o).list(""); - } - else - { - throw new NotContextException(); - } - } - - public NamingEnumeration listBindings(String name) throws NamingException - { - Object o = lookup(name); - if (o == this) - { - return new ReadOnlyContext.ListBindingEnumeration(); - } - else if (o instanceof Context) - { - return ((Context) o).listBindings(""); - } - else - { - throw new NotContextException(); - } - } - - public Object lookupLink(Name name) throws NamingException - { - return lookupLink(name.toString()); - } - - public NamingEnumeration list(Name name) throws NamingException - { - return list(name.toString()); - } - - public NamingEnumeration listBindings(Name name) throws NamingException - { - return listBindings(name.toString()); - } - - public void bind(Name name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void bind(String name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void close() throws NamingException - { - // ignore - } - - public Context createSubcontext(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public Context createSubcontext(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void destroySubcontext(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void destroySubcontext(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public String getNameInNamespace() throws NamingException - { - return nameInNamespace; - } - - public NameParser getNameParser(Name name) throws NamingException - { - return nameParser; - } - - public NameParser getNameParser(String name) throws NamingException - { - return nameParser; - } - - public void rebind(Name name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rebind(String name, Object obj) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rename(Name oldName, Name newName) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void rename(String oldName, String newName) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void unbind(Name name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - public void unbind(String name) throws NamingException - { - throw new OperationNotSupportedException(); - } - - private abstract class LocalNamingEnumeration implements NamingEnumeration - { - private Iterator i = bindings.entrySet().iterator(); - - public boolean hasMore() throws NamingException - { - return i.hasNext(); - } - - public boolean hasMoreElements() - { - return i.hasNext(); - } - - protected Map.Entry getNext() - { - return (Map.Entry) i.next(); - } - - public void close() throws NamingException - { } - } - - private class ListEnumeration extends ReadOnlyContext.LocalNamingEnumeration - { - public Object next() throws NamingException - { - return nextElement(); - } - - public Object nextElement() - { - Map.Entry entry = getNext(); - - return new NameClassPair((String) entry.getKey(), entry.getValue().getClass().getName()); - } - } - - private class ListBindingEnumeration extends ReadOnlyContext.LocalNamingEnumeration - { - public Object next() throws NamingException - { - return nextElement(); - } - - public Object nextElement() - { - Map.Entry entry = getNext(); - - return new Binding((String) entry.getKey(), entry.getValue()); - } - } -} diff --git a/java/client/src/main/java/org/apache/qpid/naming/jndi.properties b/java/client/src/main/java/org/apache/qpid/naming/jndi.properties deleted file mode 100644 index 830de5f619..0000000000 --- a/java/client/src/main/java/org/apache/qpid/naming/jndi.properties +++ /dev/null @@ -1,40 +0,0 @@ -# -# 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. -# -java.naming.factory.initial = org.apache.qpid.naming.PropertiesFileInitialConextFactory - -# use the following property to configure the default connector -#java.naming.provider.url - ignored. - -# register some connection factories -# connectionfactory.[jndiname] = [ConnectionURL] -# qpid:username=foo;password=password;client_id=id;virtualhost=path@tpc:localhost:1556 -connectionfactory.local = qpid:tcp:localhost' - -# register some queues in JNDI using the form -# queue.[jndiName] = [physicalName] -queue.MyQueue = example.MyQueue - -# register some topics in JNDI using the form -# topic.[jndiName] = [physicalName] -topic.ibmStocks = stocks.nyse.ibm - -# Register an AMQP destination in JNDI -# NOTE: Qpid currently only supports direct,topics and headers -# destination.[jniName] = [BindingURL] -destination.direct = direct://amq.direct//directQueue diff --git a/java/client/src/main/java/org/apache/qpid/nclient/MessagePartListener.java b/java/client/src/main/java/org/apache/qpid/nclient/MessagePartListener.java deleted file mode 100644 index 6f07dcb469..0000000000 --- a/java/client/src/main/java/org/apache/qpid/nclient/MessagePartListener.java +++ /dev/null @@ -1,46 +0,0 @@ -/* 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.qpid.nclient; - -import java.nio.ByteBuffer; - -import org.apache.qpid.transport.Header; -import org.apache.qpid.transport.MessageTransfer; - -/** - * Assembles message parts. - * <p> The sequence of event for transferring a message is as follows: - * <ul> - * <li> messageHeaders - * <li> n calls to addData - * <li> messageReceived - * </ul> - * It is up to the implementation to assemble the message once the different parts - * are transferred. - */ -public interface MessagePartListener -{ - - /** - * Inform the listener of the message transfer - * - * @param xfr the message transfer object - */ - public void messageTransfer(MessageTransfer xfr); - -} diff --git a/java/client/src/main/java/org/apache/qpid/nclient/util/ByteBufferMessage.java b/java/client/src/main/java/org/apache/qpid/nclient/util/ByteBufferMessage.java deleted file mode 100644 index 14bfb4f95e..0000000000 --- a/java/client/src/main/java/org/apache/qpid/nclient/util/ByteBufferMessage.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.apache.qpid.nclient.util; -/* - * - * 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. - * - */ - - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.*; - -import org.apache.qpid.transport.DeliveryProperties; -import org.apache.qpid.transport.MessageProperties; -import org.apache.qpid.transport.Header; -import org.apache.qpid.api.Message; - -/** - * <p>A Simple implementation of the message interface - * for small messages. When the readData methods are called - * we assume the message is complete. i.e there want be any - * appendData operations after that.</p> - * - * <p>If you need large message support please see - * <code>FileMessage</code> and <code>StreamingMessage</code> - * </p> - */ -public class ByteBufferMessage implements Message -{ - private List<ByteBuffer> _data;// = new ArrayList<ByteBuffer>(); - private ByteBuffer _readBuffer; - private int _dataSize; - private DeliveryProperties _currentDeliveryProps; - private MessageProperties _currentMessageProps; - private int _transferId; - private Header _header; - - public ByteBufferMessage(MessageProperties messageProperties, DeliveryProperties deliveryProperties) - { - _currentMessageProps = messageProperties; - _currentDeliveryProps = deliveryProperties; - } - - public void setHeader(Header header) { - _header = header; - } - - public Header getHeader() { - return _header; - } - - public ByteBufferMessage() - { - _currentDeliveryProps = new DeliveryProperties(); - _currentMessageProps = new MessageProperties(); - } - - public ByteBufferMessage(int transferId) - { - _transferId = transferId; - } - - public int getMessageTransferId() - { - return _transferId; - } - - public void clearData() - { - _data = new LinkedList<ByteBuffer>(); - _readBuffer = null; - } - - public void appendData(byte[] src) throws IOException - { - appendData(ByteBuffer.wrap(src)); - } - - /** - * write the data from the current position up to the buffer limit - */ - public void appendData(ByteBuffer src) throws IOException - { - if(_data == null) - { - _data = Collections.singletonList(src); - } - else - { - if(_data.size() == 1) - { - _data = new ArrayList<ByteBuffer>(_data); - } - _data.add(src); - } - _dataSize += src.remaining(); - } - - public DeliveryProperties getDeliveryProperties() - { - return _currentDeliveryProps; - } - - public MessageProperties getMessageProperties() - { - return _currentMessageProps; - } - - public void setDeliveryProperties(DeliveryProperties props) - { - _currentDeliveryProps = props; - } - - public void setMessageProperties(MessageProperties props) - { - _currentMessageProps = props; - } - - public void readData(byte[] target) - { - getReadBuffer().get(target); - } - - public ByteBuffer readData() - { - return getReadBuffer(); - } - - private void buildReadBuffer() - { - //optimize for the simple cases - if(_data.size() == 1) - { - _readBuffer = _data.get(0).duplicate(); - } - else - { - _readBuffer = ByteBuffer.allocate(_dataSize); - for(ByteBuffer buf:_data) - { - _readBuffer.put(buf); - } - _readBuffer.flip(); - } - } - - private ByteBuffer getReadBuffer() - { - if (_readBuffer != null ) - { - return _readBuffer.slice(); - } - else - { - if (_data.size() >0) - { - buildReadBuffer(); - return _readBuffer.slice(); - } - else - { - return ByteBuffer.allocate(0); - } - } - } - - //hack for testing - @Override public String toString() - { - ByteBuffer temp = getReadBuffer(); - byte[] b = new byte[temp.remaining()]; - temp.get(b); - return new String(b); - } -} diff --git a/java/client/src/main/java/org/apache/qpid/nclient/util/MessageListener.java b/java/client/src/main/java/org/apache/qpid/nclient/util/MessageListener.java deleted file mode 100644 index c5edd62143..0000000000 --- a/java/client/src/main/java/org/apache/qpid/nclient/util/MessageListener.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.qpid.nclient.util; - -import org.apache.qpid.api.Message; - -/** - *A message listener - */ -public interface MessageListener -{ - /** - * Process an incoming message. - * - * @param message The incoming message. - */ - public void onMessage(Message message); -} diff --git a/java/client/src/main/java/org/apache/qpid/nclient/util/MessagePartListenerAdapter.java b/java/client/src/main/java/org/apache/qpid/nclient/util/MessagePartListenerAdapter.java deleted file mode 100644 index 10fd8d2a80..0000000000 --- a/java/client/src/main/java/org/apache/qpid/nclient/util/MessagePartListenerAdapter.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.apache.qpid.nclient.util; -/* - * - * 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. - * - */ - - -import java.io.IOException; -import java.nio.ByteBuffer; - -import org.apache.qpid.transport.*; -import org.apache.qpid.nclient.MessagePartListener; - -/** - * This is a simple message assembler. - * Will call onMessage method of the adaptee - * when all message data is read. - * - * This is a good convinience utility for handling - * small messages - */ -public class MessagePartListenerAdapter implements MessagePartListener -{ - MessageListener _adaptee; - ByteBufferMessage _currentMsg; - - public MessagePartListenerAdapter(MessageListener listener) - { - _adaptee = listener; - } - - public void messageTransfer(MessageTransfer xfr) - { - _currentMsg = new ByteBufferMessage(xfr.getId()); - - for (Struct st : xfr.getHeader().getStructs()) - { - if(st instanceof DeliveryProperties) - { - _currentMsg.setDeliveryProperties((DeliveryProperties)st); - - } - else if(st instanceof MessageProperties) - { - _currentMsg.setMessageProperties((MessageProperties)st); - } - - } - - - ByteBuffer body = xfr.getBody(); - if (body == null) - { - body = ByteBuffer.allocate(0); - } - - - try - { - _currentMsg.appendData(body); - } - catch(IOException e) - { - // A chance for IO exception - // doesn't occur as we are using - // a ByteBuffer - } - - _adaptee.onMessage(_currentMsg); - } - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindConnectionFactory.java b/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindConnectionFactory.java deleted file mode 100644 index 2c08f1e34a..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindConnectionFactory.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * 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.qpid.IBMPerfTest; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.url.URLSyntaxException; - -import javax.jms.ConnectionFactory; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.io.File; -import java.util.Hashtable; - -public class JNDIBindConnectionFactory -{ - - public static final String CONNECTION_FACTORY_BINDING = "amq.ConnectionFactory"; - public static final String DEFAULT_PROVIDER_FILE_PATH = System.getProperty("java.io.tmpdir") + File.separator + "IBMPerfTestsJNDI"; - public static final String PROVIDER_URL = "file://" + DEFAULT_PROVIDER_FILE_PATH; - public static final String FSCONTEXT_FACTORY = "com.sun.jndi.fscontext.RefFSContextFactory"; - public static final String DEFAULT_CONNECTION_URL = "amqp://guest:guest@clientid/testpath?brokerlist='tcp://localhost:5672'"; - - private static void printUsage() - { - System.out.println("Using default values: Usage:java JNDIBindConnectionFactory <connection url> [<Connection Factory Binding>] [<Provider URL>] [<JNDI Context Factory>]"); - - } - - public static void main(String[] args) - { - Logger.getRootLogger().setLevel(Level.OFF); - - String connectionFactoryBinding = CONNECTION_FACTORY_BINDING; - String provider = PROVIDER_URL; - String contextFactory = FSCONTEXT_FACTORY; - if (args.length == 0) - { - printUsage(); - System.exit(1); - } - - String connectionURL = args[0]; - - System.out.println("Using Connection:" + connectionURL + "\n"); - - - if (args.length > 1) - { - connectionFactoryBinding = args[1]; - - if (args.length > 2) - { - provider = args[2]; - - if (args.length > 3) - { - contextFactory = args[3]; - } - } - else - { - System.out.println("Using default File System Context Factory"); - System.out.println("Using default Connection Factory Binding:" + connectionFactoryBinding); - } - } - else - { - printUsage(); - } - - - System.out.println("File System Context Factory\n" + - "Connection:" + connectionURL + "\n" + - "Connection Factory Binding:" + connectionFactoryBinding + "\n" + - "JNDI Provider URL:" + provider); - - if (provider.startsWith("file")) - { - File file = new File(provider.substring(provider.indexOf("://") + 3)); - - if (file.exists() && !file.isDirectory()) - { - System.out.println("Couldn't make directory file already exists"); - System.exit(1); - } - else - { - if (!file.exists()) - { - if (!file.mkdirs()) - { - System.out.println("Couldn't make directory"); - System.exit(1); - } - } - } - } - - new JNDIBindConnectionFactory(provider, connectionFactoryBinding, contextFactory, connectionURL); - - } - - public JNDIBindConnectionFactory(String provider, String binding, String contextFactory, String CONNECTION_URL) - { - // Set up the environment for creating the initial context - Hashtable env = new Hashtable(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory); - - env.put(Context.PROVIDER_URL, provider); - - try - { - // Create the initial context - Context ctx = new InitialContext(env); - - // Create the object to be bound - ConnectionFactory factory = null; - - try - { - factory = new AMQConnectionFactory(CONNECTION_URL); - - - try - { - Object obj = ctx.lookup(binding); - - if (obj != null) - { - System.out.println("Un-binding previous Connection Factory"); - ctx.unbind(binding); - } - } - catch (NamingException e) - { - System.out.println("Operation failed: " + e); - } - - // Perform the bind - ctx.bind(binding, factory); - System.out.println("Bound Connection Factory:" + binding); - - // Check that it is bound - Object obj = ctx.lookup(binding); - System.out.println("Connection URL:" + ((AMQConnectionFactory) obj).getConnectionURL()); - - System.out.println("JNDI FS Context:" + provider); - } - catch (NamingException amqe) - { - System.out.println("Operation failed: " + amqe); - } - catch (URLSyntaxException e) - { - System.out.println("Operation failed: " + e); - } - - } - catch (NamingException e) - { - System.out.println("Operation failed: " + e); - } - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindQueue.java b/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindQueue.java deleted file mode 100644 index 10e8b94311..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindQueue.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * - * 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.qpid.IBMPerfTest; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQSession; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Queue; -import javax.jms.Session; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.io.File; -import java.util.Hashtable; - -public class JNDIBindQueue -{ - public static final String DEFAULT_PROVIDER_FILE_PATH = System.getProperty("java.io.tmpdir") + File.separator + "IBMPerfTestsJNDI"; - public static final String PROVIDER_URL = "file://" + DEFAULT_PROVIDER_FILE_PATH; - public static final String FSCONTEXT_FACTORY = "com.sun.jndi.fscontext.RefFSContextFactory"; - - Connection _connection = null; - Context _ctx = null; - - - public JNDIBindQueue(String queueBinding, String queueName, String provider, String contextFactory) - { - // Set up the environment for creating the initial context - Hashtable env = new Hashtable(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory); - - env.put(Context.PROVIDER_URL, provider); - - try - { - // Create the initial context - _ctx = new InitialContext(env); - - // Create the object to be bound - - try - { - _connection = new AMQConnection("amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'"); - System.out.println("Connected"); - } - catch (Exception amqe) - { - System.out.println("Unable to create AMQConnectionFactory:" + amqe); - } - - if (_connection != null) - { - bindQueue(queueName, queueBinding); - } - - // Check that it is bound - Object obj = _ctx.lookup(queueBinding); - - System.out.println("Bound Queue:" + ((AMQQueue) obj).toURL()); - - System.out.println("JNDI FS Context:" + provider); - - } - catch (NamingException e) - { - System.out.println("Operation failed: " + e); - } - finally - { - try - { - if (_connection != null) - { - _connection.close(); - } - } - catch (JMSException closeE) - { - System.out.println("Connection closing failed: " + closeE); - } - } - - - } - - - private void bindQueue(String queueName, String queueBinding) throws NamingException - { - - try - { - Object obj = _ctx.lookup(queueBinding); - - if (obj != null) - { - System.out.println("Un-binding exisiting object"); - _ctx.unbind(queueBinding); - } - } - catch (NamingException e) - { - - } - - Queue queue = null; - try - { - - Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - if (session != null) - { - queue = ((AMQSession) session).createQueue(queueName); - } - } - catch (JMSException jmse) - { - System.out.println("Unable to create Queue:" + jmse); - } - - // Perform the bind - _ctx.bind(queueBinding, queue); - } - - - public static void main(String[] args) - { - Logger.getRootLogger().setLevel(Level.OFF); - - String provider = JNDIBindQueue.PROVIDER_URL; - String contextFactory = JNDIBindQueue.FSCONTEXT_FACTORY; - - if (args.length > 1) - { - String binding = args[0]; - String queueName = args[1]; - - if (args.length > 2) - { - provider = args[2]; - - if (args.length > 3) - { - contextFactory = args[3]; - } - } - else - { - System.out.println("Using default File System Context Factory"); - } - - System.out.println("File System Context Factory\n" + - "Binding Queue:'" + queueName + "' to '" + binding + "'\n" + - "JNDI Provider URL:" + provider); - - if (provider.startsWith("file")) - { - File file = new File(provider.substring(provider.indexOf("://") + 3)); - - if (file.exists() && !file.isDirectory()) - { - System.out.println("Couldn't make directory file already exists"); - System.exit(1); - } - else - { - if (!file.exists()) - { - if (!file.mkdirs()) - { - System.out.println("Couldn't make directory"); - System.exit(1); - } - } - } - } - - - new JNDIBindQueue(binding, queueName, provider, contextFactory); - - } - else - { - System.out.println("Using Defaults: Usage:java JNDIBindQueue <Binding> <queue name> [<Provider URL> [<JNDI Context Factory>]]"); - } - - } - - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindTopic.java b/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindTopic.java deleted file mode 100644 index ca071c1187..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/JNDIBindTopic.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * - * 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.qpid.IBMPerfTest; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.AMQTopic; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Session; -import javax.jms.Topic; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.io.File; -import java.util.Hashtable; - -public class JNDIBindTopic -{ - public static final String DEFAULT_PROVIDER_FILE_PATH = System.getProperty("java.io.tmpdir") + File.separator + "IBMPerfTestsJNDI"; - public static final String PROVIDER_URL = "file://" + DEFAULT_PROVIDER_FILE_PATH; - - public static final String FSCONTEXT_FACTORY = "com.sun.jndi.fscontext.RefFSContextFactory"; - - Connection _connection = null; - Context _ctx = null; - - - public JNDIBindTopic(String topicBinding, String topicName, String provider, String contextFactory) - { - // Set up the environment for creating the initial context - Hashtable env = new Hashtable(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory); - - env.put(Context.PROVIDER_URL, provider); - - try - { - // Create the initial context - _ctx = new InitialContext(env); - - // Create the object to be bound - - try - { - _connection = new AMQConnection("amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'"); - System.out.println("Connected"); - } - catch (Exception amqe) - { - System.out.println("Unable to create AMQConnectionFactory:" + amqe); - } - - if (_connection != null) - { - bindTopic(topicName, topicBinding); - } - - // Check that it is bound - Object obj = _ctx.lookup(topicBinding); - - System.out.println("Bound Queue:" + ((AMQTopic) obj).toURL()); - - System.out.println("JNDI FS Context:" + provider); - - } - catch (NamingException e) - { - System.out.println("Operation failed: " + e); - } - finally - { - try - { - if (_connection != null) - { - _connection.close(); - } - } - catch (JMSException closeE) - { - System.out.println("Operation failed: " + closeE); - } - } - } - - - private void bindTopic(String topicName, String topicBinding) throws NamingException - { - - try - { - Object obj = _ctx.lookup(topicBinding); - - if (obj != null) - { - System.out.println("Un-binding exisiting object"); - _ctx.unbind(topicBinding); - } - } - catch (NamingException e) - { - - } - - Topic topic = null; - try - { - - Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - if (session != null) - { - topic = ((AMQSession) session).createTopic(topicName); - } - } - catch (JMSException jmse) - { - System.out.println("Unable to create Topic:" + jmse); - } - - // Perform the bind - _ctx.bind(topicBinding, topic); - } - - - public static void main(String[] args) - { - Logger.getRootLogger().setLevel(Level.OFF); - - String provider = JNDIBindTopic.PROVIDER_URL; - String contextFactory = JNDIBindTopic.FSCONTEXT_FACTORY; - - if (args.length > 1) - { - String binding = args[0]; - String queueName = args[1]; - - if (args.length > 2) - { - provider = args[2]; - - if (args.length > 3) - { - contextFactory = args[3]; - } - } - else - { - System.out.println("Using default File System Context Factory"); - } - - System.out.println("File System Context Factory\n" + - "Binding Topic:'" + queueName + "' to '" + binding + "'\n" + - "JNDI Provider URL:" + provider); - - - if (provider.startsWith("file")) - { - File file = new File(provider.substring(provider.indexOf("://") + 3)); - - if (file.exists() && !file.isDirectory()) - { - System.out.println("Couldn't make directory file already exists"); - System.exit(1); - } - else - { - if (!file.exists()) - { - if (!file.mkdirs()) - { - System.out.println("Couldn't make directory"); - System.exit(1); - } - } - } - } - - new JNDIBindTopic(binding, queueName, provider, contextFactory); - - } - else - { - System.out.println("Usage:java JNDIBindTopic <Binding> <topic name> [<Provider URL> [<JNDI Context Factory>]]"); - } - - } - - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/README.txt b/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/README.txt deleted file mode 100644 index 95ee9f9c77..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/IBMPerfTest/README.txt +++ /dev/null @@ -1,11 +0,0 @@ -These JNDI setup tools are mainly for use in conjunction with the IBM JMS Performance Harness available here: -The jar should be placed in the client/test/lib/ directory. - -http://www.alphaworks.ibm.com/tech/perfharness - - -These JNDI classes use the the SUN FileSystem context. -There are two jar files that should be placed in your client/test/lib directory. - -http://javashoplm.sun.com/ECom/docs/Welcome.jsp?StoreId=22&PartDetailId=7110-jndi-1.2.1-oth-JPR&SiteId=JSC&TransactionId=noreg - diff --git a/java/client/src/old_test/java/org/apache/qpid/cluster/Client.java b/java/client/src/old_test/java/org/apache/qpid/cluster/Client.java deleted file mode 100644 index cf8059a143..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/cluster/Client.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * - * 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.qpid.cluster; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.url.URLSyntaxException; - -import javax.jms.MessageListener; -import javax.jms.Message; -import javax.jms.Session; -import javax.jms.JMSException; -import javax.jms.MessageProducer; -import javax.jms.TextMessage; -import java.util.Random; - -public class Client -{ - private final Random random = new Random(); - private final String name; - private final Session session; - private final MessageProducer topicProducer; - private final MessageProducer queueProducer; - - Client(AMQConnection connection, String name) throws JMSException, InterruptedException - { - this.name = name; - session = connection.createSession(false, AMQSession.NO_ACKNOWLEDGE); - - AMQTopic topic = new AMQTopic(((AMQSession)session).getDefaultTopicExchangeName(), new AMQShortString("cluster_test_topic")); - AMQQueue queue = new AMQQueue(((AMQSession)session).getDefaultQueueExchangeName(), new AMQShortString("cluster_test_queue")); - - topicProducer = session.createProducer(topic); - queueProducer = session.createProducer(queue); - - //subscribe to a known topic - session.createConsumer(topic).setMessageListener(new TopicHandler()); - //subscribe to a known queue - session.createConsumer(queue).setMessageListener(new QueueHandler()); - - connection.start(); - - while(true) - { - Thread.sleep(random.nextInt(60000)); - sendToQueue(name + ":" + randomString(5)); - } - } - - private synchronized void sendToTopic(String message) throws JMSException - { - topicProducer.send(session.createTextMessage(message)); - } - - private synchronized void sendToQueue(String message) throws JMSException - { - queueProducer.send(session.createTextMessage(message)); - } - - private String randomString(int length){ - char[] c = new char[length]; - for(int i = 0; i < length; i++) - { - c[i] = (char) ('A' + random.nextInt(26)); - } - return new String(c); - } - - private class QueueHandler implements MessageListener - { - public void onMessage(Message message) - { - try - { - sendToTopic(((TextMessage) message).getText()); - } - catch (JMSException e) - { - e.printStackTrace(); - } - } - } - - private class TopicHandler implements MessageListener - { - public void onMessage(Message message) - { - try - { - System.out.println(((TextMessage) message).getText()); - } - catch (JMSException e) - { - e.printStackTrace(); - } - } - } - - public static void main(String[] argv) throws AMQException, JMSException, InterruptedException, URLSyntaxException - { - //assume args describe the set of brokers to try - - String clientName = argv.length > 1 ? argv[1] : "testClient"; - new Client(new AMQConnection(argv.length > 0 ? argv[0] : "vm://:1", "guest", "guest", clientName, "/test"), clientName); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/codec/BasicDeliverTest.java b/java/client/src/old_test/java/org/apache/qpid/codec/BasicDeliverTest.java deleted file mode 100644 index 1db7e200bd..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/codec/BasicDeliverTest.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * - * 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.qpid.codec; - -import org.apache.qpid.framing.*; -import org.apache.mina.common.*; -import org.apache.mina.common.support.BaseIoSession; -import org.apache.mina.filter.codec.ProtocolDecoderOutput; -import org.apache.mina.filter.codec.ProtocolEncoderOutput; - -import java.net.SocketAddress; - -/** - */ -public class BasicDeliverTest -{ - public static void main(String[] argv) throws Exception - { - BasicDeliverTest test = new BasicDeliverTest(); - - //warm up: - test.encode(512, 100000); - - //real tests: - test.encode(16, 10000, 15); - test.encode(32, 10000, 15); - test.encode(64, 10000, 15); - test.encode(128, 10000, 15); - test.encode(256, 10000, 15); - test.encode(512, 10000, 15); - test.encode(1024, 10000, 15); - test.encode(2048, 10000, 15); - - test.decode(16, 10000, 15); - test.decode(32, 10000, 15); - test.decode(64, 10000, 15); - test.decode(128, 10000, 15); - test.decode(256, 10000, 15); - test.decode(512, 10000, 15); - test.decode(1024, 10000, 15); - test.decode(2048, 10000, 15); - } - - void decode(int size, int count, int iterations) throws Exception - { - long min = Long.MAX_VALUE; - long max = 0; - long total = 0; - for (int i = 0; i < iterations; i++) - { - long time = decode(size, count); - total += time; - if (time < min) - { - min = time; - } - if (time > max) - { - max = time; - } - } - System.out.println("Decoded " + count + " messages of " + size + - " bytes: avg=" + (total / iterations) + ", min=" + min + ", max=" + max); - } - - - long decode(int size, int count) throws Exception - { - AMQDataBlock block = getDataBlock(size); - ByteBuffer data = ByteBuffer.allocate((int) block.getSize()); // XXX: Is cast a problem? - block.writePayload(data); - data.flip(); - AMQDecoder decoder = new AMQDecoder(false); - long start = System.currentTimeMillis(); - for (int i = 0; i < count; i++) - { - decoder.decode(session, data, decoderOutput); - data.rewind(); - } - return System.currentTimeMillis() - start; - } - - void encode(int size, int count, int iterations) throws Exception - { - long min = Long.MAX_VALUE; - long max = 0; - long total = 0; - for (int i = 0; i < iterations; i++) - { - long time = encode(size, count); - total += time; - if (time < min) - { - min = time; - } - if (time > max) - { - max = time; - } - } - System.out.println("Encoded " + count + " messages of " + size + - " bytes: avg=" + (total / iterations) + ", min=" + min + ", max=" + max); - } - - long encode(int size, int count) throws Exception - { - IoSession session = null; - AMQDataBlock block = getDataBlock(size); - AMQEncoder encoder = new AMQEncoder(); - long start = System.currentTimeMillis(); - for (int i = 0; i < count; i++) - { - encoder.encode(session, block, encoderOutput); - } - return System.currentTimeMillis() - start; - } - - private final ProtocolEncoderOutput encoderOutput = new ProtocolEncoderOutput() - { - - public void write(ByteBuffer byteBuffer) - { - } - - public void mergeAll() - { - } - - public WriteFuture flush() - { - return null; - } - }; - - private final ProtocolDecoderOutput decoderOutput = new ProtocolDecoderOutput() - { - public void write(Object object) - { - } - - public void flush() - { - } - }; - - private final IoSession session = new BaseIoSession() - { - - protected void updateTrafficMask() - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public IoService getService() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoServiceConfig getServiceConfig() - { - return null; - } - - public IoHandler getHandler() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoSessionConfig getConfig() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoFilterChain getFilterChain() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public TransportType getTransportType() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getRemoteAddress() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getLocalAddress() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getServiceAddress() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getScheduledWriteRequests() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getScheduledWriteBytes() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - }; - - private static final char[] DATA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); - - static CompositeAMQDataBlock getDataBlock(int size) - { - //create a frame representing message delivery - AMQFrame[] frames = new AMQFrame[3]; - frames[0] = wrapBody(createBasicDeliverBody()); - frames[1] = wrapBody(createContentHeaderBody()); - frames[2] = wrapBody(createContentBody(size)); - - return new CompositeAMQDataBlock(frames); - } - - static AMQFrame wrapBody(AMQBody body) - { - AMQFrame frame = new AMQFrame(1, body); - return frame; - } - - static ContentBody createContentBody(int size) - { - ContentBody body = new ContentBody(); - body.payload = ByteBuffer.allocate(size); - for (int i = 0; i < size; i++) - { - body.payload.put((byte) DATA[i % DATA.length]); - } - return body; - } - - static ContentHeaderBody createContentHeaderBody() - { - ContentHeaderBody body = new ContentHeaderBody(); - body.properties = new BasicContentHeaderProperties(); - body.weight = 1; - body.classId = 6; - return body; - } - - static BasicDeliverBody createBasicDeliverBody() - { - BasicDeliverBody body = new BasicDeliverBody((byte) 8, (byte) 0, - BasicDeliverBody.getClazz((byte) 8, (byte) 0), - BasicDeliverBody.getMethod((byte) 8, (byte) 0), - new AMQShortString("myConsumerTag"), 1, - new AMQShortString("myExchange"), false, - new AMQShortString("myRoutingKey")); - return body; - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/codec/Client.java b/java/client/src/old_test/java/org/apache/qpid/codec/Client.java deleted file mode 100644 index 3886021277..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/codec/Client.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * 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.qpid.codec; - -import org.apache.mina.transport.socket.nio.SocketConnector; -import org.apache.mina.common.ConnectFuture; -import org.apache.mina.common.IoHandlerAdapter; -import org.apache.mina.common.IoSession; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.qpid.framing.AMQDataBlock; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.BasicDeliverBody; -import org.apache.qpid.framing.ContentBody; - -import java.net.InetSocketAddress; - -public class Client extends IoHandlerAdapter -{ - //private static final int[] DEFAULT_SIZES = new int[]{1024, 512, 256, 128, 56}; - //private static final int[] DEFAULT_SIZES = new int[]{256, 256, 256, 256, 256, 512, 512, 512, 512, 512}; - private static final int[] DEFAULT_SIZES = new int[]{256, 512, 256, 512, 256, 512, 256, 512, 256, 512}; - //private static final int[] DEFAULT_SIZES = new int[]{1024, 1024, 1024, 1024, 1024}; - - private final IoSession _session; - private final long _start; - private final int _size; - private final int _count; - private int _received; - private boolean _closed; - - Client(String host, int port, int size, int count) throws Exception - { - _count = count; - _size = size; - AMQDataBlock block = BasicDeliverTest.getDataBlock(size); - - InetSocketAddress address = new InetSocketAddress(host, port); - ConnectFuture future = new SocketConnector().connect(address, this); - future.join(); - _session = future.getSession(); - - _start = System.currentTimeMillis(); - for(int i = 0; i < count; i++) - { - _session.write(block); - } - } - - void close() - { - long time = System.currentTimeMillis() - _start; - System.out.println("Received " + _received + " messages of " + _size - + " bytes in " + time + "ms."); - _session.close(); - synchronized(this) - { - _closed = true; - notify(); - } - } - - void waitForClose() throws InterruptedException - { - synchronized(this) - { - while(!_closed) - { - wait(); - } - } - } - - public void sessionCreated(IoSession session) throws Exception - { - session.getFilterChain().addLast("protocolFilter", new ProtocolCodecFilter(new AMQCodecFactory(false))); - } - - public void messageReceived(IoSession session, Object object) throws Exception - { - if(isContent(object) && ++_received == _count) close(); - } - - public void exceptionCaught(IoSession session, Throwable throwable) throws Exception - { - throwable.printStackTrace(); - close(); - } - - private static boolean isDeliver(Object o) - { - return o instanceof AMQFrame && ((AMQFrame) o).getBodyFrame() instanceof BasicDeliverBody; - } - - private static boolean isContent(Object o) - { - return o instanceof AMQFrame && ((AMQFrame) o).getBodyFrame() instanceof ContentBody; - } - - public static void main(String[] argv) throws Exception - { - String host = argv.length > 0 ? argv[0] : "localhost"; - int port = argv.length > 1 ? Integer.parseInt(argv[1]) : 8888; - int count = argv.length > 2 ? Integer.parseInt(argv[2]) : 10000; - int[] sizes = argv.length > 3 ? new int[]{Integer.parseInt(argv[3])} : DEFAULT_SIZES; - - System.out.println("Connecting to " + host + ":" + port); - - for(int i = 0; i < sizes.length; i++) - { - new Client(host, port, sizes[i], count).waitForClose(); - Thread.sleep(1000); - } - } - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/codec/Server.java b/java/client/src/old_test/java/org/apache/qpid/codec/Server.java deleted file mode 100644 index fa4295e0b2..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/codec/Server.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * - * 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.qpid.codec; - -import org.apache.mina.common.IoHandlerAdapter; -import org.apache.mina.common.IoSession; -import org.apache.mina.transport.socket.nio.SocketAcceptor; -import org.apache.mina.util.SessionUtil; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.CompositeAMQDataBlock; - -import java.net.InetSocketAddress; - -public class Server extends IoHandlerAdapter -{ - Server(int port) throws Exception - { - new SocketAcceptor().bind(new InetSocketAddress(port), this); - System.out.println("Listening on " + port); - } - - public void sessionCreated(IoSession session) throws Exception - { - SessionUtil.initialize(session); - session.getFilterChain().addLast("protocolFilter", new ProtocolCodecFilter(new AMQCodecFactory(false))); - } - - public void messageReceived(IoSession session, Object object) throws Exception - { - getAccumulator(session).received(session, (AMQFrame) object); - } - - public void sessionOpened(IoSession session) throws Exception - { - System.out.println("sessionOpened()"); - } - - public void sessionClosed(IoSession session) throws Exception - { - System.out.println("sessionClosed()"); - } - - public void exceptionCaught(IoSession session, Throwable t) throws Exception - { - System.out.println("exceptionCaught()"); - t.printStackTrace(); - session.close(); - } - - private Accumulator getAccumulator(IoSession session) - { - Accumulator a = (Accumulator) session.getAttribute(ACCUMULATOR); - if(a == null) - { - a = new Accumulator(); - session.setAttribute(ACCUMULATOR, a); - } - return a; - } - - private static final String ACCUMULATOR = Accumulator.class.getName(); - - private static class Accumulator - { - private final AMQFrame[] frames = new AMQFrame[3]; - private int i; - - void received(IoSession session, AMQFrame frame) - { - frames[i++] = frame; - if(i >= frames.length) - { - i = 0; - session.write(new CompositeAMQDataBlock(frames)); - } - } - } - - public static void main(String[] argv) throws Exception - { - int port = argv.length > 0 ? Integer.parseInt(argv[0]) : 8888; - new Server(port); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java b/java/client/src/old_test/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java deleted file mode 100644 index cac0064785..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * 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.qpid.config; - -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.config.ConnectionFactoryInitialiser; -import org.apache.qpid.config.ConnectorConfig; - -import javax.jms.ConnectionFactory; - -class AMQConnectionFactoryInitialiser implements ConnectionFactoryInitialiser -{ - public ConnectionFactory getFactory(ConnectorConfig config) - { - return new AMQConnectionFactory(config.getHost(), config.getPort(), "/test_path"); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/AbstractConfig.java b/java/client/src/old_test/java/org/apache/qpid/config/AbstractConfig.java deleted file mode 100644 index 04381d66a0..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/AbstractConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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.qpid.config; - -public abstract class AbstractConfig -{ - public boolean setOptions(String[] argv) - { - try - { - for(int i = 0; i < argv.length - 1; i += 2) - { - String key = argv[i]; - String value = argv[i+1]; - setOption(key, value); - } - return true; - } - catch(Exception e) - { - System.out.println(e.getMessage()); - } - return false; - } - - protected int parseInt(String msg, String i) - { - try - { - return Integer.parseInt(i); - } - catch(NumberFormatException e) - { - throw new RuntimeException(msg + ": " + i); - } - } - - protected long parseLong(String msg, String i) - { - try - { - return Long.parseLong(i); - } - catch(NumberFormatException e) - { - throw new RuntimeException(msg + ": " + i); - } - } - - public abstract void setOption(String key, String value); -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java b/java/client/src/old_test/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java deleted file mode 100644 index a9984eb09a..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * - * 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.qpid.config; - -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; - -public interface ConnectionFactoryInitialiser -{ - public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException; -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/Connector.java b/java/client/src/old_test/java/org/apache/qpid/config/Connector.java deleted file mode 100644 index ff2377f087..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/Connector.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * 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.qpid.config; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; - -public class Connector -{ - public Connection createConnection(ConnectorConfig config) throws Exception - { - return getConnectionFactory(config).createConnection(); - } - - ConnectionFactory getConnectionFactory(ConnectorConfig config) throws Exception - { - String factory = config.getFactory(); - if(factory == null) factory = AMQConnectionFactoryInitialiser.class.getName(); - System.out.println("Using " + factory); - return ((ConnectionFactoryInitialiser) Class.forName(factory).newInstance()).getFactory(config); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/ConnectorConfig.java b/java/client/src/old_test/java/org/apache/qpid/config/ConnectorConfig.java deleted file mode 100644 index b120ed3f12..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/ConnectorConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * 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.qpid.config; - -public interface ConnectorConfig -{ - public String getHost(); - public int getPort(); - public String getFactory(); -} diff --git a/java/client/src/old_test/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java b/java/client/src/old_test/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java deleted file mode 100644 index 1c86aea56c..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * 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.qpid.config; - -import org.apache.qpid.config.ConnectionFactoryInitialiser; -import org.apache.qpid.config.ConnectorConfig; - -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.management.MBeanServerConnection; -import javax.management.ObjectName; -import javax.management.MBeanException; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.naming.NameNotFoundException; -import java.util.Hashtable; - -public class JBossConnectionFactoryInitialiser implements ConnectionFactoryInitialiser -{ - public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException - { - ConnectionFactory cf = null; - InitialContext ic = null; - Hashtable ht = new Hashtable(); - ht.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); - String jbossHost = System.getProperty("jboss.host", "eqd-lxamq01"); - String jbossPort = System.getProperty("jboss.port", "1099"); - ht.put(InitialContext.PROVIDER_URL, "jnp://" + jbossHost + ":" + jbossPort); - ht.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); - - try - { - ic = new InitialContext(ht); - if (!doesDestinationExist("topictest.messages", ic)) - { - deployTopic("topictest.messages", ic); - } - if (!doesDestinationExist("topictest.control", ic)) - { - deployTopic("topictest.control", ic); - } - - cf = (ConnectionFactory) ic.lookup("/ConnectionFactory"); - return cf; - } - catch (NamingException e) - { - JMSException jmse = new JMSException("Unable to lookup object: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - catch (Exception e) - { - JMSException jmse = new JMSException("Error creating topic: " + e); - jmse.setLinkedException(e); - jmse.initCause(e); - throw jmse; - } - } - - private boolean doesDestinationExist(String name, InitialContext ic) throws Exception - { - try - { - ic.lookup("/" + name); - } - catch (NameNotFoundException e) - { - return false; - } - return true; - } - - private void deployTopic(String name, InitialContext ic) throws Exception - { - MBeanServerConnection mBeanServer = lookupMBeanServerProxy(ic); - - ObjectName serverObjectName = new ObjectName("jboss.messaging:service=ServerPeer"); - - String jndiName = "/" + name; - try - { - mBeanServer.invoke(serverObjectName, "createTopic", - new Object[]{name, jndiName}, - new String[]{"java.lang.String", "java.lang.String"}); - } - catch (MBeanException e) - { - System.err.println("Error: " + e); - System.err.println("Cause: " + e.getCause()); - } - } - - private MBeanServerConnection lookupMBeanServerProxy(InitialContext ic) throws NamingException - { - return (MBeanServerConnection) ic.lookup("jmx/invoker/RMIAdaptor"); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/flow/ChannelFlowTest.java b/java/client/src/old_test/java/org/apache/qpid/flow/ChannelFlowTest.java deleted file mode 100644 index cb8adae18c..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/flow/ChannelFlowTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * 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.qpid.flow; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; - -public class ChannelFlowTest implements MessageListener -{ - private int sent; - private int received; - - ChannelFlowTest(String broker) throws Exception - { - this(new AMQConnection(broker, "guest", "guest", randomize("Client"), "/test")); - } - - ChannelFlowTest(AMQConnection connection) throws Exception - { - this(connection, new AMQQueue(connection.getDefaultQueueExchangeName(), new AMQShortString(randomize("ChannelFlowTest")), true)); - } - - ChannelFlowTest(AMQConnection connection, AMQDestination destination) throws Exception - { - AMQSession session = (AMQSession) connection.createSession(false, AMQSession.NO_ACKNOWLEDGE, 50,25); - - //set up a slow consumer - session.createConsumer(destination).setMessageListener(this); - connection.start(); - - //create a publisher - MessageProducer producer = session.createProducer(destination); - Message msg = session.createTextMessage("Message"); - - //publish in bursts that are fast enough to cause channel flow control - for(int i = 0; i < 10; i++) - { - for(int j = 0; j < 100; j++) - { - producer.send(msg); - sent++; - } - waitUntilReceived(sent - 40); - } - - waitUntilReceived(sent); - - session.close(); - connection.close(); - } - - - private synchronized void waitUntilReceived(int count) throws InterruptedException - { - while(received <count) - { - wait(); - } - } - - public synchronized void onMessage(Message message) - { - try - { - Thread.sleep(50); - - received++; - notify(); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - } - - private static String randomize(String in) - { - return in + System.currentTimeMillis(); - } - - public static void main(String[] argv) throws Exception - { - new ChannelFlowTest(argv.length == 0 ? "localhost:5672" : argv[0]); - } - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargePublisher.java b/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargePublisher.java deleted file mode 100644 index 2fe01fc126..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargePublisher.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * - * 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.qpid.fragmentation; - -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.url.URLSyntaxException; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.jms.MessageProducer; -import org.apache.qpid.jms.Session; -import org.apache.log4j.Logger; - -import javax.jms.BytesMessage; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * A client that behaves as follows: - * <ul><li>Connects to a queue, whose name is specified as a cmd-line argument</li> - * <li>Creates a temporary queue</li> - * <li>Creates messages containing a property that is the name of the temporary queue</li> - * <li>Fires off a message on the original queue and waits for a response on the temporary queue</li> - * </ul> - */ -public class TestLargePublisher -{ - private static final Logger _log = Logger.getLogger(TestLargePublisher.class); - - private AMQConnection _connection; - - private AMQSession _session; - - private class CallbackHandler implements MessageListener - { - private int _expectedMessageCount; - - private int _actualMessageCount; - - private long _startTime; - - public CallbackHandler(int expectedMessageCount, long startTime) - { - _expectedMessageCount = expectedMessageCount; - _startTime = startTime; - } - - public void onMessage(Message m) - { - if (_log.isDebugEnabled()) - { - _log.debug("Message received: " + m); - } - _actualMessageCount++; - if (_actualMessageCount%1000 == 0) - { - _log.info("Received message count: " + _actualMessageCount); - } - /*if (!"henson".equals(m.toString())) - { - _log.error("AbstractJMSMessage response not correct: expected 'henson' but got " + m.toString()); - } - else - { - if (_log.isDebugEnabled()) - { - _log.debug("AbstractJMSMessage " + m + " received"); - } - else - { - _log.info("AbstractJMSMessage received"); - } - } */ - - if (_actualMessageCount == _expectedMessageCount) - { - long timeTaken = System.currentTimeMillis() - _startTime; - System.out.println("Total time taken to receive " + _expectedMessageCount+ " messages was " + - timeTaken + "ms, equivalent to " + - (_expectedMessageCount/(timeTaken/1000.0)) + " messages per second"); - } - } - } - - public TestLargePublisher(String host, int port, String clientID, - final int messageCount) throws AMQException,URLSyntaxException - { - try - { - createConnection(host, port, clientID); - - _session = (AMQSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - AMQTopic destination = new AMQTopic(_session.getDefaultTopicExchangeName(), new AMQShortString("large")); - MessageProducer producer = (MessageProducer) _session.createProducer(destination); - - _connection.start(); - //TextMessage msg = _session.createTextMessage(tempDestination.getQueueName() + "/Presented to in conjunction with Mahnah Mahnah and the Snowths"); - final long startTime = System.currentTimeMillis(); - - for (int i = 0; i < messageCount; i++) - { - BytesMessage msg = _session.createBytesMessage(); - populateMessage(msg); - producer.send(msg); - } - _log.info("Finished sending " + messageCount + " messages"); - } - catch (JMSException e) - { - e.printStackTrace(); - } - } - - private void createConnection(String host, int port, String clientID) throws AMQException , URLSyntaxException - { - _connection = new AMQConnection(host, port, "guest", "guest", - clientID, "/test"); - } - - private void populateMessage(BytesMessage msg) throws JMSException - { - int size = 1024 * 187; // 187k - byte[] data = new byte[size]; - for (int i = 0; i < data.length; i++) - { - data[i] = (byte)(i%25); - } - msg.writeBytes(data); - } - - /** - * - * @param args argument 1 if present specifies the name of the temporary queue to create. Leaving it blank - * means the server will allocate a name. - */ - public static void main(String[] args) throws URLSyntaxException - { - final String host; - final int port; - final int numMessages; - if (args.length == 0) - { - host = "localhost"; - port = 5672; - numMessages = 100; -// System.err.println("Usage: TestLargePublisher <host> <port> <number of messages>"); - } - else - { - host = args[0]; - port = Integer.parseInt(args[1]); - numMessages = Integer.parseInt(args[2]); - } - - try - { - InetAddress address = InetAddress.getLocalHost(); - String clientID = address.getHostName() + System.currentTimeMillis(); - TestLargePublisher client = new TestLargePublisher(host, port, clientID, numMessages); - } - catch (UnknownHostException e) - { - e.printStackTrace(); - } - catch (AMQException e) - { - System.err.println("Error in client: " + e); - e.printStackTrace(); - } - - //System.exit(0); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargeSubscriber.java b/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargeSubscriber.java deleted file mode 100644 index b0cde22349..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/fragmentation/TestLargeSubscriber.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * 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.qpid.fragmentation; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.jms.Session; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.log4j.Logger; - -import javax.jms.*; -import java.net.InetAddress; - -public class TestLargeSubscriber -{ - private static final Logger _logger = Logger.getLogger(TestLargeSubscriber.class); - - private static MessageProducer _destinationProducer; - - private static String _destinationName; - - public static void main(String[] args) - { - _logger.info("Starting..."); - - final String host; - final int port; - final String username; - final String password; - final String virtualPath; - final int numExpectedMessages; - if (args.length == 0) - { - host = "localhost"; - port = 5672; - username = "guest"; - password = "guest"; - virtualPath = "/test"; - numExpectedMessages = 100; - } - else if (args.length == 6) - { - host = args[0]; - port = Integer.parseInt(args[1]); - username = args[2]; - password = args[3]; - virtualPath = args[4]; - numExpectedMessages = Integer.parseInt(args[5]); - } - else - { - System.out.println("Usage: host port username password virtual-path expectedMessageCount"); - System.exit(1); - throw new RuntimeException("cannot be reached"); - } - - try - { - InetAddress address = InetAddress.getLocalHost(); - AMQConnection con = new AMQConnection(host, port, username, password, - address.getHostName(), virtualPath); - final AMQSession session = (AMQSession) con.createSession(false, Session.AUTO_ACKNOWLEDGE); - - final int expectedMessageCount = numExpectedMessages; - - MessageConsumer consumer = session.createConsumer(new AMQTopic(session.getDefaultTopicExchangeName(), - new AMQShortString("large")), - 100, true, false, null); - - consumer.setMessageListener(new MessageListener() - { - private int _messageCount; - - private long _startTime = 0; - - public void onMessage(Message message) - { - validateMessage(message); - if (_messageCount++ == 0) - { - _startTime = System.currentTimeMillis(); - } - if (_logger.isInfoEnabled()) - { - _logger.info("Got message '" + message + "'"); - } - if (_messageCount == expectedMessageCount) - { - long totalTime = System.currentTimeMillis() - _startTime; - _logger.error("Total time to receive " + _messageCount + " messages was " + - totalTime + "ms. Rate is " + (_messageCount/(totalTime/1000.0))); - } - } - - private void validateMessage(Message message) - { - if (!(message instanceof BytesMessage)) - { - _logger.error("Message is not of correct type - should be BytesMessage and is " + - message.getClass()); - } - BytesMessage bm = (BytesMessage) message; - final int expectedSize = 1024 * 187; // 187k - try - { - if (bm.getBodyLength() != expectedSize) - { - _logger.error("Message is not correct length - should be " + expectedSize + " and is " + - bm.getBodyLength()); - } - } - catch (JMSException e) - { - _logger.error("Failed to validate message: " + e, e); - } - try - { - byte[] data = new byte[(int)bm.getBodyLength()]; - bm.readBytes(data); - for (int i = 0; i < data.length; i++) - { - if (data[i] != (byte)(i%25)) - { - _logger.error("byte " + i + " of message is wrong - should be " + i%25 + " but is " + - data[i]); - } - } - _logger.info("***** Validated message successfully"); - } - catch (JMSException e) - { - _logger.error("Failed to validate message: " + e, e); - } - } - }); - con.start(); - } - catch (Throwable t) - { - System.err.println("Fatal error: " + t); - t.printStackTrace(); - } - - System.out.println("Waiting..."); - } -} - diff --git a/java/client/src/old_test/java/org/apache/qpid/headers/Listener.java b/java/client/src/old_test/java/org/apache/qpid/headers/Listener.java deleted file mode 100644 index cb5caefc1e..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/headers/Listener.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * 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.qpid.headers; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.jms.Session; -//import org.apache.qpid.testutil.Config; - -import javax.jms.MessageListener; -import javax.jms.Message; -import javax.jms.Destination; -import javax.jms.MessageProducer; -import javax.jms.JMSException; - -public class Listener //implements MessageListener -{ -/* private final AMQConnection _connection; - private final MessageProducer _controller; - private final AMQSession _session; - private final MessageFactory _factory; - private int count; - private long start; - - Listener(AMQConnection connection, Destination exchange) throws Exception - { - _connection = connection; - _session = (AMQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - _factory = new MessageFactory(_session, 0, 19); - - //register for events - _factory.createConsumer(exchange).setMessageListener(this); - _connection.start(); - - _controller = _session.createProducer(exchange); - } - - private void shutdown() - { - try - { - _session.close(); - _connection.stop(); - _connection.close(); - } - catch(Exception e) - { - e.printStackTrace(System.out); - } - } - - private void report() - { - try - { - String msg = getReport(); - _controller.send(_factory.createReportResponseMessage(msg)); - System.out.println("Sent report: " + msg); - } - catch(Exception e) - { - e.printStackTrace(System.out); - } - } - - private String getReport() throws JMSException - { - long time = (System.currentTimeMillis() - start); - return "Received " + count + " in " + time + "ms"; - } - - public void onMessage(Message message) - { - if(count == 0) start = System.currentTimeMillis(); - - if(_factory.isShutdown(message)) - { - shutdown(); - } - else if(_factory.isReport(message)) - { - //send a report: - report(); - } - else if (++count % 100 == 0) - { - System.out.println("Received " + count + " messages."); - } - } - - public static void main(String[] argv) throws Exception - { - Config config = new Config(); - config.setType(Config.HEADERS); - config.setName("test_headers_exchange"); - config.setOptions(argv); - new Listener((AMQConnection) config.getConnection(), config.getDestination()); - }*/ -} diff --git a/java/client/src/old_test/java/org/apache/qpid/headers/MessageFactory.java b/java/client/src/old_test/java/org/apache/qpid/headers/MessageFactory.java deleted file mode 100644 index a2d575fdd4..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/headers/MessageFactory.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * - * 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.qpid.headers; - -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; - -import javax.jms.BytesMessage; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.TextMessage; - -/** - */ -class MessageFactory -{ - private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - - private final AMQSession _session; - private final byte[] _payload; - - private String[] _headerNames; - - MessageFactory(AMQSession session) - { - this(session, Integer.getInteger("amqj.test.message_size", 256).intValue(), 5); - } - - MessageFactory(AMQSession session, int payloadSize, int headerCount) - { - if (headerCount < 1) - { - throw new IllegalArgumentException("Header count must be positive"); - } - _session = session; - _payload = new byte[payloadSize]; - for (int i = 0; i < _payload.length; i++) - { - _payload[i] = (byte) DATA[i % DATA.length]; - } - _headerNames = new String[headerCount]; - // note that with the standard encoding the headers get prefixed with an S to indicate their type - for (int i = 0; i < _headerNames.length; i++) - { - if (i < 10) - { - _headerNames[i] = "F000" + i; - } - else if (i >= 10 && i < 100) - { - _headerNames[i] = "F00" + i; - } - else - { - _headerNames[i] = "F0" + i; - } - } - } - - Message createEventMessage() throws JMSException - { - BytesMessage msg = _session.createBytesMessage(); - if (_payload.length != 0) - { - msg.writeBytes(_payload); - } - return setHeaders(msg, _headerNames); - } - - Message createShutdownMessage() throws JMSException - { - return setHeaders(_session.createMessage(), new String[]{"F0000", "SHUTDOWN"}); - } - - Message createReportRequestMessage() throws JMSException - { - return setHeaders(_session.createMessage(), new String[]{"F0000", "REPORT"}); - } - - Message createReportResponseMessage(String msg) throws JMSException - { - return setHeaders(_session.createTextMessage(msg), new String[]{"CONTROL", "REPORT"}); - } - - boolean isShutdown(Message m) - { - return checkPresent(m, "SHUTDOWN"); - } - - boolean isReport(Message m) - { - return checkPresent(m, "REPORT"); - } - - Object getReport(Message m) - { - try - { - return ((TextMessage) m).getText(); - } - catch (JMSException e) - { - e.printStackTrace(System.out); - return e.toString(); - } - } - - FieldTable getConsumerBinding() - { - FieldTable binding = FieldTableFactory.newFieldTable(); - binding.setString("SF0000", "value"); - return binding; - } - - FieldTable getControllerBinding() - { - FieldTable binding = FieldTableFactory.newFieldTable(); - binding.setString("SCONTROL", "value"); - return binding; - } - - MessageConsumer createConsumer(Destination source) throws Exception - { - return _session.createConsumer(source, 0, false, true, null, getConsumerBinding()); - } - - MessageConsumer createController(Destination source) throws Exception - { - return _session.createConsumer(source, 0, false, true, null, getControllerBinding()); - } - - private static boolean checkPresent(Message m, String s) - { - try - { - return m.getStringProperty(s) != null; - } - catch (JMSException e) - { - e.printStackTrace(System.out); - return false; - } - } - - private static Message setHeaders(Message m, String[] headers) throws JMSException - { - for (int i = 0; i < headers.length; i++) - { - // the value in GRM is 5 bytes - m.setStringProperty(headers[i], "value"); - } - return m; - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/headers/Publisher.java b/java/client/src/old_test/java/org/apache/qpid/headers/Publisher.java deleted file mode 100644 index d9ef702c48..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/headers/Publisher.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * 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.qpid.headers; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQSession; -//import org.apache.qpid.testutil.Config; - -import javax.jms.*; - -public class Publisher // implements MessageListener -{ -/* private final Object _lock = new Object(); - private final AMQConnection _connection; - private final AMQSession _session; - private final Destination _exchange; - private final MessageFactory _factory; - private final MessageProducer _publisher; - private int _count; - - Publisher(AMQConnection connection, Destination exchange) throws Exception - { - _connection = connection; - _exchange = exchange; - _session = (AMQSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - _factory = new MessageFactory(_session, 0, 19); - _publisher = _session.createProducer(_exchange); - } - - Publisher(Config config) throws Exception - { - this((AMQConnection) config.getConnection(), config.getDestination()); - } - - private void test(int msgCount, int consumerCount) throws Exception - { - _count = consumerCount; - _factory.createController(_exchange).setMessageListener(this); - _connection.start(); - long start = System.currentTimeMillis(); - publish(msgCount); - waitForCompletion(consumerCount); - long end = System.currentTimeMillis(); - - System.out.println("Completed in " + (end - start) + " ms."); - - //request shutdown - _publisher.send(_factory.createShutdownMessage()); - - _connection.stop(); - _connection.close(); - } - - private void publish(int count) throws Exception - { - - //send events - for (int i = 0; i < count; i++) - { - _publisher.send(_factory.createEventMessage()); - if ((i + 1) % 100 == 0) - { - System.out.println("Sent " + (i + 1) + " messages"); - } - } - - //request report - _publisher.send(_factory.createReportRequestMessage()); - } - - private void waitForCompletion(int consumers) throws Exception - { - System.out.println("Waiting for completion..."); - synchronized (_lock) - { - while (_count > 0) - { - _lock.wait(); - } - } - } - - - public void onMessage(Message message) - { - System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining"); - if (_count == 0) - { - synchronized (_lock) - { - _lock.notify(); - } - } - } - - - public static void main(String[] argv) throws Exception - { - if (argv.length >= 2) - { - int msgCount = Integer.parseInt(argv[argv.length - 2]); - int consumerCount = Integer.parseInt(argv[argv.length - 1]); - - Config config = new Config(); - config.setType(Config.HEADERS); - config.setName("test_headers_exchange"); - String[] options = new String[argv.length - 2]; - System.arraycopy(argv, 0, options, 0, options.length); - config.setOptions(options); - - new Publisher(config).test(msgCount, consumerCount); - } - - }*/ -} diff --git a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Bind.java b/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Bind.java deleted file mode 100644 index ee6a12c233..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Bind.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * - * 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.qpid.jndi.referenceable; - -import org.apache.qpid.client.*; -import org.apache.qpid.AMQException; -import org.apache.qpid.url.URLSyntaxException; - -import javax.jms.*; -import javax.naming.*; - -import java.util.Properties; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.IOException; - -/** - * Binds a reference from a JNDI source. - * Given a properties file with the JNDI information and a binding string. - */ -public class Bind -{ - private static final String USAGE="USAGE: java bind <JNDI Properties file> -cf <url> <binding> | -c <url> <binding> [-t <topic Name> <binding>] [-q <queue Name> <binding>]"; - public Bind(String propertiesFile, String bindingURL, Referenceable reference) throws NameAlreadyBoundException, NoInitialContextException - { - // Set up the environment for creating the initial context - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - { - qpid_home += "/"; - } - - try - { - InputStream inputStream = new FileInputStream(qpid_home + propertiesFile); - Properties properties = new Properties(); - properties.load(inputStream); - - // Create the initial context - Context ctx = new InitialContext(properties); - - // Perform the binds - ctx.bind(bindingURL, reference); - - // Close the context when we're done - ctx.close(); - } - catch (IOException ioe) - { - System.out.println("Unable to access properties file:" + propertiesFile + " Due to:" + ioe); - } - catch (NamingException e) - { - System.out.println("Operation failed: " + e); - if (e instanceof NameAlreadyBoundException) - { - throw (NameAlreadyBoundException) e; - } - - if (e instanceof NoInitialContextException) - { - throw (NoInitialContextException) e; - } - } - - } - - private static String parse(String[] args, int index, String what, String type) - { - try - { - return args[index]; - } - catch (IndexOutOfBoundsException ioobe) - { - System.out.println("ERROR: No " + what + " specified for " + type + "."); - System.out.println(USAGE); - System.exit(1); - } - - // The path is either return normally or exception.. which calls system exit so keep the compiler happy - return "Never going to happen"; - } - - - public static void main(String[] args) throws NameAlreadyBoundException, NoInitialContextException, URLSyntaxException, AMQException, JMSException - { - - - org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF); - -// org.apache.log4j.Logger _logger = org.apache.log4j.Logger.getLogger(AMQConnection.class); -// _logger.setLevel(org.apache.log4j.Level.OFF); - - boolean exit = false; - - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - exit = true; - } - - if (args.length <= 2) - { - System.out.println("At least a connection or connection factory must be requested to be bound."); - exit = true; - } - else - { - if ((args.length - 1) % 3 != 0) - { - System.out.println("Not all values have full details"); - exit = true; - } - } - if (exit) - { - System.out.println(USAGE); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - - { - qpid_home += "/"; - } - - AMQConnectionFactory cf = null; - AMQConnection c = null; - AMQSession session = null; - Referenceable reference = null; - - for (int index = 1; index < args.length; index ++) - { - String obj = args[index]; - - String what = "Invalid"; - String binding; - - if (obj.startsWith("-c")) - { - boolean isFactory = obj.contains("f"); - - - if (isFactory) - { - what = "ConnectionFactory"; - } - else - { - what = "Factory"; - } - - String url = parse(args, ++index, "url", what); - - if (isFactory) - { - - cf = new AMQConnectionFactory(url); - reference = cf; - } - else - { - c = new AMQConnection(url); - reference = c; - } - - } - - if (obj.equals("-t") || obj.equals("-q")) - { - if (c == null) - { - c = (AMQConnection) cf.createConnection(); - } - - if (session == null) - { - session = (AMQSession) c.createSession(false, Session.AUTO_ACKNOWLEDGE); - } - - } - - if (obj.equals("-t")) - { - - String topicName = parse(args, ++index, "Topic Name", "Topic"); - reference = (AMQTopic) session.createTopic(topicName); - what = "Topic"; - } - else - { - if (obj.equals("-q")) - { - String topicName = parse(args, ++index, "Queue Name", "Queue"); - reference = (AMQQueue) session.createQueue(topicName); - what = "Queue"; - } - } - - binding = parse(args, ++index, "binding", what); - if (binding == null) - { - System.out.println(obj + " is not a known Object to bind."); - System.exit(1); - } - else - { - System.out.print("Binding:" + reference + " to " + binding); - try - { - new Bind(args[0], binding, reference); - System.out.println(" ..Successful"); - - } - catch (NameAlreadyBoundException nabe) - { - System.out.println(""); - if (!obj.startsWith("-c") || index == args.length - 1) - { - throw nabe; - } - else - { - System.out.println("Continuing with other bindings using the same connection details"); - } - } - finally - { - if (!obj.startsWith("-c") || index == args.length - 1) - { - if (c != null) - { - c.close(); - } - } - } - } - } - - if (c != null) - { - c.close(); - } - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Lookup.java b/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Lookup.java deleted file mode 100644 index 1c9d8b0fd5..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Lookup.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * - * 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.qpid.jndi.referenceable; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * Looksup a reference from a JNDI source. - * Given a properties file with the JNDI information and a binding string. - */ -public class Lookup -{ - private static final String USAGE = "USAGE: java lookup <JNDI Properties file> -b <binding>"; - private Properties _properties; - private Object _object; - - public Lookup(String propertiesFile, String bindingValue) throws NamingException - { - // Set up the environment for creating the initial context - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - { - qpid_home += "/"; - } - - try - { - InputStream inputStream = new FileInputStream(qpid_home + propertiesFile); - Properties properties = new Properties(); - properties.load(inputStream); - - _properties = properties; - lookup(bindingValue); - } - catch (IOException ioe) - { - System.out.println("Unable to access properties file:" + propertiesFile + " Due to:" + ioe); - } - } - - public Object lookup(String bindingValue) throws NamingException - { - - // Create the initial context - Context ctx = new InitialContext(_properties); - - // Perform the binds - _object = ctx.lookup(bindingValue); - - // Close the context when we're done - ctx.close(); - - return getObject(); - } - - public Object getObject() - { - return _object; - } - - private static String parse(String[] args, int index, String what) - { - try - { - return args[index]; - } - catch (IndexOutOfBoundsException ioobe) - { - System.out.println("ERROR: No " + what + " specified."); - System.out.println(USAGE); - System.exit(1); - } - - // The path is either return normally or exception.. which calls system exit so keep the compiler happy - return "Never going to happen"; - } - - - public static void main(String[] args) throws NamingException - { - boolean exit = false; - - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - exit = true; - } - - if (args.length <= 2) - { - System.out.println("At least a connection or connection factory must be requested to be bound."); - exit = true; - } - else - { - if ((args.length - 1) % 2 != 0) - { - System.out.println("Not all values have full details"); - exit = true; - } - } - if (exit) - { - System.out.println(USAGE); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - - { - qpid_home += "/"; - } - - for (int index = 1; index < args.length; index ++) - { - String obj = args[index]; - - - if (obj.equals("-b")) - { - String binding = parse(args, ++index, "binding"); - - if (binding == null) - { - System.out.println("Binding not specified."); - System.exit(1); - } - else - { - System.out.print("Looking up:" + binding); - try - { - Lookup l = new Lookup(args[0], binding); - - Object object = l.getObject(); - - if (object instanceof Connection) - { - try - { - ((Connection) object).close(); - } - catch (JMSException jmse) - { - ; - } - } - } - catch (NamingException nabe) - { - System.out.println("Problem unbinding " + binding + " continuing with other values."); - } - } - }// if -b - else - { - System.out.println("Continuing with other bindings option not known:" + obj); - } - }//for - }//main -}//class diff --git a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Unbind.java b/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Unbind.java deleted file mode 100644 index 1acead674c..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/jndi/referenceable/Unbind.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * - * 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.qpid.jndi.referenceable; - -import javax.naming.*; - -import java.util.Properties; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.IOException; - -/** - * Unbinds a reference from a JNDI source. - * Given a properties file with the JNDI information and a binding string. - */ -public class Unbind -{ - private static final String USAGE = "USAGE: java unbind <JNDI Properties file> -b <binding>"; - - public Unbind(String propertiesFile, String bindingValue) throws NamingException - { - // Set up the environment for creating the initial context - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - { - qpid_home += "/"; - } - - try - { - InputStream inputStream = new FileInputStream(qpid_home + propertiesFile); - Properties properties = new Properties(); - properties.load(inputStream); - - // Create the initial context - Context ctx = new InitialContext(properties); - - // Perform the binds - ctx.unbind(bindingValue); - - // Close the context when we're done - ctx.close(); - } - catch (IOException ioe) - { - System.out.println("Unable to access properties file:" + propertiesFile + " Due to:" + ioe); - } - } - - private static String parse(String[] args, int index, String what) - { - try - { - return args[index]; - } - catch (IndexOutOfBoundsException ioobe) - { - System.out.println("ERROR: No " + what + " specified."); - System.out.println(USAGE); - System.exit(1); - } - - // The path is either return normally or exception.. which calls system exit so keep the compiler happy - return "Never going to happen"; - } - - - public static void main(String[] args) throws NamingException - { - boolean exit = false; - - String qpid_home = System.getProperty("QPID_HOME"); - - if (qpid_home == null || qpid_home.equals("")) - { - System.out.println("QPID_HOME is not set"); - exit = true; - } - - if (args.length <= 2) - { - System.out.println("At least a connection or connection factory must be requested to be bound."); - exit = true; - } - else - { - if ((args.length - 1) % 2 != 0) - { - System.out.println("Not all values have full details"); - exit = true; - } - } - if (exit) - { - System.out.println(USAGE); - System.exit(1); - } - - if (qpid_home.charAt(qpid_home.length() - 1) != '/') - - { - qpid_home += "/"; - } - - for (int index = 1; index < args.length; index ++) - { - String obj = args[index]; - - - if (obj.equals("-b")) - { - String binding = parse(args, ++index, "binding"); - - if (binding == null) - { - System.out.println("Binding not specified."); - System.exit(1); - } - else - { - System.out.print("UnBinding:" + binding); - try - { - new Unbind(args[0], binding); - System.out.println(" ..Successful"); - } - catch (NamingException nabe) - { - System.out.println(""); - - System.out.println("Problem unbinding " + binding + " continuing with other values."); - } - } - }// if -b - else - { - System.out.println("Continuing with other bindings option not known:" + obj); - } - }//for - }//main -}//class diff --git a/java/client/src/old_test/java/org/apache/qpid/latency/LatencyTest.java b/java/client/src/old_test/java/org/apache/qpid/latency/LatencyTest.java deleted file mode 100644 index 4865a68dc4..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/latency/LatencyTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * - * 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.qpid.latency; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.MessageProducer; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.JMSException; -import javax.jms.TextMessage; -import javax.jms.BytesMessage; - -public class LatencyTest implements MessageListener -{ - private volatile boolean waiting; - private int sent; - private int received; - - private final byte[] data; - - private long min = Long.MAX_VALUE; - private long max = 0; - private long total = 0; - - LatencyTest(String broker, int count, int delay, int length) throws Exception - { - this(new AMQConnection(broker, "guest", "guest", randomize("Client"), "/test"), count, delay, length); - } - - LatencyTest(AMQConnection connection, int count, int delay, int length) throws Exception - { - this(connection, new AMQQueue(connection.getDefaultQueueExchangeName(), new AMQShortString(randomize("LatencyTest")), true), count, delay, length); - } - - LatencyTest(AMQConnection connection, AMQDestination destination, int count, int delay, int length) throws Exception - { - AMQSession session = (AMQSession) connection.createSession(false, AMQSession.NO_ACKNOWLEDGE); - - data = new byte[length]; - for(int i = 0; i < data.length; i++) - { - data[i] = (byte) (i % 100); - } - - //set up a consumer - session.createConsumer(destination).setMessageListener(this); - connection.start(); - - //create a publisher - MessageProducer producer = session.createProducer(destination, false, false, true); - - //publish at a low volume - for(int i = 0; i < count; i++) - { - BytesMessage msg = session.createBytesMessage(); - msg.writeBytes(data); - msg.setStringProperty("sent-at", Long.toString(System.nanoTime())); - producer.send(msg); - Thread.sleep(delay); - if(++sent % 100 == 0) - { - System.out.println("Sent " + sent + " of " + count); - } - } - - waitUntilReceived(sent); - - session.close(); - connection.close(); - - System.out.println("Latency (in nanoseconds): avg=" + (total/sent) + ", min=" + min + ", max=" + max - + ", avg(discarding min and max)=" + ((total - min - max) / (sent - 2))); - } - - - private synchronized void waitUntilReceived(int count) throws InterruptedException - { - waiting = true; - while(received < count) - { - wait(); - } - waiting = false; - } - - public void onMessage(Message message) - { - received++; - try - { - long sent = Long.parseLong(message.getStringProperty("sent-at")); - long time = System.nanoTime() - sent; - total += time; - min = Math.min(min, time); - max = Math.max(max, time); - } - catch (JMSException e) - { - e.printStackTrace(); - } - - if(waiting){ - synchronized(this) - { - notify(); - } - } - } - - private static String randomize(String in) - { - return in + System.currentTimeMillis(); - } - - public static void main(String[] argv) throws Exception - { - String host = argv.length > 0 ? argv[0] : "localhost:5672"; - if("-help".equals(host)) - { - System.out.println("Usage: <broker> <message count> <delay between messages> <message size>"); - } - int count = argv.length > 1 ? Integer.parseInt(argv[1]) : 1000; - int delay = argv.length > 2 ? Integer.parseInt(argv[2]) : 1000; - int size = argv.length > 3 ? Integer.parseInt(argv[3]) : 512; - new LatencyTest(host, count, delay, size); - } - - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/mina/AcceptorTest.java b/java/client/src/old_test/java/org/apache/qpid/mina/AcceptorTest.java deleted file mode 100644 index f0ac0e6902..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/mina/AcceptorTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * 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.qpid.mina; - -import org.apache.log4j.Logger; -import org.apache.mina.common.ByteBuffer; -import org.apache.mina.common.IoAcceptor; -import org.apache.mina.common.IoHandlerAdapter; -import org.apache.mina.common.IoSession; -import org.apache.mina.transport.socket.nio.SocketAcceptor; -import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; -import org.apache.mina.transport.socket.nio.SocketSessionConfig; -import org.apache.qpid.pool.ReadWriteThreadModel; - -import java.io.IOException; -import java.net.InetSocketAddress; - -import junit.framework.TestCase; - -/** - * Tests MINA socket performance. This acceptor simply reads data from the network and writes it back again. - * - */ -public class AcceptorTest extends TestCase -{ - private static final Logger _logger = Logger.getLogger(AcceptorTest.class); - - public static int PORT = 9999; - - private static class TestHandler extends IoHandlerAdapter - { - private int _sentCount; - - private int _bytesSent; - - public void messageReceived(IoSession session, Object message) throws Exception - { - ((ByteBuffer) message).acquire(); - session.write(message); - _logger.debug("Sent response " + ++_sentCount); - _bytesSent += ((ByteBuffer)message).remaining(); - _logger.debug("Bytes sent: " + _bytesSent); - } - - public void messageSent(IoSession session, Object message) throws Exception - { - //((ByteBuffer) message).release(); - } - - public void exceptionCaught(IoSession session, Throwable cause) throws Exception - { - _logger.error("Error: " + cause, cause); - } - } - - public void testStartAcceptor() throws IOException - { - IoAcceptor acceptor = null; - acceptor = new SocketAcceptor(); - - SocketAcceptorConfig config = (SocketAcceptorConfig) acceptor.getDefaultConfig(); - SocketSessionConfig sc = (SocketSessionConfig) config.getSessionConfig(); - sc.setTcpNoDelay(true); - sc.setSendBufferSize(32768); - sc.setReceiveBufferSize(32768); - - config.setThreadModel(ReadWriteThreadModel.getInstance()); - - acceptor.bind(new InetSocketAddress(PORT), - new TestHandler()); - _logger.info("Bound on port " + PORT); - } - - public static void main(String[] args) throws IOException - { - AcceptorTest a = new AcceptorTest(); - a.testStartAcceptor(); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(AcceptorTest.class); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/mina/BlockingAcceptorTest.java b/java/client/src/old_test/java/org/apache/qpid/mina/BlockingAcceptorTest.java deleted file mode 100644 index bfe29c47e6..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/mina/BlockingAcceptorTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * 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.qpid.mina; - -import org.apache.log4j.Logger; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.ServerSocket; -import java.net.Socket; - -import junit.framework.TestCase; - -public class BlockingAcceptorTest extends TestCase -{ - private static final Logger _logger = Logger.getLogger(BlockingAcceptorTest.class); - - public static int PORT = 9999; - - public void testStartAcceptor() throws IOException - { - - ServerSocket sock = new ServerSocket(PORT); - - sock.setReuseAddress(true); - sock.setReceiveBufferSize(32768); - _logger.info("Bound on port " + PORT); - - while (true) - { - final Socket s = sock.accept(); - _logger.info("Received connection from " + s.getRemoteSocketAddress()); - s.setReceiveBufferSize(32768); - s.setSendBufferSize(32768); - s.setTcpNoDelay(true); - new Thread(new Runnable() - { - public void run() - { - byte[] chunk = new byte[32768]; - try - { - InputStream is = s.getInputStream(); - OutputStream os = s.getOutputStream(); - - while (true) - { - int count = is.read(chunk, 0, chunk.length); - if (count > 0) - { - os.write(chunk, 0, count); - } - } - } - catch (IOException e) - { - _logger.error("Error - closing connection: " + e, e); - } - } - }, "SocketReaderWriter").start(); - } - } - - public static void main(String[] args) throws IOException - { - BlockingAcceptorTest a = new BlockingAcceptorTest(); - a.testStartAcceptor(); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(AcceptorTest.class); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/mina/WriterTest.java b/java/client/src/old_test/java/org/apache/qpid/mina/WriterTest.java deleted file mode 100644 index 910345624f..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/mina/WriterTest.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * - * 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.qpid.mina; - -import org.apache.log4j.Logger; -import org.apache.mina.common.*; -import org.apache.mina.transport.socket.nio.SocketConnector; -import org.apache.mina.transport.socket.nio.SocketConnectorConfig; -import org.apache.mina.transport.socket.nio.SocketSessionConfig; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.concurrent.CountDownLatch; - -import junit.framework.TestCase; - -public class WriterTest extends TestCase -{ - private static final Logger _logger = Logger.getLogger(WriterTest.class); - - private static class RunnableWriterTest implements Runnable - { - private Logger _logger; - - private IoSession _session; - - private long _startTime; - - private long[] _chunkTimes; - - private int _chunkCount = 500000; - - private int _chunkSize = 1024; - - private CountDownLatch _notifier; - - public RunnableWriterTest(Logger logger) - { - _logger = logger; - } - - public void run() - { - _startTime = System.currentTimeMillis(); - _notifier = new CountDownLatch(1); - for (int i = 0; i < _chunkCount; i++) - { - ByteBuffer buf = ByteBuffer.allocate(_chunkSize, false); - byte check = (byte) (i % 128); - buf.put(check); - buf.fill((byte)88, buf.remaining()); - buf.flip(); - _session.write(buf); - } - - try - { - _logger.info("All buffers sent; waiting for receipt from server"); - _notifier.await(); - } - catch (InterruptedException e) - { - } - _logger.info("Completed"); - long totalTime = System.currentTimeMillis() - _startTime; - _logger.info("Total time: " + totalTime); - _logger.info("MB per second: " + (_chunkSize * _chunkCount)/totalTime); - long lastChunkTime = _startTime; - double average = 0; - for (int i = 0; i < _chunkTimes.length; i++) - { - if (i == 0) - { - average = _chunkTimes[i] - _startTime; - } - else - { - long delta = _chunkTimes[i] - lastChunkTime; - if (delta != 0) - { - average = (average + delta)/2; - } - } - lastChunkTime = _chunkTimes[i]; - } - _logger.info("Average chunk time: " + average + "ms"); - CloseFuture cf = _session.close(); - cf.join(); - } - - private class WriterHandler extends IoHandlerAdapter - { - private int _chunksReceived = 0; - - private int _partialBytesRead = 0; - - private byte _partialCheckNumber; - - private int _totalBytesReceived = 0; - - public void messageReceived(IoSession session, Object message) throws Exception - { - ByteBuffer result = (ByteBuffer) message; - _totalBytesReceived += result.remaining(); - int size = result.remaining(); - long now = System.currentTimeMillis(); - if (_partialBytesRead > 0) - { - int offset = _chunkSize - _partialBytesRead; - if (size >= offset) - { - _chunkTimes[_chunksReceived++] = now; - result.position(offset); - } - else - { - // have not read even one chunk, including the previous partial bytes - _partialBytesRead += size; - return; - } - } - - int chunkCount = result.remaining()/_chunkSize; - - for (int i = 0; i < chunkCount; i++) - { - _chunkTimes[_chunksReceived++] = now; - byte check = result.get(); - _logger.debug("Check number " + check + " read"); - if (check != (byte)((_chunksReceived - 1)%128)) - { - _logger.error("Check number " + check + " read when expected " + (_chunksReceived%128)); - } - _logger.debug("Chunk times recorded"); - - try - { - result.skip(_chunkSize - 1); - } - catch (IllegalArgumentException e) - { - _logger.error("Position was: " + result.position()); - _logger.error("Tried to skip to: " + (_chunkSize * i)); - _logger.error("limit was; " + result.limit()); - } - } - _logger.debug("Chunks received now " + _chunksReceived); - _logger.debug("Bytes received: " + _totalBytesReceived); - _partialBytesRead = result.remaining(); - - if (_partialBytesRead > 0) - { - _partialCheckNumber = result.get(); - } - - if (_chunksReceived >= _chunkCount) - { - _notifier.countDown(); - } - - } - - public void exceptionCaught(IoSession session, Throwable cause) throws Exception - { - _logger.error("Error: " + cause, cause); - } - } - - public void startWriter(int chunkSize) throws IOException, InterruptedException - { - _chunkSize = chunkSize; - - IoConnector ioConnector = null; - - ioConnector = new SocketConnector(); - - SocketConnectorConfig cfg = (SocketConnectorConfig) ioConnector.getDefaultConfig(); - cfg.setThreadModel(ThreadModel.MANUAL); - SocketSessionConfig scfg = (SocketSessionConfig) cfg.getSessionConfig(); - scfg.setTcpNoDelay(true); - scfg.setSendBufferSize(32768); - scfg.setReceiveBufferSize(32768); - - final InetSocketAddress address = new InetSocketAddress("localhost", AcceptorTest.PORT); - _logger.info("Attempting connection to " + address); - ConnectFuture future = ioConnector.connect(address, new WriterHandler()); - // wait for connection to complete - future.join(); - _logger.info("Connection completed"); - // we call getSession which throws an IOException if there has been an error connecting - _session = future.getSession(); - _chunkTimes = new long[_chunkCount]; - Thread t = new Thread(this); - t.start(); - t.join(); - _logger.info("Test completed"); - } - } - - private RunnableWriterTest _runnableWriterTest = new RunnableWriterTest(_logger); - - public void test1k() throws IOException, InterruptedException - { - _logger.info("Starting 1k test"); - _runnableWriterTest.startWriter(1024); - } - - public void test2k() throws IOException, InterruptedException - { - _logger.info("Starting 2k test"); - _runnableWriterTest.startWriter(2048); - } - - public void test4k() throws IOException, InterruptedException - { - _logger.info("Starting 4k test"); - _runnableWriterTest.startWriter(4096); - } - - public void test8k() throws IOException, InterruptedException - { - _logger.info("Starting 8k test"); - _runnableWriterTest.startWriter(8192); - } - - public void test16k() throws IOException, InterruptedException - { - _logger.info("Starting 16k test"); - _runnableWriterTest.startWriter(16384); - } - - public void test32k() throws IOException, InterruptedException - { - _logger.info("Starting 32k test"); - _runnableWriterTest.startWriter(32768); - } - - public static void main(String[] args) throws IOException, InterruptedException - { - WriterTest w = new WriterTest(); - //w.test1k(); - //w.test2k(); - //w.test4k(); - w.test8k(); - //w.test16k(); - //w.test32k(); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(WriterTest.class); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/multiconsumer/AMQTest.java b/java/client/src/old_test/java/org/apache/qpid/multiconsumer/AMQTest.java deleted file mode 100644 index db02b9954a..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/multiconsumer/AMQTest.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * - * 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.qpid.multiconsumer; - -import java.io.ByteArrayOutputStream; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -import javax.jms.Connection; -import javax.jms.ExceptionListener; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.TextMessage; -import javax.jms.Topic; - -import junit.framework.TestCase; - -import org.apache.commons.codec.binary.Base64; -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.jms.Session; - -/** - * Test AMQ. - */ -public class AMQTest extends TestCase implements ExceptionListener -{ - - private final static String COMPRESSION_PROPNAME = "_MSGAPI_COMP"; - private final static String UTF8 = "UTF-8"; - private static final String SUBJECT = "test.amq"; - private static final String DUMMYCONTENT = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - private static final String HUGECONTENT; - - private AMQConnection connect = null; - private Session pubSession = null; - private Session subSession = null; - private Topic topic = null; - - static - { - StringBuilder sb = new StringBuilder(DUMMYCONTENT.length() * 115); - for (int i = 0; i < 100; i++) - { - sb.append(DUMMYCONTENT); - } - HUGECONTENT = sb.toString(); - } - - private void setup() throws Exception - { - connect = new AMQConnection("localhost", 5672, "guest", "guest", "client1", "/"); - connect.setExceptionListener(this); - pubSession = connect.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); - subSession = connect.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); - topic = new AMQTopic(pubSession.getDefaultTopicExchangeName(), new AMQShortString(SUBJECT)); - - connect.start(); - } - - public void testMultipleListeners() throws Exception - { - setup(); - try - { - // Create 5 listeners - MsgHandler[] listeners = new MsgHandler[5]; - for (int i = 0; i < listeners.length; i++) - { - listeners[i] = new MsgHandler(); - MessageConsumer subscriber = subSession.createConsumer(topic); - subscriber.setMessageListener(listeners[i]); - } - MessageProducer publisher = pubSession.createProducer(topic); - // Send a single message - TextMessage msg = pubSession.createTextMessage(); - msg.setText(DUMMYCONTENT); - publisher.send(msg); - Thread.sleep(5000); - // Check listeners to ensure they all got it - for (int i = 0; i < listeners.length; i++) - { - if (listeners[i].isGotIt()) - { - System.out.println("Got callback for listener " + i); - } - else - { - TestCase.fail("Listener " + i + " did not get callback"); - } - } - } - catch (Throwable e) - { - System.err.println("Error: " + e); - e.printStackTrace(System.err); - } - finally - { - close(); - } - } - - public void testCompression() throws Exception - { - setup(); - String comp = this.compressString(HUGECONTENT); - try - { - MsgHandler listener = new MsgHandler(); - MessageConsumer subscriber = subSession.createConsumer(topic); - subscriber.setMessageListener(listener); - MessageProducer publisher = pubSession.createProducer(topic); - - // Send a single message - TextMessage msg = pubSession.createTextMessage(); - // Set the compressed text - msg.setText(comp); - msg.setBooleanProperty(COMPRESSION_PROPNAME, true); - publisher.send(msg); - Thread.sleep(1000); - // Check listeners to ensure we got it - if (listener.isGotIt()) - { - System.out.println("Got callback for listener"); - } - else - { - TestCase.fail("Listener did not get callback"); - } - } - finally - { - close(); - } - } - - private void close() throws Exception - { - if (connect != null) - { - connect.close(); - } - } - - private class MsgHandler implements MessageListener - { - private boolean gotIt = false; - - public void onMessage(Message msg) - { - try - { - TextMessage textMessage = (TextMessage) msg; - String string = textMessage.getText(); - if (string != null && string.length() > 0) - { - gotIt = true; - } - if (textMessage.getBooleanProperty(COMPRESSION_PROPNAME)) - { - string = inflateString(string); - } - System.out.println("Got callback of size " + (string==null?0:string.length())); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - public boolean isGotIt() - { - return this.gotIt; - } - } - - private String compressString(String string) throws Exception - { - long start = System.currentTimeMillis(); - byte[] input = string.getBytes(); - Deflater compressor = new Deflater(Deflater.BEST_COMPRESSION); - compressor.setInput(input); - compressor.finish(); - - // Get byte array from output of compressor - ByteArrayOutputStream baos = new ByteArrayOutputStream(input.length); - byte[] buf = new byte[1024]; - while (!compressor.finished()) - { - int cnt = compressor.deflate(buf); - baos.write(buf, 0, cnt); - } - baos.close(); - byte[] output = baos.toByteArray(); - - // Convert byte array into String - byte[] base64 = Base64.encodeBase64(output); - String sComp = new String(base64, UTF8); - - long diff = System.currentTimeMillis() - start; - System.out.println("Compressed text from " + input.length + " to " - + sComp.getBytes().length + " in " + diff + " ms"); - System.out.println("Compressed text = '" + sComp + "'"); - - return sComp; - } - - private String inflateString(String string) throws Exception - { - byte[] input = string.getBytes(); - - // First convert Base64 string back to binary array - byte[] bytes = Base64.decodeBase64(input); - - // Set string as input data for decompressor - Inflater decompressor = new Inflater(); - decompressor.setInput(bytes); - - // Decompress the data - ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length); - byte[] buf = new byte[1024]; - while (!decompressor.finished()) - { - int count = decompressor.inflate(buf); - bos.write(buf, 0, count); - } - bos.close(); - byte[] output = bos.toByteArray(); - - // Get the decompressed data - return new String(output, UTF8); - } - - /** - * @see javax.jms.ExceptionListener#onException(javax.jms.JMSException) - */ - public void onException(JMSException e) - { - System.err.println(e.getMessage()); - e.printStackTrace(System.err); - } - - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestPublisher.java b/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestPublisher.java deleted file mode 100644 index 37b4ff1498..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestPublisher.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * 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.qpid.pubsub1; - -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.url.URLSyntaxException; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.jms.MessageProducer; -import org.apache.qpid.jms.Session; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.TextMessage; -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * A client that behaves as follows: - * <ul><li>Connects to a queue, whose name is specified as a cmd-line argument</li> - * <li>Creates a temporary queue</li> - * <li>Creates messages containing a property that is the name of the temporary queue</li> - * <li>Fires off a message on the original queue and waits for a response on the temporary queue</li> - * </ul> - * - */ -public class TestPublisher -{ - private static final Logger _log = Logger.getLogger(TestPublisher.class); - - private AMQConnection _connection; - - private Session _session; - - private class CallbackHandler implements MessageListener - { - private int _expectedMessageCount; - - private int _actualMessageCount; - - private long _startTime; - - public CallbackHandler(int expectedMessageCount, long startTime) - { - _expectedMessageCount = expectedMessageCount; - _startTime = startTime; - } - - public void onMessage(Message m) - { - if (_log.isDebugEnabled()) - { - _log.debug("Message received: " + m); - } - _actualMessageCount++; - if (_actualMessageCount%1000 == 0) - { - _log.info("Received message count: " + _actualMessageCount); - } - /*if (!"henson".equals(m.toString())) - { - _log.error("AbstractJMSMessage response not correct: expected 'henson' but got " + m.toString()); - } - else - { - if (_log.isDebugEnabled()) - { - _log.debug("AbstractJMSMessage " + m + " received"); - } - else - { - _log.info("AbstractJMSMessage received"); - } - } */ - - if (_actualMessageCount == _expectedMessageCount) - { - long timeTaken = System.currentTimeMillis() - _startTime; - System.out.println("Total time taken to receive " + _expectedMessageCount+ " messages was " + - timeTaken + "ms, equivalent to " + - (_expectedMessageCount/(timeTaken/1000.0)) + " messages per second"); - } - } - } - - public TestPublisher(String host, int port, String clientID, String commandQueueName, - final int messageCount) throws AMQException, URLSyntaxException - { - try - { - createConnection(host, port, clientID); - - _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - AMQTopic destination = new AMQTopic(_session.getDefaultTopicExchangeName(), new AMQShortString(commandQueueName)); - MessageProducer producer = (MessageProducer) _session.createProducer(destination); - - _connection.start(); - //TextMessage msg = _session.createTextMessage(tempDestination.getQueueName() + "/Presented to in conjunction with Mahnah Mahnah and the Snowths"); - final long startTime = System.currentTimeMillis(); - - for (int i = 0; i < messageCount; i++) - { - TextMessage msg = _session.createTextMessage(destination.getTopicName() + "/Presented to in conjunction with Mahnah Mahnah and the Snowths: " + i); - - //msg.setIntProperty("a",i % 2); - //msg.setIntProperty("b",i % 4); - - producer.send(msg); - } - _log.info("Finished sending " + messageCount + " messages"); - } - catch (JMSException e) - { - e.printStackTrace(); - } - } - - private void createConnection(String host, int port, String clientID) throws AMQException, URLSyntaxException - { - _connection = new AMQConnection(host, port, "guest", "guest", - clientID, "/test"); - } - - /** - * - * @param args argument 1 if present specifies the name of the temporary queue to create. Leaving it blank - * means the server will allocate a name. - */ - public static void main(String[] args) throws URLSyntaxException - { - if (args.length == 0) - { - System.err.println("Usage: TestPublisher <host> <port> <command queue name> <number of messages>"); - } - try - { - int port = Integer.parseInt(args[1]); - InetAddress address = InetAddress.getLocalHost(); - String clientID = address.getHostName() + System.currentTimeMillis(); - TestPublisher client = new TestPublisher(args[0], port, clientID, args[2], Integer.parseInt(args[3])); - } - catch (UnknownHostException e) - { - e.printStackTrace(); - } - catch (AMQException e) - { - System.err.println("Error in client: " + e); - e.printStackTrace(); - } - - //System.exit(0); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestSubscriber.java b/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestSubscriber.java deleted file mode 100644 index 450d9b3914..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/pubsub1/TestSubscriber.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * - * 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.qpid.pubsub1; - -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.jms.Session; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.Topic; -import java.net.InetAddress; - -public class TestSubscriber -{ - private static final Logger _logger = Logger.getLogger(TestSubscriber.class); - - private static class TestMessageListener implements MessageListener - { - private String _name; - - private int _expectedMessageCount; - - private int _messageCount; - - private long _startTime = 0; - - public TestMessageListener(String name, int expectedMessageCount) - { - _name = name; - _expectedMessageCount = expectedMessageCount; - } - - public void onMessage(javax.jms.Message message) - { - if (_messageCount++ == 0) - { - _startTime = System.currentTimeMillis(); - } - if (_logger.isInfoEnabled()) - { - _logger.info(_name + " got message '" + message + "'"); - } - if (_messageCount == _expectedMessageCount) - { - long totalTime = System.currentTimeMillis() - _startTime; - _logger.error(_name + ": Total time to receive " + _messageCount + " messages was " + - totalTime + "ms. Rate is " + (_messageCount/(totalTime/1000.0))); - } - if (_messageCount > _expectedMessageCount) - { - _logger.error("Oops! More messages received than expected (" + _messageCount + ")"); - } - } - } - - public static void main(String[] args) - { - _logger.info("Starting..."); - - if (args.length != 7) - { - System.out.println("Usage: host port username password virtual-path expectedMessageCount selector"); - System.exit(1); - } - try - { - InetAddress address = InetAddress.getLocalHost(); - AMQConnection con1 = new AMQConnection(args[0], Integer.parseInt(args[1]), args[2], args[3], - address.getHostName(), args[4]); - final Session session1 = con1.createSession(false, Session.AUTO_ACKNOWLEDGE); - - AMQConnection con2 = new AMQConnection(args[0], Integer.parseInt(args[1]), args[2], args[3], - address.getHostName(), args[4]); - final Session session2 = con2.createSession(false, Session.AUTO_ACKNOWLEDGE); - String selector = args[6]; - - final int expectedMessageCount = Integer.parseInt(args[5]); - _logger.info("Message selector is <" + selector + ">..."); - - Topic t = new AMQTopic(session1.getDefaultTopicExchangeName(), new AMQShortString("cbr")); - MessageConsumer consumer1 = session1.createConsumer(t, - 100, false, false, selector); - MessageConsumer consumer2 = session2.createConsumer(t, - 100, false, false, selector); - - consumer1.setMessageListener(new TestMessageListener("ML 1", expectedMessageCount)); - consumer2.setMessageListener(new TestMessageListener("ML 2", expectedMessageCount)); - con1.start(); - con2.start(); - } - catch (Throwable t) - { - System.err.println("Fatal error: " + t); - t.printStackTrace(); - } - - System.out.println("Waiting..."); - } -} - diff --git a/java/client/src/old_test/java/org/apache/qpid/test/unit/client/connection/TestManyConnections.java b/java/client/src/old_test/java/org/apache/qpid/test/unit/client/connection/TestManyConnections.java deleted file mode 100644 index f59b36166a..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/test/unit/client/connection/TestManyConnections.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.connection; - -import org.apache.qpid.AMQException; -import org.apache.qpid.url.URLSyntaxException; -import org.apache.qpid.client.AMQConnection; -import org.apache.log4j.Logger; - -import junit.framework.TestCase; - -public class TestManyConnections extends TestCase -{ - private static final Logger _log = Logger.getLogger(TestManyConnections.class); - - private AMQConnection[] _connections; - - private void createConnection(int index, String brokerHosts, String clientID, String username, String password, - String vpath) throws AMQException, URLSyntaxException - { - _connections[index] = new AMQConnection(brokerHosts, username, password, - clientID, vpath); - } - - private void createConnections(int count) throws AMQException, URLSyntaxException - { - _connections = new AMQConnection[count]; - long startTime = System.currentTimeMillis(); - for (int i = 0; i < count; i++) - { - createConnection(i, "vm://:1", "myClient" + i, "guest", "guest", "test"); - } - long endTime = System.currentTimeMillis(); - _log.info("Time to create " + count + " connections: " + (endTime - startTime) + - "ms"); - } - - public void testCreate10Connections() throws AMQException, URLSyntaxException - { - createConnections(10); - } - - public void testCreate50Connections() throws AMQException, URLSyntaxException - { - createConnections(50); - } - - public void testCreate100Connections() throws AMQException, URLSyntaxException - { - createConnections(100); - } - - public void testCreate250Connections() throws AMQException, URLSyntaxException - { - createConnections(250); - } - - public void testCreate500Connections() throws AMQException, URLSyntaxException - { - createConnections(500); - } - - public void testCreate1000Connections() throws AMQException, URLSyntaxException - { - createConnections(1000); - } - - public void testCreate5000Connections() throws AMQException, URLSyntaxException - { - createConnections(5000); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(TestManyConnections.class); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/PropertiesFileInitialContextFactoryTest.java b/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/PropertiesFileInitialContextFactoryTest.java deleted file mode 100644 index 5ab5722146..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/PropertiesFileInitialContextFactoryTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * - * 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.qpid.test.unit.jndi; - -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQTopic; - -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.naming.spi.InitialContextFactory; -import java.util.Properties; -import java.io.InputStream; - - -import junit.framework.TestCase; - -public class PropertiesFileInitialContextFactoryTest extends TestCase -{ - InitialContextFactory contextFactory; - Properties _properties; - Properties _fileProperties; - - protected void setUp() throws Exception - { - super.setUp(); - - //create simple set of hardcoded props - _properties = new Properties(); - _properties.put("java.naming.factory.initial", "org.apache.qpid.jndi.PropertiesFileInitialContextFactory"); - _properties.put("connectionfactory.local", "amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'"); - _properties.put("queue.MyQueue", "example.MyQueue"); - _properties.put("topic.ibmStocks", "stocks.nyse.ibm"); - _properties.put("destination.direct", "direct://amq.direct//directQueue"); - - //create properties from file as a more realistic test - _fileProperties = new Properties(); - ClassLoader cl = this.getClass().getClassLoader(); - InputStream is = cl.getResourceAsStream("org/apache/qpid/test/unit/jndi/example.properties"); - _fileProperties.load(is); - } - - /** - * Test using hardcoded properties - */ - public void testWithoutFile() - { - Context ctx = null; - - try - { - ctx = new InitialContext(_properties); - } - catch (NamingException ne) - { - fail("Error loading context:" + ne); - } - - checkPropertiesMatch(ctx, "Using hardcoded properties: "); - } - - /** - * Test using properties from example file - */ - public void testWithFile() - { - Context ctx = null; - - try - { - ctx = new InitialContext(_fileProperties); - } - catch (Exception e) - { - fail("Error loading context:" + e); - } - - checkPropertiesMatch(ctx, "Using properties from file: "); - } - - public void tearDown() - { - _properties = null; - _fileProperties = null; - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(PropertiesFileInitialContextFactoryTest.class); - } - - private void checkPropertiesMatch(Context ctx, String errorInfo) - { - try - { - AMQConnectionFactory cf = (AMQConnectionFactory) ctx.lookup("local"); - assertEquals("amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'", cf.getConnectionURL().toString()); - } - catch (NamingException ne) - { - fail(errorInfo + "Unable to create Connection Factory:" + ne); - } - - try - { - AMQQueue queue = (AMQQueue) ctx.lookup("MyQueue"); - assertEquals("example.MyQueue", queue.getRoutingKey().toString()); - } - catch (NamingException ne) - { - fail(errorInfo + "Unable to create queue:" + ne); - } - - try - { - AMQTopic topic = (AMQTopic) ctx.lookup("ibmStocks"); - assertEquals("stocks.nyse.ibm", topic.getTopicName().toString()); - } - catch (Exception ne) - { - fail(errorInfo + "Unable to create topic:" + ne); - } - - try - { - AMQQueue direct = (AMQQueue) ctx.lookup("direct"); - assertEquals("directQueue", direct.getRoutingKey().toString()); - } - catch (NamingException ne) - { - fail(errorInfo + "Unable to create direct destination:" + ne); - } - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/example.properties b/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/example.properties deleted file mode 100644 index ea9dc5ae0e..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/test/unit/jndi/example.properties +++ /dev/null @@ -1,38 +0,0 @@ -# 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. - -java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory - -# use the following property to configure the default connector -#java.naming.provider.url - ignored. - -# register some connection factories -# connectionfactory.[jndiname] = [ConnectionURL] -connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1' - -# register some queues in JNDI using the form -# queue.[jndiName] = [physicalName] -queue.MyQueue = example.MyQueue - -# register some topics in JNDI using the form -# topic.[jndiName] = [physicalName] -topic.ibmStocks = stocks.nyse.ibm - -# Register an AMQP destination in JNDI -# NOTE: Qpid currently only supports direct,topics and headers -# destination.[jniName] = [BindingURL] -destination.direct = direct://amq.direct//directQueue diff --git a/java/client/src/old_test/java/org/apache/qpid/topic/Config.java b/java/client/src/old_test/java/org/apache/qpid/topic/Config.java deleted file mode 100644 index bb740f9094..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/topic/Config.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * - * 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.qpid.topic; - -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.config.ConnectorConfig; -import org.apache.qpid.config.ConnectionFactoryInitialiser; -import org.apache.qpid.config.Connector; -import org.apache.qpid.config.AbstractConfig; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; - -class Config extends AbstractConfig implements ConnectorConfig -{ - - private String host = "localhost"; - private int port = 5672; - private String factory = null; - - private int payload = 256; - private int messages = 1000; - private int clients = 1; - private int batch = 1; - private long delay = 1; - private int warmup; - private int ackMode= AMQSession.NO_ACKNOWLEDGE; - private String clientId; - private String subscriptionId; - private boolean persistent; - - public Config() - { - } - - int getAckMode() - { - return ackMode; - } - - void setPayload(int payload) - { - this.payload = payload; - } - - int getPayload() - { - return payload; - } - - void setClients(int clients) - { - this.clients = clients; - } - - int getClients() - { - return clients; - } - - void setMessages(int messages) - { - this.messages = messages; - } - - int getMessages() - { - return messages; - } - - public String getHost() - { - return host; - } - - public void setHost(String host) - { - this.host = host; - } - - public int getPort() - { - return port; - } - - public String getFactory() - { - return factory; - } - - public void setPort(int port) - { - this.port = port; - } - - int getBatch() - { - return batch; - } - - void setBatch(int batch) - { - this.batch = batch; - } - - int getWarmup() - { - return warmup; - } - - void setWarmup(int warmup) - { - this.warmup = warmup; - } - - public long getDelay() - { - return delay; - } - - public void setDelay(long delay) - { - this.delay = delay; - } - - String getClientId() - { - return clientId; - } - - String getSubscriptionId() - { - return subscriptionId; - } - - boolean usePersistentMessages() - { - return persistent; - } - - public void setOption(String key, String value) - { - if("-host".equalsIgnoreCase(key)) - { - setHost(value); - } - else if("-port".equalsIgnoreCase(key)) - { - try - { - setPort(Integer.parseInt(value)); - } - catch(NumberFormatException e) - { - throw new RuntimeException("Bad port number: " + value); - } - } - else if("-payload".equalsIgnoreCase(key)) - { - setPayload(parseInt("Bad payload size", value)); - } - else if("-messages".equalsIgnoreCase(key)) - { - setMessages(parseInt("Bad message count", value)); - } - else if("-clients".equalsIgnoreCase(key)) - { - setClients(parseInt("Bad client count", value)); - } - else if("-batch".equalsIgnoreCase(key)) - { - setBatch(parseInt("Bad batch count", value)); - } - else if("-delay".equalsIgnoreCase(key)) - { - setDelay(parseLong("Bad batch delay", value)); - } - else if("-warmup".equalsIgnoreCase(key)) - { - setWarmup(parseInt("Bad warmup count", value)); - } - else if("-ack".equalsIgnoreCase(key)) - { - ackMode = parseInt("Bad ack mode", value); - } - else if("-factory".equalsIgnoreCase(key)) - { - factory = value; - } - else if("-clientId".equalsIgnoreCase(key)) - { - clientId = value; - } - else if("-subscriptionId".equalsIgnoreCase(key)) - { - subscriptionId = value; - } - else if("-persistent".equalsIgnoreCase(key)) - { - persistent = "true".equalsIgnoreCase(value); - } - else - { - System.out.println("Ignoring unrecognised option: " + key); - } - } - - static String getAckModeDescription(int ackMode) - { - switch(ackMode) - { - case AMQSession.NO_ACKNOWLEDGE: return "NO_ACKNOWLEDGE"; - case AMQSession.AUTO_ACKNOWLEDGE: return "AUTO_ACKNOWLEDGE"; - case AMQSession.CLIENT_ACKNOWLEDGE: return "CLIENT_ACKNOWLEDGE"; - case AMQSession.DUPS_OK_ACKNOWLEDGE: return "DUPS_OK_ACKNOWELDGE"; - case AMQSession.PRE_ACKNOWLEDGE: return "PRE_ACKNOWLEDGE"; - } - return "AckMode=" + ackMode; - } - - public Connection createConnection() throws Exception - { - return new Connector().createConnection(this); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/topic/Listener.java b/java/client/src/old_test/java/org/apache/qpid/topic/Listener.java deleted file mode 100644 index 47c608cfe4..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/topic/Listener.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * - * 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.qpid.topic; - -import javax.jms.Connection; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.Session; - -public class Listener implements MessageListener -{ - private final Connection _connection; - private final MessageProducer _controller; - private final javax.jms.Session _session; - private final MessageFactory _factory; - private boolean init; - private int count; - private long start; - - Listener(Connection connection, int ackMode) throws Exception - { - this(connection, ackMode, null); - } - - Listener(Connection connection, int ackMode, String name) throws Exception - { - _connection = connection; - _session = connection.createSession(false, ackMode); - _factory = new MessageFactory(_session); - - //register for events - if(name == null) - { - _factory.createTopicConsumer().setMessageListener(this); - } - else - { - _factory.createDurableTopicConsumer(name).setMessageListener(this); - } - - _connection.start(); - - _controller = _factory.createControlPublisher(); - System.out.println("Waiting for messages " + - Config.getAckModeDescription(ackMode) - + (name == null ? "" : " (subscribed with name " + name + " and client id " + connection.getClientID() + ")") - + "..."); - - } - - private void shutdown() - { - try - { - _session.close(); - _connection.stop(); - _connection.close(); - } - catch(Exception e) - { - e.printStackTrace(System.out); - } - } - - private void report() - { - try - { - String msg = getReport(); - _controller.send(_factory.createReportResponseMessage(msg)); - System.out.println("Sent report: " + msg); - } - catch(Exception e) - { - e.printStackTrace(System.out); - } - } - - private String getReport() - { - long time = (System.currentTimeMillis() - start); - return "Received " + count + " in " + time + "ms"; - } - - public void onMessage(Message message) - { - if(!init) - { - start = System.currentTimeMillis(); - count = 0; - init = true; - } - - if(_factory.isShutdown(message)) - { - shutdown(); - } - else if(_factory.isReport(message)) - { - //send a report: - report(); - init = false; - } - else if (++count % 100 == 0) - { - System.out.println("Received " + count + " messages."); - } - } - - public static void main(String[] argv) throws Exception - { - Config config = new Config(); - config.setOptions(argv); - - Connection con = config.createConnection(); - if(config.getClientId() != null) - { - con.setClientID(config.getClientId()); - } - new Listener(con, config.getAckMode(), config.getSubscriptionId()); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/topic/MessageFactory.java b/java/client/src/old_test/java/org/apache/qpid/topic/MessageFactory.java deleted file mode 100644 index 39d64069d1..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/topic/MessageFactory.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * - * 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.qpid.topic; - -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.client.AMQTopic; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; - -import javax.jms.*; - -/** - */ -class MessageFactory -{ - private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - - private final Session _session; - private final Topic _topic; - private final Topic _control; - private final byte[] _payload; - - - MessageFactory(Session session) throws JMSException - { - this(session, 256); - } - - MessageFactory(Session session, int size) throws JMSException - { - _session = session; - if(session instanceof AMQSession) - { - _topic = new AMQTopic(((AMQSession)session).getDefaultTopicExchangeName(),new AMQShortString("topictest.messages")); - _control = new AMQTopic(((AMQSession)session).getDefaultTopicExchangeName(),new AMQShortString("topictest.control")); - } - else - { - _topic = session.createTopic("topictest.messages"); - _control = session.createTopic("topictest.control"); - } - _payload = new byte[size]; - - for(int i = 0; i < size; i++) - { - _payload[i] = (byte) DATA[i % DATA.length]; - } - } - - Topic getTopic() - { - return _topic; - } - - Message createEventMessage() throws JMSException - { - BytesMessage msg = _session.createBytesMessage(); - msg.writeBytes(_payload); - return msg; - } - - Message createShutdownMessage() throws JMSException - { - return _session.createTextMessage("SHUTDOWN"); - } - - Message createReportRequestMessage() throws JMSException - { - return _session.createTextMessage("REPORT"); - } - - Message createReportResponseMessage(String msg) throws JMSException - { - return _session.createTextMessage(msg); - } - - boolean isShutdown(Message m) - { - return checkText(m, "SHUTDOWN"); - } - - boolean isReport(Message m) - { - return checkText(m, "REPORT"); - } - - Object getReport(Message m) - { - try - { - return ((TextMessage) m).getText(); - } - catch (JMSException e) - { - e.printStackTrace(System.out); - return e.toString(); - } - } - - MessageConsumer createTopicConsumer() throws Exception - { - return _session.createConsumer(_topic); - } - - MessageConsumer createDurableTopicConsumer(String name) throws Exception - { - return _session.createDurableSubscriber(_topic, name); - } - - MessageConsumer createControlConsumer() throws Exception - { - return _session.createConsumer(_control); - } - - MessageProducer createTopicPublisher() throws Exception - { - return _session.createProducer(_topic); - } - - MessageProducer createControlPublisher() throws Exception - { - return _session.createProducer(_control); - } - - private static boolean checkText(Message m, String s) - { - try - { - return m instanceof TextMessage && ((TextMessage) m).getText().equals(s); - } - catch (JMSException e) - { - e.printStackTrace(System.out); - return false; - } - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/topic/Publisher.java b/java/client/src/old_test/java/org/apache/qpid/topic/Publisher.java deleted file mode 100644 index d788029ee9..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/topic/Publisher.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * - * 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.qpid.topic; - -import javax.jms.*; - -public class Publisher implements MessageListener -{ - private final Object _lock = new Object(); - private final Connection _connection; - private final Session _session; - private final MessageFactory _factory; - private final MessageProducer _publisher; - private int _count; - - Publisher(Connection connection, int size, int ackMode, boolean persistent) throws Exception - { - _connection = connection; - _session = _connection.createSession(false, ackMode); - _factory = new MessageFactory(_session, size); - _publisher = _factory.createTopicPublisher(); - _publisher.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT); - System.out.println("Publishing " + (persistent ? "persistent" : "non-persistent") + " messages of " + size + " bytes, " + Config.getAckModeDescription(ackMode) + "."); - } - - private void test(Config config) throws Exception - { - test(config.getBatch(), config.getDelay(), config.getMessages(), config.getClients(), config.getWarmup()); - } - - private void test(int batches, long delay, int msgCount, int consumerCount, int warmup) throws Exception - { - _factory.createControlConsumer().setMessageListener(this); - _connection.start(); - - if(warmup > 0) - { - System.out.println("Runing warmup (" + warmup + " msgs)"); - long time = batch(warmup, consumerCount); - System.out.println("Warmup completed in " + time + "ms"); - } - - long[] times = new long[batches]; - for(int i = 0; i < batches; i++) - { - if(i > 0) Thread.sleep(delay*1000); - times[i] = batch(msgCount, consumerCount); - System.out.println("Batch " + (i+1) + " of " + batches + " completed in " + times[i] + " ms."); - } - - long min = min(times); - long max = max(times); - System.out.println("min: " + min + ", max: " + max + " avg: " + avg(times, min, max)); - - //request shutdown - _publisher.send(_factory.createShutdownMessage()); - - _connection.stop(); - _connection.close(); - } - - private long batch(int msgCount, int consumerCount) throws Exception - { - _count = consumerCount; - long start = System.currentTimeMillis(); - publish(msgCount); - waitForCompletion(consumerCount); - return System.currentTimeMillis() - start; - } - - private void publish(int count) throws Exception - { - - //send events - for (int i = 0; i < count; i++) - { - _publisher.send(_factory.createEventMessage()); - if ((i + 1) % 100 == 0) - { - System.out.println("Sent " + (i + 1) + " messages"); - } - } - - //request report - _publisher.send(_factory.createReportRequestMessage()); - } - - private void waitForCompletion(int consumers) throws Exception - { - System.out.println("Waiting for completion..."); - synchronized (_lock) - { - while (_count > 0) - { - _lock.wait(); - } - } - } - - - public void onMessage(Message message) - { - System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining"); - if (_count == 0) - { - synchronized (_lock) - { - _lock.notify(); - } - } - } - - static long min(long[] times) - { - long min = times.length > 0 ? times[0] : 0; - for(int i = 0; i < times.length; i++) - { - min = Math.min(min, times[i]); - } - return min; - } - - static long max(long[] times) - { - long max = times.length > 0 ? times[0] : 0; - for(int i = 0; i < times.length; i++) - { - max = Math.max(max, times[i]); - } - return max; - } - - static long avg(long[] times, long min, long max) - { - long sum = 0; - for(int i = 0; i < times.length; i++) - { - sum += times[i]; - } - sum -= min; - sum -= max; - - return (sum / (times.length - 2)); - } - - public static void main(String[] argv) throws Exception - { - Config config = new Config(); - config.setOptions(argv); - - Connection con = config.createConnection(); - int size = config.getPayload(); - int ackMode = config.getAckMode(); - boolean persistent = config.usePersistentMessages(); - new Publisher(con, size, ackMode, persistent).test(config); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/transacted/Config.java b/java/client/src/old_test/java/org/apache/qpid/transacted/Config.java deleted file mode 100644 index bd104e5407..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/transacted/Config.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * - * 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.qpid.transacted; - -import org.apache.qpid.config.ConnectorConfig; -import org.apache.qpid.config.AbstractConfig; -import org.apache.qpid.config.Connector; - -import javax.jms.Connection; - -class Config extends AbstractConfig implements ConnectorConfig -{ - private String host = "localhost"; - private int port = 5672; - private String factory; - private boolean echo; - private int batch = 100; - private boolean persistent = true; - - Config(String[] argv) - { - setOptions(argv); - } - - Connection createConnection() throws Exception - { - return new Connector().createConnection(this); - } - - public boolean isEchoOn() - { - return echo; - } - - public boolean usePersistentMessages() - { - return persistent; - } - - public int getBatchSize() - { - return batch; - } - - public String getHost() - { - return host; - } - - public int getPort() - { - return port; - } - - public String getFactory() - { - return factory; - } - - public void setOption(String key, String value) - { - if("-host".equalsIgnoreCase(key)) - { - host = value; - } - else if("-port".equalsIgnoreCase(key)) - { - port = parseInt("Bad port number", value); - } - else if("-factory".equalsIgnoreCase(key)) - { - factory = value; - } - else if("-echo".equalsIgnoreCase(key)) - { - echo = "true".equalsIgnoreCase(value); - } - else if("-persistent".equalsIgnoreCase(key)) - { - persistent = "true".equalsIgnoreCase(value); - } - else if("-batch".equalsIgnoreCase(key)) - { - batch = parseInt("Bad batch size", value); - } - else - { - System.out.println("Ignoring nrecognised option " + key); - } - } - -} diff --git a/java/client/src/old_test/java/org/apache/qpid/transacted/Ping.java b/java/client/src/old_test/java/org/apache/qpid/transacted/Ping.java deleted file mode 100644 index 8f15bf089e..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/transacted/Ping.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * 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.qpid.transacted; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.client.AMQQueue; - -import javax.jms.Connection; -import javax.jms.JMSException; -import java.util.Arrays; - -public class Ping -{ - public static void main(String[] argv) throws Exception - { - Config config = new Config(argv); - Connection con = config.createConnection(); - con.setClientID("ping"); - new Relay(new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString("ping")), new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString("pong")), con, - config.isEchoOn(), - config.getBatchSize(), - config.usePersistentMessages()).start(); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/transacted/Pong.java b/java/client/src/old_test/java/org/apache/qpid/transacted/Pong.java deleted file mode 100644 index f4f4b20d7c..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/transacted/Pong.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * 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.qpid.transacted; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.client.AMQQueue; - -import javax.jms.Connection; -import javax.jms.JMSException; - -public class Pong -{ - public static void main(String[] argv) throws Exception - { - Config config = new Config(argv); - Connection con = config.createConnection(); - con.setClientID("pong"); - new Relay(new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString("pong")), new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString("ping")), con, - config.isEchoOn(), - config.getBatchSize(), - config.usePersistentMessages()).start(); - - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/transacted/Relay.java b/java/client/src/old_test/java/org/apache/qpid/transacted/Relay.java deleted file mode 100644 index cede95e5f0..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/transacted/Relay.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * - * 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.qpid.transacted; - -import org.apache.qpid.client.AMQSession; - -import javax.jms.MessageProducer; -import javax.jms.MessageConsumer; -import javax.jms.Session; -import javax.jms.Destination; -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.TextMessage; -import javax.jms.DeliveryMode; - -class Relay implements Runnable -{ - private final Connection _con; - private final Session _session; - private final MessageConsumer _src; - private final MessageProducer _dest; - private final int _batch; - private final boolean _echo; - private int _counter; - private long start; - private boolean _running; - - Relay(Destination src, Destination dest, Connection con) throws JMSException - { - this(src, dest, con, false, 100, true); - } - - Relay(Destination src, Destination dest, Connection con, boolean echo, int batch, boolean persistent) throws JMSException - { - _echo = echo; - _batch = batch; - _con = con; - _session = con.createSession(true, AMQSession.NO_ACKNOWLEDGE); - _src = _session.createConsumer(src); - _dest = _session.createProducer(dest); - _dest.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT); - - } - - public void run() - { - start = System.currentTimeMillis(); - try{ - while(true) relay(); - } - catch(JMSException e) - { - e.printStackTrace(); - } - try - { - _session.close(); - } - catch (JMSException e) - { - e.printStackTrace(); - } - } - - void relay() throws JMSException - { - _dest.send(relay(_src.receive())); - _session.commit(); - } - - Message relay(Message in) throws JMSException - { - if(!_running) - { - System.out.println(_con.getClientID() + " started."); - _running = true; - } - if(++_counter % _batch == 0) - { - long time = System.currentTimeMillis() - start; - System.out.println(_batch + " iterations performed in " + time + " ms"); - try - { - Thread.sleep(100); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - start = System.currentTimeMillis(); - } - if(_echo) - { - System.out.println("Received: " + ((TextMessage) in).getText()); - } - return _session.createTextMessage(_con.getClientID() + _counter); - } - - void start() throws InterruptedException, JMSException - { - Thread runner = new Thread(this); - runner.start(); - _con.start(); - System.out.println(_con.getClientID() + " waiting..."); - runner.join(); - _con.close(); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/transacted/Start.java b/java/client/src/old_test/java/org/apache/qpid/transacted/Start.java deleted file mode 100644 index de718d828a..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/transacted/Start.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * 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.qpid.transacted; - -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.client.AMQQueue; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Session; - -public class Start -{ - public static void main(String[] argv) throws Exception - { - Connection con = new Config(argv).createConnection(); - AMQQueue ping = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, new AMQShortString("ping")); - Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); - session.createProducer(ping).send(session.createTextMessage("start")); - session.close(); - con.close(); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceProvider.java b/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceProvider.java deleted file mode 100644 index 71d806b338..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceProvider.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * - * 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.qpid.weblogic; - -import org.apache.log4j.Logger; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQDestination; - -import javax.jms.*; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.naming.Context; -import java.net.InetAddress; -import java.util.Hashtable; - -public class ServiceProvider -{ - private static final String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; - private static final String JMS_FACTORY = "transientJMSConnectionFactory"; - - private static final Logger _logger = Logger.getLogger(ServiceProvider.class); - - private static MessageProducer _destinationProducer; - - private static Queue _destinationQ; - - public static void main(String[] args) - { - _logger.info("Starting..."); - - if (args.length != 2) - { - System.out.println("Usage: <WLS URI> <service queue>"); - System.exit(1); - } - try - { - String url = args[0]; - String receiveQueue = args[1]; - - final InitialContext ctx = getInitialContext(url); - - QueueConnectionFactory qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); - QueueConnection qcon = qconFactory.createQueueConnection(); - final QueueSession qsession = qcon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); - Queue receiveQ = (Queue) ctx.lookup(receiveQueue); - - _logger.info("Service (queue) name is '" + receiveQ + "'..."); - - String selector = (args.length > 2 && args[2] != null && args[2].length() > 1) ? args[2] : null; - - _logger.info("Message selector is <" + selector + ">..."); - - MessageConsumer consumer = qsession.createConsumer(receiveQ, selector); - - consumer.setMessageListener(new MessageListener() - { - private int _messageCount; - - public void onMessage(javax.jms.Message message) - { - //_logger.info("Got message '" + message + "'"); - - TextMessage tm = (TextMessage) message; - - try - { - Queue responseQueue = (Queue)tm.getJMSReplyTo(); - if (!responseQueue.equals(_destinationQ)) - { - _destinationQ = responseQueue; - _logger.info("Creating destination for " + responseQueue); - - try - { - _destinationProducer = qsession.createProducer(_destinationQ); - _destinationProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); - } - catch (JMSException e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - _messageCount++; - if (_messageCount % 1000 == 0) - { - _logger.info("Received message total: " + _messageCount); - _logger.info("Sending response to '" + responseQueue + "'"); - } - - String payload = "This is a response: sing together: 'Mahnah mahnah...'" + tm.getText(); - TextMessage msg = qsession.createTextMessage(payload); - if (tm.propertyExists("timeSent")) - { - _logger.info("timeSent property set on message"); - final long timeSent = tm.getLongProperty("timeSent"); - msg.setLongProperty("timeSent", timeSent); - _logger.info("time taken to go from service request to provider is: " + (System.currentTimeMillis() - timeSent)); - } - _destinationProducer.send(msg); - if (_messageCount % 1000 == 0) - { - tm.acknowledge(); - _logger.info("Sent response to '" + responseQueue + "'"); - } - } - catch (JMSException e) - { - _logger.error("Error sending message: " + e, e); - } - } - }); - qcon.start(); - } - catch (Throwable t) - { - System.err.println("Fatal error: " + t); - t.printStackTrace(); - } - - - System.out.println("Waiting..."); - } - - private static InitialContext getInitialContext(String url) throws NamingException - { - Hashtable env = new Hashtable(); - env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); - env.put(Context.PROVIDER_URL, url); - return new InitialContext(env); - } -} diff --git a/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceRequestingClient.java b/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceRequestingClient.java deleted file mode 100644 index 2f64a1dde5..0000000000 --- a/java/client/src/old_test/java/org/apache/qpid/weblogic/ServiceRequestingClient.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * 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.qpid.weblogic; - -import org.apache.log4j.Logger; - -import javax.jms.*; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.util.Hashtable; - -/** - * Created by IntelliJ IDEA. - * User: U806869 - * Date: 28-May-2005 - * Time: 21:54:51 - * To change this template use File | Settings | File Templates. - */ -public class ServiceRequestingClient -{ - private static final Logger _log = Logger.getLogger(ServiceRequestingClient.class); - private static final String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; - private static final String JMS_FACTORY = "transientJMSConnectionFactory"; - - private static class CallbackHandler implements MessageListener - { - private int _expectedMessageCount; - - private int _actualMessageCount; - - private long _startTime; - - private long _averageLatency; - - public CallbackHandler(int expectedMessageCount, long startTime) - { - _expectedMessageCount = expectedMessageCount; - _startTime = startTime; - } - - public void onMessage(Message m) - { - if (_log.isDebugEnabled()) - { - _log.debug("Message received: " + m); - } - try - { - if (m.propertyExists("timeSent")) - { - long timeSent = m.getLongProperty("timeSent"); - long now = System.currentTimeMillis(); - if (_averageLatency == 0) - { - _averageLatency = now - timeSent; - _log.info("Latency " + _averageLatency); - } - else - { - _log.info("Individual latency: " + (now-timeSent)); - _averageLatency = (_averageLatency + (now - timeSent))/2; - _log.info("Average latency now: " + _averageLatency); - } - } - } - catch (JMSException e) - { - _log.error("Could not calculate latency"); - } - - _actualMessageCount++; - if (_actualMessageCount%1000 == 0) - { - try - { - m.acknowledge(); - } - catch (JMSException e) - { - _log.error("Error acknowledging message"); - } - _log.info("Received message count: " + _actualMessageCount); - } - /*if (!"henson".equals(m.toString())) - { - _log.error("Message response not correct: expected 'henson' but got " + m.toString()); - } - else - { - if (_log.isDebugEnabled()) - { - _log.debug("Message " + m + " received"); - } - else - { - _log.info("Message received"); - } - } */ - - if (_actualMessageCount == _expectedMessageCount) - { - long timeTaken = System.currentTimeMillis() - _startTime; - System.out.println("Total time taken to receive " + _expectedMessageCount+ " messages was " + - timeTaken + "ms, equivalent to " + - (_expectedMessageCount/(timeTaken/1000.0)) + " messages per second"); - System.out.println("Average latency is: " + _averageLatency); - } - } - } - - public static void main(String[] args) throws Exception - { - if (args.length != 3) - { - System.out.println("Usage: IXPublisher <WLS URL> <sendQueue> <count> will publish count messages to "); - System.out.println("queue sendQueue and waits for a response on a temp queue"); - System.exit(1); - } - - String url = args[0]; - String sendQueue = args[1]; - int messageCount = Integer.parseInt(args[2]); - - InitialContext ctx = getInitialContext(url); - - QueueConnectionFactory qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); - QueueConnection qcon = qconFactory.createQueueConnection(); - QueueSession qsession = qcon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); - Queue sendQ = (Queue) ctx.lookup(sendQueue); - Queue receiveQ = qsession.createTemporaryQueue(); - QueueSender qsender = qsession.createSender(sendQ); - qsender.setDeliveryMode(DeliveryMode.NON_PERSISTENT); - _log.debug("Queue sender created for service queue " + sendQ); - - javax.jms.MessageConsumer messageConsumer = (javax.jms.MessageConsumer) qsession.createConsumer(receiveQ); - - //TextMessage msg = _session.createTextMessage(tempDestination.getQueueName() + "/Presented to in conjunction with Mahnah Mahnah and the Snowths"); - final long startTime = System.currentTimeMillis(); - - messageConsumer.setMessageListener(new CallbackHandler(messageCount, startTime)); - qcon.start(); - for (int i = 0; i < messageCount; i++) - { - TextMessage msg = qsession.createTextMessage("/Presented to in conjunction with Mahnah Mahnah and the Snowths:" + i); - msg.setJMSReplyTo(receiveQ); - if (i%1000 == 0) - { - long timeNow = System.currentTimeMillis(); - msg.setLongProperty("timeSent", timeNow); - } - qsender.send(msg); - } - - new Thread("foo").start(); - //qsession.close(); - //qcon.close(); - } - - private static InitialContext getInitialContext(String url) throws NamingException - { - Hashtable env = new Hashtable(); - env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); - env.put(Context.PROVIDER_URL, url); - return new InitialContext(env); - } -} diff --git a/java/client/src/test/java/org/apache/mina/transport/vmpipe/support/VmPipeIdleStatusChecker.java b/java/client/src/test/java/org/apache/mina/transport/vmpipe/support/VmPipeIdleStatusChecker.java deleted file mode 100644 index 5323ad28bf..0000000000 --- a/java/client/src/test/java/org/apache/mina/transport/vmpipe/support/VmPipeIdleStatusChecker.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * - * 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.mina.transport.vmpipe.support; - -import org.apache.mina.common.IdleStatus; - -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.Map; - -/** - * This file is a patch to override MINA, because of the IdentityHashMap bug. Workaround to be supplied in MINA 1.0.7. - * This patched file will be removed once upgraded onto a newer MINA. - * - * Dectects idle sessions and fires <tt>sessionIdle</tt> events to them. - * - * @author The Apache Directory Project (mina-dev@directory.apache.org) - */ -public class VmPipeIdleStatusChecker -{ - private static final VmPipeIdleStatusChecker INSTANCE = new VmPipeIdleStatusChecker(); - - public static VmPipeIdleStatusChecker getInstance() - { - return INSTANCE; - } - - private final Map sessions = new HashMap(); // will use as a set - - private final Worker worker = new Worker(); - - private VmPipeIdleStatusChecker() - { - worker.start(); - } - - public void addSession(VmPipeSessionImpl session) - { - synchronized (sessions) - { - sessions.put(session, session); - } - } - - private class Worker extends Thread - { - private Worker() - { - super("VmPipeIdleStatusChecker"); - setDaemon(true); - } - - public void run() - { - for (;;) - { - try - { - Thread.sleep(1000); - } - catch (InterruptedException e) - { } - - long currentTime = System.currentTimeMillis(); - - synchronized (sessions) - { - Iterator it = sessions.keySet().iterator(); - while (it.hasNext()) - { - VmPipeSessionImpl session = (VmPipeSessionImpl) it.next(); - if (!session.isConnected()) - { - it.remove(); - } - else - { - notifyIdleSession(session, currentTime); - } - } - } - } - } - } - - private void notifyIdleSession(VmPipeSessionImpl session, long currentTime) - { - notifyIdleSession0(session, currentTime, session.getIdleTimeInMillis(IdleStatus.BOTH_IDLE), IdleStatus.BOTH_IDLE, - Math.max(session.getLastIoTime(), session.getLastIdleTime(IdleStatus.BOTH_IDLE))); - notifyIdleSession0(session, currentTime, session.getIdleTimeInMillis(IdleStatus.READER_IDLE), IdleStatus.READER_IDLE, - Math.max(session.getLastReadTime(), session.getLastIdleTime(IdleStatus.READER_IDLE))); - notifyIdleSession0(session, currentTime, session.getIdleTimeInMillis(IdleStatus.WRITER_IDLE), IdleStatus.WRITER_IDLE, - Math.max(session.getLastWriteTime(), session.getLastIdleTime(IdleStatus.WRITER_IDLE))); - } - - private void notifyIdleSession0(VmPipeSessionImpl session, long currentTime, long idleTime, IdleStatus status, - long lastIoTime) - { - if ((idleTime > 0) && (lastIoTime != 0) && ((currentTime - lastIoTime) >= idleTime)) - { - session.increaseIdleCount(status); - session.getFilterChain().fireSessionIdle(session, status); - } - } - -} diff --git a/java/client/src/test/java/org/apache/qpid/client/AMQQueueTest.java b/java/client/src/test/java/org/apache/qpid/client/AMQQueueTest.java deleted file mode 100644 index 7789f87ace..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/AMQQueueTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.framing.AMQShortString; - -import junit.framework.TestCase; - -public class AMQQueueTest extends TestCase -{ - AMQShortString exchange = new AMQShortString("test.exchange"); - AMQShortString routingkey = new AMQShortString("test-route"); - AMQShortString qname = new AMQShortString("test-queue"); - AMQShortString[] oneBinding = new AMQShortString[]{new AMQShortString("bindingA")}; - AMQShortString[] bindings = new AMQShortString[]{new AMQShortString("bindingB"), - new AMQShortString("bindingC")}; - - public void testToURLNoBindings() - { - AMQQueue dest = new AMQQueue(exchange, routingkey, qname); - String url = dest.toURL(); - assertEquals("direct://test.exchange/test-route/test-queue?routingkey='test-route'", url); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java b/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java deleted file mode 100644 index da44822ec3..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/MockAMQConnection.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * 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.qpid.client; - -import org.apache.qpid.AMQException; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.framing.ProtocolVersion; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.url.URLSyntaxException; - -import java.io.IOException; - -public class MockAMQConnection extends AMQConnection -{ - public MockAMQConnection(String broker, String username, String password, String clientName, String virtualHost) - throws AMQException, URLSyntaxException - { - super(broker, username, password, clientName, virtualHost); - } - - public MockAMQConnection(String broker, String username, String password, String clientName, String virtualHost, SSLConfiguration sslConfig) - throws AMQException, URLSyntaxException - { - super(broker, username, password, clientName, virtualHost, sslConfig); - } - - public MockAMQConnection(String host, int port, String username, String password, String clientName, String virtualHost) - throws AMQException, URLSyntaxException - { - super(host, port, username, password, clientName, virtualHost); - } - - public MockAMQConnection(String host, int port, String username, String password, String clientName, String virtualHost, SSLConfiguration sslConfig) - throws AMQException, URLSyntaxException - { - super(host, port, username, password, clientName, virtualHost, sslConfig); - } - - public MockAMQConnection(String host, int port, boolean useSSL, String username, String password, String clientName, String virtualHost, SSLConfiguration sslConfig) - throws AMQException, URLSyntaxException - { - super(host, port, useSSL, username, password, clientName, virtualHost, sslConfig); - } - - public MockAMQConnection(String connection) - throws AMQException, URLSyntaxException - { - super(connection); - } - - public MockAMQConnection(String connection, SSLConfiguration sslConfig) - throws AMQException, URLSyntaxException - { - super(connection, sslConfig); - } - - public MockAMQConnection(ConnectionURL connectionURL, SSLConfiguration sslConfig) - throws AMQException - { - super(connectionURL, sslConfig); - } - - protected MockAMQConnection(String username, String password, String clientName, String virtualHost) - { - super(username, password, clientName, virtualHost); - } - - @Override - public ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws IOException - { - _connected = true; - _protocolHandler.getStateManager().changeState(AMQState.CONNECTION_OPEN); - return null; - } -} diff --git a/java/client/src/test/java/org/apache/qpid/client/message/AbstractJMSMessageTest.java b/java/client/src/test/java/org/apache/qpid/client/message/AbstractJMSMessageTest.java deleted file mode 100644 index f81f482c6a..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/message/AbstractJMSMessageTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.apache.qpid.client.message; -/* - * - * 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. - * - */ - - -import javax.jms.JMSException; - -import junit.framework.TestCase; - -public class AbstractJMSMessageTest extends TestCase -{ - - public void testSetNullJMSReplyTo08() throws JMSException - { - JMSTextMessage message = new JMSTextMessage(AMQMessageDelegateFactory.FACTORY_0_8); - try - { - message.setJMSReplyTo(null); - } - catch (IllegalArgumentException e) - { - fail("Null destination should be allowed"); - } - } - - public void testSetNullJMSReplyTo10() throws JMSException - { - JMSTextMessage message = new JMSTextMessage(AMQMessageDelegateFactory.FACTORY_0_10); - try - { - message.setJMSReplyTo(null); - } - catch (IllegalArgumentException e) - { - fail("Null destination should be allowed"); - } - } - -} diff --git a/java/client/src/test/java/org/apache/qpid/client/message/TestMessageHelper.java b/java/client/src/test/java/org/apache/qpid/client/message/TestMessageHelper.java deleted file mode 100644 index 7ee991b63c..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/message/TestMessageHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * 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.qpid.client.message; - -import javax.jms.JMSException; - -public class TestMessageHelper -{ - public static JMSTextMessage newJMSTextMessage() throws JMSException - { - return new JMSTextMessage(AMQMessageDelegateFactory.FACTORY_0_8); - } - - public static JMSBytesMessage newJMSBytesMessage() throws JMSException - { - return new JMSBytesMessage(AMQMessageDelegateFactory.FACTORY_0_8); - } - - public static JMSMapMessage newJMSMapMessage() throws JMSException - { - return new JMSMapMessage(AMQMessageDelegateFactory.FACTORY_0_8); - } - - public static JMSStreamMessage newJMSStreamMessage() - { - return new JMSStreamMessage(AMQMessageDelegateFactory.FACTORY_0_8); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/client/protocol/AMQProtocolHandlerTest.java b/java/client/src/test/java/org/apache/qpid/client/protocol/AMQProtocolHandlerTest.java deleted file mode 100644 index f520a21ba0..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/protocol/AMQProtocolHandlerTest.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import junit.framework.TestCase; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.AMQBody; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.framing.amqp_8_0.BasicRecoverOkBodyImpl; -import org.apache.qpid.AMQException; -import org.apache.qpid.protocol.AMQConstant; -import org.apache.qpid.transport.TestNetworkDriver; -import org.apache.qpid.client.MockAMQConnection; -import org.apache.qpid.client.AMQAuthenticationException; -import org.apache.qpid.client.state.AMQState; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -/** - * This is a test address QPID-1431 where frame listeners would fail to be notified of an incomming exception. - * - * Currently we do checks at the Session level to ensure that the connection/session are open. However, it is possible - * for the connection to close AFTER this check has been performed. - * - * Performing a similar check at the frameListener level in AMQProtocolHandler makes most sence as this will prevent - * listening when there can be no returning frames. - * - * With the correction in place it also means that the new listener will either make it on to the list for notification - * or it will be notified of any existing exception due to the connection being closed. - * - * There may still be an issue in this space if the client utilises a second thread to close the session as there will - * be no exception set to throw and so the wait will occur. That said when the session is closed the framelisteners - * should be notified. Not sure this is tested. - */ -public class AMQProtocolHandlerTest extends TestCase -{ - private static final Logger _logger = LoggerFactory.getLogger(AMQProtocolHandlerTest.class); - - // The handler to test - AMQProtocolHandler _handler; - - // A frame to block upon whilst waiting the exception - AMQFrame _blockFrame; - - // Latch to know when the listener receives an exception - private CountDownLatch _handleCountDown; - // The listener that will receive an exception - BlockToAccessFrameListener _listener; - - @Override - public void setUp() throws Exception - { - //Create a new ProtocolHandler with a fake connection. - _handler = new AMQProtocolHandler(new MockAMQConnection("amqp://guest:guest@client/test?brokerlist='vm://:1'")); - _handler.setNetworkDriver(new TestNetworkDriver()); - AMQBody body = BasicRecoverOkBodyImpl.getFactory().newInstance(null, 1); - _blockFrame = new AMQFrame(0, body); - - _handleCountDown = new CountDownLatch(1); - - _logger.info("Creating _Listener that should also receive the thrown exception."); - _listener = new BlockToAccessFrameListener(1); - } - - /** - * There are two paths based on the type of exception thrown. - * - * This tests that when an AMQException is thrown we get the same type of AMQException back with the real exception - * wrapped as the cause. - * - * @throws InterruptedException - if we are unable to wait for the test signals - */ - public void testFrameListenerUpdateWithAMQException() throws InterruptedException - { - AMQException trigger = new AMQAuthenticationException(AMQConstant.ACCESS_REFUSED, - "AMQPHTest", new RuntimeException()); - - performWithException(trigger); - - - AMQException receivedException = (AMQException) _listener.getReceivedException(); - - assertEquals("Return exception was not the expected type", - AMQAuthenticationException.class, receivedException.getClass()); - - assertEquals("The _Listener did not receive the correct error code", - trigger.getErrorCode(), receivedException.getErrorCode()); - } - - /** - * There are two paths based on the type of exception thrown. - * - * This tests that when a generic Exception is thrown we get the exception back wrapped in a AMQException - * as the cause. - * @throws InterruptedException - if we are unable to wait for the test signals - */ - public void testFrameListenerUpdateWithException() throws InterruptedException - { - - Exception trigger = new Exception(new RuntimeException()); - - performWithException(trigger); - - assertEquals("The _Listener did not receive the correct error code", - AMQConstant.INTERNAL_ERROR, ((AMQException)_listener.getReceivedException()).getErrorCode()); - } - - /** - * This is the main test method for both test cases. - * - * What occurs is that we create a new thread that will block (<30s[DEFAULT]) for a frame or exception to occur . - * - * We use a CountDownLatch to ensure that the new thread is running before we then yield and sleep to help ensure - * the new thread has entered the synchronized block in the writeCommandFrameAndWaitForReply. - * - * We can then ack like an the incomming exception handler in (ConnectionCloseMethodHandler). - * - * We fire the error to the stateManager, which in this case will recored the error as there are no state listeners. - * - * We then set the connection to be closed, as we would normally close the socket at this point. - * - * Then fire the exception in to any frameListeners. - * - * The blocked listener (created above) when receiving the error simulates the user by creating a new request to - * block for a frame. - * - * This request should fail. Prior to the fix this will fail with a NPE as we are attempting to use a null listener - * in the writeCommand.... call L:268. - * - * This highlights that the listener would be added dispite there being a pending error state that the listener will - * miss as it is not currently part of the _frameListeners set that is being notified by the iterator. - * - * The method waits to ensure that an exception is received before returning. - * - * The calling methods validate that exception that was received based on the one they sent in. - * - * @param trigger The exception to throw through the handler - */ - private void performWithException(Exception trigger) throws InterruptedException - { - - final CountDownLatch callingWriteCommand = new CountDownLatch(1); - - //Set an initial listener that will allow us to create a new blocking method - new Thread(new Runnable() - { - public void run() - { - - try - { - - _logger.info("At initial block, signalling to fire new exception"); - callingWriteCommand.countDown(); - - _handler.writeCommandFrameAndWaitForReply(_blockFrame, _listener); - } - catch (Exception e) - { - e.printStackTrace(); - fail(e.getMessage()); - } - } - }).start(); - - _logger.info("Waiting for 'initial block' to start "); - if (!callingWriteCommand.await(1000, TimeUnit.MILLISECONDS)) - { - fail("Failed to start new thread to block for frame"); - } - - // Do what we can to ensure that this thread does not continue before the above thread has hit the synchronized - // block in the writeCommandFrameAndWaitForReply - Thread.yield(); - Thread.sleep(1000); - - _logger.info("Firing Erorr through state manager. There should be not state waiters here."); - _handler.getStateManager().error(trigger); - - _logger.info("Setting state to be CONNECTION_CLOSED."); - - _handler.getStateManager().changeState(AMQState.CONNECTION_CLOSED); - - _logger.info("Firing exception"); - _handler.propagateExceptionToFrameListeners(trigger); - - _logger.info("Awaiting notifcation from handler that exception arrived."); - - if (!_handleCountDown.await(2000, TimeUnit.MILLISECONDS)) - { - fail("Failed to handle exception and timeout has not occured"); - } - - - assertNotNull("The _Listener did not receive the exception", _listener.getReceivedException()); - - assertTrue("Received exception not an AMQException", - _listener.getReceivedException() instanceof AMQException); - - AMQException receivedException = (AMQException) _listener.getReceivedException(); - - assertTrue("The _Listener did not receive the correct message", - receivedException.getMessage().startsWith(trigger.getMessage())); - - - assertEquals("The _Listener did not receive the correct cause", - trigger, receivedException.getCause()); - - assertEquals("The _Listener did not receive the correct sub cause", - trigger.getCause(), receivedException.getCause().getCause()); - - } - - class BlockToAccessFrameListener extends BlockingMethodFrameListener - { - private Exception _receivedException = null; - - /** - * Creates a new method listener, that filters incoming method to just those that match the specified channel id. - * - * @param channelId The channel id to filter incoming methods with. - */ - public BlockToAccessFrameListener(int channelId) - { - super(channelId); - _logger.info("Creating a listener:" + this); - } - - public boolean processMethod(int channelId, AMQMethodBody frame) - { - return true; - } - - @Override - public void error(Exception e) - { - _logger.info("Exception(" + e + ") Received by:" + this); - // Create a new Thread to start the blocking registration. - new Thread(new Runnable() - { - - public void run() - { - //Set an initial listener that will allow us to create a new blocking method - try - { - _handler.writeCommandFrameAndWaitForReply(_blockFrame, null, 2000L); - _logger.info("listener(" + this + ") Wait completed"); - } - catch (Exception e) - { - _logger.info("listener(" + this + ") threw exception:" + e.getMessage()); - _receivedException = e; - } - - _logger.info("listener(" + this + ") completed"); - _handleCountDown.countDown(); - } - }).start(); - } - - public Exception getReceivedException() - { - return _receivedException; - } - } - -} diff --git a/java/client/src/test/java/org/apache/qpid/client/protocol/MockIoSession.java b/java/client/src/test/java/org/apache/qpid/client/protocol/MockIoSession.java deleted file mode 100644 index f0938a4bc0..0000000000 --- a/java/client/src/test/java/org/apache/qpid/client/protocol/MockIoSession.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - * - * 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.qpid.client.protocol; - -import org.apache.mina.common.*; -import org.apache.mina.common.support.DefaultCloseFuture; -import org.apache.mina.common.support.DefaultWriteFuture; -import org.apache.mina.common.support.AbstractIoFilterChain; -import org.apache.qpid.client.protocol.AMQProtocolSession; - -import java.net.SocketAddress; -import java.net.InetSocketAddress; -import java.util.Set; - -public class MockIoSession implements IoSession -{ - private AMQProtocolSession _protocolSession; - - /** - * Stores the last response written - */ - private Object _lastWrittenObject; - - private boolean _closing; - private IoFilterChain _filterChain; - - public MockIoSession() - { - _filterChain = new AbstractIoFilterChain(this) - { - protected void doWrite(IoSession ioSession, IoFilter.WriteRequest writeRequest) throws Exception - { - - } - - protected void doClose(IoSession ioSession) throws Exception - { - - } - }; - } - - public Object getLastWrittenObject() - { - return _lastWrittenObject; - } - - public IoService getService() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoServiceConfig getServiceConfig() - { - return null; - } - - public IoHandler getHandler() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoSessionConfig getConfig() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public IoFilterChain getFilterChain() - { - return _filterChain; - } - - public WriteFuture write(Object message) - { - WriteFuture wf = new DefaultWriteFuture(null); - _lastWrittenObject = message; - return wf; - } - - public CloseFuture close() - { - _closing = true; - CloseFuture cf = new DefaultCloseFuture(null); - cf.setClosed(); - return cf; - } - - public Object getAttachment() - { - return _protocolSession; - } - - public Object setAttachment(Object attachment) - { - Object current = _protocolSession; - _protocolSession = (AMQProtocolSession) attachment; - return current; - } - - public Object getAttribute(String key) - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public Object setAttribute(String key, Object value) - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public Object setAttribute(String key) - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public Object removeAttribute(String key) - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public boolean containsAttribute(String key) - { - return false; //To change body of implemented methods use File | Settings | File Templates. - } - - public Set getAttributeKeys() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public TransportType getTransportType() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public boolean isConnected() - { - return false; //To change body of implemented methods use File | Settings | File Templates. - } - - public boolean isClosing() - { - return _closing; - } - - public CloseFuture getCloseFuture() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getRemoteAddress() - { - return new InetSocketAddress("127.0.0.1", 1234); //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getLocalAddress() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public SocketAddress getServiceAddress() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getIdleTime(IdleStatus status) - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getIdleTimeInMillis(IdleStatus status) - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public void setIdleTime(IdleStatus status, int idleTime) - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public int getWriteTimeout() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getWriteTimeoutInMillis() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public void setWriteTimeout(int writeTimeout) - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public TrafficMask getTrafficMask() - { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - public void setTrafficMask(TrafficMask trafficMask) - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public void suspendRead() - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public void suspendWrite() - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public void resumeRead() - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public void resumeWrite() - { - //To change body of implemented methods use File | Settings | File Templates. - } - - public long getReadBytes() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getWrittenBytes() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getReadMessages() - { - return 0L; - } - - public long getWrittenMessages() - { - return 0L; - } - - public long getWrittenWriteRequests() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getScheduledWriteRequests() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getScheduledWriteBytes() - { - return 0; //TODO - } - - public long getCreationTime() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getLastIoTime() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getLastReadTime() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getLastWriteTime() - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public boolean isIdle(IdleStatus status) - { - return false; //To change body of implemented methods use File | Settings | File Templates. - } - - public int getIdleCount(IdleStatus status) - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - public long getLastIdleTime(IdleStatus status) - { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } -} diff --git a/java/client/src/test/java/org/apache/qpid/jms/FailoverPolicyTest.java b/java/client/src/test/java/org/apache/qpid/jms/FailoverPolicyTest.java deleted file mode 100644 index 438995aedc..0000000000 --- a/java/client/src/test/java/org/apache/qpid/jms/FailoverPolicyTest.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * - * 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.qpid.jms; - -import javax.jms.ConnectionConsumer; -import javax.jms.ConnectionMetaData; -import javax.jms.Destination; -import javax.jms.ExceptionListener; -import javax.jms.JMSException; -import javax.jms.ServerSessionPool; -import javax.jms.Topic; - -import org.apache.qpid.client.AMQConnectionURL; -import org.apache.qpid.jms.failover.FailoverExchangeMethod; -import org.apache.qpid.jms.failover.FailoverMethod; -import org.apache.qpid.jms.failover.FailoverRoundRobinServers; -import org.apache.qpid.jms.failover.FailoverSingleServer; -import org.apache.qpid.jms.failover.NoFailover; - -import junit.framework.TestCase; - -/** - * Tests the ability of FailoverPolicy to instantiate the correct FailoverMethod. - * - * This test presently does <i>not</i> test {@link FailoverPolicy#FailoverPolicy(FailoverMethod) or - * {@link FailoverPolicy#addMethod(FailoverMethod)} as it appears that this functionality - * is no longer in use. - * - */ -public class FailoverPolicyTest extends TestCase -{ - private FailoverPolicy _failoverPolicy = null; // class under test - private String _url; - private Connection _connection = null; - private ConnectionURL _connectionUrl = null; - - /** - * Tests single server method is selected for a brokerlist with one broker when - * the failover option is not specified. - */ - public void testBrokerListWithOneBrokerDefaultsToSingleServerPolicy() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof FailoverSingleServer); - } - - /** - * Tests round robin method is selected for a brokerlist with two brokers when - * the failover option is not specified. - */ - public void testBrokerListWithTwoBrokersDefaultsToRoundRobinPolicy() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672;tcp://localhost:5673'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof FailoverRoundRobinServers); - } - - /** - * Tests single server method is selected for a brokerlist with one broker when - * the failover option passed as 'singlebroker'. - */ - public void testExplictFailoverOptionSingleBroker() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'&failover='singlebroker'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof FailoverSingleServer); - } - - /** - * Tests round robin method is selected for a brokerlist with two brokers when - * the failover option passed as 'roundrobin'. - */ - public void testExplictFailoverOptionRoundrobin() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672;tcp://localhost:5673'&failover='roundrobin'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof FailoverRoundRobinServers); - } - - /** - * Tests no failover method is selected for a brokerlist with one broker when - * the failover option passed as 'nofailover'. - */ - public void testExplictFailoverOptionNofailover() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'&failover='nofailover'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof NoFailover); - } - - /** - * Tests failover exchange method is selected for a brokerlist with one broker when - * the failover option passed as 'failover_exchange'. - */ - public void testExplictFailoverOptionFailoverExchange() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'&failover='failover_exchange'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof FailoverExchangeMethod); - } - - /** - * Tests that a custom method can be selected for a brokerlist with one brokers when - * the failover option passed as a qualified class-name. - */ - public void testExplictFailoverOptionDynamicallyLoadedFailoverMethod() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'&failover='org.apache.qpid.jms.FailoverPolicyTest$MyFailoverMethod'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - _failoverPolicy = new FailoverPolicy(_connectionUrl, _connection); - - assertTrue("Unexpected failover method", _failoverPolicy.getCurrentMethod() instanceof MyFailoverMethod); - } - - /** - * Tests that an unknown method caused an exception. - */ - public void testUnknownFailoverMethod() throws Exception - { - _url = "amqp://user:pass@clientid/test?brokerlist='tcp://localhost:5672'&failover='unknown'"; - _connectionUrl = new AMQConnectionURL(_url); - _connection = createStubConnection(); - - try - { - new FailoverPolicy(_connectionUrl, _connection); - fail("Exception not thrown"); - } - catch(IllegalArgumentException iae) - { - // PASS - } - } - - private Connection createStubConnection() - { - return new Connection() - { - - @Override - public Session createSession(boolean transacted, - int acknowledgeMode, int prefetch) throws JMSException - { - return null; - } - - @Override - public Session createSession(boolean transacted, - int acknowledgeMode, int prefetchHigh, int prefetchLow) - throws JMSException - { - return null; - } - - @Override - public ConnectionListener getConnectionListener() - { - return null; - } - - @Override - public long getMaximumChannelCount() throws JMSException - { - return 0; - } - - @Override - public void setConnectionListener(ConnectionListener listener) - { - } - - @Override - public void close() throws JMSException - { - } - - @Override - public ConnectionConsumer createConnectionConsumer( - Destination arg0, String arg1, ServerSessionPool arg2, - int arg3) throws JMSException - { - return null; - } - - @Override - public ConnectionConsumer createDurableConnectionConsumer( - Topic arg0, String arg1, String arg2, - ServerSessionPool arg3, int arg4) throws JMSException - { - return null; - } - - @Override - public javax.jms.Session createSession(boolean arg0, int arg1) - throws JMSException - { - return null; - } - - @Override - public String getClientID() throws JMSException - { - return null; - } - - @Override - public ExceptionListener getExceptionListener() throws JMSException - { - return null; - } - - @Override - public ConnectionMetaData getMetaData() throws JMSException - { - return null; - } - - @Override - public void setClientID(String arg0) throws JMSException - { - } - - @Override - public void setExceptionListener(ExceptionListener arg0) - throws JMSException - { - } - - @Override - public void start() throws JMSException - { - } - - @Override - public void stop() throws JMSException - { - } - }; - } - - // Class used to test the ability of FailoverPolicy to load an implementation. - static class MyFailoverMethod implements FailoverMethod - { - public MyFailoverMethod(ConnectionURL connectionDetails) - { - } - - @Override - public void attainedConnection() - { - } - - @Override - public boolean failoverAllowed() - { - return false; - } - - @Override - public BrokerDetails getCurrentBrokerDetails() - { - return null; - } - - @Override - public BrokerDetails getNextBrokerDetails() - { - return null; - } - - @Override - public String methodName() - { - return null; - } - - @Override - public void reset() - { - } - - @Override - public void setBroker(BrokerDetails broker) - { - } - - @Override - public void setRetries(int maxRetries) - { - } - } - -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTableKeyEnumeratorTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTableKeyEnumeratorTest.java deleted file mode 100644 index ddbc69826d..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTableKeyEnumeratorTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * - * 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.qpid.test.unit.basic; - -import java.util.Enumeration; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import javax.jms.JMSException; - -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSTextMessage; -import org.apache.qpid.client.message.TestMessageHelper; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.framing.FieldTableFactory; - -public class FieldTableKeyEnumeratorTest extends TestCase -{ - public void testTrue() - { - - } - public void testKeyEnumeration() - { - FieldTable result = FieldTableFactory.newFieldTable(); - result.setObject("one", 1L); - result.setObject("two", 2L); - result.setObject("three", 3L); - result.setObject("four", 4L); - result.setObject("five", 5L); - - Iterator iterator = result.keys().iterator(); - - try - { - assertTrue("one".equals(iterator.next())); - assertTrue("two".equals(iterator.next())); - assertTrue("three".equals(iterator.next())); - assertTrue("four".equals(iterator.next())); - assertTrue("five".equals(iterator.next())); - } - catch (NoSuchElementException e) - { - fail("All elements should be found."); - } - - } - - public void testPropertEnu() - { - try - { - JMSTextMessage text = TestMessageHelper.newJMSTextMessage(); - - text.setBooleanProperty("Boolean1", true); - text.setBooleanProperty("Boolean2", true); - text.setIntProperty("Int", 2); - text.setLongProperty("Long", 2); - - Enumeration e = text.getPropertyNames(); - - assertTrue("Boolean1".equals(e.nextElement())); - assertTrue("Boolean2".equals(e.nextElement())); - assertTrue("Int".equals(e.nextElement())); - assertTrue("Long".equals(e.nextElement())); - } - catch (JMSException e) - { - - } - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(FieldTableKeyEnumeratorTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTablePropertyTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTablePropertyTest.java deleted file mode 100644 index 60ed688897..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/basic/FieldTablePropertyTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * 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.qpid.test.unit.basic; - -import java.util.Enumeration; - -import javax.jms.JMSException; - -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSTextMessage; -import org.apache.qpid.client.message.TestMessageHelper; - -public class FieldTablePropertyTest extends TestCase -{ - public void testPropertyNames() - { - try - { - JMSTextMessage text = TestMessageHelper.newJMSTextMessage(); - - text.setBooleanProperty("Boolean1", true); - text.setBooleanProperty("Boolean2", true); - text.setIntProperty("Int", 2); - text.setLongProperty("Long", 2); - - Enumeration e = text.getPropertyNames(); - - assertEquals("Boolean1", e.nextElement()); - assertTrue("Boolean2".equals(e.nextElement())); - assertTrue("Int".equals(e.nextElement())); - assertTrue("Long".equals(e.nextElement())); - } - catch (JMSException e) - { - - } - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(FieldTablePropertyTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/BrokerDetails/BrokerDetailsTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/BrokerDetails/BrokerDetailsTest.java deleted file mode 100644 index 1b27ff6300..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/BrokerDetails/BrokerDetailsTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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.qpid.test.unit.client.BrokerDetails; - -import java.util.HashMap; -import java.util.Map; - -import junit.framework.TestCase; - -import org.apache.qpid.client.AMQBrokerDetails; -import org.apache.qpid.client.AMQConnectionURL; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.url.URLSyntaxException; - -public class BrokerDetailsTest extends TestCase -{ - public void testMultiParameters() throws URLSyntaxException - { - String url = "tcp://localhost:5672?timeout='200',immediatedelivery='true'"; - - AMQBrokerDetails broker = new AMQBrokerDetails(url); - - assertTrue(broker.getProperty("timeout").equals("200")); - assertTrue(broker.getProperty("immediatedelivery").equals("true")); - } - - public void testVMBroker() throws URLSyntaxException - { - String url = "vm://:2"; - - AMQBrokerDetails broker = new AMQBrokerDetails(url); - assertTrue(broker.getTransport().equals("vm")); - assertEquals(broker.getPort(), 2); - } - - public void testTransportsDefaultToTCP() throws URLSyntaxException - { - String url = "localhost:5672"; - - AMQBrokerDetails broker = new AMQBrokerDetails(url); - assertTrue(broker.getTransport().equals("tcp")); - } - - public void testCheckDefaultPort() throws URLSyntaxException - { - String url = "tcp://localhost"; - - AMQBrokerDetails broker = new AMQBrokerDetails(url); - assertTrue(broker.getPort() == AMQBrokerDetails.DEFAULT_PORT); - } - - public void testBothDefaults() throws URLSyntaxException - { - String url = "localhost"; - - AMQBrokerDetails broker = new AMQBrokerDetails(url); - - assertTrue(broker.getTransport().equals("tcp")); - assertTrue(broker.getPort() == AMQBrokerDetails.DEFAULT_PORT); - } - - public void testWrongOptionSeparatorInBroker() - { - String url = "tcp://localhost:5672+option='value'"; - try - { - new AMQBrokerDetails(url); - } - catch (URLSyntaxException urise) - { - assertTrue(urise.getReason().equals("Illegal character in port number")); - } - - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(BrokerDetailsTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/ChannelCloseMethodHandlerNoCloseOk.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/ChannelCloseMethodHandlerNoCloseOk.java deleted file mode 100644 index 66f220643c..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/ChannelCloseMethodHandlerNoCloseOk.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.qpid.test.unit.client.channelclose; - -import org.apache.qpid.AMQChannelClosedException; -import org.apache.qpid.AMQException; -import org.apache.qpid.AMQInvalidArgumentException; -import org.apache.qpid.AMQInvalidRoutingKeyException; -import org.apache.qpid.client.AMQNoConsumersException; -import org.apache.qpid.client.AMQNoRouteException; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.client.state.StateAwareMethodListener; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.ChannelCloseBody; -import org.apache.qpid.protocol.AMQConstant; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ChannelCloseMethodHandlerNoCloseOk implements StateAwareMethodListener<ChannelCloseBody> -{ - private static final Logger _logger = LoggerFactory.getLogger(ChannelCloseMethodHandlerNoCloseOk.class); - - private static ChannelCloseMethodHandlerNoCloseOk _handler = new ChannelCloseMethodHandlerNoCloseOk(); - - public static ChannelCloseMethodHandlerNoCloseOk getInstance() - { - return _handler; - } - - public void methodReceived(AMQProtocolSession session, ChannelCloseBody method, int channelId) - throws AMQException - { - _logger.debug("ChannelClose method received"); - - AMQConstant errorCode = AMQConstant.getConstant(method.getReplyCode()); - AMQShortString reason = method.getReplyText(); - if (_logger.isDebugEnabled()) - { - _logger.debug("Channel close reply code: " + errorCode + ", reason: " + reason); - } - - // For this test Method Handler .. don't send Close-OK - // // TODO: Be aware of possible changes to parameter order as versions change. - // AMQFrame frame = ChannelCloseOkBody.createAMQFrame(evt.getChannelId(), method.getMajor(), method.getMinor()); - // protocolSession.writeFrame(frame); - if (errorCode != AMQConstant.REPLY_SUCCESS) - { - _logger.error("Channel close received with errorCode " + errorCode + ", and reason " + reason); - if (errorCode == AMQConstant.NO_CONSUMERS) - { - throw new AMQNoConsumersException("Error: " + reason, null, null); - } - else if (errorCode == AMQConstant.NO_ROUTE) - { - throw new AMQNoRouteException("Error: " + reason, null, null); - } - else if (errorCode == AMQConstant.INVALID_ARGUMENT) - { - _logger.debug("Broker responded with Invalid Argument."); - - throw new AMQInvalidArgumentException(String.valueOf(reason), null); - } - else if (errorCode == AMQConstant.INVALID_ROUTING_KEY) - { - _logger.debug("Broker responded with Invalid Routing Key."); - - throw new AMQInvalidRoutingKeyException(String.valueOf(reason), null); - } - else - { - throw new AMQChannelClosedException(errorCode, "Error: " + reason, null); - } - - } - - session.channelClosed(channelId, errorCode, String.valueOf(reason)); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/NoCloseOKStateManager.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/NoCloseOKStateManager.java deleted file mode 100644 index c7eb745566..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/channelclose/NoCloseOKStateManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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.qpid.test.unit.client.channelclose; - -import org.apache.qpid.client.state.AMQStateManager; -import org.apache.qpid.client.state.AMQState; -import org.apache.qpid.client.handler.ConnectionStartMethodHandler; -import org.apache.qpid.client.handler.ConnectionCloseMethodHandler; -import org.apache.qpid.client.handler.ConnectionTuneMethodHandler; -import org.apache.qpid.client.handler.ConnectionSecureMethodHandler; -import org.apache.qpid.client.handler.ConnectionOpenOkMethodHandler; -import org.apache.qpid.client.handler.ChannelCloseOkMethodHandler; -import org.apache.qpid.client.handler.BasicDeliverMethodHandler; -import org.apache.qpid.client.handler.BasicReturnMethodHandler; -import org.apache.qpid.client.handler.BasicCancelOkMethodHandler; -import org.apache.qpid.client.handler.ChannelFlowOkMethodHandler; -import org.apache.qpid.client.handler.QueueDeleteOkMethodHandler; -import org.apache.qpid.client.handler.ExchangeBoundOkMethodHandler; -import org.apache.qpid.client.protocol.AMQProtocolSession; -import org.apache.qpid.framing.ConnectionStartBody; -import org.apache.qpid.framing.ConnectionCloseBody; -import org.apache.qpid.framing.ConnectionTuneBody; -import org.apache.qpid.framing.ConnectionSecureBody; -import org.apache.qpid.framing.ConnectionOpenOkBody; -import org.apache.qpid.framing.ChannelCloseBody; -import org.apache.qpid.framing.ChannelCloseOkBody; -import org.apache.qpid.framing.BasicDeliverBody; -import org.apache.qpid.framing.BasicReturnBody; -import org.apache.qpid.framing.BasicCancelOkBody; -import org.apache.qpid.framing.ChannelFlowOkBody; -import org.apache.qpid.framing.QueueDeleteOkBody; -import org.apache.qpid.framing.ExchangeBoundOkBody; - -import java.util.Map; -import java.util.HashMap; - -public class NoCloseOKStateManager extends AMQStateManager -{ - public NoCloseOKStateManager(AMQProtocolSession protocolSession) - { - super(protocolSession); - } - - - - -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java deleted file mode 100644 index 2c5fa0112e..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.connectionurl; - -import junit.framework.TestCase; - -import org.apache.qpid.client.AMQBrokerDetails; -import org.apache.qpid.client.AMQConnectionURL; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.url.URLSyntaxException; - -public class ConnectionURLTest extends TestCase -{ - - public void testFailoverURL() throws URLSyntaxException - { - String url = "amqp://ritchiem:bob@/test?brokerlist='tcp://localhost:5672;tcp://fancyserver:3000/',failover='roundrobin?cyclecount='100''"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod().equals("roundrobin")); - assertEquals("100", connectionurl.getFailoverOption(ConnectionURL.OPTIONS_FAILOVER_CYCLE)); - assertTrue(connectionurl.getUsername().equals("ritchiem")); - assertTrue(connectionurl.getPassword().equals("bob")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 2); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - - service = connectionurl.getBrokerDetails(1); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("fancyserver")); - assertTrue(service.getPort() == 3000); - - } - - public void testSingleTransportUsernamePasswordURL() throws URLSyntaxException - { - String url = "amqp://ritchiem:bob@/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("ritchiem")); - assertTrue(connectionurl.getPassword().equals("bob")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - } - - public void testSingleTransportUsernameBlankPasswordURL() throws URLSyntaxException - { - String url = "amqp://ritchiem:@/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("ritchiem")); - assertTrue(connectionurl.getPassword().equals("")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - } - - public void testFailedURLNullPassword() - { - String url = "amqp://ritchiem@/test?brokerlist='tcp://localhost:5672'"; - - try - { - new AMQConnectionURL(url); - fail("URL has null password"); - } - catch (URLSyntaxException e) - { - assertTrue(e.getReason().equals("Null password in user information not allowed.")); - assertTrue(e.getIndex() == 7); - } - } - - - public void testSingleTransportURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - } - - public void testSingleTransportWithClientURLURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@clientname/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - assertTrue(connectionurl.getClientName().equals("clientname")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - } - - public void testSingleTransport1OptionURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='tcp://localhost:5672',routingkey='jim'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - assertTrue(connectionurl.getOption("routingkey").equals("jim")); - } - - public void testSingleTransportDefaultedBroker() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='localhost'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - } - - public void testSingleTransportDefaultedBrokerWithPort() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='localhost:1234'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 1234); - } - - public void testSingleTransportDefaultedBrokerWithIP() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='127.0.0.1'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - assertTrue(service.getHost().equals("127.0.0.1")); - assertTrue(service.getPort() == 5672); - } - - public void testSingleTransportDefaultedBrokerWithIPandPort() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='127.0.0.1:1234'"; - -// ConnectionURL connectionurl = new AMQConnectionURL(url); -// -// assertTrue(connectionurl.getFailoverMethod() == null); -// assertTrue(connectionurl.getUsername().equals("guest")); -// assertTrue(connectionurl.getPassword().equals("guest")); -// assertTrue(connectionurl.getVirtualHost().equals("/temp")); -// -// -// assertTrue(connectionurl.getBrokerCount() == 1); -// -// BrokerDetails service = connectionurl.getBrokerDetails(0); -// -// assertTrue(service.getTransport().equals("tcp")); -// -// assertTrue(service.getHost().equals("127.0.0.1")); -// assertTrue(service.getPort() == 1234); - } - - - public void testSingleTransportMultiOptionURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='tcp://localhost:5672?foo='jim'&bar='bob'&fred='jimmy'',routingkey='jim',timeout='200',immediatedelivery='true'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - - assertTrue(connectionurl.getOption("routingkey").equals("jim")); - assertTrue(connectionurl.getOption("timeout").equals("200")); - assertTrue(connectionurl.getOption("immediatedelivery").equals("true")); - } - - public void testSinglevmURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='vm://:2'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("vm")); - assertTrue(service.getHost().equals("")); - assertTrue(service.getPort() == 2); - - } - - public void testFailoverVMURL() throws URLSyntaxException - { - String url = "amqp://ritchiem:bob@/test?brokerlist='vm://:2;vm://:3',failover='roundrobin'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod().equals("roundrobin")); - assertTrue(connectionurl.getUsername().equals("ritchiem")); - assertTrue(connectionurl.getPassword().equals("bob")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 2); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("vm")); - assertTrue(service.getHost().equals("")); - assertTrue(service.getPort() == 2); - - service = connectionurl.getBrokerDetails(1); - assertTrue(service.getTransport().equals("vm")); - assertTrue(service.getHost().equals("")); - assertTrue(service.getPort() == 3); - } - - - public void testNoVirtualHostURL() - { - String url = "amqp://user@?brokerlist='tcp://localhost:5672'"; - - try - { - new AMQConnectionURL(url); - fail("URL has no virtual host should not parse"); - } - catch (URLSyntaxException e) - { - // This should occur. - } - } - - public void testNoClientID() throws URLSyntaxException - { - String url = "amqp://user:@/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getUsername().equals("user")); - assertTrue(connectionurl.getPassword().equals("")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - } - - public void testClientIDWithUnderscore() throws URLSyntaxException - { - String url = "amqp://user:pass@client_id/test?brokerlist='tcp://localhost:5672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getUsername().equals("user")); - assertTrue(connectionurl.getPassword().equals("pass")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - assertTrue(connectionurl.getClientName().equals("client_id")); - - assertTrue(connectionurl.getBrokerCount() == 1); - } - - public void testWrongOptionSeparatorInOptions() - { - String url = "amqp://guest:guest@/test?brokerlist='tcp://localhost:5672;tcp://localhost:5673'+failover='roundrobin'"; - try - { - new AMQConnectionURL(url); - fail("URL Should not parse"); - } - catch (URLSyntaxException urise) - { - assertTrue(urise.getReason().equals("Unterminated option. Possible illegal option separator:'+'")); - } - - } - - - public void testNoUserDetailsProvidedWithClientID() - - { - String url = "amqp://clientID/test?brokerlist='tcp://localhost:5672;tcp://localhost:5673'"; - try - { - new AMQConnectionURL(url); - fail("URL Should not parse"); - } - catch (URLSyntaxException urise) - { - assertTrue(urise.getMessage().startsWith("User information not found on url")); - } - - } - - public void testNoUserDetailsProvidedNOClientID() - - { - String url = "amqp:///test?brokerlist='tcp://localhost:5672;tcp://localhost:5673'"; - try - { - new AMQConnectionURL(url); - fail("URL Should not parse"); - } - catch (URLSyntaxException urise) - { - assertTrue(urise.getMessage().startsWith("User information not found on url")); - } - - } - - public void testCheckVirtualhostFormat() throws URLSyntaxException - { - String url = "amqp://guest:guest@/t.-_+!=:?brokerlist='tcp://localhost:5672'"; - - AMQConnectionURL connection = new AMQConnectionURL(url); - assertTrue(connection.getVirtualHost().equals("/t.-_+!=:")); - } - - public void testCheckDefaultPort() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test=:?brokerlist='tcp://localhost'"; - - AMQConnectionURL connection = new AMQConnectionURL(url); - - BrokerDetails broker = connection.getBrokerDetails(0); - assertTrue(broker.getPort() == AMQBrokerDetails.DEFAULT_PORT); - - } - - public void testCheckMissingFinalQuote() throws URLSyntaxException - { - String url = "amqp://guest:guest@id/test" + "?brokerlist='tcp://localhost:5672"; - - try - { - new AMQConnectionURL(url); - } - catch (URLSyntaxException e) - { - assertEquals(e.getMessage(), "Unterminated option at index 32: brokerlist='tcp://localhost:5672"); - } - } - - - public void testDefaultExchanges() throws URLSyntaxException - { - String url = "amqp://guest:guest@id/test" + "?defaultQueueExchange='test.direct'&defaultTopicExchange='test.topic'&temporaryQueueExchange='tmp.direct'&temporaryTopicExchange='tmp.topic'"; - - AMQConnectionURL conn = new AMQConnectionURL(url); - - assertEquals(conn.getDefaultQueueExchangeName(),"test.direct"); - - assertEquals(conn.getDefaultTopicExchangeName(),"test.topic"); - - assertEquals(conn.getTemporaryQueueExchangeName(),"tmp.direct"); - - assertEquals(conn.getTemporaryTopicExchangeName(),"tmp.topic"); - - } - - public void testSocketProtocol() throws URLSyntaxException - { - String url = "amqp://guest:guest@id/test" + "?brokerlist='socket://VM-Unique-socketID'"; - - try - { - AMQConnectionURL curl = new AMQConnectionURL(url); - assertNotNull(curl); - assertEquals(1, curl.getBrokerCount()); - assertNotNull(curl.getBrokerDetails(0)); - assertEquals(BrokerDetails.SOCKET, curl.getBrokerDetails(0).getTransport()); - assertEquals("VM-Unique-socketID", curl.getBrokerDetails(0).getHost()); - assertEquals("URL does not toString as expected", - url.replace(":guest", ":********"), curl.toString()); - } - catch (URLSyntaxException e) - { - fail(e.getMessage()); - } - } - - public void testSingleTransportMultiOptionOnBrokerURL() throws URLSyntaxException - { - String url = "amqp://guest:guest@/test?brokerlist='tcp://localhost:5672?foo='jim'&bar='bob'&fred='jimmy'',routingkey='jim',timeout='200',immediatedelivery='true'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getFailoverMethod() == null); - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertTrue(service.getTransport().equals("tcp")); - - - assertTrue(service.getHost().equals("localhost")); - assertTrue(service.getPort() == 5672); - assertEquals("jim",service.getProperty("foo")); - assertEquals("bob",service.getProperty("bar")); - assertEquals("jimmy",service.getProperty("fred")); - - assertTrue(connectionurl.getOption("routingkey").equals("jim")); - assertTrue(connectionurl.getOption("timeout").equals("200")); - assertTrue(connectionurl.getOption("immediatedelivery").equals("true")); - } - - /** - * Test that options other than failover and brokerlist are returned in the string representation. - * <p> - * QPID-2697 - */ - public void testOptionToString() throws Exception - { - ConnectionURL url = new AMQConnectionURL("amqp://user:pass@temp/test?maxprefetch='12345'&brokerlist='tcp://localhost:5672'"); - - assertTrue("String representation should contain options and values", url.toString().contains("maxprefetch='12345'")); - } - - public void testHostNamesWithUnderScore() throws URLSyntaxException - { - String url = "amqp://guest:guest@clientid/test?brokerlist='tcp://under_score:6672'"; - - ConnectionURL connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - BrokerDetails service = connectionurl.getBrokerDetails(0); - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("under_score")); - assertTrue(service.getPort() == 6672); - - url = "amqp://guest:guest@clientid/test?brokerlist='tcp://under_score'"; - - connectionurl = new AMQConnectionURL(url); - - assertTrue(connectionurl.getUsername().equals("guest")); - assertTrue(connectionurl.getPassword().equals("guest")); - assertTrue(connectionurl.getVirtualHost().equals("/test")); - - assertTrue(connectionurl.getBrokerCount() == 1); - service = connectionurl.getBrokerDetails(0); - assertTrue(service.getTransport().equals("tcp")); - assertTrue(service.getHost().equals("under_score")); - assertTrue(service.getPort() == 5672); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(ConnectionURLTest.class); - } -} - diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/DestinationURLTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/DestinationURLTest.java deleted file mode 100644 index 7de09cff45..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/destinationurl/DestinationURLTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.destinationurl; - -import junit.framework.TestCase; - -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.url.AMQBindingURL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.URISyntaxException; - -public class DestinationURLTest extends TestCase -{ - private static final Logger _logger = LoggerFactory.getLogger(DestinationURLTest.class); - - public void testFullURL() throws URISyntaxException - { - - String url = "exchange.Class://exchangeName/Destination/Queue"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(url.equals(dest.toString())); - - assertTrue(dest.getExchangeClass().equals("exchange.Class")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("Destination")); - assertTrue(dest.getQueueName().equals("Queue")); - } - - public void testQueue() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName//Queue"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(url.equals(dest.toString())); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("")); - assertTrue(dest.getQueueName().equals("Queue")); - } - - public void testQueueWithOption() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName//Queue?option='value'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(url.equals(dest.toString())); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("")); - assertTrue(dest.getQueueName().equals("Queue")); - assertTrue(dest.getOption("option").equals("value")); - } - - - public void testDestination() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName/Destination/"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(url.equals(dest.toString())); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("Destination")); - assertTrue(dest.getQueueName().equals("")); - } - - public void testDestinationWithOption() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName/Destination/?option='value'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(url.equals(dest.toString())); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("Destination")); - assertTrue(dest.getQueueName().equals("")); - - assertTrue(dest.getOption("option").equals("value")); - } - - public void testDestinationWithMultiOption() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName/Destination/?option='value',option2='value2'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("Destination")); - assertTrue(dest.getQueueName().equals("")); - - assertTrue(dest.getOption("option").equals("value")); - assertTrue(dest.getOption("option2").equals("value2")); - } - - public void testDestinationWithNoExchangeDefaultsToDirect() throws URISyntaxException - { - - String url = "IBMPerfQueue1?durable='true'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(dest.getExchangeClass().equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS)); - assertTrue(dest.getExchangeName().equals("")); - assertTrue(dest.getDestinationName().equals("")); - assertTrue(dest.getQueueName().equals("IBMPerfQueue1")); - - assertTrue(dest.getOption("durable").equals("true")); - } - - public void testDestinationWithMultiBindingKeys() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName/Destination/?bindingkey='key1',bindingkey='key2'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(dest.getExchangeClass().equals("exchangeClass")); - assertTrue(dest.getExchangeName().equals("exchangeName")); - assertTrue(dest.getDestinationName().equals("Destination")); - assertTrue(dest.getQueueName().equals("")); - - assertTrue(dest.getBindingKeys().length == 2); - } - - // You can only specify only a routing key or binding key, but not both. - public void testDestinationIfOnlyRoutingKeyOrBindingKeyIsSpecified() throws URISyntaxException - { - - String url = "exchangeClass://exchangeName/Destination/?bindingkey='key1',routingkey='key2'"; - boolean exceptionThrown = false; - try - { - - new AMQBindingURL(url); - } - catch(URISyntaxException e) - { - exceptionThrown = true; - _logger.info("Exception thrown",e); - } - - assertTrue("Failed to throw an URISyntaxException when both the bindingkey and routingkey is specified",exceptionThrown); - } - - public void testDestinationWithDurableTopic() throws URISyntaxException - { - - String url = "topic://amq.topic//testTopicD?durable='true'&autodelete='true'&clientid='test'&subscription='testQueueD'"; - - AMQBindingURL dest = new AMQBindingURL(url); - - assertTrue(dest.getExchangeClass().equals("topic")); - assertTrue(dest.getExchangeName().equals("amq.topic")); - assertTrue(dest.getQueueName().equals("test:testQueueD")); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(DestinationURLTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/BytesMessageTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/message/BytesMessageTest.java deleted file mode 100644 index 65013e7e6d..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/BytesMessageTest.java +++ /dev/null @@ -1,569 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.message; - -import java.util.HashMap; - -import javax.jms.MessageEOFException; -import javax.jms.MessageFormatException; -import javax.jms.MessageNotReadableException; -import javax.jms.MessageNotWriteableException; - -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSBytesMessage; -import org.apache.qpid.client.message.TestMessageHelper; - -public class BytesMessageTest extends TestCase -{ - /** - * Tests that on creation a call to getBodyLength() throws an exception - * if null was passed in during creation - */ - public void testNotReadableOnCreationWithNull() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.getBodyLength(); - fail("expected exception did not occur"); - } - catch (MessageNotReadableException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageNotReadableException, got " + e); - } - } - - public void testResetMakesReadble() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeInt(10); - bm.reset(); - bm.writeInt(12); - fail("expected exception did not occur"); - } - catch (MessageNotWriteableException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageNotWriteableException, got " + e); - } - } - - public void testClearBodyMakesWritable() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeInt(10); - bm.reset(); - bm.clearBody(); - bm.writeInt(10); - } - - public void testWriteBoolean() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeBoolean(true); - bm.writeBoolean(false); - bm.reset(); - boolean val = bm.readBoolean(); - assertEquals(true, val); - val = bm.readBoolean(); - assertEquals(false, val); - } - - public void testWriteInt() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeInt(10); - bm.reset(); - long len = bm.getBodyLength(); - assertTrue(len == 4); - int val = bm.readInt(); - assertTrue(val == 10); - } - - public void testWriteString() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeUTF("Bananas"); - bm.reset(); - String res = bm.readUTF(); - assertEquals("Bananas", res); - } - - public void testWriteBytes() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - byte[] bytes = {1,2,3,4}; - bm.writeBytes(bytes, 1, 2); - bm.reset(); - bytes = new byte[2]; - bm.readBytes(bytes); - assertEquals(2, bytes[0]); - assertEquals(3, bytes[1]); - } - - public void testWriteObject() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeObject(new Boolean(true)); - bm.writeObject(new Boolean(false)); - bm.writeObject(new Byte((byte)2)); - bm.writeObject(new byte[]{1,2,3,4}); - bm.writeObject(new Character('g')); - bm.writeObject(new Short((short) 29)); - bm.writeObject(new Integer(101)); - bm.writeObject(new Long(50003222L)); - bm.writeObject("Foobar"); - bm.writeObject(new Float(1.7f)); - bm.writeObject(new Double(8.7d)); - bm.reset(); - assertTrue(bm.readBoolean()); - assertTrue(!bm.readBoolean()); - assertEquals((byte)2, bm.readByte()); - byte[] bytes = new byte[4]; - bm.readBytes(bytes); - assertEquals('g', bm.readChar()); - assertEquals((short) 29, bm.readShort()); - assertEquals(101, bm.readInt()); - assertEquals(50003222L, bm.readLong()); - assertEquals("Foobar", bm.readUTF()); - assertEquals(1.7f, bm.readFloat()); - assertEquals(8.7d, bm.readDouble()); - } - - public void testWriteObjectRejectsNonPrimitives() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeObject(new HashMap()); - fail("expected MessageFormatException was not thrown"); - } - catch (MessageFormatException e) - { - // pass - } - } - - public void testWriteObjectThrowsNPE() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeObject(null); - fail("expected exception did not occur"); - } - catch (NullPointerException n) - { - // ok - } - catch (Exception e) - { - fail("expected NullPointerException, got " + e); - } - } - - public void testReadBoolean() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeBoolean(true); - bm.reset(); - boolean result = bm.readBoolean(); - assertTrue(result); - } - - public void testReadUnsignedByte() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte) 9); - bm.reset(); - int result = bm.readUnsignedByte(); - assertEquals(9, result); - } - - public void testReadUnsignedShort() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeShort((byte) 9); - bm.reset(); - int result = bm.readUnsignedShort(); - assertEquals(9, result); - } - - public void testReadBytesChecksNull() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.readBytes(null); - } - catch (IllegalArgumentException e) - { - // pass - } - - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.readBytes(null, 1); - } - catch (IllegalArgumentException e) - { - // pass - } - } - - public void testReadBytesChecksMaxSize() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - byte[] bytes = new byte[100]; - bm.readBytes(bytes, 120); - } - catch (IllegalArgumentException e) - { - // pass - } - } - - public void testReadBytesReturnsCorrectLengths() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - byte[] bytes = {2, 3}; - bm.writeBytes(bytes); - bm.reset(); - int len = bm.readBytes(bytes); - assertEquals(2, len); - len = bm.readBytes(bytes); - assertEquals(-1, len); - len = bm.readBytes(bytes, 2); - assertEquals(-1, len); - bm.reset(); - len = bm.readBytes(bytes, 2); - assertEquals(2, len); - bm.reset(); - len = bm.readBytes(bytes, 1); - assertEquals(1, len); - - } - - public void testEOFByte() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)1); - bm.reset(); - bm.readByte(); - // should throw - bm.readByte(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFUnsignedByte() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)1); - bm.reset(); - bm.readByte(); - // should throw - bm.readUnsignedByte(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFBoolean() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeBoolean(true); - bm.reset(); - bm.readBoolean(); - // should throw - bm.readBoolean(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFChar() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeChar('A'); - bm.reset(); - bm.readChar(); - // should throw - bm.readChar(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFDouble() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeDouble(1.3d); - bm.reset(); - bm.readDouble(); - // should throw - bm.readDouble(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFFloat() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeFloat(1.3f); - bm.reset(); - bm.readFloat(); - // should throw - bm.readFloat(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFInt() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeInt(99); - bm.reset(); - bm.readInt(); - // should throw - bm.readInt(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFLong() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeLong(4L); - bm.reset(); - bm.readLong(); - // should throw - bm.readLong(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFShort() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeShort((short)4); - bm.reset(); - bm.readShort(); - // should throw - bm.readShort(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFUnsignedShort() throws Exception - { - try - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeShort((short)4); - bm.reset(); - bm.readUnsignedShort(); - // should throw - bm.readUnsignedShort(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - /** - * Tests that the readBytes() method populates the passed in array - * correctly - * @throws Exception - */ - public void testReadBytes() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)3); - bm.writeByte((byte)4); - bm.reset(); - byte[] result = new byte[2]; - int count = bm.readBytes(result); - assertEquals((byte)3, result[0]); - assertEquals((byte)4, result[1]); - assertEquals(2, count); - } - - public void testReadBytesEOF() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)3); - bm.writeByte((byte)4); - bm.reset(); - byte[] result = new byte[2]; - bm.readBytes(result); - int count = bm.readBytes(result); - assertEquals(-1, count); - } - - public void testReadBytesWithLargerArray() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)3); - bm.writeByte((byte)4); - bm.reset(); - byte[] result = new byte[3]; - int count = bm.readBytes(result); - assertEquals(2, count); - assertEquals((byte)3, result[0]); - assertEquals((byte)4, result[1]); - assertEquals((byte)0, result[2]); - } - - public void testReadBytesWithCount() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.writeByte((byte)3); - bm.writeByte((byte)4); - bm.writeByte((byte)5); - bm.reset(); - byte[] result = new byte[3]; - int count = bm.readBytes(result, 2); - assertEquals(2, count); - assertEquals((byte)3, result[0]); - assertEquals((byte)4, result[1]); - assertEquals((byte)0, result[2]); - } - - public void testToBodyStringWithNull() throws Exception - { - JMSBytesMessage bm = TestMessageHelper.newJMSBytesMessage(); - bm.reset(); - String result = bm.toBodyString(); - assertEquals("\"\"", result); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(BytesMessageTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java deleted file mode 100644 index 3e04c36b38..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * 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.qpid.test.unit.client.message; - -import javax.jms.JMSException; -import javax.jms.MessageFormatException; - -import junit.framework.Assert; -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSMapMessage; -import org.apache.qpid.client.message.TestMessageHelper; - - -public class MapMessageTest extends TestCase -{ - - //Test Lookups - - public void testBooleanLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - - mm.setBoolean("value", true); - Assert.assertEquals(true, mm.getBoolean("value")); - Assert.assertEquals("true", mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testByteLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setByte("value", Byte.MAX_VALUE); - - Assert.assertEquals(Byte.MAX_VALUE, mm.getByte("value")); - Assert.assertEquals((short) Byte.MAX_VALUE, mm.getShort("value")); - Assert.assertEquals(Byte.MAX_VALUE, mm.getInt("value")); - Assert.assertEquals((long) Byte.MAX_VALUE, mm.getLong("value")); - Assert.assertEquals("" + Byte.MAX_VALUE, mm.getString("value")); - - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testShortLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setShort("value", Short.MAX_VALUE); - Assert.assertEquals(Short.MAX_VALUE, mm.getShort("value")); - Assert.assertEquals((int) Short.MAX_VALUE, mm.getInt("value")); - Assert.assertEquals((long) Short.MAX_VALUE, mm.getLong("value")); - Assert.assertEquals("" + Short.MAX_VALUE, mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - - public void testCharLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - - mm.setChar("value", 'c'); - Assert.assertEquals('c', mm.getChar("value")); - Assert.assertEquals("c", mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - - mm.setString("value", null); - mm.getChar("value"); - fail("Expected NullPointerException"); - - } - catch (NullPointerException e) - { - ; // pass - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - - - - } - - public void testDoubleLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setDouble("value", Double.MAX_VALUE); - Assert.assertEquals(Double.MAX_VALUE, mm.getDouble("value")); - Assert.assertEquals("" + Double.MAX_VALUE, mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testFloatLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setFloat("value", Float.MAX_VALUE); - Assert.assertEquals(Float.MAX_VALUE, mm.getFloat("value")); - Assert.assertEquals((double) Float.MAX_VALUE, mm.getDouble("value")); - Assert.assertEquals("" + Float.MAX_VALUE, mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testIntLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setInt("value", Integer.MAX_VALUE); - Assert.assertEquals(Integer.MAX_VALUE, mm.getInt("value")); - Assert.assertEquals((long) Integer.MAX_VALUE, mm.getLong("value")); - Assert.assertEquals("" + Integer.MAX_VALUE, mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testLongLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setLong("value", Long.MAX_VALUE); - Assert.assertEquals(Long.MAX_VALUE, mm.getLong("value")); - Assert.assertEquals("" + Long.MAX_VALUE, mm.getString("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testBytesLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - byte[] bytes = {99, 98, 97, 96, 95}; - mm.setBytes("bytes", bytes); - assertBytesEqual(bytes, mm.getBytes("bytes")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - // Failed Lookups - - public void testFailedBooleanLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - Assert.assertEquals(false, mm.getBoolean("int")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testFailedByteLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getByte("random"); - Assert.fail("NumberFormatException expected"); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - - } - - public void testFailedBytesLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getBytes("random"); - Assert.fail("MessageFormatException expected"); - } - catch (MessageFormatException mfe) - { - //normal path - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedCharLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getChar("random"); - Assert.fail("MessageFormatException expected"); - } - catch (MessageFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedDoubleLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getDouble("random"); - Assert.fail("NullPointerException should be received."); - } - catch (NullPointerException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedFloatLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getFloat("random"); - Assert.fail("NullPointerException should be received."); - } - catch (NullPointerException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedIntLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getInt("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedLongLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getLong("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedShortLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getShort("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - - private void assertBytesEqual(byte[] expected, byte[] actual) - { - Assert.assertEquals(expected.length, actual.length); - - for (int index = 0; index < expected.length; index++) - { - Assert.assertEquals(expected[index], actual[index]); - } - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(MapMessageTest.class); - } - - -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/StreamMessageTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/message/StreamMessageTest.java deleted file mode 100644 index 085dd81079..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/StreamMessageTest.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.message; - -import java.util.HashMap; - -import javax.jms.JMSException; -import javax.jms.MessageEOFException; -import javax.jms.MessageFormatException; -import javax.jms.MessageNotReadableException; -import javax.jms.MessageNotWriteableException; -import javax.jms.StreamMessage; - -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSStreamMessage; -import org.apache.qpid.client.message.TestMessageHelper; - -/** - * @author Apache Software Foundation - */ -public class StreamMessageTest extends TestCase -{ - /** - * Tests that on creation a call to getBodyLength() throws an exception - * if null was passed in during creation - */ - public void testNotReadableOnCreationWithNull() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.readByte(); - fail("expected exception did not occur"); - } - catch (MessageNotReadableException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageNotReadableException, got " + e); - } - } - - public void testResetMakesReadble() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeInt(10); - bm.reset(); - bm.writeInt(12); - fail("expected exception did not occur"); - } - catch (MessageNotWriteableException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageNotWriteableException, got " + e); - } - } - - public void testClearBodyMakesWritable() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeInt(10); - bm.reset(); - bm.clearBody(); - bm.writeInt(10); - } - - public void testWriteBoolean() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeBoolean(true); - bm.writeBoolean(false); - bm.reset(); - boolean val = bm.readBoolean(); - assertEquals(true, val); - val = bm.readBoolean(); - assertEquals(false, val); - } - - public void testWriteInt() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeInt(10); - bm.reset(); - int val = bm.readInt(); - assertTrue(val == 10); - } - - public void testWriteString() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeString("Bananas"); - bm.reset(); - String res = bm.readString(); - assertEquals("Bananas", res); - } - - public void testWriteBytes() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - byte[] bytes = {1,2,3,4}; - bm.writeBytes(bytes, 1, 2); - bm.reset(); - bytes = new byte[2]; - bm.readBytes(bytes); - assertEquals(2, bytes[0]); - assertEquals(3, bytes[1]); - } - - public void testWriteObject() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeObject(new Boolean(true)); - bm.writeObject(new Boolean(false)); - bm.writeObject(new Byte((byte)2)); - bm.writeObject(new byte[]{1,2,3,4}); - bm.writeObject(new Character('g')); - bm.writeObject(new Short((short) 29)); - bm.writeObject(new Integer(101)); - bm.writeObject(new Long(50003222L)); - bm.writeObject("Foobar"); - bm.writeObject(new Float(1.7f)); - bm.writeObject(new Double(8.7d)); - bm.reset(); - assertTrue(bm.readBoolean()); - assertTrue(!bm.readBoolean()); - assertEquals((byte)2, bm.readByte()); - byte[] bytes = new byte[4]; - bm.readBytes(bytes); - assertEquals('g', bm.readChar()); - assertEquals((short) 29, bm.readShort()); - assertEquals(101, bm.readInt()); - assertEquals(50003222L, bm.readLong()); - assertEquals("Foobar", bm.readString()); - assertEquals(1.7f, bm.readFloat()); - assertEquals(8.7d, bm.readDouble()); - } - - public void testWriteObjectRejectsNonPrimitives() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeObject(new HashMap()); - fail("expected MessageFormatException was not thrown"); - } - catch (MessageFormatException e) - { - // pass - } - } - - public void testReadBoolean() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeBoolean(true); - bm.reset(); - boolean result = bm.readBoolean(); - assertTrue(result); - } - - public void testReadBytesChecksNull() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.readBytes(null); - } - catch (IllegalArgumentException e) - { - // pass - } - } - - public void testReadBytesReturnsCorrectLengths() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - byte[] bytes = {2, 3}; - bm.writeBytes(bytes); - bm.writeBytes(null); - bm.writeBytes(new byte[]{}); - bm.reset(); - int len = bm.readBytes(bytes); - assertEquals(2, len); - len = bm.readBytes(bytes); - assertEquals(-1, len); - len = bm.readBytes(bytes); - assertEquals(-1, len); - len = bm.readBytes(bytes); - assertEquals(0, len); - } - - public void testReadBytesFollowedByPrimitive() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeBytes(new byte[]{2, 3, 4, 5, 6, 7, 8}); - bm.writeBytes(new byte[]{2, 3, 4, 5, 6, 7}); - bm.writeString("Foo"); - bm.reset(); - int len; - do - { - len = bm.readBytes(new byte[2]); - } - while (len == 2); - - do - { - len = bm.readBytes(new byte[2]); - } - while (len == 2); - - assertEquals("Foo", bm.readString()); - } - - public void testReadMultipleByteArrays() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - byte[] bytes = {2, 3, 4}; - bm.writeBytes(bytes); - bm.writeBytes(bytes); - bm.reset(); - byte[] result = new byte[2]; - int len = bm.readBytes(result); - assertEquals(2, len); - len = bm.readBytes(result); - assertEquals(1, len); - len = bm.readBytes(result); - assertEquals(2, len); - } - - public void testEOFByte() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeByte((byte)1); - bm.reset(); - bm.readByte(); - // should throw - bm.readByte(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFBoolean() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeBoolean(true); - bm.reset(); - bm.readBoolean(); - // should throw - bm.readBoolean(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFChar() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeChar('A'); - bm.reset(); - bm.readChar(); - // should throw - bm.readChar(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFDouble() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeDouble(1.3d); - bm.reset(); - bm.readDouble(); - // should throw - bm.readDouble(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFFloat() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeFloat(1.3f); - bm.reset(); - bm.readFloat(); - // should throw - bm.readFloat(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFInt() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeInt(99); - bm.reset(); - bm.readInt(); - // should throw - bm.readInt(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFLong() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeLong(4L); - bm.reset(); - bm.readLong(); - // should throw - bm.readLong(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testEOFShort() throws Exception - { - try - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeShort((short)4); - bm.reset(); - bm.readShort(); - // should throw - bm.readShort(); - fail("expected exception did not occur"); - } - catch (MessageEOFException m) - { - // ok - } - catch (Exception e) - { - fail("expected MessageEOFException, got " + e); - } - } - - public void testToBodyStringWithNull() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.reset(); - String result = bm.toBodyString(); - assertEquals("\"\"", result); - } - - private void checkConversionsFail(StreamMessage sm, int[] conversions) throws JMSException - { - for (int conversion : conversions) - { - try - { - switch (conversion) - { - case 0: - sm.readBoolean(); - break; - case 1: - sm.readByte(); - break; - case 2: - sm.readShort(); - break; - case 3: - sm.readChar(); - break; - case 4: - sm.readInt(); - break; - case 5: - sm.readLong(); - break; - case 6: - sm.readFloat(); - break; - case 7: - sm.readDouble(); - break; - case 8: - sm.readString(); - break; - case 9: - sm.readBytes(new byte[3]); - break; - } - fail("MessageFormatException was not thrown"); - } - catch (MessageFormatException e) - { - // PASS - } - sm.reset(); - } - } - public void testBooleanConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeBoolean(true); - bm.reset(); - String result = bm.readString(); - assertEquals("true", result); - bm.reset(); - checkConversionsFail(bm, new int[]{1,2,3,4,5,6,7,9}); - } - - public void testByteConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeByte((byte) 43); - bm.reset(); - assertEquals(43, bm.readShort()); - bm.reset(); - assertEquals(43, bm.readInt()); - bm.reset(); - assertEquals(43, bm.readLong()); - bm.reset(); - String result = bm.readString(); - assertEquals("43", result); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 3, 6, 7, 9}); - } - - public void testShortConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeShort((short) 87); - bm.reset(); - assertEquals(87, bm.readInt()); - bm.reset(); - assertEquals(87, bm.readLong()); - bm.reset(); - assertEquals("87", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 3, 6, 7, }); - } - - public void testCharConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeChar('d'); - bm.reset(); - assertEquals("d", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 2, 4, 5, 6, 7, 9}); - } - - public void testIntConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeInt(167); - bm.reset(); - assertEquals(167, bm.readLong()); - bm.reset(); - assertEquals("167", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 2, 3, 6, 7, 9}); - } - - public void testLongConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeLong(1678); - bm.reset(); - assertEquals("1678", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 2, 3, 4, 6, 7, 9}); - } - - public void testFloatConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeFloat(6.2f); - bm.reset(); - assertEquals(6.2d, bm.readDouble(), 0.01); - bm.reset(); - assertEquals("6.2", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 2, 3, 4, 5, 9}); - } - - public void testDoubleConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeDouble(88.35d); - bm.reset(); - assertEquals("88.35", bm.readString()); - bm.reset(); - checkConversionsFail(bm, new int[]{0, 1, 2, 3, 4, 5, 6, 9}); - } - - public void testStringConversions() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeString("true"); - bm.reset(); - assertEquals(true, bm.readBoolean()); - bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeString("2"); - bm.reset(); - assertEquals((byte)2, bm.readByte()); - bm.reset(); - assertEquals((short)2, bm.readShort()); - bm.reset(); - assertEquals(2, bm.readInt()); - bm.reset(); - assertEquals((long)2, bm.readLong()); - bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeString("5.7"); - bm.reset(); - assertEquals(5.7f, bm.readFloat()); - bm.reset(); - assertEquals(5.7d, bm.readDouble()); - } - - public void testNulls() throws Exception - { - JMSStreamMessage bm = TestMessageHelper.newJMSStreamMessage(); - bm.writeString(null); - bm.writeObject(null); - bm.reset(); - assertNull(bm.readObject()); - assertNull(bm.readObject()); - } - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(StreamMessageTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/TextMessageTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/client/message/TextMessageTest.java deleted file mode 100644 index 30f3b0b4eb..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/client/message/TextMessageTest.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * - * 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.qpid.test.unit.client.message; - -import javax.jms.JMSException; - -import junit.framework.Assert; -import junit.framework.TestCase; - -import org.apache.qpid.client.message.JMSMapMessage; -import org.apache.qpid.client.message.JMSTextMessage; -import org.apache.qpid.client.message.TestMessageHelper; - -public class TextMessageTest extends TestCase -{ - public void testTextOnConstruction() throws Exception - { - JMSTextMessage tm = TestMessageHelper.newJMSTextMessage(); - tm.setText("pies"); - String val = tm.getText(); - assertEquals(val, "pies"); - } - - public void testClearBody() throws Exception - { - JMSTextMessage tm = TestMessageHelper.newJMSTextMessage(); - tm.setText("pies"); - tm.clearBody(); - String val = tm.getText(); - assertNull(val); - tm.setText("Banana"); - val = tm.getText(); - assertEquals(val, "Banana"); - } - - - public void testBooleanPropertyLookup() - { - try - { - JMSTextMessage tm = TestMessageHelper.newJMSTextMessage(); - - tm.setBooleanProperty("value", true); - Assert.assertEquals(true, tm.getBooleanProperty("value")); - Assert.assertEquals("true", tm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testBytePropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setByteProperty("value", Byte.MAX_VALUE); - - Assert.assertEquals(Byte.MAX_VALUE, mm.getByteProperty("value")); - Assert.assertEquals((short) Byte.MAX_VALUE, mm.getShortProperty("value")); - Assert.assertEquals(Byte.MAX_VALUE, mm.getIntProperty("value")); - Assert.assertEquals((long) Byte.MAX_VALUE, mm.getLongProperty("value")); - Assert.assertEquals("" + Byte.MAX_VALUE, mm.getStringProperty("value")); - - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testShortPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setShortProperty("value", Short.MAX_VALUE); - Assert.assertEquals(Short.MAX_VALUE, mm.getShortProperty("value")); - Assert.assertEquals((int) Short.MAX_VALUE, mm.getIntProperty("value")); - Assert.assertEquals((long) Short.MAX_VALUE, mm.getLongProperty("value")); - Assert.assertEquals("" + Short.MAX_VALUE, mm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testDoublePropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setDoubleProperty("value", Double.MAX_VALUE); - Assert.assertEquals(Double.MAX_VALUE, mm.getDoubleProperty("value")); - Assert.assertEquals("" + Double.MAX_VALUE, mm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testFloatPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setFloatProperty("value", Float.MAX_VALUE); - Assert.assertEquals(Float.MAX_VALUE, mm.getFloatProperty("value")); - Assert.assertEquals((double) Float.MAX_VALUE, mm.getDoubleProperty("value")); - Assert.assertEquals("" + Float.MAX_VALUE, mm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testIntPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setIntProperty("value", Integer.MAX_VALUE); - Assert.assertEquals(Integer.MAX_VALUE, mm.getIntProperty("value")); - Assert.assertEquals((long) Integer.MAX_VALUE, mm.getLongProperty("value")); - Assert.assertEquals("" + Integer.MAX_VALUE, mm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testLongPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.setLongProperty("value", Long.MAX_VALUE); - Assert.assertEquals(Long.MAX_VALUE, mm.getLongProperty("value")); - Assert.assertEquals("" + Long.MAX_VALUE, mm.getStringProperty("value")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - - // Failed Lookups - - public void testFailedBooleanPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - Assert.assertEquals(false, mm.getBooleanProperty("int")); - } - catch (JMSException e) - { - Assert.fail("JMSException received." + e); - } - } - - public void testFailedBytePropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getByteProperty("random"); - Assert.fail("NumberFormatException expected"); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - - } - - public void testFailedDoublePropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getDoubleProperty("random"); - Assert.fail("NullPointerException should be received."); - } - catch (NullPointerException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedFloatPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getFloatProperty("random"); - Assert.fail("NullPointerException should be received."); - } - catch (NullPointerException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedIntPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getIntProperty("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedLongPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getLongProperty("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - public void testFailedShortPropertyLookup() - { - try - { - JMSMapMessage mm = TestMessageHelper.newJMSMapMessage(); - mm.getShortProperty("random"); - Assert.fail("NumberFormatException should be received."); - } - catch (NumberFormatException e) - { - //normal execution - } - catch (JMSException e) - { - Assert.fail("JMSException received:" + e); - } - } - - - public static junit.framework.Test suite() - { - return new junit.framework.TestSuite(TextMessageTest.class); - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/ConnectionFactoryTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/jndi/ConnectionFactoryTest.java deleted file mode 100644 index 9e76b0d468..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/ConnectionFactoryTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * - * 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.qpid.test.unit.jndi; - -import junit.framework.TestCase; -import org.apache.qpid.client.AMQConnectionFactory; -import org.apache.qpid.jms.BrokerDetails; -import org.apache.qpid.jms.ConnectionURL; -import org.apache.qpid.url.URLSyntaxException; - -public class ConnectionFactoryTest extends TestCase -{ - - //URL will be returned with the password field swapped for '********' - // so ensure that these two strings are kept in sync. - public static final String URL = "amqp://guest:guest@clientID/test?brokerlist='tcp://localhost:5672'"; - public static final String URL_STAR_PWD = "amqp://guest:********@clientID/test?brokerlist='tcp://localhost:5672'"; - - public void testConnectionURLString() - { - AMQConnectionFactory factory = new AMQConnectionFactory(); - - assertNull("ConnectionURL should have no value at start", - factory.getConnectionURL()); - - try - { - factory.setConnectionURLString(URL); - } - catch (URLSyntaxException e) - { - fail(e.getMessage()); - } - - //URL will be returned with the password field swapped for '********' - assertEquals("Connection URL not correctly set", URL_STAR_PWD, factory.getConnectionURLString()); - - // Further test that the processed ConnectionURL is as expected after - // the set call - ConnectionURL connectionurl = factory.getConnectionURL(); - - assertNull("Failover is set.", connectionurl.getFailoverMethod()); - assertEquals("guest", connectionurl.getUsername()); - assertEquals("guest", connectionurl.getPassword()); - assertEquals("clientID", connectionurl.getClientName()); - assertEquals("/test", connectionurl.getVirtualHost()); - - assertEquals(1, connectionurl.getBrokerCount()); - - BrokerDetails service = connectionurl.getBrokerDetails(0); - - assertEquals("tcp", service.getTransport()); - assertEquals("localhost", service.getHost()); - assertEquals(5672, service.getPort()); - - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java deleted file mode 100644 index a1b14d5723..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.qpid.test.unit.jndi; - -import java.util.Properties; - -import javax.jms.Queue; -import javax.jms.Topic; -import javax.naming.Context; -import javax.naming.InitialContext; - -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.framing.AMQShortString; - -import junit.framework.TestCase; - -public class JNDIPropertyFileTest extends TestCase -{ - Context ctx; - - public JNDIPropertyFileTest() throws Exception - { - Properties properties = new Properties(); - properties.load(this.getClass().getResourceAsStream("JNDITest.properties")); - - //Create the initial context - ctx = new InitialContext(properties); - } - - public void testQueueNamesWithTrailingSpaces() throws Exception - { - Queue queue = (Queue)ctx.lookup("QueueNameWithSpace"); - assertEquals("QueueNameWithSpace",queue.getQueueName()); - } - - public void testTopicNamesWithTrailingSpaces() throws Exception - { - Topic topic = (Topic)ctx.lookup("TopicNameWithSpace"); - assertEquals("TopicNameWithSpace",topic.getTopicName()); - } - - public void testMultipleTopicNamesWithTrailingSpaces() throws Exception - { - Topic topic = (Topic)ctx.lookup("MultipleTopicNamesWithSpace"); - int i = 0; - for (AMQShortString bindingKey: ((AMQDestination)topic).getBindingKeys()) - { - i++; - assertEquals("Topic" + i + "WithSpace",bindingKey.asString()); - } - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties b/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties deleted file mode 100644 index 07017a05a6..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties +++ /dev/null @@ -1,28 +0,0 @@ -# -# 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. -# -java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory - -# Queue name with spaces -queue.QueueNameWithSpace = QueueNameWithSpace - -# Topic name with spaces -topic.TopicNameWithSpace = TopicNameWithSpace - -# Multiple topic names with spaces -topic.MultipleTopicNamesWithSpace = Topic1WithSpace , Topic2WithSpace , Topic3WithSpace diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/message/MessageConverterTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/message/MessageConverterTest.java deleted file mode 100644 index b5e7ae82b5..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/message/MessageConverterTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * - * 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.qpid.test.unit.message; - -import javax.jms.*; - -import junit.framework.TestCase; - -import org.apache.qpid.client.*; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.client.message.*; -import org.apache.qpid.exchange.ExchangeDefaults; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.AMQException; - -import java.util.Map; - - -public class MessageConverterTest extends TestCase -{ - - public static final String JMS_CORR_ID = "QPIDID_01"; - public static final int JMS_DELIV_MODE = 1; - public static final String JMS_TYPE = "test.jms.type"; - public static final Destination JMS_REPLY_TO = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME,"my.replyto"); - - protected JMSTextMessage testTextMessage; - - protected JMSMapMessage testMapMessage; - private AMQSession _session = new TestAMQSession(); - - - protected void setUp() throws Exception - { - super.setUp(); - testTextMessage = new JMSTextMessage(AMQMessageDelegateFactory.FACTORY_0_8); - - //Set Message Text - testTextMessage.setText("testTextMessage text"); - setMessageProperties(testTextMessage); - - testMapMessage = new JMSMapMessage(AMQMessageDelegateFactory.FACTORY_0_8); - testMapMessage.setString("testMapString", "testMapStringValue"); - testMapMessage.setDouble("testMapDouble", Double.MAX_VALUE); - } - - public void testSetProperties() throws Exception - { - AbstractJMSMessage newMessage = new MessageConverter(_session, (TextMessage) testTextMessage).getConvertedMessage(); - mesagePropertiesTest(testTextMessage, newMessage); - } - - public void testJMSTextMessageConversion() throws Exception - { - AbstractJMSMessage newMessage = new MessageConverter(_session, (TextMessage) testTextMessage).getConvertedMessage(); - assertEquals("Converted message text mismatch", ((JMSTextMessage) newMessage).getText(), testTextMessage.getText()); - } - - public void testJMSMapMessageConversion() throws Exception - { - AbstractJMSMessage newMessage = new MessageConverter(_session, (MapMessage) testMapMessage).getConvertedMessage(); - assertEquals("Converted map message String mismatch", ((JMSMapMessage) newMessage).getString("testMapString"), - testMapMessage.getString("testMapString")); - assertEquals("Converted map message Double mismatch", ((JMSMapMessage) newMessage).getDouble("testMapDouble"), - testMapMessage.getDouble("testMapDouble")); - - } - - public void testMessageConversion() throws Exception - { - Message newMessage = new NonQpidMessage(); - setMessageProperties(newMessage); - mesagePropertiesTest(testTextMessage, newMessage); - } - - private void setMessageProperties(Message message) throws JMSException - { - message.setJMSCorrelationID(JMS_CORR_ID); - message.setJMSDeliveryMode(JMS_DELIV_MODE); - message.setJMSType(JMS_TYPE); - message.setJMSReplyTo(JMS_REPLY_TO); - - //Add non-JMS properties - message.setStringProperty("testProp1", "testValue1"); - message.setDoubleProperty("testProp2", Double.MIN_VALUE); - } - - - private void mesagePropertiesTest(Message expectedMessage, Message actualMessage) - { - try - { - //check JMS prop values on newMessage match - assertEquals("JMS Correlation ID mismatch", expectedMessage.getJMSCorrelationID(), actualMessage.getJMSCorrelationID()); - assertEquals("JMS Delivery mode mismatch", expectedMessage.getJMSDeliveryMode(), actualMessage.getJMSDeliveryMode()); - assertEquals("JMS Type mismatch", expectedMessage.getJMSType(), actualMessage.getJMSType()); - assertEquals("JMS Reply To mismatch", expectedMessage.getJMSReplyTo(), actualMessage.getJMSReplyTo()); - - //check non-JMS standard props ok too - assertEquals("Test String prop value mismatch", expectedMessage.getStringProperty("testProp1"), - actualMessage.getStringProperty("testProp1")); - - assertEquals("Test Double prop value mismatch", expectedMessage.getDoubleProperty("testProp2"), - actualMessage.getDoubleProperty("testProp2")); - } - catch (JMSException e) - { - fail("An error occured testing the property values" + e.getCause()); - e.printStackTrace(); - } - } - - protected void tearDown() throws Exception - { - super.tearDown(); - testTextMessage = null; - } - - -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/message/NonQpidMessage.java b/java/client/src/test/java/org/apache/qpid/test/unit/message/NonQpidMessage.java deleted file mode 100644 index b1cf23bb9e..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/message/NonQpidMessage.java +++ /dev/null @@ -1,420 +0,0 @@ -/* - * 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.qpid.test.unit.message; - -import java.util.Enumeration; -import java.util.Hashtable; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageFormatException; - -public class NonQpidMessage implements Message -{ - private String _JMSMessageID; - private long _JMSTimestamp; - private byte[] _JMSCorrelationIDAsBytes; - private String _JMSCorrelationID; - private Destination _JMSReplyTo; - private Destination _JMSDestination; - private int _JMSDeliveryMode; - private boolean _JMSRedelivered; - private String _JMSType; - private long _JMSExpiration; - private int _JMSPriority; - private Hashtable _properties; - - public NonQpidMessage() - { - _properties = new Hashtable(); - _JMSPriority = javax.jms.Message.DEFAULT_PRIORITY; - _JMSDeliveryMode = javax.jms.Message.DEFAULT_DELIVERY_MODE; - } - - public String getJMSMessageID() throws JMSException - { - return _JMSMessageID; - } - - public void setJMSMessageID(String string) throws JMSException - { - _JMSMessageID = string; - } - - public long getJMSTimestamp() throws JMSException - { - return _JMSTimestamp; - } - - public void setJMSTimestamp(long l) throws JMSException - { - _JMSTimestamp = l; - } - - public byte[] getJMSCorrelationIDAsBytes() throws JMSException - { - return _JMSCorrelationIDAsBytes; - } - - public void setJMSCorrelationIDAsBytes(byte[] bytes) throws JMSException - { - _JMSCorrelationIDAsBytes = bytes; - } - - public void setJMSCorrelationID(String string) throws JMSException - { - _JMSCorrelationID = string; - } - - public String getJMSCorrelationID() throws JMSException - { - return _JMSCorrelationID; - } - - public Destination getJMSReplyTo() throws JMSException - { - return _JMSReplyTo; - } - - public void setJMSReplyTo(Destination destination) throws JMSException - { - _JMSReplyTo = destination; - } - - public Destination getJMSDestination() throws JMSException - { - return _JMSDestination; - } - - public void setJMSDestination(Destination destination) throws JMSException - { - _JMSDestination = destination; - } - - public int getJMSDeliveryMode() throws JMSException - { - return _JMSDeliveryMode; - } - - public void setJMSDeliveryMode(int i) throws JMSException - { - _JMSDeliveryMode = i; - } - - public boolean getJMSRedelivered() throws JMSException - { - return _JMSRedelivered; - } - - public void setJMSRedelivered(boolean b) throws JMSException - { - _JMSRedelivered = b; - } - - public String getJMSType() throws JMSException - { - return _JMSType; - } - - public void setJMSType(String string) throws JMSException - { - _JMSType = string; - } - - public long getJMSExpiration() throws JMSException - { - return _JMSExpiration; - } - - public void setJMSExpiration(long l) throws JMSException - { - _JMSExpiration = l; - } - - public int getJMSPriority() throws JMSException - { - return _JMSPriority; - } - - public void setJMSPriority(int i) throws JMSException - { - _JMSPriority = i; - } - - public void clearProperties() throws JMSException - { - _properties.clear(); - } - - public boolean propertyExists(String string) throws JMSException - { - return _properties.containsKey(string); - } - - public boolean getBooleanProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Boolean) - { - return (Boolean) o; - } - else - { - return Boolean.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public byte getByteProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Byte) - { - return (Byte) o; - } - else - { - return Byte.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public short getShortProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Short) - { - return (Short) o; - } - else - { - return Short.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public int getIntProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Integer) - { - return (Integer) o; - } - else - { - return Integer.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public long getLongProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Long) - { - return (Long) o; - } - else - { - return Long.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public float getFloatProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Float) - { - return (Float) o; - } - else if(o instanceof String) - { - return Float.valueOf((String)o); - } - else if(o == null) - { - throw new NullPointerException("No such property: " + string); - } - else - { - throw new MessageFormatException("getFloatProperty(\""+string+"\") failed as value is not a float: " + o); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public double getDoubleProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Double) - { - return (Double) o; - } - else - { - return getFloatProperty(string); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public String getStringProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof String) - { - return (String) o; - } - else - { - return null; - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public Object getObjectProperty(String string) throws JMSException - { - if (propertyExists(string)) - { - Object o = _properties.get(string); - if (o instanceof Boolean) - { - return (Boolean) o; - } - else - { - return Boolean.valueOf(null); - } - } - else - { - throw new JMSException("property does not exist: " + string); - } - } - - public Enumeration getPropertyNames() throws JMSException - { - return _properties.keys(); - } - - public void setBooleanProperty(String string, boolean b) throws JMSException - { - _properties.put(string, b); - } - - public void setByteProperty(String string, byte b) throws JMSException - { - _properties.put(string, b); - } - - public void setShortProperty(String string, short i) throws JMSException - { - _properties.put(string, i); - } - - public void setIntProperty(String string, int i) throws JMSException - { - _properties.put(string, i); - } - - public void setLongProperty(String string, long l) throws JMSException - { - _properties.put(string, l); - } - - public void setFloatProperty(String string, float v) throws JMSException - { - _properties.put(string, v); - } - - public void setDoubleProperty(String string, double v) throws JMSException - { - _properties.put(string, v); - } - - public void setStringProperty(String string, String string1) throws JMSException - { - _properties.put(string, string1); - } - - public void setObjectProperty(String string, Object object) throws JMSException - { - _properties.put(string, object); - } - - public void acknowledge() throws JMSException - { - - } - - public void clearBody() throws JMSException - { - - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java b/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java deleted file mode 100644 index 4637c6e505..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * - * 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.qpid.test.unit.message; - -import org.apache.qpid.client.*; -import org.apache.qpid.client.message.AMQMessageDelegateFactory; -import org.apache.qpid.client.protocol.AMQProtocolHandler; -import org.apache.qpid.client.failover.FailoverException; -import org.apache.qpid.framing.AMQShortString; -import org.apache.qpid.framing.FieldTable; -import org.apache.qpid.AMQException; - -import javax.jms.*; - -import java.util.Map; - -public class TestAMQSession extends AMQSession<BasicMessageConsumer_0_8, BasicMessageProducer_0_8> -{ - - public TestAMQSession() - { - super(null, 0, false, AUTO_ACKNOWLEDGE, null, 0, 0); - } - - public void acknowledgeMessage(long deliveryTag, boolean multiple) - { - - } - - public void sendQueueBind(AMQShortString queueName, AMQShortString routingKey, FieldTable arguments, - AMQShortString exchangeName, AMQDestination destination, - boolean nowait) throws AMQException, FailoverException - { - - } - - public void sendClose(long timeout) throws AMQException, FailoverException - { - - } - - public void sendCommit() throws AMQException, FailoverException - { - - } - - public TopicSubscriber createDurableSubscriber(Topic topic, String name) throws JMSException - { - return null; - } - - public void sendCreateQueue(AMQShortString name, boolean autoDelete, boolean durable, boolean exclusive, Map<String, Object> arguments) throws AMQException, FailoverException - { - - } - - public TemporaryQueue createTemporaryQueue() throws JMSException - { - return null; - } - - protected void sendRecover() throws AMQException, FailoverException - { - - } - - public void rejectMessage(long deliveryTag, boolean requeue) - { - - } - - public void releaseForRollback() - { - - } - - public void sendRollback() throws AMQException, FailoverException - { - - } - - public BasicMessageConsumer_0_8 createMessageConsumer(AMQDestination destination, int prefetchHigh, int prefetchLow, boolean noLocal, boolean exclusive, String selector, FieldTable arguments, boolean noConsume, boolean autoClose) throws JMSException - { - return null; - } - - public boolean isQueueBound(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey) throws JMSException - { - return false; - } - - public boolean isQueueBound(AMQDestination destination) throws JMSException - { - return false; - } - - public void sendConsume(BasicMessageConsumer_0_8 consumer, AMQShortString queueName, AMQProtocolHandler protocolHandler, boolean nowait, String messageSelector, int tag) throws AMQException, FailoverException - { - - } - - public BasicMessageProducer_0_8 createMessageProducer(Destination destination, boolean mandatory, boolean immediate, boolean waitUntilSent, long producerId) - { - return null; - } - - protected Long requestQueueDepth(AMQDestination amqd) throws AMQException, FailoverException - { - return null; - } - - public void sendExchangeDeclare(AMQShortString name, AMQShortString type, AMQProtocolHandler protocolHandler, boolean nowait) throws AMQException, FailoverException - { - - } - - public void sendQueueDeclare(AMQDestination amqd, AMQProtocolHandler protocolHandler, - boolean nowait) throws AMQException, FailoverException - { - - } - - public void sendQueueDelete(AMQShortString queueName) throws AMQException, FailoverException - { - - } - - public void sendSuspendChannel(boolean suspend) throws AMQException, FailoverException - { - - } - - protected boolean tagLE(long tag1, long tag2) - { - return false; - } - - protected boolean updateRollbackMark(long current, long deliveryTag) - { - return false; - } - - public AMQMessageDelegateFactory getMessageDelegateFactory() - { - return AMQMessageDelegateFactory.FACTORY_0_8; - } - - protected Object getFailoverMutex() - { - return this; - } - - public void checkNotClosed() - { - - } - - public void sync() - { - } - - public void handleAddressBasedDestination(AMQDestination dest, - boolean isConsumer, - boolean noWait) throws AMQException - { - throw new UnsupportedOperationException("The new addressing based sytanx is " - + "not supported for AMQP 0-8/0-9 versions"); - } - - @Override - protected void flushAcknowledgments() - { - } - - public boolean isQueueBound(String exchangeName, String queueName, - String bindingKey, Map<String, Object> args) throws JMSException - { - return false; - } - - @Override - public AMQException getLastException() - { - return null; - } -} diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/tests.properties b/java/client/src/test/java/org/apache/qpid/test/unit/tests.properties deleted file mode 100644 index 2fd961a078..0000000000 --- a/java/client/src/test/java/org/apache/qpid/test/unit/tests.properties +++ /dev/null @@ -1,45 +0,0 @@ -# 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. - - -java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory - -# use the following property to configure the default connector -#java.naming.provider.url - ignored. - -# register some connection factories -# connectionfactory.[jndiname] = [ConnectionURL] -connectionfactory.local = amqp://username:password@clientid/test?brokerlist='tcp://localhost:5672' -#qpid:password=guest;username=guest;client_id=clientid;virtualhost=test@tcp:127.0.0.1:5672 - - -# register some queues in JNDI using the form -# queue.[jndiName] = [physicalName] -queue.MyQueue = example.MyQueue -queue.queue = example.queue -queue.xaQueue = xaQueue - -# register some topics in JNDI using the form -# topic.[jndiName] = [physicalName] -#topic.ibmStocks = stocks.nyse.ibm -topic.xaTopic = xaTopic -topic.durableSubscriberTopic = durableSubscriberTopic - -# Register an AMQP destination in JNDI -# NOTE: Qpid currently only supports direct,topics and headers -# destination.[jniName] = [BindingURL] -#destination.direct = direct://amq.direct//directQueue |