Massive package refactoring
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / osgi / CmsOsgiLogger.java
index 2936df28a52af1c9c0091ad058dd065bef3a51e0..85f045bae660b6783d2aa4448e7fdce59af327e1 100644 (file)
@@ -1,32 +1,11 @@
 package org.argeo.cms.internal.osgi;
 
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.StandardWatchEventKinds;
-import java.nio.file.WatchEvent;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchService;
 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;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
 
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsLog;
-import org.argeo.cms.ArgeoLogListener;
-import org.argeo.cms.ArgeoLogger;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.util.directory.DirectoryConf;
+import org.argeo.cms.runtime.DirectoryConf;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -36,51 +15,49 @@ import org.osgi.service.log.LogLevel;
 import org.osgi.service.log.LogListener;
 import org.osgi.service.log.LogReaderService;
 
-/** Not meant to be used directly in standard log4j config */
-public class CmsOsgiLogger implements ArgeoLogger, LogListener {
+/** Logs OSGi events. */
+public class CmsOsgiLogger implements LogListener {
        private final static String WHITEBOARD_PATTERN_PROP = "osgi.http.whiteboard.servlet.pattern";
        private final static String CONTEXT_NAME_PROP = "contextName";
+       
+       private LogReaderService logReaderService;
 
-       /** Internal debug for development purposes. */
-       private static Boolean debug = false;
+//     /** Internal debug for development purposes. */
+//     private static Boolean debug = false;
 
-       private Boolean disabled = false;
-
-       private String level = null;
+//     private Boolean disabled = false;
+//
+//     private String level = null;
 
 //     private Level log4jLevel = null;
 
-       private Properties configuration;
-
-       private AppenderImpl appender;
+//     private Properties configuration;
 
-       private final List<ArgeoLogListener> everythingListeners = Collections
-                       .synchronizedList(new ArrayList<ArgeoLogListener>());
-       private final List<ArgeoLogListener> allUsersListeners = Collections
-                       .synchronizedList(new ArrayList<ArgeoLogListener>());
-       private final Map<String, List<ArgeoLogListener>> userListeners = Collections
-                       .synchronizedMap(new HashMap<String, List<ArgeoLogListener>>());
+//     private AppenderImpl appender;
 
-       private BlockingQueue<LogEvent> events;
-       private LogDispatcherThread logDispatcherThread = new LogDispatcherThread();
+//     private BlockingQueue<LogEvent> events;
+//     private LogDispatcherThread logDispatcherThread = new LogDispatcherThread();
 
-       private Integer maxLastEventsCount = 10 * 1000;
-
-       /** Marker to prevent stack overflow */
-       private ThreadLocal<Boolean> dispatching = new ThreadLocal<Boolean>() {
+//     private Integer maxLastEventsCount = 10 * 1000;
+//
+//     /** Marker to prevent stack overflow */
+//     private ThreadLocal<Boolean> dispatching = new ThreadLocal<Boolean>() {
+//
+//             @Override
+//             protected Boolean initialValue() {
+//                     return false;
+//             }
+//     };
 
-               @Override
-               protected Boolean initialValue() {
-                       return false;
-               }
-       };
+//     public CmsOsgiLogger(LogReaderService lrs) {
+//     }
 
-       public CmsOsgiLogger(LogReaderService lrs) {
-               if (lrs != null) {
-                       Enumeration<LogEntry> logEntries = lrs.getLog();
+       public void start() {
+               if (logReaderService != null) {
+                       Enumeration<LogEntry> logEntries = logReaderService.getLog();
                        while (logEntries.hasMoreElements())
                                logged(logEntries.nextElement());
-                       lrs.addLogListener(this);
+                       logReaderService.addLogListener(this);
 
                        // configure log4j watcher
 //                     String log4jConfiguration = KernelUtils.getFrameworkProp("log4j.configuration");
@@ -104,43 +81,31 @@ public class CmsOsgiLogger implements ArgeoLogger, LogListener {
 //                             }
 //                     }
                }
+//             try {
+////                   events = new LinkedBlockingQueue<LogEvent>();
+////
+////                   // if (layout != null)
+////                   // setLayout(layout);
+////                   // else
+////                   // setLayout(new PatternLayout(pattern));
+//////                 appender = new AppenderImpl();
+////                   reloadConfiguration();
+//////                 Logger.getRootLogger().addAppender(appender);
+////
+////                   logDispatcherThread = new LogDispatcherThread();
+////                   logDispatcherThread.start();
+//             } catch (Exception e) {
+//                     throw new IllegalStateException("Cannot initialize log4j");
+//             }
        }
 
-       public void init() {
-               try {
-                       events = new LinkedBlockingQueue<LogEvent>();
-
-                       // if (layout != null)
-                       // setLayout(layout);
-                       // else
-                       // setLayout(new PatternLayout(pattern));
-                       appender = new AppenderImpl();
-                       reloadConfiguration();
-//                     Logger.getRootLogger().addAppender(appender);
-
-                       logDispatcherThread = new LogDispatcherThread();
-                       logDispatcherThread.start();
-               } catch (Exception e) {
-                       throw new IllegalStateException("Cannot initialize log4j");
-               }
-       }
-
-       public void destroy() throws Exception {
-//             Logger.getRootLogger().removeAppender(appender);
-               allUsersListeners.clear();
-               for (List<ArgeoLogListener> lst : userListeners.values())
-                       lst.clear();
-               userListeners.clear();
-
-               events.clear();
-               events = null;
-               logDispatcherThread.interrupt();
+       public void stop() throws Exception {
+//             events.clear();
+//             events = null;
+//             logDispatcherThread.interrupt();
+               logReaderService.removeLogListener(this);
        }
 
-       // public void setLayout(Layout layout) {
-       // this.layout = layout;
-       // }
-
        public String toString() {
                return "Node Logger";
        }
@@ -247,295 +212,300 @@ public class CmsOsgiLogger implements ArgeoLogger, LogListener {
                return false;
        }
 
+       public void setLogReaderService(LogReaderService logReaderService) {
+               this.logReaderService = logReaderService;
+       }
+
+       
        //
        // ARGEO LOGGER
        //
 
-       public synchronized void register(ArgeoLogListener listener, Integer numberOfPreviousEvents) {
-               String username = CurrentUser.getUsername();
-               if (username == null)
-                       throw new IllegalStateException("Only authenticated users can register a log listener");
-
-               if (!userListeners.containsKey(username)) {
-                       List<ArgeoLogListener> lst = Collections.synchronizedList(new ArrayList<ArgeoLogListener>());
-                       userListeners.put(username, lst);
-               }
-               userListeners.get(username).add(listener);
-               List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(username, numberOfPreviousEvents);
-               for (LogEvent evt : lastEvents)
-                       dispatchEvent(listener, evt);
-       }
-
-       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);
-               for (LogEvent evt : lastEvents)
-                       if (everything || evt.getUsername() != null)
-                               dispatchEvent(listener, evt);
-       }
-
-       public synchronized void unregister(ArgeoLogListener listener) {
-               String username = CurrentUser.getUsername();
-               if (username == null)// FIXME
-                       return;
-               if (!userListeners.containsKey(username))
-                       throw new IllegalStateException("No user listeners " + listener + " registered for user " + username);
-               if (!userListeners.get(username).contains(listener))
-                       throw new IllegalStateException("No user listeners " + listener + " registered for user " + username);
-               userListeners.get(username).remove(listener);
-               if (userListeners.get(username).isEmpty())
-                       userListeners.remove(username);
-
-       }
-
-       public synchronized void unregisterForAll(ArgeoLogListener listener) {
-               everythingListeners.remove(listener);
-               allUsersListeners.remove(listener);
-       }
-
-       /** For development purpose, since using regular logging is not easy here */
-       private static void stdOut(Object obj) {
-               System.out.println(obj);
-       }
-
-       private static void stdErr(Object obj) {
-               System.err.println(obj);
-       }
-
-       private static void debug(Object obj) {
-               if (debug)
-                       System.out.println(obj);
-       }
-
-       private static boolean isInternalDebugEnabled() {
-               return debug;
-       }
+//     public synchronized void register(ArgeoLogListener listener, Integer numberOfPreviousEvents) {
+//             String username = CurrentUser.getUsername();
+//             if (username == null)
+//                     throw new IllegalStateException("Only authenticated users can register a log listener");
+//
+//             if (!userListeners.containsKey(username)) {
+//                     List<ArgeoLogListener> lst = Collections.synchronizedList(new ArrayList<ArgeoLogListener>());
+//                     userListeners.put(username, lst);
+//             }
+//             userListeners.get(username).add(listener);
+//             List<LogEvent> lastEvents = logDispatcherThread.getLastEvents(username, numberOfPreviousEvents);
+//             for (LogEvent evt : lastEvents)
+//                     dispatchEvent(listener, evt);
+//     }
+//
+//     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);
+//             for (LogEvent evt : lastEvents)
+//                     if (everything || evt.getUsername() != null)
+//                             dispatchEvent(listener, evt);
+//     }
+//
+//     public synchronized void unregister(ArgeoLogListener listener) {
+//             String username = CurrentUser.getUsername();
+//             if (username == null)// FIXME
+//                     return;
+//             if (!userListeners.containsKey(username))
+//                     throw new IllegalStateException("No user listeners " + listener + " registered for user " + username);
+//             if (!userListeners.get(username).contains(listener))
+//                     throw new IllegalStateException("No user listeners " + listener + " registered for user " + username);
+//             userListeners.get(username).remove(listener);
+//             if (userListeners.get(username).isEmpty())
+//                     userListeners.remove(username);
+//
+//     }
+//
+//     public synchronized void unregisterForAll(ArgeoLogListener listener) {
+//             everythingListeners.remove(listener);
+//             allUsersListeners.remove(listener);
+//     }
+
+//     /** For development purpose, since using regular logging is not easy here */
+//     private static void stdOut(Object obj) {
+//             System.out.println(obj);
+//     }
+//
+//     private static void stdErr(Object obj) {
+//             System.err.println(obj);
+//     }
+//
+//     private static void debug(Object obj) {
+//             if (debug)
+//                     System.out.println(obj);
+//     }
+//
+//     private static boolean isInternalDebugEnabled() {
+//             return debug;
+//     }
 
        // public void setPattern(String pattern) {
        // this.pattern = pattern;
        // }
 
-       public void setDisabled(Boolean disabled) {
-               this.disabled = disabled;
-       }
-
-       public void setLevel(String level) {
-               this.level = level;
-       }
-
-       public void setConfiguration(Properties configuration) {
-               this.configuration = configuration;
-       }
-
-       public void updateConfiguration(Properties configuration) {
-               setConfiguration(configuration);
-               reloadConfiguration();
-       }
-
-       public Properties getConfiguration() {
-               return configuration;
-       }
-
-       /**
-        * Reloads configuration (if the configuration {@link Properties} is set)
-        */
-       protected void reloadConfiguration() {
-               if (configuration != null) {
-//                     LogManager.resetConfiguration();
-//                     PropertyConfigurator.configure(configuration);
-               }
-       }
-
-       protected synchronized void processLoggingEvent(LogEvent event) {
-               if (disabled)
-                       return;
-
-               if (dispatching.get())
-                       return;
-
-               if (level != null && !level.trim().equals("")) {
-//                     if (log4jLevel == null || !log4jLevel.toString().equals(level))
-//                             try {
-//                                     log4jLevel = Level.toLevel(level);
-//                             } catch (Exception e) {
-//                                     System.err.println("Log4j level could not be set for level '" + level + "', resetting it to null.");
-//                                     e.printStackTrace();
-//                                     level = null;
-//                             }
+//     public void setDisabled(Boolean disabled) {
+//             this.disabled = disabled;
+//     }
 //
-//                     if (log4jLevel != null && !event.getLoggingEvent().getLevel().isGreaterOrEqual(log4jLevel)) {
-//                             return;
-//                     }
-               }
-
-               try {
-                       // admin listeners
-                       Iterator<ArgeoLogListener> everythingIt = everythingListeners.iterator();
-                       while (everythingIt.hasNext())
-                               dispatchEvent(everythingIt.next(), event);
-
-                       if (event.getUsername() != null) {
-                               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();
-                                       while (userIt.hasNext())
-                                               dispatchEvent(userIt.next(), event);
-                               }
-                       }
-               } catch (Exception e) {
-                       stdOut("Cannot process logging event");
-                       e.printStackTrace();
-               }
-       }
-
-       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());
-       }
+//     public void setLevel(String level) {
+//             this.level = level;
+//     }
 
-       private class AppenderImpl { // extends AppenderSkeleton {
-               public boolean requiresLayout() {
-                       return false;
-               }
+//     public void setConfiguration(Properties configuration) {
+//             this.configuration = configuration;
+//     }
+//
+//     public void updateConfiguration(Properties configuration) {
+//             setConfiguration(configuration);
+//             reloadConfiguration();
+//     }
+//
+//     public Properties getConfiguration() {
+//             return configuration;
+//     }
+//
+//     /**
+//      * Reloads configuration (if the configuration {@link Properties} is set)
+//      */
+//     protected void reloadConfiguration() {
+//             if (configuration != null) {
+////                   LogManager.resetConfiguration();
+////                   PropertyConfigurator.configure(configuration);
+//             }
+//     }
 
-               public void close() {
-               }
+//     protected synchronized void processLoggingEvent(LogEvent event) {
+//             if (disabled)
+//                     return;
+//
+//             if (dispatching.get())
+//                     return;
+//
+//             if (level != null && !level.trim().equals("")) {
+////                   if (log4jLevel == null || !log4jLevel.toString().equals(level))
+////                           try {
+////                                   log4jLevel = Level.toLevel(level);
+////                           } catch (Exception e) {
+////                                   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)) {
+////                           return;
+////                   }
+//             }
+//
+////           try {
+////                   // admin listeners
+////                   Iterator<ArgeoLogListener> everythingIt = everythingListeners.iterator();
+////                   while (everythingIt.hasNext())
+////                           dispatchEvent(everythingIt.next(), event);
+////
+////                   if (event.getUsername() != null) {
+////                           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();
+////                                   while (userIt.hasNext())
+////                                           dispatchEvent(userIt.next(), event);
+////                           }
+////                   }
+////           } catch (Exception e) {
+////                   stdOut("Cannot process logging event");
+////                   e.printStackTrace();
+////           }
+//     }
+
+//     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());
+//     }
+
+//     private class AppenderImpl { // extends AppenderSkeleton {
+//             public boolean requiresLayout() {
+//                     return false;
+//             }
+//
+//             public void close() {
+//             }
+//
+////           @Override
+////           protected void append(LoggingEvent event) {
+////                   if (events != null) {
+////                           try {
+////                                   String username = CurrentUser.getUsername();
+////                                   events.put(new LogEvent(username, event));
+////                           } catch (InterruptedException e) {
+////                                   // silent
+////                           }
+////                   }
+////           }
+//
+//     }
 
-//             @Override
-//             protected void append(LoggingEvent event) {
-//                     if (events != null) {
+//     private class LogDispatcherThread extends Thread {
+//             /** encapsulated in order to simplify concurrency management */
+//             private LinkedList<LogEvent> lastEvents = new LinkedList<LogEvent>();
+//
+//             public LogDispatcherThread() {
+//                     super("Argeo Logging Dispatcher Thread");
+//             }
+//
+//             public void run() {
+//                     while (events != null) {
 //                             try {
-//                                     String username = CurrentUser.getUsername();
-//                                     events.put(new LogEvent(username, event));
+//                                     LogEvent loggingEvent = events.take();
+//                                     processLoggingEvent(loggingEvent);
+//                                     addLastEvent(loggingEvent);
 //                             } catch (InterruptedException e) {
-//                                     // silent
+//                                     if (events == null)
+//                                             return;
 //                             }
 //                     }
 //             }
+//
+//             protected synchronized void addLastEvent(LogEvent loggingEvent) {
+//                     if (lastEvents.size() >= maxLastEventsCount)
+//                             lastEvents.poll();
+//                     lastEvents.add(loggingEvent);
+//             }
+//
+//             public synchronized List<LogEvent> getLastEvents(String username, Integer maxCount) {
+//                     LinkedList<LogEvent> evts = new LinkedList<LogEvent>();
+//                     ListIterator<LogEvent> it = lastEvents.listIterator(lastEvents.size());
+//                     int count = 0;
+//                     while (it.hasPrevious() && (count < maxCount)) {
+//                             LogEvent evt = it.previous();
+//                             if (username == null || username.equals(evt.getUsername())) {
+//                                     evts.push(evt);
+//                                     count++;
+//                             }
+//                     }
+//                     return evts;
+//             }
+//     }
 
-       }
-
-       private class LogDispatcherThread extends Thread {
-               /** encapsulated in order to simplify concurrency management */
-               private LinkedList<LogEvent> lastEvents = new LinkedList<LogEvent>();
-
-               public LogDispatcherThread() {
-                       super("Argeo Logging Dispatcher Thread");
-               }
-
-               public void run() {
-                       while (events != null) {
-                               try {
-                                       LogEvent loggingEvent = events.take();
-                                       processLoggingEvent(loggingEvent);
-                                       addLastEvent(loggingEvent);
-                               } catch (InterruptedException e) {
-                                       if (events == null)
-                                               return;
-                               }
-                       }
-               }
-
-               protected synchronized void addLastEvent(LogEvent loggingEvent) {
-                       if (lastEvents.size() >= maxLastEventsCount)
-                               lastEvents.poll();
-                       lastEvents.add(loggingEvent);
-               }
-
-               public synchronized List<LogEvent> getLastEvents(String username, Integer maxCount) {
-                       LinkedList<LogEvent> evts = new LinkedList<LogEvent>();
-                       ListIterator<LogEvent> it = lastEvents.listIterator(lastEvents.size());
-                       int count = 0;
-                       while (it.hasPrevious() && (count < maxCount)) {
-                               LogEvent evt = it.previous();
-                               if (username == null || username.equals(evt.getUsername())) {
-                                       evts.push(evt);
-                                       count++;
-                               }
-                       }
-                       return evts;
-               }
-       }
-
-       private class LogEvent {
-               private final String username;
-//             private final LoggingEvent loggingEvent;
-
-               public LogEvent(String username) {
-                       super();
-                       this.username = username;
-//                     this.loggingEvent = loggingEvent;
-               }
-
-//             @Override
-//             public int hashCode() {
-//                     return loggingEvent.hashCode();
+//     private class LogEvent {
+//             private final String username;
+////           private final LoggingEvent loggingEvent;
+//
+//             public LogEvent(String username) {
+//                     super();
+//                     this.username = username;
+////                   this.loggingEvent = loggingEvent;
 //             }
 //
-//             @Override
-//             public boolean equals(Object obj) {
-//                     return loggingEvent.equals(obj);
+////           @Override
+////           public int hashCode() {
+////                   return loggingEvent.hashCode();
+////           }
+////
+////           @Override
+////           public boolean equals(Object obj) {
+////                   return loggingEvent.equals(obj);
+////           }
+////
+////           @Override
+////           public String toString() {
+////                   return username + "@ " + loggingEvent.toString();
+////           }
+//
+//             public String getUsername() {
+//                     return username;
 //             }
 //
-//             @Override
-//             public String toString() {
-//                     return username + "@ " + loggingEvent.toString();
+////           public LoggingEvent getLoggingEvent() {
+////                   return loggingEvent;
+////           }
+//
+//     }
+//
+//     private class Log4jConfWatcherThread extends Thread {
+//             private Path log4jConfigurationPath;
+//
+//             public Log4jConfWatcherThread(Path log4jConfigurationPath) {
+//                     super("Log4j Configuration Watcher");
+//                     try {
+//                             this.log4jConfigurationPath = log4jConfigurationPath.toRealPath();
+//                     } catch (IOException e) {
+//                             this.log4jConfigurationPath = log4jConfigurationPath.toAbsolutePath();
+//                             stdOut("Cannot determine real path for " + log4jConfigurationPath + ": " + e.getMessage());
+//                     }
 //             }
-
-               public String getUsername() {
-                       return username;
-               }
-
-//             public LoggingEvent getLoggingEvent() {
-//                     return loggingEvent;
+//
+//             public void run() {
+//                     Path parentDir = log4jConfigurationPath.getParent();
+//                     try (final WatchService watchService = FileSystems.getDefault().newWatchService()) {
+//                             parentDir.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
+//                             WatchKey wk;
+//                             watching: while ((wk = watchService.take()) != null) {
+//                                     for (WatchEvent<?> event : wk.pollEvents()) {
+//                                             final Path changed = (Path) event.context();
+//                                             if (log4jConfigurationPath.equals(parentDir.resolve(changed))) {
+//                                                     if (isInternalDebugEnabled())
+//                                                             debug(log4jConfigurationPath + " has changed, reloading.");
+////                                                   PropertyConfigurator.configure(log4jConfigurationPath.toUri().toURL());
+//                                             }
+//                                     }
+//                                     // reset the key
+//                                     boolean valid = wk.reset();
+//                                     if (!valid) {
+//                                             break watching;
+//                                     }
+//                             }
+//                     } catch (IOException | InterruptedException e) {
+//                             stdErr("Log4j configuration watcher failed: " + e.getMessage());
+//                     }
 //             }
-
-       }
-
-       private class Log4jConfWatcherThread extends Thread {
-               private Path log4jConfigurationPath;
-
-               public Log4jConfWatcherThread(Path log4jConfigurationPath) {
-                       super("Log4j Configuration Watcher");
-                       try {
-                               this.log4jConfigurationPath = log4jConfigurationPath.toRealPath();
-                       } catch (IOException e) {
-                               this.log4jConfigurationPath = log4jConfigurationPath.toAbsolutePath();
-                               stdOut("Cannot determine real path for " + log4jConfigurationPath + ": " + e.getMessage());
-                       }
-               }
-
-               public void run() {
-                       Path parentDir = log4jConfigurationPath.getParent();
-                       try (final WatchService watchService = FileSystems.getDefault().newWatchService()) {
-                               parentDir.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
-                               WatchKey wk;
-                               watching: while ((wk = watchService.take()) != null) {
-                                       for (WatchEvent<?> event : wk.pollEvents()) {
-                                               final Path changed = (Path) event.context();
-                                               if (log4jConfigurationPath.equals(parentDir.resolve(changed))) {
-                                                       if (isInternalDebugEnabled())
-                                                               debug(log4jConfigurationPath + " has changed, reloading.");
-//                                                     PropertyConfigurator.configure(log4jConfigurationPath.toUri().toURL());
-                                               }
-                                       }
-                                       // reset the key
-                                       boolean valid = wk.reset();
-                                       if (!valid) {
-                                               break watching;
-                                       }
-                               }
-                       } catch (IOException | InterruptedException e) {
-                               stdErr("Log4j configuration watcher failed: " + e.getMessage());
-                       }
-               }
-       }
+//     }
 }