we're working on wicket/spring/hibernate application (a research
repository).

my SortableDataProvider looks like this.

public class PublicationDataProvider extends SortableDataProvider {
    private IBrowseService browseService;
    private Class<?> type;

    public PublicationDataProvider() {};

    public PublicationDataProvider(IBrowseService browseService, Class<?>
type) {
        this.browseService = browseService;
        this.type = type;
        setSort("title", true);
    }

     public Iterator<IPublication> iterator(int first, int count)
     {
         SortParam sp = getSort();
         return browseService.find(first, count, sp.getProperty(),
sp.isAscending(), type).iterator();
     }

     public int size()
     {
         return browseService.countAll();
     }

     public IModel model(Object object)
     {
         return new DomainObjectModel<IPublication>((IPublication)object);
     }

     public void detach() {}
}

I use it with a dataview on the following panel

package main.java.web.components.browser;

import main.java.domain.publication.IPublication;
import main.java.domain.user.IUser;
import main.java.services.publication.IBrowseService;
import main.java.web.components.content.BasicPanel;

import org.apache.wicket.ajax.AjaxRequestTarget;
import
org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import
org.apache.wicket.extensions.ajax.markup.html.repeater.data.sort.AjaxFallbackOrderByLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

public class BrowsePanel extends BasicPanel {
    @SpringBean
    IBrowseService browseService;

    transient IPublication publication;

    public BrowsePanel(Class<?> type) {
        super("block", "Browse Publications");
        setOutputMarkupId(true);

        final WebMarkupContainer dataContainer = new
WebMarkupContainer("dataContainer");
        dataContainer.setOutputMarkupId(true);
        add(dataContainer);

        PublicationDataProvider pdp = new
PublicationDataProvider(browseService, type);
        final DataView dataView = new DataView("publication", pdp, 10) {
            @Override
            protected void populateItem(Item item) {
                publication = (IPublication) item.getModelObject();
                item.add(new Label("number", "" + (getCurrentPage() * 10 +
item.getIndex() + 1)));
                item.add(new Label("title", publication.getTitle()));

                IModel authorsModel = new LoadableDetachableModel() {
                    @Override
                    protected Object load() {
                        return publication.getAuthorsInOrder();
                    }
                };

                ListView authorsListView = new ListView("author",
authorsModel) {
                    @Override
                    protected void populateItem(ListItem item) {
                        Object author = item.getModelObject();
                        Link authorLink = new Link("authorLink") {
                            @Override
                            public void onClick() {

                            }
                        };
                        if (author instanceof IUser) {
                            authorLink.add(new Label("authorName", ((IUser)
author).getFullName()));
                        }
                        else {
                            authorLink.add(new Label("authorName",
author.toString()));
                            authorLink.setEnabled(false);
                        }
                        item.add(authorLink);
                    }
                };
                item.add(authorsListView);
                item.add(new Label("abstract",
publication.getAbstractText()));
            }
        };

        dataContainer.add(new AjaxFallbackOrderByLink("orderByTitle",
"title", pdp) {
            @Override
            protected void onSortChanged() {
                dataView.setCurrentPage(0);
            }

            @Override
            protected void onAjaxClick(AjaxRequestTarget target) {
                target.addComponent(dataContainer);
            }
        });

        dataContainer.add(dataView);

        AjaxPagingNavigator pager = new AjaxPagingNavigator("pager",
dataView) {
            @Override
            protected void onAjaxEvent(AjaxRequestTarget target) {
                target.addComponent(dataContainer);
            }
        };

        dataContainer.add(pager);
    }
}

when the publication instance variable wasn't transient i would get a wicket
not serializable exception on this field. I've been reading in the forum and
i now know that this is because the loadable detachable model that gets the
list of user objects holds a reference to the publication, (return
publication.getAuthorsInOrder()). transient does solve my problem, however i
have a feeling that something is not right. Is there any elegant way to do
this? Also i'd like to point out that all my domain objects don't implement
the serializable interface and that they implement the IDomainObject
interface that has only a getId() method. I've seen the IDomainObject
interface in WIA and it implements the serializable interface. but isn't
that against the idea of the loadable detachable model?

Reply via email to