like i said you can roll your own provider that can work with new
instances of list. it is very simple.
class mysuperprovider implements idataprovider {
private transient List list;
private list query() {
if (list==null) { list=querywhatever(); }
}
public iterator itereator() { return query().itearator(); }
public int size() { return query().size(); }
public void detach() { list=null; }
}
-igor
On Wed, May 27, 2009 at 7:54 AM, Vasu Srinivasan <[email protected]> wrote:
> Rereading the link
> http://cwiki.apache.org/WICKET/reading-from-a-database.html
> <http://cwiki.apache.org/WICKET/reading-from-a-database.html>
>
> clearly says that the objects are created only once, this includes the List
> results i guess. But the line --
>
> results = getResultsFromCriteria(criteria);
>
> is kinda misleading.. In this case the results should never be a new
> ArrayList object for DataView to work. (If using ListView, the setList must
> be used).
>
> For eg, when using Spring's JdbcTemplate.queryForList() it always returns a
> new list object. To make DataView work, this is probably what should happen:
>
> List tempResult = getResultsFromCriteria(criteria);
> results.clear();
> results.addAll(tempResult);
>
> Pls correct me if im wrong...
>
>
> On Tue, May 26, 2009 at 4:48 PM, Vasu Srinivasan <[email protected]> wrote:
>
>> Ok I think I am understanding it a little better now.
>> For now Im still extending myDataProvider from ListDataProvider, but no
>> longer using a new ArrayList() for every search. Im clearing it out and
>> adding new data, which is okay.
>>
>> One question though -- What is the responsibility scope of the
>> ListDataProvider / IDataProvider?
>>
>> Am I correct in assuming the following --
>>
>> 1) only operate on the given List/Data (already manipulated)
>> 2) *should not* contain a Dao, and refresh its own list/data.
>>
>> Because if (2), then I am seeing an issue -- where do I call the
>> dao.query() ? In the constructor or in the iterator() ? If I do in the
>> constructor, its not refreshed for further queries. If I do in the
>> iterator(), then the size() is queried before the DataView calls the
>> iterator(), so it always returns 0 records for the first time. And also
>> calling dao.query() in the iterator() will make it query the whole list for
>> every pagination, which is probably not a good idea.
>>
>> I liked the idea of dataprovider encapsulating dao, but not clear where
>> would I refresh it.
>> Thanks !
>> Vasya
>>
>> On Tue, May 26, 2009 at 3:25 PM, Igor Vaynberg
>> <[email protected]>wrote:
>>
>>> i meant implement IDataProvider directly if ListDataProvider doesnt
>>> work for you. most of the time you modify an existing instance of
>>> List, not create a new one, so ListDataProvider is useful there.
>>>
>>> -igor
>>>
>>> On Tue, May 26, 2009 at 1:15 PM, Vasu Srinivasan <[email protected]>
>>> wrote:
>>> > Thanks for the reply ...
>>> >
>>> > I tried doing this :
>>> > class MyDataProvider extends ListDataProvider {
>>> >
>>> > DataDao dataDao;
>>> > Criteria criteria;
>>> >
>>> > public MyDataProvider(List list, Criteria criteria) {
>>> > super(list);
>>> > ...
>>> > }
>>> >
>>> > //providing my own iterator which goes to the dataDao and gets the data
>>> > //But now I cannot set the list, because private... So I have to use my
>>> > own list member...If I do that, then what is the point of calling the
>>> > constructor with List?
>>> > }
>>> >
>>> > Looks like ListDataProvider is not useful for reusable Lists. Not sure
>>> why
>>> > this should be so ? If I am able to set a new List into the provider, I
>>> > would not be breaking anything because the data is anyway retrieved only
>>> via
>>> > an Iterator.
>>> >
>>> > The problem is even if I create a new ListDataProvider for every new
>>> list, I
>>> > am not able to set that again in my data view. DataView does not have
>>> any
>>> > thing similar to setList (a la ListView.setList). I dont think I should
>>> be
>>> > creating a new DataView for every search, because all i'm doing is only
>>> > changing contents of the underlying list.
>>> >
>>> > Am I missing something ?
>>> >
>>> >
>>> > On Tue, May 26, 2009 at 12:29 PM, Igor Vaynberg <
>>> [email protected]>wrote:
>>> >
>>> >> you can build your own analog of listdataprovider that pulls the list
>>> >> directly from whatever property contains the latest.
>>> >>
>>> >> -igor
>>> >>
>>> >> On Tue, May 26, 2009 at 9:38 AM, Vasu Srinivasan <[email protected]>
>>> >> wrote:
>>> >> > Hello:
>>> >> > I have a simple search form , where some criteria refreshes the table
>>> >> based
>>> >> > on the db. I got it working with ListView, but im trying to use
>>> >> > ListDataProvider, I feel missing something:
>>> >> >
>>> >> > class MyForm {
>>> >> > List myList;
>>> >> > MyDataView myDataView;
>>> >> > MyDataProvider myDataProvider;
>>> >> >
>>> >> > public MyForm() {
>>> >> > �...@override public void onSubmit() {
>>> >> > myList = refreshData(criteria);
>>> >> > //Question: How do I set this list into the myDataView or
>>> >> > myDataProvider ? I thought myDataView or the provider will auto pick
>>> it
>>> >> up,
>>> >> > because its a member variable and is a RefreshingView
>>> >> > }
>>> >> >
>>> >> > //First time
>>> >> > myList = refreshData(defaultCriteria);
>>> >> > myDataView = new MyDataView("myDataView" , new
>>> >> MyDataProvider(myList));
>>> >> > add(myListView);
>>> >> > }
>>> >> > }
>>> >> >
>>> >> >
>>> >> > class MyDataView extends DataView {
>>> >> > public MyDataView(String id, IDataProvider provider) { super(id,
>>> >> > provider); }
>>> >> >
>>> >> > @Override public void populateItem(Item item) { .... }
>>> >> > }
>>> >> >
>>> >> > class MyDataProvider extends ListDataProvider {
>>> >> > public MyDataProvider(List list) {
>>> >> > super(list);
>>> >> > }
>>> >> > }
>>> >> >
>>> >> > I looked at the example that uses ListView
>>> >> > http://cwiki.apache.org/WICKET/reading-from-a-database.html
>>> >> > <http://cwiki.apache.org/WICKET/reading-from-a-database.html>
>>> >> >
>>> >> > With ListView it works fine if I do this in the method onSubmit()
>>> >> >
>>> >> > myList = refreshData(criteria);
>>> >> > myListView.setList(myList);
>>> >> >
>>> >> > But with DataView, I do not have a set method to reset the new list
>>> >> obtained
>>> >> > based on the criteria. The db returns correct data, but the page
>>> displays
>>> >> > the old data (no change). Neither do I see a method to set the new
>>> list
>>> >> in
>>> >> > the ListDataProvider.
>>> >> >
>>> >> > I even tried adding a new view inside the onSubmit, but that doesnt
>>> work
>>> >> > either:
>>> >> >
>>> >> > myDataView = new MyDataView("myDataView", new
>>> MyDataProvider(newList));
>>> >> >
>>> >> > --
>>> >> > Thanks!
>>> >> > Vasu Srinivasan
>>> >> >
>>> >>
>>> >> ---------------------------------------------------------------------
>>> >> To unsubscribe, e-mail: [email protected]
>>> >> For additional commands, e-mail: [email protected]
>>> >>
>>> >>
>>> >
>>> >
>>> > --
>>> > Regards,
>>> > Vasu Srinivasan
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>
>>
>> --
>> Regards,
>> Vasu Srinivasan
>>
>
>
>
> --
> Regards,
> Vasu Srinivasan
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]