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

knowledgepixels / nanodash / 18868860701

28 Oct 2025 08:37AM UTC coverage: 13.485% (+0.4%) from 13.1%
18868860701

push

github

tkuhn
feat(MaintainedResource): Add support for resource part views

477 of 4476 branches covered (10.66%)

Branch coverage included in aggregate %.

1255 of 8368 relevant lines covered (15.0%)

0.67 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.MaintainedResource;
28
import com.knowledgepixels.nanodash.QueryApiAccess;
29
import com.knowledgepixels.nanodash.User;
30
import com.knowledgepixels.nanodash.Utils;
31
import com.knowledgepixels.nanodash.component.ButtonList;
32
import com.knowledgepixels.nanodash.component.TitleBar;
33
import com.knowledgepixels.nanodash.component.ViewList;
34

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

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

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

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

58
    public ResourcePartPage(final PageParameters parameters) throws FailedApiCallException {
59
        super(parameters);
×
60

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

65
        add(new TitleBar("titlebar", this, "connectors"));
×
66

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

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

94
        if (description != null) {
×
95
            add(new Label("description", description));
×
96
        } else {
97
            add(new Label("description").setVisible(false));
×
98
        }
99

100
        add(new Label("pagetitle", label + " (resource part) | nanodash"));
×
101
        add(new Label("name", label));
×
102
        add(new BookmarkablePageLink<Void>("id", ExplorePage.class, parameters.set("label", label)).setBody(Model.of(id)));
×
103
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().add("id", nanopubId)));
×
104

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

107

108
        final List<AbstractLink> viewButtons = new ArrayList<>();
×
109
        AbstractLink addViewButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
110
                .add("template", "https://w3id.org/np/RA7vjbk3kz4FCu2eTX5oekZshPeOGNGTw8b2WLk8ZS7VI")
×
111
                .add("param_resource", resource.getId())
×
112
                .add("context", resource.getId())
×
113
            );
114
        addViewButton.setBody(Model.of("+"));
×
115
        viewButtons.add(addViewButton);
×
116

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

146
                public Component getLoadingComponent(String id) {
147
                    return new Label(id).setVisible(false);
×
148
                };
149
    
150
            });
151
        }
152
    }
×
153

154
    /**
155
     * Checks if auto-refresh is enabled for this page.
156
     *
157
     * @return true if auto-refresh is enabled, false otherwise
158
     */
159
    protected boolean hasAutoRefreshEnabled() {
160
        return true;
×
161
    }
162

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