nl.knaw.dans.dccd.web.search.pages.SearchResultExplorePage.java Source code

Java tutorial

Introduction

Here is the source code for nl.knaw.dans.dccd.web.search.pages.SearchResultExplorePage.java

Source

/*******************************************************************************
 * Copyright 2015 DANS - Data Archiving and Networked Services
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package nl.knaw.dans.dccd.web.search.pages;

import java.util.ArrayList;
import java.util.List;

import nl.knaw.dans.common.lang.dataset.DatasetState;
import nl.knaw.dans.common.lang.search.SearchRequest;
import nl.knaw.dans.common.lang.search.SearchResult;
import nl.knaw.dans.common.lang.search.simple.SimpleField;
import nl.knaw.dans.common.lang.search.simple.SimpleSearchRequest;
import nl.knaw.dans.common.wicket.components.search.SearchBar;
import nl.knaw.dans.common.wicket.components.search.criteria.CriteriumLabel;
import nl.knaw.dans.common.wicket.components.search.criteria.InitialSearchCriterium;
import nl.knaw.dans.common.wicket.components.search.criteria.SearchCriteriaPanel;
import nl.knaw.dans.common.wicket.components.search.criteria.TextSearchCriterium;
import nl.knaw.dans.common.wicket.components.search.facets.FacetConfig;
import nl.knaw.dans.common.wicket.components.search.model.SearchCriterium;
import nl.knaw.dans.common.wicket.components.search.model.SearchModel;
import nl.knaw.dans.common.wicket.components.search.model.SearchRequestBuilder;
import nl.knaw.dans.common.wicket.exceptions.InternalWebError;
import nl.knaw.dans.dccd.application.services.DccdSearchService;
import nl.knaw.dans.dccd.application.services.SearchServiceException;
import nl.knaw.dans.dccd.application.services.ServiceException;
import nl.knaw.dans.dccd.model.DccdUser;
import nl.knaw.dans.dccd.model.DccdUser.Role;
import nl.knaw.dans.dccd.search.DccdObjectSB;
import nl.knaw.dans.dccd.search.DccdSB;
import nl.knaw.dans.dccd.web.DccdResources;
import nl.knaw.dans.dccd.web.DccdSession;
import nl.knaw.dans.dccd.web.search.AbstractSearchPage;
import nl.knaw.dans.dccd.web.search.DccdSearchResultExplorePanel;
import nl.knaw.dans.dccd.web.search.DccdSearchResultPanel;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 */
public class SearchResultExplorePage extends AbstractSearchPage {

    private static final Logger LOGGER = LoggerFactory.getLogger(SearchResultExplorePage.class);

    private static final long serialVersionUID = 8501036308620025068L;

    private static final String SEARCHRESULT_PANEL = "searchResultPanel";

    public SearchResultExplorePage(boolean needAuthentication) {
        super();

        /* Note: maybe handle login here
        if (needAuthentication && !getEasySession().isAuthenticated())
        {
        // might be a link from a notification 
        redirectToInterceptPage(new LoginPage());
        return;
        }
         */
        init(null);
    }

    public SearchResultExplorePage(SearchModel model) {
        super(model);
        init(null);
    }

    public SearchResultExplorePage(final PageParameters parameters) {
        super(parameters);
        String queryString = parameters.getString(SearchBar.QUERY_PARAM);
        if (getDefaultModel() == null)
            init(queryString);
    }

    protected SearchResult<? extends DccdSB> doSearch(SearchRequest request) throws ServiceException {
        LOGGER.debug("SearchResultExplorePage Search");

        return doSearchPublic(request);
    }

    protected SearchResult<? extends DccdSB> doSearchPublic(SearchRequest request) throws ServiceException {
        LOGGER.debug("SearchResultExplorePage Public Search");

        try {
            DccdUser user = (DccdUser) ((DccdSession) getSession()).getUser();
            if (user == null || !user.hasRole(Role.ADMIN)) {
                // restrict results to archived/published 
                SimpleField<String> stateField = new SimpleField<String>(DccdSB.ADMINISTRATIVE_STATE_NAME,
                        DatasetState.PUBLISHED.toString());
                request.addFilterQuery(stateField);
            }
            request.addFilterBean(DccdObjectSB.class);

            return DccdSearchService.getService().doSearch(request);
        } catch (SearchServiceException e) {
            throw new ServiceException(e);
        }
    }

    protected IModel<String> getInitialCriteriumText() {
        return new ResourceModel("publicsearch.defaultbreadcrumbtext");
    }

    protected IModel<String> getSearchCriteriumText(final String searchText) {
        return new AbstractReadOnlyModel<String>() {
            private static final long serialVersionUID = 3254972701101566016L;

            @Override
            public String getObject() {
                return CriteriumLabel.createFilterText(getString("publicsearch.searchbreadcrumbtext"), searchText);
            }
        };
    }

    private void initRequestBuilder() {
        SearchRequestBuilder requestBuilder = getSearchData().getRequestBuilder();

        // if we have offset and limit restricted, remove that restriction
        int totalHits = getSearchData().getResult().getTotalHits();
        int offset = requestBuilder.getOffset();
        int limit = requestBuilder.getLimit();
        if (offset != 0 || limit < totalHits) {
            requestBuilder.setOffset(offset);
            requestBuilder.setLimit(totalHits);

            SimpleSearchRequest request = requestBuilder.getRequest();
            try {
                getSearchData().setResult(doSearch(request));
            } catch (ServiceException e) {
                String msg = exceptionMessage(DccdResources.SEARCH_FAILURE);
                LOGGER.error(msg, e);
                throw new InternalWebError();
            }
        }

    }

    protected void init(final String searchText) {
        // Exploring means All results, and not paged   
        initRequestBuilder();

        add(new Label("headerLabel", getInitialCriteriumText()));

        if (getSearchModel() == null) {
            SearchCriterium criterium;
            if (!StringUtils.isBlank(searchText))
                criterium = new TextSearchCriterium(searchText, getSearchCriteriumText(searchText));
            else
                criterium = new InitialSearchCriterium(getInitialCriteriumText());
            setSearchModel(new SearchModel(criterium));
        }

        add(new SearchCriteriaPanel("searchCriteria", getSearchModel()));

        DccdSearchResultExplorePanel panel = new DccdSearchResultExplorePanel(SEARCHRESULT_PANEL,
                getSearchModel()) {
            private static final long serialVersionUID = 4389340592804783670L;

            @Override
            public SearchResult<?> search(SimpleSearchRequest request) {
                try {
                    SearchResult<? extends DccdSB> searchResult = SearchResultExplorePage.this.doSearch(request);
                    return searchResult;
                } catch (ServiceException e) {
                    String msg = errorMessage(DccdResources.SEARCH_FAILURE);
                    LOGGER.error(msg, e);
                    throw new InternalWebError();
                }
            }
        };
        add(panel);

    }

    @Override
    public void refresh() {
        SearchModel model = getSearchModel();
        if (model != null)
            model.getObject().setDirty(true);
    }

}