| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.framework; |
| |
| import java.lang.reflect.Method; |
| |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleException; |
| import org.osgi.framework.ServiceReference; |
| |
| /** |
| * <p> |
| * This class mimics the standard OSGi <tt>LogService</tt> interface. An |
| * instance of this class is used by the framework for all logging. By default |
| * this class logs messages to standard out. The log level can be set to |
| * control the amount of logging performed, where a higher number results in |
| * more logging. A log level of zero turns off logging completely. |
| * </p> |
| * <p> |
| * The log levels match those specified in the OSGi Log Service (i.e., 1 = error, |
| * 2 = warning, 3 = information, and 4 = debug). The default value is 1. |
| * </p> |
| **/ |
| public class Logger extends org.apache.felix.resolver.Logger |
| { |
| private Object[] m_logger; |
| |
| public Logger() |
| { |
| super(LOG_ERROR); |
| } |
| |
| public void setLogger(Object logger) |
| { |
| if (logger == null) |
| { |
| m_logger = null; |
| } |
| else |
| { |
| try |
| { |
| Method mth = logger.getClass().getMethod("log", |
| Integer.TYPE, String.class, Throwable.class); |
| mth.setAccessible(true); |
| m_logger = new Object[] { logger, mth }; |
| } |
| catch (NoSuchMethodException ex) |
| { |
| System.err.println("Logger: " + ex); |
| m_logger = null; |
| } |
| } |
| } |
| |
| public final void log(ServiceReference sr, int level, String msg) |
| { |
| _log(null, sr, level, msg, null); |
| } |
| |
| public final void log(ServiceReference sr, int level, String msg, Throwable throwable) |
| { |
| _log(null, sr, level, msg, throwable); |
| } |
| |
| public final void log(Bundle bundle, int level, String msg) |
| { |
| _log(bundle, null, level, msg, null); |
| } |
| |
| public final void log(Bundle bundle, int level, String msg, Throwable throwable) |
| { |
| _log(bundle, null, level, msg, throwable); |
| } |
| |
| protected void _log( |
| Bundle bundle, ServiceReference sr, int level, |
| String msg, Throwable throwable) |
| { |
| if (getLogLevel() >= level) |
| { |
| // Default logging action. |
| doLog(bundle, sr, level, msg, throwable); |
| } |
| } |
| |
| protected void doLog( |
| Bundle bundle, ServiceReference sr, int level, |
| String msg, Throwable throwable) |
| { |
| StringBuilder s = new StringBuilder(); |
| if (sr != null) |
| { |
| s.append("SvcRef ").append(sr).append(" ").append(msg); |
| } |
| else if (bundle != null) |
| { |
| s.append("Bundle ").append(bundle.toString()).append(" ").append(msg); |
| } |
| else |
| { |
| s.append(msg); |
| } |
| if (throwable != null) |
| { |
| s.append(" (").append(throwable).append(")"); |
| } |
| doLog(level, s.toString(), throwable); |
| } |
| |
| protected void doLog(int level, String msg, Throwable throwable) |
| { |
| if (m_logger != null) |
| { |
| doLogReflectively(level, msg, throwable); |
| } |
| else |
| { |
| doLogOut(level, msg, throwable); |
| } |
| } |
| |
| protected void doLogOut(int level, String s, Throwable throwable) |
| { |
| switch (level) |
| { |
| case LOG_DEBUG: |
| System.out.println("DEBUG: " + s); |
| break; |
| case LOG_ERROR: |
| System.out.println("ERROR: " + s); |
| if (throwable != null) |
| { |
| if ((throwable instanceof BundleException) && |
| (((BundleException) throwable).getNestedException() != null)) |
| { |
| throwable = ((BundleException) throwable).getNestedException(); |
| } |
| throwable.printStackTrace(); |
| } |
| break; |
| case LOG_INFO: |
| System.out.println("INFO: " + s); |
| break; |
| case LOG_WARNING: |
| System.out.println("WARNING: " + s); |
| break; |
| default: |
| System.out.println("UNKNOWN[" + level + "]: " + s); |
| } |
| } |
| |
| protected void doLogReflectively(int level, String msg, Throwable throwable) |
| { |
| try |
| { |
| ((Method) m_logger[1]).invoke( |
| m_logger[0], |
| level, |
| msg, |
| throwable |
| ); |
| } |
| catch (Exception ex) |
| { |
| System.err.println("Logger: " + ex); |
| } |
| } |
| } |