]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java
Continue framework clean up.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / NodeLogger.java
index 1264b2452d6a8ae06e0aa3d9592c9d949350d381..b9475446e5c50a3a04f25030f73ee84e8c9f0bc6 100644 (file)
  */
 package org.argeo.cms.internal.kernel;
 
+import java.security.SignatureException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -27,6 +29,8 @@ import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
@@ -34,12 +38,16 @@ import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
 import org.apache.log4j.spi.LoggingEvent;
 import org.argeo.ArgeoException;
-import org.argeo.ArgeoLogListener;
-import org.argeo.ArgeoLogger;
 import org.argeo.cms.auth.CurrentUser;
+import org.argeo.node.ArgeoLogListener;
+import org.argeo.node.ArgeoLogger;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
 
 /** Not meant to be used directly in standard log4j config */
-class NodeLogger implements ArgeoLogger {
+class NodeLogger implements ArgeoLogger, LogListener {
 
        private Boolean disabled = false;
 
@@ -73,6 +81,14 @@ class NodeLogger implements ArgeoLogger {
                }
        };
 
+       @SuppressWarnings("unchecked")
+       public NodeLogger(LogReaderService lrs) {
+               Enumeration<LogEntry> logEntries = lrs.getLog();
+               while (logEntries.hasMoreElements())
+                       logged(logEntries.nextElement());
+               lrs.addLogListener(this);
+       }
+
        public void init() {
                try {
                        events = new LinkedBlockingQueue<LogEvent>();
@@ -108,33 +124,54 @@ class NodeLogger implements ArgeoLogger {
        // this.layout = layout;
        // }
 
-       public synchronized void register(ArgeoLogListener listener,
-                       Integer numberOfPreviousEvents) {
+       //
+       // OSGi LOGGER
+       //
+       @Override
+       public void logged(LogEntry status) {
+               Log pluginLog = LogFactory.getLog(status.getBundle().getSymbolicName());
+               Integer severity = status.getLevel();
+               if (severity == LogService.LOG_ERROR) {
+                       // FIXME Fix Argeo TP
+                       if (status.getException() instanceof SignatureException)
+                               return;
+                       pluginLog.error(status.getMessage(), status.getException());
+               } else if (severity == LogService.LOG_WARNING)
+                       pluginLog.warn(status.getMessage(), status.getException());
+               else if (severity == LogService.LOG_INFO && pluginLog.isDebugEnabled())
+                       pluginLog.debug(
+                                       status.getMessage() + (status.getServiceReference() != null ?" "+ status.getServiceReference() : ""),
+                                       status.getException());
+               else if (severity == LogService.LOG_DEBUG && pluginLog.isTraceEnabled())
+                       pluginLog.trace(status.getMessage(), status.getException());
+       }
+
+       //
+       // ARGEO LOGGER
+       //
+
+       public synchronized void register(ArgeoLogListener listener, Integer numberOfPreviousEvents) {
                String username = CurrentUser.getUsername();
                if (username == null)
-                       throw new ArgeoException(
-                                       "Only authenticated users can register a log listener");
+                       throw new ArgeoException("Only authenticated users can register a log listener");
 
                if (!userListeners.containsKey(username)) {
-                       List<ArgeoLogListener> lst = Collections
-                                       .synchronizedList(new ArrayList<ArgeoLogListener>());
+                       List<ArgeoLogListener> lst = Collections.synchronizedList(new ArrayList<ArgeoLogListener>());
                        userListeners.put(username, lst);
                }
                userListeners.get(username).add(listener);
-               List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(username,
-                               numberOfPreviousEvents);
+               List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(username, numberOfPreviousEvents);
                for (LogEvent evt : lastEvents)
                        dispatchEvent(listener, evt);
        }
 
-       public synchronized void registerForAll(ArgeoLogListener listener,
-                       Integer numberOfPreviousEvents, boolean everything) {
+       public synchronized void registerForAll(ArgeoLogListener listener, Integer numberOfPreviousEvents,
+                       boolean everything) {
                if (everything)
                        everythingListeners.add(listener);
                else
                        allUsersListeners.add(listener);
-               List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(null,
-                               numberOfPreviousEvents);
+               List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(null, numberOfPreviousEvents);
                for (LogEvent evt : lastEvents)
                        if (everything || evt.getUsername() != null)
                                dispatchEvent(listener, evt);
@@ -145,11 +182,9 @@ class NodeLogger implements ArgeoLogger {
                if (username == null)// FIXME
                        return;
                if (!userListeners.containsKey(username))
-                       throw new ArgeoException("No user listeners " + listener
-                                       + " registered for user " + username);
+                       throw new ArgeoException("No user listeners " + listener + " registered for user " + username);
                if (!userListeners.get(username).contains(listener))
-                       throw new ArgeoException("No user listeners " + listener
-                                       + " registered for user " + username);
+                       throw new ArgeoException("No user listeners " + listener + " registered for user " + username);
                userListeners.get(username).remove(listener);
                if (userListeners.get(username).isEmpty())
                        userListeners.remove(username);
@@ -191,7 +226,9 @@ class NodeLogger implements ArgeoLogger {
                return configuration;
        }
 
-       /** Reloads configuration (if the configuration {@link Properties} is set) */
+       /**
+        * Reloads configuration (if the configuration {@link Properties} is set)
+        */
        protected void reloadConfiguration() {
                if (configuration != null) {
                        LogManager.resetConfiguration();
@@ -211,36 +248,29 @@ class NodeLogger implements ArgeoLogger {
                                try {
                                        log4jLevel = Level.toLevel(level);
                                } catch (Exception e) {
-                                       System.err
-                                                       .println("Log4j level could not be set for level '"
-                                                                       + level + "', resetting it to null.");
+                                       System.err.println("Log4j level could not be set for level '" + level + "', resetting it to null.");
                                        e.printStackTrace();
                                        level = null;
                                }
 
-                       if (log4jLevel != null
-                                       && !event.getLoggingEvent().getLevel()
-                                                       .isGreaterOrEqual(log4jLevel)) {
+                       if (log4jLevel != null && !event.getLoggingEvent().getLevel().isGreaterOrEqual(log4jLevel)) {
                                return;
                        }
                }
 
                try {
                        // admin listeners
-                       Iterator<ArgeoLogListener> everythingIt = everythingListeners
-                                       .iterator();
+                       Iterator<ArgeoLogListener> everythingIt = everythingListeners.iterator();
                        while (everythingIt.hasNext())
                                dispatchEvent(everythingIt.next(), event);
 
                        if (event.getUsername() != null) {
-                               Iterator<ArgeoLogListener> allUsersIt = allUsersListeners
-                                               .iterator();
+                               Iterator<ArgeoLogListener> allUsersIt = allUsersListeners.iterator();
                                while (allUsersIt.hasNext())
                                        dispatchEvent(allUsersIt.next(), event);
 
                                if (userListeners.containsKey(event.getUsername())) {
-                                       Iterator<ArgeoLogListener> userIt = userListeners.get(
-                                                       event.getUsername()).iterator();
+                                       Iterator<ArgeoLogListener> userIt = userListeners.get(event.getUsername()).iterator();
                                        while (userIt.hasNext())
                                                dispatchEvent(userIt.next(), event);
                                }
@@ -253,10 +283,8 @@ class NodeLogger implements ArgeoLogger {
 
        protected void dispatchEvent(ArgeoLogListener logListener, LogEvent evt) {
                LoggingEvent event = evt.getLoggingEvent();
-               logListener.appendLog(evt.getUsername(), event.getTimeStamp(), event
-                               .getLevel().toString(), event.getLoggerName(), event
-                               .getThreadName(), event.getMessage(), event
-                               .getThrowableStrRep());
+               logListener.appendLog(evt.getUsername(), event.getTimeStamp(), event.getLevel().toString(),
+                               event.getLoggerName(), event.getThreadName(), event.getMessage(), event.getThrowableStrRep());
        }
 
        private class AppenderImpl extends AppenderSkeleton {
@@ -308,11 +336,9 @@ class NodeLogger implements ArgeoLogger {
                        lastEvents.add(loggingEvent);
                }
 
-               public synchronized List<LogEvent> getLastEvents(String username,
-                               Integer maxCount) {
+               public synchronized List<LogEvent> getLastEvents(String username, Integer maxCount) {
                        LinkedList<LogEvent> evts = new LinkedList<LogEvent>();
-                       ListIterator<LogEvent> it = lastEvents.listIterator(lastEvents
-                                       .size());
+                       ListIterator<LogEvent> it = lastEvents.listIterator(lastEvents.size());
                        int count = 0;
                        while (it.hasPrevious() && (count < maxCount)) {
                                LogEvent evt = it.previous();