Changeset 6347


Ignore:
Timestamp:
07/06/15 07:03:24 (9 years ago)
Author:
Twan Goosen
Message:

DataView? (with provider) instead of ListView? for parents in hierarchy to prevent loading everything

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/HierarchyPanel.java

    r6346 r6347  
    1818
    1919import com.google.common.base.Function;
    20 import com.google.common.collect.ImmutableList;
    2120import com.google.common.collect.Iterators;
    2221import eu.clarin.cmdi.vlo.FacetConstants;
     
    2726import java.util.Collections;
    2827import java.util.Iterator;
    29 import java.util.List;
    3028import org.apache.solr.common.SolrDocument;
    3129import org.apache.wicket.Component;
     
    3937import org.apache.wicket.markup.html.basic.Label;
    4038import org.apache.wicket.markup.html.link.Link;
    41 import org.apache.wicket.markup.html.list.ListItem;
    42 import org.apache.wicket.markup.html.list.PageableListView;
    4339import org.apache.wicket.markup.html.panel.GenericPanel;
     40import org.apache.wicket.markup.repeater.Item;
     41import org.apache.wicket.markup.repeater.data.DataView;
     42import org.apache.wicket.markup.repeater.data.IDataProvider;
    4443import org.apache.wicket.model.AbstractReadOnlyModel;
    4544import org.apache.wicket.model.IModel;
    46 import org.apache.wicket.model.LoadableDetachableModel;
    4745import org.apache.wicket.model.PropertyModel;
    4846import org.apache.wicket.spring.injection.annot.SpringBean;
     
    5856     */
    5957    public static final int INITIAL_PARENTS_SHOWN = 5;
    60    
     58
    6159    @SpringBean
    6260    private SolrDocumentService documentService;
    6361
    64     private final IModel<List<SolrDocument>> parentsModel;
     62//    private final IModel<List<SolrDocument>> parentsModel;
     63    private final IDataProvider<SolrDocument> parentsProvider;
    6564
    6665    public HierarchyPanel(String id, IModel<SolrDocument> documentModel) {
     
    6867
    6968        // create a list model for the parents
    70         parentsModel = createParentsModel();
     69//        parentsModel = createParentsModel();
     70        parentsProvider = createParentsProvider();
    7171
    7272        add(createParentLinks("parents"));
     
    7676    /**
    7777     *
    78      * @return a model that provides a list of the parent documents, model
    79      * object never null but can be empty
     78     * @return a provider for the parent documents
    8079     */
    81     private IModel<List<SolrDocument>> createParentsModel() {
    82         // model that 'loads' (i.e. extracts ids and retrieves the matching
    83         // Solr documents) the parents only once
    84         return new LoadableDetachableModel<List<SolrDocument>>() {
    85 
    86             @Override
    87             protected List<SolrDocument> load() {
    88                 // get parent IDs
    89                 final Collection<Object> parentIds = getModel().getObject().getFieldValues(FacetConstants.FIELD_IS_PART_OF);
     80    private IDataProvider<SolrDocument> createParentsProvider() {
     81        return new IDataProvider<SolrDocument>() {
     82
     83            private Long size = null;
     84
     85            @Override
     86            public Iterator<? extends SolrDocument> iterator(long first, long count) {
     87                final Collection<Object> parentIds = HierarchyPanel.this.getModelObject().getFieldValues(FacetConstants.FIELD_IS_PART_OF);
    9088                if (parentIds == null) {
    9189                    // no parents, so provide empty list of documents
    92                     return Collections.emptyList();
     90                    return Collections.emptyIterator();
    9391                } else {
    9492                    // parents found, convert ID collection into documents list
    95                     final Iterator<SolrDocument> documentsIterator = Iterators.transform(parentIds.iterator(), new Function<Object, SolrDocument>() {
     93                    return Iterators.transform(parentIds.iterator(), new Function<Object, SolrDocument>() {
    9694
    9795                        @Override
     
    10098                        }
    10199                    });
    102                     // creation of list will trigger conversion on the fly
    103                     return ImmutableList.copyOf(documentsIterator);
    104                 }
    105             }
     100                }
     101            }
     102
     103            @Override
     104            public long size() {
     105                if (size == null) {
     106                    final Collection<Object> fieldValues = HierarchyPanel.this.getModelObject().getFieldValues(FacetConstants.FIELD_IS_PART_OF);
     107                    if (fieldValues == null) {
     108                        size = 0L;
     109                    } else {
     110                        size = Long.valueOf(fieldValues.size());
     111                    }
     112                }
     113                return size;
     114            }
     115
     116            @Override
     117            public IModel<SolrDocument> model(SolrDocument object) {
     118                return new SolrDocumentModel(object);
     119            }
     120
     121            @Override
     122            public void detach() {
     123                size = null;
     124            }
     125
    106126        };
    107127    }
     
    112132        final WebMarkupContainer container = new WebMarkupContainer(id);
    113133
    114         // actual list of parents (paged)
    115         final PageableListView<SolrDocument> parentsView = new PageableListView<SolrDocument>("parentsList", parentsModel, INITIAL_PARENTS_SHOWN) {
    116 
    117             @Override
    118             protected void populateItem(ListItem<SolrDocument> item) {
     134        final DataView<SolrDocument> parentsView = new DataView<SolrDocument>("parentsList", parentsProvider, INITIAL_PARENTS_SHOWN) {
     135
     136            @Override
     137            protected void populateItem(Item<SolrDocument> item) {
    119138                item.add(new NamedRecordPageLink("link", item.getModel()));
    120139            }
     
    122141            @Override
    123142            protected void onConfigure() {
    124                 setVisible(!parentsModel.getObject().isEmpty());
     143                setVisible(parentsProvider.size() > 0);
    125144            }
    126145        };
     
    131150            @Override
    132151            public void onClick(AjaxRequestTarget target) {
    133                 parentsView.setItemsPerPage(parentsModel.getObject().size());
     152                parentsView.setItemsPerPage(parentsProvider.size());
    134153                if (target != null) {
    135154                    target.add(container);
     
    142161            }
    143162        };
    144         showAllLink.add(new Label("itemCount", new PropertyModel<Integer>(parentsModel, "size")));
     163        showAllLink.add(new Label("itemCount", new PropertyModel<Integer>(parentsProvider, "size")));
    145164
    146165        return container
     
    169188            @Override
    170189            public String getObject() {
    171                 if (!parentsModel.getObject().isEmpty()) {
     190                if (parentsProvider.size() > 0) {
    172191                    return "has-parent";
    173192                } else {
     
    216235    public void detachModels() {
    217236        super.detachModels();
    218         parentsModel.detach();
    219237    }
    220238
Note: See TracChangeset for help on using the changeset viewer.