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

knowledgepixels / nanodash / 18887622515

28 Oct 2025 08:01PM UTC coverage: 15.199% (+0.7%) from 14.535%
18887622515

push

github

tkuhn
fix(ResourcePartPage): Avoid forced re-running of query

547 of 4484 branches covered (12.2%)

Branch coverage included in aggregate %.

1408 of 8379 relevant lines covered (16.8%)

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

3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7

8
import org.apache.wicket.Component;
9
import org.apache.wicket.RestartResponseException;
10
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
11
import org.apache.wicket.markup.html.basic.Label;
12
import org.apache.wicket.markup.html.link.AbstractLink;
13
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
14
import org.apache.wicket.model.Model;
15
import org.apache.wicket.request.mapper.parameter.PageParameters;
16
import org.eclipse.rdf4j.model.IRI;
17
import org.eclipse.rdf4j.model.Statement;
18
import org.eclipse.rdf4j.model.vocabulary.DCTERMS;
19
import org.eclipse.rdf4j.model.vocabulary.RDF;
20
import org.eclipse.rdf4j.model.vocabulary.RDFS;
21
import org.eclipse.rdf4j.model.vocabulary.SKOS;
22
import org.nanopub.Nanopub;
23
import org.nanopub.extra.services.ApiResponse;
24
import org.nanopub.extra.services.FailedApiCallException;
25
import org.nanopub.extra.services.QueryRef;
26

27
import com.knowledgepixels.nanodash.ApiCache;
28
import com.knowledgepixels.nanodash.MaintainedResource;
29
import com.knowledgepixels.nanodash.QueryApiAccess;
30
import com.knowledgepixels.nanodash.ResourceView;
31
import com.knowledgepixels.nanodash.User;
32
import com.knowledgepixels.nanodash.Utils;
33
import com.knowledgepixels.nanodash.component.ButtonList;
34
import com.knowledgepixels.nanodash.component.TitleBar;
35
import com.knowledgepixels.nanodash.component.ViewList;
36

37
/**
38
 * This class represents a page for a maintained resource.
39
 */
40
public class ResourcePartPage extends NanodashPage {
41

42
    /**
43
     * The mount path for this page.
44
     */
45
    public static final String MOUNT_PATH = "/part";
46

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

55
    /**
56
     * Maintained resource object with the data shown on this page.
57
     */
58
    private MaintainedResource resource;
59

60
    public ResourcePartPage(final PageParameters parameters) throws FailedApiCallException {
61
        super(parameters);
×
62

63
        final String id = parameters.get("id").toString();
×
64
        final String contextId = parameters.get("context").toString();
×
65
        resource = MaintainedResource.get(contextId);
×
66

67
        add(new TitleBar("titlebar", this, "connectors"));
×
68

69
        QueryRef getDefQuery = new QueryRef("get-term-definitions", "term", id);
×
70
        for (IRI userIri : resource.getSpace().getUsers()) {
×
71
            for (String pubkey : User.getUserData().getPubkeyhashes(userIri, true)) {
×
72
                getDefQuery.getParams().put("pubkey", pubkey);
×
73
            }
×
74
        }
×
75
        ApiResponse getDefResp = ApiCache.retrieveResponse(getDefQuery);
×
76
        if (getDefResp == null) {
×
77
            getDefResp = QueryApiAccess.forcedGet(getDefQuery);
×
78
        }
79
        if (getDefResp == null || getDefResp.getData().isEmpty()) {
×
80
            throw new RestartResponseException(ExplorePage.class, parameters);
×
81
        }
82
        String nanopubId = getDefResp.getData().iterator().next().get("np");
×
83
        Nanopub nanopub = Utils.getAsNanopub(nanopubId);
×
84

85
        String label = id.replaceFirst("^.*[#/]([^#/]+)$", "$1");
×
86
        String description = null;
×
87
        Set<IRI> classes = new HashSet<>();
×
88
        for (Statement st : nanopub.getAssertion()) {
×
89
            if (!st.getSubject().stringValue().equals(id)) continue;
×
90
            if (st.getPredicate().equals(RDFS.LABEL)) label = st.getObject().stringValue();
×
91
            if (st.getPredicate().equals(SKOS.DEFINITION) || st.getPredicate().equals(DCTERMS.DESCRIPTION) || st.getPredicate().equals(RDFS.COMMENT)) {
×
92
                description = st.getObject().stringValue();
×
93
            }
94
            if (st.getPredicate().equals(RDF.TYPE) && st.getObject() instanceof IRI objIri) {
×
95
                classes.add(objIri);
×
96
            }
97
        }
×
98

99
        if (description != null) {
×
100
            add(new Label("description", description));
×
101
        } else {
102
            add(new Label("description").setVisible(false));
×
103
        }
104

105
        add(new Label("pagetitle", label + " (resource part) | nanodash"));
×
106
        add(new Label("name", label));
×
107
        add(new BookmarkablePageLink<Void>("id", ExplorePage.class, parameters.set("label", label)).setBody(Model.of(id)));
×
108
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", nanopubId)));
×
109

110
        add(new BookmarkablePageLink<Void>("resource", MaintainedResourcePage.class, new PageParameters().set("id", resource.getId())).setBody(Model.of(resource.getLabel())));
×
111

112

113
        final List<AbstractLink> viewButtons = new ArrayList<>();
×
114
        AbstractLink addViewButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
115
                .add("template", "https://w3id.org/np/RAxERE0cQ9jLQZ5VjeA-1v3XnE9ugxLpFG8vpkAd5FqHE")
×
116
                .add("param_displayType", ResourceView.PART_LEVEL_VIEW_DISPLAY)
×
117
                .add("param_resource", resource.getId())
×
118
                .add("context", resource.getId())
×
119
            );
120
        addViewButton.setBody(Model.of("+ view"));
×
121
        viewButtons.add(addViewButton);
×
122

123
        if (resource.isDataInitialized()) {
×
124
            add(new ViewList("views", resource, id, nanopubId, classes));
×
125
            add(new ButtonList("view-buttons", resource.getSpace(), null, null, viewButtons));
×
126
        } else {
127
            add(new AjaxLazyLoadPanel<Component>("views") {
×
128
    
129
                @Override
130
                public Component getLazyLoadComponent(String markupId) {
131
                    return new ViewList(markupId, resource, id, nanopubId, classes);
×
132
                }
133
    
134
                @Override
135
                protected boolean isContentReady() {
136
                    return resource.isDataInitialized();
×
137
                }
138
    
139
            });
140
            add(new AjaxLazyLoadPanel<Component>("view-buttons") {
×
141
    
142
                @Override
143
                public Component getLazyLoadComponent(String markupId) {
144
                    return new ButtonList(markupId, resource.getSpace(), null, null, viewButtons);
×
145
                }
146
    
147
                @Override
148
                protected boolean isContentReady() {
149
                    return resource.isDataInitialized();
×
150
                }
151

152
                public Component getLoadingComponent(String id) {
153
                    return new Label(id).setVisible(false);
×
154
                };
155
    
156
            });
157
        }
158
    }
×
159

160
    /**
161
     * Checks if auto-refresh is enabled for this page.
162
     *
163
     * @return true if auto-refresh is enabled, false otherwise
164
     */
165
    protected boolean hasAutoRefreshEnabled() {
166
        return true;
×
167
    }
168

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