001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.broker;
018
019import java.util.ArrayList;
020import java.util.HashMap;
021import java.util.Iterator;
022import java.util.List;
023import java.util.Map;
024import java.util.Map.Entry;
025
026import org.apache.activemq.command.ConnectionId;
027import org.apache.activemq.command.ConsumerId;
028import org.apache.activemq.command.ProducerId;
029import org.apache.activemq.command.SessionId;
030
031/**
032 * 
033 */
034
035public class SingleTransportConnectionStateRegister  implements TransportConnectionStateRegister{
036
037    private  TransportConnectionState connectionState;
038    private ConnectionId connectionId;
039
040    public TransportConnectionState registerConnectionState(ConnectionId connectionId,
041                                                               TransportConnectionState state) {
042        TransportConnectionState rc = connectionState;
043        connectionState = state;
044        this.connectionId = connectionId;
045        return rc;
046    }
047
048    public synchronized TransportConnectionState unregisterConnectionState(ConnectionId connectionId) {
049        TransportConnectionState rc = null;
050        
051       
052        if (connectionId != null && connectionState != null && this.connectionId!=null){
053        if (this.connectionId.equals(connectionId)){
054                        rc = connectionState;
055                        connectionState = null;
056                        connectionId = null;
057                }
058        }
059        return rc;
060    }
061
062    public synchronized List<TransportConnectionState> listConnectionStates() {
063        List<TransportConnectionState> rc = new ArrayList<TransportConnectionState>();
064        if (connectionState != null) {
065            rc.add(connectionState);
066        }
067        return rc;
068    }
069
070    public synchronized TransportConnectionState lookupConnectionState(String connectionId) {
071        TransportConnectionState cs = connectionState;
072        if (cs == null) {
073            throw new IllegalStateException(
074                                            "Cannot lookup a connectionId for a connection that had not been registered: "
075                                                + connectionId);
076        }
077        return cs;
078    }
079
080    public synchronized TransportConnectionState lookupConnectionState(ConsumerId id) {
081        TransportConnectionState cs = connectionState;
082        if (cs == null) {
083            throw new IllegalStateException(
084                                            "Cannot lookup a consumer from a connection that had not been registered: "
085                                                + id.getParentId().getParentId());
086        }
087        return cs;
088    }
089
090    public synchronized TransportConnectionState lookupConnectionState(ProducerId id) {
091        TransportConnectionState cs = connectionState;
092        if (cs == null) {
093            throw new IllegalStateException(
094                                            "Cannot lookup a producer from a connection that had not been registered: "
095                                                + id.getParentId().getParentId());
096        }
097        return cs;
098    }
099
100    public synchronized TransportConnectionState lookupConnectionState(SessionId id) {
101        TransportConnectionState cs = connectionState;
102        if (cs == null) {
103            throw new IllegalStateException(
104                                            "Cannot lookup a session from a connection that had not been registered: "
105                                                + id.getParentId());
106        }
107        return cs;
108    }
109
110    public synchronized TransportConnectionState lookupConnectionState(ConnectionId connectionId) {
111        TransportConnectionState cs = connectionState;
112        return cs;
113    }
114
115        public synchronized boolean doesHandleMultipleConnectionStates() {
116                return false;
117        }
118
119        public synchronized boolean isEmpty() {
120                return connectionState == null;
121        }
122
123        public void intialize(TransportConnectionStateRegister other) {
124                
125                if (other.isEmpty()){
126                        clear();
127                }else{
128                        Map map = other.mapStates();
129                        Iterator i = map.entrySet().iterator();
130                        Map.Entry<ConnectionId, TransportConnectionState> entry = (Entry<ConnectionId, TransportConnectionState>) i.next();
131                        connectionId = entry.getKey();
132                        connectionState =entry.getValue();
133                }
134                
135        }
136
137        public Map<ConnectionId, TransportConnectionState> mapStates() {
138                Map<ConnectionId, TransportConnectionState> map = new HashMap<ConnectionId, TransportConnectionState>();
139                if (!isEmpty()) {
140                        map.put(connectionId, connectionState);
141                }
142                return map;
143        }
144
145        public void clear() {
146                connectionState=null;
147                connectionId=null;
148                
149        }
150
151}