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

knowledgepixels / nanodash / 27145358627

08 Jun 2026 02:39PM UTC coverage: 20.682% (-0.3%) from 20.947%
27145358627

push

github

web-flow
Merge pull request #479 from knowledgepixels/feat/about-pages-478

Resource-page tabs, presets, and role-gated view actions (#478, #302)

1052 of 6429 branches covered (16.36%)

Branch coverage included in aggregate %.

2642 of 11432 relevant lines covered (23.11%)

3.31 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/QueryResultRdf.java
1
package com.knowledgepixels.nanodash.component;
2

3
import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxNavigationToolbar;
4
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
5
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
6
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
7
import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar;
8
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
9
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
10
import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState;
11
import org.apache.wicket.markup.html.basic.Label;
12
import org.apache.wicket.markup.html.panel.Panel;
13
import org.apache.wicket.markup.repeater.Item;
14
import org.apache.wicket.model.IModel;
15
import org.apache.wicket.model.Model;
16
import org.eclipse.rdf4j.model.IRI;
17

18
import java.util.ArrayList;
19
import java.util.Iterator;
20
import java.util.List;
21

22
/**
23
 * Component for displaying CONSTRUCT query results as a subject/predicate/object table.
24
 */
25
public class QueryResultRdf extends Panel {
26

27
    public QueryResultRdf(String id, org.eclipse.rdf4j.model.Model rdfModel) {
28
        super(id);
×
29

30
        List<String[]> rows = new ArrayList<>();
×
31
        for (org.eclipse.rdf4j.model.Statement st : rdfModel) {
×
32
            rows.add(new String[]{
×
33
                st.getSubject().stringValue(),
×
34
                st.getPredicate().stringValue(),
×
35
                st.getObject().stringValue()
×
36
            });
37
        }
×
38

39
        List<AbstractColumn<String[], String>> columns = new ArrayList<>();
×
40
        columns.add(new TripleColumn("Subject", 0));
×
41
        columns.add(new TripleColumn("Predicate", 1));
×
42
        columns.add(new TripleColumn("Object", 2));
×
43

44
        DataTable<String[], String> table = new DataTable<>("table", columns, new TripleDataProvider(rows), 20);
×
45
        table.addBottomToolbar(new AjaxNavigationToolbar(table));
×
46
        table.addTopToolbar(new HeadersToolbar<>(table, null));
×
47
        // Hide the whole table (header included) when empty; show "(nothing found)" instead.
48
        table.setVisible(!rows.isEmpty());
×
49
        add(table);
×
50
        add(new Label("no-records", "(nothing found)").setVisible(rows.isEmpty()));
×
51
    }
×
52

53
    private static class TripleDataProvider implements ISortableDataProvider<String[], String> {
54

55
        private final List<String[]> rows;
56
        private final SingleSortState<String> sortState = new SingleSortState<>();
×
57

58
        TripleDataProvider(List<String[]> rows) {
×
59
            this.rows = rows;
×
60
        }
×
61

62
        @Override
63
        public Iterator<String[]> iterator(long first, long count) {
64
            int f = (int) first;
×
65
            int t = (int) Math.min(first + count, rows.size());
×
66
            return rows.subList(f, t).iterator();
×
67
        }
68

69
        @Override
70
        public long size() {
71
            return rows.size();
×
72
        }
73

74
        @Override
75
        public IModel<String[]> model(String[] object) {
76
            return Model.of(object);
×
77
        }
78

79
        @Override
80
        public ISortState<String> getSortState() {
81
            return sortState;
×
82
        }
83

84
        @Override
85
        public void detach() {
86
        }
×
87

88
    }
89

90
    private static class TripleColumn extends AbstractColumn<String[], String> {
91

92
        private final int index;
93

94
        TripleColumn(String title, int index) {
95
            super(new Model<>(title));
×
96
            this.index = index;
×
97
        }
×
98

99
        @Override
100
        public void populateItem(Item<ICellPopulator<String[]>> cellItem, String componentId, IModel<String[]> rowModel) {
101
            String value = rowModel.getObject()[index];
×
102
            if (value.matches("https?://.+")) {
×
103
                cellItem.add(new NanodashLink(componentId, value));
×
104
            } else {
105
                cellItem.add(new Label(componentId, value));
×
106
            }
107
        }
×
108

109
    }
110

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