[CVS spice] Added Avalon impl of SocketAcceptorManager.

mauro-yCVjj/[email protected] 10 Jul 2004 13:06:21 -0000
Newsgroups gmane.comp.java.spice.cvs
Message-ID <[email protected]>
<html>
<head>
<style><!--
  body {background-color:#ffffff;}
  .file {border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;}
  .pathname {font-family:monospace; float:right;}
  .fileheader {margin-bottom:.5em;}
  .diff {margin:0;}
  .tasklist {padding:4px;border:1px dashed #000000;margin-top:1em;}
  .tasklist ul {margin-top:0;margin-bottom:0;}
  tr.alt {background-color:#eeeeee}
  #added {background-color:#ddffdd;}
  #addedchars {background-color:#99ff99;font-weight:bolder;}
  tr.alt #added {background-color:#ccf7cc;}
  #removed {background-color:#ffdddd;}
  #removedchars {background-color:#ff9999;font-weight:bolder;}
  tr.alt #removed {background-color:#f7cccc;}
  #info {color:#888888;}
  #context {background-color:#eeeeee;}
  td {padding-left:.3em;padding-right:.3em;}
  tr.head {border-bottom-width:1px;border-bottom-style:solid;}
  tr.head td {padding:0;padding-top:.2em;}
  .task {background-color:#ffff00;}
  .comment {padding:4px;border:1px dashed #000000;background-color:#ffffdd}
  .error {color:red;}
  hr {border-width:0px;height:2px;background:black;}
--></style>
</head>
<body>
<table cellspacing="0" cellpadding="0" border="0" rules="cols">
<tr class="head"><td colspan="4">Commit in <b><tt>spice/components/netserve</tt></b><span id="info"> on MAIN</span></td></tr>
<tr><td><tt>src/java/org/codehaus/spice/netserve/connection/impl/<a href="#file1"><span id="added">AvalonAcceptorMonitor.java</span></a></tt></td><td align="right" id="added">+72</td><td></td><td nowrap="nowrap" align="right">added 1.1</td></tr>
<tr class="alt"><td><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/<a href="#file2"><span id="added">AvalonAcceptorManager.java</span></a></tt></td><td align="right" id="added">+67</td><td></td><td nowrap="nowrap" align="right">added 1.1</td></tr>
<tr><td><tt><a href="#file3">project.xml</a></tt></td><td align="right" id="added">+6</td><td align="right" id="removed">-1</td><td nowrap="nowrap" align="center">1.24 -&gt; 1.25</td></tr>
<tr class="alt"><td><tt>src/test/org/codehaus/spice/netserve/connection/impl/<a href="#file4"><span id="added">AvalonAcceptorManagerTestCase.java</span></a></tt></td><td align="right" id="added">+30</td><td></td><td nowrap="nowrap" align="right">added 1.1</td></tr>
<tr><td><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/<a href="#file5"><span id="added">AvalonAcceptorMonitorTestCase.java</span></a></tt></td><td align="right" id="added">+73</td><td></td><td nowrap="nowrap" align="right">added 1.1</td></tr>
<tr><td></td><td align="right" id="added">+248</td><td align="right" id="removed">-1</td><td></td></tr>
</table>
<small id="info">4 added + 1 modified, total 5 files</small><br />
<pre class="comment">
Added Avalon impl of SocketAcceptorManager.
Changed version to 1.1-b2.
</pre>
<hr /><a name="file1" /><div class="file">
<span class="pathname" id="added">spice/components/netserve/src/java/org/codehaus/spice/netserve/connection/impl<br /></span>
<div class="fileheader" id="added"><big><b>AvalonAcceptorMonitor.java</b></big> <small id="info">added at 1.1</small></div>
<pre class="diff"><small id="info">diff -N AvalonAcceptorMonitor.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ AvalonAcceptorMonitor.java	10 Jul 2004 13:06:21 -0000	1.1
@@ -0,0 +1,72 @@
</small></pre><pre class="diff" id="added">+package org.codehaus.spice.netserve.connection.impl;
+
+import org.apache.avalon.framework.logger.Logger;
+
+/**
+ * AcceptorMonitor that writes out messages to Avalon Logger.
+ */
+public class AvalonAcceptorMonitor
+   extends AbstractLoggingAcceptorMonitor
+{
+   /**
+    * The associated Avalon Logger.
+    */
+   private final Logger m_logger;
+
+   /**
+    * Create AcceptorMonitor that writes to Avalon Logger.
+    *
+    * @param logger the logger
+    */
+   public AvalonAcceptorMonitor( final Logger logger )
+   {
+      if ( null == logger )
+      {
+         throw new NullPointerException( "logger" );
+      }
+      m_logger = logger;
+   }
+
+   /**
+    * @see AbstractLoggingAcceptorMonitor#isDebugEnabled
+    */
+   protected boolean isDebugEnabled()
+   {
+      return getLogger().isDebugEnabled();
+   }
+
+   /**
+    * @see AbstractLoggingAcceptorMonitor#debug
+    */
+   protected void debug( final String message )
+   {
+      getLogger().debug( message );
+   }
+
+   /**
+    * @see AbstractLoggingAcceptorMonitor#info
+    */
+   protected void info( final String message )
+   {
+      getLogger().info( message );
+   }
+
+   /**
+    * @see AbstractLoggingAcceptorMonitor#warn
+    */
+   protected void warn( final String message,
+                        final Exception e )
+   {
+      getLogger().warn( message, e );
+   }
+
+   /**
+    * Return the logger.
+    *
+    * @return the logger
+    */
+   protected Logger getLogger()
+   {
+      return m_logger;
+   }
+}
</pre></div>
<hr /><a name="file2" /><div class="file">
<span class="pathname" id="added">spice/components/netserve/src/java/org/codehaus/spice/netserve/connection/impl<br /></span>
<div class="fileheader" id="added"><big><b>AvalonAcceptorManager.java</b></big> <small id="info">added at 1.1</small></div>
<pre class="diff"><small id="info">diff -N AvalonAcceptorManager.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ AvalonAcceptorManager.java	10 Jul 2004 13:06:21 -0000	1.1
@@ -0,0 +1,67 @@
</small></pre><pre class="diff" id="added">+package org.codehaus.spice.netserve.connection.impl;
+
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.LogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+
+/**
+ * An Avalon compliant implementation of AcceptorManager.
+ *
+ * &lt;p&gt;The component takes a single configuration parameter;
+ * "shutdownTimeout". This specifies the amount of time to wait
+ * while waiting for connections to shutdown gracefully. A
+ * sample configuration follows;&lt;/p&gt;
+ * &lt;pre&gt;
+ *  &amp;lt;!-- wait 200ms for connections to gracefully shutdown --&amp;gt;
+ *  &amp;lt;shutdownTimeout&amp;gt;200&amp;lt;/shutdownTimeout&amp;gt;
+ * &lt;/pre&gt;
+ *
+ * @author Peter Donald
+ * @author Mauro Talevi
+ * @version $Revision: 1.1 $ $Date: 2004/07/10 13:06:21 $
+ * @phoenix.component
+ * @phoenix.service type="org.codehaus.spice.netserve.connection.SocketAcceptorManager"
+ * @see org.codehaus.spice.netserve.connection.impl.DefaultAcceptorManager
+ */
+public class AvalonAcceptorManager
+   extends DefaultAcceptorManager
+   implements LogEnabled, Configurable, Initializable, Disposable
+{
+   /**
+    * @phoenix.logger
+    */
+   public void enableLogging( final Logger logger )
+   {
+      setMonitor( new AvalonAcceptorMonitor( logger ) );
+   }
+
+   /**
+    * @phoenix.configuration type="http://relaxng.org/ns/structure/1.0"
+    *    location="AcceptorManager-schema.xml"
+    */
+   public void configure( final Configuration configuration )
+      throws ConfigurationException
+   {
+      setShutdownTimeout( configuration.getChild( "shutdownTimeout" ).getValueAsInteger( 0 ) );
+   }
+
+   /**
+    * Nothing to do to initial AcceptorManager.
+    */
+   public void initialize()
+      throws Exception
+   {
+   }
+
+   /**
+    * Shutdown all connections.
+    */
+   public void dispose()
+   {
+      shutdownAcceptors();
+   }
+}
</pre></div>
<hr /><a name="file3" /><div class="file">
<span class="pathname">spice/components/netserve<br /></span>
<div class="fileheader"><big><b>project.xml</b></big> <small id="info">1.24 -&gt; 1.25</small></div>
<pre class="diff"><small id="info">diff -u -r1.24 -r1.25
--- project.xml	16 May 2004 09:42:39 -0000	1.24
+++ project.xml	10 Jul 2004 13:06:21 -0000	1.25
@@ -4,7 +4,7 @@
</small></pre><pre class="diff" id="context">     &lt;name&gt;Spice Netserve&lt;/name&gt;
     &lt;id&gt;spice-netserve&lt;/id&gt;
     &lt;package&gt;org.codehaus.spice.netserve&lt;/package&gt;
</pre><pre class="diff" id="removed">-    &lt;currentVersion&gt;1.1-b<span id="removedchars">1</span>&lt;/currentVersion&gt;
</pre><pre class="diff" id="added">+    &lt;currentVersion&gt;1.1-b<span id="addedchars">2</span>&lt;/currentVersion&gt;
</pre><pre class="diff" id="context">     &lt;inceptionYear&gt;1999&lt;/inceptionYear&gt;
 
     &lt;shortDescription&gt;Netserve is set of utility components for creating a Network Server.&lt;/shortDescription&gt;
</pre><pre class="diff"><small id="info">@@ -16,6 +16,11 @@
</small></pre><pre class="diff" id="context">     &lt;/description&gt;
     
 	&lt;versions&gt;
</pre><pre class="diff" id="added">+        &lt;version&gt;
+            &lt;id&gt;1.1-b2&lt;/id&gt;
+            &lt;name&gt;1.1-b2&lt;/name&gt;
+            &lt;tag&gt;NETSERVE_1_1_b2-tag&lt;/tag&gt;
+        &lt;/version&gt;
</pre><pre class="diff" id="context">         &lt;version&gt;
             &lt;id&gt;1.1-b1&lt;/id&gt;
             &lt;name&gt;1.1-b1&lt;/name&gt;
</pre></div>
<hr /><a name="file4" /><div class="file">
<span class="pathname" id="added">spice/components/netserve/src/test/org/codehaus/spice/netserve/connection/impl<br /></span>
<div class="fileheader" id="added"><big><b>AvalonAcceptorManagerTestCase.java</b></big> <small id="info">added at 1.1</small></div>
<pre class="diff"><small id="info">diff -N AvalonAcceptorManagerTestCase.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ AvalonAcceptorManagerTestCase.java	10 Jul 2004 13:06:21 -0000	1.1
@@ -0,0 +1,30 @@
</small></pre><pre class="diff" id="added">+package org.codehaus.spice.netserve.connection.impl;
+
+import junit.framework.TestCase;
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.avalon.framework.logger.ConsoleLogger;
+
+public class AvalonAcceptorManagerTestCase
+   extends TestCase
+{
+   public void testAvalonAcceptorManager()
+      throws Exception
+   {
+      final AvalonAcceptorManager manager = new AvalonAcceptorManager();
+      final DefaultConfiguration root = new DefaultConfiguration( "root", "" );
+      final DefaultConfiguration configuration = new DefaultConfiguration( "shutdownTimeout", "" );
+      configuration.setValue( "22" );
+      root.addChild( configuration );
+
+      final ConsoleLogger logger = new ConsoleLogger( ConsoleLogger.LEVEL_DISABLED );
+      manager.enableLogging( logger );
+      final AcceptorMonitor monitor = manager.getMonitor();
+      assertTrue( "getMonitor() instanceof AvalonAcceptorMonitor", monitor instanceof AvalonAcceptorMonitor );
+      final AvalonAcceptorMonitor dnaMonitor = (AvalonAcceptorMonitor) monitor;
+      assertEquals( "logger", logger, dnaMonitor.getLogger() );
+      manager.configure( root );
+      assertEquals( "getShutdownTimeout()", 22, manager.getShutdownTimeout() );
+      manager.initialize();
+      manager.dispose();
+   }
+}
</pre></div>
<hr /><a name="file5" /><div class="file">
<span class="pathname" id="added">spice/components/netserve/src/test/org/codehaus/spice/netserve/connection/impl<br /></span>
<div class="fileheader" id="added"><big><b>AvalonAcceptorMonitorTestCase.java</b></big> <small id="info">added at 1.1</small></div>
<pre class="diff"><small id="info">diff -N AvalonAcceptorMonitorTestCase.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ AvalonAcceptorMonitorTestCase.java	10 Jul 2004 13:06:21 -0000	1.1
@@ -0,0 +1,73 @@
</small></pre><pre class="diff" id="added">+package org.codehaus.spice.netserve.connection.impl;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import junit.framework.TestCase;
+import org.apache.avalon.framework.logger.Logger;
+import com.mockobjects.dynamic.C;
+import com.mockobjects.dynamic.Mock;
+
+public class AvalonAcceptorMonitorTestCase
+   extends TestCase
+{
+   public void testAvalonAcceptorMonitor()
+      throws Exception
+   {
+      final Mock mockLogger = new Mock( Logger.class );
+
+      final String name = "MyName";
+      final ServerSocket serverSocket = new ServerSocket( 2023 );
+      final IOException ioe = new IOException();
+
+      final String acceptorCreatedMessage =
+         "Creating Acceptor " + name + " on " +
+         serverSocket.getInetAddress().getHostAddress() + ":" +
+         serverSocket.getLocalPort() + ".";
+
+      final String acceptorClosingMessage =
+         "Closing Acceptor " + name + ".";
+
+      final String serverSocketListening =
+         "About to call accept() on ServerSocket '" + name + "'.";
+
+      final String errorAcceptingConnectionMessage =
+         "Error Accepting connection on " + name;
+
+      final String errorClosingServerSocketMessage =
+         "Error Closing Server Socket " + name;
+
+      mockLogger.expect( "info", C.args( C.eq( acceptorCreatedMessage ) ) );
+      mockLogger.expect( "info", C.args( C.eq( acceptorClosingMessage ) ) );
+      mockLogger.expectAndReturn( "isDebugEnabled", C.NO_ARGS, false );
+      mockLogger.expectAndReturn( "isDebugEnabled", C.NO_ARGS, true );
+      mockLogger.expect( "debug", C.args( C.eq( serverSocketListening ) ) );
+      mockLogger.expect( "warn", C.args( C.eq( errorAcceptingConnectionMessage ), C.eq( ioe ) ) );
+      mockLogger.expect( "warn", C.args( C.eq( errorClosingServerSocketMessage ), C.eq( ioe ) ) );
+      final Logger logger = (Logger) mockLogger.proxy();
+
+      final AcceptorMonitor monitor = new AvalonAcceptorMonitor( logger );
+      monitor.acceptorCreated( name, serverSocket );
+      monitor.acceptorClosing( name, serverSocket );
+      monitor.serverSocketListening( name, serverSocket );
+      monitor.serverSocketListening( name, serverSocket );
+      monitor.errorAcceptingConnection( name, ioe );
+      monitor.errorClosingServerSocket( name, ioe );
+
+      mockLogger.verify();
+   }
+
+   public void testAvalonAcceptorMonitorPassedNullIntoCtor()
+      throws Exception
+   {
+      try
+      {
+         new AvalonAcceptorMonitor( null );
+      }
+      catch ( final NullPointerException npe )
+      {
+         assertEquals( "npe.getMessage()", "logger", npe.getMessage() );
+         return;
+      }
+      fail( "Expected to fail due to npe in ctor" );
+   }
+}
</pre></div>
<center><small><a href="http://www.badgers-in-foil.co.uk/projects/cvsspam/" title="commit -&gt; email">CVSspam</a> 0.2.8</small></center>
</body></html>