com.talk2object.plum.interaction.session.SessionManagerImpl Maven / Gradle / Ivy
package com.talk2object.plum.interaction.session;
import java.util.ArrayList;
import java.util.List;
import com.talk2object.common.ApplicationContextUtils;
import com.talk2object.common.Context;
import com.talk2object.plum.interaction.InteractionManager;
import com.talk2object.plum.interaction.WindowInteractionManager;
import com.talk2object.plum.interaction.application.PlumApplicationContextUtils;
import com.talk2object.plum.interaction.context.InteractionContextUtils;
import com.talk2object.plum.view.component.containers.window.MainWindow;
import com.talk2object.plum.view.component.containers.window.Window;
import com.talk2object.plum.view.component.containers.window.WindowManager;
import com.talk2object.plum.view.context.ViewSessionContextUtils;
import com.talk2object.plum.viewgeneration.ViewBuildContext;
import com.talk2object.plum.viewgeneration.ViewFactory;
import com.talk2object.plum.viewgeneration.classexpr.ViewClassExpressions;
/**
* manages all client sessions
*
* @author jack
*
*/
public class SessionManagerImpl implements SessionManager {
private List sessionContextList = new ArrayList();
private Context applicationContext;
private String defaultModelClassName;
private Class defaultModelClass;
public SessionManagerImpl() {
applicationContext = ApplicationContextUtils.getApplicationContext();
}
@Override
public List getSessionContextList() {
return sessionContextList;
}
@Override
public SessionContext createSession(SessionConfig config) {
SessionContext sessionContext = new SessionContext(applicationContext);
sessionContextList.add(sessionContext);
// 1 attach session context to thread local
SessionContextUtils.setCurrentSessionContext(sessionContext);
if (config == null)
config = createDefaultSessionConfig();
createSessionView(sessionContext, config);
ViewSessionContextUtils.init(sessionContext);
// 2 detach session context from thread local
SessionContextUtils.removeCurrentSessionContext();
return sessionContext;
}
private SessionConfig createDefaultSessionConfig() {
if (defaultModelClassName == null || defaultModelClassName.isEmpty())
throw new RuntimeException("no default model class name is set.");
return new SessionConfig(defaultModelClassName);
}
private void createSessionView(SessionContext sessionContext,
SessionConfig config) {
Object model = config.getModel();
// create new view
ViewFactory viewFactory = PlumApplicationContextUtils.getViewFactory();
MainWindow mainWindow = (MainWindow) viewFactory.create(model,
ViewClassExpressions.single(MainWindow.class),
ViewBuildContext.DEFAULT);
// create window manager
WindowManager windowManager = new WindowManager();
mainWindow.setWindowManager(windowManager);
windowManager.register(mainWindow);
// set session context into main event thread context, sub-windows
// inherit it.
mainWindow.getEventThread().getContext()
.setSessionContext(sessionContext);
// create interaction manager
InteractionManager interactionManager = new WindowInteractionManager(
mainWindow);
InteractionContextUtils.setInteractionManager(
mainWindow.getEventThread(), interactionManager);
mainWindow.show();
// inject into session context
sessionContext.setModel(model);
sessionContext.setView(mainWindow);
ViewSessionContextUtils.setWindowManager(sessionContext, windowManager);
}
public String getDefaultModelClassName() {
return defaultModelClassName;
}
public void setDefaultModelClassName(String defaultModelClassName) {
this.defaultModelClassName = defaultModelClassName;
}
@Override
public void destroySession(SessionContext sessionContext) {
sessionContextList.remove(sessionContext);
// terminate thread
Window window = sessionContext.getView();
if (window != null) {
window.closeWindow();
// window.getEventThread().interrupt();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy