/*
* 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.runtime;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.resource.spi.work.WorkManager;
import javax.transaction.TransactionManager;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.transaction.lookup.TransactionManagerLookup;
import org.teiid.cache.CacheFactory;
import org.teiid.cache.infinispan.InfinispanCacheFactory;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.dqp.internal.process.DQPConfiguration;
import org.teiid.dqp.internal.process.DataRolePolicyDecider;
import org.teiid.dqp.internal.process.DefaultAuthorizationValidator;
import org.teiid.dqp.internal.process.TeiidExecutor;
import org.teiid.dqp.internal.process.ThreadReuseExecutor;
import org.teiid.net.socket.AuthenticationType;
import org.teiid.query.ObjectReplicator;
import org.teiid.security.SecurityHelper;
import org.teiid.transport.SocketConfiguration;
public class EmbeddedConfiguration extends DQPConfiguration {
static final int DEFAULT_MAX_ASYNC_WORKERS = 10;
private SecurityHelper securityHelper;
private String securityDomain;
private TransactionManager transactionManager;
private ObjectReplicator objectReplicator;
private WorkManager workManager;
private boolean useDisk = true;
private String bufferDirectory;
private CacheFactory cacheFactory;
private int maxResultSetCacheStaleness = DEFAULT_MAX_STALENESS_SECONDS;
private String infinispanConfigFile = "infinispan-config.xml"; //$NON-NLS-1$
private String jgroupsConfigFile; // from infinispan-core
private List<SocketConfiguration> transports;
private int maxODBCLobSizeAllowed = 5*1024*1024; // 5 MB
private int maxAsyncThreads = DEFAULT_MAX_ASYNC_WORKERS;
private int processorBatchSize ;
private int maxReserveKb ;
private int maxProcessingKb ;
private boolean inlineLobs = true;
private int maxOpenFiles ;
private long maxBufferSpace ;
private long maxFileSize ;
private boolean encryptFiles = false;
private int maxStorageObjectSize ;
private boolean memoryBufferOffHeap = false;
private int memoryBufferSpace ;
private String nodeName;
private DefaultCacheManager cacheManager;
private AuthenticationType authenticationType;
public EmbeddedConfiguration() {
processorBatchSize = -1;
maxReserveKb = -1;
maxProcessingKb = -1;
maxOpenFiles = -1;
maxBufferSpace = -1;
maxFileSize = -1;
maxStorageObjectSize = -1;
memoryBufferSpace = -1;
DefaultAuthorizationValidator authorizationValidator = new DefaultAuthorizationValidator();
authorizationValidator.setPolicyDecider(new DataRolePolicyDecider());
this.setAuthorizationValidator(authorizationValidator);
}
public SecurityHelper getSecurityHelper() {
return securityHelper;
}
/**
* Set the {@link SecurityHelper} that can associate the appropriate SecurityContext
* with threads executing Teiid tasks. Will also set the appropriate user/subject information
* on the Teiid contexts. Not required if a {@link WorkManager} is set.
*
* @param securityHelper
*/
public void setSecurityHelper(SecurityHelper securityHelper) {
this.securityHelper = securityHelper;
}
public String getSecurityDomain() {
return this.securityDomain;
}
public void setSecurityDomain(String securityDomain) {
this.securityDomain = securityDomain;
}
public TransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(TransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public ObjectReplicator getObjectReplicator() {
return objectReplicator;
}
public void setObjectReplicator(ObjectReplicator objectReplicator) {
this.objectReplicator = objectReplicator;
}
/**
* Sets the {@link WorkManager} to be used instead of a {@link ThreadReuseExecutor}.
* This means that Teiid will not own the processing threads and will not necessarily be
* responsible for security context propagation.
* @param workManager
*/
public void setWorkManager(WorkManager workManager) {
this.workManager = workManager;
}
public WorkManager getWorkManager() {
return workManager;
}
@Override
public TeiidExecutor getTeiidExecutor() {
if (workManager == null) {
return super.getTeiidExecutor();
}
//TODO: if concurrency is 1, then use a direct executor
//the only scheduled task right now just restarts a workitem,
//so that can be done in the scheduler thread
return new WorkManagerTeiidExecutor(workManager);
}
public boolean isUseDisk() {
return useDisk;
}
public void setUseDisk(boolean useDisk) {
this.useDisk = useDisk;
}
public void setBufferDirectory(String dir) {
this.bufferDirectory = dir;
}
public String getBufferDirectory() {
return this.bufferDirectory;
}
public String getInfinispanConfigFile() {
return infinispanConfigFile;
}
public void setInfinispanConfigFile(String infinispanConfigFile) {
this.infinispanConfigFile = infinispanConfigFile;
}
public CacheFactory getCacheFactory() {
if (this.cacheFactory == null) {
try {
cacheManager = new DefaultCacheManager(this.infinispanConfigFile, true);
for(String cacheName:cacheManager.getCacheNames()) {
if (getTransactionManager() != null) {
setCacheTransactionManger(cacheName);
}
cacheManager.startCache(cacheName);
}
this.cacheFactory = new InfinispanCacheFactory(cacheManager, this.getClass().getClassLoader());
} catch (IOException e) {
throw new TeiidRuntimeException(RuntimePlugin.Event.TEIID40100, e);
}
}
return this.cacheFactory;
}
private void setCacheTransactionManger(String cacheName) {
cacheManager.getCacheConfiguration(cacheName).transaction().transactionManagerLookup(new TransactionManagerLookup() {
@Override
public TransactionManager getTransactionManager() throws Exception {
return EmbeddedConfiguration.this.getTransactionManager();
}
});
}
public void setCacheFactory(CacheFactory cacheFactory) {
this.cacheFactory = cacheFactory;
}
public int getMaxResultSetCacheStaleness() {
return maxResultSetCacheStaleness;
}
public void setMaxResultSetCacheStaleness(int maxResultSetCacheStaleness) {
this.maxResultSetCacheStaleness = maxResultSetCacheStaleness;
}
public String getJgroupsConfigFile() {
return jgroupsConfigFile;
}
public void setJgroupsConfigFile(String jgroupsConfigFile) {
this.jgroupsConfigFile = jgroupsConfigFile;
}
protected void stop() {
if (cacheManager != null) {
cacheManager.stop();
}
}
public void addTransport(SocketConfiguration configuration) {
if (this.transports == null) {
this.transports = new ArrayList<SocketConfiguration>();
}
this.transports.add(configuration);
}
public List<SocketConfiguration> getTransports(){
return this.transports;
}
public int getMaxODBCLobSizeAllowed() {
return this.maxODBCLobSizeAllowed;
}
public void setMaxODBCLobSizeAllowed(int lobSize) {
this.maxODBCLobSizeAllowed = lobSize;
}
public int getMaxAsyncThreads() {
return maxAsyncThreads;
}
public void setMaxAsyncThreads(int maxAsyncThreads) {
this.maxAsyncThreads = maxAsyncThreads;
}
public int getProcessorBatchSize() {
return processorBatchSize;
}
public void setProcessorBatchSize(int processorBatchSize) {
this.processorBatchSize = processorBatchSize;
}
public int getMaxReserveKb() {
return maxReserveKb;
}
public void setMaxReserveKb(int maxReserveKb) {
this.maxReserveKb = maxReserveKb;
}
public int getMaxProcessingKb() {
return maxProcessingKb;
}
public void setMaxProcessingKb(int maxProcessingKb) {
this.maxProcessingKb = maxProcessingKb;
}
public boolean isInlineLobs() {
return inlineLobs;
}
public void setInlineLobs(boolean inlineLobs) {
this.inlineLobs = inlineLobs;
}
public int getMaxOpenFiles() {
return maxOpenFiles;
}
public void setMaxOpenFiles(int maxOpenFiles) {
this.maxOpenFiles = maxOpenFiles;
}
public long getMaxBufferSpace() {
return maxBufferSpace;
}
public void setMaxBufferSpace(long maxBufferSpace) {
this.maxBufferSpace = maxBufferSpace;
}
public long getMaxFileSize() {
return maxFileSize;
}
public void setMaxFileSize(long maxFileSize) {
this.maxFileSize = maxFileSize;
}
public boolean isEncryptFiles() {
return encryptFiles;
}
public void setEncryptFiles(boolean encryptFiles) {
this.encryptFiles = encryptFiles;
}
public int getMaxStorageObjectSize() {
return maxStorageObjectSize;
}
public void setMaxStorageObjectSize(int maxStorageObjectSize) {
this.maxStorageObjectSize = maxStorageObjectSize;
}
public boolean isMemoryBufferOffHeap() {
return memoryBufferOffHeap;
}
public void setMemoryBufferOffHeap(boolean memoryBufferOffHeap) {
this.memoryBufferOffHeap = memoryBufferOffHeap;
}
public int getMemoryBufferSpace() {
return memoryBufferSpace;
}
public void setMemoryBufferSpace(int memoryBufferSpace) {
this.memoryBufferSpace = memoryBufferSpace;
}
public AuthenticationType getAuthenticationType() {
return this.authenticationType;
}
public void setAuthenticationType(AuthenticationType authenticationType) {
this.authenticationType = authenticationType;
}
public String getNodeName() {
return nodeName;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
}