// Copyright 2010 Google Inc. // // Licensed 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 com.google.enterprise.connector.instantiator; import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class ConnectorCoordinatorMap { // State that is filled in by Spring. private ConnectorCoordinatorFactory connectorCoordinatorFactory; private final ConcurrentMap<String, ConnectorCoordinator> coordinatorMap; /** Constructor. */ public ConnectorCoordinatorMap() { coordinatorMap = new ConcurrentHashMap<String, ConnectorCoordinator>(); } public void setConnectorCoordinatorFactory( ConnectorCoordinatorFactory factory) { connectorCoordinatorFactory = factory; } public void shutdown() { for (ConnectorCoordinator cc : coordinatorMap.values()) { cc.shutdown(); } } public ChangeHandler getChangeHandler(String connectorName) { return (ChangeHandler) getOrAdd(connectorName); } public ConnectorCoordinator getOrAdd(String connectorName) { ConnectorCoordinator connectorCoordinator = coordinatorMap.get(connectorName); if (connectorCoordinator == null) { ConnectorCoordinator ci = connectorCoordinatorFactory.newConnectorCoordinator(connectorName); ConnectorCoordinator existing = coordinatorMap.putIfAbsent(connectorName, ci); connectorCoordinator = (existing == null) ? ci : existing; } return connectorCoordinator; } public ConnectorCoordinator get(String connectorName) { return coordinatorMap.get(connectorName); } public Set<String> getConnectorNames() { Set<String> result = new TreeSet<String>(); for (Map.Entry<String, ConnectorCoordinator> e : coordinatorMap.entrySet()) { if (e.getValue().exists()) { result.add(e.getKey()); } } return Collections.unmodifiableSet(result); } }