/* * Copyright 2010 The Rabbit Eclipse Plug-in Project * * Licensed 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 rabbit.tracking.internal.trackers; import rabbit.data.handler.DataHandler; import rabbit.data.store.IStorer; import rabbit.data.store.model.SessionEvent; import rabbit.tracking.internal.IdleDetector; import rabbit.tracking.internal.TrackingPlugin; import rabbit.tracking.internal.util.Recorder; import rabbit.tracking.internal.util.Recorder.Record; import rabbit.tracking.internal.util.WorkbenchUtil; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.joda.time.Interval; import java.util.Observable; import java.util.Observer; /** * Tracks duration of Eclipse sessions. */ public class SessionTracker extends AbstractTracker<SessionEvent> { private final Recorder<Object> recorder = new Recorder<Object>(); private final Observer observer = new Observer() { @Override public void update(Observable o, Object arg) { if (!isEnabled()) { return; } if (o == TrackingPlugin.getDefault().getIdleDetector()) { IdleDetector dt = (IdleDetector) o; if (dt.isUserActive()) { PlatformUI.getWorkbench().getDisplay().syncExec(startRecorder); } else { recorder.stop(); } } else if (o == recorder) { Record<Object> r = recorder.getLastRecord(); long start = r.getStartTimeMillis(); long end = r.getEndTimeMillis(); addData(new SessionEvent(new Interval(start, end))); } } }; private final Runnable startRecorder = new Runnable() { @Override public void run() { // Check for active shell instead of active workbench window to include // dialogs (!shell.getMinimized() is also important, why?): IWorkbenchWindow win = WorkbenchUtil.getActiveWindow(); if (WorkbenchUtil.isActiveShell(win)) { recorder.start(); } } }; /** * Constructor. */ public SessionTracker() { recorder.addObserver(observer); } @Override protected IStorer<SessionEvent> createDataStorer() { return DataHandler.getStorer(SessionEvent.class); } @Override protected void doDisable() { TrackingPlugin.getDefault().getIdleDetector().deleteObserver(observer); recorder.stop(); } @Override protected void doEnable() { TrackingPlugin.getDefault().getIdleDetector().addObserver(observer); PlatformUI.getWorkbench().getDisplay().syncExec(startRecorder); } }