summaryrefslogtreecommitdiff
path: root/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java')
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java47
1 files changed, 36 insertions, 11 deletions
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));
}
}