summaryrefslogtreecommitdiff
path: root/qpid/java/broker/src
diff options
context:
space:
mode:
authorAlex Rudyy <orudyy@apache.org>2013-03-18 18:12:57 +0000
committerAlex Rudyy <orudyy@apache.org>2013-03-18 18:12:57 +0000
commit592669bad63f5579d3516f41ea143c9a549a261a (patch)
tree616e60ac1fceeb5bbe44e4103dde0d9f166cca2b /qpid/java/broker/src
parent248116abe95421844fed3dc086895230e3f3fb74 (diff)
downloadqpid-python-592669bad63f5579d3516f41ea143c9a549a261a.tar.gz
QPID-4657: Add UI into java broker web management console to add/edit/delete ports
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1457903 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker/src')
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java1
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java47
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java9
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java24
4 files changed, 70 insertions, 11 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
index 793c259769..1492982708 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
@@ -474,6 +474,7 @@ public class BrokerAdapter extends AbstractAdapter implements Broker, Configurat
{
Port port = _portFactory.createPort(UUID.randomUUID(), this, attributes);
addPort(port);
+ port.setDesiredState(State.INITIALISING, State.ACTIVE);
return port;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
index c3d2c3d791..63063ff58c 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
@@ -31,6 +31,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Broker;
@@ -68,6 +69,7 @@ public class PortAdapter extends AbstractAdapter implements Port
private final Broker _broker;
private AuthenticationProvider _authenticationProvider;
+ private AtomicReference<State> _state;
/*
* TODO register PortAceptor as a listener. For supporting multiple
@@ -78,6 +80,8 @@ public class PortAdapter extends AbstractAdapter implements Port
{
super(id, defaults, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES), taskExecutor);
_broker = broker;
+ State state = MapValueConverter.getEnumAttribute(State.class, STATE, attributes, State.INITIALISING);
+ _state = new AtomicReference<State>(state);
addParent(Broker.class, broker);
}
@@ -173,12 +177,7 @@ public class PortAdapter extends AbstractAdapter implements Port
@Override
public State getActualState()
{
- State state = (State)super.getAttribute(STATE);
- if (state == null)
- {
- return State.ACTIVE;
- }
- return state;
+ return _state.get();
}
@Override
@@ -288,19 +287,41 @@ public class PortAdapter extends AbstractAdapter implements Port
@Override
public boolean setState(State currentState, State desiredState)
{
+ State state = _state.get();
if (desiredState == State.DELETED)
{
- return true;
+ if (state == State.STOPPED || state == State.QUIESCED)
+ {
+ return _state.compareAndSet(state, State.DELETED);
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot delete port in " + state + " state");
+ }
}
else if (desiredState == State.ACTIVE)
{
- onActivate();
- return true;
+ if ((state == State.INITIALISING || state == State.QUIESCED) && _state.compareAndSet(state, State.ACTIVE))
+ {
+ onActivate();
+ return true;
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot activate port in " + state + " state");
+ }
}
else if (desiredState == State.STOPPED)
{
- onStop();
- return true;
+ if (_state.compareAndSet(state, State.STOPPED))
+ {
+ onStop();
+ return true;
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot stop port in " + state + " state");
+ }
}
return false;
}
@@ -329,6 +350,10 @@ public class PortAdapter extends AbstractAdapter implements Port
@Override
protected void changeAttributes(Map<String, Object> attributes)
{
+ if (getActualState() == State.ACTIVE)
+ {
+ throw new IllegalStateException("Cannot change attributes for an active port");
+ }
super.changeAttributes(MapValueConverter.convert(attributes, ATTRIBUTE_TYPES));
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java
index 9d501115b7..1872f3e2ee 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java
@@ -112,6 +112,15 @@ public class PortFactory
throw new IllegalConfigurationException("Only one protocol can be used on non AMQP port");
}
Protocol protocol = protocols.iterator().next();
+ Collection<Port> existingPorts = broker.getPorts();
+ for (Port existingPort : existingPorts)
+ {
+ Collection<Protocol> portProtocols = existingPort.getProtocols();
+ if (portProtocols != null && portProtocols.contains(protocol))
+ {
+ throw new IllegalConfigurationException("Port for protocol " + protocol + " already exist. Only one management port per protocol can be created");
+ }
+ }
defaults.put(Port.NAME, portValue + "-" + protocol.name());
port = new PortAdapter(id, broker, attributes, defaults, broker.getTaskExecutor());
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java
index 14c5c265c9..0c496dfd9b 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/PortFactoryTest.java
@@ -21,6 +21,7 @@
package org.apache.qpid.server.model.adapter;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collection;
@@ -209,4 +210,27 @@ public class PortFactoryTest extends QpidTestCase
// pass
}
}
+
+ public void testCreateRMIPortWhenAnotherRMIPortAlreadyExists()
+ {
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put(Port.PORT, 1);
+ attributes.put(Port.NAME, getTestName());
+ attributes.put(Port.TRANSPORTS, Collections.singleton(Transport.TCP));
+ attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.RMI));
+
+ Port rmiPort = mock(Port.class);
+ when(rmiPort.getProtocols()).thenReturn(Collections.singleton(Protocol.RMI));
+ when(_broker.getPorts()).thenReturn(Collections.singletonList(rmiPort));
+
+ try
+ {
+ _portFactory.createPort(_portId, _broker, attributes);
+ fail("RMI port creation should fail as another one olready exist");
+ }
+ catch(IllegalConfigurationException e)
+ {
+ // pass
+ }
+ }
}