Changeset 6755


Ignore:
Timestamp:
11/09/15 13:36:42 (9 years ago)
Author:
davor.ostojic@oeaw.ac.at
Message:

merged with trunk 3.4

Location:
vlo/branches/vlo-3.3-oeaw/vlo-web-app
Files:
1 deleted
39 edited
6 copied

Legend:

Unmodified
Added
Removed
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/pom.xml

    r6471 r6755  
    77        <groupId>eu.clarin.cmdi</groupId>
    88        <artifactId>vlo</artifactId>
    9         <version>3.3-SNAPSHOT</version>
     9        <version>3.4-SNAPSHOT</version>
    1010    </parent>
    1111   
     
    1414    <artifactId>vlo-web-app</artifactId>
    1515    <packaging>war</packaging>
    16     <version>3.3-SNAPSHOT</version>
     16    <version>3.4-SNAPSHOT</version>
    1717    <name>VLO Web Application</name>
    1818    <description></description>
    1919
    2020    <properties>
    21         <wicket.version>6.19.0</wicket.version>
    22         <spring.version>3.2.13.RELEASE</spring.version>
     21        <wicket.version>7.0.0</wicket.version>
     22        <spring.version>4.2.0.RELEASE</spring.version>
    2323        <jetty.version>8.1.17.v20150415</jetty.version>
    2424        <!-- selects the appender for the log4j root logger -->
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/JavaScriptResources.java

    r6350 r6755  
    2121import org.apache.wicket.request.resource.CssResourceReference;
    2222import org.apache.wicket.request.resource.JavaScriptResourceReference;
     23import org.apache.wicket.request.resource.ResourceReference;
    2324
    2425/**
     
    3233    private final static JavaScriptResourceReference VLO_SYNTAX_HELP = new JavaScriptResourceReference(VloBasePage.class, "vlo-syntax-help.js");
    3334    private final static JavaScriptResourceReference VLO_FACETS = new JavaScriptResourceReference(VloBasePage.class, "vlo-facets.js");
     35    private final static JavaScriptResourceReference SEARCH_FORM = new JavaScriptResourceReference(VloBasePage.class, "vlo-searchform.js");
     36    private final static JavaScriptResourceReference FIELDS_TABLE = new JavaScriptResourceReference(RecordPage.class, "vlo-fields-table.js");
    3437    private final static JavaScriptResourceReference JQUERY_UI = new JavaScriptResourceReference(VloBasePage.class, "jquery-ui-1.11.4.custom/jquery-ui.min.js");
    3538    private final static CssResourceReference JQUERY_UI_CSS = new CssResourceReference(VloBasePage.class, "jquery-ui-1.11.4.custom/jquery-ui.min.css");
    3639    private final static JavaScriptResourceReference JQUERY_WATERMARK = new JavaScriptResourceReference(VloBasePage.class, "jquery.watermark-3.1.4/jquery.watermark.min.js");
    37     private final static JavaScriptResourceReference HIGHLIGHT = new JavaScriptResourceReference(RecordPage.class, "searchhi.js");
     40    private final static JavaScriptResourceReference HIGHLIGHT = new JavaScriptResourceReference(RecordPage.class, "jquery.highlight.js");
    3841
    3942    public static JavaScriptResourceReference getVloFrontJS() {
     
    6669        return VLO_SYNTAX_HELP;
    6770    }
     71   
     72    public static JavaScriptResourceReference getSearchFormJS() {
     73        return SEARCH_FORM;
     74    }
    6875
     76    public static ResourceReference getFieldsTableJS() {
     77        return FIELDS_TABLE;
     78    }
     79   
    6980}
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/AbstractSolrQueryFactory.java

    r6486 r6755  
    3232public abstract class AbstractSolrQueryFactory {
    3333
    34     protected static final String SOLR_SEARCH_ALL = null;
     34    protected static final String SOLR_SEARCH_ALL = "*:*";
    3535
    3636    protected final void addQueryFacetParameters(final SolrQuery query, QueryFacetsSelection queryFacetsSelections, boolean includeFilterQueries) {
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrDaoImpl.java

    r4950 r6755  
    1111import org.apache.solr.common.SolrDocument;
    1212import org.apache.solr.common.SolrDocumentList;
     13import org.apache.solr.common.SolrException;
    1314import org.slf4j.Logger;
    1415import org.slf4j.LoggerFactory;
     
    8384            logger.trace("Response: {}", response);
    8485            return response;
     86        } catch(SolrException e) {
     87            logger.error("Error getting data:", e);
     88            throw new RuntimeException(e);
    8589        } catch (SolrServerException e) {
    8690            logger.error("Error getting data:", e);
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrDocumentQueryFactoryImpl.java

    r6456 r6755  
    6262        // make a query to look up a specific document by its ID
    6363        final SolrQuery query = getDefaultDocumentQuery();
     64        // we can use the 'fast' request handler here, document ranking is of no interest
     65        query.setRequestHandler(FacetConstants.SOLR_REQUEST_HANDLER_FAST);
    6466        // consider all documents
    6567        query.setQuery(SOLR_SEARCH_ALL);
     
    7375                .build();
    7476        query.addFilterQuery(createFilterOrQuery(idOrQueryMap));
    75        
     77
    7678        // one result max
    7779        query.setRows(1);
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrFacetQueryFactoryImpl.java

    r6494 r6755  
    1717package eu.clarin.cmdi.vlo.service.solr.impl;
    1818
     19import eu.clarin.cmdi.vlo.FacetConstants;
    1920import eu.clarin.cmdi.vlo.service.solr.SolrFacetQueryFactory;
    2021import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/HighlightSearchTermBehavior.java

    r5161 r6755  
    2323import org.apache.wicket.markup.head.JavaScriptHeaderItem;
    2424import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
     25import org.apache.wicket.request.Request;
     26import org.apache.wicket.util.string.StringValue;
     27import org.apache.wicket.util.string.Strings;
    2528
    2629/**
     
    3336public class HighlightSearchTermBehavior extends Behavior {
    3437
    35     private static final String HIGHLIGHT_FUNCTION = "searchhi.init()";
     38    private final HighlightSearchTermScriptFactory scriptFactory = new HighlightSearchTermScriptFactory();
    3639
    3740    @Override
     
    3942        // include highlight script
    4043        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getHighlightJS()));
    41         // after load, highlight
    42         response.render(OnDomReadyHeaderItem.forScript(HIGHLIGHT_FUNCTION));
     44
     45        final String words = getWordList(component);
     46        if (!Strings.isEmpty(words)) {
     47            String selector = getComponentSelector(component.getMarkupId());
     48            // after load, highlight
     49            response.render(OnDomReadyHeaderItem.forScript(scriptFactory.createScript(selector, words)));
     50        }
     51    }
     52
     53    protected String getComponentSelector(String componentId) {
     54        return "#" + componentId;
     55    }
     56
     57    protected String getWordList(Component component) {
     58        Request request = component.getPage().getRequestCycle().getRequest();
     59        return request.getQueryParameters().getParameterValue(getQueryParam()).toString();
     60    }
     61
     62    protected String getQueryParam() {
     63        return "q";
    4364    }
    4465
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/ResourceTypeCssBehaviour.java

    r4881 r6755  
    1919import eu.clarin.cmdi.vlo.pojo.ResourceInfo;
    2020import org.apache.wicket.behavior.AttributeAppender;
     21import org.apache.wicket.migrate.StringResourceModelMigration;
    2122import org.apache.wicket.model.IModel;
    22 import org.apache.wicket.model.StringResourceModel;
    2323
    2424/**
     
    3535                // to one of the properties in resourceTypeClass.properties file
    3636                // (defaults to "")
    37                 new StringResourceModel("resourcetype.${resourceType}.class", resourceInfoModel, "", new Object[0]));
     37                StringResourceModelMigration.of("resourcetype.${resourceType}.class", resourceInfoModel, "", new Object[0]));
    3838        // separate CSS classes with a space
    3939        setSeparator(" ");
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/SolrDocumentModel.java

    r6350 r6755  
    3939    public SolrDocumentModel(SolrDocument document) {
    4040        super(document);
    41         this.docId = Model.of((String) document.getFieldValue(FacetConstants.FIELD_ID));
     41        if (document == null) {
     42            this.docId = null;
     43        } else {
     44            this.docId = Model.of((String) document.getFieldValue(FacetConstants.FIELD_ID));
     45        }
    4246    }
    4347
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/SolrFieldNameModel.java

    r6206 r6755  
    2020import org.apache.wicket.Application;
    2121import org.apache.wicket.model.IModel;
     22import org.apache.wicket.model.Model;
    2223import org.apache.wicket.model.PropertyModel;
    2324import org.apache.wicket.model.StringResourceModel;
    24 import org.apache.wicket.settings.def.ResourceSettings;
    2525
    2626/**
     
    4141   
    4242    public SolrFieldNameModel(IModel<String> model) {
    43         super("field.${}",
    44                 model,
    45                 model.getObject()); // default to internal field name)
     43        super("field.${}", model);
     44        setDefaultValue(Model.of(model.getObject())); //TODO: check if this is necessary, added on migration to Wicket 7
    4645    }
    4746
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/RecordPage.html

    r6350 r6755  
    5151                <div id="recorddetails">
    5252                    <a wicket:id="landingPageLink" target="_blank" id="recordlandingpage">Show this record in its original context</a>
    53                     <wicket:container wicket:id="documentProperties">[PROPERTIES TABLE]</wicket:container>
     53                    <div id="recordProperties" wicket:id="documentProperties">[PROPERTIES TABLE]</div>
    5454                </div>
    5555
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/RecordPage.java

    r6305 r6755  
    2020import eu.clarin.cmdi.vlo.FacetConstants;
    2121import eu.clarin.cmdi.vlo.VloWebAppParameters;
     22import eu.clarin.cmdi.vlo.config.VloConfig;
    2223import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
    2324import eu.clarin.cmdi.vlo.pojo.SearchContext;
     
    8687    @SpringBean(name = "documentFieldOrder")
    8788    private List<String> fieldOrder;
     89    @SpringBean
     90    private VloConfig config;
    8891
    8992    private final IModel<SearchContext> navigationModel;
     
    127130
    128131        addComponents();
    129         add(new HighlightSearchTermBehavior());
    130132    }
    131133
     
    135137
    136138        final WebMarkupContainer topNavigation = new WebMarkupContainer("topnavigation");
    137         topNavigation.setOutputMarkupId(true);
    138         add(topNavigation);
    139 
    140         topNavigation.add(new BreadCrumbPanel("breadcrumbs", selectionModel));
    141         topNavigation.add(createPermalink("permalink", topNavigation));
     139        add(topNavigation
     140                .add(new BreadCrumbPanel("breadcrumbs", selectionModel))
     141                .add(createPermalink("permalink", topNavigation))
     142                .setOutputMarkupId(true)
     143        );
    142144
    143145        // General information section
    144146        add(new SolrFieldLabel("name", getModel(), FacetConstants.FIELD_NAME, getString("recordpage.unnamedrecord")));
    145147        add(createLandingPageLink("landingPageLink"));
    146         add(new FieldsTablePanel("documentProperties", new DocumentFieldsProvider(getModel(), basicPropertiesFilter, fieldOrder)));
     148       
     149        final FieldsTablePanel fieldsTable = new FieldsTablePanel("documentProperties", new DocumentFieldsProvider(getModel(), basicPropertiesFilter, fieldOrder));
     150        fieldsTable.add(new HighlightSearchTermBehavior());
     151        add(fieldsTable);
    147152
    148153        // Resources section
     
    153158        add(createTechnicalDetailsPanel("technicalProperties"));
    154159
    155         add(createHierarchyPanel("recordtree"));
     160        if (config.isProcessHierarchies()) {
     161            // show hierarchy if applicable
     162            add(createHierarchyPanel("recordtree"));
     163        } else {
     164            // invisible stub
     165            add(new WebMarkupContainer("recordtree") {
     166
     167                @Override
     168                public boolean isVisible() {
     169                    return false;
     170                }
     171
     172            });
     173        }
    156174
    157175        createSearchLinks("searchlinks");
     
    213231
    214232    private void createSearchLinks(String id) {
    215         final SolrFieldModel<String> searchPageModel = new SolrFieldModel<String>(getModel(), FacetConstants.FIELD_SEARCHPAGE);
    216         final SolrFieldModel<String> searchServiceModel = new SolrFieldModel<String>(getModel(), FacetConstants.FIELD_SEARCH_SERVICE);
     233        final SolrFieldModel<String> searchPageModel = new SolrFieldModel<>(getModel(), FacetConstants.FIELD_SEARCHPAGE);
     234        final SolrFieldModel<String> searchServiceModel = new SolrFieldModel<>(getModel(), FacetConstants.FIELD_SEARCH_SERVICE);
    217235        add(new WebMarkupContainer(id) {
    218236            {
    219237                //Add search page links (can be multiple)
    220                 add(new ListView<String>("searchPage", new CollectionListModel<String>(searchPageModel)) {
     238                add(new ListView<String>("searchPage", new CollectionListModel<>(searchPageModel)) {
    221239
    222240                    @Override
     
    227245
    228246                // We assume there can be multiple content search endpoints too
    229                 add(new ListView<String>("contentSearch", new CollectionListModel<String>(searchServiceModel)) {
     247                add(new ListView<String>("contentSearch", new CollectionListModel<>(searchServiceModel)) {
    230248
    231249                    @Override
     
    305323        // Put the name of the record in the page title
    306324        return new StringResourceModel("recordpage.title",
    307                 new NullFallbackModel(new SolrFieldStringModel(getModel(), FacetConstants.FIELD_NAME), getString("recordpage.unnamedrecord")),
    308                 DEFAULT_PAGE_TITLE);
     325                new NullFallbackModel(new SolrFieldStringModel(getModel(), FacetConstants.FIELD_NAME), getString("recordpage.unnamedrecord")))
     326                .setDefaultValue(DEFAULT_PAGE_TITLE);
    309327    }
    310328
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/SimpleSearchPage.java

    r6494 r6755  
    2121import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
    2222import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService;
     23import eu.clarin.cmdi.vlo.wicket.model.PermaLinkModel;
    2324import eu.clarin.cmdi.vlo.wicket.panels.search.SearchFormPanel;
    2425import eu.clarin.cmdi.vlo.wicket.panels.SingleFacetPanel;
     
    6465
    6566        // add an updatable container for breadcrumbs and top links
    66         navigation = new WebMarkupContainer("navigation");
    67         navigation.setOutputMarkupId(true);
     67        navigation = createNavigation("navigation");
    6868        add(navigation);
    69 
    70         navigation.add(new BookmarkablePageLink("breadcrumb", getApplication().getHomePage()));
    71         navigation.add(new TopLinksPanel("topLinks", null));
    7269
    7370        // add a persistenet panel for selection of a value for the collection facet
     
    8885        browse = new SimpleSearchBrowsePanel("browse", getModel());
    8986        add(browse);
     87    }
     88
     89    private WebMarkupContainer createNavigation(String id) {
     90        final WebMarkupContainer container = new WebMarkupContainer(id);
     91        container.setOutputMarkupId(true);
     92        container.add(new BookmarkablePageLink("breadcrumb", getApplication().getHomePage()));
     93        container.add(new TopLinksPanel("topLinks", new PermaLinkModel(getPageClass(), getModel())) {
     94
     95            @Override
     96            protected void onChange(AjaxRequestTarget target) {
     97                if (target != null) {
     98                    target.add(container);
     99                }
     100            }
     101
     102        });
     103        return container;
    90104    }
    91105
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/VloBasePage.java

    r6412 r6755  
    3333import org.apache.wicket.markup.html.link.ExternalLink;
    3434import org.apache.wicket.markup.html.panel.FeedbackPanel;
     35import org.apache.wicket.migrate.StringResourceModelMigration;
    3536import org.apache.wicket.model.IModel;
    3637import org.apache.wicket.model.Model;
    37 import org.apache.wicket.model.StringResourceModel;
    3838import org.apache.wicket.request.mapper.parameter.PageParameters;
    3939import org.apache.wicket.request.resource.CssResourceReference;
     
    155155     */
    156156    public IModel<String> getPageDescriptionModel() {
    157         return new StringResourceModel("vloDescription", null, (Object[]) null);
     157        return StringResourceModelMigration.of("vloDescription", null, (Object[]) null);
    158158    }
    159159
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/FieldsTablePanel.html

    r5012 r6755  
    2828                    <tr wicket:id="documentField">
    2929                        <td class="attribute">
    30                             <div wicket:id="fieldName">Description</div>
     30                            <div class="fieldName" wicket:id="fieldName">Description</div>
    3131                        </td><td class="attributeValue">
    3232                            <ul class="attributeValues">
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/FieldsTablePanel.java

    r6268 r6755  
    2020import com.google.common.collect.ImmutableSet;
    2121import eu.clarin.cmdi.vlo.FacetConstants;
     22import eu.clarin.cmdi.vlo.JavaScriptResources;
    2223import eu.clarin.cmdi.vlo.config.VloConfig;
    2324import eu.clarin.cmdi.vlo.pojo.DocumentField;
     
    2829import eu.clarin.cmdi.vlo.wicket.components.SmartLinkFieldValueLabel;
    2930import eu.clarin.cmdi.vlo.wicket.model.HandleLinkModel;
     31import eu.clarin.cmdi.vlo.wicket.model.SolrFieldDescriptionModel;
    3032import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel;
    3133import eu.clarin.cmdi.vlo.wicket.pages.FacetedSearchPage;
     
    3537import org.apache.wicket.AttributeModifier;
    3638import org.apache.wicket.Component;
     39import org.apache.wicket.behavior.AttributeAppender;
    3740import org.apache.wicket.extensions.markup.html.basic.SmartLinkMultiLineLabel;
     41import org.apache.wicket.markup.head.CssHeaderItem;
     42import org.apache.wicket.markup.head.IHeaderResponse;
     43import org.apache.wicket.markup.head.JavaScriptHeaderItem;
    3844import org.apache.wicket.markup.html.basic.Label;
    3945import org.apache.wicket.markup.html.link.Link;
     
    8995                final PropertyModel<String> fieldNameModel = new PropertyModel<String>(fieldModel, "fieldName");
    9096                final SolrFieldNameModel friendlyFieldNameModel = new SolrFieldNameModel(fieldNameModel);
    91                 item.add(new Label("fieldName", friendlyFieldNameModel));
     97                final Label fieldName = new Label("fieldName", friendlyFieldNameModel);
     98                item.add(fieldName);
     99                fieldName.add(new AttributeAppender("title", new SolrFieldDescriptionModel(fieldNameModel)));
    92100                final PropertyModel<List> valuesModel = new PropertyModel<List>(fieldModel, "values");
    93101                item.add(new ListView("values", valuesModel) {
     
    160168        return true;
    161169    }
     170   
     171//    re-enable for 'fancy' popups for the field descriptions
     172//    @Override
     173//    public void renderHead(IHeaderResponse response) {
     174//        // JQuery UI for tooltips
     175//        response.render(CssHeaderItem.forReference(JavaScriptResources.getJQueryUICSS()));
     176//        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getFieldsTableJS()));
     177//    }
    162178
    163179}
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/HierarchyPanel.html

    r6412 r6755  
    3838                <a wicket:id="showAll">Show all... (<span wicket:id="itemCount">999</span>)</a>
    3939            </div>
    40             <div id="tree" wicket:id="tree">[TREE]</div>
     40            <div wicket:id="treeContainer">
     41                <div id="tree" wicket:id="tree">[TREE]</div>
     42            </div>
    4143        </wicket:panel>
    4244    </body>
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/HierarchyPanel.java

    r6412 r6755  
    2121import eu.clarin.cmdi.vlo.FacetConstants;
    2222import eu.clarin.cmdi.vlo.service.solr.SolrDocumentService;
     23import eu.clarin.cmdi.vlo.wicket.components.AjaxFallbackLinkLabel;
    2324import eu.clarin.cmdi.vlo.wicket.components.IndicatingNestedTree;
    2425import eu.clarin.cmdi.vlo.wicket.components.NamedRecordPageLink;
    2526import eu.clarin.cmdi.vlo.wicket.model.SolrDocumentModel;
     27import java.io.Serializable;
    2628import java.util.Collection;
    2729import java.util.Collections;
    2830import java.util.Iterator;
     31import java.util.Objects;
    2932import org.apache.solr.common.SolrDocument;
    3033import org.apache.wicket.Component;
     34import org.apache.wicket.MarkupContainer;
    3135import org.apache.wicket.ajax.AjaxRequestTarget;
    3236import org.apache.wicket.behavior.AttributeAppender;
     
    5862     */
    5963    public static final int INITIAL_PARENTS_SHOWN = 5;
     64    public static final int INITIAL_CHILRDEN_SHOWN = 50;
    6065
    6166    @SpringBean
     
    6368
    6469    private final IDataProvider<SolrDocument> parentsProvider;
    65     private final AbstractTree<SolrDocument> tree;
     70    private final MarkupContainer treeContainer;
     71    private final AbstractTree<ModelWrapper<SolrDocument>> tree;
    6672    private final IModel<SolrDocument> pageDocumentModel;
    6773
     
    7581
    7682        tree = createTree("tree");
    77         add(tree);
     83
     84        treeContainer = new WebMarkupContainer("treeContainer");
     85        treeContainer.setOutputMarkupId(true);
     86        treeContainer.add(tree);
     87        add(treeContainer);
    7888
    7989        setOutputMarkupId(true);
     
    97107                        // tree root up one level, expand root for traceability by user
    98108                        HierarchyPanel.this.setModel(item.getModel());
    99                         tree.expand(item.getModelObject());
     109                        tree.expand(new ModelWrapper<>(item.getModel()));
    100110                        if (target != null) {
    101111                            target.add(HierarchyPanel.this);
     
    103113                    }
    104114                });
    105                
     115
    106116                item.add(new Behavior() {
    107117
     
    148158    }
    149159
    150     private AbstractTree<SolrDocument> createTree(String id) {
    151         final AbstractTree<SolrDocument> result = new IndicatingNestedTree<SolrDocument>(id, new HierarchyTreeProvider()) {
    152 
    153             @Override
    154             protected Component newContentComponent(String id, final IModel<SolrDocument> node) {
    155                 return new NamedRecordPageLink(id, node) {
    156 
    157                     @Override
    158                     protected void onConfigure() {
    159                         setEnabled(!node.equals(pageDocumentModel));
    160                     }
    161                 };
     160    private AbstractTree createTree(String id) {
     161        final HierarchyTreeProvider treeProvider = new HierarchyTreeProvider();
     162        final AbstractTree<ModelWrapper<SolrDocument>> result = new IndicatingNestedTree<ModelWrapper<SolrDocument>>(id, treeProvider) {
     163
     164            @Override
     165            protected Component newContentComponent(String id, final IModel<ModelWrapper<SolrDocument>> node) {
     166                if (node.getObject().isLimit()) {
     167                    return new AjaxFallbackLinkLabel(id, node, Model.of("Show all... (" + node.getObject().getCount() + ")")) {
     168
     169                        @Override
     170                        public void onClick(AjaxRequestTarget target) {
     171                            treeProvider.setChildrenShown(null);
     172                            target.add(treeContainer);
     173                        }
     174
     175                    };
     176                } else {
     177                    return new NamedRecordPageLink(id, node.getObject().getModel()) {
     178
     179                        @Override
     180                        protected void onConfigure() {
     181                            setEnabled(!node.equals(pageDocumentModel));
     182                        }
     183                    };
     184                }
    162185            }
    163186
     
    184207    }
    185208
    186     private class HierarchyTreeProvider extends SortableTreeProvider<SolrDocument, Object> {
    187 
    188         @Override
    189         public Iterator<? extends SolrDocument> getRoots() {
    190             return Iterators.singletonIterator(HierarchyPanel.this.getModel().getObject());
    191         }
    192 
    193         @Override
    194         public boolean hasChildren(SolrDocument node) {
    195             Object partCount = node.getFieldValue(FacetConstants.FIELD_HAS_PART_COUNT);
    196             return (partCount instanceof Number) && ((Number) partCount).intValue() > 0;
    197         }
    198 
    199         @Override
    200         public Iterator<? extends SolrDocument> getChildren(SolrDocument node) {
    201             final Collection<Object> parts = node.getFieldValues(FacetConstants.FIELD_HAS_PART);
    202             return Iterators.transform(parts.iterator(), new Function<Object, SolrDocument>() {
    203 
    204                 @Override
    205                 public SolrDocument apply(Object childId) {
    206                     return documentService.getDocument(childId.toString());
    207                 }
    208             });
    209         }
    210 
    211         @Override
    212         public IModel<SolrDocument> model(SolrDocument object) {
    213             return new SolrDocumentModel(object);
     209    private class HierarchyTreeProvider extends SortableTreeProvider<ModelWrapper<SolrDocument>, Object> {
     210
     211        private Integer childrenShown = INITIAL_CHILRDEN_SHOWN;
     212
     213        public void setChildrenShown(Integer childrenShown) {
     214            this.childrenShown = childrenShown;
     215        }
     216
     217        @Override
     218        public Iterator<? extends ModelWrapper<SolrDocument>> getRoots() {
     219            return Iterators.singletonIterator(
     220                    new ModelWrapper<>(
     221                            HierarchyPanel.this.getModel()));
     222        }
     223
     224        @Override
     225        public boolean hasChildren(ModelWrapper<SolrDocument> node) {
     226            if (node.isLimit()) {
     227                return false;
     228            } else {
     229                final Object partCount = node.getModelObject().getFieldValue(FacetConstants.FIELD_HAS_PART_COUNT);
     230                return (partCount instanceof Number) && ((Number) partCount).intValue() > 0;
     231            }
     232        }
     233
     234        @Override
     235        public Iterator<? extends ModelWrapper<SolrDocument>> getChildren(ModelWrapper<SolrDocument> node) {
     236            if (node.isLimit()) {
     237                return Collections.emptyIterator();
     238            } else {
     239                final Collection<Object> parts = node.getModelObject().getFieldValues(FacetConstants.FIELD_HAS_PART);
     240                final Iterator<Object> objectIterator;
     241                if (childrenShown == null) {
     242                    // unlimited
     243                    objectIterator = parts.iterator();
     244                } else {
     245                    objectIterator = Iterators.limit(parts.iterator(), childrenShown);
     246                }
     247                final Iterator<ModelWrapper<SolrDocument>> iterator = Iterators.transform(objectIterator, new Function<Object, ModelWrapper<SolrDocument>>() {
     248
     249                    @Override
     250                    public ModelWrapper<SolrDocument> apply(Object childId) {
     251                        final SolrDocument document = documentService.getDocument(childId.toString());
     252                        return new ModelWrapper<>(new SolrDocumentModel(document));
     253                    }
     254                });
     255                if (childrenShown != null && parts.size() > childrenShown) {
     256                    return Iterators.concat(iterator, // add empty model wrapper to indicate "end of page"
     257                            Iterators.singletonIterator(new ModelWrapper<SolrDocument>(parts.size())));
     258                } else {
     259                    return iterator;
     260                }
     261            }
     262        }
     263
     264        @Override
     265        public IModel<ModelWrapper<SolrDocument>> model(ModelWrapper<SolrDocument> object) {
     266            return object;
    214267        }
    215268    }
     
    269322    }
    270323
     324    private class ModelWrapper<T> extends AbstractReadOnlyModel<ModelWrapper<T>> implements Serializable {
     325
     326        /**
     327         * Limit reached?
     328         */
     329        private final boolean limit;
     330
     331        /**
     332         * Total number of items (if beyond the limit)
     333         */
     334        private final int count;
     335
     336        /**
     337         * Inner model
     338         */
     339        private final IModel<T> model;
     340
     341        public ModelWrapper(int count) {
     342            this.limit = true;
     343            this.count = count;
     344            this.model = null;
     345        }
     346
     347        public ModelWrapper(IModel<T> model) {
     348            this.limit = false;
     349            this.count = -1;
     350            this.model = model;
     351        }
     352
     353        public boolean isLimit() {
     354            return limit;
     355        }
     356
     357        public IModel<T> getModel() {
     358            return model;
     359        }
     360
     361        public int getCount() {
     362            return count;
     363        }
     364
     365        public T getModelObject() {
     366            if (model == null) {
     367                return null;
     368            } else {
     369                return model.getObject();
     370            }
     371        }
     372
     373        // as IModel<T>
     374        @Override
     375        public void detach() {
     376            if (model != null) {
     377                model.detach();
     378            }
     379        }
     380
     381        // as IModel<T>
     382        @Override
     383        public ModelWrapper<T> getObject() {
     384            return this;
     385        }
     386
     387        @Override
     388        public int hashCode() {
     389            int hash = 5;
     390            hash = 41 * hash + (this.limit ? 1 : 0);
     391            hash = 41 * hash + Objects.hashCode(this.model);
     392            return hash;
     393        }
     394
     395        @Override
     396        public boolean equals(Object obj) {
     397            if (obj == null) {
     398                return false;
     399            }
     400            if (getClass() != obj.getClass()) {
     401                return false;
     402            }
     403            final ModelWrapper<?> other = (ModelWrapper<?>) obj;
     404            if (this.limit != other.limit) {
     405                return false;
     406            }
     407            if (!Objects.equals(this.model, other.model)) {
     408                return false;
     409            }
     410            return true;
     411        }
     412
     413    }
     414
    271415}
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/RecordNavigationPanel.java

    r4872 r6755  
    2222import org.apache.wicket.markup.html.basic.Label;
    2323import org.apache.wicket.markup.html.panel.GenericPanel;
     24import org.apache.wicket.migrate.StringResourceModelMigration;
    2425import org.apache.wicket.model.AbstractReadOnlyModel;
    2526import org.apache.wicket.model.IModel;
    2627import org.apache.wicket.model.PropertyModel;
    27 import org.apache.wicket.model.StringResourceModel;
    2828
    2929/**
     
    3838        super(id, model);
    3939
     40       
     41       
    4042        // Add a label 'record X of Y'
    41         add(new Label("recordIndex", new StringResourceModel("record.navigation.index", this, model,
     43        add(new Label("recordIndex", StringResourceModelMigration.of("record.navigation.index", this, model,
    4244                new Object[]{
    4345                    // These values get inserted into the string
     
    4547                    new ShiftedIndexModel(new PropertyModel<Long>(model, "index"), +1),
    4648                    // Second: total result count, unmodified
    47                     new PropertyModel<Integer>(model, "resultCount")
     49                    new PropertyModel<>(model, "resultCount")
    4850                }
    4951        )));
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/ResourceLinkDetailsPanel.java

    r4907 r6755  
    2020import org.apache.wicket.markup.html.basic.Label;
    2121import org.apache.wicket.markup.html.panel.Panel;
     22import org.apache.wicket.migrate.StringResourceModelMigration;
    2223import org.apache.wicket.model.CompoundPropertyModel;
    2324import org.apache.wicket.model.IModel;
    24 import org.apache.wicket.model.StringResourceModel;
    2525
    2626/**
     
    3434    public ResourceLinkDetailsPanel(String id, IModel<ResourceInfo> model) {
    3535        super(id, model);
    36         setDefaultModel(new CompoundPropertyModel<ResourceInfo>(model));
     36        setDefaultModel(new CompoundPropertyModel<>(model));
    3737        // get the friendly name of the resource type dynamically from the resource bundle
    38         add(new Label("resourceType", new StringResourceModel("resourcetype.${resourceType}.singular", model, model.getObject().getResourceType())));
     38        add(new Label("resourceType", StringResourceModelMigration.of("resourcetype.${resourceType}.singular", model, model.getObject().getResourceType())));
    3939        add(new Label("fileName"));
    4040        add(new Label("mimeType"));
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/record/ResourceLinksPanel.java

    r6350 r6755  
    2525import java.util.Collection;
    2626import java.util.List;
    27 import org.apache.wicket.Component;
    2827import org.apache.wicket.MarkupContainer;
    2928import org.apache.wicket.ajax.AjaxRequestTarget;
     
    6261
    6362        // list view that shows all resources as links that show a resource details panel when clicked
    64         final ResourcesListView resourceListing = new ResourcesListView("resource", new CollectionListModel<String>(model));
     63        final ResourcesListView resourceListing = new ResourcesListView("resource", new CollectionListModel<>(model));
    6564        add(resourceListing);
    6665
     
    9089    private class ResourcesListView extends PageableListView<String> {
    9190
    92         public ResourcesListView(String id, IModel<? extends List<? extends String>> model) {
     91        public ResourcesListView(String id, IModel<? extends List<String>> model) {
    9392            super(id, model, ITEMS_PER_PAGE);
    9493            setReuseItems(true);
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AdvancedSearchOptionsPanel.html

    r6494 r6755  
    3131                            <label for="onlyfcs">Only include resources that support content search</label>
    3232                        </li>
    33                         <li>
     33                        <li wicket:id="collectionsSection">
    3434                            <input wicket:id="collection" type="checkbox" id="onlycollections"/>
    3535                            <label for="onlycollections">Only include collection resources</label>
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AdvancedSearchOptionsPanel.java

    r6493 r6755  
    1919import com.google.common.collect.ImmutableSet;
    2020import eu.clarin.cmdi.vlo.FacetConstants;
     21import eu.clarin.cmdi.vlo.config.VloConfig;
    2122import eu.clarin.cmdi.vlo.pojo.ExpansionState;
    2223import eu.clarin.cmdi.vlo.pojo.FacetSelection;
     
    2728import eu.clarin.cmdi.vlo.wicket.panels.ExpandablePanel;
    2829import java.util.Collection;
     30import org.apache.wicket.MarkupContainer;
    2931import org.apache.wicket.ajax.AjaxRequestTarget;
    3032import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
     33import org.apache.wicket.markup.html.WebMarkupContainer;
    3134import org.apache.wicket.markup.html.basic.Label;
    3235import org.apache.wicket.markup.html.form.CheckBox;
    3336import org.apache.wicket.markup.html.form.Form;
    3437import org.apache.wicket.model.IModel;
     38import org.apache.wicket.spring.injection.annot.SpringBean;
    3539
    3640/**
     
    4549public abstract class AdvancedSearchOptionsPanel extends ExpandablePanel<QueryFacetsSelection> {
    4650
     51    @SpringBean
     52    private VloConfig config;
     53   
    4754    /**
    4855     * The fields that this panel provides options for
     
    5865        final CheckBox fcsCheck = createFieldNotEmptyOption("fcs", FacetConstants.FIELD_SEARCH_SERVICE);
    5966        options.add(fcsCheck);
     67       
     68        final MarkupContainer collectionsSection = new WebMarkupContainer("collectionsSection");
    6069        final CheckBox collectionCheck = createFieldNotEmptyOption("collection", FacetConstants.FIELD_HAS_PART_COUNT);
    61         options.add(collectionCheck);
     70        collectionsSection.add(collectionCheck);
     71        collectionsSection.setVisible(config.isProcessHierarchies());
     72        options.add(collectionsSection);
     73       
    6274       
    6375        add(options);
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AllFacetValuesPanel.java

    r6494 r6755  
    131131
    132132    private DataView<FacetField.Count> createValuesView(String id) {
    133         final IModel<String> fieldNameModel = new PropertyModel<String>(getModel(), "name");
     133        final IModel<String> fieldNameModel = new PropertyModel<>(getModel(), "name");
    134134        return new DataView<FacetField.Count>(id, valuesProvider, ITEMS_PER_PAGE) {
    135135
    136136            @Override
    137137            protected void populateItem(final Item<FacetField.Count> item) {
    138                 item.setDefaultModel(new CompoundPropertyModel<FacetField.Count>(item.getModel()));
     138                item.setDefaultModel(new CompoundPropertyModel<>(item.getModel()));
    139139
    140140                // link to select an individual facet value
     
    170170        options.add(sortSelect);
    171171
    172         final TextField filterField = new TextField<String>("filter", new PropertyModel(filterModel, "name"));
     172        final TextField filterField = new TextField<>("filter", new PropertyModel(filterModel, "name"));
    173173        filterField.add(new AjaxFormComponentUpdatingBehavior("keyup") {
    174174
     
    202202
    203203        // Model that holds the actual number of occurences filtered on
    204         final IModel<Integer> minOccurenceModel = new PropertyModel<Integer>(filterModel, "minimalOccurence");
     204        final IModel<Integer> minOccurenceModel = new PropertyModel<>(filterModel, "minimalOccurence");
    205205        // Model that represents the filter state ('bridge' between filter and selection)
    206206        final IModel<Boolean> bridgeStateModel = Model.of(false);
    207207        // Model that represents the *selected* number of minimal occurences (passes it on if not decoupled)
    208         final IModel<Integer> minOccurenceSelectModel = new BridgeOuterModel<Integer>(minOccurenceModel, bridgeStateModel, 2);
     208        final IModel<Integer> minOccurenceSelectModel = new BridgeOuterModel<>(minOccurenceModel, bridgeStateModel, 2);
    209209        // Model that links the actual filter, selection and bridge (object opens and closes it)
    210         final IModel<Boolean> minOccurenceCheckBoxModel = new BridgeModel<Integer>(minOccurenceModel, minOccurenceSelectModel, bridgeStateModel, 0);
     210        final IModel<Boolean> minOccurenceCheckBoxModel = new BridgeModel<>(minOccurenceModel, minOccurenceSelectModel, bridgeStateModel, 0);
    211211
    212212        // checkbox to open and close the 'bridge'
     
    216216
    217217        // Dropdown to select a value (which is applied to the filter if the 'bridge' is open)
    218         final DropDownChoice<Integer> minOccurence = new DropDownChoice<Integer>("minOccurences", minOccurenceSelectModel, ImmutableList.of(2, 5, 10, 100, 1000));
     218        final DropDownChoice<Integer> minOccurence = new DropDownChoice<>("minOccurences", minOccurenceSelectModel, ImmutableList.of(2, 5, 10, 100, 1000));
    219219        minOccurence.add(new UpdateOptionsFormBehavior(options) {
    220220
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetValuesPanel.java

    r6501 r6755  
    7777    @SpringBean
    7878    private FieldValueConverterProvider fieldValueConverterProvider;
     79
    7980    /**
    8081     * Creates a new panel with selectable values for a single facet
     
    133134    private Form createFilterForm(String id) {
    134135        final Form filterForm = new Form(id);
    135         final TextField<String> filterField = new TextField<String>("filterText",
     136        final TextField<String> filterField = new TextField<>("filterText",
    136137                new PropertyModel<String>(filterModel, "name"));
    137138        // make field update
     
    155156     */
    156157    private DataView createValuesView(String id) {
    157         final FacetFieldValuesProvider valuesProvider = new FacetFieldValuesProvider(getModel(), MAX_NUMBER_OF_FACETS_TO_SHOW, LOW_PRIORITY_VALUES, fieldValueConverterProvider){
     158        final FacetFieldValuesProvider valuesProvider = new FacetFieldValuesProvider(getModel(), MAX_NUMBER_OF_FACETS_TO_SHOW, LOW_PRIORITY_VALUES, fieldValueConverterProvider) {
    158159
    159160            @Override
     
    164165        };
    165166        // partition the values according to the specified partition size
    166         final PartitionedDataProvider<Count, FieldValuesOrder> partitionedValuesProvider = new PartitionedDataProvider<FacetField.Count, FieldValuesOrder>(valuesProvider, subListSize);
     167        final PartitionedDataProvider<Count, FieldValuesOrder> partitionedValuesProvider = new PartitionedDataProvider<>(valuesProvider, subListSize);
    167168
    168169        // create the view for the partitions
    169         final DataView<List<? extends Count>> valuesView = new DataView<List<? extends Count>>(id, partitionedValuesProvider) {
    170 
    171             @Override
    172             protected void populateItem(Item<List<? extends Count>> item) {
     170        final DataView<List<Count>> valuesView = new DataView<List<Count>>(id, partitionedValuesProvider) {
     171
     172            @Override
     173            protected void populateItem(Item<List<Count>> item) {
    173174                // create a list view for the values in this partition
    174                 item.add(new ListView<Count>("facetValues", item.getModel()) {
     175                item.add(new ListView("facetValues", item.getModel()) {
    175176
    176177                    @Override
    177                     protected void populateItem(ListItem<Count> item) {
     178                    protected void populateItem(ListItem item) {
    178179                        addFacetValue("facetSelect", item);
    179180                    }
     
    191192     */
    192193    private void addFacetValue(String id, final ListItem<Count> item) {
    193         item.setDefaultModel(new CompoundPropertyModel<Count>(item.getModel()));
     194        item.setDefaultModel(new CompoundPropertyModel<>(item.getModel()));
    194195
    195196        // link to select an individual facet value
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetsPanel.java

    r6494 r6755  
    7474                // making it dynamic in case the selection and therefore
    7575                // set of available values changes
    76                 // TODO: Limit to number of items shown while keeping 'more' function?
    7776                item.add(
    7877                        new FacetPanel("facet",
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SearchFormPanel.java

    r6507 r6755  
    2121import eu.clarin.cmdi.vlo.service.solr.AutoCompleteService;
    2222import java.util.Iterator;
     23import org.apache.wicket.Component;
    2324import org.apache.wicket.ajax.AjaxRequestTarget;
     25import org.apache.wicket.ajax.attributes.AjaxCallListener;
     26import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
    2427import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
    2528import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
     
    4346    private AutoCompleteService autoCompleteDao;
    4447
     48    //private final AjaxIndicatorAppender indicatorAppender = new AjaxIndicatorAppender();
    4549    public SearchFormPanel(String id, IModel<QueryFacetsSelection> model) {
    4650        super(id, model);
     
    6569                SearchFormPanel.this.onSubmit(target);
    6670            }
     71
     72            @Override
     73            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
     74                super.updateAjaxAttributes(attributes);
     75
     76                // listener to start/stop indicating progress
     77                AjaxCallListener listener = new AjaxCallListener() {
     78
     79                    @Override
     80                    public CharSequence getBeforeHandler(Component component) {
     81                        return ("startSearch();");
     82                    }
     83
     84                    @Override
     85                    public CharSequence getCompleteHandler(Component component) {
     86                        return ("endSearch();");
     87                    }
     88
     89                };
     90                attributes.getAjaxCallListeners().add(listener);
     91            }
     92
    6793        }
    6894        );
     
    7096        add(form);
    7197    }
    72 
     98   
    7399    protected abstract void onSubmit(AjaxRequestTarget target);
    74100
     
    79105        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getJQueryUIJS()));
    80106        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getSyntaxHelpJS()));
     107        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getSearchFormJS()));
    81108    }
    82109}
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SearchResultItemCollapsedPanel.java

    r4998 r6755  
    3333import org.apache.wicket.markup.repeater.data.DataView;
    3434import org.apache.wicket.markup.repeater.data.IDataProvider;
     35import org.apache.wicket.migrate.StringResourceModelMigration;
    3536import org.apache.wicket.model.IModel;
    3637import org.apache.wicket.model.StringResourceModel;
     
    5960
    6061        // get model for resources
    61         final SolrFieldModel<String> resourcesModel = new SolrFieldModel<String>(documentModel, FacetConstants.FIELD_RESOURCE);
     62        final SolrFieldModel<String> resourcesModel = new SolrFieldModel<>(documentModel, FacetConstants.FIELD_RESOURCE);
    6263        // wrap with a count provider
    6364        final ResouceTypeCountDataProvider countProvider = new ResouceTypeCountDataProvider(resourcesModel, countingService);
     
    112113            // first create a string model that provides the type of resources
    113114            // in the right number (plural or singular, conveniently supplied by ResourceTypeCount)
    114             final StringResourceModel resourceTypeModel = new StringResourceModel("resourcetype.${resourceType}.${number}", resourceTypeCountModel, "?");
     115            final StringResourceModel resourceTypeModel = StringResourceModelMigration.of("resourcetype.${resourceType}.${number}", resourceTypeCountModel, "?");
    115116            // inject this into the resource string that combines it with count
    116             return new StringResourceModel("resources.typecount", this, resourceTypeCountModel, resourceTypeModel);
     117            return StringResourceModelMigration.of("resources.typecount", this, resourceTypeCountModel, resourceTypeModel);
    117118        }
    118119    }
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SearchResultItemExpandedPanel.java

    r6268 r6755  
    3737import org.apache.solr.common.SolrDocument;
    3838import org.apache.wicket.ajax.AjaxRequestTarget;
    39 import org.apache.wicket.extensions.markup.html.basic.SmartLinkLabel;
    4039import org.apache.wicket.markup.html.WebMarkupContainer;
    4140import org.apache.wicket.markup.html.basic.Label;
     
    4443import org.apache.wicket.markup.html.list.PageableListView;
    4544import org.apache.wicket.markup.html.panel.GenericPanel;
     45import org.apache.wicket.migrate.StringResourceModelMigration;
    4646import org.apache.wicket.model.AbstractReadOnlyModel;
    4747import org.apache.wicket.model.IModel;
    4848import org.apache.wicket.model.Model;
    4949import org.apache.wicket.model.PropertyModel;
    50 import org.apache.wicket.model.StringResourceModel;
    5150import org.apache.wicket.spring.injection.annot.SpringBean;
    5251
     
    9493
    9594    private WebMarkupContainer createResourcesView(String id, final IModel<SearchContext> selectionModel) {
    96         final SolrFieldModel<String> resourceModel = new SolrFieldModel<String>(getModel(), FacetConstants.FIELD_RESOURCE);
     95        final SolrFieldModel<String> resourceModel = new SolrFieldModel<>(getModel(), FacetConstants.FIELD_RESOURCE);
    9796        // create a container for the list view that is only visible if there actually are resources
    9897        final WebMarkupContainer container = new WebMarkupContainer(id) {
     
    119118        };
    120119        // add a record page link that shows the number of resources not shown
    121         moreLink.add(new Label("moreLabel", new StringResourceModel("resources.more", new AbstractReadOnlyModel<Integer>() {
     120        moreLink.add(new Label("moreLabel", StringResourceModelMigration.of("resources.more", new AbstractReadOnlyModel<Integer>() {
    122121
    123122            @Override
     
    134133    private PageableListView createResourcesList(String id, SolrFieldModel<String> resourceModel) {
    135134        // list of resources in this record
    136         final IModel<List<String>> resourceListModel = new CollectionListModel<String>(resourceModel);
     135        final IModel<List<String>> resourceListModel = new CollectionListModel<>(resourceModel);
    137136        // use a a pageable view so that the number of resources actually shown is limited
    138137        return new PageableListView<String>(id, resourceListModel, MAX_RESOURCES_TO_SHOW) {
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SearchResultItemPanel.java

    r6232 r6755  
    2121import eu.clarin.cmdi.vlo.pojo.ExpansionState;
    2222import eu.clarin.cmdi.vlo.pojo.SearchContext;
     23import eu.clarin.cmdi.vlo.wicket.HighlightSearchTermScriptFactory;
    2324import eu.clarin.cmdi.vlo.wicket.components.RecordPageLink;
    2425import eu.clarin.cmdi.vlo.wicket.components.SolrFieldLabel;
     
    3536import org.apache.wicket.model.IModel;
    3637import org.apache.wicket.spring.injection.annot.SpringBean;
     38import org.apache.wicket.util.string.Strings;
    3739
    3840/**
     
    4446    @SpringBean
    4547    private VloConfig config;
    46    
     48
    4749    private final Panel collapsedDetails;
    4850    private final Panel expandedDetails;
    4951    private final IModel<ExpansionState> expansionStateModel;
     52    private final IModel<SearchContext> selectionModel;
    5053
    5154    /**
     
    6164        super(id, documentModel);
    6265        this.expansionStateModel = expansionStateModel;
     66        this.selectionModel = selectionModel;
    6367
    6468        final Link recordLink = new RecordPageLink("recordLink", documentModel, selectionModel);
     
    100104                    // parial update (just this search result item)
    101105                    target.add(SearchResultItemPanel.this);
     106
     107                    // in case of a query, update highlight matching search terms after collapse/expand
     108                    final String query = selectionModel.getObject().getSelection().getQuery();
     109                    if (!Strings.isEmpty(query)) {
     110                        final HighlightSearchTermScriptFactory scriptFactory = new HighlightSearchTermScriptFactory();
     111                        final String selector = "#" + SearchResultItemPanel.this.getMarkupId();
     112                        target.appendJavaScript(scriptFactory.createScript(selector, query));
     113                    }
    102114                }
    103115            }
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SearchResultsPanel.java

    r6191 r6755  
    1818
    1919import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
     20import eu.clarin.cmdi.vlo.wicket.HighlightSearchTermBehavior;
     21import eu.clarin.cmdi.vlo.wicket.HighlightSearchTermScriptFactory;
    2022import eu.clarin.cmdi.vlo.wicket.model.SearchContextModel;
    2123import eu.clarin.cmdi.vlo.wicket.model.SearchResultExpansionStateModel;
     
    2628import java.util.Set;
    2729import org.apache.solr.common.SolrDocument;
     30import org.apache.wicket.Component;
     31import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
    2832import org.apache.wicket.ajax.AjaxRequestTarget;
    2933import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
     
    4145import org.apache.wicket.model.Model;
    4246import org.apache.wicket.model.PropertyModel;
     47import org.apache.wicket.util.string.StringValue;
    4348
    4449/**
     
    9398        //For Ajax updating of search results
    9499        setOutputMarkupId(true);
     100       
     101        add(new HighlightSearchTermBehavior(){
     102
     103            @Override
     104            protected String getComponentSelector(String componentId) {
     105                return ".searchresultitem"; //"h3, .searchresultdescription"
     106            }
     107
     108            @Override
     109            protected String getWordList(Component component) {
     110                return selectionModel.getObject().getQuery();
     111            }
     112           
     113        });
    95114    }
    96115   
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SimpleSearchBrowsePanel.java

    r6494 r6755  
    2929import org.apache.wicket.markup.html.list.ListView;
    3030import org.apache.wicket.markup.html.panel.GenericPanel;
     31import org.apache.wicket.migrate.StringResourceModelMigration;
    3132import org.apache.wicket.model.AbstractReadOnlyModel;
    3233import org.apache.wicket.model.IModel;
    3334import org.apache.wicket.model.Model;
    3435import org.apache.wicket.model.PropertyModel;
    35 import org.apache.wicket.model.StringResourceModel;
    3636import org.apache.wicket.spring.injection.annot.SpringBean;
    3737
     
    8585        };
    8686        // set label on basis of string defined in resource bundle that takes the count model as a parameter
    87         browseAllLink.add(new Label("recordCount", new StringResourceModel("simplesearch.allrecords", documentCountModel, new Object[]{})));
     87        browseAllLink.add(new Label("recordCount", StringResourceModelMigration.of("simplesearch.allrecords", documentCountModel, new Object[]{})));
    8888        add(browseAllLink);
    8989
     
    113113         * Model that holds the currently selected facet
    114114         */
    115         private final IModel<String> selectedFacetModel = new Model<String>(null);
     115        private final IModel<String> selectedFacetModel = new Model<>(null);
    116116        private final IModel<QueryFacetsSelection> selectionModel;
    117117
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProvider.java

    r6040 r6755  
    8888     */
    8989    public FacetFieldValuesProvider(IModel<FacetField> model, int max, Collection<String> lowPriorityValues, FieldValueConverterProvider fieldValueConverterProvider) {
    90         this(model, max, lowPriorityValues, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false), fieldValueConverterProvider);
     90        this(model, max, lowPriorityValues, new SortParam<>(FieldValuesOrder.COUNT, false), fieldValueConverterProvider);
    9191    }
    9292
     
    122122
    123123    @Override
    124     public Iterator<? extends FacetField.Count> iterator(long first, long count) {
     124    public Iterator<FacetField.Count> iterator(long first, long count) {
    125125        // return iterator starting at specified offset
    126126        return getList().listIterator((int) first);
     
    128128
    129129    @Override
    130     public List<? extends FacetField.Count> getList() {
     130    public List<FacetField.Count> getList() {
    131131        final Iterable<Count> filteredValues = getFilteredValues();
    132132        // sort what remains
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/ListProvider.java

    r5140 r6755  
    2626public interface ListProvider<T> {
    2727
    28     List<? extends T> getList();
     28    List<T> getList();
    2929   
    3030}
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/PartitionedDataProvider.java

    r5154 r6755  
    1717package eu.clarin.cmdi.vlo.wicket.provider;
    1818
     19import com.google.common.base.Functions;
    1920import com.google.common.collect.ImmutableList;
    2021import com.google.common.collect.Iterators;
     
    3435 * @param <S> the type of the sorting parameter
    3536 */
    36 public class PartitionedDataProvider<T, S> implements ISortableDataProvider<List<? extends T>, S> {
     37public class PartitionedDataProvider<T, S> implements ISortableDataProvider<List<T>, S> {
    3738
    38     private final ISortableDataProvider<? extends T, S> provider;
     39    private final ISortableDataProvider<T, S> provider;
    3940    private final int partitionSize;
    4041
     
    5152
    5253    @Override
    53     public Iterator<? extends List<? extends T>> iterator(long first, long count) {
     54    public Iterator<? extends List<T>> iterator(long first, long count) {
    5455        if (partitionSize > 0) {
    5556            // translate first, count to item level
    5657            final long itemsFirst = first * partitionSize;
    5758            final long itemsCount = count * partitionSize;
     59            // reduce wildcard to upper bound (i.e. remove "? extends")
     60            final Iterator<T> iterator
     61                    = Iterators.transform(provider.iterator(itemsFirst, itemsCount), Functions.<T>identity());
    5862            // split up values
    59             return Iterators.partition(provider.iterator(itemsFirst, itemsCount), partitionSize);
     63            return Iterators.partition(iterator, partitionSize);
    6064        } else {
    6165            // return a single list (wrapped in a singleton iterator)
    62             final List<? extends T> valuesList;
     66            final List<T> valuesList;
    6367            if (provider instanceof ListProvider) {
    6468                // get list straight out of provider, prevent double wrapping
     
    9195
    9296    @Override
    93     public IModel<List<? extends T>> model(List<? extends T> object) {
     97    public IModel<List<T>> model(List<T> object) {
    9498        // Iterators.partition sometimes returns lists that are not deeply serializable,
    9599        // so we need to copy this into a serializable list here :(
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/less/eu/clarin/cmdi/vlo/wicket/pages/inc/vlo-search.less

    r6350 r6755  
    143143#searchresultitems .searchresultdescription a {
    144144    text-decoration: underline;
     145}
     146
     147.searchresultitem .searchword {
     148    font-weight: bold;
    145149}
    146150
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/resources/fieldNames.properties

    r6291 r6755  
    4242field._hierarchyWeight=Hierarchy level
    4343field._hasPart=Has part(s)
     44field._hasPartCount=Child count
    4445field._isPartOf=Is part of
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/webapp/iframe/vlo-embed-base.html

    r6394 r6755  
    4242                            text-align:left;
    4343                            max-width:600px;
    44                             min-width:270px
     44                            min-width:270px;
    4545                           
    4646                            margin:8px 15px 2px 20px;
  • vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/test/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrFacetQueryFactoryImplTest.java

    r6284 r6755  
    5858
    5959        // default: query selects all values
    60         assertNull(query.getQuery());
     60        assertEquals("*:*", query.getQuery());
    6161
    6262        // no selection -> no filter queries
     
    8282
    8383        // default: query selects all values
    84         assertNull(query.getQuery());
     84        assertEquals("*:*", query.getQuery());
    8585
    8686        // Only empty selections -> no filter queries
     
    107107
    108108        // default: query selects all values
    109         assertNull(query.getQuery());
     109        assertEquals("*:*", query.getQuery());
    110110
    111111        // Expecting three filter queries as three values have been selected in total
Note: See TracChangeset for help on using the changeset viewer.