Author: rareddy
Date: 2009-08-24 17:06:57 -0400 (Mon, 24 Aug 2009)
New Revision: 1273
Modified:
trunk/runtime/src/main/java/com/metamatrix/jdbc/EmbeddedConnectionFactoryImpl.java
trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
Log:
TEIID-666: Session service not being used for "terminateSession". Previously
Embedded did not have any session service, so it went directly to the DQP, now that it has
session service the calls to terminate must flow through session service.
Modified:
trunk/runtime/src/main/java/com/metamatrix/jdbc/EmbeddedConnectionFactoryImpl.java
===================================================================
---
trunk/runtime/src/main/java/com/metamatrix/jdbc/EmbeddedConnectionFactoryImpl.java 2009-08-24
21:01:26 UTC (rev 1272)
+++
trunk/runtime/src/main/java/com/metamatrix/jdbc/EmbeddedConnectionFactoryImpl.java 2009-08-24
21:06:57 UTC (rev 1273)
@@ -99,7 +99,7 @@
@Override
public ServerConnection createConnection(Properties connectionProperties) throws
CommunicationException, ConnectionException {
- return new LocalServerConnection(connectionProperties, this.clientServices);
+ return new LocalServerConnection(connectionProperties, this.clientServices,
(SessionServiceInterface)findService(DQPServiceNames.SESSION_SERVICE));
}
/**
@@ -125,7 +125,9 @@
// create the deploy directories
File deployDirectory = new File(teiidHome,
props.getProperty(DQPEmbeddedProperties.DQP_DEPLOYDIR, "deploy"));
//$NON-NLS-1$
props.setProperty(DQPEmbeddedProperties.DQP_DEPLOYDIR,
deployDirectory.getCanonicalPath());
- deployDirectory.mkdirs();
+ if (!deployDirectory.exists()) {
+ deployDirectory.mkdirs();
+ }
// if there is no separate vdb-definitions specified then use the deploy
directory as the location of the vdb
String vdbDefinitions =
props.getProperty(DQPEmbeddedProperties.VDB_DEFINITION);
@@ -136,8 +138,9 @@
// create log directory
File logDirectory = new File(teiidHome,
props.getProperty(DQPEmbeddedProperties.DQP_LOGDIR, "log")); //$NON-NLS-1$
props.setProperty(DQPEmbeddedProperties.DQP_LOGDIR,
logDirectory.getCanonicalPath());
- deployDirectory.mkdirs();
-
+ if (!logDirectory.exists()) {
+ logDirectory.mkdirs();
+ }
} catch (IOException e) {
throw new ApplicationInitializationException(e);
}
Modified: trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-08-24
21:01:26 UTC (rev 1272)
+++ trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-08-24
21:06:57 UTC (rev 1273)
@@ -27,9 +27,14 @@
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import com.metamatrix.admin.api.exception.security.InvalidSessionException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.security.LogonException;
import com.metamatrix.client.ExceptionUtil;
@@ -41,6 +46,7 @@
import com.metamatrix.jdbc.JDBCPlugin;
import com.metamatrix.platform.security.api.ILogon;
import com.metamatrix.platform.security.api.LogonResult;
+import com.metamatrix.platform.security.api.service.SessionServiceInterface;
public class LocalServerConnection implements ServerConnection {
@@ -49,9 +55,10 @@
private DQPWorkContext workContext;
private ClassLoader classLoader;
ClientServiceRegistry clientServices;
+ SessionServiceInterface sessionService;
- public LocalServerConnection(Properties connectionProperties, ClientServiceRegistry
clientServices) throws CommunicationException, ConnectionException{
+ public LocalServerConnection(Properties connectionProperties, ClientServiceRegistry
clientServices, SessionServiceInterface sessionService) throws CommunicationException,
ConnectionException{
this.clientServices = clientServices;
@@ -62,6 +69,8 @@
this.result = authenticate(connectionProperties);
this.classLoader = Thread.currentThread().getContextClassLoader();
+
+ this.sessionService = sessionService;
}
public synchronized LogonResult authenticate(Properties connProps) throws
ConnectionException, CommunicationException {
@@ -86,14 +95,18 @@
return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]
{iface}, new InvocationHandler() {
- public Object invoke(Object arg0, Method arg1, Object[] arg2)
- throws Throwable {
+ public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
if (!isOpen()) {
throw ExceptionUtil.convertException(arg1, new
MetaMatrixComponentException(JDBCPlugin.Util.getString("LocalTransportHandler.session_inactive")));
//$NON-NLS-1$
- }
+ }
ClassLoader current = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
DQPWorkContext.setWorkContext(workContext);
+
+ if (!(iface.equals(ILogon.class))) {
+ sessionService.validateSession(workContext.getSessionId());
+ }
+
try {
return arg1.invoke(clientServices.getClientService(iface), arg2);
} catch (InvocationTargetException e) {
@@ -113,6 +126,23 @@
if (shutdown) {
return;
}
+
+ try {
+ //make a best effort to send the logoff
+ Future<?> writeFuture = getService(ILogon.class).logoff();
+ if (writeFuture != null) {
+ writeFuture.get(5000, TimeUnit.MILLISECONDS);
+ }
+ } catch (InvalidSessionException e) {
+ //ignore
+ } catch (InterruptedException e) {
+ //ignore
+ } catch (ExecutionException e) {
+ //ignore
+ } catch (TimeoutException e) {
+ //ignore
+ }
+
this.shutdown = true;
}