Sorry, should have read the whole thread - I missed the fact you don't have
control of FooBar.
You're probably right, session scope is probably the easiest, although you
could do this by creating a FooBarWrapper using the WrapDynaBean (needs
BeanUtils 1.7.0 to use the getInstance() method).
The following class should work:
a) create warpper for existing FooBar
FooBarWrapper wrapper = new FooBarWrapper(fooBar);
b) Retrieve FooBar from populated wrapper and clean up
FooBar fooBar = (FooBar)wrapper.getInstance();:
wrapper.clear();
import java.util.List;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.commons.beanutils.WrapDynaBean;
public class FooBarWrapper extends WrapDynaBean {
private List wrapperList = new ArrayList();
public FooBarWrapper() {
super(new FooBar());
}
public FooBarWrapper(FooBar fooBar) {
super(fooBar);
Collection fooBars = fooBar.getFooBars();
if (fooBars != null) {
Iterator iterator = fooBars.iterator();
while (iterator.hasNext()) {
wrapperList.add(new FooBarWrapper((FooBar)iterator.next()));
}
}
}
public Object get(String name) {
if ("fooBars".equals(name)) {
return wrapperList;
}
return super.get(name);
}
public Object get(String name, int index) {
if ("fooBars".equals(name)) {
if (wrapperList.size() <= index) {
while (wrapperList.size() <= index) {
FooBarWrapper childWrapper = new FooBarWrapper();
wrapperList.add(childWrapper);
FooBar childFooBar = (FooBar)childWrapper.getInstance();
FooBar fooBar = (FooBar)getInstance();
if (fooBar.getFooBars() == null) {
fooBar.setFooBars(new ArrayList());
}
fooBar.getFooBars().add(childFooBar);
}
}
return wrapperList.get(index);
}
return super.get(name, index);
}
public void clear() {
for (int i = 0; i < wrapperList.size(); i++) {
FooBarWrapper wrapper = (FooBarWrapper)wrapperList.get(i);
wrapper.clear();
}
instance = null;
wrapperList.clear();
wrapperList = null;
}
public String toString() {
return getInstance().toString();
}
}
----- Original Message -----
From: "Rick Reumann" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Thursday, September 16, 2004 5:45 AM
Subject: Re: Think I'm stuck with using Session scope for this..unless a
better idea?
> Niall Pemberton wrote the following on 9/16/2004 12:41 AM:
>
> > "I don't see how this is going to work though. The problem is I'm
getting
> > back an Object (the FooBar one) from the back end that has the nested
> > collections inside. This isn't a Struts object (not of type
ActionForm)."
>
> I guess what meant was the object I'm dealing with is "handed" to me.
> It's not an object that I have that much control of since it's coming
> from the business layer (not coded by me) so not sure I can say "start
> implmenting lazyList stuff in there.
>
> >
> > Hadn't really been following this thread, but isn't the trick to getting
> > round the BeanUtils issue all in the getFooBar(index) method. I don't
use
> > LazyList, but if it was an array - wouldn't something like the following
> > work
> >
> > private FooBar[] fooBars;
> >
> > public FooBar getFooBar(int index) {
>
> The problem is there are not getXXX(int index) methods in the business
> objects. The initial post mentions I'm stuffing one object into my form:
>
> class MyForm extends ActionForm {
> private FooBarValueObject fooBar;
> //get/set fooBar
> }
>
> FooBarValueObject has a few properties but the main one of interest being:
> Collection fooBars;
>
> Which end up being Collections of other FooBarValueObjects.
>
> It's not a big deal. I'm just going to use Session scope. If performance
> becomes an issue I'll work on some listner thing that Michael talked
> about that cleans it up. (I've actually yet run into a case where
> keepign stuff in a User's Session caused serious memory problems... then
> again I'm not working on Amazon.com or anything:)
>
> >
> > if (fooBars == null) {
> > fooBars = new FooBar[index];
> > }
> >
> > if (fooBars.length <= index) {
> > FooBar[] newFooBars = new FooBar[index + 1];
> > System.arraycopy(foobars, 0, newFooBars, 0, fooBars.length);
> > fooBars = newFooBars;
> > }
> >
> > if (fooBars[index] == null) {
> > fooBars[index] = new FooBar();
> > }
> >
> > return fooBars[index];
> >
> > }
>
> --
> Rick
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]