• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

knowledgepixels / nanodash / 23839110984

01 Apr 2026 08:21AM UTC coverage: 16.286% (-0.004%) from 16.29%
23839110984

push

github

web-flow
Merge pull request #427 from knowledgepixels/fix/426-query-page-npe

fix: skip null queries to prevent NPE on Query page

756 of 5707 branches covered (13.25%)

Branch coverage included in aggregate %.

1903 of 10620 relevant lines covered (17.92%)

2.46 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/main/java/com/knowledgepixels/nanodash/component/QueryList.java
1
package com.knowledgepixels.nanodash.component;
2

3
import com.knowledgepixels.nanodash.FilteredListDataProvider;
4
import com.knowledgepixels.nanodash.GrlcQuery;
5
import org.apache.wicket.ajax.AjaxRequestTarget;
6
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
7
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
8
import org.apache.wicket.extensions.markup.html.repeater.data.table.NavigatorLabel;
9
import org.apache.wicket.markup.html.WebMarkupContainer;
10
import org.apache.wicket.markup.html.basic.Label;
11
import org.apache.wicket.markup.html.form.TextField;
12
import org.apache.wicket.markup.html.panel.Panel;
13
import org.apache.wicket.markup.repeater.Item;
14
import org.apache.wicket.markup.repeater.data.DataView;
15
import org.apache.wicket.model.Model;
16
import org.nanopub.extra.services.ApiResponse;
17
import org.nanopub.extra.services.ApiResponseEntry;
18
import org.slf4j.Logger;
19
import org.slf4j.LoggerFactory;
20

21
import java.util.ArrayList;
22
import java.util.List;
23

24
/**
25
 * A component that displays a list of queries.
26
 * Each query is linked to its corresponding QueryPage.
27
 */
28
public class QueryList extends Panel {
29

30
    private static final Logger logger = LoggerFactory.getLogger(QueryList.class);
×
31

32
    private Model<String> filterModel = Model.of("");
×
33
    private FilteredListDataProvider<GrlcQuery> filteredDataProvider;
34
    private DataView<GrlcQuery> dataView;
35

36
    /**
37
     * Constructor for QueryList.
38
     *
39
     * @param id   the component ID
40
     * @param resp the API response containing query data
41
     */
42
    public QueryList(String id, ApiResponse resp) {
43
        super(id);
×
44
        setOutputMarkupId(true);
×
45

46
        List<GrlcQuery> queries = new ArrayList<>();
×
47
        for (ApiResponseEntry e : resp.getData()) {
×
48
            try {
49
                GrlcQuery q = GrlcQuery.get(e.get("np"));
×
50
                if (q != null) {
×
51
                    queries.add(q);
×
52
                }
53
            } catch (Exception ex) {
×
54
                logger.error("Error processing query nanopub: {}", ex.getMessage());
×
55
            }
×
56
        }
×
57

58
        add(new Label("title", "Other Queries"));
×
59

60
        filteredDataProvider = new FilteredListDataProvider<>(queries, GrlcQuery::getLabel);
×
61
        dataView = new DataView<>("querylist", filteredDataProvider) {
×
62

63
            @Override
64
            protected void populateItem(Item<GrlcQuery> item) {
65
                item.add(new QueryItem("queryitem", item.getModelObject(), null, true));
×
66
            }
×
67

68
        };
69
        dataView.setItemsPerPage(10);
×
70
        dataView.setOutputMarkupId(true);
×
71

72
        TextField<String> filterField = new TextField<>("filter", filterModel);
×
73
        filterField.setOutputMarkupId(true);
×
74
        filterField.add(new AjaxFormComponentUpdatingBehavior("change") {
×
75
            @Override
76
            protected void onUpdate(AjaxRequestTarget target) {
77
                filteredDataProvider.setFilterText(filterModel.getObject());
×
78
                WebMarkupContainer nav = (WebMarkupContainer) get("navigation");
×
79
                nav.setVisible(dataView.getPageCount() > 1);
×
80
                target.add(QueryList.this);
×
81
            }
×
82
        });
83
        add(filterField);
×
84
        add(new WebMarkupContainer("buttons"));
×
85
        add(dataView);
×
86

87
        WebMarkupContainer navigation = new WebMarkupContainer("navigation");
×
88
        navigation.add(new NavigatorLabel("navigatorLabel", dataView));
×
89
        AjaxPagingNavigator pagingNavigator = new AjaxPagingNavigator("navigator", dataView);
×
90
        navigation.setVisible(dataView.getPageCount() > 1);
×
91
        navigation.add(pagingNavigator);
×
92
        add(navigation);
×
93
    }
×
94

95
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc