Package org.knopflerfish.bundle.log.window.impl

Source Code of org.knopflerfish.bundle.log.window.impl.LogReaderDispatcher

/*
* Copyright (c) 2003-2010, KNOPFLERFISH project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
*   copyright notice, this list of conditions and the following
*   disclaimer in the documentation and/or other materials
*   provided with the distribution.
*
* - Neither the name of the KNOPFLERFISH project nor the names of its
*   contributors may be used to endorse or promote products derived
*   from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.knopflerfish.bundle.log.window.impl;

import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.SwingUtilities;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogEntry;
import org.osgi.service.log.LogListener;
import org.osgi.service.log.LogReaderService;

/**
* Class that listens for all log entries and dispatches them to
* a LogTableModel.
*/
public class LogReaderDispatcher
  implements
    LogListener,
    ServiceListener
{

  BundleContext bc;
  LogTableModel model;

  public LogReaderDispatcher(BundleContext bc,
                             LogTableModel model) {
    this.bc    = bc;
    this.model = model;
  }

  public void open() {
    String filter = "(objectclass=" + LogReaderService.class.getName() + ")";

    try {
      ServiceReference [] srl = bc.getServiceReferences(null, filter);
      for(int i = 0; srl != null && i < srl.length; i++) {

        serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, srl[i]));
      }
      bc.addServiceListener(this, filter);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  Hashtable logReaders = new Hashtable();

  public void clearAll() {
    model.clear();
  }

  public void getAll() {
    for(Enumeration e = logReaders.keys(); e.hasMoreElements(); ) {
      ServiceReference sr = (ServiceReference)e.nextElement();
      LogReaderService lr = (LogReaderService)logReaders.get(sr);

      for(Enumeration e2 = lr.getLog(); e2.hasMoreElements(); ) {
        LogEntry entry = (LogEntry)e2.nextElement();
        logged(entry);
      }
    }
  }

  public void close() {
    bc.removeServiceListener(this);

    for(Enumeration e = logReaders.keys(); e.hasMoreElements(); ) {
      ServiceReference sr = (ServiceReference)e.nextElement();
      serviceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, sr));
    }
    logReaders.clear();
  }

  public void serviceChanged(ServiceEvent ev) {
    ServiceReference sr = ev.getServiceReference();


    LogReaderService lr =
      logReaders.containsKey(sr)
      ? (LogReaderService)logReaders.get(sr)
      : (LogReaderService)bc.getService(sr);

    if (null!=lr) {
      switch(ev.getType()) {
      case ServiceEvent.REGISTERED:
        lr.addLogListener(this);
        logReaders.put(sr, lr);
        break;
      case ServiceEvent.MODIFIED:
        break;
      case ServiceEvent.UNREGISTERING:
        lr.removeLogListener(this);
        logReaders.remove(sr);
        bc.ungetService(sr);
        break;
      }
    }
  }

  static long idCount = 0;

  /**
   * Listener method called for each LogEntry created.
   * As with all event listeners, this method should return to its
   * caller as soon
   * as possible.
   *
   * @param entry A <code>LogEntry</code> object containing log information.
   * @see LogEntry
   */
  public void logged(LogEntry entry) {
    final ExtLogEntry extEntry = new ExtLogEntry(entry, idCount++);
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          try {
            model.logged(extEntry);
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      });
  }
}
TOP

Related Classes of org.knopflerfish.bundle.log.window.impl.LogReaderDispatcher

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.