package com.revolsys.record.io; import java.io.File; import java.util.Collections; import java.util.Map; import com.revolsys.collection.map.MapEx; import com.revolsys.collection.map.Maps; import com.revolsys.io.connection.AbstractConnectionRegistry; import com.revolsys.io.connection.ConnectionRegistry; import com.revolsys.io.connection.ConnectionRegistryManager; import com.revolsys.logging.Logs; import com.revolsys.record.io.format.json.Json; import com.revolsys.record.schema.RecordStore; import com.revolsys.spring.resource.Resource; public class RecordStoreConnectionRegistry extends AbstractConnectionRegistry<RecordStoreConnection> { private static final ThreadLocal<RecordStoreConnectionRegistry> threadRegistry = new ThreadLocal<>(); public static RecordStoreConnectionRegistry getForThread() { return RecordStoreConnectionRegistry.threadRegistry.get(); } public static RecordStoreConnectionRegistry setForThread( final RecordStoreConnectionRegistry registry) { final RecordStoreConnectionRegistry oldValue = getForThread(); RecordStoreConnectionRegistry.threadRegistry.set(registry); return oldValue; } public RecordStoreConnectionRegistry( final ConnectionRegistryManager<? extends ConnectionRegistry<RecordStoreConnection>> connectionManager, final String name, final boolean visible, final boolean readOnly, final Resource directoryResource) { super(connectionManager, name, visible, readOnly, directoryResource, "recordStoreConnection"); } protected RecordStoreConnectionRegistry(final RecordStoreConnectionManager connectionManager, final String name, final boolean visible) { this(connectionManager, name, visible, false, null); } protected RecordStoreConnectionRegistry(final RecordStoreConnectionManager connectionManager, final String name, final Resource resource) { this(connectionManager, name, true, false, resource); } public RecordStoreConnectionRegistry(final String name) { this(null, name, true); } public RecordStoreConnectionRegistry(final String name, final Resource resource, final boolean readOnly) { this(null, name, true, readOnly, resource); } public RecordStoreConnection addConnection(final Map<String, Object> config) { final RecordStoreConnection connection = new RecordStoreConnection(this, null, config); addConnection(connection); return connection; } public void addConnection(final RecordStoreConnection connection) { addConnection(connection.getName(), connection); } public void addConnection(final String name, final RecordStore recordStore) { final RecordStoreConnection connection = new RecordStoreConnection(this, name, recordStore); addConnection(connection); } @Override protected RecordStoreConnection loadConnection(final File connectionFile, final boolean importConnection) { final MapEx config = Json.toMap(connectionFile); final String name = getConnectionName(config, connectionFile, importConnection); try { @SuppressWarnings({ "unchecked", "rawtypes" }) final Map<String, Object> connectionProperties = Maps.get((Map)config, "connection", Collections.<String, Object> emptyMap()); if (connectionProperties.isEmpty()) { Logs.error(this, "Record store must include a 'connection' map property: " + connectionFile); return null; } else { final RecordStoreConnection connection = new RecordStoreConnection(this, connectionFile.toString(), config); if (!importConnection) { connection.setConnectionFile(connectionFile); } addConnection(name, connection); return connection; } } catch (final Throwable e) { Logs.error(this, "Error creating record store from: " + connectionFile, e); return null; } } }