Just to followup and report success: The CVS version of StrutsTestCase
fixed the problem.
Thanks Deryl and Donald!
Erik
Erik Hatcher wrote:
> All the necessary troubleshooting details were in my original e-mail. If
> you have specific questions about it, by all means ask. It would be
> very time prohibitive for me to zip up my entire development environment
> on this one.
>
> The question is: does Struts or StrutsTestCase maintain an
> Iterator/Enumeration that is active? If so, where and why?
>
> Erik
>
>
> micael wrote:
>
>> Can you zip up your code and the stack trace? I wouldn't mind looking
>> at this anyway, aside from the pressing issue.
>>
>> At 09:25 PM 9/13/2002 -0400, you wrote:
>>
>>> If you look at the stack trace though, its in the StrutsTestCase
>>> code, not mine. It happens when looping through the application
>>> scope keys to initialize the ActionServlet somehow.
>>>
>>> So, is Struts storing an interator somewhere that its leaving open?
>>> Or is StrutsTestCase? I haven't dug that far yet, and figured
>>> soliciting input from the list would be a good way to get more eyes
>>> looking into this.
>>>
>>> Erik
>>>
>>>
>>> micael wrote:
>>>
>>>> Concurrent modification exceptions are thrown when A LIST IS
>>>> MODIFIED WHILE AN INTERATOR IS IN USE. You can get some good
>>>> information on this at pp. 133 ff. of John Zukowski's "Java
>>>> Collections". I did not look at your code closely, but I am sure
>>>> you will see it right away. A gross example John offers is:
>>>> List list = new ArrayList(Arrays.asList(args)); // args from main()
>>>> Iterator i = list.iterator();
>>>> while(i.hasNext()) {
>>>> System.out.println(i.next());
>>>> list.add("Add");
>>>> }
>>>> Hope this helps.
>>>> At 07:47 PM 9/13/2002 -0400, you wrote:
>>>>
>>>>
>>>>> Erik -
>>>>>
>>>>> I'm not sure what may be causing the error, but I was wondering -
>>>>> have you
>>>>> used this code in the past or are you just developing it now? It looks
>>>>> great.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Erik Hatcher <[EMAIL PROTECTED]> on 09/13/2002
>>>>> 07:16:36
>>>>> PM
>>>>>
>>>>> Please respond to "Struts Developers List"
>>>>> <[EMAIL PROTECTED]>
>>>>>
>>>>> To: [EMAIL PROTECTED]
>>>>> cc: (bcc: Kevin Bedell/Systems/USHO/SunLife)
>>>>> Subject: StrutsTestCase / Struts 1.1b2 / Cactus -
>>>>> ConcurrentModificationException
>>>>>
>>>>>
>>>>> I'm using Struts 1.1b2 and StrutsTestCase 1.1 for Servlet 2.3 spec.
>>>>>
>>>>> Trying to run a second test case I'm getting whats immediately below.
>>>>> Any ideas on what is going wrong? I'm fairly certain its not my test
>>>>> case code or base test case additions to StrutsTestCase, but perhaps
>>>>> some nasty interaction with StrutsTestCase and Struts?
>>>>>
>>>>>
>>>>> 15:27:09,353 ERROR [STDERR] java.util.ConcurrentModificationException
>>>>> 15:27:09,363 ERROR [STDERR] at
>>>>> java.util.HashMap$HashIterator.next(HashMap.j
>>>>> ava:731)
>>>>> 15:27:09,363 ERROR [STDERR] at
>>>>> org.apache.catalina.util.Enumerator.nextEleme
>>>>> nt(Enumerator.java:166)
>>>>> 15:27:09,373 ERROR [STDERR] at
>>>>> servletunit.struts.CactusStrutsTestCase.getAc
>>>>> tionServlet(CactusStrutsTestCase.java:285)
>>>>> 15:27:09,373 ERROR [STDERR] at
>>>>> servletunit.struts.CactusStrutsTestCase.actio
>>>>> nPerform(CactusStrutsTestCase.java:349)
>>>>> 15:27:09,383 ERROR [STDERR] at
>>>>> edu.darden.alumni.contactinfo.ContactInfoTest
>>>>> .testSaveContactInfo(ContactInfoTest.java:17)
>>>>> 15:27:09,393 ERROR [STDERR] at
>>>>> java.lang.reflect.Method.invoke(Native Method
>>>>> )
>>>>> 15:27:09,403 ERROR [STDERR] at
>>>>> org.apache.cactus.AbstractTestCase.runServerT
>>>>> est(AbstractTestCase.java:332)
>>>>>
>>>>> My test case looks like this:
>>>>>
>>>>> public class ContactInfoTest extends StrutsFormTestCase {
>>>>> public void beginSaveContactInfo(WebRequest theRequest) {
>>>>> theRequest.setAuthentication(
>>>>> new BasicAuthentication("alumni", "alumni"));
>>>>> }
>>>>> public void testSaveContactInfo() throws Exception {
>>>>> setRequestPathInfo("/alumni/updateContactInfo");
>>>>> ContactInfoForm form = new ContactInfoForm();
>>>>> form.reset(); // my ValidatorForm subclass forces this
>>>>> method
>>>>> to exist
>>>>> addToParameters(form);
>>>>> actionPerform();
>>>>> verifyForward("success");
>>>>> }
>>>>>
>>>>> public ContactInfoTest(String s) {
>>>>> super(s);
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>> And my base test case is below. This could be considered a donation to
>>>>> the StrutsTestCase project, actually, although it needs to be
>>>>> generalized a bit more. It adds the ability to just set up a form bean
>>>>> rather than HTTP request parameters (and convert a bean to request
>>>>> parameters under the covers). One note: I have a BaseForm that all my
>>>>> Struts forms extend from and I've hidden the original method (made it
>>>>> final) and proxy that to the reset() method that all our forms are
>>>>> required to implement (I've yet to need the request or mapping in a
>>>>> reset method, so I took it away from implementers for now).
>>>>>
>>>>>
>>>>>
>>>>> package edu.darden.alumni.cactus;
>>>>>
>>>>> import servletunit.struts.CactusStrutsTestCase;
>>>>>
>>>>> import java.util.List;
>>>>> import java.util.ArrayList;
>>>>> import java.util.Map;
>>>>> import java.util.HashMap;
>>>>> import java.util.Iterator;
>>>>> import java.lang.reflect.InvocationTargetException;
>>>>>
>>>>> import org.apache.commons.beanutils.PropertyUtils;
>>>>> import org.apache.struts.action.ActionForm;
>>>>>
>>>>> abstract public class StrutsFormTestCase extends CactusStrutsTestCase {
>>>>> private static final List invisibleFields = new ArrayList();
>>>>> private static final List basicFields = new ArrayList();
>>>>>
>>>>> static {
>>>>> invisibleFields.add("multipartRequestHandler");
>>>>> invisibleFields.add("resultValueMap");
>>>>> invisibleFields.add("class");
>>>>> invisibleFields.add("validatorResults");
>>>>> invisibleFields.add("servletWrapper");
>>>>>
>>>>> basicFields.add("java.lang.Integer");
>>>>> basicFields.add("java.lang.String");
>>>>> basicFields.add("java.lang.Boolean");
>>>>> }
>>>>>
>>>>> private final Map getBeanMap(Object bean, String prefix) throws
>>>>> IllegalAccessException, InvocationTargetException,
>>>>> NoSuchMethodException
>>>>> {
>>>>> String thisPrefix = prefix == null ? "" : prefix + ".";
>>>>> Map map = new HashMap();
>>>>> Map flatFields = PropertyUtils.describe(bean);
>>>>> Iterator iterator = flatFields.keySet().iterator();
>>>>> while (iterator.hasNext()) {
>>>>> String key = (String) iterator.next();
>>>>> if (invisibleFields.contains(key)) {
>>>>> continue;
>>>>> }
>>>>>
>>>>> Object value = flatFields.get(key);
>>>>>
>>>>> if ((value != null) && !
>>>>> basicFields.contains(value.getClass().getName())) {
>>>>> map.putAll(getBeanMap(value, thisPrefix + key));
>>>>> }
>>>>> else {
>>>>> map.put(thisPrefix + key, value);
>>>>> }
>>>>> }
>>>>> return map;
>>>>> }
>>>>>
>>>>> /**
>>>>> * @todo Add checks for boolean/Boolean and set to "on" or
>>>>> omit if
>>>>> false
>>>>> */
>>>>> private final void addToParameters(Map map) {
>>>>> Iterator iterator = map.keySet().iterator();
>>>>> while (iterator.hasNext()) {
>>>>> String key = (String) iterator.next();
>>>>> Object value = map.get(key);
>>>>> String paramValue = "";
>>>>> if (value != null) {
>>>>> paramValue = value.toString();
>>>>> }
>>>>> System.out.println("key = " + key + " value = " +
>>>>> paramValue);
>>>>> addRequestParameter(key, paramValue);
>>>>> }
>>>>> }
>>>>>
>>>>> protected final void addToParameters(ActionForm form) throws
>>>>> Exception {
>>>>> addToParameters(getBeanMap(form, null));
>>>>> }
>>>>>
>>>>> public StrutsFormTestCase(String name) {
>>>>> super(name);
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> To unsubscribe, e-mail:
>>>>> <mailto:[EMAIL PROTECTED]>
>>>>> For additional commands, e-mail:
>>>>> <mailto:[EMAIL PROTECTED]>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------------
>>>>> This e-mail message (including attachments, if any) is intended for
>>>>> the use
>>>>> of the individual or entity to which it is addressed and may contain
>>>>> information that is privileged, proprietary , confidential and
>>>>> exempt from
>>>>> disclosure. If you are not the intended recipient, you are
>>>>> notified that
>>>>> any dissemination, distribution or copying of this communication is
>>>>> strictly prohibited. If you have received this communication in error,
>>>>> please notify the sender and erase this e-mail message immediately.
>>>>> ---------------------------------------------------------------------------
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> To unsubscribe, e-mail:
>>>>> <mailto:[EMAIL PROTECTED]>
>>>>> For additional commands, e-mail:
>>>>> <mailto:[EMAIL PROTECTED]>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> To unsubscribe, e-mail:
>>>> <mailto:[EMAIL PROTECTED]>
>>>> For additional commands, e-mail:
>>>> <mailto:[EMAIL PROTECTED]>
>>>>
>>>
>>>
>>> --
>>> To unsubscribe, e-mail:
>>> <mailto:[EMAIL PROTECTED]>
>>> For additional commands, e-mail:
>>> <mailto:[EMAIL PROTECTED]>
>>>
>>
>>
>>
>> --
>> To unsubscribe, e-mail:
>> <mailto:[EMAIL PROTECTED]>
>> For additional commands, e-mail:
>> <mailto:[EMAIL PROTECTED]>
>>
>>
>>
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>