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

knowledgepixels / nanodash / 17380144000

01 Sep 2025 02:12PM UTC coverage: 12.03% (+0.05%) from 11.978%
17380144000

push

github

ashleycaselli
refactor: replace printStackTrace with logger.error for better error handling

330 of 3850 branches covered (8.57%)

Branch coverage included in aggregate %.

958 of 6857 relevant lines covered (13.97%)

0.62 hits per line

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

0.0
src/main/java/com/knowledgepixels/nanodash/component/TemplateList.java
1
package com.knowledgepixels.nanodash.component;
2

3
import com.knowledgepixels.nanodash.ApiCache;
4
import com.knowledgepixels.nanodash.template.TemplateData;
5
import jakarta.xml.bind.DatatypeConverter;
6
import org.apache.wicket.Component;
7
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
8
import org.apache.wicket.markup.html.basic.Label;
9
import org.apache.wicket.markup.html.panel.Panel;
10
import org.apache.wicket.markup.repeater.Item;
11
import org.apache.wicket.markup.repeater.data.DataView;
12
import org.apache.wicket.markup.repeater.data.ListDataProvider;
13
import org.nanopub.extra.services.ApiResponse;
14
import org.nanopub.extra.services.ApiResponseEntry;
15
import org.slf4j.Logger;
16
import org.slf4j.LoggerFactory;
17

18
import java.io.Serializable;
19
import java.util.ArrayList;
20
import java.util.Calendar;
21
import java.util.HashMap;
22
import java.util.Map;
23

24
/**
25
 * A list of templates, grouped by topic.
26
 */
27
public class TemplateList extends Panel {
28

29
    private static final long serialVersionUID = 1L;
30
    private static final Logger logger = LoggerFactory.getLogger(TemplateList.class);
×
31

32
    /**
33
     * A list of templates, grouped by topic.
34
     *
35
     * @param id the wicket id of this component
36
     */
37
    public TemplateList(String id) {
38
        super(id);
×
39

40
        final Map<String, String> ptParams = new HashMap<>();
×
41
        final String ptQueryName = "get-most-used-templates-last30d";
×
42
        ApiResponse ptResponse = ApiCache.retrieveResponse(ptQueryName, ptParams);
×
43
        if (ptResponse != null) {
×
44
            add(TemplateResults.fromApiResponse("populartemplates", ptResponse));
×
45
        } else {
46
            add(new AjaxLazyLoadPanel<Component>("populartemplates") {
×
47

48
                private static final long serialVersionUID = 1L;
49

50
                @Override
51
                public Component getLazyLoadComponent(String markupId) {
52
                    ApiResponse r = null;
×
53
                    while (true) {
54
                        try {
55
                            Thread.sleep(500);
×
56
                        } catch (InterruptedException ex) {
×
57
                            logger.error("Thread interrupted", ex);
×
58
                        }
×
59
                        if (!ApiCache.isRunning(ptQueryName, ptParams)) {
×
60
                            r = ApiCache.retrieveResponse(ptQueryName, ptParams);
×
61
                            if (r != null) break;
×
62
                        }
63
                    }
64
                    return TemplateResults.fromApiResponse(markupId, r);
×
65
                }
66

67
            });
68
        }
69

70
        final Map<String, String> stParams = new HashMap<>();
×
71
        final String stQueryName = "get-suggested-templates-to-get-started";
×
72
        ApiResponse stResponse = ApiCache.retrieveResponse(stQueryName, stParams);
×
73
        if (stResponse != null) {
×
74
            add(TemplateResults.fromApiResponse("getstartedtemplates", stResponse));
×
75
        } else {
76
            add(new AjaxLazyLoadPanel<Component>("getstartedtemplates") {
×
77

78
                private static final long serialVersionUID = 1L;
79

80
                @Override
81
                public Component getLazyLoadComponent(String markupId) {
82
                    ApiResponse r = null;
×
83
                    while (true) {
84
                        try {
85
                            Thread.sleep(500);
×
86
                        } catch (InterruptedException ex) {
×
87
                            logger.error("Thread interrupted", ex);
×
88
                        }
×
89
                        if (!ApiCache.isRunning(stQueryName, stParams)) {
×
90
                            r = ApiCache.retrieveResponse(stQueryName, stParams);
×
91
                            if (r != null) break;
×
92
                        }
93
                    }
94
                    return TemplateResults.fromApiResponse(markupId, r);
×
95
                }
96

97
            });
98
        }
99

100
        ArrayList<ApiResponseEntry> templateList = new ArrayList<>(TemplateData.get().getAssertionTemplates());
×
101
        templateList.sort((t1, t2) -> {
×
102
            Calendar c1 = getTime(t1);
×
103
            Calendar c2 = getTime(t2);
×
104
            if (c1 == null && c2 == null) return 0;
×
105
            if (c1 == null) return 1;
×
106
            if (c2 == null) return -1;
×
107
            return c2.compareTo(c1);
×
108
        });
109

110
        Map<String, Topic> topics = new HashMap<>();
×
111
        for (ApiResponseEntry entry : templateList) {
×
112
            String tag = entry.get("tag");
×
113
            if ("".equals(tag)) tag = null;
×
114
            if (!topics.containsKey(tag)) {
×
115
                topics.put(tag, new Topic(tag));
×
116
            }
117
            topics.get(tag).templates.add(entry);
×
118

119
        }
×
120
        ArrayList<Topic> topicList = new ArrayList<Topic>(topics.values());
×
121
        topicList.sort((t0, t1) -> {
×
122
            if (t0.tag == null) return 1;
×
123
            if (t1.tag == null) return -1;
×
124
            return t1.templates.size() - t0.templates.size();
×
125
        });
126
        add(new DataView<Topic>("topics", new ListDataProvider<Topic>(topicList)) {
×
127

128
            private static final long serialVersionUID = 1L;
129

130
            @Override
131
            protected void populateItem(Item<Topic> item) {
132
                String tag = item.getModelObject().tag;
×
133
                if (tag == null) tag = "Other";
×
134
                item.add(new Label("title", tag));
×
135
                item.add(new DataView<ApiResponseEntry>("template-list", new ListDataProvider<ApiResponseEntry>(item.getModelObject().templates)) {
×
136

137
                    private static final long serialVersionUID = 1L;
138

139
                    @Override
140
                    protected void populateItem(Item<ApiResponseEntry> item) {
141
                        item.add(new TemplateItem("template", item.getModelObject()));
×
142
                    }
×
143

144
                });
145
            }
×
146
        });
147

148
    }
×
149

150
    private static Calendar getTime(ApiResponseEntry entry) {
151
        return DatatypeConverter.parseDateTime(entry.get("date"));
×
152
    }
153

154

155
    private static class Topic implements Serializable {
156

157
        private static final long serialVersionUID = 5919614141679468774L;
158

159
        String tag;
160
        ArrayList<ApiResponseEntry> templates = new ArrayList<>();
×
161

162
        Topic(String tag) {
×
163
            this.tag = tag;
×
164
        }
×
165

166
    }
167

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