/*
* 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.jdbc;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.resource.spi.XATerminator;
import javax.transaction.TransactionManager;
import javax.xml.stream.XMLStreamException;
import org.teiid.adminapi.Model.Type;
import org.teiid.adminapi.VDB;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBImportMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBMetadataParser;
import org.teiid.common.queue.FakeWorkManager;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.util.SimpleMock;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.deployers.UDFMetaData;
import org.teiid.deployers.VirtualDatabaseException;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository.ConnectorManagerException;
import org.teiid.dqp.internal.process.DQPCore;
import org.teiid.dqp.service.BufferService;
import org.teiid.dqp.service.FakeBufferService;
import org.teiid.metadata.FunctionMethod;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.MetadataRepository;
import org.teiid.metadata.MetadataStore;
import org.teiid.metadata.Schema;
import org.teiid.metadata.VDBResource;
import org.teiid.metadata.index.VDBMetadataFactory;
import org.teiid.metadata.index.VDBMetadataFactory.IndexVDB;
import org.teiid.query.ObjectReplicator;
import org.teiid.query.metadata.VDBResources.Resource;
import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
import org.teiid.query.optimizer.capabilities.SourceCapabilities;
import org.teiid.runtime.EmbeddedConfiguration;
import org.teiid.runtime.EmbeddedServer;
import org.teiid.services.SessionServiceImpl;
import org.teiid.translator.TranslatorException;
import org.teiid.transport.ClientServiceRegistryImpl;
@SuppressWarnings({"nls"})
public class FakeServer extends EmbeddedServer {
public static class DeployVDBParameter {
public Map<String, Collection<FunctionMethod>> udfs;
public MetadataRepository<?, ?> metadataRepo;
public List<VDBImportMetadata> vdbImports;
public LinkedHashMap<String, Resource> vdbResources;
public boolean useVdbXml;
public DeployVDBParameter(Map<String, Collection<FunctionMethod>> udfs,
MetadataRepository<?, ?> metadataRepo) {
this.udfs = udfs;
this.metadataRepo = metadataRepo;
}
}
private boolean realBufferManager;
@SuppressWarnings("serial")
public FakeServer(boolean start) {
waitForLoad = true;
cmr = new ProviderAwareConnectorManagerRepository() {
@Override
public ConnectorManager getConnectorManager(String connectorName) {
ConnectorManager cm = super.getConnectorManager(connectorName);
if (cm != null) {
return cm;
}
if (connectorName.equalsIgnoreCase("source")) {
return new ConnectorManager("x", "x") {
@Override
public SourceCapabilities getCapabilities() {
return new BasicSourceCapabilities();
}
};
}
return null;
}
};
if (start) {
start(new EmbeddedConfiguration(), false);
}
}
public void start(EmbeddedConfiguration config, boolean realBufferMangaer) {
boolean detectTxn = true;
if (config.getTransactionManager() == null) {
config.setTransactionManager(SimpleMock.createSimpleMock(TransactionManager.class));
this.transactionService.setXaTerminator(SimpleMock.createSimpleMock(XATerminator.class));
this.transactionService.setWorkManager(new FakeWorkManager());
detectTxn = false;
}
this.realBufferManager = realBufferMangaer;
start(config);
this.transactionService.setDetectTransactions(detectTxn);
}
@Override
protected BufferService getBufferService() {
if (!realBufferManager) {
return new FakeBufferService(false);
}
bufferService.setDiskDirectory(UnitTestUtil.getTestScratchPath());
return super.getBufferService();
}
public DQPCore getDqp() {
return dqp;
}
public ConnectorManagerRepository getConnectorManagerRepository() {
return cmr;
}
public void setConnectorManagerRepository(ConnectorManagerRepository cmr) {
this.cmr = cmr;
}
public void setUseCallingThread(boolean useCallingThread) {
this.useCallingThread = useCallingThread;
}
public void deployVDB(String vdbName, String vdbPath) throws Exception {
deployVDB(vdbName, vdbPath, new DeployVDBParameter(null, null));
}
public void deployVDB(String vdbName, String vdbPath, DeployVDBParameter parameterObject) throws Exception {
IndexVDB imf = VDBMetadataFactory.loadMetadata(vdbName, new File(vdbPath).toURI().toURL());
parameterObject.vdbResources = imf.resources.getEntriesPlusVisibilities();
deployVDB(vdbName, imf.store, parameterObject);
}
public void deployVDB(String vdbName, MetadataStore metadata) {
deployVDB(vdbName, metadata, new DeployVDBParameter(null, null));
}
public void deployVDB(String vdbName, MetadataStore metadata, DeployVDBParameter parameterObject) {
VDBMetaData vdbMetaData = null;
try {
if (parameterObject.vdbResources != null && parameterObject.useVdbXml) {
VDBResource resource = parameterObject.vdbResources.get("/META-INF/vdb.xml");
if (resource !=null) {
vdbMetaData = VDBMetadataParser.unmarshell(resource.openStream());
}
}
if (vdbMetaData == null) {
vdbMetaData = new VDBMetaData();
vdbMetaData.setName(vdbName);
for (Schema schema : metadata.getSchemas().values()) {
ModelMetaData model = addModel(vdbMetaData, schema);
if (parameterObject.metadataRepo != null) {
model.addAttchment(MetadataRepository.class, parameterObject.metadataRepo);
//fakeserver does not load through the repository framework, so call load after the fact here.
MetadataFactory mf = createMetadataFactory(vdbMetaData, metadata, model, parameterObject.vdbResources);
mf.setSchema(schema);
try {
parameterObject.metadataRepo.loadMetadata(mf, null, null);
} catch (TranslatorException e) {
throw new TeiidRuntimeException(e);
}
}
}
} else {
cmr.createConnectorManagers(vdbMetaData, this);
}
UDFMetaData udfMetaData = null;
if (parameterObject.udfs != null) {
udfMetaData = new UDFMetaData();
for (Map.Entry<String, Collection<FunctionMethod>> entry : parameterObject.udfs.entrySet()) {
udfMetaData.addFunctions(entry.getKey(), entry.getValue());
}
}
if (parameterObject.vdbImports != null) {
for (VDBImportMetadata vdbImport : parameterObject.vdbImports) {
vdbMetaData.getVDBImports().add(vdbImport);
}
}
vdbMetaData.setStatus(VDB.Status.ACTIVE);
this.repo.addVDB(vdbMetaData, metadata, parameterObject.vdbResources, udfMetaData, cmr);
this.repo.finishDeployment(vdbMetaData.getName(), vdbMetaData.getVersion());
this.repo.getLiveVDB(vdbMetaData.getName(), vdbMetaData.getVersion()).setStatus(VDB.Status.ACTIVE);
} catch (VirtualDatabaseException e) {
throw new RuntimeException(e);
} catch (ConnectorManagerException e) {
throw new RuntimeException(e);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void deployVDB(VDBMetaData vdb) throws ConnectorManagerException,
VirtualDatabaseException, TranslatorException {
super.deployVDB(vdb, null);
}
public void removeVDB(String vdbName) {
undeployVDB(vdbName);
}
private ModelMetaData addModel(VDBMetaData vdbMetaData, Schema schema) {
ModelMetaData model = new ModelMetaData();
model.setModelType(schema.isPhysical()?Type.PHYSICAL:Type.VIRTUAL);
model.setName(schema.getName());
vdbMetaData.addModel(model);
model.addSourceMapping("source", "translator", "jndi:source");
return model;
}
public VDBMetaData getVDB(String vdbName) {
return this.repo.getLiveVDB(vdbName);
}
public ConnectionImpl createConnection(String embeddedURL) throws Exception {
return getDriver().connect(embeddedURL, null);
}
public ConnectionImpl createConnection(String embeddedURL, Properties prop) throws Exception {
return getDriver().connect(embeddedURL, prop);
}
public ClientServiceRegistryImpl getClientServiceRegistry() {
return services;
}
public void setThrowMetadataErrors(boolean throwMetadataErrors) {
this.throwMetadataErrors = throwMetadataErrors;
}
public SessionServiceImpl getSessionService() {
return this.sessionService;
}
public void setObjectReplicator(ObjectReplicator replicator) {
this.replicator = replicator;
}
public ObjectReplicator getObjectReplicator() {
return this.replicator;
}
}