/*
* 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.translator;
import java.io.Serializable;
import java.sql.Statement;
import java.util.Collection;
import javax.security.auth.Subject;
import org.teiid.CommandContext;
import org.teiid.adminapi.Session;
import org.teiid.jdbc.TeiidSQLWarning;
import org.teiid.metadata.RuntimeMetadata;
import org.teiid.translator.CacheDirective.Scope;
/**
* The security context provides information about the user context in which
* this query is being run.
*
* As of 4.2, the SecurityContext is a sub-interface of ExecutionContext such
* that both interfaces contain all of the methods from the prior independent
* interfaces. Thus, these interfaces can now be used interchangeably.
*
*/
public interface ExecutionContext {
/**
* Get the identifier for the current connector running the command
* @return Connector identifier; never null
*/
String getConnectorIdentifier();
/**
* Get the identifier for the command being executed. This can be
* correlated back to identifiers exposed in other parts of the system.
* shortcut for {@link #getCommandContext()}.getRequestId()
* @return command identifier
*/
String getRequestId();
/**
* @deprecated see {@link #getRequestId()}
* @return
*/
String getRequestID();
/**
* This specifies the node id for the atomic request in the relational plan of query.
*/
String getPartIdentifier();
/**
* Execution count defines an id; where every access to the connector from
* the server in a given command execution boundary is uniquely defined;
* Like for example in the case of "batched execution" of commands, each execution of
* command gets new identifier.
*/
String getExecutionCountIdentifier();
/**
* Get the name of the VDB this query is being run against.
* shortcut for {@link #getCommandContext()}.getVdbName()
* @return VDB name, never null
*/
String getVdbName();
/**
* Get the version of the VDB this query is being run against.
* shortcut for {@link #getCommandContext()}.getVdbVersion()
* @return VDB version
*/
String getVdbVersion();
/**
* Get the user for the user running this query.
* @return User, never null
*/
Subject getSubject();
/**
* Get the command payload
* shortcut for {@link #getCommandContext()}.getCommandPayload()
* @return the payload or null if one was not set by the client
*/
Serializable getCommandPayload();
/**
* @deprecated see {@link #getCommandPayload()
* @return
*/
Serializable getExecutionPayload();
/**
* Get the collection of general hints as a space concatenated string.
* @return the general hint or null if none was specified
*/
String getGeneralHint();
/**
* Get the collection of hints designated for this source as a space concatenated string.
* @return the source hint or null if none was specified
*/
String getSourceHint();
/**
* Get the general hints.
* @return the general hint or null if none was specified
*/
Collection<String> getGeneralHints();
/**
* Get the hints designated for this source.
* @return the source hint or null if none was specified
*/
Collection<String> getSourceHints();
/**
* Get the identifier for the connection through which
* the command is being executed. This represents the original user
* connection to the Teiid system
* shortcut for {@link #getCommandContext()}.getConnectionId()
* @return Connection identifier
*/
String getConnectionId();
/**
* @deprecated see {@link #getConnectionId()}
* @return
*/
String getConnectionID();
/**
* When the execution is turned on with "alive=true", the execution object will not
* be implicitly closed at the end of the last batch. It will only be closed at end
* of the user query.
* <p>
* The engine will already detect situations when the connection should stay open for
* LOB (clob/blob/xml) streaming.
* <p>
* Keeping the execution alive unnecessarily may cause issues with connection usage
* as the connection instance may not be usable by other queries.
*
* @param alive
*/
void keepExecutionAlive(boolean alive);
/**
* Return the current connector batch size. This may be used as a hint to the underlying source query.
* @return the Connector batch size.
*/
int getBatchSize();
/**
* Add an exception as a warning to this Execution. The exception will be wrapped by a {@link TeiidSQLWarning} for the client.
* The warnings can be consumed through the {@link Statement#getWarnings()} method.
* @param ex
*/
void addWarning(Exception ex);
/**
* Flag indicates that the operation needs to be executed in a XA transaction.
* @return
*/
boolean isTransactional();
/**
* Get the current session.
* shortcut for {@link #getCommandContext()}.getSession()
* @return
*/
Session getSession();
/**
* Signal the engine that data is available and processing should be
* resumed.
*/
void dataAvailable();
/**
* Get the CommandContext
* @return
*/
CommandContext getCommandContext();
/**
* Get the {@link CacheDirective}
* @return
*/
CacheDirective getCacheDirective();
/**
*
* @return the {@link RuntimeMetadata}
*/
RuntimeMetadata getRuntimeMetadata();
/**
* Log the source command to the command log
* @param command
*/
void logCommand(Object... command);
/**
* Get the result cache scope for the current execution
* @return
*/
Scope getScope();
/**
* Set the result cache scope for the current execution.
* <br>
* Setting to {@link Scope#NONE} will typically result in the user query result being
* cached at the {@link Scope#SESSION} level.
*
* @param scope
*/
void setScope(Scope scope);
}