You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by db...@apache.org on 2008/09/29 22:19:08 UTC

svn commit: r700238 [3/4] - in /geronimo/sandbox/failover: ./ grinder-3.0.1/ grinder-3.0.1/bin/ grinder-3.0.1/contrib/ grinder-3.0.1/contrib/mq/ grinder-3.0.1/etc/ grinder-3.0.1/examples/ grinder-3.0.1/examples/.grinder/ grinder-3.0.1/lib/ grinder-3.0....

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/cookies.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/cookies.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/cookies.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/cookies.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,74 @@
+# HTTP cookies
+#
+# HTTP example which shows how to access HTTP cookies.
+#
+# The HTTPClient library handles cookie interaction and removes the
+# cookie headers from responses. If you want to access these cookies,
+# one way is to define your own CookiePolicyHandler. This script defines
+# a CookiePolicyHandler that simply logs all cookies that are sent or
+# received.
+#
+# The script also demonstrates how to query what cookies are cached for
+# the current thread, and how add and remove cookies from the cache.
+#
+# If you really want direct control over the cookie headers, you
+# can disable the automatic cookie handling with:
+#    HTTPPluginControl.getConnectionDefaults().useCookies = 0
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest, HTTPPluginControl
+from HTTPClient import Cookie, CookieModule, CookiePolicyHandler
+from java.util import Date
+
+log = grinder.logger.output
+
+# Set up a cookie handler to log all cookies that are sent and received.
+class MyCookiePolicyHandler(CookiePolicyHandler):
+    def acceptCookie(self, cookie, request, response):
+        log("accept cookie: %s" % cookie)
+        return 1
+
+    def sendCookie(self, cookie, request):
+        log("send cookie: %s" % cookie)
+        return 1
+
+CookieModule.setCookiePolicyHandler(MyCookiePolicyHandler())
+
+test1 = Test(1, "Request resource")
+request1 = test1.wrap(HTTPRequest())
+
+
+class TestRunner:
+    def __call__(self):
+        # The cache of cookies for each  worker thread will be reset at
+        # the start of each run.
+
+        result = request1.GET("http://localhost:7001/console/?request1")
+
+        # If the first response set any cookies for the domain,
+        # they willl be sent back with this request.
+        result2 = request1.GET("http://localhost:7001/console/?request2")
+
+        # Now let's add a new cookie.
+        threadContext = HTTPPluginControl.getThreadHTTPClientContext()
+
+        expiryDate = Date()
+        expiryDate.year += 10
+
+        cookie = Cookie("key", "value","localhost", "/", expiryDate, 0)
+
+        CookieModule.addCookie(cookie, threadContext)
+
+        result = request1.GET("http://localhost:7001/console/?request3")
+
+        # Get all cookies for the current thread and write them to the log
+        cookies = CookieModule.listAllCookies(threadContext)
+        for c in cookies: log("retrieved cookie: %s" % c)
+
+        # Remove any cookie that isn't ours.
+        for c in cookies:
+            if c != cookie: CookieModule.removeCookie(c, threadContext)
+
+        result = request1.GET("http://localhost:7001/console/?request4")
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/ejb.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/ejb.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/ejb.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/ejb.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,63 @@
+# Enterprise Java Beans
+#
+# Exercise a stateful session EJB from the BEA WebLogic Server 7.0
+# examples. Additionally this script demonstrates the use of the
+# ScriptContext sleep(), getThreadId() and getRunNumber() methods.
+#
+# Before running this example you will need to add the EJB client
+# classes to your CLASSPATH.
+
+from java.lang import String
+from java.util import Properties,Random
+from javax.naming import Context,InitialContext
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from weblogic.jndi import WLInitialContextFactory
+
+tests = {
+    "home" : Test(1, "TraderHome"),
+    "trade" : Test(2, "Trader buy/sell"),
+    "query" : Test(3, "Trader getBalance"),
+    }
+
+# Initial context lookup for EJB home.
+p = Properties()
+p[Context.INITIAL_CONTEXT_FACTORY] = WLInitialContextFactory.name
+
+home = InitialContext(p).lookup("ejb20-statefulSession-TraderHome")
+homeTest = tests["home"].wrap(home)
+
+random = Random()
+
+class TestRunner:
+    def __call__(self):
+        log = grinder.logger.output
+
+        trader = homeTest.create()
+
+        tradeTest = tests["trade"].wrap(trader)
+
+        stocksToSell = { "BEAS" : 100, "MSFT" : 999 }
+        for stock, amount in stocksToSell.items():
+            tradeResult = tradeTest.sell("John", stock, amount)
+            log("Result of tradeTest.sell(): %s" % tradeResult)
+
+        grinder.sleep(100)              # Idle a while
+
+        stocksToBuy = { "BEAS" : abs(random.nextInt()) % 1000 }
+        for stock, amount in stocksToBuy.items():
+            tradeResult = tradeTest.buy("Phil", stock, amount)
+            log("Result of tradeTest.buy(): %s" % tradeResult)
+
+        queryTest = tests["query"].wrap(trader)
+        balance = queryTest.getBalance()
+        log("Balance is $%.2f" % balance)
+
+        trader.remove()                 # We don't record the remove() as a test
+
+        # Can obtain information about the thread context...
+        if grinder.threadID == 0 and grinder.runNumber == 0:
+            # ...and navigate from the proxy back to the test
+            d = queryTest.__test__
+            log("Query test is test %d, (%s)" % (d.number, d.description))
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/email.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/email.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/email.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/email.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,50 @@
+# Email
+#
+# Send email using Java Mail (http://java.sun.com/products/javamail/)
+#
+# This Grinder Jython script should only be used for legal email test
+# traffic generation within a lab testbed environment. Anyone using
+# this script to generate SPAM or other unwanted email traffic is
+# violating the law and should be exiled to a very bad place for a
+# very long time.
+#
+# Copyright (C) 2004 Tom Pittard
+# Copyright (C) 2004 Philip Aston
+# Distributed under the terms of The Grinder license.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+
+from java.lang import System
+from javax.mail import Message, Session
+from javax.mail.internet import InternetAddress, MimeMessage
+
+
+emailSendTest1 = Test(1, "Email Send Engine")
+
+class TestRunner:
+    def __call__(self):
+        smtpHost = "mailhost"
+
+        properties = System.getProperties()
+        properties["mail.smtp.host"] = smtpHost
+        session = Session.getInstance(System.getProperties())
+        session.debug = 1
+
+        message = MimeMessage(session)
+        message.setFrom(InternetAddress("TheGrinder@yourtestdomain.net"))
+        message.addRecipient(Message.RecipientType.TO,
+                             InternetAddress("you@yourtestdomain.net"))
+        message.subject = "Test email %s from thread %s" % (grinder.runNumber,
+                                                            grinder.threadID)
+
+        # One could vary this by pointing to various files for content
+        message.setText("SMTPTransport Email works from The Grinder!")
+
+        # Wrap transport object in a Grinder Jython Test Wrapper
+        transport = emailSendTest1.wrap(session.getTransport("smtp"))
+
+        transport = emailSendTest1.wrap(transport)
+        transport.connect(smtpHost, "username", "password")
+        transport.send(message)
+        transport.close()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/fba.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/fba.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/fba.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/fba.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,48 @@
+# HTTP/J2EE form based authentication
+#
+# A more complex HTTP example based on an authentication conversation
+# with the server. This script demonstrates how to follow different
+# paths based on a response returned by the server and how to post
+# HTTP form data to a server.
+#
+# The J2EE Servlet specification defines a common model for form based
+# authentication. When unauthenticated users try to access a protected
+# resource, they are challenged with a logon page. The logon page
+# contains a form that POSTs username and password fields to a special
+# j_security_check page.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest
+from HTTPClient import NVPair
+
+protectedResourceTest = Test(1, "Request resource")
+authenticationTest = Test(2, "POST to j_security_check")
+
+class TestRunner:
+    def __call__(self):
+        request = protectedResourceTest.wrap(
+            HTTPRequest(url="http://localhost:7001/console"))
+
+        result = request.GET()
+
+        result = maybeAuthenticate(result)
+
+        result = request.GET()
+
+# Function that checks the passed HTTPResult to see whether
+# authentication is necessary. If it is, perform the authentication
+# and record performance information against Test 2.
+def maybeAuthenticate(lastResult):
+    if lastResult.statusCode == 401 \
+    or lastResult.text.find("j_security_check") != -1:
+
+        grinder.logger.output("Challenged, authenticating")
+
+        authenticationFormData = ( NVPair("j_username", "weblogic"),
+                                   NVPair("j_password", "weblogic"),)
+
+        request = authenticationTest.wrap(
+            HTTPRequest(url="%s/j_security_check" % lastResult.originalURI))
+
+        return request.POST(authenticationFormData)

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/form.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/form.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/form.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/form.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,30 @@
+# HTTP multipart form submission
+#
+# This script uses the HTTPClient.Codecs class to post itself to the
+# server as a multi-part form. Thanks to Marc Gemis.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest
+from HTTPClient import Codecs, NVPair
+from jarray import zeros
+
+test1 = Test(1, "Upload Image")
+request1 = test1.wrap(HTTPRequest(url="http://localhost:7001/"))
+
+class TestRunner:
+    def __call__(self):
+
+        files = ( NVPair("self", "form.py"), )
+        parameters = ( NVPair("run number", str(grinder.runNumber)), )
+
+        # This is the Jython way of creating an NVPair[] Java array
+        # with one element.
+        headers = zeros(1, NVPair)
+
+        # Create a multi-part form encoded byte array.
+        data = Codecs.mpFormDataEncode(parameters, files, headers)
+        grinder.logger.output("Content type set to %s" % headers[0].value)
+
+        # Call the version of POST that takes a byte array.
+        result = request1.POST("/upload", data, headers)

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/grinder.properties
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/grinder.properties?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/grinder.properties (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/grinder.properties Mon Sep 29 13:19:05 2008
@@ -0,0 +1,38 @@
+#
+# Example grinder.properties
+#
+
+grinder.processes=1
+grinder.threads=1
+grinder.runs=1
+
+#grinder.useConsole=false
+
+grinder.logDirectory=log
+grinder.numberOfOldLogs=2
+
+#grinder.initialSleepTime=500
+#grinder.sleepTimeFactor=0.01
+#grinder.sleepTimeVariation=0.005
+
+grinder.script=helloworld.py
+#grinder.script=http.py
+#grinder.script=scenario.py
+#grinder.script=fba.py
+#grinder.script=cookies.py
+#grinder.script=form.py
+#grinder.script=ejb.py
+#grinder.script=jdbc.py
+#grinder.script=amazon.py
+#grinder.script=jaxrpc.py
+#grinder.script=helloworldfunctions.py
+#grinder.script=statistics.py
+#grinder.script=jmssender.py
+#grinder.script=jmsreceiver.py
+#grinder.script=console.py
+#grinder.script=scriptlifecycle.py
+#grinder.script=httpunit.py
+#grinder.script=email.py
+#grinder.script=composite.py
+#grinder.script=proportion.py
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/helloworld.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/helloworld.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/helloworld.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/helloworld.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,33 @@
+# Hello World
+#
+# A minimal script that tests The Grinder logging facility.
+#
+# This script shows the recommended style for scripts, with a
+# TestRunner class. The script is executed just once by each worker
+# process and defines the TestRunner class. The Grinder creates an
+# instance of TestRunner for each worker thread, and repeatedly calls
+# the instance for each run of that thread.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+
+# A shorter alias for the grinder.logger.output() method.
+log = grinder.logger.output
+
+# Create a Test with a test number and a description. The test will be
+# automatically registered with The Grinder console if you are using
+# it.
+test1 = Test(1, "Log method")
+
+# Wrap the log() method with our Test and call the result logWrapper.
+# Calls to logWrapper() will be recorded and forwarded on to the real
+# log() method.
+logWrapper = test1.wrap(log)
+
+# A TestRunner instance is created for each thread. It can be used to
+# store thread-specific data.
+class TestRunner:
+
+    # This method is called for every run.
+    def __call__(self):
+        logWrapper("Hello World")

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/helloworldfunctions.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/helloworldfunctions.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/helloworldfunctions.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/helloworldfunctions.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,22 @@
+# Hello World, with functions
+#
+# The Hello World example re-written using functions.
+#
+# In previous examples we've defined TestRunner as a class; calling
+# the class creates an instance and calling that instance invokes its
+# __call__ method. This script is for the Luddites amongst you and
+# shows how The Grinder engine is quite happy as long as the script
+# creates a callable thing called TestRunner that can be called to
+# create another callable thing.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+
+test1 = Test(1, "Log method")
+logTest = test1.wrap(grinder.logger.output)
+
+def doRun():
+    logTest("Hello World")
+
+def TestRunner():
+    return doRun

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/http.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/http.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/http.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/http.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,31 @@
+# Simple HTTP example
+#
+# A simple example using the HTTP plugin that shows the retrieval of a
+# single page via HTTP. The resulting page is written to a file.
+#
+# More complex HTTP scripts are best created with the TCPProxy.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest
+
+test1 = Test(1, "Request resource")
+request1 = test1.wrap(HTTPRequest())
+
+class TestRunner:
+    def __call__(self):
+        result = request1.GET("http://localhost:7001/")
+
+        # result is a HTTPClient.HTTPResult. We get the message body
+        # using the getText() method.
+        writeToFile(result.text)
+
+# Utility method that writes the given string to a uniquely named file
+# using a FilenameFactory.
+def writeToFile(text):
+    filename = grinder.getFilenameFactory().createFilename(
+        "page", "-%d.html" % grinder.runNumber)
+
+    file = open(filename, "w")
+    print >> file, text
+    file.close()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/httpg2.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/httpg2.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/httpg2.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/httpg2.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,162 @@
+# Script for The Grinder 3 that runs Grinder 2 HTTP test scripts.
+
+# Copy http-g2.py to the same directory as an existing Grinder 2
+# grinder.properties. Add "grinder.script=http-g2.py" to the
+# properties file, update the name of the "grinder.cycles" property to
+# "grinder.runs", "grinder.thread.sleepTimeFactor" to
+# "grinder.sleepTime" and so on. Then use The Grinder 3 to execute the
+# script.
+
+# Some caveats: This script has not been fully tested. I'm not
+# interested in reproducing every nuance of The Grinder 2 HTTP plugin.
+# The script is complex - normal HTTP scripts for The Grinder 3 are
+# much simpler. Nethertheless it may be useful for those moving from
+# The Grinder 2 to The Grinder 3.
+
+# The following Grinder 2 parameters/features are not supported:
+#   useHTTPClient                              (always true)
+#   useCookiesVersionString
+#   String beans
+
+
+# TODO:
+# What to do about errors
+# Control M's in logged data
+# Timing vs G2
+
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest
+from HTTPClient import NVPair
+
+pluginParameters = grinder.properties.getPropertySubset("grinder.plugin.parameter.")
+
+# Parse global parameters.
+control = HTTPPluginControl.getConnectionDefaults()
+control.followRedirects = pluginParameters.getBoolean("followRedirects", 0)
+control.useCookies = pluginParameters.getBoolean("useCookies", 1)
+logHTML = pluginParameters.getBoolean("logHTML", 0)
+
+if pluginParameters["disablePersistentConnections"]:
+    control.defaultHeaders = ( NVPair("Connection", "close"), )
+
+
+class G2HTTPTest:
+    """Parses parameters for an individual test and wraps the test
+    invocation in a G3 Test."""
+
+    def __init__(self, testNumber, properties):
+        self.sleepTime = properties["sleepTime"]
+
+        headers = []
+        seenContentType = 0
+
+        for e in properties.getPropertySubset("parameter.header.").entrySet():
+            headers.append(NVPair(e.key, e.value))
+            if not seenContentType and e.key.lower() == "content-type":
+                seenContentType = 1
+
+        postDataFilename = properties["parameter.post"]
+
+        if postDataFilename:
+            file = open(postDataFilename)
+            self.postData = file.read()
+            file.close()
+
+            if not seenContentType:
+                headers.append(NVPair("Content-type",
+                                      "application/x-www-form-urlencoded"))
+
+        else: self.postData = None
+
+        self.okString = properties["parameter.ok"]
+        self.url = properties["parameter.url"]
+
+        realm = properties["basicAuthenticationRealm"]
+        user = properties["basicAuthenticationUser"]
+        password = properties["basicAuthenticationPassword"]
+
+        if realm and user and password:
+            self.basicAuthentication = (realm, user, password)
+
+        elif not realm and not user and not password:
+            self.basicAuthentication = None
+
+        else:
+            raise "If you specify one of { basicAuthenticationUser, basicAuthenticationRealm, basicAuthenticationPassword } you must specify all three."
+
+        request = HTTPRequest(headers=headers)
+        self.test = Test(testNumber, properties["description"])
+        self.request = self.test.wrap(request)
+
+    def doTest(self, iteration):
+
+        if self.basicAuthentication:
+            connection = HTTPPluginControl.getThreadConnection(self.url)
+
+            connection.addBasicAuthorization(self.basicAuthentication[0],
+                                             self.basicAuthentication[1],
+                                             self.basicAuthentication[2])
+
+        grinder.statistics.delayReports = 1
+
+        if self.postData:
+            page = self.request.POST(self.url, self.postData).text
+        else:
+            page = self.request.GET(self.url).text
+
+        if not page:
+            error = self.okString
+        else:
+            error = self.okString and page.find(self.okString) == -1
+
+            if error or logHTML:
+                if self.test.description:
+                    description = "_%s" % self.test.description
+                else:
+                    description = ""
+
+                filename = grinder.filenameFactory.createFilename(
+                    "page",
+                    "_%d_%.3d%s" % (iteration, self.test.number, description))
+
+                file = open(filename, "w")
+                print >> file, page
+                file.close()
+
+                if error:
+                    grinder.logger.error(
+                        "The 'ok' string ('%s') was not found in the page "
+                        "received. The output has been written to '%s'." %
+                        (self.okString, filename))
+
+        if error:
+            grinder.statistics.forLastTest.success = 0
+
+        if self.sleepTime:
+            grinder.sleep(long(self.sleepTime))
+
+# Parse per-test parameters.
+testProperties = grinder.properties.getPropertySubset("grinder.test")
+tests = {}
+
+for e in testProperties.entrySet():
+    n = int(e.key.split('.')[0])
+
+    if not tests.get(n):
+        tests[n] = G2HTTPTest(n, testProperties.getPropertySubset("%s." % n))
+
+sortedTests = tests.items()
+sortedTests.sort()
+
+# Our TestRunner simply iterates over the tests for each run.
+class TestRunner:
+    def __init__(self):
+        self.iteration = 0
+
+    def __call__(self):
+        for testNumber,g2HTTPTest in sortedTests:
+            g2HTTPTest.doTest(self.iteration)
+
+        self.iteration += 1

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/httpunit.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/httpunit.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/httpunit.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/httpunit.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,42 @@
+# Using The Grinder with other test frameworks
+#
+# Example showing how The Grinder can be used with HTTPUnit.
+#
+# Copyright (C) 2003, 2004 Tony Lodge
+# Copyright (C) 2004 Philip Aston
+# Distributed under the terms of The Grinder license.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+
+from com.zaplet.test.frontend.http import HttpTest
+
+# These correspond to method names on the test class.
+testNames = [ "testRedirect",
+              "testRefresh",
+              "testNegativeLogin",
+              "testLogin",
+              "testPortal",
+              "testHeader",
+              "testAuthoringLink",
+              "testTemplateDesign",
+              "testSearch",
+              "testPreferences",
+              "testAboutZaplet",
+              "testHelp",
+              "testLogoutLink",
+              "testNavigationFrame",
+              "testBlankFrame",
+              "testContentFrame",
+              "testLogout", ]
+
+tests = [Test(i, name).wrap(HttpTest(name))
+         for name, i in zip(testNames, range(len(testNames)))]
+
+# A TestRunner instance is created for each thread. It can be used to
+# store thread-specific data.
+class TestRunner:
+    def __call__(self):
+        for t in tests:
+            result = t.run()
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/jaxrpc.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/jaxrpc.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/jaxrpc.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/jaxrpc.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,25 @@
+# JAX-RPC Web Service
+#
+# Exercise a basic Web Service from the BEA WebLogic Server 7.0
+# examples.
+#
+# Before running this example you will need to add the generated
+# JAX-RPC client classes and webserviceclient.jar to your CLASSPATH.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from examples.webservices.basic.javaclass import HelloWorld_Impl
+from java.lang import System
+
+System.setProperty( "javax.xml.rpc.ServiceFactory",
+ "weblogic.webservice.core.rpc.ServiceFactoryImpl")
+
+webService = HelloWorld_Impl("http://localhost:7001/basic_javaclass/HelloWorld?WSDL")
+
+port  = webService.getHelloWorldPort()
+portTest = Test(1, "JAXP Port test").wrap(port)
+
+class TestRunner:
+    def __call__(self):
+        result = portTest.sayHello(grinder.threadID, grinder.grinderID)
+        grinder.logger.output("Got '%s'" % result)

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/jdbc.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/jdbc.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/jdbc.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/jdbc.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,58 @@
+# Grinding a database with JDBC
+#
+# Some simple database playing with JDBC.
+#
+# To run this, set the Oracle login details appropriately and add the
+# Oracle thin driver classes to your CLASSPATH.
+
+from java.sql import DriverManager
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from oracle.jdbc import OracleDriver
+
+test1 = Test(1, "Database insert")
+test2 = Test(2, "Database query")
+
+# Load the Oracle JDBC driver.
+DriverManager.registerDriver(OracleDriver())
+
+def getConnection():
+    return DriverManager.getConnection(
+        "jdbc:oracle:thin:@127.0.0.1:1521:mysid", "wls", "wls")
+
+def ensureClosed(object):
+    try: object.close()
+    except: pass
+
+# One time initialisation that cleans out old data.
+connection = getConnection()
+statement = connection.createStatement()
+
+try: statement.execute("drop table grinder_fun")
+except: pass
+
+statement.execute("create table grinder_fun(thread number, run number)")
+
+ensureClosed(statement)
+ensureClosed(connection)
+
+class TestRunner:
+    def __call__(self):
+        connection = None
+        statement = None
+
+        try:
+            connection = getConnection()
+            statement = connection.createStatement()
+
+            testInsert = test1.wrap(statement)
+            testInsert.execute("insert into grinder_fun values(%d, %d)" %
+                               (grinder.threadID, grinder.runNumber))
+
+            testQuery = test2.wrap(statement)
+            testQuery.execute("select * from grinder_fun where thread=%d" %
+                              grinder.threadID)
+
+        finally:
+            ensureClosed(statement)
+            ensureClosed(connection)

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/jmsreceiver.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/jmsreceiver.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/jmsreceiver.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/jmsreceiver.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,112 @@
+# Java Message Service - Queue Receiver
+#
+# JMS objects are looked up and messages are created once during
+# initialisation. This default JNDI names are for the WebLogic Server
+# 7.0 examples domain - change accordingly.
+#
+# Each worker thread:
+#  - Creates a queue session
+#  - Receives ten messages
+#  - Closes the queue session
+#
+# This script demonstrates the use of The Grinder statistics API to
+# record a "delivery time" custom statistic.
+#
+# Copyright (C) 2003, 2004, 2005, 2006 Philip Aston
+# Copyright (C) 2005 Dietrich Bollmann
+# Distributed under the terms of The Grinder license.
+
+from java.lang import System
+from java.util import Properties
+from javax.jms import MessageListener, Session
+from javax.naming import Context, InitialContext
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from threading import Condition
+from weblogic.jndi import WLInitialContextFactory
+
+# Look up connection factory and queue in JNDI.
+properties = Properties()
+properties[Context.PROVIDER_URL] = "t3://localhost:7001"
+properties[Context.INITIAL_CONTEXT_FACTORY] = WLInitialContextFactory.name
+
+initialContext = InitialContext(properties)
+
+connectionFactory = initialContext.lookup("weblogic.examples.jms.QueueConnectionFactory")
+queue = initialContext.lookup("weblogic.examples.jms.exampleQueue")
+initialContext.close()
+
+# Create a connection.
+connection = connectionFactory.createQueueConnection()
+connection.start()
+
+# Add two statistics expressions:
+# 1. Delivery time:- the mean time taken between the server sending
+#    the message and the receiver receiving the message.
+# 2. Mean delivery time:- the delivery time averaged over all tests.
+# We use the userLong0 statistic to represent the "delivery time".
+
+grinder.statistics.registerDataLogExpression("Delivery time", "userLong0")
+grinder.statistics.registerSummaryExpression(
+              "Mean delivery time",
+                        "(/ userLong0(+ timedTests untimedTests))")
+
+# We record each message receipt against a single test. The
+# test time is meaningless.
+def recordDeliveryTime(deliveryTime):
+    grinder.statistics.forCurrentTest.setValue("userLong0", deliveryTime)
+
+recordTest = Test(1, "Receive messages").wrap(recordDeliveryTime)
+
+class TestRunner(MessageListener):
+
+    def __init__(self):
+        self.messageQueue = []          # Queue of received messages not yet recorded.
+        self.cv = Condition()           # Used to synchronise thread activity.
+
+    def __call__(self):
+        log = grinder.logger.output
+
+        log("Creating queue session and a receiver")
+        session = connection.createQueueSession(0, Session.AUTO_ACKNOWLEDGE)
+
+        receiver = session.createReceiver(queue)
+        receiver.messageListener = self
+
+        # Read 10 messages from the queue.
+        for i in range(0, 10):
+
+            # Wait until we have received a message.
+            self.cv.acquire()
+            while not self.messageQueue: self.cv.wait()
+            # Pop delivery time from first message in message queue
+            deliveryTime = self.messageQueue.pop(0)
+            self.cv.release()
+
+            log("Received message")
+
+            # We record the test a here rather than in onMessage
+            # because we must do so from a worker thread.
+            recordTest(deliveryTime)
+
+        log("Closing queue session")
+        session.close()
+
+        # Rather than over complicate things with explict message
+        # acknowledgement, we simply discard any additional messages
+        # we may have read.
+        log("Received %d additional messages" % len(self.messageQueue))
+
+    # Called asynchronously by JMS when a message arrives.
+    def onMessage(self, message):
+        self.cv.acquire()
+
+        # In WebLogic Server JMS, the JMS timestamp is set by the
+        # sender session. All we need to do is ensure our clocks are
+        # synchronised...
+        deliveryTime = System.currentTimeMillis() - message.getJMSTimestamp()
+
+        self.messageQueue.append(deliveryTime)
+
+        self.cv.notifyAll()
+        self.cv.release()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/jmssender.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/jmssender.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/jmssender.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/jmssender.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,63 @@
+# Java Message Service - Queue Sender
+#
+# JMS objects are looked up and messages are created once during
+# initialisation. This default JNDI names are for the WebLogic Server
+# 7.0 examples domain - change accordingly.
+#
+# Each worker thread:
+#  - Creates a queue session
+#  - Sends ten messages
+#  - Closes the queue session
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from jarray import zeros
+from java.util import Properties, Random
+from javax.jms import Session
+from javax.naming import Context, InitialContext
+from weblogic.jndi import WLInitialContextFactory
+
+# Look up connection factory and queue in JNDI.
+properties = Properties()
+properties[Context.PROVIDER_URL] = "t3://localhost:7001"
+properties[Context.INITIAL_CONTEXT_FACTORY] = WLInitialContextFactory.name
+
+initialContext = InitialContext(properties)
+
+connectionFactory = initialContext.lookup("weblogic.examples.jms.QueueConnectionFactory")
+queue = initialContext.lookup("weblogic.examples.jms.exampleQueue")
+initialContext.close()
+
+# Create a connection.
+connection = connectionFactory.createQueueConnection()
+connection.start()
+
+random = Random()
+
+def createBytesMessage(session, size):
+    bytes = zeros(size, 'b')
+    random.nextBytes(bytes)
+    message = session.createBytesMessage()
+    message.writeBytes(bytes)
+    return message
+
+class TestRunner:
+    def __call__(self):
+        log = grinder.logger.output
+
+        log("Creating queue session")
+        session = connection.createQueueSession(0, Session.AUTO_ACKNOWLEDGE)
+
+        sender = session.createSender(queue)
+        instrumentedSender = Test(1, "Send a message").wrap(sender)
+
+        message = createBytesMessage(session, 100)
+
+        log("Sending ten messages")
+
+        for i in range(0, 10):
+            instrumentedSender.send(message)
+            grinder.sleep(100)
+
+        log("Closing queue session")
+        session.close()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/parallel.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/parallel.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/parallel.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/parallel.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,30 @@
+# Run test scripts in parallel
+#
+# Run TestScript1 in 50% of threads, TestScript2 in 25% of threads,
+# and TestScript3 in 25% of threads.
+
+from net.grinder.script.Grinder import grinder
+
+scripts = ["TestScript1", "TestScript2", "TestScript3"]
+
+# Ensure modules are initialised in the process thread.
+for script in scripts: exec("import %s" % script)
+
+def createTestRunner(script):
+    exec("x = %s.TestRunner()" % script)
+    return x
+
+class TestRunner:
+    def __init__(self):
+        tid = grinder.threadID
+
+        if tid % 4 == 2:
+            self.testRunner = createTestRunner(scripts[1])
+        elif tid % 4 == 3:
+            self.testRunner = createTestRunner(scripts[2])
+        else:
+            self.testRunner = createTestRunner(scripts[0])
+
+    # This method is called for every run.
+    def __call__(self):
+        self.testRunner()
\ No newline at end of file

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/proportion.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/proportion.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/proportion.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/proportion.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,28 @@
+# Run TestScript1 in 50% of threads, TestScript2 in 25% of threads,
+# and TestScript3 in 25% of threads.
+
+from net.grinder.script.Grinder import grinder
+
+scripts = ["TestScript1", "TestScript2", "TestScript3"]
+
+# Ensure modules are initialised in the process thread.
+for script in scripts: exec("import %s" % script)
+
+def createTestRunner(script):
+    exec("x = %s.TestRunner()" % script)
+    return x
+
+class TestRunner:
+    def __init__(self):
+        tid = grinder.threadID
+
+        if tid % 4 == 2:
+            self.testRunner = createTestRunner(scripts[1])
+        elif tid % 4 == 3:
+            self.testRunner = createTestRunner(scripts[2])
+        else:
+            self.testRunner = createTestRunner(scripts[0])
+    
+    # This method is called for every run.
+    def __call__(self):
+        self.testRunner()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/scenario.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/scenario.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/scenario.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/scenario.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,23 @@
+# Recording many HTTP interactions as one test
+#
+# This example shows how many HTTP interactions can be grouped as a
+# single test by wrapping them in a function.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest
+from HTTPClient import NVPair
+
+# We declare a default URL for the HTTPRequest.
+request = HTTPRequest(url = "http://localhost:7001")
+
+def page1():
+    request.GET('/console')
+    request.GET('/console/login/LoginForm.jsp')
+    request.GET('/console/login/bea_logo.gif')
+
+page1Test = Test(1, "First page").wrap(page1)
+
+class TestRunner:
+    def __call__(self):
+        page1Test()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/scriptlifecycle.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/scriptlifecycle.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/scriptlifecycle.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/scriptlifecycle.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,57 @@
+# The script life cycle
+#
+# A script that demonstrates how the various parts of a script and
+# their effects on worker threads.
+
+# The "top level" of the script is called once for each worker
+# process. Perform any one-off initialisation here. For example,
+# import all the modules, set up shared data structures, and declare
+# all the Test objects you will use.
+
+from net.grinder.script.Grinder import grinder
+from java.lang import System
+
+# The totalNumberOfRuns variable is shared by all worker threads.
+totalNumberOfRuns = 0
+
+# An instance of the TestRunner class is created for each worker thread.
+class TestRunner:
+
+    # There's a runsForThread variable for each worker thread. This
+    # statement specifies a class-wide initial value.
+    runsForThread = 0
+
+    # The __init__ method is called once for each thread.
+    def __init__(self):
+        # There's an initialisationTime variable for each worker thread.
+        self.initialisationTime = System.currentTimeMillis()
+
+        grinder.logger.output("New thread started at time %s" %
+                              self.initialisationTime)
+
+    # The __call__ method is called once for each test run performed by
+    # a worker thread.
+    def __call__(self):
+
+        # We really should synchronise this access to the shared
+        # totalNumberOfRuns variable. See JMS receiver example for how
+        # to use the Python Condition class.
+        global totalNumberOfRuns
+        totalNumberOfRuns += 1
+
+        self.runsForThread += 1
+
+        grinder.logger.output(
+            "runsForThread=%d, totalNumberOfRuns=%d, initialisationTime=%d" %
+            (self.runsForThread, totalNumberOfRuns, self.initialisationTime))
+
+        # You can also vary behaviour based on thread ID.
+        if grinder.threadID % 2 == 0:
+            grinder.logger.output("I have an even thread ID.")
+
+    # Scripts can optionally define a __del__ method. The Grinder
+    # guarantees this will be called at shutdown once for each thread
+    # It is useful for closing resources (e.g. database connections)
+    # that were created in __init__.
+    def __del__(self):
+        grinder.logger.output("Thread shutting down")

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/sequence.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/sequence.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/sequence.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/sequence.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,29 @@
+# Run test scripts in sequence
+#
+# Scripts are defined in Python modules (helloworld.py, goodbye.py)
+# specified in grinder.properties:
+#
+#   script1=helloworld
+#   script2=goodbye
+
+from net.grinder.script.Grinder import grinder
+
+from java.util import TreeMap
+
+# TreeMap is the simplest way to sort a Java map.
+scripts = TreeMap(grinder.properties.getPropertySubset("script"))
+
+# Ensure modules are initialised in the process thread.
+for module in scripts.values(): exec("import %s" % module)
+
+def createTestRunner(module):
+    exec("x = %s.TestRunner()" % module)
+    return x
+
+class TestRunner:
+    def __init__(self):
+        self.testRunners = [createTestRunner(m) for m in scripts.values()]
+
+    # This method is called for every run.
+    def __call__(self):
+        for testRunner in self.testRunners: testRunner()

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/slowClient.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/slowClient.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/slowClient.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/slowClient.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,31 @@
+
+from net.grinder.script import Test
+from net.grinder.script.Grinder import grinder
+from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest
+from HTTPClient import NVPair
+
+requests = {}
+
+rates = (-1, 10000000, 1000000, 100000, 56000, 9600, 2400)
+
+i = 0
+
+for baud in rates:
+    requests[baud] = Test(i, "%d baud" % baud).wrap(HTTPRequest())
+    i = i + 1
+    
+
+url = "http://slashdot.org/"
+
+grinder.statistics.registerDataLogExpression("BPS", "(* 8000 (/ httpplugin.responseLength (+ (sum timedTests) (* -1 httpplugin.firstByteTime))))")
+grinder.statistics.registerSummaryExpression("BPS", "(* 8000 (/ httpplugin.responseLength (+ (sum timedTests) (* -1 httpplugin.firstByteTime))))")
+
+class TestRunner:
+    def __call__(self):
+
+        c = HTTPPluginControl.getThreadConnection(url)
+        
+        for baud in rates:
+            c.setBandwidthLimit(baud)
+            requests[baud].GET(url)
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/statistics.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/statistics.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/statistics.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/statistics.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,72 @@
+# Accessing test statistics
+#
+# Examples of using The Grinder statistics API with standard
+# statistics.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from net.grinder.plugin.http import HTTPRequest
+
+
+class TestRunner:
+    def __call__(self):
+        request = Test(1, "Basic request").wrap(
+                      HTTPRequest(url = "http://localhost:7001"))
+
+        # Example 1. You can get the time of the last test as follows.
+        result = request.GET("index.html")
+
+        grinder.logger.output("The last test took %d milliseconds" %
+                              grinder.statistics.forLastTest.time)
+
+
+        # Example 2. Normally test results are reported automatically
+        # when the test returns. If you want to alter the statistics
+        # after a test has completed, you must set delayReports = 1 to
+        # delay the reporting before performing the test. This only
+        # affects the current worker thread.
+        grinder.statistics.delayReports = 1
+
+        result = request.GET("index.html")
+
+        if grinder.statistics.forLastTest.time > 5:
+            # We set success = 0 to mark the test as a failure. The test
+            # time will be reported to the data log, but not included
+            # in the aggregate statistics sent to the console or the
+            # summary table.
+            grinder.statistics.forLastTest.success = 0
+
+        # With delayReports = 1 you can call report() to explicitly.
+        grinder.statistics.report()
+
+        # You can also turn the automatic reporting back on.
+        grinder.statistics.delayReports = 0
+
+
+        # Example 3.
+        # getForCurrentTest() accesses statistics for the current test.
+        # getForLastTest() accesses statistics for the last completed test.
+
+        def page(self):
+            resourceRequest = Test(2, "Request resource").wrap(
+                                  HTTPRequest(url = "http://localhost:7001"))
+
+            resourceRequest.GET("index.html");
+            resourceRequest.GET("foo.css");
+
+            grinder.logger.output("GET foo.css returned a %d byte body" %
+                                  grinder.statistics.forLastTest.getLong(
+                                      "httpplugin.responseLength"))
+
+            grinder.logger.output("Page has taken %d ms so far" %
+                                  grinder.statistics.forCurrentTest.time)
+
+            if grinder.statistics.forLastTest.time > 10:
+                grinder.statistics.forCurrentTest.success = 0
+
+            resourceRequest.GET("image.gif");
+
+        instrumentedPage = Test(3, "Page").wrap(page)
+
+        instrumentedPage(self)
+

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/sync.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/sync.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/sync.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/sync.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,42 @@
+from net.grinder.script.Grinder import grinder
+
+# You need to install Jython to access the threading package. See
+# http://grinder.sourceforge.net/faq.html#jython-libraries
+from threading import Condition
+
+
+# Global lock
+c = Condition()
+
+waiting = 0
+checkpointReachedForRun = -1
+numberOfThreads = int(grinder.properties["grinder.threads"])
+
+
+class TestRunner:
+    
+    # This method is called for every run.
+    def __call__(self):
+        # Declare the global variables that we update.
+        global checkpointReachedForRun, waiting
+
+        # Locking ensures only a single thread can be active (not
+        # waiting) in the section between the acquire() and the
+        # release().
+        c.acquire()
+        waiting += 1
+
+        if waiting == numberOfThreads:
+            # We're the last thread, wake everyone up.
+            checkpointReachedForRun = grinder.runNumber
+            waiting = 0            
+            c.notifyAll()
+        else:
+            while grinder.runNumber > checkpointReachedForRun: c.wait()
+
+        c.release()
+        
+        grinder.logger.output("Hello World")
+
+        # Sleep for a random amount of time around 10 seconds.
+        grinder.sleep(10000)

Added: geronimo/sandbox/failover/grinder-3.0.1/examples/xml-rpc.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/examples/xml-rpc.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/examples/xml-rpc.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/examples/xml-rpc.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,31 @@
+# XML-RPC Web Service
+#
+# A server should be running on the localhost. This script uses the
+# example from
+# http://xmlrpc-c.sourceforge.net/xmlrpc-howto/xmlrpc-howto-java-server.html
+#
+# Copyright (C) 2004 Sebastián Fontana
+# Distributed under the terms of The Grinder license.
+
+from java.util import Vector
+from java.lang import Integer
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+
+from org.apache.xmlrpc import XmlRpcClient
+
+test1 = Test(1, "XML-RPC example test")
+server_url = "http://localhost:8080/RPC2"
+
+serverWrapper = test1.wrap(XmlRpcClient(server_url))
+
+class TestRunner:
+    def __call__(self):
+        params = Vector()
+        params.addElement(Integer(6))
+        params.addElement(Integer(3))
+
+        result = serverWrapper.execute("sample.sumAndDifference", params)
+        sum = result.get("sum")
+
+        grinder.logger.output("SUM %d" % sum)

Added: geronimo/sandbox/failover/grinder-3.0.1/grinder.properties
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/grinder.properties?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/grinder.properties (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/grinder.properties Mon Sep 29 13:19:05 2008
@@ -0,0 +1,113 @@
+# The file name of the Jython script to run.
+grinder.script	grinder.py
+
+# The number of worker processes the agent should start.
+grinder.processes 2
+
+# The number of worker threads that each worker process spawns.
+grinder.threads 10
+
+# The number of runs of the test script each thread performs. 0 means "run
+# forever", and should be used when you are using the console to control your
+# test runs.
+grinder.runs 0
+
+# If set, the agent will ramp up the number of worker processes, starting the
+# number specified every grinder.processesIncrementInterval milliseconds. The
+# upper limit is set by grinder.processes.	Start all worker processes
+# together.
+#grinder.processIncrement
+
+# Used in conjunction with grinder.processIncrement, this property sets the
+# interval in milliseconds at which the agent starts new worker processes.
+#grinder.processIncrementInterval 60000 ms
+
+# Used in conjunction with grinder.processIncrement, this property sets the
+# initial number of worker processes to start.	The default value is
+# grinder.processIncrement.
+#grinder.initialProcesses
+
+# The maximum length of time in milliseconds that each worker process should
+# run for. grinder.duration can be specified in conjunction with grinder.runs,
+# in which case the worker processes will terminate if either the duration time
+# or the number of runs is exceeded.	The default is to run forever.
+#grinder.duration
+
+# Use an alternate JVM for worker processes. Defaults to java so you do not
+# need to specify this if your PATH is sensible.
+#grinder.jvm java
+
+# Use to adjust the classpath used for the worker process JVMs. Anything
+# specified here will be prepended to the classpath used to start the Grinder
+# processes.
+grinder.jvm.classpath=/Users/dblevins/work/failover/openejb-client/openejb-client-3.1-SNAPSHOT.jar:\
+  /Users/dblevins/work/failover/openejb-client/javaee-api-5.0-1.jar:\
+  /Users/dblevins/work/grinder/load-beans/target/load-beans-1.0.jar
+
+# Additional arguments to worker process JVMs.
+#grinder.jvm.arguments
+
+# Directory to write log files to. Created if it doesn't already exist.
+# Defaults to the local directory.
+grinder.logDirectory logs
+
+# The number of archived logs from previous runs that should be kept.
+grinder.numberOfOldLogs	0
+
+# Specifies the "host" string used in log filenames and logs.
+#grinder.hostID
+
+# The IP address or host name that the agent and worker processes use to
+# contact the console.
+#grinder.consoleHost
+
+# The IP port that the agent and worker processes use to contact the console.
+#grinder.consolePort 6372
+
+# Set to false to set the agent and worker processes not to use the console.
+#grinder.useConsole	true
+
+# The period at which each process sends updates to the console. This also
+# controls the frequency at which the data files are flushed.
+#grinder.reportToConsole.interval 500 ms
+
+# The maximum time in milliseconds that each thread waits before starting.
+# Unlike the sleep times specified in scripts, this is varied according to a
+# flat random distribution. The actual sleep time will be a random value
+# between 0 and the specified value. Affected by grinder.sleepTimeFactor, but
+# not grinder.sleepTimeVariation.
+#grinder.initialSleepTime 0 ms
+
+# Apply a factor to all the sleep times you've specified, either through a
+# property of in a script. Setting this to 0.1 would run the script ten times
+# as fast.
+#grinder.sleepTimeFactor 1
+
+# The Grinder varies the sleep times specified in scripts according to a Normal
+# distribution. This property specifies a fractional range within which nearly
+# all (99.75%) of the times will lie. E.g., if the sleep time is specified as
+# 1000 and the sleepTimeVariation is set to 0.1, then 99.75% of the actual
+# sleep times will be between 900 and 1100 milliseconds.
+#grinder.sleepTimeVariation 0.2
+
+# Set to false to disable the logging of output and error steams for worker
+# processes. You might want to use this to reduce the overhead of running a
+# client thread.
+#grinder.logProcessStreams true
+
+# Set to false to disable reporting of timing information to the console;
+# other statistics are still reported.
+#grinder.reportTimesToConsole true
+
+# If set to true, the agent process spawns engines in threads rather than
+# processes, using special class loaders to isolate the engines. This allows
+# the engine to be easily run in a debugger. This is primarily a tool for
+# debugging The Grinder engine, but it might also be useful to advanced users.
+#grinder.debug.singleprocess false
+
+# If set to true, System.nanoTime() is used for measuring time instead of
+# System.currentTimeMills(). The Grinder will still report times in
+# milliseconds. The precision of these methods depends on the JVM
+# implementation and the operating system. Setting to true requires J2SE 5 or
+# later.	
+#grinder.useNanoTime false

Added: geronimo/sandbox/failover/grinder-3.0.1/grinder.py
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/grinder.py?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/grinder.py (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/grinder.py Mon Sep 29 13:19:05 2008
@@ -0,0 +1,54 @@
+# Hello World
+#
+# A minimal script that tests The Grinder logging facility.
+#
+# This script shows the recommended style for scripts, with a
+# TestRunner class. The script is executed just once by each worker
+# process and defines the TestRunner class. The Grinder creates an
+# instance of TestRunner for each worker thread, and repeatedly calls
+# the instance for each run of that thread.
+
+from net.grinder.script.Grinder import grinder
+from net.grinder.script import Test
+from javax.naming import Context,InitialContext
+from java.util import Properties
+from java.lang import System
+
+# A shorter alias for the grinder.logger.output() method.
+log = grinder.logger.output
+
+tests = {
+    "ping" : Test(1, "ping"),
+    "add" : Test(2, "add"),
+    "sum" : Test(3, "sum"),
+    }
+
+# Wrap the log() method with our Test and call the result logWrapper.
+# Calls to logWrapper() will be recorded and forwarded on to the real
+# log() method.
+#logWrapper = test1.wrap(log)
+
+System.setProperty("openejb.client.requestretry", "true")
+# Initial context lookup for EJB home.
+p = Properties()
+p[Context.INITIAL_CONTEXT_FACTORY] = "org.apache.openejb.client.RemoteInitialContextFactory"
+#p[Context.PROVIDER_URL] = "http://127.0.0.1:4204/ejb";
+#p[Context.PROVIDER_URL] = "ejbd://127.0.0.1:4201";
+p[Context.PROVIDER_URL] = "multicast://239.255.2.3:6142";
+
+
+loadBean = InitialContext(p).lookup("LoadBeanRemote")
+pingBean = tests["ping"].wrap(loadBean)
+addBean = tests["add"].wrap(loadBean)
+sumBean = tests["sum"].wrap(loadBean)
+
+
+# A TestRunner instance is created for each thread. It can be used to
+# store thread-specific data.
+class TestRunner:
+
+    # This method is called for every run.
+    def __call__(self):        
+        pingBean.ping()
+        addBean.add(3, 4)
+        sumBean.sum([3, 4, 5, 6])

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-j2se5.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-j2se5.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-j2se5.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-xmlbeans.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-xmlbeans.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder-xmlbeans.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/grinder.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/grinder.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/jsr173_1.0_api.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/jsr173_1.0_api.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/jsr173_1.0_api.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/jython.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/jython.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/jython.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/picocontainer-1.3.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/picocontainer-1.3.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/picocontainer-1.3.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/lib/xbean.jar
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/lib/xbean.jar?rev=700238&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/sandbox/failover/grinder-3.0.1/lib/xbean.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-0.log
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-0.log?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-0.log (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-0.log Mon Sep 29 13:19:05 2008
@@ -0,0 +1,39 @@
+9/22/08 11:15:25 AM (process mingus.local-0): Error running worker process (Java exception initialising test script
+	File "/Users/dblevins/work/failover/grinder-3.0.1/grinder.py", line 40, in ?)
+Java exception initialising test script
+	File "/Users/dblevins/work/failover/grinder-3.0.1/grinder.py", line 40, in ?
+Caused by: javax.naming.NamingException: Cannot lookup '/LoadBeanRemote'. [Root exception is java.rmi.RemoteException: Unable to connect; nested exception is: 
+	java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142]
+	at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:239)
+	at javax.naming.InitialContext.lookup(InitialContext.java:351)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:585)
+	at org.python.core.PyReflectedFunction.__call__(Unknown Source)
+	at org.python.core.PyMethod.__call__(Unknown Source)
+	at org.python.core.PyObject.__call__(Unknown Source)
+	at org.python.core.PyInstance.invoke(Unknown Source)
+	at org.python.pycode._pyx0.f$0(/Users/dblevins/work/failover/grinder-3.0.1/grinder.py:40)
+	at org.python.pycode._pyx0.call_function(/Users/dblevins/work/failover/grinder-3.0.1/grinder.py)
+	at org.python.core.PyTableCode.call(Unknown Source)
+	at org.python.core.PyCode.call(Unknown Source)
+	at org.python.core.Py.runCode(Unknown Source)
+	at org.python.core.__builtin__.execfile_flags(Unknown Source)
+	at org.python.util.PythonInterpreter.execfile(Unknown Source)
+	at net.grinder.engine.process.jython.JythonScriptEngine.initialise(JythonScriptEngine.java:99)
+	at net.grinder.engine.process.GrinderProcess.run(GrinderProcess.java:202)
+	at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:87)
+	at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:59)
+Caused by: java.rmi.RemoteException: Unable to connect; nested exception is: 
+	java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142
+	at org.apache.openejb.client.Client.processRequest(Client.java:80)
+	at org.apache.openejb.client.Client.request(Client.java:59)
+	at org.apache.openejb.client.JNDIContext.request(JNDIContext.java:87)
+	at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:233)
+	... 20 more
+Caused by: java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142
+	at org.apache.openejb.client.StickyConnectionStrategy.connect(StickyConnectionStrategy.java:78)
+	at org.apache.openejb.client.ConnectionManager.getConnection(ConnectionManager.java:53)
+	at org.apache.openejb.client.Client.processRequest(Client.java:78)
+	... 23 more

Added: geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-1.log
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-1.log?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-1.log (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/logs/error_mingus.local-1.log Mon Sep 29 13:19:05 2008
@@ -0,0 +1,39 @@
+9/22/08 11:15:25 AM (process mingus.local-1): Error running worker process (Java exception initialising test script
+	File "/Users/dblevins/work/failover/grinder-3.0.1/grinder.py", line 40, in ?)
+Java exception initialising test script
+	File "/Users/dblevins/work/failover/grinder-3.0.1/grinder.py", line 40, in ?
+Caused by: javax.naming.NamingException: Cannot lookup '/LoadBeanRemote'. [Root exception is java.rmi.RemoteException: Unable to connect; nested exception is: 
+	java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142]
+	at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:239)
+	at javax.naming.InitialContext.lookup(InitialContext.java:351)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:585)
+	at org.python.core.PyReflectedFunction.__call__(Unknown Source)
+	at org.python.core.PyMethod.__call__(Unknown Source)
+	at org.python.core.PyObject.__call__(Unknown Source)
+	at org.python.core.PyInstance.invoke(Unknown Source)
+	at org.python.pycode._pyx0.f$0(/Users/dblevins/work/failover/grinder-3.0.1/grinder.py:40)
+	at org.python.pycode._pyx0.call_function(/Users/dblevins/work/failover/grinder-3.0.1/grinder.py)
+	at org.python.core.PyTableCode.call(Unknown Source)
+	at org.python.core.PyCode.call(Unknown Source)
+	at org.python.core.Py.runCode(Unknown Source)
+	at org.python.core.__builtin__.execfile_flags(Unknown Source)
+	at org.python.util.PythonInterpreter.execfile(Unknown Source)
+	at net.grinder.engine.process.jython.JythonScriptEngine.initialise(JythonScriptEngine.java:99)
+	at net.grinder.engine.process.GrinderProcess.run(GrinderProcess.java:202)
+	at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:87)
+	at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:59)
+Caused by: java.rmi.RemoteException: Unable to connect; nested exception is: 
+	java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142
+	at org.apache.openejb.client.Client.processRequest(Client.java:80)
+	at org.apache.openejb.client.Client.request(Client.java:59)
+	at org.apache.openejb.client.JNDIContext.request(JNDIContext.java:87)
+	at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:233)
+	... 20 more
+Caused by: java.rmi.RemoteException: Cannot connect to any servers: Server #0: multicast://239.255.2.3:6142
+	at org.apache.openejb.client.StickyConnectionStrategy.connect(StickyConnectionStrategy.java:78)
+	at org.apache.openejb.client.ConnectionManager.getConnection(ConnectionManager.java:53)
+	at org.apache.openejb.client.Client.processRequest(Client.java:78)
+	... 23 more

Added: geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-0.log
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-0.log?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-0.log (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-0.log Mon Sep 29 13:19:05 2008
@@ -0,0 +1,5 @@
+9/22/08 11:15:22 AM (process mingus.local-0): The Grinder version 3.0.1
+9/22/08 11:15:22 AM (process mingus.local-0): Apple Inc. Java HotSpot(TM) Client VM 1.5.0_13-119 on Mac OS X i386 10.5.4
+9/22/08 11:15:22 AM (process mingus.local-0): time zone is PDT (-0700)
+9/22/08 11:15:24 AM (process mingus.local-0): executing "grinder.py" using Jython 2.2.1
+9/22/08 11:15:25 AM (process mingus.local-0): ERROR ("Error running worker..."), see error log for details

Added: geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-1.log
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-1.log?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-1.log (added)
+++ geronimo/sandbox/failover/grinder-3.0.1/logs/out_mingus.local-1.log Mon Sep 29 13:19:05 2008
@@ -0,0 +1,5 @@
+9/22/08 11:15:22 AM (process mingus.local-1): The Grinder version 3.0.1
+9/22/08 11:15:22 AM (process mingus.local-1): Apple Inc. Java HotSpot(TM) Client VM 1.5.0_13-119 on Mac OS X i386 10.5.4
+9/22/08 11:15:22 AM (process mingus.local-1): time zone is PDT (-0700)
+9/22/08 11:15:24 AM (process mingus.local-1): executing "grinder.py" using Jython 2.2.1
+9/22/08 11:15:25 AM (process mingus.local-1): ERROR ("Error running worker..."), see error log for details

Added: geronimo/sandbox/failover/load-beans/load-beans.iml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/failover/load-beans/load-beans.iml?rev=700238&view=auto
==============================================================================
--- geronimo/sandbox/failover/load-beans/load-beans.iml (added)
+++ geronimo/sandbox/failover/load-beans/load-beans.iml Mon Sep 29 13:19:05 2008
@@ -0,0 +1,334 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4" relativePaths="false" type="JAVA_MODULE">
+  <component name="ModuleRootManager" />
+  <component name="NewModuleRootManager">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <exclude-output />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/junit/junit/4.1/junit-4.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/javaee-api/5.0-1/javaee-api-5.0-1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-ejbd/3.0/openejb-ejbd-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-core/3.0/openejb-core-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-loader/3.0/openejb-loader-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-javaagent/3.0/openejb-javaagent-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-jee/3.0/openejb-jee-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/com/sun/xml/bind/jaxb-impl/2.0.5/jaxb-impl-2.0.5.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/commons-cli/commons-cli/1.1/commons-cli-1.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/activemq/activemq-ra/4.1.1/activemq-ra-4.1.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/activemq/activemq-core/4.1.1/activemq-core-4.1.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/backport-util-concurrent/backport-util-concurrent/2.1/backport-util-concurrent-2.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/commons-logging/commons-logging/1.1/commons-logging-1.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/activemq/activeio-core/3.0.0-incubator/activeio-core-3.0.0-incubator.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openjpa/openjpa/1.0.1/openjpa-1.0.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/net/sourceforge/serp/serp/1.13.1/serp-1.13.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/commons-collections/commons-collections/3.2/commons-collections-3.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/geronimo/components/geronimo-connector/2.1/geronimo-connector-2.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/geronimo/components/geronimo-transaction/2.1/geronimo-transaction-2.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/objectweb/howl/howl/1.0.1-1/howl-1.0.1-1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/geronimo/javamail/geronimo-javamail_1.4_mail/1.2/geronimo-javamail_1.4_mail-1.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/xbean-reflect/3.4-r636442/xbean-reflect-3.4-r636442.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/xbean-finder/3.4-r636442/xbean-finder-3.4-r636442.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/xbean/xbean-naming/3.3/xbean-naming-3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/asm/asm/2.2.3/asm-2.2.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/asm/asm-commons/2.2.3/asm-commons-2.2.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/asm/asm-tree/2.2.3/asm-tree-2.2.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/commons-dbcp-all/1.3/commons-dbcp-all-1.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/codehaus/swizzle/swizzle-stream/1.0.1/swizzle-stream-1.0.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/wsdl4j/wsdl4j/1.6.1/wsdl4j-1.6.1.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-server/3.0/openejb-server-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///Users/dblevins/.m2/repository/org/apache/openejb/openejb-client/3.0/openejb-client-3.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntryProperties />
+  </component>
+</module>
+