Package rabbit.tracking.internal

Source Code of rabbit.tracking.internal.TrackingPlugin

/*
* 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;

import rabbit.tracking.ITracker;

import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableSet;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchListener;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

import java.util.concurrent.TimeUnit;

/**
* The activator class controls the plug-in life cycle
*/
public class TrackingPlugin extends AbstractUIPlugin implements
    IWorkbenchListener {

  // The plug-in ID
  public static final String PLUGIN_ID = "rabbit.tracking";

  /** ID of the tracker extension point. */
  public static final String TRACKER_EXTENSION_ID = "rabbit.tracking.trackers";

  // The shared instance
  private static TrackingPlugin plugin;

  /**
   * Returns the shared instance
   *
   * @return the shared instance
   */
  public static TrackingPlugin getDefault() {
    return plugin;
  }

  private IdleDetector idleDetector;

  /** An set of trackers. */
  private ImmutableSet<ITracker<?>> trackers;

  /**
   * The constructor
   */
  public TrackingPlugin() {
    long oneSec = TimeUnit.SECONDS.toMillis(1);
    long oneMin = TimeUnit.MINUTES.toMillis(1);
    idleDetector = new IdleDetector(getWorkbench().getDisplay(), oneMin, oneSec);
    trackers = ImmutableSet.of();
  }

  /**
   * Gets the global idleness detector in use. Clients may attach themselves as
   * observers to the detector but must not change the detector's state (like
   * calling {@link IdleDetector#setRunning(boolean)}).
   *
   * @return The idleness detector.
   */
  public IdleDetector getIdleDetector() {
    return idleDetector;
  }

  @Override
  public void postShutdown(IWorkbench workbench) {
    // Everything should be done before the workbench is shut down, use
    // preShutdown method instead
  }

  @Override
  public boolean preShutdown(IWorkbench workbench, boolean forced) {
    for (ITracker<?> tracker : trackers) {
      tracker.setEnabled(false);
    }
    return true;
  }

  /**
   * Call this method to saves all current data collected by the trackers now.
   * All data will be saved and flushed from the trackers.
   */
  public void saveCurrentData() {
    for (ITracker<?> tracker : trackers) {
      tracker.setEnabled(false);
      tracker.flushData();
      tracker.setEnabled(true);
    }
  }

  @Override
  public void start(BundleContext context) throws Exception {
    super.start(context);
    plugin = this;

    if (trackers != null)
      setEnableTrackers(trackers, false);

    getWorkbench().addWorkbenchListener(this);
    trackers = createTrackers();
    setEnableTrackers(trackers, true);

    idleDetector.setRunning(true);
  }

  @Override
  public void stop(BundleContext context) throws Exception {
    idleDetector.setRunning(false);
    getWorkbench().removeWorkbenchListener(this);
    setEnableTrackers(trackers, false);

    plugin = null;
    super.stop(context);
  }

  /**
   * Creates trackers from the extension point.
   *
   * @return A list of tracker objects.
   */
  private ImmutableSet<ITracker<?>> createTrackers() {

    IConfigurationElement[] elements = Platform.getExtensionRegistry()
        .getConfigurationElementsFor(TRACKER_EXTENSION_ID);

    final ImmutableSet.Builder<ITracker<?>> builder = ImmutableSet.builder();
    for (final IConfigurationElement e : elements) {

      SafeRunner.run(new ISafeRunnable() {
        @Override
        public void handleException(Throwable e) {
          getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e));
          e.printStackTrace();
        }

        @Override
        public void run() throws Exception {
          Object o = e.createExecutableExtension("class");
          if (o instanceof ITracker<?>) {
            builder.add((ITracker<?>) o);
          } else {
            System.err.println("Object is not a tracker: " + o);
          }
        }

      });
    }
    return builder.build();
  }

  /**
   * Enables or disables the trackers.
   *
   * @param trackers The trackers to perform actions on.
   * @param enable True to enable, false to disable.
   */
  private void setEnableTrackers(ImmutableCollection<ITracker<?>> trackers,
      boolean enable) {
    for (ITracker<?> tracker : trackers) {
      tracker.setEnabled(enable);
    }
  }
}
TOP

Related Classes of rabbit.tracking.internal.TrackingPlugin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.