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

knowledgepixels / nanodash / 17375037963

01 Sep 2025 10:33AM UTC coverage: 11.982% (-0.04%) from 12.02%
17375037963

push

github

tkuhn
Merge branch 'master' of github.com:knowledgepixels/nanodash

330 of 3846 branches covered (8.58%)

Branch coverage included in aggregate %.

949 of 6828 relevant lines covered (13.9%)

0.61 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/ProjectPage.java
1
package com.knowledgepixels.nanodash.page;
2

3
import static com.knowledgepixels.nanodash.Utils.vf;
4

5
import java.util.ArrayList;
6
import java.util.Collections;
7
import java.util.HashMap;
8
import java.util.HashSet;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.Set;
12

13
import org.apache.commons.lang3.tuple.Pair;
14
import org.apache.wicket.markup.html.basic.Label;
15
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
16
import org.apache.wicket.markup.html.link.ExternalLink;
17
import org.apache.wicket.markup.repeater.Item;
18
import org.apache.wicket.markup.repeater.data.DataView;
19
import org.apache.wicket.markup.repeater.data.ListDataProvider;
20
import org.apache.wicket.request.mapper.parameter.PageParameters;
21
import org.eclipse.rdf4j.model.IRI;
22
import org.eclipse.rdf4j.model.Literal;
23
import org.eclipse.rdf4j.model.Statement;
24
import org.eclipse.rdf4j.model.vocabulary.DCTERMS;
25
import org.nanopub.Nanopub;
26
import org.nanopub.extra.services.FailedApiCallException;
27
import org.nanopub.vocabulary.NTEMPLATE;
28

29
import com.knowledgepixels.nanodash.Project;
30
import com.knowledgepixels.nanodash.QueryApiAccess;
31
import com.knowledgepixels.nanodash.Utils;
32
import com.knowledgepixels.nanodash.component.QueryResultTable;
33
import com.knowledgepixels.nanodash.component.TemplateResults;
34
import com.knowledgepixels.nanodash.component.TitleBar;
35
import com.knowledgepixels.nanodash.component.UserList;
36
import com.knowledgepixels.nanodash.template.Template;
37
import com.knowledgepixels.nanodash.template.TemplateData;
38

39
/**
40
 * The ProjectPage class represents a project page in the Nanodash application.
41
 */
42
public class ProjectPage extends NanodashPage {
43

44
    private static final long serialVersionUID = 1L;
45

46
    /**
47
     * The mount path for this page.
48
     */
49
    public static final String MOUNT_PATH = "/project";
50

51
    /**
52
     * {@inheritDoc}
53
     */
54
    @Override
55
    public String getMountPath() {
56
        return MOUNT_PATH;
×
57
    }
58

59
    /**
60
     * The predicate for the owner of the project.
61
     */
62
    public static final IRI HAS_OWNER = vf.createIRI("https://w3id.org/kpxl/gen/terms/hasOwner");
×
63

64
    /**
65
     * The predicate for pinned templates in the project.
66
     */
67
    public static final IRI HAS_PINNED_TEMPLATE = vf.createIRI("https://w3id.org/kpxl/gen/terms/hasPinnedTemplate");
×
68

69
    /**
70
     * The predicate for pinned queries in the project.
71
     */
72
    public static final IRI HAS_PINNED_QUERY = vf.createIRI("https://w3id.org/kpxl/gen/terms/hasPinnedQuery");
×
73

74
    /**
75
     * Project object with the data shown on this page.
76
     */
77
    private Project project;
78

79
    /**
80
     * Constructor for the ProjectPage.
81
     *
82
     * @param parameters the page parameters
83
     * @throws org.nanopub.extra.services.FailedApiCallException if the API call fails
84
     */
85
    public ProjectPage(final PageParameters parameters) throws FailedApiCallException {
86
        super(parameters);
×
87

88
        project = Project.get(parameters.get("id").toString());
×
89
        Nanopub np = project.getRootNanopub();
×
90

91
        add(new TitleBar("titlebar", this, null));
×
92

93
        String description = null;
×
94
        List<IRI> owners = new ArrayList<>();
×
95
        List<Template> templates = new ArrayList<>();
×
96
        Set<String> templateTags = new HashSet<>();
×
97
        Map<String, List<Template>> templatesPerTag = new HashMap<>();
×
98
        List<IRI> queryIds = new ArrayList<>();
×
99
        IRI defaultProvenance = null;
×
100

101
        for (Statement st : np.getAssertion()) {
×
102
            if (st.getSubject().stringValue().equals(project.getId())) {
×
103
                if (st.getPredicate().equals(DCTERMS.DESCRIPTION)) {
×
104
                    description = st.getObject().stringValue();
×
105
                } else if (st.getPredicate().equals(HAS_OWNER) && st.getObject() instanceof IRI obj) {
×
106
                    owners.add(obj);
×
107
                } else if (st.getPredicate().equals(HAS_PINNED_TEMPLATE) && st.getObject() instanceof IRI obj) {
×
108
                    templates.add(TemplateData.get().getTemplate(obj.stringValue()));
×
109
                } else if (st.getPredicate().equals(HAS_PINNED_QUERY) && st.getObject() instanceof IRI obj) {
×
110
                    queryIds.add(obj);
×
111
                } else if (st.getPredicate().equals(NTEMPLATE.HAS_DEFAULT_PROVENANCE) && st.getObject() instanceof IRI obj) {
×
112
                    defaultProvenance = obj;
×
113
                }
114
            } else if (st.getPredicate().equals(NTEMPLATE.HAS_TAG) && st.getObject() instanceof Literal l) {
×
115
                templateTags.add(l.stringValue());
×
116
                List<Template> list = templatesPerTag.get(l.stringValue());
×
117
                if (list == null) {
×
118
                    list = new ArrayList<>();
×
119
                    templatesPerTag.put(l.stringValue(), list);
×
120
                }
121
                list.add(TemplateData.get().getTemplate(st.getSubject().stringValue()));
×
122
            }
123
        }
×
124

125
        add(new Label("pagetitle", project.getLabel() + " (project) | nanodash"));
×
126
        add(new Label("projectname", project.getLabel()));
×
127
        add(new ExternalLink("id", project.getId(), project.getId()));
×
128
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", np.getUri())));
×
129
        add(new Label("description", "<span class=\"internal\">" + Utils.sanitizeHtml(description) + "</span>").setEscapeModelStrings(false));
×
130

131
        final PageParameters params = new PageParameters();
×
132
        if (defaultProvenance != null) {
×
133
            params.add("prtemplate", defaultProvenance.stringValue());
×
134
        }
135
        List<Pair<String, List<Template>>> templateLists = new ArrayList<>();
×
136
        List<String> templateTagList = new ArrayList<>(templateTags);
×
137
        Collections.sort(templateTagList);
×
138
        for (String tag : templateTagList) {
×
139
            for (Template t : templatesPerTag.get(tag)) {
×
140
                if (templates.contains(t)) templates.remove(t);
×
141
            }
×
142
            templateLists.add(Pair.of(tag, templatesPerTag.get(tag)));
×
143
        }
×
144
        if (!templates.isEmpty()) {
×
145
            String l = templateLists.isEmpty() ? "Templates" : "Other Templates";
×
146
            templateLists.add(Pair.of(l, templates));
×
147
        }
148
        add(new DataView<Pair<String, List<Template>>>("template-lists", new ListDataProvider<Pair<String, List<Template>>>(templateLists)) {
×
149

150
            private static final long serialVersionUID = 1L;
151

152
            @Override
153
            protected void populateItem(Item<Pair<String, List<Template>>> item) {
154
                item.add(new Label("label", item.getModelObject().getLeft()));
×
155
                item.add(TemplateResults.fromList("templates", item.getModelObject().getRight(), params));
×
156
            }
×
157

158
        });
159
        add(TemplateResults.fromList("templates", templates, params));
×
160
        add(new UserList("owners", owners));
×
161

162
        add(new DataView<IRI>("queries", new ListDataProvider<IRI>(queryIds)) {
×
163

164
            private static final long serialVersionUID = 1L;
165

166
            @Override
167
            protected void populateItem(Item<IRI> item) {
168
                String queryId = QueryApiAccess.getQueryId(item.getModelObject());
×
169
                item.add(QueryResultTable.createComponent("query", queryId, false));
×
170
            }
×
171

172
        });
173
    }
×
174

175
    /**
176
     * Checks if auto-refresh is enabled for this page.
177
     *
178
     * @return true if auto-refresh is enabled, false otherwise
179
     */
180
    protected boolean hasAutoRefreshEnabled() {
181
        return true;
×
182
    }
183

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