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>
+