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

knowledgepixels / nanodash / 19232563835

10 Nov 2025 01:03PM UTC coverage: 14.137% (+0.2%) from 13.973%
19232563835

push

github

tkuhn
feat(ResourceView): Support for hasPageSize

519 of 4646 branches covered (11.17%)

Branch coverage included in aggregate %.

1354 of 8603 relevant lines covered (15.74%)

0.7 hits per line

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

0.0
src/main/java/com/knowledgepixels/nanodash/page/QueryPage.java
1
package com.knowledgepixels.nanodash.page;
2

3
import com.github.jsonldjava.shaded.com.google.common.base.Charsets;
4
import com.google.common.collect.ArrayListMultimap;
5
import com.google.common.collect.Multimap;
6
import com.knowledgepixels.nanodash.GrlcQuery;
7
import com.knowledgepixels.nanodash.ViewDisplay;
8
import com.knowledgepixels.nanodash.component.QueryParamField;
9
import com.knowledgepixels.nanodash.component.QueryResultTableBuilder;
10
import com.knowledgepixels.nanodash.component.TitleBar;
11
import org.apache.wicket.feedback.FeedbackMessage;
12
import org.apache.wicket.markup.html.WebMarkupContainer;
13
import org.apache.wicket.markup.html.basic.Label;
14
import org.apache.wicket.markup.html.form.Form;
15
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
16
import org.apache.wicket.markup.html.link.ExternalLink;
17
import org.apache.wicket.markup.html.list.ListItem;
18
import org.apache.wicket.markup.html.list.ListView;
19
import org.apache.wicket.markup.html.panel.FeedbackPanel;
20
import org.apache.wicket.request.mapper.parameter.INamedParameters.NamedPair;
21
import org.apache.wicket.request.mapper.parameter.PageParameters;
22
import org.apache.wicket.util.string.StringValue;
23
import org.nanopub.extra.services.QueryRef;
24

25
import java.net.URLEncoder;
26
import java.util.List;
27

28
/**
29
 * Page for displaying a query and its parameters, allowing users to run the query with specified parameters.
30
 */
31
public class QueryPage extends NanodashPage {
32

33
    /**
34
     * The mount path for this page.
35
     */
36
    public static final String MOUNT_PATH = "/query";
37

38
    private final Form<Void> form;
39
    private final List<QueryParamField> paramFields;
40
    private final FeedbackPanel feedbackPanel;
41

42
    /**
43
     * {@inheritDoc}
44
     */
45
    @Override
46
    public String getMountPath() {
47
        return MOUNT_PATH;
×
48
    }
49

50
    /**
51
     * Constructor for the QueryPage.
52
     *
53
     * @param parameters The page parameters, which should include the query ID and any query parameters.
54
     */
55
    public QueryPage(final PageParameters parameters) {
56
        super(parameters);
×
57
        add(new TitleBar("titlebar", this, null));
×
58
        add(new Label("pagetitle", "Query Info | nanodash"));
×
59

60
        String id = parameters.get("id").toString();
×
61
        final String queryId = parameters.get("runquery").toString();
×
62
        if (id == null) id = queryId;
×
63

64
        final Multimap<String, String> queryParams = ArrayListMultimap.create();
×
65
        for (NamedPair param : parameters.getAllNamed()) {
×
66
            if (!param.getKey().startsWith("queryparam_")) continue;
×
67
            queryParams.put(param.getKey().replaceFirst("queryparam_", ""), param.getValue());
×
68
        }
×
69

70
        GrlcQuery q = GrlcQuery.get(id);
×
71

72
        add(new Label("querylabel", q.getLabel()));
×
73
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().set("id", q.getNanopub().getUri().stringValue())));
×
74
        // TODO Replace hard-coded domain with dynamic solution:
75
        add(new ExternalLink("openapi-this", "https://query.knowledgepixels.com/openapi/?url=spec/" + id));
×
76
        add(new ExternalLink("openapi-latest", "https://query.knowledgepixels.com/openapi/?url=spec/" + id + "%3Fapi-version=latest"));
×
77
        add(new Label("querydesc", q.getDescription()));
×
78

79
        form = new Form<Void>("form") {
×
80

81
            @Override
82
            protected void onConfigure() {
83
                super.onConfigure();
×
84
                form.getFeedbackMessages().clear();
×
85
            }
×
86

87
            @Override
88
            protected void onSubmit() {
89
                try {
90
                    PageParameters params = new PageParameters();
×
91
                    params.set("runquery", q.getQueryId());
×
92
                    for (QueryParamField f : paramFields) {
×
93
                        for (String v : f.getValues()) {
×
94
                            params.add("queryparam_" + f.getParamName(), v);
×
95
                        }
96
                    }
×
97
                    setResponsePage(QueryPage.class, params);
×
98
                } catch (Exception ex) {
×
99
                    String message = ex.getClass().getName();
×
100
                    if (ex.getMessage() != null) message = ex.getMessage();
×
101
                    feedbackPanel.error(message);
×
102
                }
×
103
            }
×
104

105
            @Override
106
            protected void onValidate() {
107
                super.onValidate();
×
108
                for (QueryParamField f : paramFields) {
×
109
                    f.getFormComponent().processInput();
×
110
                    for (FeedbackMessage fm : f.getFormComponent().getFeedbackMessages()) {
×
111
                        form.getFeedbackMessages().add(fm);
×
112
                    }
×
113
                }
×
114
            }
×
115

116
        };
117
        form.setOutputMarkupId(true);
×
118

119
        WebMarkupContainer paramContainer = new WebMarkupContainer("params");
×
120

121
        paramFields = q.createParamFields("paramfield");
×
122
        paramContainer.add(new ListView<QueryParamField>("paramfields", paramFields) {
×
123

124
            protected void populateItem(ListItem<QueryParamField> item) {
125
                QueryParamField f = item.getModelObject();
×
126
                for (StringValue parameter : parameters.getValues("queryparam_" + f.getParamName())) {
×
127
                    f.putValue(parameter.toString().replaceFirst("\\s*$", ""));
×
128
                }
×
129
                item.add(item.getModelObject());
×
130
            }
×
131

132
        });
133
        paramContainer.setVisible(!paramFields.isEmpty());
×
134
        form.add(paramContainer);
×
135

136
        // TODO Replace hard-coded Nanopub Query URL with dynamic solution:
137
        String editLink = q.getEndpoint().stringValue().replaceFirst("^.*/repo/", "https://query.petapico.org/tools/") + "/yasgui.html#query=" + URLEncoder.encode(q.getSparql(), Charsets.UTF_8);
×
138
        // TODO We also need to replace the nanopub-query placeholder service URLs in the query above.
139
        // Deactivated for now:
140
        form.add(new ExternalLink("yasgui", editLink).setVisible(false));
×
141

142
        add(form);
×
143

144
        feedbackPanel = new FeedbackPanel("feedback");
×
145
        feedbackPanel.setOutputMarkupId(true);
×
146
        add(feedbackPanel);
×
147

148
        if (queryId == null) {
×
149
            add(new Label("resulttable").setVisible(false));
×
150
        } else {
151
            add(QueryResultTableBuilder.create("resulttable", new QueryRef(queryId, queryParams), new ViewDisplay(20)).plain(true).build());
×
152
        }
153
    }
×
154

155
    /**
156
     * <p>hasAutoRefreshEnabled.</p>
157
     *
158
     * @return a boolean
159
     */
160
    protected boolean hasAutoRefreshEnabled() {
161
        return true;
×
162
    }
163

164
}
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