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

knowledgepixels / nanodash / 19473636483

18 Nov 2025 04:35PM UTC coverage: 14.513% (+0.2%) from 14.288%
19473636483

push

github

ashleycaselli
ci(deps): update action actions/setup-java to v5.0.0

542 of 4792 branches covered (11.31%)

Branch coverage included in aggregate %.

1437 of 8844 relevant lines covered (16.25%)

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

3
import java.time.LocalDateTime;
4
import java.time.ZoneId;
5
import java.time.format.DateTimeFormatter;
6
import java.util.ArrayList;
7
import java.util.List;
8

9
import com.knowledgepixels.nanodash.vocabulary.KPXL_TERMS;
10
import org.apache.wicket.Component;
11
import org.apache.wicket.RestartResponseException;
12
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
13
import org.apache.wicket.markup.html.basic.Label;
14
import org.apache.wicket.markup.html.link.AbstractLink;
15
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
16
import org.apache.wicket.model.Model;
17
import org.apache.wicket.request.mapper.parameter.PageParameters;
18
import org.nanopub.Nanopub;
19
import org.nanopub.extra.services.FailedApiCallException;
20
import org.nanopub.extra.services.QueryRef;
21

22
import com.knowledgepixels.nanodash.MaintainedResource;
23
import com.knowledgepixels.nanodash.Space;
24
import com.knowledgepixels.nanodash.Utils;
25
import com.knowledgepixels.nanodash.component.ButtonList;
26
import com.knowledgepixels.nanodash.component.ItemListElement;
27
import com.knowledgepixels.nanodash.component.ItemListPanel;
28
import com.knowledgepixels.nanodash.component.PinGroupList;
29
import com.knowledgepixels.nanodash.component.SpaceUserList;
30
import com.knowledgepixels.nanodash.component.TitleBar;
31
import com.knowledgepixels.nanodash.component.ViewList;
32
import com.knowledgepixels.nanodash.connector.ConnectorConfig;
33
import com.knowledgepixels.nanodash.connector.GenOverviewPage;
34

35
/**
36
 * The ProjectPage class represents a space page in the Nanodash application.
37
 */
38
public class SpacePage extends NanodashPage {
39

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

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

53
    /**
54
     * Space object with the data shown on this page.
55
     */
56
    private Space space;
57

58
    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
×
59

60
    /**
61
     * Constructor for the SpacePage.
62
     *
63
     * @param parameters the page parameters
64
     * @throws org.nanopub.extra.services.FailedApiCallException if the API call fails
65
     */
66
    public SpacePage(final PageParameters parameters) throws FailedApiCallException {
67
        super(parameters);
×
68

69
        String id = parameters.get("id").toString();
×
70
        space = Space.get(id);
×
71
        if (space == null && MaintainedResource.get(id) != null) {
×
72
            throw new RestartResponseException(MaintainedResourcePage.class, parameters);
×
73
        }
74
        Nanopub np = space.getRootNanopub();
×
75

76
        add(new TitleBar("titlebar", this, "connectors"));
×
77

78
        add(new Label("pagetitle", space.getLabel() + " (space) | nanodash"));
×
79
        add(new Label("spacename", space.getLabel()));
×
80
        add(new Label("spacetype", space.getTypeLabel()));
×
81
        add(new BookmarkablePageLink<Void>("id", ExplorePage.class, parameters.set("label", space.getLabel())).setBody(Model.of(space.getId())));
×
82
        add(new BookmarkablePageLink<Void>("np", ExplorePage.class, new PageParameters().set("id", np.getUri())));
×
83

84
        add(new ItemListPanel<String>(
×
85
                "altids",
86
                "Alternative IDs:",
87
                space.getAltIDs(),
×
88
                i -> new ItemListElement("item", ExplorePage.class, new PageParameters().set("id", i), i)
×
89
            ));
90

91
        if (space.getStartDate() != null) {
×
92
            String dateString;
93
            LocalDateTime dt = LocalDateTime.ofInstant(space.getStartDate().toInstant(), ZoneId.systemDefault());
×
94
            dateString = dateTimeFormatter.format(dt);
×
95
            if (space.getEndDate() != null) {
×
96
                dt = LocalDateTime.ofInstant(space.getEndDate().toInstant(), ZoneId.systemDefault());
×
97
                String endDate = dateTimeFormatter.format(dt);
×
98
                if (!dateString.equals(endDate)) {
×
99
                    dateString += " - " + endDate;
×
100
                }
101
            }
102
            add(new Label("date", dateString));
×
103
        } else {
×
104
            add(new Label("date").setVisible(false));
×
105
        }
106

107
        add(new Label("description", "<span>" + Utils.sanitizeHtml(space.getDescription()) + "</span>").setEscapeModelStrings(false));
×
108

109
        final List<AbstractLink> pinButtons = new ArrayList<>();
×
110

111
        AbstractLink addPinnedTemplateButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
112
                .set("template", "https://w3id.org/np/RA2YwreWrGW9HkzWls8jgwaIINKUB5ZTli1aFKQt13dUk")
×
113
                .set("template-version", "latest")
×
114
                .set("param_space", space.getId())
×
115
                .set("context", space.getId())
×
116
        );
117
        addPinnedTemplateButton.setBody(Model.of("+ template"));
×
118
        pinButtons.add(addPinnedTemplateButton);
×
119

120
        AbstractLink addPinnedQueryButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
121
                .set("template", "https://w3id.org/np/RAuLESdeRUlk1GcTwvzVXShiBMI0ntJs2DL2Bm5DzW_ZQ")
×
122
                .set("template-version", "latest")
×
123
                .set("param_space", space.getId())
×
124
        );
125
        addPinnedQueryButton.setBody(Model.of("+ query"));
×
126
        pinButtons.add(addPinnedQueryButton);
×
127

128
        if (space.isDataInitialized()) {
×
129
            add(new PinGroupList("pin-groups", space));
×
130
            add(new ButtonList("pin-buttons", space, null, null, pinButtons));
×
131
        } else {
132
            add(new AjaxLazyLoadPanel<Component>("pin-groups") {
×
133

134
                @Override
135
                public Component getLazyLoadComponent(String markupId) {
136
                    return new PinGroupList(markupId, space);
×
137
                }
138

139
                @Override
140
                protected boolean isContentReady() {
141
                    return space.isDataInitialized();
×
142
                }
143

144
            });
145
            add(new AjaxLazyLoadPanel<Component>("pin-buttons") {
×
146

147
                @Override
148
                public Component getLazyLoadComponent(String markupId) {
149
                    return new ButtonList(markupId, space, null, null, pinButtons);
×
150
                }
151

152
                @Override
153
                protected boolean isContentReady() {
154
                    return space.isDataInitialized();
×
155
                }
156

157
                public Component getLoadingComponent(String id) {
158
                    return new Label(id).setVisible(false);
×
159
                }
160

161
            });
162
        }
163

164
        final List<AbstractLink> viewButtons = new ArrayList<>();
×
165
        AbstractLink addViewButton = new BookmarkablePageLink<NanodashPage>("button", PublishPage.class, new PageParameters()
×
166
                .set("template", "https://w3id.org/np/RAxERE0cQ9jLQZ5VjeA-1v3XnE9ugxLpFG8vpkAd5FqHE")
×
167
                .set("template-version", "latest")
×
168
                .set("param_resource", space.getId())
×
169
                .set("context", space.getId())
×
170
        );
171
        addViewButton.setBody(Model.of("+ view"));
×
172
        viewButtons.add(addViewButton);
×
173

174
        if (space.isDataInitialized()) {
×
175
            add(new ViewList("views", space));
×
176
            add(new ButtonList("view-buttons", space, null, null, viewButtons));
×
177
        } else {
178
            add(new AjaxLazyLoadPanel<Component>("views") {
×
179

180
                @Override
181
                public Component getLazyLoadComponent(String markupId) {
182
                    return new ViewList(markupId, space);
×
183
                }
184

185
                @Override
186
                protected boolean isContentReady() {
187
                    return space.isDataInitialized();
×
188
                }
189

190
            });
191
            add(new AjaxLazyLoadPanel<Component>("view-buttons") {
×
192

193
                @Override
194
                public Component getLazyLoadComponent(String markupId) {
195
                    return new ButtonList(markupId, space, null, null, viewButtons);
×
196
                }
197

198
                @Override
199
                protected boolean isContentReady() {
200
                    return space.isDataInitialized();
×
201
                }
202

203
                public Component getLoadingComponent(String id) {
204
                    return new Label(id).setVisible(false);
×
205
                }
206

207
                ;
208

209
            });
210
        }
211

212
        add(new ItemListPanel<>(
×
213
                        "roles",
214
                        "Roles:",
215
                        () -> space.isDataInitialized(),
×
216
                        () -> space.getRoles(),
×
217
                        r -> new ItemListElement("item", ExplorePage.class, new PageParameters().set("id", r.getLeft().getId()), r.getLeft().getName(), null, Utils.getAsNanopub(r.getRight()))
×
218
                )
219
                        .makeInline()
×
220
                        .setSpace(space)
×
221
                        .addAdminButton("+", PublishPage.class, new PageParameters()
×
222
                                .set("template", "https://w3id.org/np/RARBzGkEqiQzeiHk0EXFcv9Ol1d-17iOh9MoFJzgfVQDc")
×
223
                                .set("param_space", space.getId())
×
224
                                .set("refresh-upon-publish", space.getId())
×
225
                                .set("template-version", "latest")
×
226
                        )
227
        );
228

229
        if (space.isDataInitialized()) {
×
230
            add(new SpaceUserList("user-lists", space));
×
231
        } else {
232
            add(new AjaxLazyLoadPanel<Component>("user-lists") {
×
233

234
                @Override
235
                public Component getLazyLoadComponent(String markupId) {
236
                    return new SpaceUserList(markupId, space);
×
237
                }
238

239
                @Override
240
                protected boolean isContentReady() {
241
                    return space.isDataInitialized();
×
242
                }
243

244
            });
245
        }
246

247
        add(new ItemListPanel<Space>(
×
248
                "superspaces",
249
                "Part of",
250
                space.getSuperspaces(),
×
251
                (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().set("id", space), space.getLabel(), "(" + space.getTypeLabel() + ")", null)
×
252
        ));
253

254
        addSubspacePanel("Alliance", true);
×
255
        addSubspacePanel("Consortium", false);
×
256
        addSubspacePanel("Organization", true);
×
257
        addSubspacePanel("Taskforce", false);
×
258
        addSubspacePanel("Division", true);
×
259
        addSubspacePanel("Taskunit", false);
×
260
        addSubspacePanel("Group", true);
×
261
        addSubspacePanel("Project", false);
×
262
        addSubspacePanel("Program", true);
×
263
        addSubspacePanel("Initiative", false);
×
264
        addSubspacePanel("Outlet", true);
×
265
        addSubspacePanel("Campaign", false);
×
266
        addSubspacePanel("Community", true);
×
267
        addSubspacePanel("Event", false);
×
268

269
        add(new ItemListPanel<MaintainedResource>(
×
270
                "resources",
271
                "Resources",
272
                new QueryRef("get-maintained-resources"),
273
                (apiResponse) -> {
274
                    MaintainedResource.ensureLoaded();
×
275
                    return MaintainedResource.getResourcesBySpace(space);
×
276
                },
277
                (resource) -> {
278
                    return new ItemListElement("item", MaintainedResourcePage.class, new PageParameters().set("id", resource.getId()), resource.getLabel());
×
279
                }
280
        )
281
                .setSpace(space)
×
282
                .setReadyFunction(space::isDataInitialized)
×
283
                .addMemberButton("+", PublishPage.class, new PageParameters()
×
284
                        .set("template", "https://w3id.org/np/RA25VaVFxSOgKEuZ70gFINn-N3QV4Pf62-IMK_SWkg-c8")
×
285
                        .set("param_space", space.getId())
×
286
                        .set("context", space.getId())
×
287
                        .set("refresh-upon-publish", "maintainedResources")
×
288
                        .set("template-version", "latest")
×
289
                ));
290

291
        String shortId = space.getId().replace("https://w3id.org/spaces/", "");
×
292
        ConnectorConfig cc = ConnectorConfig.get(shortId);
×
293
        if (cc != null) {
×
294
            add(new BookmarkablePageLink<Void>("content-button", GenOverviewPage.class, new PageParameters().set("journal", shortId)).setBody(Model.of("Nanopublication Submissions")));
×
295
        } else {
296
            add(new Label("content-button").setVisible(false));
×
297
        }
298
    }
×
299

300
    private void addSubspacePanel(String type, boolean openEnded) {
301
        String typePl = type + "s";
×
302
        typePl = typePl.replaceFirst("ys$", "ies");
×
303

304
        add(new ItemListPanel<>(
×
305
                        typePl.toLowerCase(),
×
306
                        typePl,
307
                        space.getSubspaces(KPXL_TERMS.NAMESPACE + type),
×
308
                        (space) -> new ItemListElement("item", SpacePage.class, new PageParameters().set("id", space), space.getLabel())
×
309
                )
310
                        .setSpace(space)
×
311
                        .setReadyFunction(space::isDataInitialized)
×
312
                        .addMemberButton("+", PublishPage.class, new PageParameters()
×
313
                                .set("template", openEnded ? "https://w3id.org/np/RA7dQfmndqKmooQ4PlHyQsAql9i2tg_8GLHf_dqtxsGEQ" : "https://w3id.org/np/RAaE7NP9RNIx03AHZxanFMdtUuaTfe50ns5tHhpEVloQ4")
×
314
                                .set("param_type", KPXL_TERMS.NAMESPACE + type)
×
315
                                .set("param_space", space.getId().replaceFirst("https://w3id.org/spaces/", "") + "/<SET-SUFFIX>")
×
316
                                .set("refresh-upon-publish", "spaces")
×
317
                                .set("template-version", "latest"))
×
318
        );
319
    }
×
320

321
    /**
322
     * Checks if auto-refresh is enabled for this page.
323
     *
324
     * @return true if auto-refresh is enabled, false otherwise
325
     */
326
    protected boolean hasAutoRefreshEnabled() {
327
        return true;
×
328
    }
329

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