cdt/cdt_6_0_x/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfSession.java
author ryall
Mon, 12 Oct 2009 15:55:57 -0500
changeset 101 133ef3ae697b
parent 37 c2bce6dd59e7
permissions -rw-r--r--
Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     1
/*******************************************************************************
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     2
 * Copyright (c) 2006, 2008 Wind River Systems and others.
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     3
 * All rights reserved. This program and the accompanying materials
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     4
 * are made available under the terms of the Eclipse Public License v1.0
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     5
 * which accompanies this distribution, and is available at
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     6
 * http://www.eclipse.org/legal/epl-v10.html
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     7
 * 
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     8
 * Contributors:
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
     9
 *     Wind River Systems - initial API and implementation
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    10
 *******************************************************************************/
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    11
package org.eclipse.cdt.dsf.service;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    12
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    13
import java.lang.reflect.InvocationTargetException;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    14
import java.lang.reflect.Method;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    15
import java.util.ArrayList;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    16
import java.util.Collections;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    17
import java.util.Comparator;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    18
import java.util.Dictionary;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    19
import java.util.HashMap;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    20
import java.util.HashSet;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    21
import java.util.List;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    22
import java.util.Map;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    23
import java.util.Set;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    24
import java.util.SortedMap;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    25
import java.util.TreeMap;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    26
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    27
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    28
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    29
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    30
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    31
import org.eclipse.cdt.dsf.internal.DsfPlugin;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    32
import org.eclipse.core.runtime.IStatus;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    33
import org.eclipse.core.runtime.Status;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    34
import org.osgi.framework.Filter;
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    35
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    36
/**
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    37
 * Class to manage DSF sessions. A DSF session is a way to associate a set of
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    38
 * DSF services that are running simultaneously and are interacting with each
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    39
 * other to provide a complete set of functionality.
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    40
 * <p>
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    41
 * Properties of a session are following: <br>
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    42
 * 1. Each session is associated with a single DSF executor, although there
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    43
 * could be multiple sessions using the same executor. <br>
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    44
 * 2. Each session has a unique String identifier, which has to be used by the
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    45
 * services belonging to this session when registering with OSGI services. <br>
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    46
 * 3. Each session has its set of service event listeners. <br>
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    47
 * 4. Start and end of each session is announced by events, which are always
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    48
 * sent on that session's executor dispatch thread.
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    49
 * 
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    50
 * @see org.eclipse.cdt.dsf.concurrent.DsfExecutor
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    51
 * 
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    52
 * @since 1.0
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    53
 */
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    54
@ConfinedToDsfExecutor("getExecutor")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    55
public class DsfSession {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    56
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    57
	 * Listener for session started events. This listener is always going to be
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    58
	 * called in the dispatch thread of the session's executor.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    59
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    60
	public static interface SessionStartedListener {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    61
		/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    62
		 * Called when a new session is started. It is always called in the
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    63
		 * dispatch thread of the new session.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    64
		 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    65
		public void sessionStarted(DsfSession session);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    66
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    67
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    68
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    69
	 * Listener for session ended events. This listener is always going to be
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    70
	 * called in the dispatch thread of the session's executor.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    71
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    72
	public static interface SessionEndedListener {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    73
		/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    74
		 * Called when a session is ended. It is always called in the dispatch
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    75
		 * thread of the session.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    76
		 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    77
		public void sessionEnded(DsfSession session);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    78
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    79
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    80
	private static int fgSessionIdCounter = 0;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    81
	private static Set<DsfSession> fgActiveSessions = Collections.synchronizedSet(new HashSet<DsfSession>());
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    82
	private static List<SessionStartedListener> fSessionStartedListeners = Collections
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    83
			.synchronizedList(new ArrayList<SessionStartedListener>());
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    84
	private static List<SessionEndedListener> fSessionEndedListeners = Collections
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    85
			.synchronizedList(new ArrayList<SessionEndedListener>());
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    86
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    87
	/** Returns true if given session is currently active */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    88
	public static boolean isSessionActive(String sessionId) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    89
		return getSession(sessionId) != null;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    90
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
    91
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    92
	/** Returns a session instance for given session identifier */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    93
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    94
	public static DsfSession getSession(String sessionId) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    95
		synchronized (fgActiveSessions) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    96
			for (DsfSession session : fgActiveSessions) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    97
				if (session.getId().equals(sessionId)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    98
					return session;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
    99
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   100
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   101
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   102
		return null;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   103
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   104
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   105
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   106
	 * Registers a listener for session started events. Can be called on any
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   107
	 * thread.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   108
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   109
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   110
	public static void addSessionStartedListener(SessionStartedListener listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   111
		assert !fSessionStartedListeners.contains(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   112
		fSessionStartedListeners.add(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   113
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   114
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   115
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   116
	 * Un-registers a listener for session started events. Can be called on any
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   117
	 * thread.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   118
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   119
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   120
	public static void removeSessionStartedListener(SessionStartedListener listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   121
		assert fSessionStartedListeners.contains(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   122
		fSessionStartedListeners.remove(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   123
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   124
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   125
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   126
	 * Registers a listener for session ended events. Can be called on any
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   127
	 * thread.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   128
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   129
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   130
	public static void addSessionEndedListener(SessionEndedListener listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   131
		assert !fSessionEndedListeners.contains(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   132
		fSessionEndedListeners.add(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   133
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   134
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   135
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   136
	 * Un-registers a listener for session ended events. Can be called on any
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   137
	 * thread.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   138
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   139
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   140
	public static void removeSessionEndedListener(SessionEndedListener listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   141
		assert fSessionEndedListeners.contains(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   142
		fSessionEndedListeners.remove(listener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   143
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   144
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   145
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   146
	 * Starts and returns a new session instance. This method can be called on
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   147
	 * any thread, but the session-started listeners will be called using the
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   148
	 * session's executor.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   149
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   150
	 * @param executor
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   151
	 *            The DSF executor to use for this session.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   152
	 * @param ownerId
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   153
	 *            ID (plugin ID preferably) of the owner of this session
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   154
	 * @return instance object of the new session
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   155
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   156
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   157
	public static DsfSession startSession(DsfExecutor executor, String ownerId) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   158
		synchronized (fgActiveSessions) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   159
			final DsfSession newSession = new DsfSession(executor, ownerId, Integer.toString(fgSessionIdCounter++));
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   160
			fgActiveSessions.add(newSession);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   161
			executor.submit(new DsfRunnable() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   162
				public void run() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   163
					SessionStartedListener[] listeners = fSessionStartedListeners
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   164
							.toArray(new SessionStartedListener[fSessionStartedListeners.size()]);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   165
					for (int i = 0; i < listeners.length; i++) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   166
						listeners[i].sessionStarted(newSession);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   167
					}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   168
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   169
			});
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   170
			return newSession;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   171
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   172
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   173
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   174
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   175
	 * Terminates the given session. This method can be also called on any
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   176
	 * thread, but the session-ended listeners will be called using the
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   177
	 * session's executor.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   178
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   179
	 * @param session
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   180
	 *            session to terminate
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   181
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   182
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   183
	public static void endSession(final DsfSession session) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   184
		synchronized (fgActiveSessions) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   185
			if (!fgActiveSessions.contains(session)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   186
				throw new IllegalArgumentException();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   187
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   188
			fgActiveSessions.remove(session);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   189
			session.getExecutor().submit(new DsfRunnable() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   190
				public void run() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   191
					SessionEndedListener[] listeners = fSessionEndedListeners
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   192
							.toArray(new SessionEndedListener[fSessionEndedListeners.size()]);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   193
					for (int i = 0; i < listeners.length; i++) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   194
						listeners[i].sessionEnded(session);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   195
					}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   196
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   197
			});
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   198
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   199
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   200
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   201
	private static class ListenerEntry {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   202
		Object fListener;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   203
		Filter fFilter;
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   204
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   205
		ListenerEntry(Object listener, Filter filter) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   206
			fListener = listener;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   207
			fFilter = filter;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   208
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   209
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   210
		@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   211
		public boolean equals(Object other) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   212
			return other instanceof ListenerEntry && fListener.equals(((ListenerEntry) other).fListener);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   213
		}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   214
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   215
		@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   216
		public int hashCode() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   217
			return fListener.hashCode();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   218
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   219
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   220
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   221
	/** ID (plugin ID preferably) of the owner of this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   222
	private final String fOwnerId;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   223
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   224
	/** Session ID of this session. */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   225
	private final String fId;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   226
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   227
	/** Dispatch-thread executor for this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   228
	private final DsfExecutor fExecutor;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   229
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   230
	/** Service start-up counter for this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   231
	private int fServiceInstanceCounter;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   232
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   233
	/** Map of registered event listeners. */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   234
	private final Map<ListenerEntry, Method[]> fListeners = new HashMap<ListenerEntry, Method[]>();
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   235
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   236
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   237
	 * Map of registered adapters, for implementing the
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   238
	 * IModelContext.getAdapter() method.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   239
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   240
	 * @see org.eclipse.cdt.dsf.datamodel.AbstractDMContext#getAdapter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   241
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   242
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   243
	private final Map<Class, Object> fAdapters = Collections.synchronizedMap(new HashMap<Class, Object>());
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   244
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   245
	/** Returns the owner ID of this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   246
	public String getOwnerId() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   247
		return fOwnerId;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   248
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   249
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   250
	public boolean isActive() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   251
		return DsfSession.isSessionActive(fId);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   252
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   253
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   254
	/** Returns the ID of this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   255
	public String getId() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   256
		return fId;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   257
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   258
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   259
	/** Returns the DSF executor of this session */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   260
	public DsfExecutor getExecutor() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   261
		return fExecutor;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   262
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   263
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   264
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   265
	 * Returns the active sessions
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   266
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   267
	 * @since 2.1
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   268
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   269
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   270
	public static DsfSession[] getActiveSessions() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   271
		return fgActiveSessions.toArray(new DsfSession[fgActiveSessions.size()]);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   272
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   273
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   274
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   275
	 * Adds a new listener for service events in this session.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   276
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   277
	 * @param listener
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   278
	 *            the listener that will receive service events
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   279
	 * @param filter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   280
	 *            optional filter to restrict the services that the listener
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   281
	 *            will receive events from
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   282
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   283
	public void addServiceEventListener(Object listener, Filter filter) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   284
		ListenerEntry entry = new ListenerEntry(listener, filter);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   285
		assert !fListeners.containsKey(entry);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   286
		fListeners.put(entry, getEventHandlerMethods(listener));
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   287
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   288
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   289
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   290
	 * Removes the given listener.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   291
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   292
	 * @param listener
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   293
	 *            listener to remove
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   294
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   295
	public void removeServiceEventListener(Object listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   296
		ListenerEntry entry = new ListenerEntry(listener, null);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   297
		assert fListeners.containsKey(entry);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   298
		fListeners.remove(entry);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   299
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   300
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   301
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   302
	 * Retrieves and increments the startup counter for services in this
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   303
	 * session. DSF services should retrieve this counter when they are
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   304
	 * initialized, and should return it through IService.getStartupNumber().
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   305
	 * This number is then used to prioritize service events.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   306
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   307
	 * @return current startup counter value
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   308
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   309
	public int getAndIncrementServiceStartupCounter() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   310
		return fServiceInstanceCounter++;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   311
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   312
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   313
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   314
	 * Dispatches the given event to service event listeners. The event is
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   315
	 * submitted to the executor to be dispatched.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   316
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   317
	 * @param event
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   318
	 *            to be sent out
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   319
	 * @param serviceProperties
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   320
	 *            properties of the service requesting the event to be
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   321
	 *            dispatched
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   322
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   323
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   324
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   325
	public void dispatchEvent(final Object event, final Dictionary serviceProperties) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   326
		getExecutor().submit(new DsfRunnable() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   327
			public void run() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   328
				doDispatchEvent(event, serviceProperties);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   329
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   330
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   331
			@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   332
			public String toString() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   333
				return "Event: " + event + ", from service " + serviceProperties;} //$NON-NLS-1$ //$NON-NLS-2$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   334
		});
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   335
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   336
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   337
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   338
	 * Registers a IModelContext adapter of given type.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   339
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   340
	 * @param adapterType
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   341
	 *            class type to register the adapter for
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   342
	 * @param adapter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   343
	 *            adapter instance to register
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   344
	 * @see org.eclipse.dsdp.model.AbstractDMContext#getAdapter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   345
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   346
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   347
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   348
	public void registerModelAdapter(Class adapterType, Object adapter) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   349
		fAdapters.put(adapterType, adapter);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   350
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   351
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   352
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   353
	 * Un-registers a IModelContext adapter of given type.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   354
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   355
	 * @param adapterType
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   356
	 *            adapter type to unregister
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   357
	 * @see org.eclipse.dsdp.model.AbstractDMContext#getAdapter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   358
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   359
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   360
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   361
	public void unregisterModelAdapter(Class adapterType) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   362
		fAdapters.remove(adapterType);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   363
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   364
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   365
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   366
	 * Retrieves an adapter for given type for IModelContext.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   367
	 * 
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   368
	 * @param adapterType
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   369
	 *            adapter type to look fors
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   370
	 * @return adapter object for given type, null if none is registered with
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   371
	 *         the session
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   372
	 * @see org.eclipse.dsdp.model.AbstractDMContext#getAdapter
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   373
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   374
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   375
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   376
	public Object getModelAdapter(Class adapterType) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   377
		return fAdapters.get(adapterType);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   378
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   379
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   380
	@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   381
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   382
	public boolean equals(Object other) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   383
		return other instanceof DsfSession && fId.equals(((DsfSession) other).fId);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   384
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   385
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   386
	@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   387
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   388
	public int hashCode() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   389
		return fId.hashCode();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   390
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   391
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   392
	@SuppressWarnings("unchecked")
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   393
	private void doDispatchEvent(Object event, Dictionary serviceProperties) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   394
		// Build a list of listeners;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   395
		SortedMap<ListenerEntry, List<Method>> listeners = new TreeMap<ListenerEntry, List<Method>>(
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   396
				new Comparator<ListenerEntry>() {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   397
					public int compare(ListenerEntry o1, ListenerEntry o2) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   398
						if (o1.fListener == o2.fListener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   399
							return 0;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   400
						}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   401
						if (o1.fListener instanceof IDsfService && !(o2.fListener instanceof IDsfService)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   402
							return Integer.MIN_VALUE;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   403
						} else if (o2.fListener instanceof IDsfService && !(o1.fListener instanceof IDsfService)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   404
							return Integer.MAX_VALUE;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   405
						} else if ((o1.fListener instanceof IDsfService) && (o2.fListener instanceof IDsfService)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   406
							return ((IDsfService) o1.fListener).getStartupNumber()
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   407
									- ((IDsfService) o2.fListener).getStartupNumber();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   408
						}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   409
						return 1;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   410
					}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   411
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   412
					@Override
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   413
					public boolean equals(Object obj) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   414
						return obj == this;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   415
					}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   416
				});
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   417
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   418
		// Build a list of listeners and methods that are registered for this
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   419
		// event class.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   420
		Class<?> eventClass = event.getClass();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   421
		for (Map.Entry<ListenerEntry, Method[]> entry : fListeners.entrySet()) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   422
			if (entry.getKey().fFilter != null && !entry.getKey().fFilter.match(serviceProperties)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   423
				// Dispatching service doesn't match the listener's filter, skip
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   424
				// it.
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   425
				continue;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   426
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   427
			Method[] allMethods = entry.getValue();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   428
			List<Method> matchingMethods = new ArrayList<Method>();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   429
			for (Method method : allMethods) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   430
				assert method.getParameterTypes().length > 0 : eventClass.getName() + "." + method.getName() //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   431
						+ " signature contains zero parameters"; //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   432
				if (method.getParameterTypes()[0].isAssignableFrom(eventClass)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   433
					matchingMethods.add(method);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   434
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   435
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   436
			if (!matchingMethods.isEmpty()) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   437
				listeners.put(entry.getKey(), matchingMethods);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   438
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   439
		}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   440
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   441
		// Call the listeners
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   442
		for (Map.Entry<ListenerEntry, List<Method>> entry : listeners.entrySet()) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   443
			for (Method method : entry.getValue()) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   444
				try {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   445
					method.invoke(entry.getKey().fListener, new Object[] { event });
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   446
				} catch (IllegalAccessException e) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   447
					DsfPlugin.getDefault().getLog().log(
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   448
							new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, -1,
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   449
									"Security exception when calling a service event handler method", e)); //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   450
					assert false : "IServiceEventListener.ServiceHandlerMethod method not accessible, is listener declared public?"; //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   451
				} catch (InvocationTargetException e) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   452
					DsfPlugin.getDefault().getLog().log(
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   453
							new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, -1,
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   454
									"Invocation exception when calling a service event handler method", e)); //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   455
					assert false : "Exception thrown by a IServiceEventListener.ServiceHandlerMethod method"; //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   456
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   457
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   458
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   459
	}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   460
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   461
	private Method[] getEventHandlerMethods(Object listener) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   462
		List<Method> retVal = new ArrayList<Method>();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   463
		try {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   464
			Method[] methods = listener.getClass().getMethods();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   465
			for (Method method : methods) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   466
				if (method.isAnnotationPresent(DsfServiceEventHandler.class)) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   467
					Class<?>[] paramTypes = method.getParameterTypes();
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   468
					if (paramTypes.length > 2) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   469
						throw new IllegalArgumentException(
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   470
								"ServiceEventHandler method has incorrect number of parameters"); //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   471
					}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   472
					retVal.add(method);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   473
				}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   474
			}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   475
		} catch (SecurityException e) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   476
			throw new IllegalArgumentException("No permission to access ServiceEventHandler method"); //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   477
		}
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   478
101
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   479
		if (retVal.isEmpty()) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   480
			throw new IllegalArgumentException(
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   481
					"No methods marked with @ServiceEventHandler in listener, is listener declared public?"); //$NON-NLS-1$
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   482
		}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   483
		return retVal.toArray(new Method[retVal.size()]);
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   484
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   485
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   486
	/**
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   487
	 * Class to be instanciated only using startSession()
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   488
	 */
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   489
	@ThreadSafe
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   490
	private DsfSession(DsfExecutor executor, String ownerId, String id) {
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   491
		fId = id;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   492
		fOwnerId = ownerId;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   493
		fExecutor = executor;
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   494
	}
133ef3ae697b Access to session list: CDT bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=292070
ryall
parents: 37
diff changeset
   495
37
c2bce6dd59e7 add cdt_6_0_x
cawthron
parents:
diff changeset
   496
}