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

knowledgepixels / nanodash / 17852532121

19 Sep 2025 08:10AM UTC coverage: 13.568% (-0.3%) from 13.87%
17852532121

push

github

tkuhn
feat: Switch to QueryRef provided by nanopub, using multimap

428 of 4008 branches covered (10.68%)

Branch coverage included in aggregate %.

1104 of 7283 relevant lines covered (15.16%)

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

3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.Map;
6
import java.util.Optional;
7

8
import org.apache.wicket.ajax.AjaxRequestTarget;
9
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
10
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
11
import org.apache.wicket.markup.html.WebMarkupContainer;
12
import org.apache.wicket.markup.html.basic.Label;
13
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
14
import org.apache.wicket.model.Model;
15
import org.apache.wicket.request.flow.RedirectToUrlException;
16
import org.apache.wicket.request.mapper.parameter.PageParameters;
17
import org.eclipse.rdf4j.model.IRI;
18
import org.nanopub.extra.services.ApiResponse;
19
import org.nanopub.extra.services.QueryRef;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22

23
import com.google.common.collect.ArrayListMultimap;
24
import com.google.common.collect.Multimap;
25
import com.knowledgepixels.nanodash.ApiCache;
26
import com.knowledgepixels.nanodash.NanodashSession;
27
import com.knowledgepixels.nanodash.User;
28
import com.knowledgepixels.nanodash.Utils;
29
import com.knowledgepixels.nanodash.component.NanopubResults;
30
import com.knowledgepixels.nanodash.component.TitleBar;
31

32
/**
33
 * Page for displaying a channel of nanopublications associated with a user.
34
 */
35
public class ChannelPage extends NanodashPage {
36

37
    private static final Logger logger = LoggerFactory.getLogger(ChannelPage.class);
×
38

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

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

52
    private Model<ArrayList<String>> selected = new Model<>();
×
53
    private IRI userIri;
54
    private boolean added = false;
×
55
    private Map<String, String> pubKeyMap;
56
    private CheckBoxMultipleChoice<String> pubkeySelection;
57

58
    /**
59
     * Constructor for the ChannelPage.
60
     *
61
     * @param parameters Page parameters containing the user ID.
62
     */
63
    public ChannelPage(final PageParameters parameters) {
64
        super(parameters);
×
65

66
        if (parameters.get("id") == null) throw new RedirectToUrlException(ProfilePage.MOUNT_PATH);
×
67
        userIri = Utils.vf.createIRI(parameters.get("id").toString());
×
68
        NanodashSession session = NanodashSession.get();
×
69

70
        String pageType = "users";
×
71
        if (session.getUserIri() != null && userIri.equals(session.getUserIri())) pageType = "mychannel";
×
72
        add(new TitleBar("titlebar", this, pageType));
×
73

74
        final String displayName = User.getShortDisplayName(userIri);
×
75
        add(new Label("pagetitle", displayName + " (channel) | nanodash"));
×
76
        add(new Label("username", displayName));
×
77

78
        ArrayList<String> pubKeyList = new ArrayList<>();
×
79
        pubKeyMap = new HashMap<>();
×
80
        if (userIri.equals(session.getUserIri())) {
×
81
            String lKeyShort = Utils.getShortPubkeyLocationLabel(session.getPubkeyString(), userIri);
×
82
            pubKeyList.add(lKeyShort);
×
83
            pubKeyMap.put(lKeyShort, session.getPubkeyString());
×
84
        }
85
        for (String pk : User.getPubkeyhashes(userIri, null)) {
×
86
            String keyShort = Utils.getShortPubkeyLocationLabel(pk, userIri);
×
87
            if (!pubKeyMap.containsKey(keyShort)) {
×
88
                pubKeyList.add(keyShort);
×
89
                pubKeyMap.put(keyShort, pk);
×
90
            }
91
        }
×
92

93
        pubkeySelection = new CheckBoxMultipleChoice<String>("pubkeygroup", selected, pubKeyList);
×
94
        pubkeySelection.setDefaultModelObject(new ArrayList<String>(pubKeyList));
×
95
        pubkeySelection.add(new AjaxFormChoiceComponentUpdatingBehavior() {
×
96

97
            @Override
98
            protected void onUpdate(AjaxRequestTarget target) {
99
                logger.info("PUBKEYS SELECTED:");
×
100
                for (String s : selected.getObject()) {
×
101
                    logger.info(" {}", pubKeyMap.get(s));
×
102
                }
×
103
                logger.info("\n");
×
104
                refresh();
×
105
                setResponsePage(target.getPage());
×
106
                target.appendJavaScript("updateElements();");
×
107
            }
×
108

109
        });
110
        WebMarkupContainer selectPanel = new WebMarkupContainer("selectpanel");
×
111
        selectPanel.setVisible(!pubKeyList.isEmpty());
×
112
        selectPanel.add(pubkeySelection);
×
113
        add(selectPanel);
×
114

115
        refresh();
×
116
    }
×
117

118
    /**
119
     * Checks if auto-refresh is enabled for this page.
120
     *
121
     * @return true if auto-refresh is enabled, false otherwise.
122
     */
123
    protected boolean hasAutoRefreshEnabled() {
124
        return true;
×
125
    }
126

127
    private synchronized void refresh() {
128
        if (added) {
×
129
            remove("nanopubs");
×
130
        }
131
        added = true;
×
132
        final Multimap<String, String> params = ArrayListMultimap.create();
×
133
        final String queryName;
134
        String pubkeyHashes = getPubkeyHashesString();
×
135
        if (pubkeyHashes == null) {
×
136
            queryName = "get-latest-nanopubs-from-userid";
×
137
            params.put("userid", userIri.stringValue());
×
138
        } else {
139
            queryName = "get-latest-nanopubs-from-pubkeys";
×
140
            params.put("pubkeyhashes", pubkeyHashes);
×
141
            params.put("userid", userIri.stringValue());
×
142
        }
143
        final QueryRef queryRef = new QueryRef(queryName, params);
×
144
        ApiResponse cachedResponse = ApiCache.retrieveResponse(queryRef);
×
145
        if (cachedResponse != null) {
×
146
            add(NanopubResults.fromApiResponse("nanopubs", cachedResponse));
×
147
        } else {
148
            add(new AjaxLazyLoadPanel<NanopubResults>("nanopubs") {
×
149

150
                @Override
151
                public NanopubResults getLazyLoadComponent(String markupId) {
152
                    ApiResponse r = null;
×
153
                    while (true) {
154
                        try {
155
                            Thread.sleep(500);
×
156
                        } catch (InterruptedException ex) {
×
157
                            logger.error("Interrupted while waiting for API response", ex);
×
158
                        }
×
159
                        if (!ApiCache.isRunning(queryRef)) {
×
160
                            r = ApiCache.retrieveResponse(queryRef);
×
161
                            if (r != null) break;
×
162
                        }
163
                    }
164
                    return NanopubResults.fromApiResponse(markupId, r);
×
165
                }
166

167
                @Override
168
                protected void onContentLoaded(NanopubResults content, Optional<AjaxRequestTarget> target) {
169
                    super.onContentLoaded(content, target);
×
170
                    if (target.isPresent()) {
×
171
                        target.get().appendJavaScript("updateElements();");
×
172
                    }
173
                }
×
174

175
            });
176
        }
177
    }
×
178

179
    private String getPubkeyHashesString() {
180
        String pubkeyHashes = "";
×
181
        for (String s : selected.getObject()) {
×
182
            pubkeyHashes += " " + pubKeyMap.get(s);
×
183
        }
×
184
        if (pubkeyHashes.isEmpty()) return null;
×
185
        return pubkeyHashes.substring(1);
×
186
    }
187

188
//        @Override
189
//        public void onBeforeRender() {
190
//                super.onBeforeRender();
191
//                if (hasBeenRendered()) {
192
//                        setResponsePage(getPageClass(), getPageParameters());
193
//                }
194
//        }
195

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