Author: pferraro
Date: 2008-09-12 11:29:24 -0400 (Fri, 12 Sep 2008)
New Revision: 1816
Added:
trunk/mod_cluster/src/test/java/org/jboss/modcluster/BasicClusterListenerTestCase.java
Modified:
trunk/mod_cluster/src/main/java/org/jboss/modcluster/BasicClusterListener.java
Log:
Tested.
Stand-alone JBossWeb cluster listener will decorate this class, not extend it.
Modified: trunk/mod_cluster/src/main/java/org/jboss/modcluster/BasicClusterListener.java
===================================================================
---
trunk/mod_cluster/src/main/java/org/jboss/modcluster/BasicClusterListener.java 2008-09-12
12:26:32 UTC (rev 1815)
+++
trunk/mod_cluster/src/main/java/org/jboss/modcluster/BasicClusterListener.java 2008-09-12
15:29:24 UTC (rev 1816)
@@ -32,8 +32,6 @@
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Server;
import org.apache.catalina.Service;
-import org.apache.catalina.util.StringManager;
-import org.jboss.logging.Logger;
/**
* This listener communicates with a front end mod_cluster enabled proxy to
@@ -42,24 +40,11 @@
*/
public class BasicClusterListener implements LifecycleListener, ContainerListener
{
- protected static Logger log = Logger.getLogger(BasicClusterListener.class);
+ /** Initialization flag. */
+ private volatile boolean init = false;
- /**
- * The string manager for this package.
- */
- protected StringManager sm = StringManager.getManager(Constants.Package);
+ private JBossWebEventHandler eventHandler;
- // -------------------------------------------------------------- Constants
-
- // ----------------------------------------------------------------- Fields
-
- /**
- * Initialization flag.
- */
- protected boolean init = false;
-
- protected JBossWebEventHandler eventHandler;
-
// ----------------------------------------------------------- Constructors
public BasicClusterListener(JBossWebEventHandler eventHandler)
@@ -67,10 +52,6 @@
this.eventHandler = eventHandler;
}
- protected BasicClusterListener()
- {
- }
-
// ------------------------------------------------------------- Properties
// ---------------------------------------------- LifecycleListener Methods
@@ -116,7 +97,6 @@
container.removeContainerListener(this);
}
}
-
}
/**
@@ -126,9 +106,10 @@
*/
public void lifecycleEvent(LifecycleEvent event)
{
- Object source = event.getLifecycle();
-
- if (Lifecycle.START_EVENT.equals(event.getType()))
+ Lifecycle source = event.getLifecycle();
+ String type = event.getType();
+
+ if (type.equals(Lifecycle.START_EVENT))
{
if (source instanceof Context)
{
@@ -136,18 +117,22 @@
this.eventHandler.startContext((Context) source);
}
}
- else if (Lifecycle.AFTER_START_EVENT.equals(event.getType()))
+ else if (type.equals(Lifecycle.AFTER_START_EVENT))
{
if (source instanceof Server)
{
this.eventHandler.init();
+
+ Server server = (Server) source;
+
+ this.addListeners(server);
- this.startServer((Server) source);
+ this.eventHandler.startServer(server);
this.init = true;
}
}
- else if (Lifecycle.STOP_EVENT.equals(event.getType()))
+ else if (type.equals(Lifecycle.STOP_EVENT))
{
if (source instanceof Context)
{
@@ -156,81 +141,71 @@
}
else if (source instanceof Server)
{
- this.stopServer((Server) source);
+ this.init = false;
- this.eventHandler.shutdown();
+ Server server = (Server) source;
+
+ this.removeListeners(server);
- this.init = false;
+ this.eventHandler.stopServer(server);
+
+ this.eventHandler.shutdown();
}
}
- else if (Lifecycle.PERIODIC_EVENT.equals(event.getType()))
+ else if (type.equals(Lifecycle.PERIODIC_EVENT))
{
- if (this.init && source instanceof Engine)
+ if (this.init && (source instanceof Engine))
{
this.eventHandler.status((Engine) source);
}
}
}
- /**
- * Send commands to the front end server associated with the startup of the
- * node.
- */
- protected void startServer(Server server)
+ private void addListeners(Server server)
{
// Register ourself as a listener for child services
Service[] services = server.findServices();
- for (Service service : services)
+ for (Service service: services)
{
- service.getContainer().addContainerListener(this);
-
Engine engine = (Engine) service.getContainer();
+ engine.addContainerListener(this);
((Lifecycle) engine).addLifecycleListener(this);
- Container[] children = engine.findChildren();
- for (Container element : children)
+ Container[] containers = engine.findChildren();
+ for (Container container: containers)
{
- element.addContainerListener(this);
- Container[] children2 = element.findChildren();
- for (Container element2 : children2)
+ container.addContainerListener(this);
+
+ Container[] childContainers = container.findChildren();
+ for (Container childContainer: childContainers)
{
- ((Lifecycle) element2).addLifecycleListener(this);
+ ((Lifecycle) childContainer).addLifecycleListener(this);
}
}
}
-
- this.eventHandler.startServer(server);
}
- /**
- * Send commands to the front end server associated with the shutdown of the
- * node.
- */
- protected void stopServer(Server server)
+ private void removeListeners(Server server)
{
- // Register ourself as a listener to child components
+ // Unregister ourself as a listener to child components
Service[] services = server.findServices();
- for (Service service : services)
+ for (Service service: services)
{
- service.getContainer().removeContainerListener(this);
- ((Lifecycle) service.getContainer()).removeLifecycleListener(this);
- Container[] children = service.getContainer().findChildren();
- for (Container element : children)
+ Engine engine = (Engine) service.getContainer();
+ engine.removeContainerListener(this);
+ ((Lifecycle) engine).removeLifecycleListener(this);
+
+ Container[] containers = engine.findChildren();
+ for (Container container: containers)
{
- element.removeContainerListener(this);
- Container[] children2 = element.findChildren();
- for (Container element2 : children2)
+ container.removeContainerListener(this);
+
+ Container[] childContainers = container.findChildren();
+ for (Container childContainer: childContainers)
{
- ((Lifecycle) element2).removeLifecycleListener(this);
+ ((Lifecycle) childContainer).removeLifecycleListener(this);
}
}
}
-
- this.eventHandler.stopServer(server);
}
-
- protected void setEventHandler(JBossWebEventHandler handler)
- {
- this.eventHandler = handler;
- }
}
Added:
trunk/mod_cluster/src/test/java/org/jboss/modcluster/BasicClusterListenerTestCase.java
===================================================================
---
trunk/mod_cluster/src/test/java/org/jboss/modcluster/BasicClusterListenerTestCase.java
(rev 0)
+++
trunk/mod_cluster/src/test/java/org/jboss/modcluster/BasicClusterListenerTestCase.java 2008-09-12
15:29:24 UTC (rev 1816)
@@ -0,0 +1,261 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.jboss.modcluster;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.ContainerEvent;
+import org.apache.catalina.Context;
+import org.apache.catalina.Engine;
+import org.apache.catalina.Host;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.Server;
+import org.apache.catalina.Service;
+import org.easymock.EasyMock;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Paul Ferraro
+ *
+ */
+public class BasicClusterListenerTestCase extends TestCase
+{
+ private JBossWebEventHandler eventHandler =
EasyMock.createStrictMock(JBossWebEventHandler.class);
+
+ private BasicClusterListener listener = new BasicClusterListener(this.eventHandler);
+
+ public void testDeployWebApp()
+ {
+ Host host = EasyMock.createStrictMock(Host.class);
+ LifecycleContext context = EasyMock.createStrictMock(LifecycleContext.class);
+
+ ContainerEvent event = new ContainerEvent(host, Container.ADD_CHILD_EVENT,
context);
+
+ context.addLifecycleListener(this.listener);
+ this.eventHandler.addContext(context);
+
+ EasyMock.replay(this.eventHandler, host, context);
+
+ this.listener.containerEvent(event);
+
+ EasyMock.verify(this.eventHandler, host, context);
+ EasyMock.reset(this.eventHandler, host, context);
+ }
+
+ public void testDeployHost()
+ {
+ Engine engine = EasyMock.createStrictMock(Engine.class);
+
+ ContainerEvent event = new ContainerEvent(engine, Container.ADD_CHILD_EVENT,
null);
+
+ engine.addContainerListener(this.listener);
+
+ EasyMock.replay(engine);
+
+ this.listener.containerEvent(event);
+
+ EasyMock.verify(engine);
+ EasyMock.reset(engine);
+ }
+
+ public void testUndeployWebApp()
+ {
+ Host host = EasyMock.createStrictMock(Host.class);
+ LifecycleContext context = EasyMock.createStrictMock(LifecycleContext.class);
+
+ ContainerEvent event = new ContainerEvent(host, Container.REMOVE_CHILD_EVENT,
context);
+
+ context.removeLifecycleListener(this.listener);
+ this.eventHandler.removeContext(context);
+
+ EasyMock.replay(this.eventHandler, host, context);
+
+ this.listener.containerEvent(event);
+
+ EasyMock.verify(this.eventHandler, host, context);
+ EasyMock.reset(this.eventHandler, host, context);
+ }
+
+ public void testUndeployHost()
+ {
+ Engine engine = EasyMock.createStrictMock(Engine.class);
+
+ ContainerEvent event = new ContainerEvent(engine, Container.REMOVE_CHILD_EVENT,
null);
+
+ engine.removeContainerListener(this.listener);
+
+ EasyMock.replay(engine);
+
+ this.listener.containerEvent(event);
+
+ EasyMock.verify(engine);
+ EasyMock.reset(engine);
+ }
+
+ public void testStartWebApp()
+ {
+ LifecycleContext context = EasyMock.createStrictMock(LifecycleContext.class);
+
+ LifecycleEvent event = new LifecycleEvent(context, Lifecycle.START_EVENT);
+
+ this.eventHandler.startContext(context);
+
+ EasyMock.replay(this.eventHandler);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler);
+ EasyMock.reset(this.eventHandler);
+ }
+
+ public void testStartServer()
+ {
+ LifecycleServer server = EasyMock.createStrictMock(LifecycleServer.class);
+ Service service = EasyMock.createStrictMock(Service.class);
+ LifecycleEngine engine = EasyMock.createStrictMock(LifecycleEngine.class);
+ Container container = EasyMock.createStrictMock(Container.class);
+ LifecycleContainer childContainer =
EasyMock.createStrictMock(LifecycleContainer.class);
+
+ LifecycleEvent event = new LifecycleEvent(server, Lifecycle.AFTER_START_EVENT);
+
+ this.eventHandler.init();
+
+ EasyMock.expect(server.findServices()).andReturn(new Service[] { service });
+ EasyMock.expect(service.getContainer()).andReturn(engine);
+
+ engine.addContainerListener(this.listener);
+ engine.addLifecycleListener(this.listener);
+
+ EasyMock.expect(engine.findChildren()).andReturn(new Container[] { container });
+
+ container.addContainerListener(this.listener);
+
+ EasyMock.expect(container.findChildren()).andReturn(new Container[] {
childContainer });
+
+ childContainer.addLifecycleListener(this.listener);
+
+ this.eventHandler.startServer(server);
+
+ EasyMock.replay(this.eventHandler, server, service, engine, container,
childContainer);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler, server, service, engine, container,
childContainer);
+ EasyMock.reset(this.eventHandler, server, service, engine, container,
childContainer);
+ }
+
+ public void testStopWebApp()
+ {
+ LifecycleContext context = EasyMock.createStrictMock(LifecycleContext.class);
+
+ LifecycleEvent event = new LifecycleEvent(context, Lifecycle.STOP_EVENT);
+
+ this.eventHandler.stopContext(context);
+
+ EasyMock.replay(this.eventHandler);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler);
+ EasyMock.reset(this.eventHandler);
+ }
+
+ public void testStopServer()
+ {
+ LifecycleServer server = EasyMock.createStrictMock(LifecycleServer.class);
+ Service service = EasyMock.createStrictMock(Service.class);
+ LifecycleEngine engine = EasyMock.createStrictMock(LifecycleEngine.class);
+ Container container = EasyMock.createStrictMock(Container.class);
+ LifecycleContainer childContainer =
EasyMock.createStrictMock(LifecycleContainer.class);
+
+ LifecycleEvent event = new LifecycleEvent(server, Lifecycle.STOP_EVENT);
+
+ EasyMock.expect(server.findServices()).andReturn(new Service[] { service });
+ EasyMock.expect(service.getContainer()).andReturn(engine);
+
+ engine.removeContainerListener(this.listener);
+ engine.removeLifecycleListener(this.listener);
+
+ EasyMock.expect(engine.findChildren()).andReturn(new Container[] { container });
+
+ container.removeContainerListener(this.listener);
+
+ EasyMock.expect(container.findChildren()).andReturn(new Container[] {
childContainer });
+
+ childContainer.removeLifecycleListener(this.listener);
+
+ this.eventHandler.stopServer(server);
+ this.eventHandler.shutdown();
+
+ EasyMock.replay(this.eventHandler, server, service, engine, container,
childContainer);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler, server, service, engine, container,
childContainer);
+ EasyMock.reset(this.eventHandler, server, service, engine, container,
childContainer);
+ }
+
+ public void testPeriodicEvent()
+ {
+ LifecycleEngine engine = EasyMock.createStrictMock(LifecycleEngine.class);
+
+ LifecycleEvent event = new LifecycleEvent(engine, Lifecycle.PERIODIC_EVENT);
+
+ // Test uninitialized
+ EasyMock.replay(this.eventHandler);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler);
+ EasyMock.reset(this.eventHandler);
+
+ // Init
+ this.testStartServer();
+
+ // Test initialized
+ this.eventHandler.status(engine);
+
+ EasyMock.replay(this.eventHandler);
+
+ this.listener.lifecycleEvent(event);
+
+ EasyMock.verify(this.eventHandler);
+ EasyMock.reset(this.eventHandler);
+ }
+
+ interface LifecycleContext extends Lifecycle, Context
+ {
+ }
+
+ interface LifecycleServer extends Lifecycle, Server
+ {
+ }
+
+ interface LifecycleEngine extends Lifecycle, Engine
+ {
+ }
+
+ interface LifecycleContainer extends Lifecycle, Container
+ {
+ }
+}