author | ryall |
Mon, 12 Oct 2009 15:55:57 -0500 | |
changeset 101 | 133ef3ae697b |
parent 37 | c2bce6dd59e7 |
permissions | -rw-r--r-- |
37 | 1 |
/******************************************************************************* |
2 |
* Copyright (c) 2006, 2008 Wind River Systems and others. |
|
3 |
* All rights reserved. This program and the accompanying materials |
|
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
|
5 |
* which accompanies this distribution, and is available at |
|
6 |
* http://www.eclipse.org/legal/epl-v10.html |
|
7 |
* |
|
8 |
* Contributors: |
|
9 |
* Wind River Systems - initial API and implementation |
|
10 |
*******************************************************************************/ |
|
11 |
package org.eclipse.cdt.dsf.service; |
|
12 |
||
13 |
import java.lang.reflect.InvocationTargetException; |
|
14 |
import java.lang.reflect.Method; |
|
15 |
import java.util.ArrayList; |
|
16 |
import java.util.Collections; |
|
17 |
import java.util.Comparator; |
|
18 |
import java.util.Dictionary; |
|
19 |
import java.util.HashMap; |
|
20 |
import java.util.HashSet; |
|
21 |
import java.util.List; |
|
22 |
import java.util.Map; |
|
23 |
import java.util.Set; |
|
24 |
import java.util.SortedMap; |
|
25 |
import java.util.TreeMap; |
|
26 |
||
27 |
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor; |
|
28 |
import org.eclipse.cdt.dsf.concurrent.DsfExecutor; |
|
29 |
import org.eclipse.cdt.dsf.concurrent.DsfRunnable; |
|
30 |
import org.eclipse.cdt.dsf.concurrent.ThreadSafe; |
|
31 |
import org.eclipse.cdt.dsf.internal.DsfPlugin; |
|
32 |
import org.eclipse.core.runtime.IStatus; |
|
33 |
import org.eclipse.core.runtime.Status; |
|
34 |
import org.osgi.framework.Filter; |
|
35 |
||
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 | 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 | 49 |
* |
50 |
* @see org.eclipse.cdt.dsf.concurrent.DsfExecutor |
|
51 |
* |
|
52 |
* @since 1.0 |
|
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 496 |
} |