source: vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/FacetedSearchPage.java @ 6813

Last change on this file since 6813 was 6813, checked in by davor.ostojic@oeaw.ac.at, 9 years ago

#795 VLO web-app generates unnecessary requests. The idea behind is to fire SOLR query only when selection is changed.

File size: 7.0 KB
Line 
1package eu.clarin.cmdi.vlo.wicket.pages;
2
3import java.util.List;
4
5import org.apache.solr.client.solrj.response.FacetField;
6import org.apache.wicket.Component;
7import org.apache.wicket.ajax.AjaxRequestTarget;
8import org.apache.wicket.markup.html.WebMarkupContainer;
9import org.apache.wicket.markup.html.panel.Panel;
10import org.apache.wicket.model.IModel;
11import org.apache.wicket.model.Model;
12import org.apache.wicket.request.mapper.parameter.PageParameters;
13import org.apache.wicket.spring.injection.annot.SpringBean;
14
15import eu.clarin.cmdi.vlo.config.VloConfig;
16import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
17import eu.clarin.cmdi.vlo.service.PageParametersConverter;
18import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService;
19import eu.clarin.cmdi.vlo.wicket.model.FacetFieldsModel;
20import eu.clarin.cmdi.vlo.wicket.model.FacetNamesModel;
21import eu.clarin.cmdi.vlo.wicket.model.PermaLinkModel;
22import eu.clarin.cmdi.vlo.wicket.panels.BreadCrumbPanel;
23import eu.clarin.cmdi.vlo.wicket.panels.SingleFacetPanel;
24import eu.clarin.cmdi.vlo.wicket.panels.TopLinksPanel;
25import eu.clarin.cmdi.vlo.wicket.panels.search.AdvancedSearchOptionsPanel;
26import eu.clarin.cmdi.vlo.wicket.panels.search.FacetPanel;
27import eu.clarin.cmdi.vlo.wicket.panels.search.FacetValuesPanel;
28import eu.clarin.cmdi.vlo.wicket.panels.search.FacetsPanel;
29import eu.clarin.cmdi.vlo.wicket.panels.search.SearchFormPanel;
30import eu.clarin.cmdi.vlo.wicket.panels.search.SearchResultsPanel;
31
32/**
33 * The main search page showing a search form, facets, and search results
34 *
35 * @author twagoo
36 */
37public class FacetedSearchPage extends VloBasePage<QueryFacetsSelection> {
38
39    private static final long serialVersionUID = 1L;
40
41    @SpringBean
42    private FacetFieldsService facetFieldsService;
43    @SpringBean
44    private VloConfig vloConfig;
45    @SpringBean(name = "queryParametersConverter")
46    private PageParametersConverter<QueryFacetsSelection> paramsConverter;
47
48    private SearchResultsPanel searchResultsPanel;
49    private Component facetsPanel;
50    private Component collectionsPanel;
51    private Component navigation;
52    private Component searchForm;
53   
54   
55    IModel<List<String>> facetNamesModel;
56    FacetFieldsModel fieldsModel;
57   
58   
59
60    public FacetedSearchPage(IModel<QueryFacetsSelection> queryModel) {
61        super(queryModel);
62        createModels();
63        addComponents();
64    }
65
66    public FacetedSearchPage(PageParameters parameters) {
67        super(parameters);
68
69        final QueryFacetsSelection selection = paramsConverter.fromParameters(parameters);
70        final IModel<QueryFacetsSelection> queryModel = new Model<QueryFacetsSelection>(selection);
71        setModel(queryModel);
72        createModels();
73        addComponents();
74    }
75   
76   
77    private void createModels(){
78        facetNamesModel = new FacetNamesModel(vloConfig.getFacetFields());
79        fieldsModel = new FacetFieldsModel(facetFieldsService, facetNamesModel.getObject(), getModel(), -1);
80    }
81
82    private void addComponents() {
83        navigation = createNavigation("navigation");
84        add(navigation);
85       
86        searchForm = createSearchForm("search");
87        add(searchForm);
88
89        collectionsPanel = createCollectionsPanel("collections");
90        add(collectionsPanel);
91
92        facetsPanel = createFacetsPanel("facets");
93        add(facetsPanel);
94
95        Panel optionsPanel = createOptionsPanel("options");
96        add(optionsPanel);
97
98        searchResultsPanel = new SearchResultsPanel("searchResults", getModel());
99        add(searchResultsPanel);
100    }
101
102    private WebMarkupContainer createNavigation(String id) {
103        final WebMarkupContainer container = new WebMarkupContainer(id);
104        container.setOutputMarkupId(true);
105        container.add(new BreadCrumbPanel("breadcrumbs", getModel()) {
106
107            @Override
108            protected void onSelectionChanged(QueryFacetsSelection selection, AjaxRequestTarget target) {
109                setModelObject(selection);
110                updateSelection(target);
111            }
112
113        });
114        container.add(new TopLinksPanel("permalink", new PermaLinkModel(getPageClass(), getModel())) {
115
116            @Override
117            protected void onChange(AjaxRequestTarget target) {
118                if (target != null) {
119                    target.add(container);
120                }
121            }
122
123        });
124        return container;
125    }
126
127    private Panel createOptionsPanel(String id) {
128        final Panel optionsPanel = new AdvancedSearchOptionsPanel(id, getModel()) {
129
130            @Override
131            protected void selectionChanged(AjaxRequestTarget target) {
132                updateSelection(target);
133            }
134        };
135        return optionsPanel;
136    }
137
138    private Panel createSearchForm(String id) {
139        final SearchFormPanel form = new SearchFormPanel(id, getModel()) {
140
141            @Override
142            protected void onSubmit(AjaxRequestTarget target) {
143                // reset expansion state of search results
144                searchResultsPanel.resetExpansion();
145                updateSelection(target);
146            }
147
148        };
149        form.setOutputMarkupId(true);
150        return form;
151    }
152
153    private Component createCollectionsPanel(final String id) {
154        // collection facet is optional...
155        final WebMarkupContainer enclosure = new WebMarkupContainer(id);
156        enclosure.setOutputMarkupId(true);
157        if (vloConfig.getCollectionFacet() != null) {
158            final FacetPanel panel = new SingleFacetPanel("collectionsFacet", vloConfig.getCollectionFacet(), getModel(), facetFieldsService, 3) {
159
160                @Override
161                protected void selectionChanged(AjaxRequestTarget target) {
162                    updateSelection(target);
163                }
164
165            };
166            enclosure.add(panel);
167        } else {
168            // no collection facet, do not add the panel
169            final WebMarkupContainer placeholder = new WebMarkupContainer("collectionsFacet");
170            placeholder.setVisible(false);
171            enclosure.add(placeholder);
172        }
173        return enclosure;
174    }
175
176    private Panel createFacetsPanel(final String id) {
177       
178        final FacetsPanel panel = new FacetsPanel(id, facetNamesModel, fieldsModel, getModel()) {
179
180            @Override
181            protected void selectionChanged(AjaxRequestTarget target) {
182                updateSelection(target);
183            }
184        };
185        panel.setOutputMarkupId(true);
186        return panel;
187    }
188
189    private void updateSelection(AjaxRequestTarget target) {
190       
191        //detach facetFieldsModel when selection is changed
192        fieldsModel.detach();
193       
194        // selection changed, update facets and search results
195        if (target != null) { // null if JavaScript disabled
196            target.add(navigation);
197            target.add(searchForm);
198            target.add(searchResultsPanel);
199            target.add(facetsPanel);
200            target.add(collectionsPanel);
201        }
202    }
203
204    @Override
205    public IModel<String> getCanonicalUrlModel() {
206        return new PermaLinkModel(getPageClass(), getModel());
207    }
208}
Note: See TracBrowser for help on using the repository browser.