Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/core/EventMonitor.java')
-rw-r--r--bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/core/EventMonitor.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/core/EventMonitor.java b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/core/EventMonitor.java
new file mode 100644
index 00000000..6d0f900a
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/core/EventMonitor.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.tools.event.spy.core;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.tools.event.spy.model.CapturedEvent;
+import org.eclipse.e4.tools.event.spy.model.CapturedEventFilter;
+import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
+import org.eclipse.e4.ui.services.internal.events.EventBroker;
+import org.eclipse.e4.ui.workbench.UIEvents;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class EventMonitor {
+
+ public interface NewEventListener {
+ void newEvent(CapturedEvent event);
+ }
+
+ private final static String TOPIC = UIEvents.UITopicBase + UIEvents.TOPIC_SEP + UIEvents.ALL_SUB_TOPICS;
+
+ @SuppressWarnings({"serial", "restriction"})
+ private static Set<Integer> EVENT_HELPER_CLASSES = new HashSet<Integer>() {{
+ add(UIEvents.class.getName().hashCode());
+ add(UIEventPublisher.class.getName().hashCode());
+ }};
+
+ private Collection<CapturedEventFilter> filters;
+
+ private IEventBroker eventBroker;
+
+ private NewEventListener listener;
+
+ private CapturedEventFilterMatcher eventFilterMatcher;
+
+ private EventHandler eventHandler = new EventHandler() {
+ public void handleEvent(Event event) {
+ if (listener == null) {
+ return;
+ }
+
+ CapturedEvent capturedEvent = new CapturedEvent();
+ capturedEvent.setTopic(event.getTopic());
+ capturedEvent.setPublisherClassName(getPublisherClassName());
+
+ for (String propertyName: event.getPropertyNames()) {
+ Object value = event.getProperty(propertyName);
+ capturedEvent.addParameter(propertyName, value);
+ if (value != null && UIEvents.EventTags.ELEMENT.equals(propertyName)) {
+ capturedEvent.setChangedElementClassName(value.getClass().getName());
+ }
+ }
+
+ if (shouldBeCaptured(capturedEvent)) {
+ listener.newEvent(capturedEvent);
+ }
+ }
+ };
+
+ public EventMonitor(IEventBroker eventBroker) {
+ this.eventBroker = eventBroker;
+ }
+
+ public void start(Collection<CapturedEventFilter> filters) {
+ this.filters = filters;
+ eventBroker.subscribe(TOPIC, eventHandler);
+ }
+
+ public void stop() {
+ eventBroker.unsubscribe(eventHandler);
+ }
+
+ public void setNewEventListener(NewEventListener listener) {
+ this.listener = listener;
+ }
+
+ private boolean shouldBeCaptured(CapturedEvent event) {
+ if (filters != null) {
+ Iterator<CapturedEventFilter> iter = filters.iterator();
+ while (iter.hasNext()) {
+ if (!getEventFilterMatcher().matches(event, iter.next())) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private String getPublisherClassName() {
+ StackTraceElement items[] = Thread.currentThread().getStackTrace();
+ boolean foundEventBroker = false;
+
+ for (int i=0; i<items.length; i++) {
+ String clsName = items[i].getClassName();
+ if (!foundEventBroker && clsName.equals(EventBroker.class.getName())) {
+ foundEventBroker = true;
+ } else if (foundEventBroker) {
+ if (!EVENT_HELPER_CLASSES.contains(clsName.hashCode())) {
+ return String.format("%s (%s:%d)", clsName, items[i].getMethodName(), items[i].getLineNumber());
+ }
+ }
+ }
+ return "";
+ }
+
+ private CapturedEventFilterMatcher getEventFilterMatcher() {
+ if (eventFilterMatcher == null) {
+ eventFilterMatcher = new CapturedEventFilterMatcher();
+ }
+ return eventFilterMatcher;
+ }
+}

Back to the top