blob: c5db1282741652e0cd442957bcee31b2b1478386 [file] [log] [blame]
/*
* 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.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
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;
public class Logger extends NotificationBroadcasterSupport implements LogListener,BundleActivator,ServiceListener, LoggerMBean, Serializable{
private static final String REMOTE_LOGGER_ON_STRING="OSGI:name=Remote Logger";
private String version=null;
private LogReaderService lrs=null;
private BundleContext bc=null;
private Object logMutex=new Object();
private boolean debugLogFlag=true;
private boolean errorLogFlag=true;
private boolean infoLogFlag=true;
private boolean warningLogFlag=true;
private MBeanServer agent=null;
private ObjectName remoteLoggerON=null;
//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);
}else if (as[0].equals(MBeanServer.class.getName())){
this.registerToAgent(servicereference);
}
break;
case ServiceEvent.UNREGISTERING :
if (as[0].equals(LogReaderService.class.getName())){
this.unRegisterLogReaderService(servicereference);
}else if (as[0].equals(MBeanServer.class.getName())){
this.unRegisterFromAgent();
}
break;
}
}
//LogListener Interface
public void logged(LogEntry log){
StringBuffer message=new StringBuffer();
synchronized (logMutex){
int lLevel=log.getLevel();
if(debugLogFlag && lLevel==LogService.LOG_DEBUG){
message.append("DEBUG : ");
}else if (errorLogFlag && lLevel==LogService.LOG_ERROR){
message.append("ERROR : ");
}else if(infoLogFlag && lLevel==LogService.LOG_INFO){
message.append("INFO : ");
}else if(warningLogFlag && lLevel==LogService.LOG_WARNING){
message.append("WARNING : ");
}else {
message.append("NO LEVEL : ");
}
try{
message.append(log.getBundle().getBundleId()+" : ");
}catch(NullPointerException e){
message.append("Unknown source");
}
message.append(log.getMessage());
}
System.out.println(message.toString());
if (this.agent!=null){
this.sendNotification(new AttributeChangeNotification(this.remoteLoggerON, 0, 0,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);
try{
this.remoteLoggerON=new ObjectName(Logger.REMOTE_LOGGER_ON_STRING);
}catch(MalformedObjectNameException e){
throw new BundleException("Logger.Logger:objectName invalid", e);
}
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);
}
ServiceReference sr2=bc.getServiceReference(MBeanServer.class.getName());
if (sr2!=null){
this.registerToAgent(sr2);
}
this.log(LogService.LOG_INFO, "Remote Logger started "+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);
}
if (this.agent!=null){
this.unRegisterFromAgent();
}
this.agent=null;
this.lrs=null;
this.log(LogService.LOG_INFO, "Remote Logger stopped"+version);
this.bc=null;
}
//private methods
private void registerLogReaderService(ServiceReference sr) {
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 registerToAgent(ServiceReference sr){
this.agent=(MBeanServer)bc.getService(sr);
try{
this.agent.registerMBean(this, this.remoteLoggerON);
}catch(Exception e){
e.printStackTrace();
}
}
private void unRegisterFromAgent(){
try{
this.agent.unregisterMBean(this.remoteLoggerON);
}catch(Exception e){
//e.printStackTrace();
}
}
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(LogService.LOG_INFO, message);
}else{
System.out.println("ERROR : Logger.start : No service "+LogService.class.getName()+" is present");
}
}
}