/* * $Id$ * * Copyright 2008 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.services.util; import ome.conditions.SessionException; import ome.model.meta.Session; import ome.services.sessions.SessionManager; import ome.system.Principal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; /** * Thread which can be started and will appropriately acquire a session, then * use the {@link Executor} to complete its work. * * @author Josh Moore, josh at glencoesoftware.com * @since 3.0-Beta3 */ public abstract class ExecutionThread implements Runnable { private final static Logger log = LoggerFactory.getLogger(ExecutionThread.class); final protected SessionManager manager; final protected Executor executor; final protected Executor.Work work; final protected Principal principal; private Principal sessionPrincipal = null; private Session session = null; /** * Main constructor. No arguments can be null. */ public ExecutionThread(SessionManager manager, Executor executor, Executor.Work work, Principal principal) { Assert.notNull(manager); Assert.notNull(executor); Assert.notNull(work); Assert.notNull(principal); this.manager = manager; this.executor = executor; this.work = work; this.principal = principal; } /** * Initializes the {@link Session} for this {@link Thread} if necessary, * then calls {@link #doRun()}. */ public final void run() { sessionInit(); doRun(); } public final Principal getPrincipal() { return sessionPrincipal; } /** */ public abstract void doRun(); protected final void sessionInit() { if (sessionPrincipal != null) { try { this.manager.getEventContext(sessionPrincipal); } catch (SessionException e) { sessionPrincipal = null; } } if (sessionPrincipal == null) { session = this.manager.createWithAgent(principal, "ExecutionThread", null); sessionPrincipal = new Principal(session.getUuid(), principal .getGroup(), principal.getEventType()); } } }