001/******************************************************************************* 002 * Copyright (c) 2006-2014 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the Eclipse Public License v1.0 006 * which accompanies this distribution, and is available at 007 * http://www.eclipse.org/legal/epl-v10.html 008 ******************************************************************************/ 009package org.nuxeo.runtime.trackers.concurrent; 010 011import org.nuxeo.runtime.api.Framework; 012import org.nuxeo.runtime.services.event.Event; 013import org.nuxeo.runtime.services.event.EventService; 014import org.nuxeo.runtime.trackers.files.FileEventTracker; 015 016/** 017 * Runtime events that be fired once a thread is about to enter in the nuxeo runtime or leave it. Could be used for 018 * cleaning resource such as the {@link FileEventTracker}. Producers should use the static 019 * {@link ThreadEvent#onEnter(Object, boolean)} and {@link ThreadEvent#onLeave(Object)} factory methods and fire events 020 * by invoking the event's {@link ThreadEvent#send()} method. Consumers should implements the {@link ThreadEventHandler} 021 * interface and register it in the {@link EventService} using the {@link ThreadEventListener} wrapper. 022 * 023 * @since 6.0 024 * @author Stephane Lacoin at Nuxeo (aka matic) 025 */ 026public abstract class ThreadEvent extends Event { 027 028 public ThreadEvent(Class<? extends ThreadEvent> type, Object source, Object data) { 029 super(ThreadEvent.class.getName(), type.getSimpleName(), source, data); 030 } 031 032 protected static class EnterEvent extends ThreadEvent { 033 034 public EnterEvent(Object source, boolean isLongRunning) { 035 super(EnterEvent.class, source, isLongRunning); 036 } 037 038 public boolean isLongRunning() { 039 return Boolean.valueOf((Boolean) getData()); 040 } 041 042 @Override 043 public void handle(ThreadEventHandler handler) { 044 handler.onEnter(Boolean.valueOf((Boolean) getData())); 045 } 046 } 047 048 protected static class LeaveEvent extends ThreadEvent { 049 public LeaveEvent(Object source) { 050 super(LeaveEvent.class, source, null); 051 } 052 053 @Override 054 public void handle(ThreadEventHandler handler) { 055 handler.onLeave(); 056 } 057 } 058 059 public abstract void handle(ThreadEventHandler handler); 060 061 public void send() { 062 Framework.getService(EventService.class).sendEvent(this); 063 } 064 065 public static ThreadEvent onEnter(Object source, boolean isLongRunning) { 066 return new EnterEvent(source, isLongRunning); 067 } 068 069 public static ThreadEvent onLeave(Object source) { 070 return new LeaveEvent(source); 071 } 072 073 public static void listen(ThreadEventListener aListener) { 074 Framework.getService(EventService.class).addListener(ThreadEvent.class.getName(), aListener); 075 } 076 077 public static void ignore(ThreadEventListener aListener) { 078 Framework.getService(EventService.class).removeListener(ThreadEvent.class.getName(), aListener); 079 } 080}