mwomack     2003/02/07 23:16:27

  Modified:    src/java/org/apache/log4j/net SocketNode.java
  Added:       src/java/org/apache/log4j/net SocketNodeEventListener.java
  Log:
  Added SocketNodeEventListener.  This listener can be used by the SocketNode creator 
to learn when the node closes the associated socket.
  Factored some of the code in SocketNode.
  
  Revision  Changes    Path
  1.24      +65 -50    jakarta-log4j/src/java/org/apache/log4j/net/SocketNode.java
  
  Index: SocketNode.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/net/SocketNode.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- SocketNode.java   11 Dec 2002 07:30:31 -0000      1.23
  +++ SocketNode.java   8 Feb 2003 07:16:27 -0000       1.24
  @@ -36,81 +36,96 @@
     Socket socket;
     LoggerRepository hierarchy;
     Receiver receiver;
  -  ObjectInputStream ois;
  +  SocketNodeEventListener listener;
   
     static Logger logger = Logger.getLogger(SocketNode.class);
   
  +  /**
  +    Constructor for socket and logger repository. */
     public SocketNode(Socket socket, LoggerRepository hierarchy) {
       this.socket = socket;
       this.hierarchy = hierarchy;
  -    try {
  -      ois = new ObjectInputStream(
  -                         new BufferedInputStream(socket.getInputStream()));
  -    }
  -    catch(Exception e) {
  -      logger.error("Could not open ObjectInputStream to "+socket, e);
  -    }
     }
     
  +  /**
  +    Constructor for socket and reciever. */
     public SocketNode(Socket socket, Receiver receiver) {
       this.socket = socket;
       this.receiver = receiver;
  -    try {
  -      ois = new ObjectInputStream(
  -                         new BufferedInputStream(socket.getInputStream()));
  -    }
  -    catch(Exception e) {
  -      logger.error("Could not open ObjectInputStream to "+socket, e);
  -    }
     }
   
  -
  -  //public
  -  //void finalize() {
  -  //System.err.println("-------------------------Finalize called");
  -  // System.err.flush();
  -  //}
  +  /**
  +    Set the event listener on this node. */
  +  public void setListener(SocketNodeEventListener _listener) {
  +    listener = _listener;
  +  }
  +  
   
     public void run() {
       LoggingEvent event;
       Logger remoteLogger;
  -
  +    Exception listenerException = null;
  +    ObjectInputStream ois = null;
  +    
       try {
  -      while(true) {
  -     // read an event from the wire
  -             event = (LoggingEvent) ois.readObject();
  -             
  -             // if configured with a receiver, tell it to post the event
  -        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 = hierarchy.getLogger(event.categoryName);
  -          //event.logger = remoteLogger;
  -       // apply the logger-level filter
  -          if(event.level.isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
  -         // finally log the event as if was generated locally
  -            remoteLogger.callAppenders(event);
  +      ois = new ObjectInputStream(
  +        new BufferedInputStream(socket.getInputStream()));
  +    } catch (Exception e) {
  +      ois = null;
  +      listenerException = e;
  +      logger.error("Exception opening ObjectInputStream to " + socket, e);
  +    }
  +
  +    if (ois != null) {
  +      try {
  +        while(true) {
  +          // read an event from the wire
  +             event = (LoggingEvent) ois.readObject();
  +             
  +             // if configured with a receiver, tell it to post the event
  +          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 = hierarchy.getLogger(event.categoryName);
  +            //event.logger = remoteLogger;
  +            // apply the logger-level filter
  +            if(event.level.isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
  +              // finally log the event as if was generated locally
  +              remoteLogger.callAppenders(event);
  +            }
             }
           }
  +      } catch(java.io.EOFException e) {
  +        logger.info("Caught java.io.EOFException closing conneciton.");
  +        listenerException = e;
  +      } catch(java.net.SocketException e) {
  +        logger.info("Caught java.net.SocketException closing conneciton.");
  +        listenerException = e;
  +      } catch(IOException e) {
  +        logger.info("Caught java.io.IOException: "+e);
  +        logger.info("Closing connection.");
  +        listenerException = e;
  +      } catch(Exception e) {
  +        logger.error("Unexpected exception. Closing connecition.", e);
  +        listenerException = e;
         }
  -    } catch(java.io.EOFException e) {
  -      logger.info("Caught java.io.EOFException closing conneciton.");
  -    } catch(java.net.SocketException e) {
  -      logger.info("Caught java.net.SocketException closing conneciton.");
  -    } catch(IOException e) {
  -      logger.info("Caught java.io.IOException: "+e);
  -      logger.info("Closing connection.");
  -    } catch(Exception e) {
  -      logger.error("Unexpected exception. Closing conneciton.", e);
       }
   
  +    // close the socket
       try {
  -      ois.close();
  +      if (ois != null) {
  +        ois.close();
  +      }
       } catch(Exception e) {
  -      logger.info("Could not close connection.", e);
  +      //logger.info("Could not close connection.", e);
  +    }
  +    
  +    // send event to listener, if configured
  +    if (listener != null) {
  +      listener.socketClosedEvent(listenerException);
       }
     }
   }
  
  
  
  1.1                  
jakarta-log4j/src/java/org/apache/log4j/net/SocketNodeEventListener.java
  
  Index: SocketNodeEventListener.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software
   * License version 1.1, a copy of which has been included with this
   * distribution in the LICENSE.txt file.  */
  
  package org.apache.log4j.net;
  
  /**
    Interface used to listen for {@link SocketNode} related
    events. Clients register an instance of the interface and the
    instance is called back when the various events occur.
    
    @author Mark Womack
    @since 1.3
  */
  public interface SocketNodeEventListener {
    
    /**
      Called when the socket the node was given has been closed. */
    public void socketClosedEvent(Exception e);
  }
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to