/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.waveprotocol.box.webclient.stat.gwtevent;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Implementation of the {@link StatisticsEventSystem} that dispatches all the
* GWT events.
*/
public class GwtStatisticsEventSystem implements StatisticsEventSystem {
private Listeners listeners;
private boolean enabled;
public GwtStatisticsEventSystem() {
this.listeners = new Listeners();
this.enabled = false;
}
public void enable(boolean replay) {
if (!enabled) {
enable0(listeners);
enabled = true;
}
if (replay) {
replay(listeners);
}
}
private native void enable0(StatisticsEventListener listener) /*-{
var old = $wnd.__stats_listener;
if (!old) {
old = function() {};
}
$wnd.__stats_listener = function(event) {
old(event);
@org.waveprotocol.box.webclient.stat.gwtevent.GwtStatisticsEventSystem::onEvent(Lorg/waveprotocol/box/webclient/stat/gwtevent/GwtStatisticsEvent;Lorg/waveprotocol/box/webclient/stat/gwtevent/StatisticsEventListener;)
(event, listener);
};
}-*/;
protected static void onEvent(GwtStatisticsEvent event, StatisticsEventListener listener) {
listener.onStatisticsEvent(event.asEvent());
}
//@Override
public void addListener(StatisticsEventListener listener, boolean replay) {
if (replay) {
replay(listener);
}
listeners.add(listener);
}
private native void replay(StatisticsEventListener listener) /*-{
var stats = $wnd.__stats;
if (stats) {
for (var i in stats) {
@org.waveprotocol.box.webclient.stat.gwtevent.GwtStatisticsEventSystem::onEvent(Lorg/waveprotocol/box/webclient/stat/gwtevent/GwtStatisticsEvent;Lorg/waveprotocol/box/webclient/stat/gwtevent/StatisticsEventListener;)
(stats[i], listener);
}
}
}-*/;
//@Override
public void removeListener(StatisticsEventListener listener) {
listeners.remove(listener);
}
//@Override
public native void clearEventHistory() /*-{
$wnd.__stats.length = 0;
}-*/;
//@Override
public Iterator<StatisticsEvent> pastEvents() {
return new Iterator<StatisticsEvent>() {
private int idx = 0;
//@Override
public void remove() {
throw new RuntimeException("Illegal operation. Event history is read-only.");
}
//@Override
public boolean hasNext() {
return hasNext0(idx);
}
private native boolean hasNext0(int idx) /*-{
var stats = $wnd.__stats;
return stats && (idx < stats.length);
}-*/;
//@Override
public StatisticsEvent next() {
return next0(idx++).asEvent();
}
private native GwtStatisticsEvent next0(int idx) /*-{
var stats = $wnd.__stats;
return (stats && (idx < stats.length)) ? stats[idx] : null;
}-*/;
};
}
private static class Listeners
extends ArrayList<StatisticsEventListener> implements StatisticsEventListener {
public Listeners() {
}
//@Override
public void onStatisticsEvent(StatisticsEvent event) {
for (StatisticsEventListener l : this) {
l.onStatisticsEvent(event);
}
}
}
}