diff options
author | Robert Godfrey <rgodfrey@apache.org> | 2009-08-27 12:27:48 +0000 |
---|---|---|
committer | Robert Godfrey <rgodfrey@apache.org> | 2009-08-27 12:27:48 +0000 |
commit | 606047e22fe1b829f287ecf71aa46ef4d42f25c9 (patch) | |
tree | 30ce11906fe5e83ff064a80e89593ca45afa1ffc | |
parent | 1ff7ce2b1476bed35829105456065fda0b7bf4ff (diff) | |
download | qpid-python-606047e22fe1b829f287ecf71aa46ef4d42f25c9.tar.gz |
Exchange command updates
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/java-broker-0-10@808396 13f79535-47bb-0310-9956-ffa450edef68
5 files changed, 87 insertions, 7 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java index c04b6c559c..e14dc936fd 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java @@ -59,6 +59,20 @@ public class DefaultExchangeFactory implements ExchangeFactory return _exchangeClassMap.values(); } + public Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete) + throws AMQException + { + ExchangeType<? extends Exchange> exchType = _exchangeClassMap.get(type); + if (exchType == null) + { + + throw new AMQUnknownExchangeType("Unknown exchange type: " + type,null); + } + Exchange e = exchType.newInstance(_host, (new AMQShortString(exchange)).intern(), durable, 0, autoDelete); + return e; + + } + public Exchange createExchange(AMQShortString exchange, AMQShortString type, boolean durable, boolean autoDelete, int ticket) throws AMQException @@ -73,7 +87,6 @@ public class DefaultExchangeFactory implements ExchangeFactory return e; } - @Override public void initialise(VirtualHostConfiguration hostConfig) { diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java index 25ced58060..e865f319a3 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java @@ -108,6 +108,11 @@ public class DefaultExchangeRegistry implements ExchangeRegistry } } + public void unregisterExchange(String name, boolean inUse) throws AMQException + { + unregisterExchange(new AMQShortString(name), inUse); + } + public Exchange getExchange(AMQShortString name) { if ((name == null) || name.length() == 0) diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java index 2f76d41228..b91bf559f1 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java @@ -38,4 +38,6 @@ public interface ExchangeFactory void initialise(VirtualHostConfiguration hostConfig); Collection<ExchangeType<? extends Exchange>> getRegisteredTypes(); + + Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete) throws AMQException; } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java index 6b42187f9c..e34ef29d9b 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java @@ -50,4 +50,6 @@ public interface ExchangeRegistry extends MessageRouter void initialise() throws AMQException; Exchange getExchange(String exchangeName); + + void unregisterExchange(String exchange, boolean ifUnused) throws ExchangeInUseException, AMQException;; } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java index 7ed013db48..edd419ef9e 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java @@ -26,6 +26,8 @@ import org.apache.qpid.server.registry.ApplicationRegistry; import org.apache.qpid.server.virtualhost.VirtualHost; import org.apache.qpid.server.exchange.ExchangeRegistry; import org.apache.qpid.server.exchange.Exchange; +import org.apache.qpid.server.exchange.ExchangeFactory; +import org.apache.qpid.server.exchange.ExchangeInUseException; import org.apache.qpid.server.queue.QueueRegistry; import org.apache.qpid.server.queue.AMQQueue; import org.apache.qpid.server.queue.AMQQueueFactory; @@ -36,10 +38,12 @@ import org.apache.qpid.server.protocol.AMQProtocolSession; import org.apache.qpid.server.AMQChannel; import org.apache.qpid.server.store.StoreContext; import org.apache.qpid.AMQException; +import org.apache.qpid.AMQUnknownExchangeType; import org.apache.qpid.protocol.AMQConstant; import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.framing.MethodRegistry; import org.apache.qpid.framing.QueueDeleteOkBody; +import org.apache.qpid.framing.ExchangeDeleteOkBody; import java.util.ArrayList; import java.util.Map; @@ -241,8 +245,10 @@ public class ServerSessionDelegate extends SessionDelegate { exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '"+exchangeName+"'"); - // TODO - control flow - return; + } + else + { + // TODO - check exchange has same properties } } @@ -258,12 +264,36 @@ public class ServerSessionDelegate extends SessionDelegate exception(session, method, errorCode, description); - // TODO - Control Flow - return; + } + else + { + ExchangeRegistry exchangeRegistry = getExchangeRegistry(session); + ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory(); + try + { + + exchange = exchangeFactory.createExchange(method.getExchange(), + method.getType(), + method.getDurable(), + method.getAutoDelete()); + + exchangeRegistry.registerExchange(exchange); + } + catch(AMQUnknownExchangeType e) + { + exception(session, method, ExecutionErrorCode.NOT_FOUND, "Unknown Exchange Type: " + method.getType()); + } + catch (AMQException e) + { + //TODO + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + throw new RuntimeException(e); + } + + } - // TODO } } @@ -307,7 +337,35 @@ public class ServerSessionDelegate extends SessionDelegate @Override public void exchangeDelete(Session session, ExchangeDelete method) { - super.exchangeDelete(session, method); + VirtualHost virtualHost = getVirtualHost(session); + ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry(); + + //Perform ACLs + if (!virtualHost.getAccessManager().authoriseDelete((ServerSession)session, + exchangeRegistry.getExchange(method.getExchange()))) + { + exception(session,method, ExecutionErrorCode.NOT_ALLOWED, "Permission denied"); + + } + else + { + + try + { + exchangeRegistry.unregisterExchange(method.getExchange(), method.getIfUnused()); + } + catch (ExchangeInUseException e) + { + exception(session, method, ExecutionErrorCode.PRECONDITION_FAILED, "Exchange in use"); + } + catch (AMQException e) + { + // TODO + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + throw new RuntimeException(e); + } + } + } @Override |