Skip to content
Snippets Groups Projects
Commit f126bc11 authored by brinn's avatar brinn
Browse files

Remove DataStoreUserSessionCleaner and call the cleanupSession() method of all...

Remove DataStoreUserSessionCleaner and call the cleanupSession() method of all DSSes always on user session close.

SVN: 26262
parent 76d90fa8
No related branches found
No related tags found
No related merge requests found
...@@ -80,7 +80,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleL ...@@ -80,7 +80,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleL
import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.SampleLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.SampleLister;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.IMasterDataScriptRegistrationRunner; import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.IMasterDataScriptRegistrationRunner;
import ch.systemsx.cisd.openbis.generic.server.util.DataStoreUserSessionCleaner;
import ch.systemsx.cisd.openbis.generic.shared.IEntityOperationChecker; import ch.systemsx.cisd.openbis.generic.shared.IEntityOperationChecker;
import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService; import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
...@@ -95,20 +94,11 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac ...@@ -95,20 +94,11 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
ICommonBusinessObjectFactory ICommonBusinessObjectFactory
{ {
private final DataStoreUserSessionCleaner dssUserSessionCleaner;
public CommonBusinessObjectFactory(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory, public CommonBusinessObjectFactory(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory,
IRelationshipService relationshipService, IRelationshipService relationshipService,
IEntityOperationChecker entityOperationChecker, IEntityOperationChecker entityOperationChecker)
DataStoreUserSessionCleaner dssUserSessionCleaner)
{ {
super(daoFactory, dssFactory, relationshipService, entityOperationChecker); super(daoFactory, dssFactory, relationshipService, entityOperationChecker);
this.dssUserSessionCleaner = dssUserSessionCleaner;
}
protected DataStoreUserSessionCleaner getDssUserSessionCleaner()
{
return dssUserSessionCleaner;
} }
@Override @Override
...@@ -176,8 +166,7 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac ...@@ -176,8 +166,7 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
@Override @Override
public final IDataSetTable createDataSetTable(final Session session) public final IDataSetTable createDataSetTable(final Session session)
{ {
return new DataSetTable(getDaoFactory(), getDSSFactory(), getDssUserSessionCleaner(), return new DataSetTable(getDaoFactory(), getDSSFactory(), session, getRelationshipService());
session, getRelationshipService());
} }
@Override @Override
......
...@@ -18,15 +18,34 @@ package ch.systemsx.cisd.openbis.generic.server; ...@@ -18,15 +18,34 @@ package ch.systemsx.cisd.openbis.generic.server;
import ch.systemsx.cisd.authentication.ISessionFactory; import ch.systemsx.cisd.authentication.ISessionFactory;
import ch.systemsx.cisd.authentication.Principal; import ch.systemsx.cisd.authentication.Principal;
import ch.systemsx.cisd.openbis.generic.server.business.IDataStoreServiceFactory;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataStoreDAO;
import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
import ch.systemsx.cisd.openbis.generic.shared.dto.Session.ISessionCleaner;
/** /**
* Factory of {@link Session} objects. * Factory of {@link Session} objects.
* *
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
public final class SessionFactory implements ISessionFactory<Session> public final class SessionFactory implements ISessionFactory<Session>
{ {
private final IDataStoreDAO datastoreDAO;
private final IDataStoreServiceFactory dssFactory;
public SessionFactory()
{
this(null, null);
}
public SessionFactory(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory)
{
this.datastoreDAO = (daoFactory != null) ? daoFactory.getDataStoreDAO() : null;
this.dssFactory = dssFactory;
}
// //
// ISessionFactory // ISessionFactory
...@@ -37,8 +56,24 @@ public final class SessionFactory implements ISessionFactory<Session> ...@@ -37,8 +56,24 @@ public final class SessionFactory implements ISessionFactory<Session>
final Principal principal, final String remoteHost, final long sessionStart, final Principal principal, final String remoteHost, final long sessionStart,
final int expirationTime) final int expirationTime)
{ {
return new Session(userName, sessionToken, principal, remoteHost, sessionStart, final Session session =
expirationTime); new Session(userName, sessionToken, principal, remoteHost, sessionStart,
expirationTime);
if (datastoreDAO != null && dssFactory != null)
{
session.addCleanupListener(new ISessionCleaner()
{
@Override
public void cleanup()
{
for (DataStorePE datastore : datastoreDAO.listDataStores())
{
dssFactory.create(datastore.getRemoteUrl())
.cleanupSession(sessionToken);
}
}
});
}
return session;
} }
} }
...@@ -49,7 +49,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.exception.DataSetDele ...@@ -49,7 +49,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.exception.DataSetDele
import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.event.DeleteDataSetEventBuilder; import ch.systemsx.cisd.openbis.generic.server.dataaccess.event.DeleteDataSetEventBuilder;
import ch.systemsx.cisd.openbis.generic.server.util.DataStoreUserSessionCleaner;
import ch.systemsx.cisd.openbis.generic.shared.Constants; import ch.systemsx.cisd.openbis.generic.shared.Constants;
import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService; import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService; import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
...@@ -198,15 +197,11 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements ...@@ -198,15 +197,11 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
private List<DataPE> dataSets; private List<DataPE> dataSets;
private final DataStoreUserSessionCleaner dssUserSessionCleaner;
public DataSetTable(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory, public DataSetTable(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory,
DataStoreUserSessionCleaner dssUserSessionCleaner,
Session session, IRelationshipService relationshipService) Session session, IRelationshipService relationshipService)
{ {
super(daoFactory, session, relationshipService); super(daoFactory, session, relationshipService);
this.dssFactory = dssFactory; this.dssFactory = dssFactory;
this.dssUserSessionCleaner = dssUserSessionCleaner;
} }
// //
...@@ -601,7 +596,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements ...@@ -601,7 +596,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
List<DatasetDescription> locations = loadAvailableDatasetDescriptions(datasetCodes); List<DatasetDescription> locations = loadAvailableDatasetDescriptions(datasetCodes);
String sessionToken = dataStore.getSessionToken(); String sessionToken = dataStore.getSessionToken();
String userSessionToken = session.getSessionToken(); String userSessionToken = session.getSessionToken();
dssUserSessionCleaner.add(session, service);
return service.createReportFromDatasets(sessionToken, userSessionToken, return service.createReportFromDatasets(sessionToken, userSessionToken,
datastoreServiceKey, locations, tryGetLoggedUserEmail()); datastoreServiceKey, locations, tryGetLoggedUserEmail());
} }
...@@ -1056,7 +1050,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements ...@@ -1056,7 +1050,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
} }
String sessionToken = dataStore.getSessionToken(); String sessionToken = dataStore.getSessionToken();
String userSessionToken = session.getSessionToken(); String userSessionToken = session.getSessionToken();
dssUserSessionCleaner.add(session, service);
return service.createReportFromAggregationService(sessionToken, userSessionToken, return service.createReportFromAggregationService(sessionToken, userSessionToken,
datastoreServiceKey, parameters, tryGetLoggedUserEmail()); datastoreServiceKey, parameters, tryGetLoggedUserEmail());
} }
......
/*
* Copyright 2012 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.generic.server.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
import ch.systemsx.cisd.openbis.generic.shared.dto.Session.ISessionCleaner;
/**
* A cleaner for user session data on data store servers.
*
* @author Bernd Rinn
*/
public class DataStoreUserSessionCleaner
{
private final Map<String, Set<IDataStoreService>> sessions =
new HashMap<String, Set<IDataStoreService>>();
public void add(Session userSession, IDataStoreService dataStore)
{
final String userSessionToken = userSession.getSessionToken();
final Set<IDataStoreService> dataStores = getOrCreateDataStores(userSessionToken);
// Note: data stores are cached by DataStoreServiceFactory, thus the set works out.
dataStores.add(dataStore);
userSession.addCleanupListener(new ISessionCleaner()
{
@Override
public void cleanup()
{
for (IDataStoreService service : dataStores)
{
service.cleanupSession(userSessionToken);
}
sessions.remove(userSessionToken);
}
});
}
private Set<IDataStoreService> getOrCreateDataStores(String userSessionToken)
{
Set<IDataStoreService> dataStores = sessions.get(userSessionToken);
if (dataStores == null)
{
dataStores = new HashSet<IDataStoreService>();
sessions.put(userSessionToken, dataStores);
}
return dataStores;
}
}
...@@ -49,8 +49,6 @@ ...@@ -49,8 +49,6 @@
<bean id="dss-factory" class="ch.systemsx.cisd.openbis.generic.server.business.DataStoreServiceFactory"/> <bean id="dss-factory" class="ch.systemsx.cisd.openbis.generic.server.business.DataStoreServiceFactory"/>
<bean id="dss-user-session-cleaner" class="ch.systemsx.cisd.openbis.generic.server.util.DataStoreUserSessionCleaner" />
<bean id="authentication-service" <bean id="authentication-service"
class="ch.systemsx.cisd.openbis.generic.server.AuthenticationServiceHolder"> class="ch.systemsx.cisd.openbis.generic.server.AuthenticationServiceHolder">
<constructor-arg ref="${authentication-service}" /> <constructor-arg ref="${authentication-service}" />
...@@ -58,7 +56,10 @@ ...@@ -58,7 +56,10 @@
<bean id="session-manager" class="ch.systemsx.cisd.authentication.DefaultSessionManager"> <bean id="session-manager" class="ch.systemsx.cisd.authentication.DefaultSessionManager">
<constructor-arg> <constructor-arg>
<bean class="ch.systemsx.cisd.openbis.generic.server.SessionFactory" /> <bean class="ch.systemsx.cisd.openbis.generic.server.SessionFactory">
<constructor-arg ref="dao-factory" />
<constructor-arg ref="dss-factory" />
</bean>
</constructor-arg> </constructor-arg>
<constructor-arg> <constructor-arg>
<bean class="ch.systemsx.cisd.openbis.generic.shared.LogMessagePrefixGenerator" /> <bean class="ch.systemsx.cisd.openbis.generic.shared.LogMessagePrefixGenerator" />
...@@ -85,7 +86,6 @@ ...@@ -85,7 +86,6 @@
<constructor-arg ref="dss-factory" /> <constructor-arg ref="dss-factory" />
<constructor-arg ref="relationship-service" /> <constructor-arg ref="relationship-service" />
<constructor-arg ref="entity-operation-checker" /> <constructor-arg ref="entity-operation-checker" />
<constructor-arg ref="dss-user-session-cleaner" />
</bean> </bean>
<bean id="last-modification-state" <bean id="last-modification-state"
......
...@@ -43,7 +43,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.IDataStoreServiceFactory ...@@ -43,7 +43,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.IDataStoreServiceFactory
import ch.systemsx.cisd.openbis.generic.server.business.ManagerTestTool; import ch.systemsx.cisd.openbis.generic.server.business.ManagerTestTool;
import ch.systemsx.cisd.openbis.generic.server.business.bo.exception.DataSetDeletionUnknownLocationsException; import ch.systemsx.cisd.openbis.generic.server.business.bo.exception.DataSetDeletionUnknownLocationsException;
import ch.systemsx.cisd.openbis.generic.server.dataaccess.event.DeleteDataSetEventBuilder; import ch.systemsx.cisd.openbis.generic.server.dataaccess.event.DeleteDataSetEventBuilder;
import ch.systemsx.cisd.openbis.generic.server.util.DataStoreUserSessionCleaner;
import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils; import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService; import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
...@@ -80,8 +79,6 @@ public final class DataSetTableTest extends AbstractBOTest ...@@ -80,8 +79,6 @@ public final class DataSetTableTest extends AbstractBOTest
{ {
private IDataStoreServiceFactory dssFactory; private IDataStoreServiceFactory dssFactory;
private DataStoreUserSessionCleaner dssUserSessionCleaner;
private DataStorePE dss1; private DataStorePE dss1;
private DataStorePE dss2; private DataStorePE dss2;
...@@ -96,8 +93,8 @@ public final class DataSetTableTest extends AbstractBOTest ...@@ -96,8 +93,8 @@ public final class DataSetTableTest extends AbstractBOTest
private final DataSetTable createDataSetTable() private final DataSetTable createDataSetTable()
{ {
return new DataSetTable(daoFactory, dssFactory, dssUserSessionCleaner, return new DataSetTable(daoFactory, dssFactory, ManagerTestTool.EXAMPLE_SESSION,
ManagerTestTool.EXAMPLE_SESSION, relationshipService); relationshipService);
} }
@BeforeMethod @BeforeMethod
...@@ -106,7 +103,6 @@ public final class DataSetTableTest extends AbstractBOTest ...@@ -106,7 +103,6 @@ public final class DataSetTableTest extends AbstractBOTest
{ {
super.beforeMethod(); super.beforeMethod();
dssFactory = context.mock(IDataStoreServiceFactory.class); dssFactory = context.mock(IDataStoreServiceFactory.class);
dssUserSessionCleaner = new DataStoreUserSessionCleaner();
dss1 = createDataStore("dss1", false); dss1 = createDataStore("dss1", false);
dss2 = createDataStore("dss2", true); dss2 = createDataStore("dss2", true);
dss3 = createDataStore("dss3", true); dss3 = createDataStore("dss3", true);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment