/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.dqp.internal.datamgr;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.SourceMappingMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.core.TeiidException;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.query.QueryPlugin;
import org.teiid.translator.ExecutionFactory;
public class ConnectorManagerRepository implements Serializable{
@SuppressWarnings("serial")
public static class ConnectorManagerException extends TeiidException {
public ConnectorManagerException(String msg) {
super(msg);
}
public ConnectorManagerException(Throwable t) {
super(t);
}
}
/**
* Provides {@link ExecutionFactory}s to the {@link ConnectorManagerRepository}
*/
public interface ExecutionFactoryProvider {
/**
*
* @param name
* @return the named {@link ExecutionFactory} or throw a {@link ConnectorManagerException} if it does not exist
* @throws ConnectorManagerException
*/
ExecutionFactory<Object, Object> getExecutionFactory(String name) throws ConnectorManagerException;
}
private static final long serialVersionUID = -1611063218178314458L;
private Map<String, ConnectorManager> repo = new ConcurrentHashMap<String, ConnectorManager>();
private boolean shared;
private ExecutionFactoryProvider provider;
public ConnectorManagerRepository() {
}
protected ConnectorManagerRepository(boolean b) {
this.shared = b;
}
public boolean isShared() {
return shared;
}
public void addConnectorManager(String connectorName, ConnectorManager mgr) {
this.repo.put(connectorName, mgr);
}
public ConnectorManager getConnectorManager(String connectorName) {
return this.repo.get(connectorName);
}
public Map<String, ConnectorManager> getConnectorManagers() {
return repo;
}
public ConnectorManager removeConnectorManager(String connectorName) {
return this.repo.remove(connectorName);
}
public void createConnectorManagers(VDBMetaData deployment, ExecutionFactoryProvider provider) throws ConnectorManagerException {
for (ModelMetaData model : deployment.getModelMetaDatas().values()) {
List<String> sourceNames = model.getSourceNames();
if (sourceNames.size() != new HashSet<String>(sourceNames).size()) {
throw new ConnectorManagerException(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31101, model.getName(), deployment.getName(), deployment.getVersion()));
}
if (sourceNames.size() > 1 && !model.isSupportsMultiSourceBindings()) {
throw new ConnectorManagerException(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31102, model.getName(), deployment.getName(), deployment.getVersion()));
}
for (SourceMappingMetadata source : model.getSourceMappings()) {
createConnectorManager(deployment, provider, source, false);
}
}
}
public void createConnectorManager(
VDBMetaData deployment, ExecutionFactoryProvider provider,
SourceMappingMetadata source, boolean replace) throws ConnectorManagerException {
String name = source.getTranslatorName();
String connection = source.getConnectionJndiName();
createConnectorManager(source.getName(), name, connection, provider, replace);
}
public void createConnectorManager(String sourceName, String translatorName, String jndiName,
ExecutionFactoryProvider provider, boolean replace) throws ConnectorManagerException {
ConnectorManager cm = getConnectorManager(sourceName);
ExecutionFactory<Object, Object> ef = null;
if (cm != null) {
if (!cm.getTranslatorName().equals(translatorName)
|| !EquivalenceUtil.areEqual(cm.getConnectionName(), jndiName)) {
if (!replace) {
throw new ConnectorManagerException(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31103, sourceName));
}
if (cm.getTranslatorName().equals(translatorName)) {
ef = cm.getExecutionFactory();
}
} else {
return;
}
}
if (ef == null) {
ef = provider.getExecutionFactory(translatorName);
if (ef == null) {
throw new ConnectorManagerException(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31146, translatorName));
}
}
cm = createConnectorManager(translatorName, jndiName, ef);
addConnectorManager(sourceName, cm);
}
protected ConnectorManager createConnectorManager(String name,
String connection, ExecutionFactory<Object, Object> ef) throws ConnectorManagerException {
return new ConnectorManager(name, connection, ef);
}
public void setProvider(ExecutionFactoryProvider provider) {
this.provider = provider;
}
public ExecutionFactoryProvider getProvider() {
return provider;
}
}