Bug 42102: Make SocketNode inner class to avoid conflict with 1.2's implementation

git-svn-id: https://svn.apache.org/repos/asf/logging/sandbox/log4j/receivers@528040 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/log4j/net/SocketHubReceiver.java b/src/main/java/org/apache/log4j/net/SocketHubReceiver.java
index 151bcfe..0cb1f87 100644
--- a/src/main/java/org/apache/log4j/net/SocketHubReceiver.java
+++ b/src/main/java/org/apache/log4j/net/SocketHubReceiver.java
@@ -18,15 +18,22 @@
 package org.apache.log4j.net;
 
 import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.BufferedInputStream;
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.lang.reflect.Method;
 
 import org.apache.log4j.plugins.Plugin;
 import org.apache.log4j.plugins.Receiver;
+import org.apache.log4j.plugins.Pauseable;
 import org.apache.log4j.spi.LoggerRepository;
+import org.apache.log4j.spi.ComponentBase;
+import org.apache.log4j.spi.LoggingEvent;
+import org.apache.log4j.Logger;
 
 /**
   SocketHubReceiver receives a remote logging event on a configured
@@ -389,4 +396,292 @@
     // This method does nothing.
   }
 
+    /**
+       Read {@link org.apache.log4j.spi.LoggingEvent}
+     objects sent from a remote client using
+       Sockets (TCP). These logging events are logged according to local
+       policy, as if they were generated locally.
+
+       <p>For example, the socket node might decide to log events to a
+       local file and also resent them to a second socket node.
+
+        This class is a replica of org.apache.log4j.net.SocketNode
+        from log4j 1.3 which is substantially different from
+        the log4j 1.2 implementation.  The class was made a
+        member of SocketHubReceiver to avoid potential collisions.
+
+        @author  Ceki G&uuml;lc&uuml;
+        @author  Paul Smith (psmith@apache.org)
+    */
+    private static final class SocketNode
+            extends ComponentBase implements Runnable, Pauseable {
+
+        /**
+         * Paused state.
+         */
+      private boolean paused;
+        /**
+         * Socket.
+         */
+      private Socket socket;
+        /**
+         * Receiver.
+         */
+      private Receiver receiver;
+        /**
+         * List of listeners.
+         */
+      private List listenerList = Collections.synchronizedList(new ArrayList());
+
+        /**
+         * Method descriptor for LoggingEvent.setProperty
+         *   which does not exist in log4j 1.2.14.
+         */
+      private static final Method LOGGING_EVENT_SET_PROPERTY =
+              getLoggingEventSetProperty();
+
+        /**
+         * Get method descriptor for LoggingEvent.setProperty
+         *   which does not exist in log4j 1.2.14.
+         * @return method descriptor or null if not supported.
+         */
+      private static Method getLoggingEventSetProperty() {
+          Method m = null;
+          try {
+              m = LoggingEvent.class.getMethod("setProperty",
+                              new Class[] {
+                                      String.class, String.class
+                              });
+          } catch (NoSuchMethodException e) {
+              return null;
+          }
+          return m;
+      }
+
+      /**
+        Constructor for socket and logger repository.
+       @param s socket
+       @param hierarchy logger repository
+       */
+      public SocketNode(final Socket s,
+                        final LoggerRepository hierarchy) {
+        super();
+        this.socket = s;
+        this.repository = hierarchy;
+      }
+
+      /**
+        Constructor for socket and receiver.
+       @param s socket
+       @param r receiver
+       */
+      public SocketNode(final Socket s, final Receiver r) {
+        super();
+        this.socket = s;
+        this.receiver = r;
+      }
+
+      /**
+       * Set the event listener on this node.
+       *
+       * @deprecated Now supports mutliple listeners, this method
+       * simply invokes the removeSocketNodeEventListener() to remove
+       * the listener, and then readds it.
+       * @param l listener
+       */
+      public void setListener(final SocketNodeEventListener l) {
+        removeSocketNodeEventListener(l);
+        addSocketNodeEventListener(l);
+      }
+
+      /**
+       * Adds the listener to the list of listeners to be notified of the
+       * respective event.
+       * @param listener the listener to add to the list
+       */
+      public void addSocketNodeEventListener(
+              final SocketNodeEventListener listener) {
+        listenerList.add(listener);
+      }
+
+      /**
+       * Removes the registered Listener from this instances list of
+       * listeners.  If the listener has not been registered, then invoking
+       * this method has no effect.
+       *
+       * @param listener the SocketNodeEventListener to remove
+       */
+      public void removeSocketNodeEventListener(
+              final SocketNodeEventListener listener) {
+        listenerList.remove(listener);
+      }
+
+        /**
+         * Set property in event.
+         * @param event event, may not be null.
+         * @param propName property name
+         * @param propValue property value
+         * @return true if property was set
+         */
+      private static boolean setEventProperty(
+              final LoggingEvent event,
+              final String propName,
+              final String propValue) {
+          if (LOGGING_EVENT_SET_PROPERTY != null) {
+              try {
+                  LOGGING_EVENT_SET_PROPERTY.invoke(event,
+                          new Object[] {
+                                  propName, propValue
+                          });
+                  return true;
+              } catch (Exception e) {
+                  return false;
+              }
+          }
+          return false;
+      }
+
+        /**
+         * Deserialize events from socket until interrupted.
+         */
+      public void run() {
+        LoggingEvent event;
+        Logger remoteLogger;
+        Exception listenerException = null;
+        ObjectInputStream ois = null;
+
+        try {
+          ois =
+            new ObjectInputStream(
+              new BufferedInputStream(socket.getInputStream()));
+        } catch (Exception e) {
+          ois = null;
+          listenerException = e;
+          getLogger().error(
+                  "Exception opening ObjectInputStream to " + socket, e);
+        }
+
+        if (ois != null) {
+          String remoteInfo =
+            socket.getInetAddress().getHostName() + ":" + socket.getPort();
+
+          /**
+           * notify the listener that the socket has been
+           * opened and this SocketNode is ready and waiting
+           */
+          fireSocketOpened(remoteInfo);
+
+          try {
+            while (true) {
+              // read an event from the wire
+              event = (LoggingEvent) ois.readObject();
+
+              // store the known remote info in an event property
+              setEventProperty(event, "log4j.remoteSourceInfo", remoteInfo);
+
+              // if configured with a receiver, tell it to post the event
+              if (!isPaused()) {
+                if ((receiver != null)) {
+                  receiver.doPost(event);
+
+                  // else post it via the hierarchy
+                } else {
+                  // get a logger from the hierarchy. The name of the logger
+                  // is taken to be the name contained in the event.
+                  remoteLogger = repository.getLogger(event.getLoggerName());
+
+                  //event.logger = remoteLogger;
+                  // apply the logger-level filter
+                  if (event
+                    .getLevel()
+                    .isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
+                    // finally log the event as if was generated locally
+                    remoteLogger.callAppenders(event);
+                  }
+                }
+              } else {
+                //we simply discard this event.
+              }
+            }
+          } catch (java.io.EOFException e) {
+            getLogger().info("Caught java.io.EOFException closing connection.");
+            listenerException = e;
+          } catch (java.net.SocketException e) {
+            getLogger().info(
+                    "Caught java.net.SocketException closing connection.");
+            listenerException = e;
+          } catch (IOException e) {
+            getLogger().info("Caught java.io.IOException: " + e);
+            getLogger().info("Closing connection.");
+            listenerException = e;
+          } catch (Exception e) {
+            getLogger().error("Unexpected exception. Closing connection.", e);
+            listenerException = e;
+          }
+        }
+
+        // close the socket
+        try {
+          if (ois != null) {
+            ois.close();
+          }
+        } catch (Exception e) {
+          //getLogger().info("Could not close connection.", e);
+        }
+
+        // send event to listener, if configured
+        if (listenerList.size() > 0) {
+          fireSocketClosedEvent(listenerException);
+        }
+      }
+
+      /**
+       * Notifies all registered listeners regarding the closing of the Socket.
+       * @param listenerException listener exception
+       */
+      private void fireSocketClosedEvent(final Exception listenerException) {
+        synchronized (listenerList) {
+            for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+                SocketNodeEventListener snel =
+                        (SocketNodeEventListener) iter.next();
+                if (snel != null) {
+                    snel.socketClosedEvent(listenerException);
+                }
+            }
+        }
+      }
+
+      /**
+       * Notifies all registered listeners regarding the opening of a Socket.
+       * @param remoteInfo remote info
+       */
+      private void fireSocketOpened(final String remoteInfo) {
+        synchronized (listenerList) {
+            for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+                SocketNodeEventListener snel =
+                        (SocketNodeEventListener) iter.next();
+                if (snel != null) {
+                    snel.socketOpened(remoteInfo);
+                }
+            }
+        }
+      }
+
+        /**
+         * Sets if node is paused.
+         * @param b new value
+         */
+      public void setPaused(final boolean b) {
+        this.paused = b;
+      }
+
+        /**
+         * Get if node is paused.
+         * @return true if pause.
+         */
+      public boolean isPaused() {
+        return this.paused;
+      }
+    }
+
 }
diff --git a/src/main/java/org/apache/log4j/net/SocketNode.java b/src/main/java/org/apache/log4j/net/SocketNode.java
deleted file mode 100644
index 81240e9..0000000
--- a/src/main/java/org/apache/log4j/net/SocketNode.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * 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.log4j.net;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.plugins.Pauseable;
-import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.spi.ComponentBase;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.lang.reflect.Method;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-// Contributors:  Moses Hohman <mmhohman@rainbow.uchicago.edu>
-
-/**
-   Read {@link LoggingEvent} objects sent from a remote client using
-   Sockets (TCP). These logging events are logged according to local
-   policy, as if they were generated locally.
-
-   <p>For example, the socket node might decide to log events to a
-   local file and also resent them to a second socket node.
-
-    @author  Ceki G&uuml;lc&uuml;
-    @author  Paul Smith (psmith@apache.org)
-
-    @since 0.8.4
-*/
-public class SocketNode extends ComponentBase implements Runnable, Pauseable {
-
-    /**
-     * Paused state.
-     */
-  private boolean paused;
-    /**
-     * Socket.
-     */
-  private Socket socket;
-    /**
-     * Receiver.
-     */
-  private Receiver receiver;
-    /**
-     * List of listeners.
-     */
-  private List listenerList = Collections.synchronizedList(new ArrayList());
-
-    /**
-     * Method descriptor for LoggingEvent.setProperty
-     *   which does not exist in log4j 1.2.14.
-     */
-  private static final Method LOGGING_EVENT_SET_PROPERTY =
-          getLoggingEventSetProperty();
-
-    /**
-     * Get method descriptor for LoggingEvent.setProperty
-     *   which does not exist in log4j 1.2.14.
-     * @return method descriptor or null if not supported.
-     */
-  private static Method getLoggingEventSetProperty() {
-      Method m = null;
-      try {
-          m = LoggingEvent.class.getMethod("setProperty",
-                          new Class[] { String.class, String.class });
-      } catch (NoSuchMethodException e) {
-          return null;
-      }
-      return m;
-  }
-
-  /**
-    Constructor for socket and logger repository.
-   @param s socket
-   @param hierarchy logger repository
-   */
-  public SocketNode(final Socket s,
-                    final LoggerRepository hierarchy) {
-    super();
-    this.socket = s;
-    this.repository = hierarchy;
-  }
-
-  /**
-    Constructor for socket and receiver.
-   @param s socket
-   @param r receiver
-   */
-  public SocketNode(final Socket s, final Receiver r) {
-    super();
-    this.socket = s;
-    this.receiver = r;
-  }
-
-  /**
-   * Set the event listener on this node.
-   *
-   * @deprecated Now supports mutliple listeners, this method
-   * simply invokes the removeSocketNodeEventListener() to remove
-   * the listener, and then readds it.
-   * @param l listener
-   */
-  public void setListener(final SocketNodeEventListener l) {
-    removeSocketNodeEventListener(l);
-    addSocketNodeEventListener(l);
-  }
-
-  /**
-   * Adds the listener to the list of listeners to be notified of the
-   * respective event.
-   * @param listener the listener to add to the list
-   */
-  public void addSocketNodeEventListener(
-          final SocketNodeEventListener listener) {
-    listenerList.add(listener);
-  }
-
-  /**
-   * Removes the registered Listener from this instances list of
-   * listeners.  If the listener has not been registered, then invoking
-   * this method has no effect.
-   *
-   * @param listener the SocketNodeEventListener to remove
-   */
-  public void removeSocketNodeEventListener(
-          final SocketNodeEventListener listener) {
-    listenerList.remove(listener);
-  }
-
-    /**
-     * Set property in event.
-     * @param event event, may not be null.
-     * @param propName property name
-     * @param propValue property value
-     * @return true if property was set
-     */
-  private static boolean setEventProperty(
-          final LoggingEvent event,
-          final String propName,
-          final String propValue) {
-      if (LOGGING_EVENT_SET_PROPERTY != null) {
-          try {
-              LOGGING_EVENT_SET_PROPERTY.invoke(event,
-                      new Object[] { propName, propValue });
-              return true;
-          } catch (Exception e) {
-              return false;
-          }
-      }
-      return false;
-  }
-
-    /**
-     * Deserialize events from socket until interrupted.
-     */
-  public void run() {
-    LoggingEvent event;
-    Logger remoteLogger;
-    Exception listenerException = null;
-    ObjectInputStream ois = null;
-
-    try {
-      ois =
-        new ObjectInputStream(
-          new BufferedInputStream(socket.getInputStream()));
-    } catch (Exception e) {
-      ois = null;
-      listenerException = e;
-      getLogger().error("Exception opening ObjectInputStream to " + socket, e);
-    }
-
-    if (ois != null) {
-      String remoteInfo =
-        socket.getInetAddress().getHostName() + ":" + socket.getPort();
-
-      /**
-       * notify the listener that the socket has been
-       * opened and this SocketNode is ready and waiting
-       */
-      fireSocketOpened(remoteInfo);
-
-      try {
-        while (true) {
-          // read an event from the wire
-          event = (LoggingEvent) ois.readObject();
-
-          // store the known remote info in an event property
-          setEventProperty(event, "log4j.remoteSourceInfo", remoteInfo);
-
-          // if configured with a receiver, tell it to post the event
-          if (!isPaused()) {
-            if ((receiver != null)) {
-              receiver.doPost(event);
-
-              // else post it via the hierarchy
-            } else {
-              // get a logger from the hierarchy. The name of the logger
-              // is taken to be the name contained in the event.
-              remoteLogger = repository.getLogger(event.getLoggerName());
-
-              //event.logger = remoteLogger;
-              // apply the logger-level filter
-              if (event
-                .getLevel()
-                .isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
-                // finally log the event as if was generated locally
-                remoteLogger.callAppenders(event);
-              }
-            }
-          } else {
-            //we simply discard this event.
-          }
-        }
-      } catch (java.io.EOFException e) {
-        getLogger().info("Caught java.io.EOFException closing connection.");
-        listenerException = e;
-      } catch (java.net.SocketException e) {
-        getLogger().info("Caught java.net.SocketException closing connection.");
-        listenerException = e;
-      } catch (IOException e) {
-        getLogger().info("Caught java.io.IOException: " + e);
-        getLogger().info("Closing connection.");
-        listenerException = e;
-      } catch (Exception e) {
-        getLogger().error("Unexpected exception. Closing connection.", e);
-        listenerException = e;
-      }
-    }
-
-    // close the socket
-    try {
-      if (ois != null) {
-        ois.close();
-      }
-    } catch (Exception e) {
-      //getLogger().info("Could not close connection.", e);
-    }
-
-    // send event to listener, if configured
-    if (listenerList.size() > 0) {
-      fireSocketClosedEvent(listenerException);
-    }
-  }
-
-  /**
-   * Notifies all registered listeners regarding the closing of the Socket.
-   * @param listenerException listener exception
-   */
-  private void fireSocketClosedEvent(final Exception listenerException) {
-    synchronized (listenerList) {
-        for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
-            SocketNodeEventListener snel =
-                    (SocketNodeEventListener) iter.next();
-            if (snel != null) {
-                snel.socketClosedEvent(listenerException);
-            }
-        }
-    }
-  }
-
-  /**
-   * Notifies all registered listeners regarding the opening of a Socket.
-   * @param remoteInfo remote info
-   */
-  private void fireSocketOpened(final String remoteInfo) {
-    synchronized (listenerList) {
-        for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
-            SocketNodeEventListener snel =
-                    (SocketNodeEventListener) iter.next();
-            if (snel != null) {
-                snel.socketOpened(remoteInfo);
-            }
-        }
-    }
-  }
-
-    /**
-     * Sets if node is paused.
-     * @param b new value
-     */
-  public void setPaused(final boolean b) {
-    this.paused = b;
-  }
-
-    /**
-     * Get if node is paused.
-     * @return true if pause.
-     */
-  public boolean isPaused() {
-    return this.paused;
-  }
-}