/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 2006-2011, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.audit.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.audit.AuditEvent; public class SocketNode implements Runnable { final AuditServer auditServer; final Socket socket; final AuditEventHandler aeh; ObjectOutputStream oos; ObjectInputStream ois; int writeCount = 0; boolean closed = false; static final int RESET_FREQUENCY = 1000; static Logger logger = (Logger) LoggerFactory.getLogger(SocketNode.class); public SocketNode(AuditServer auditServer, Socket socket, AuditEventHandler aeh) { this.auditServer = auditServer; this.socket = socket; this.aeh = aeh; try { ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); } catch (Exception e) { logger.error("Could not open ObjectInputStream to " + socket, e); } } void close() { if(closed) { return; } closed = true; if (ois != null) { try { ois.close(); ois = null; } catch (IOException e) { logger.warn("While in close method caught: " + e.getMessage()); } } } public void run() { AuditEvent event = null; // try { while (!closed) { // read an event from the wire try { event = (AuditEvent) ois.readObject(); } catch (java.io.EOFException e) { logger.info("Caught java.io.EOFException closing connection."); break; } catch (IOException e) { logger.info("Caught: "+e.getMessage()); break; } catch (ClassNotFoundException e) { logger.error("Unexpected ClassNotFoundException.", e); writeResponse(e); break; } Object outgoingObject; try { aeh.doHandle(event); outgoingObject = new Boolean(true); } catch (Exception e) { logger.error("Problem while handling audit event", e); outgoingObject = e; } logger.trace("Outgoing object is {}", outgoingObject); writeResponse(outgoingObject); } auditServer.socketNodeClosing(this); } private void writeResponse(Object outgoingObject) { try { if (writeCount++ >= RESET_FREQUENCY) { writeCount = 0; System.out.print("r"); oos.reset(); } oos.writeObject(outgoingObject); } catch (IOException e) { logger.error("Failed to send acknowledgement", e); } } @Override public String toString() { if (socket != null) { return "SocketNode to " + socket.getRemoteSocketAddress(); } else { return "SocketNode to null socket"; } } }