13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.javac.api;
27
28 import java.util.Arrays;
29 import java.util.Collection;
30
31 import com.sun.source.util.TaskEvent;
32 import com.sun.source.util.TaskListener;
33 import com.sun.tools.javac.util.Context;
34 import com.sun.tools.javac.util.DefinedBy;
35 import com.sun.tools.javac.util.DefinedBy.Api;
36
37 /**
38 * A collection of currently registered {@link TaskListener}s. Events passed to this TaskListener
39 * will be forwarded to all the registered TaskListeners.
40 *
41 * <p><b>This is NOT part of any supported API.
42 * If you write code that depends on this, you do so at your own risk.
43 * This code and its internal interfaces are subject to change or
44 * deletion without notice.</b>
45 */
46 public class MultiTaskListener implements TaskListener {
47 /** The context key for the MultiTaskListener. */
48 public static final Context.Key<MultiTaskListener> taskListenerKey = new Context.Key<>();
49
50 /** Empty array of task listeners */
51 private static final TaskListener[] EMPTY_LISTENERS = new TaskListener[0];
52
53 /** Get the MultiTaskListener instance for this context. */
54 public static MultiTaskListener instance(Context context) {
55 MultiTaskListener instance = context.get(taskListenerKey);
56 if (instance == null)
57 instance = new MultiTaskListener(context);
58 return instance;
59 }
60
61 protected MultiTaskListener(Context context) {
62 context.put(taskListenerKey, this);
63 ccw = ClientCodeWrapper.instance(context);
64 }
65
66 /**
67 * The current set of registered listeners.
68 * This is a mutable reference to an immutable array.
69 */
70 TaskListener[] listeners = EMPTY_LISTENERS;
71
72 ClientCodeWrapper ccw;
73
74 public Collection<TaskListener> getTaskListeners() {
75 return Arrays.asList(listeners);
76 }
77
78 public boolean isEmpty() {
79 return listeners == EMPTY_LISTENERS;
80 }
81
82 public void add(TaskListener listener) {
83 for (TaskListener l: listeners) {
89 }
90
91 public void remove(TaskListener listener) {
92 for (int i = 0; i < listeners.length; i++) {
93 if (ccw.unwrap(listeners[i]) == listener) {
94 if (listeners.length == 1) {
95 listeners = EMPTY_LISTENERS;
96 } else {
97 TaskListener[] newListeners = new TaskListener[listeners.length - 1];
98 System.arraycopy(listeners, 0, newListeners, 0, i);
99 System.arraycopy(listeners, i + 1, newListeners, i, newListeners.length - i);
100 listeners = newListeners;
101 }
102 break;
103 }
104 }
105 }
106
107 @Override @DefinedBy(Api.COMPILER_TREE)
108 public void started(TaskEvent e) {
109 // guard against listeners being updated by a listener
110 TaskListener[] ll = this.listeners;
111 for (TaskListener l: ll)
112 l.started(e);
113 }
114
115 @Override @DefinedBy(Api.COMPILER_TREE)
116 public void finished(TaskEvent e) {
117 // guard against listeners being updated by a listener
118 TaskListener[] ll = this.listeners;
119 for (TaskListener l: ll)
120 l.finished(e);
121 }
122
123 @Override
124 public String toString() {
125 return Arrays.toString(listeners);
126 }
127
128 public void clear() {
129 listeners = EMPTY_LISTENERS;
130 }
131 }
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.javac.api;
27
28 import java.util.Arrays;
29 import java.util.Collection;
30
31 import com.sun.source.util.TaskEvent;
32 import com.sun.source.util.TaskListener;
33 import com.sun.tools.javac.code.DeferredCompletionFailureHandler;
34 import com.sun.tools.javac.code.DeferredCompletionFailureHandler.Handler;
35 import com.sun.tools.javac.util.Context;
36 import com.sun.tools.javac.util.DefinedBy;
37 import com.sun.tools.javac.util.DefinedBy.Api;
38
39 /**
40 * A collection of currently registered {@link TaskListener}s. Events passed to this TaskListener
41 * will be forwarded to all the registered TaskListeners.
42 *
43 * <p><b>This is NOT part of any supported API.
44 * If you write code that depends on this, you do so at your own risk.
45 * This code and its internal interfaces are subject to change or
46 * deletion without notice.</b>
47 */
48 public class MultiTaskListener implements TaskListener {
49 /** The context key for the MultiTaskListener. */
50 public static final Context.Key<MultiTaskListener> taskListenerKey = new Context.Key<>();
51
52 /** Empty array of task listeners */
53 private static final TaskListener[] EMPTY_LISTENERS = new TaskListener[0];
54
55 private final DeferredCompletionFailureHandler dcfh;
56
57 /** Get the MultiTaskListener instance for this context. */
58 public static MultiTaskListener instance(Context context) {
59 MultiTaskListener instance = context.get(taskListenerKey);
60 if (instance == null)
61 instance = new MultiTaskListener(context);
62 return instance;
63 }
64
65 protected MultiTaskListener(Context context) {
66 context.put(taskListenerKey, this);
67 ccw = ClientCodeWrapper.instance(context);
68 dcfh = DeferredCompletionFailureHandler.instance(context);
69 }
70
71 /**
72 * The current set of registered listeners.
73 * This is a mutable reference to an immutable array.
74 */
75 TaskListener[] listeners = EMPTY_LISTENERS;
76
77 ClientCodeWrapper ccw;
78
79 public Collection<TaskListener> getTaskListeners() {
80 return Arrays.asList(listeners);
81 }
82
83 public boolean isEmpty() {
84 return listeners == EMPTY_LISTENERS;
85 }
86
87 public void add(TaskListener listener) {
88 for (TaskListener l: listeners) {
94 }
95
96 public void remove(TaskListener listener) {
97 for (int i = 0; i < listeners.length; i++) {
98 if (ccw.unwrap(listeners[i]) == listener) {
99 if (listeners.length == 1) {
100 listeners = EMPTY_LISTENERS;
101 } else {
102 TaskListener[] newListeners = new TaskListener[listeners.length - 1];
103 System.arraycopy(listeners, 0, newListeners, 0, i);
104 System.arraycopy(listeners, i + 1, newListeners, i, newListeners.length - i);
105 listeners = newListeners;
106 }
107 break;
108 }
109 }
110 }
111
112 @Override @DefinedBy(Api.COMPILER_TREE)
113 public void started(TaskEvent e) {
114 Handler prevDeferredHandler = dcfh.setHandler(dcfh.userCodeHandler);
115 try {
116 // guard against listeners being updated by a listener
117 TaskListener[] ll = this.listeners;
118 for (TaskListener l: ll)
119 l.started(e);
120 } finally {
121 dcfh.setHandler(prevDeferredHandler);
122 }
123 }
124
125 @Override @DefinedBy(Api.COMPILER_TREE)
126 public void finished(TaskEvent e) {
127 Handler prevDeferredHandler = dcfh.setHandler(dcfh.userCodeHandler);
128 try {
129 // guard against listeners being updated by a listener
130 TaskListener[] ll = this.listeners;
131 for (TaskListener l: ll)
132 l.finished(e);
133 } finally {
134 dcfh.setHandler(prevDeferredHandler);
135 }
136 }
137
138 @Override
139 public String toString() {
140 return Arrays.toString(listeners);
141 }
142
143 public void clear() {
144 listeners = EMPTY_LISTENERS;
145 }
146 }
|