You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/04/07 15:16:30 UTC
svn commit: r1671836 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework: Felix.java
Logger.java
Author: cziegeler
Date: Tue Apr 7 13:16:30 2015
New Revision: 1671836
URL: http://svn.apache.org/r1671836
Log:
FELIX-4845 : Clean up Logger implementation
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/Logger.java
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=1671836&r1=1671835&r2=1671836&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Tue Apr 7 13:16:30 2015
@@ -849,10 +849,6 @@ public class Felix extends BundleImpl im
throw new RuntimeException("Unable to start system bundle.");
}
- // Now that the system bundle is successfully created we can give
- // its bundle context to the logger so that it can track log services.
- m_logger.setSystemBundleContext(_getBundleContext());
-
// We have to check with the security provider (if there is one).
// This is to avoid having bundles in the cache that have been tampered with
SecurityProvider sp = getFramework().getSecurityProvider();
@@ -4603,7 +4599,7 @@ public class Felix extends BundleImpl im
}
}
}
-
+
private void loadPrefixFromDefaultIfNotDefined(Map configMap, Properties defaultProperties, String prefix)
{
Map<String, String> defaultPropsWithPrefix = Util.getDefaultPropertiesWithPrefix(defaultProperties, prefix);
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Logger.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Logger.java?rev=1671836&r1=1671835&r2=1671836&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Logger.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Logger.java Tue Apr 7 13:16:30 2015
@@ -18,15 +18,8 @@
*/
package org.apache.felix.framework;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
/**
@@ -41,42 +34,14 @@ import org.osgi.framework.ServiceReferen
* 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>
- * <p>
- * This class also uses the System Bundle's context to track log services
- * and will use the highest ranking log service, if present, as a back end
- * instead of printing to standard out. The class uses reflection to invoking
- * the log service's method to avoid a dependency on the log interface.
- * </p>
**/
-public class Logger extends org.apache.felix.resolver.Logger implements ServiceListener
+public class Logger extends org.apache.felix.resolver.Logger
{
- // TODO see if this class can be cleaned up a little more
- private BundleContext m_context = null;
-
- private final static int LOGGER_OBJECT_IDX = 0;
- private final static int LOGGER_METHOD_IDX = 1;
- private ServiceReference m_logRef = null;
- private Object[] m_logger = null;
-
public Logger()
{
super(LOG_ERROR);
}
- protected void setSystemBundleContext(BundleContext context)
- {
- // TODO: Find a way to log to a log service inside the framework.
- // The issue is that we log messages while holding framework
- // internal locks -- hence, when a log service calls back into
- // the framework (e.g., by loading a class) we might deadlock.
- // One instance of this problem is tracked in FELIX-536.
- // For now we just disable logging to log services inside the
- // framework.
-
- // m_context = context;
- // startListeningForLogService();
- }
-
public final void log(ServiceReference sr, int level, String msg)
{
_log(null, sr, level, msg, null);
@@ -147,161 +112,10 @@ public class Logger extends org.apache.f
Bundle bundle, ServiceReference sr, int level,
String msg, Throwable throwable)
{
- // Save our own copy just in case it changes. We could try to do
- // more conservative locking here, but let's be optimistic.
- Object[] logger = m_logger;
-
if (getLogLevel() >= level)
{
- // Use the log service if available.
- if (logger != null)
- {
- _logReflectively(logger, sr, level, msg, throwable);
- }
- // Otherwise, default logging action.
- else
- {
- doLog(bundle, sr, level, msg, throwable);
- }
- }
- }
-
- private void _logReflectively(
- Object[] logger, ServiceReference sr, int level, String msg, Throwable throwable)
- {
- if (logger != null)
- {
- Object[] params = {
- sr, new Integer(level), msg, throwable
- };
- try
- {
- ((Method) logger[LOGGER_METHOD_IDX]).invoke(logger[LOGGER_OBJECT_IDX], params);
- }
- catch (InvocationTargetException ex)
- {
- System.err.println("Logger: " + ex);
- }
- catch (IllegalAccessException ex)
- {
- System.err.println("Logger: " + ex);
- }
- }
- }
-
- /**
- * This method is called when the system bundle context is set;
- * it simply adds a service listener so that the system bundle can track
- * log services to be used as the back end of the logging mechanism. It also
- * attempts to get an existing log service, if present, but in general
- * there will never be a log service present since the system bundle is
- * started before every other bundle.
- **/
- private synchronized void startListeningForLogService()
- {
- // Add a service listener for log services.
- try
- {
- m_context.addServiceListener(
- this, "(objectClass=org.osgi.service.log.LogService)");
- }
- catch (InvalidSyntaxException ex) {
- // This will never happen since the filter is hard coded.
- }
- // Try to get an existing log service.
- m_logRef = m_context.getServiceReference("org.osgi.service.log.LogService");
- // Get the service object if available and set it in the logger.
- if (m_logRef != null)
- {
- setLogger(m_context.getService(m_logRef));
- }
- }
-
- /**
- * This method implements the callback for the ServiceListener interface.
- * It is public as a byproduct of implementing the interface and should
- * not be called directly. This method tracks run-time changes to log
- * service availability. If the log service being used by the framework's
- * logging mechanism goes away, then this will try to find an alternative.
- * If a higher ranking log service is registered, then this will switch
- * to the higher ranking log service.
- **/
- public final synchronized void serviceChanged(ServiceEvent event)
- {
- // If no logger is in use, then grab this one.
- if ((event.getType() == ServiceEvent.REGISTERED) && (m_logRef == null))
- {
- m_logRef = event.getServiceReference();
- // Get the service object and set it in the logger.
- setLogger(m_context.getService(m_logRef));
- }
- // If a logger is in use, but this one has a higher ranking, then swap
- // it for the existing logger.
- else if ((event.getType() == ServiceEvent.REGISTERED) && (m_logRef != null))
- {
- ServiceReference ref =
- m_context.getServiceReference("org.osgi.service.log.LogService");
- if (!ref.equals(m_logRef))
- {
- m_context.ungetService(m_logRef);
- m_logRef = ref;
- setLogger(m_context.getService(m_logRef));
- }
-
- }
- // If the current logger is going away, release it and try to
- // find another one.
- else if ((event.getType() == ServiceEvent.UNREGISTERING) &&
- m_logRef.equals(event.getServiceReference()))
- {
- // Unget the service object.
- m_context.ungetService(m_logRef);
- // Try to get an existing log service.
- m_logRef = m_context.getServiceReference(
- "org.osgi.service.log.LogService");
- // Get the service object if available and set it in the logger.
- if (m_logRef != null)
- {
- setLogger(m_context.getService(m_logRef));
- }
- else
- {
- setLogger(null);
- }
- }
- }
-
- /**
- * This method sets the new log service object. It also caches the method to
- * invoke. The service object and method are stored in array to optimistically
- * eliminate the need to locking when logging.
- **/
- private void setLogger(Object logObj)
- {
- if (logObj == null)
- {
- m_logger = null;
- }
- else
- {
- Class[] formalParams = {
- ServiceReference.class,
- Integer.TYPE,
- String.class,
- Throwable.class
- };
-
- try
- {
- Method logMethod = logObj.getClass().getMethod("log", formalParams);
- logMethod.setAccessible(true);
- m_logger = new Object[] { logObj, logMethod };
- }
- catch (NoSuchMethodException ex)
- {
- System.err.println("Logger: " + ex);
- m_logger = null;
- }
+ // Default logging action.
+ doLog(bundle, sr, level, msg, throwable);
}
}
}