Package org.apache.felix.mosgi.jmx.remotelogger

Source Code of org.apache.felix.mosgi.jmx.remotelogger.Logger

/*
*   Copyright 2005 The Apache Software Foundation
*
*   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 org.apache.felix.mosgi.jmx.remotelogger;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.Constants;

import org.osgi.service.log.LogListener;
import org.osgi.service.log.LogReaderService;
import org.osgi.service.log.LogService;
import org.osgi.service.log.LogEntry;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.NotificationBroadcasterSupport;
import javax.management.AttributeChangeNotification;
import javax.management.MalformedObjectNameException;

import java.io.Serializable;
import java.util.Enumeration;
import java.util.Vector;

public class Logger extends NotificationBroadcasterSupport implements LogListener,BundleActivator,ServiceListener, LoggerMBean, Serializable{

  private static final String REMOTE_LOGGER_ON_STRING="OSGI:name=Remote Logger";
  private ServiceRegistration mbean_sr=null;

  private String version=null;
 
  private LogReaderService lrs=null;
  private BundleContext bc=null;

  private Object logMutex=new Object();

  private static final String[] LOG_LVL=new String[] {"","ERROR  ","WARNING ","INFO   ","DEBUG  "};
  private Integer logLvl=new Integer(4);

  private ObjectName remoteLoggerON=null;

  /////////////////////////////////
  //     LogerMBean Interface    //
  /////////////////////////////////
  public void sendOldLog(){
    System.out.println("[remoteLogger.Logger] send old log");
    Enumeration oldLog = this.lrs.getLog();
    Vector invert=new Vector();
    while(oldLog.hasMoreElements()) {
      LogEntry le=(LogEntry) (oldLog.nextElement());
      invert.insertElementAt(le,0);
    }
    for (int i=0 ; i<invert.size() ; i++) {
      logged( (LogEntry) invert.elementAt(i), true );
    }
  }

  public void setLogLvl(Integer lvl) {
    this.logLvl=lvl;
    String logLvlToString=(new String[] {"Error", "Warning", "Info", "Debug"})[lvl.intValue()-1];
    this.log(LogService.LOG_INFO, "Log level is now \""+logLvlToString+"\".");
    System.out.println("[Logger] : modification of log lvl : logLvl="+logLvl+" ("+logLvlToString+")");
  }

  public Integer getLogLvl() {
    return logLvl;
  }

  ///////////////////////////////////////
  //      ServiceListener Interface    //
  ///////////////////////////////////////
  public void serviceChanged(ServiceEvent serviceevent) {
    ServiceReference servicereference= serviceevent.getServiceReference();
    String as[]=(String[])servicereference.getProperty("objectClass");
    switch (serviceevent.getType()) {
      case ServiceEvent.REGISTERED :
        if (as[0].equals(LogReaderService.class.getName())){
          this.registerLogReaderService(servicereference);
        }
  break;
      case ServiceEvent.UNREGISTERING :
        if (as[0].equals(LogReaderService.class.getName())){
    this.unRegisterLogReaderService(servicereference);
        }
  break;
    }
  }

  /////////////////////////////////////////
  //      LogListener Interface          //
  /////////////////////////////////////////
  public void logged(LogEntry log){
    logged(log, false);
  }

  public void logged(LogEntry log, boolean oldLog){
    synchronized (logMutex){
      if (log.getLevel() <= logLvl.intValue() ) {
        String reg=new String("*");
        StringBuffer message=new StringBuffer();
        try{
          long id=log.getBundle().getBundleId();
    message.append( ((id<10)?" ":"")+id );
        } catch(NullPointerException e){
          message.append("Unknown source");
        }
    
        String lSymbolicName=log.getBundle().getSymbolicName();
        message.append( reg+ ((lSymbolicName!=null)?lSymbolicName:"\"null\"") );

        message.append(reg+log.getBundle().getState());

  message.append(reg+LOG_LVL[log.getLevel()]);
  
        // into log.getMessage() replaceAll regex char by an other
        String msg=log.getMessage();
        message.append( reg+ ((msg!=null)?msg.replace('*','X'):"\"null\"") );

        this.sendNotification(new  AttributeChangeNotification(this.remoteLoggerON, 0, (oldLog)?0:System.currentTimeMillis(), message.toString(), null, "Log", null, null));
      }
    }
  }

  //////////////////////////////////
  //  BundleActivator Interface   //
  //////////////////////////////////
  public void start(BundleContext bc) throws Exception{
    this.version=(String)bc.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
    this.bc=bc;
    this.log(LogService.LOG_INFO, "Remote Logger starting "+version);

    java.util.Properties p = new java.util.Properties();
    try {
      this.remoteLoggerON = new ObjectName(Logger.REMOTE_LOGGER_ON_STRING);
    } catch (MalformedObjectNameException mne) {
      throw new BundleException("Logger.Logger:objectName invalid", mne);
    }
    p.put(org.apache.felix.mosgi.jmx.agent.Constants.OBJECTNAME, REMOTE_LOGGER_ON_STRING);
    this.mbean_sr = this.bc.registerService(LoggerMBean.class.getName(), this, p);

    try{
      bc.addServiceListener(this,"(|(objectClass="+LogReaderService.class.getName()+")"+
                                   "(objectClass="+MBeanServer.class.getName()+"))");
    }catch(InvalidSyntaxException e){
      throw new BundleException("Logger.Logger:filtre LDAP", e);
    }
    ServiceReference sr=bc.getServiceReference(LogReaderService.class.getName());
    if (sr!=null){
      this.registerLogReaderService(sr);
    }

    this.log(LogService.LOG_INFO, "Remote Logger started (logLvl="+logLvl+")"+version);
  }
    
  public void stop(BundleContext bc) throws Exception{
    this.log(LogService.LOG_INFO, "Stopping remote Logger "+version);
    if (this.lrs==null){
       System.out.println("ERROR : Logger.stop : there is no logger or reader to stop");
    } else {
      this.lrs.removeLogListener(this);
      this.bc.removeServiceListener(this);
    }
    this.lrs=null;
    this.log(LogService.LOG_INFO, "Remote Logger stopped"+version);
    this.mbean_sr.unregister();
    this.mbean_sr=null;
    this.bc=null;
  }

  //////////////////////////////
  //     private methods      //
  //////////////////////////////
  private void registerLogReaderService(ServiceReference sr) {
    //System.out.println("mosgi.jmx.remoteLogger.Logger.registerLogReaderService("+sr.toString()+") : oldLog=");
    this.lrs=(LogReaderService)this.bc.getService(sr);
    this.lrs.addLogListener(this);
  }
 
  private void unRegisterLogReaderService(ServiceReference sr) {
    if (sr!=null){
      this.lrs.removeLogListener(this);
      this.lrs=null;
    }
  }

  private void log (int level, String message){
    ServiceReference lsn=bc.getServiceReference(LogService.class.getName());
    if (lsn!=null){
      LogService ls=(LogService)bc.getService(lsn);
      ls.log(level, message);
    }else{
      System.out.println("ERROR : Logger.start : No service "+LogService.class.getName()+" is present");
    }
  }

TOP

Related Classes of org.apache.felix.mosgi.jmx.remotelogger.Logger

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.