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

knowledgepixels / nanodash / 22677866903

04 Mar 2026 04:07PM UTC coverage: 15.868% (-0.08%) from 15.951%
22677866903

push

github

web-flow
Merge pull request #371 from knowledgepixels/feature/370-yasgui-auto-fill-placeholders

Auto-fill Yasgui placeholders with entered parameter values

701 of 5371 branches covered (13.05%)

Branch coverage included in aggregate %.

1727 of 9930 relevant lines covered (17.39%)

2.38 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.Utils;
8
import com.knowledgepixels.nanodash.ViewDisplay;
9
import com.knowledgepixels.nanodash.component.QueryParamField;
10
import com.knowledgepixels.nanodash.component.QueryResultTableBuilder;
11
import com.knowledgepixels.nanodash.component.TitleBar;
12
import org.apache.wicket.RestartResponseException;
13
import org.apache.wicket.feedback.FeedbackMessage;
14
import org.apache.wicket.markup.html.WebMarkupContainer;
15
import org.apache.wicket.markup.html.basic.Label;
16
import org.apache.wicket.markup.html.form.Form;
17
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
18
import org.apache.wicket.markup.html.form.Button;
19
import org.apache.wicket.markup.html.link.ExternalLink;
20
import org.apache.wicket.markup.html.list.ListItem;
21
import org.apache.wicket.markup.html.list.ListView;
22
import org.apache.wicket.request.IRequestParameters;
23
import org.apache.wicket.request.flow.RedirectToUrlException;
24
import org.apache.wicket.markup.html.panel.FeedbackPanel;
25
import org.apache.wicket.request.mapper.parameter.INamedParameters.NamedPair;
26
import org.apache.wicket.request.mapper.parameter.PageParameters;
27
import org.apache.wicket.util.string.StringValue;
28
import org.nanopub.extra.services.QueryRef;
29

30
import java.net.URLEncoder;
31
import java.util.List;
32

33
/**
34
 * Page for displaying a query and its parameters, allowing users to run the query with specified parameters.
35
 */
36
public class QueryPage extends NanodashPage {
37

38
    /**
39
     * The mount path for this page.
40
     */
41
    public static final String MOUNT_PATH = "/query";
42

43
    private final Form<Void> form;
44
    private final List<QueryParamField> paramFields;
45
    private final FeedbackPanel feedbackPanel;
46

47
    /**
48
     * {@inheritDoc}
49
     */
50
    @Override
51
    public String getMountPath() {
52
        return MOUNT_PATH;
×
53
    }
54

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

65
        String id = parameters.get("id").toString();
×
66
        final String queryId = parameters.get("runquery").toString();
×
67
        if (id == null) id = queryId;
×
68

69
        final Multimap<String, String> queryParams = ArrayListMultimap.create();
×
70
        for (NamedPair param : parameters.getAllNamed()) {
×
71
            if (!param.getKey().startsWith("queryparam_")) continue;
×
72
            queryParams.put(param.getKey().replaceFirst("queryparam_", ""), param.getValue());
×
73
        }
×
74

75
        GrlcQuery q = GrlcQuery.get(id);
×
76
        if (!q.getQueryId().equals(id)) {
×
77
            throw new RestartResponseException(getClass(), parameters.set("id", q.getQueryId()));
×
78
        }
79

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

87
        form = new Form<Void>("form") {
×
88

89
            @Override
90
            protected void onConfigure() {
91
                super.onConfigure();
×
92
                form.getFeedbackMessages().clear();
×
93
            }
×
94

95
            @Override
96
            protected void onSubmit() {
97
                try {
98
                    PageParameters params = new PageParameters();
×
99
                    params.set("runquery", q.getQueryId());
×
100
                    for (QueryParamField f : paramFields) {
×
101
                        for (String v : f.getValues()) {
×
102
                            params.add("queryparam_" + f.getParamName(), v);
×
103
                        }
104
                    }
×
105
                    setResponsePage(QueryPage.class, params);
×
106
                } catch (Exception ex) {
×
107
                    String message = ex.getClass().getName();
×
108
                    if (ex.getMessage() != null) message = ex.getMessage();
×
109
                    feedbackPanel.error(message);
×
110
                }
×
111
            }
×
112

113
            @Override
114
            protected void onValidate() {
115
                super.onValidate();
×
116
                for (QueryParamField f : paramFields) {
×
117
                    f.getFormComponent().processInput();
×
118
                    for (FeedbackMessage fm : f.getFormComponent().getFeedbackMessages()) {
×
119
                        form.getFeedbackMessages().add(fm);
×
120
                    }
×
121
                }
×
122
            }
×
123

124
        };
125
        form.setOutputMarkupId(true);
×
126

127
        WebMarkupContainer paramContainer = new WebMarkupContainer("params");
×
128

129
        paramFields = q.createParamFields("paramfield");
×
130
        for (QueryParamField f : paramFields) {
×
131
            for (StringValue parameter : parameters.getValues("queryparam_" + f.getParamName())) {
×
132
                f.putValue(parameter.toString().replaceFirst("\\s*$", ""));
×
133
            }
×
134
        }
×
135
        paramContainer.add(new ListView<QueryParamField>("paramfields", paramFields) {
×
136

137
            protected void populateItem(ListItem<QueryParamField> item) {
138
                item.add(item.getModelObject());
×
139
            }
×
140

141
        });
142
        paramContainer.setVisible(!paramFields.isEmpty());
×
143
        form.add(paramContainer);
×
144

145
        form.add(new Button("yasgui") {
×
146

147
            @Override
148
            public void onSubmit() {
149
                IRequestParameters params = getRequest().getPostParameters();
×
150
                for (QueryParamField f : paramFields) {
×
151
                    StringValue input = params.getParameterValue(f.getFormComponent().getInputName());
×
152
                    f.clearValue();
×
153
                    if (!input.isNull() && !input.isEmpty()) {
×
154
                        f.putValue(input.toString());
×
155
                    }
156
                }
×
157
                String sparql = q.expandQuery(paramFields);
×
158
                boolean allSet = GrlcQuery.allMandatoryFieldsSet(paramFields);
×
159
                if (!allSet) {
×
160
                    sparql = "'auto_execution_blocker: Fill in placeholders below, then remove this line to run the query'\n\n" + sparql;
×
161
                }
162
                String editLink = q.getEndpoint().stringValue().replaceFirst("^.*/repo/", Utils.getMainQueryUrl() + "tools/")
×
163
                    + "/yasgui.html#query=" + URLEncoder.encode(sparql, Charsets.UTF_8);
×
164
                throw new RedirectToUrlException(editLink);
×
165
            }
166

167
        }.setDefaultFormProcessing(false));
×
168

169
        add(form);
×
170

171
        feedbackPanel = new FeedbackPanel("feedback");
×
172
        feedbackPanel.setOutputMarkupId(true);
×
173
        add(feedbackPanel);
×
174

175
        if (queryId == null) {
×
176
            add(new Label("resulttable").setVisible(false));
×
177
        } else {
178
            add(QueryResultTableBuilder.create("resulttable", new QueryRef(queryId, queryParams), new ViewDisplay(20)).plain(true).build());
×
179
        }
180
    }
×
181

182
    /**
183
     * <p>hasAutoRefreshEnabled.</p>
184
     *
185
     * @return a boolean
186
     */
187
    protected boolean hasAutoRefreshEnabled() {
188
        return true;
×
189
    }
190

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