blob: 48e838ad77a990428f5338b35292da173d3061af [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.guacamole.auth.jdbc.tunnel;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
* Mapping of object identifiers to lists of connection records. Records are
* added or removed individually, and the overall list of current records
* associated with a given object can be retrieved at any time. The public
* methods of this class are all threadsafe.
*/
public class ActiveConnectionMultimap {
/**
* All active connections to a connection having a given identifier.
*/
private final Map<String, Set<ActiveConnectionRecord>> records =
new HashMap<String, Set<ActiveConnectionRecord>>();
/**
* Stores the given connection record in the list of active connections
* associated with the object having the given identifier.
*
* @param identifier
* The identifier of the object being connected to.
*
* @param record
* The record associated with the active connection.
*/
public void put(String identifier, ActiveConnectionRecord record) {
synchronized (records) {
// Get set of active connection records, creating if necessary
Set<ActiveConnectionRecord> connections = records.get(identifier);
if (connections == null) {
connections = Collections.synchronizedSet(Collections.newSetFromMap(new LinkedHashMap<ActiveConnectionRecord, Boolean>()));
records.put(identifier, connections);
}
// Add active connection
connections.add(record);
}
}
/**
* Removes the given connection record from the list of active connections
* associated with the object having the given identifier.
*
* @param identifier
* The identifier of the object being disconnected from.
*
* @param record
* The record associated with the active connection.
*/
public void remove(String identifier, ActiveConnectionRecord record) {
synchronized (records) {
// Get set of active connection records
Set<ActiveConnectionRecord> connections = records.get(identifier);
assert(connections != null);
// Remove old record
connections.remove(record);
// If now empty, clean the tracking entry
if (connections.isEmpty())
records.remove(identifier);
}
}
/**
* Returns a collection of active connection records associated with the
* object having the given identifier. The collection will be sorted in
* insertion order. If there are no such connections, an empty collection is
* returned.
*
* @param identifier
* The identifier of the object to check.
*
* @return
* An immutable collection of records associated with the object having
* the given identifier, or an empty collection if there are no such
* records.
*/
public Collection<ActiveConnectionRecord> get(String identifier) {
synchronized (records) {
// Get set of active connection records
Collection<ActiveConnectionRecord> connections = records.get(identifier);
if (connections != null)
return Collections.unmodifiableCollection(connections);
return Collections.<ActiveConnectionRecord>emptyList();
}
}
}