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.List; 022import java.util.Map; 023import java.util.concurrent.ConcurrentHashMap; 024 025import org.apache.activemq.command.ConnectionId; 026import org.apache.activemq.command.ConsumerId; 027import org.apache.activemq.command.ProducerId; 028import org.apache.activemq.command.SessionId; 029 030/** 031 * 032 */ 033 034public class MapTransportConnectionStateRegister implements TransportConnectionStateRegister{ 035 036 private Map <ConnectionId,TransportConnectionState>connectionStates = new ConcurrentHashMap<ConnectionId,TransportConnectionState>(); 037 038 public TransportConnectionState registerConnectionState(ConnectionId connectionId, 039 TransportConnectionState state) { 040 TransportConnectionState rc = connectionStates.put(connectionId, state); 041 return rc; 042 } 043 044 public TransportConnectionState unregisterConnectionState(ConnectionId connectionId) { 045 TransportConnectionState rc = connectionStates.remove(connectionId); 046 if (rc.getReferenceCounter().get() > 1) { 047 rc.decrementReference(); 048 connectionStates.put(connectionId, rc); 049 } 050 return rc; 051 } 052 053 public List<TransportConnectionState> listConnectionStates() { 054 055 List<TransportConnectionState> rc = new ArrayList<TransportConnectionState>(); 056 rc.addAll(connectionStates.values()); 057 return rc; 058 } 059 060 public TransportConnectionState lookupConnectionState(String connectionId) { 061 return connectionStates.get(new ConnectionId(connectionId)); 062 } 063 064 public TransportConnectionState lookupConnectionState(ConsumerId id) { 065 TransportConnectionState cs = lookupConnectionState(id.getConnectionId()); 066 if (cs == null) { 067 throw new IllegalStateException( 068 "Cannot lookup a consumer from a connection that had not been registered: " 069 + id.getParentId().getParentId()); 070 } 071 return cs; 072 } 073 074 public TransportConnectionState lookupConnectionState(ProducerId id) { 075 TransportConnectionState cs = lookupConnectionState(id.getConnectionId()); 076 if (cs == null) { 077 throw new IllegalStateException( 078 "Cannot lookup a producer from a connection that had not been registered: " 079 + id.getParentId().getParentId()); 080 } 081 return cs; 082 } 083 084 public TransportConnectionState lookupConnectionState(SessionId id) { 085 TransportConnectionState cs = lookupConnectionState(id.getConnectionId()); 086 if (cs == null) { 087 throw new IllegalStateException( 088 "Cannot lookup a session from a connection that had not been registered: " 089 + id.getParentId()); 090 } 091 return cs; 092 } 093 094 public TransportConnectionState lookupConnectionState(ConnectionId connectionId) { 095 TransportConnectionState cs = connectionStates.get(connectionId); 096 if (cs == null) { 097 throw new IllegalStateException("Cannot lookup a connection that had not been registered: " 098 + connectionId); 099 } 100 return cs; 101 } 102 103 104 105 public boolean doesHandleMultipleConnectionStates() { 106 return true; 107 } 108 109 public boolean isEmpty() { 110 return connectionStates.isEmpty(); 111 } 112 113 public void clear() { 114 connectionStates.clear(); 115 116 } 117 118 public void intialize(TransportConnectionStateRegister other) { 119 connectionStates.clear(); 120 connectionStates.putAll(other.mapStates()); 121 122 } 123 124 public Map<ConnectionId, TransportConnectionState> mapStates() { 125 HashMap<ConnectionId, TransportConnectionState> map = new HashMap<ConnectionId, TransportConnectionState>(connectionStates); 126 return map; 127 } 128 129}