package org.safehaus.penrose.connection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.safehaus.penrose.adapter.Adapter; import org.safehaus.penrose.partition.Partition; import org.safehaus.penrose.partition.PartitionConfig; import org.safehaus.penrose.partition.PartitionContext; import org.safehaus.penrose.Penrose; import java.util.Map; import java.util.LinkedHashMap; import java.util.Collection; import java.util.ArrayList; /** * @author Endi Sukma Dewata */ public class ConnectionManager { public Logger log = LoggerFactory.getLogger(getClass()); protected Partition partition; protected ConnectionConfigManager connectionConfigManager; protected Map<String,Connection> connections = new LinkedHashMap<String,Connection>(); public ConnectionManager(Partition partition) { this.partition = partition; PartitionConfig partitionConfig = partition.getPartitionConfig(); connectionConfigManager = partitionConfig.getConnectionConfigManager(); } public void init() throws Exception { Collection<String> connectionNames = new ArrayList<String>(); connectionNames.addAll(getConnectionNames()); for (String connectionName : connectionNames) { ConnectionConfig connectionConfig = getConnectionConfig(connectionName); if (!connectionConfig.isEnabled()) continue; try { startConnection(connectionName); } catch (Exception e) { Penrose.errorLog.error("Failed creating connection "+connectionName+" in partition "+partition.getName()+".", e); } } } public void destroy() throws Exception { Collection<String> connectionNames = new ArrayList<String>(); connectionNames.addAll(connections.keySet()); for (String connectionName : connectionNames) { try { stopConnection(connectionName); } catch (Exception e) { Penrose.errorLog.error("Failed removing connection "+connectionName+" in partition "+partition.getName()+".", e); } } } public Collection<String> getConnectionNames() { return connectionConfigManager.getConnectionNames(); } public ConnectionConfig getConnectionConfig(String name) { return connectionConfigManager.getConnectionConfig(name); } public void startConnection(String connectionName) throws Exception { boolean debug = log.isDebugEnabled(); if (debug) log.debug("Starting connection "+connectionName+"."); ConnectionConfig connectionConfig = getConnectionConfig(connectionName); Connection connection = createConnection(connectionConfig); connections.put(connection.getName(), connection); } public void stopConnection(String connectionName) throws Exception { boolean debug = log.isDebugEnabled(); if (debug) log.debug("Stopping connection "+connectionName+"."); Connection connection = connections.get(connectionName); connection.destroy(); connections.remove(connectionName); } public boolean isRunning(String name) { return connections.containsKey(name); } public Connection createConnection(ConnectionConfig connectionConfig) throws Exception { boolean debug = log.isDebugEnabled(); String connectionName = connectionConfig.getName(); if (debug) log.debug("Creating connection "+connectionName+"."); PartitionContext partitionContext = partition.getPartitionContext(); ClassLoader cl = partitionContext.getClassLoader(); ConnectionContext connectionContext = new ConnectionContext(); connectionContext.setPartition(partition); connectionContext.setClassLoader(cl); String className = connectionConfig.getConnectionClass(); if (className == null) { String adapterName = connectionConfig.getAdapterName(); if (adapterName == null) throw new Exception("Missing adapter name."); Adapter adapter = partition.getAdapterManager().getAdapter(adapterName); if (adapter == null) throw new Exception("Unknown adapter "+adapterName+"."); connectionContext.setAdapter(adapter); className = adapter.getConnectionClassName(); } Class clazz = cl.loadClass(className); if (debug) log.debug("Creating "+className+"."); Connection connection = (Connection)clazz.newInstance(); connection.init(connectionConfig, connectionContext); return connection; } public void updateConnection(ConnectionConfig connectionConfig) throws Exception { connectionConfigManager.updateConnectionConfig(connectionConfig); String connectionName = connectionConfig.getName(); if (isRunning(connectionName)) { stopConnection(connectionName); startConnection(connectionName); } } public Collection<Connection> getConnections() { return connections.values(); } public Connection getConnection(String name) { Connection connection = connections.get(name); if (connection != null) return connection; if (partition.getName().equals(PartitionConfig.ROOT)) return null; Partition rootPartition = partition.getPartitionContext().getPartition(PartitionConfig.ROOT); ConnectionManager connectionManager = rootPartition.getConnectionManager(); return connectionManager.getConnection(name); } public ConnectionConfigManager getConnectionManager() { return connectionConfigManager; } }