diff options
| author | Alex Rudyy <orudyy@apache.org> | 2013-03-18 18:12:57 +0000 |
|---|---|---|
| committer | Alex Rudyy <orudyy@apache.org> | 2013-03-18 18:12:57 +0000 |
| commit | 592669bad63f5579d3516f41ea143c9a549a261a (patch) | |
| tree | 616e60ac1fceeb5bbe44e4103dde0d9f166cca2b /qpid/java/broker/src | |
| parent | 248116abe95421844fed3dc086895230e3f3fb74 (diff) | |
| download | qpid-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')
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 + } + } } |
