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

knowledgepixels / nanodash / 30430669996

29 Jul 2026 07:10AM UTC coverage: 34.372% (+0.5%) from 33.91%
30430669996

push

github

web-flow
Merge pull request #569 from knowledgepixels/270-nanopub-not-found-handling

feat: add a "nanopub not found" page (#270)

2460 of 7910 branches covered (31.1%)

Branch coverage included in aggregate %.

4801 of 13215 relevant lines covered (36.33%)

5.62 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

55.74
src/main/java/com/knowledgepixels/nanodash/page/ViewPage.java
1
package com.knowledgepixels.nanodash.page;
2

3
import java.io.ByteArrayInputStream;
4
import java.util.Base64;
5

6
import com.knowledgepixels.nanodash.NanopubElement;
7
import com.knowledgepixels.nanodash.NanopubLookup;
8
import com.knowledgepixels.nanodash.Utils;
9
import com.knowledgepixels.nanodash.component.NanopubItem;
10
import com.knowledgepixels.nanodash.component.TemplateFormPreview;
11
import com.knowledgepixels.nanodash.component.TitleBar;
12
import org.apache.wicket.markup.html.WebMarkupContainer;
13
import org.apache.wicket.markup.html.basic.Label;
14
import org.apache.wicket.request.mapper.parameter.PageParameters;
15
import org.eclipse.rdf4j.rio.RDFFormat;
16
import org.nanopub.MalformedNanopubException;
17
import org.nanopub.Nanopub;
18
import org.nanopub.NanopubImpl;
19
import org.nanopub.vocabulary.NTEMPLATE;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22

23
/**
24
 * ViewPage is the page that displays a single nanopublication.
25
 */
26
public class ViewPage extends NanodashPage {
27

28
    private static final Logger logger = LoggerFactory.getLogger(ViewPage.class);
12✔
29

30
    /**
31
     * The mount path for this page.
32
     */
33
    public static final String MOUNT_PATH = "/view";
34

35
    /**
36
     * {@inheritDoc}
37
     */
38
    @Override
39
    public String getMountPath() {
40
        return MOUNT_PATH;
6✔
41
    }
42

43
    /**
44
     * Constructor for the ViewPage.
45
     *
46
     * @param parameters The page parameters containing the nanopub ID and display options.
47
     */
48
    public ViewPage(final PageParameters parameters) {
49
        super(parameters);
9✔
50
        add(new TitleBar("titlebar", this, "preview"));
48✔
51
        addNanopubItem(this, parameters);
9✔
52
    }
3✔
53

54
    static void addNanopubItem(NanodashPage page, final PageParameters parameters) {
55
        Nanopub np;
56
        String nanopubTrig = parameters.get("_nanopub_trig").toOptionalString();
15✔
57
        boolean isPreview = nanopubTrig != null;
12!
58
        if (isPreview) {
6!
59
            try {
60
                byte[] trig = Base64.getUrlDecoder().decode(nanopubTrig);
×
61
                np = new NanopubImpl(new ByteArrayInputStream(trig), RDFFormat.TRIG);
×
62
            } catch (MalformedNanopubException | java.io.IOException | IllegalArgumentException ex) {
×
63
                throw new RuntimeException("Failed to parse nanopub from '_nanopub_trig' parameter", ex);
×
64
            }
×
65
        } else {
66
            // Nothing to show without the nanopub itself, so a failed lookup goes to the
67
            // not-found page (or, for a malformed id, the error page explaining why).
68
            NanopubLookup lookup = NanopubLookup.lookUp(parameters.get("id").toString());
18✔
69
            if (!lookup.isFound()) {
9✔
70
                NanopubNotFoundPage.forwardFor(lookup);
×
71
            }
72
            np = lookup.getNanopub();
9✔
73
        }
74
        boolean showHeader = "on".equals(parameters.get("show-header").toOptionalString());
21✔
75
        boolean showFooter = "on".equals(parameters.get("show-footer").toOptionalString());
21✔
76
        boolean showProv = !"off".equals(parameters.get("show-prov").toOptionalString());
30!
77
        boolean showPubinfo = !"off".equals(parameters.get("show-pubinfo").toOptionalString());
30!
78
        String templateId = parameters.get("template").toString(null);
18✔
79
        page.add(new Label("heading", isPreview ? "Preview Nanopublication" : "Nanopublication"));
45!
80
        page.add(new NanopubItem("nanopub", NanopubElement.get(np), templateId).setProvenanceHidden(!showProv).setPubinfoHidden(!showPubinfo).setHeaderHidden(!showHeader).setFooterHidden(!showFooter));
99!
81

82
        if (Utils.isNanopubOfClass(np, NTEMPLATE.ASSERTION_TEMPLATE)) {
12!
83
            WebMarkupContainer section = new WebMarkupContainer("template-form-preview-section");
×
84
            try {
85
                section.add(new TemplateFormPreview("template-form-preview", np));
×
86
            } catch (Exception ex) {
×
87
                logger.error("Failed to generate template form preview: {}", ex.getMessage());
×
88
                String message = ex.getMessage() != null ? ex.getMessage() : ex.getClass().getName();
×
89
                section.add(new Label("template-form-preview", "<p class=\"negative\">Error generating template form preview: " + message + "</p>").setEscapeModelStrings(false));
×
90
            }
×
91
            page.add(section);
×
92
        } else {
×
93
            page.add(new WebMarkupContainer("template-form-preview-section").setVisible(false));
42✔
94
        }
95
    }
3✔
96

97
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc