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}