you have to chain your models, so instead of
item.add(new Label("title", publication.getTitle()));
do
item.add(new Label("title", new PropertyModel(item.getModel(), "title"));
instead of
IModel authorsModel = new LoadableDetachableModel() {
@Override
protected Object load() {
return publication.getAuthorsInOrder();
}
};
do
authorsModel=new PropertyModel(item.getModel(), "authorsInOrder");
that way you never have to hold a reference to the domain object
itself, only a model to it.
-igor
On Fri, Aug 7, 2009 at 10:03 AM, Mostafa Mohamed<[email protected]> wrote:
> 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?
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]