summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2009-08-27 12:27:48 +0000
committerRobert Godfrey <rgodfrey@apache.org>2009-08-27 12:27:48 +0000
commit606047e22fe1b829f287ecf71aa46ef4d42f25c9 (patch)
tree30ce11906fe5e83ff064a80e89593ca45afa1ffc
parent1ff7ce2b1476bed35829105456065fda0b7bf4ff (diff)
downloadqpid-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
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java15
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java70
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