diff options
Diffstat (limited to 'java/broker')
14 files changed, 380 insertions, 311 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/Main.java b/java/broker/src/main/java/org/apache/qpid/server/Main.java index 1e5f56fe3a..c345b43aeb 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/Main.java +++ b/java/broker/src/main/java/org/apache/qpid/server/Main.java @@ -373,6 +373,7 @@ public class Main } acceptor.bind(bindAddress, handler, sconfig); + //fixme qpid.AMQP should be using qpidproperties to get value _brokerLogger.info("Qpid.AMQP listening on non-SSL address " + bindAddress); } @@ -381,14 +382,21 @@ public class Main AMQPFastProtocolHandler handler = new AMQPProtocolProvider().getHandler(); try { - acceptor.bind(new InetSocketAddress(connectorConfig.sslPort), handler, sconfig); + + acceptor.bind(new InetSocketAddress(connectorConfig.sslPort), handler, sconfig); + //fixme qpid.AMQP should be using qpidproperties to get value _brokerLogger.info("Qpid.AMQP listening on SSL port " + connectorConfig.sslPort); + } catch (IOException e) { _brokerLogger.error("Unable to listen on SSL port: " + e, e); } } + + //fixme qpid.AMQP should be using qpidproperties to get value + _brokerLogger.info("Qpid Broker Ready :" + QpidProperties.getReleaseVersion() + + " build: " + QpidProperties.getBuildVersion()); } catch (Exception e) { diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/DestWildExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/DestWildExchange.java index 8a50e93bf9..605a4bcb61 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/exchange/DestWildExchange.java +++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/DestWildExchange.java @@ -57,19 +57,16 @@ public class DestWildExchange extends AbstractExchange private ConcurrentHashMap<AMQShortString, List<AMQQueue>> _routingKey2queues = new ConcurrentHashMap<AMQShortString, List<AMQQueue>>(); - /** - * DestWildExchangeMBean class implements the management interface for the - * Topic exchanges. - */ + /** DestWildExchangeMBean class implements the management interface for the Topic exchanges. */ @MBeanDescription("Management Bean for Topic Exchange") private final class DestWildExchangeMBean extends ExchangeMBean { // open mbean data types for representing exchange bindings - private String[] _bindingItemNames = {"Routing Key", "Queue Names"}; - private String[] _bindingItemIndexNames = {_bindingItemNames[0]}; + private String[] _bindingItemNames = {"Routing Key", "Queue Names"}; + private String[] _bindingItemIndexNames = {_bindingItemNames[0]}; private OpenType[] _bindingItemTypes = new OpenType[2]; - private CompositeType _bindingDataType = null; - private TabularType _bindinglistDataType = null; + private CompositeType _bindingDataType = null; + private TabularType _bindinglistDataType = null; private TabularDataSupport _bindingList = null; @MBeanConstructor("Creates an MBean for AMQ topic exchange") @@ -80,22 +77,18 @@ public class DestWildExchange extends AbstractExchange init(); } - /** - * initialises the OpenType objects. - */ + /** initialises the OpenType objects. */ private void init() throws OpenDataException { _bindingItemTypes[0] = SimpleType.STRING; _bindingItemTypes[1] = new ArrayType(1, SimpleType.STRING); _bindingDataType = new CompositeType("Exchange Binding", "Routing key and Queue names", - _bindingItemNames, _bindingItemNames, _bindingItemTypes); + _bindingItemNames, _bindingItemNames, _bindingItemTypes); _bindinglistDataType = new TabularType("Exchange Bindings", "Exchange Bindings for " + getName(), - _bindingDataType, _bindingItemIndexNames); + _bindingDataType, _bindingItemIndexNames); } - /** - * returns exchange bindings in tabular form - */ + /** returns exchange bindings in tabular form */ public TabularData bindings() throws OpenDataException { _bindingList = new TabularDataSupport(_bindinglistDataType); @@ -122,7 +115,9 @@ public class DestWildExchange extends AbstractExchange { AMQQueue queue = getQueueRegistry().getQueue(new AMQShortString(queueName)); if (queue == null) + { throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange."); + } try { @@ -159,7 +154,7 @@ public class DestWildExchange extends AbstractExchange { queueList.add(queue); } - else if(_logger.isDebugEnabled()) + else if (_logger.isDebugEnabled()) { _logger.debug("Queue " + queue + " is already registered with routing key " + routingKey); } @@ -176,10 +171,18 @@ public class DestWildExchange extends AbstractExchange // TODO: add support for the immediate flag if (queues == null) { - _logger.warn("No queues found for routing key " + routingKey); - _logger.warn("Routing map contains: " + _routingKey2queues); - //todo Check for valid topic - mritchie - return; + if (info.isMandatory()) + { + String msg = "Topic " + routingKey + " is not known to " + this; + throw new NoRouteException(msg, payload); + } + else + { + _logger.warn("No queues found for routing key " + routingKey); + _logger.warn("Routing map contains: " + _routingKey2queues); + //todo Check for valid topic - mritchie + return; + } } for (AMQQueue q : queues) @@ -245,7 +248,7 @@ public class DestWildExchange extends AbstractExchange } } - protected ExchangeMBean createMBean() throws AMQException + protected ExchangeMBean createMBean() throws AMQException { try { diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/ArithmeticExpression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/ArithmeticExpression.java index 1b3b116fd0..138d4155b1 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/ArithmeticExpression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/ArithmeticExpression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /** * * Licensed to the Apache Software Foundation (ASF) under one or more @@ -20,16 +21,14 @@ package org.apache.qpid.server.filter; // Based on like named file from r450141 of the Apache ActiveMQ project <http://www.activemq.org/site/home.html> // - import org.apache.qpid.AMQException; import org.apache.qpid.server.queue.AMQMessage; /** * An expression which performs an operation on two expression values - * - * @version $Revision$ */ -public abstract class ArithmeticExpression extends BinaryExpression { +public abstract class ArithmeticExpression extends BinaryExpression +{ protected static final int INTEGER = 1; protected static final int LONG = 2; @@ -39,156 +38,213 @@ public abstract class ArithmeticExpression extends BinaryExpression { * @param left * @param right */ - public ArithmeticExpression(Expression left, Expression right) { + 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; - String answer = text + rvalue; - return answer; + 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; + String answer = text + rvalue; + + return answer; + } + else if (lvalue instanceof Number) + { + return plus((Number) lvalue, asNumber(rvalue)); + } + + throw new RuntimeException("Cannot call plus operation on: " + lvalue + " and: " + rvalue); } - else if (lvalue instanceof Number) { - return plus((Number) lvalue, asNumber(rvalue)); + + public String getExpressionSymbol() + { + return "+"; } - throw new RuntimeException("Cannot call plus operation on: " + lvalue + " and: " + rvalue); - } + }; + } - public String getExpressionSymbol() + public static Expression createMinus(Expression left, Expression right) + { + return new ArithmeticExpression(left, right) { - return "+"; - } - }; - } + protected Object evaluate(Object lvalue, Object rvalue) + { + if (lvalue instanceof Number) + { + return minus((Number) lvalue, asNumber(rvalue)); + } - 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); } - throw new RuntimeException("Cannot call minus operation on: " + lvalue + " and: " + rvalue); - } - public String getExpressionSymbol() { - return "-"; - } - }; + public String getExpressionSymbol() + { + return "-"; + } + }; } - public static Expression createMultiply(Expression left, Expression right) { - return new ArithmeticExpression(left, right) { + 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)); + } - 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); } - throw new RuntimeException("Cannot call multiply operation on: " + lvalue + " and: " + rvalue); - } - public String getExpressionSymbol() { - return "*"; - } - }; + public String getExpressionSymbol() + { + return "*"; + } + }; } - public static Expression createDivide(Expression left, Expression right) { - return new ArithmeticExpression(left, right) { + 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)); + 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); } - throw new RuntimeException("Cannot call divide operation on: " + lvalue + " and: " + rvalue); - } - public String getExpressionSymbol() { - return "/"; - } - }; + public String getExpressionSymbol() + { + return "/"; + } + }; } - public static Expression createMod(Expression left, Expression right) { - return new ArithmeticExpression(left, right) { + 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)); + } - 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); } - throw new RuntimeException("Cannot call mod operation on: " + lvalue + " and: " + rvalue); - } - public String getExpressionSymbol() { - return "%"; - } - }; + public String getExpressionSymbol() + { + return "%"; + } + }; } - protected Number plus(Number left, Number right) { - switch (numberType(left, right)) { - case INTEGER: - return new Integer(left.intValue() + right.intValue()); - case LONG: - return new Long(left.longValue() + right.longValue()); - default: - return new Double(left.doubleValue() + right.doubleValue()); + protected Number plus(Number left, Number right) + { + switch (numberType(left, right)) + { + + case INTEGER: + return new Integer(left.intValue() + right.intValue()); + + case 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 INTEGER: - return new Integer(left.intValue() - right.intValue()); - case 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 INTEGER: + return new Integer(left.intValue() - right.intValue()); + + case 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 INTEGER: - return new Integer(left.intValue() * right.intValue()); - case 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 INTEGER: + return new Integer(left.intValue() * right.intValue()); + + case LONG: + return new Long(left.longValue() * right.longValue()); + + default: + return new Double(left.doubleValue() * right.doubleValue()); } } - protected Number divide(Number left, Number right) { + protected Number divide(Number left, Number right) + { return new Double(left.doubleValue() / right.doubleValue()); } - protected Number mod(Number left, Number right) { + 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)) { + private int numberType(Number left, Number right) + { + if (isDouble(left) || isDouble(right)) + { return DOUBLE; } - else if (left instanceof Long || right instanceof Long) { + else if ((left instanceof Long) || (right instanceof Long)) + { return LONG; } - else { + else + { return INTEGER; } } - private boolean isDouble(Number n) { - return n instanceof Float || n instanceof Double; + private boolean isDouble(Number n) + { + return (n instanceof Float) || (n instanceof Double); } - protected Number asNumber(Object value) { - if (value instanceof Number) { + protected Number asNumber(Object value) + { + if (value instanceof Number) + { return (Number) value; } - else { + else + { throw new RuntimeException("Cannot convert value: " + value + " into a number"); } } @@ -196,22 +252,25 @@ public abstract class ArithmeticExpression extends BinaryExpression { public Object evaluate(AMQMessage message) throws AMQException { Object lvalue = left.evaluate(message); - if (lvalue == null) { + if (lvalue == null) + { return null; } + Object rvalue = right.evaluate(message); - if (rvalue == null) { + if (rvalue == null) + { return null; } + return evaluate(lvalue, rvalue); } - /** * @param lvalue * @param rvalue * @return */ - abstract protected Object evaluate(Object lvalue, Object rvalue); + protected abstract Object evaluate(Object lvalue, Object rvalue); } diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/BinaryExpression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/BinaryExpression.java index 4256ab9189..1a1024bd2b 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/BinaryExpression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/BinaryExpression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /** * * Licensed to the Apache Software Foundation (ASF) under one or more @@ -20,35 +21,35 @@ package org.apache.qpid.server.filter; // Based on like named file from r450141 of the Apache ActiveMQ project <http://www.activemq.org/site/home.html> // - - /** * An expression which performs an operation on two expression values. - * - * @version $Revision$ */ -abstract public class BinaryExpression implements Expression { +public abstract class BinaryExpression implements Expression +{ protected Expression left; protected Expression right; - public BinaryExpression(Expression left, Expression right) { + public BinaryExpression(Expression left, Expression right) + { this.left = left; this.right = right; } - public Expression getLeft() { + public Expression getLeft() + { return left; } - public Expression getRight() { + public Expression getRight() + { return right; } - /** * @see java.lang.Object#toString() */ - public String toString() { + public String toString() + { return "(" + left.toString() + " " + getExpressionSymbol() + " " + right.toString() + ")"; } @@ -57,7 +58,8 @@ abstract public class BinaryExpression implements Expression { * * @see java.lang.Object#hashCode() */ - public int hashCode() { + public int hashCode() + { return toString().hashCode(); } @@ -66,11 +68,14 @@ abstract public class BinaryExpression implements Expression { * * @see java.lang.Object#equals(java.lang.Object) */ - public boolean equals(Object o) { + public boolean equals(Object o) + { - if (o == null || !this.getClass().equals(o.getClass())) { + if ((o == null) || !this.getClass().equals(o.getClass())) + { return false; } + return toString().equals(o.toString()); } @@ -81,20 +86,22 @@ abstract public class BinaryExpression implements Expression { * * @return */ - abstract public String getExpressionSymbol(); + public abstract String getExpressionSymbol(); /** * @param expression */ - public void setRight(Expression expression) { + public void setRight(Expression expression) + { right = expression; } /** * @param expression */ - public void setLeft(Expression expression) { + public void setLeft(Expression expression) + { left = expression; } - + } diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/BooleanExpression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/BooleanExpression.java index 122527d4f3..0d5c5009f7 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/BooleanExpression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/BooleanExpression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /** * * Licensed to the Apache Software Foundation (ASF) under one or more @@ -20,18 +21,12 @@ package org.apache.qpid.server.filter; // Based on like named file from r450141 of the Apache ActiveMQ project <http://www.activemq.org/site/home.html> // - import org.apache.qpid.AMQException; import org.apache.qpid.server.queue.AMQMessage; - - - /** * A BooleanExpression is an expression that always * produces a Boolean result. - * - * @version $Revision$ */ public interface BooleanExpression extends Expression { diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/ComparisonExpression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/ComparisonExpression.java index cedb8d7ca8..606a59e0fa 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/ComparisonExpression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/ComparisonExpression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /* * * Licensed to the Apache Software Foundation (ASF) under one @@ -32,8 +33,6 @@ import org.apache.qpid.server.queue.AMQMessage; /** * A filter performing a comparison of two objects - * - * @version $Revision$ */ public abstract class ComparisonExpression extends BinaryExpression implements BooleanExpression { @@ -153,7 +152,7 @@ public abstract class ComparisonExpression extends BinaryExpression implements B { return Boolean.FALSE; - //throw new RuntimeException("LIKE can only operate on String identifiers. LIKE attemped on: '" + rv.getClass()); + // 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; @@ -240,42 +239,42 @@ public abstract class ComparisonExpression extends BinaryExpression implements B private static BooleanExpression doCreateEqual(Expression left, Expression right) { return new ComparisonExpression(left, right) - { - - public Object evaluate(AMQMessage message) throws AMQException { - Object lv = left.evaluate(message); - Object rv = right.evaluate(message); - // Iff one of the values is null - if ((lv == null) ^ (rv == null)) + public Object evaluate(AMQMessage message) throws AMQException { + 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; } - if ((lv == rv) || lv.equals(rv)) + protected boolean asBoolean(int answer) { - return Boolean.TRUE; + return answer == 0; } - if ((lv instanceof Comparable) && (rv instanceof Comparable)) + public String getExpressionSymbol() { - return compare((Comparable) lv, (Comparable) rv); + return "="; } - - 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) @@ -284,17 +283,17 @@ public abstract class ComparisonExpression extends BinaryExpression implements B checkLessThanOperand(right); return new ComparisonExpression(left, right) - { - protected boolean asBoolean(int answer) { - return answer > 0; - } + protected boolean asBoolean(int answer) + { + return answer > 0; + } - public String getExpressionSymbol() - { - return ">"; - } - }; + public String getExpressionSymbol() + { + return ">"; + } + }; } public static BooleanExpression createGreaterThanEqual(final Expression left, final Expression right) @@ -303,17 +302,17 @@ public abstract class ComparisonExpression extends BinaryExpression implements B checkLessThanOperand(right); return new ComparisonExpression(left, right) - { - protected boolean asBoolean(int answer) { - return answer >= 0; - } + protected boolean asBoolean(int answer) + { + return answer >= 0; + } - public String getExpressionSymbol() - { - return ">="; - } - }; + public String getExpressionSymbol() + { + return ">="; + } + }; } public static BooleanExpression createLessThan(final Expression left, final Expression right) @@ -322,19 +321,19 @@ public abstract class ComparisonExpression extends BinaryExpression implements B checkLessThanOperand(right); return new ComparisonExpression(left, right) - { - - protected boolean asBoolean(int answer) { - return answer < 0; - } - public String getExpressionSymbol() - { - return "<"; - } + protected boolean asBoolean(int answer) + { + return answer < 0; + } + + public String getExpressionSymbol() + { + return "<"; + } - }; + }; } public static BooleanExpression createLessThanEqual(final Expression left, final Expression right) @@ -343,18 +342,18 @@ public abstract class ComparisonExpression extends BinaryExpression implements B checkLessThanOperand(right); return new ComparisonExpression(left, right) - { - - protected boolean asBoolean(int answer) { - return answer <= 0; - } - public String getExpressionSymbol() - { - return "<="; - } - }; + protected boolean asBoolean(int answer) + { + return answer <= 0; + } + + public String getExpressionSymbol() + { + return "<="; + } + }; } /** diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/Expression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/Expression.java index 4a2130e767..cb40a32290 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/Expression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/Expression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /** * * Licensed to the Apache Software Foundation (ASF) under one or more @@ -15,7 +16,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.qpid.server.filter; // // Based on like named file from r450141 of the Apache ActiveMQ project <http://www.activemq.org/site/home.html> @@ -24,11 +24,8 @@ package org.apache.qpid.server.filter; import org.apache.qpid.AMQException; import org.apache.qpid.server.queue.AMQMessage; - /** * Represents an expression - * - * @version $Revision$ */ public interface Expression { @@ -37,5 +34,5 @@ public interface Expression * @return the value of this expression */ public Object evaluate(AMQMessage message) throws AMQException; - + } diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/LogicExpression.java b/java/broker/src/main/java/org/apache/qpid/server/filter/LogicExpression.java index dea6092b8a..a90775a186 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/filter/LogicExpression.java +++ b/java/broker/src/main/java/org/apache/qpid/server/filter/LogicExpression.java @@ -1,3 +1,4 @@ +/* Copyright Rupert Smith, 2005 to 2006, all rights reserved. */ /** * * Licensed to the Apache Software Foundation (ASF) under one or more @@ -25,69 +26,86 @@ import org.apache.qpid.server.queue.AMQMessage; /** * A filter performing a comparison of two objects - * - * @version $Revision$ */ -public abstract class LogicExpression extends BinaryExpression implements BooleanExpression { - - public static BooleanExpression createOR(BooleanExpression lvalue, BooleanExpression rvalue) { - return new LogicExpression(lvalue, rvalue) { - - public Object evaluate(AMQMessage message) throws AMQException { - - Boolean lv = (Boolean) left.evaluate(message); - // Can we do an OR shortcut?? - if (lv !=null && lv.booleanValue()) { - return Boolean.TRUE; +public abstract class LogicExpression extends BinaryExpression implements BooleanExpression +{ + + public static BooleanExpression createOR(BooleanExpression lvalue, BooleanExpression rvalue) + { + return new LogicExpression(lvalue, rvalue) + { + + public Object evaluate(AMQMessage message) throws AMQException + { + + 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"; } - - 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 static BooleanExpression createAND(BooleanExpression lvalue, BooleanExpression rvalue) + { + return new LogicExpression(lvalue, rvalue) + { - public Object evaluate(AMQMessage message) throws AMQException { + public Object evaluate(AMQMessage message) throws AMQException + { - Boolean lv = (Boolean) left.evaluate(message); + Boolean lv = (Boolean) left.evaluate(message); - // Can we do an AND shortcut?? - if (lv == null) - return null; - if (!lv.booleanValue()) { - return Boolean.FALSE; - } + // Can we do an AND shortcut?? + if (lv == null) + { + return null; + } + + if (!lv.booleanValue()) + { + return Boolean.FALSE; + } + + Boolean rv = (Boolean) right.evaluate(message); - Boolean rv = (Boolean) right.evaluate(message); - return rv == null ? null : rv; - } + return (rv == null) ? null : rv; + } - public String getExpressionSymbol() { - return "AND"; - } - }; + public String getExpressionSymbol() + { + return "AND"; + } + }; } /** * @param left * @param right */ - public LogicExpression(BooleanExpression left, BooleanExpression right) { + public LogicExpression(BooleanExpression left, BooleanExpression right) + { super(left, right); } - abstract public Object evaluate(AMQMessage message) throws AMQException; + public abstract Object evaluate(AMQMessage message) throws AMQException; - public boolean matches(AMQMessage message) throws AMQException { + public boolean matches(AMQMessage message) throws AMQException + { Object object = evaluate(message); - return object!=null && object==Boolean.TRUE; + + return (object != null) && (object == Boolean.TRUE); } } diff --git a/java/broker/src/main/java/org/apache/qpid/server/management/MBeanInvocationHandlerImpl.java b/java/broker/src/main/java/org/apache/qpid/server/management/MBeanInvocationHandlerImpl.java index 7d25fb8c69..3ab23e8b46 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/management/MBeanInvocationHandlerImpl.java +++ b/java/broker/src/main/java/org/apache/qpid/server/management/MBeanInvocationHandlerImpl.java @@ -17,8 +17,7 @@ */ package org.apache.qpid.server.management; -import org.apache.qpid.AMQException; -import org.apache.qpid.server.security.access.AMQUserManagementMBean; +import org.apache.qpid.server.security.access.UserManagement; import org.apache.log4j.Logger; import javax.management.remote.MBeanServerForwarder; @@ -37,12 +36,6 @@ import java.security.Principal; import java.security.AccessControlContext; import java.util.Set; import java.util.Properties; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentHashMap; -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.io.FileInputStream; /** * This class can be used by the JMXConnectorServer as an InvocationHandler for the mbean operations. This implements @@ -110,6 +103,7 @@ public class MBeanInvocationHandlerImpl implements InvocationHandler // Restrict access to "createMBean" and "unregisterMBean" to any user if (methodName.equals("createMBean") || methodName.equals("unregisterMBean")) { + _logger.debug("User trying to create or unregister an MBean"); throw new SecurityException("Access denied"); } @@ -155,32 +149,8 @@ public class MBeanInvocationHandlerImpl implements InvocationHandler { if (args[0] instanceof ObjectName) { - String mbeanMethod = (args.length > 1) ? (String) args[1] : null; - if (mbeanMethod == null) - { - if (args[0] instanceof ObjectName) - { - ObjectName object = (ObjectName) args[0]; - return object.getCanonicalName().contains("UserManagement"); - } - else - { - return false; - } - } - - try - { - MBeanInfo mbeanInfo = mbs.getMBeanInfo((ObjectName) args[0]); - if (mbeanInfo != null) - { - return mbeanInfo.getClassName().equals("org.apache.qpid.server.security.access.AMQUserManagementMBean"); - } - } - catch (JMException ex) - { - return false; - } + ObjectName object = (ObjectName) args[0]; + return UserManagement.TYPE.equals(object.getKeyProperty("type")); } return false; @@ -223,16 +193,16 @@ public class MBeanInvocationHandlerImpl implements InvocationHandler private boolean isReadOnlyMethod(Method method, Object[] args) { String methodName = method.getName(); - if (methodName.equals("queryMBeans") || - methodName.equals("getDefaultDomain") || - methodName.equals("getMBeanInfo") || - methodName.equals("getAttribute") || - methodName.equals("getAttributes")) + if (methodName.startsWith("query") || methodName.startsWith("get")) { return true; } + else if (methodName.startsWith("set")) + { + return false; + } - if (args[0] instanceof ObjectName) + if ((args[0] instanceof ObjectName) && (methodName.equals("invoke"))) { String mbeanMethod = (args.length > 1) ? (String) args[1] : null; if (mbeanMethod == null) diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java index 2e62c2f1e4..3162efa183 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java +++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java @@ -463,7 +463,17 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, throw new AMQException("Session is marked awaiting channel close"); } - _channelMap.put(channelId, channel); + if (_channelMap.size() == _maxNoOfChannels) + { + String errorMessage = toString() + ": maximum number of channels has been reached (" + + _maxNoOfChannels + "); can't create channel"; + _logger.error(errorMessage); + throw new AMQException(AMQConstant.NOT_ALLOWED, errorMessage); + } + else + { + _channelMap.put(channel.getChannelId(), channel); + } if (((channelId & CHANNEL_CACHE_SIZE) == channelId)) { @@ -755,8 +765,9 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, { return _authorizedID; } + public String getClientVersion() { - return _clientVersion == null ? null : _clientVersion.toString(); + return _clientVersion == null ? null : _clientVersion.toString(); } } diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQMessage.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQMessage.java index e19038504f..955aaa6acb 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQMessage.java +++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQMessage.java @@ -366,7 +366,7 @@ public class AMQMessage */ public AMQMessage takeReference() { - _referenceCount.incrementAndGet(); + incrementReference();// _referenceCount.incrementAndGet(); return this; } diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java index 65d5906d05..0adf6153f8 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java +++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java @@ -615,7 +615,7 @@ public class AMQQueue implements Managable, Comparable } catch (MessageCleanupException e) { - //Message was dequeued, but could notthen be deleted + //Message was dequeued, but could not then be deleted //though it is no longer referenced. This should be very //rare and can be detected and cleaned up on recovery or //done through some form of manual intervention. diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/access/UserManagement.java b/java/broker/src/main/java/org/apache/qpid/server/security/access/UserManagement.java index ec7031534b..b8762aa43b 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/security/access/UserManagement.java +++ b/java/broker/src/main/java/org/apache/qpid/server/security/access/UserManagement.java @@ -63,7 +63,7 @@ public interface UserManagement impact = MBeanOperationInfo.ACTION) boolean setRights(@MBeanOperationParameter(name = "username", description = "Username")String username, @MBeanOperationParameter(name = "read", description = "Administration read")boolean read, - @MBeanOperationParameter(name = "write", description = "Administration write")boolean write, + @MBeanOperationParameter(name = "readAndWrite", description = "Administration write")boolean write, @MBeanOperationParameter(name = "admin", description = "Administration rights")boolean admin); /** @@ -82,7 +82,7 @@ public interface UserManagement boolean createUser(@MBeanOperationParameter(name = "username", description = "Username")String username, @MBeanOperationParameter(name = "password", description = "Password")char[] password, @MBeanOperationParameter(name = "read", description = "Administration read")boolean read, - @MBeanOperationParameter(name = "write", description = "Administration write")boolean write, + @MBeanOperationParameter(name = "readAndWrite", description = "Administration write")boolean write, @MBeanOperationParameter(name = "admin", description = "Administration rights")boolean admin); /** diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java index a5c5763db1..a9496d0de1 100644 --- a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java +++ b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java @@ -106,7 +106,7 @@ public class AMQQueueAlertTest extends TestCase /** * Tests if Queue Depth alert is thrown when queue depth reaches the threshold value * - * Based on FT402 subbmitted by client + * Based on FT-402 subbmitted by client * * @throws Exception */ @@ -134,6 +134,8 @@ public class AMQQueueAlertTest extends TestCase * Tests if MESSAGE AGE alert is thrown, when a message is in the queue for time higher than threshold value of * message age * + * Alternative test to FT-401 provided by client + * * @throws Exception */ public void testMessageAgeAlert() throws Exception |
