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

knowledgepixels / nanopub-registry / 20374513260

19 Dec 2025 03:27PM UTC coverage: 0.954% (-0.2%) from 1.118%
20374513260

push

github

ashleycaselli
refactor: update NanopubLoader and Utils to use NPX vocabulary

6 of 592 branches covered (1.01%)

Branch coverage included in aggregate %.

17 of 1819 relevant lines covered (0.93%)

0.11 hits per line

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

14.38
src/main/java/com/knowledgepixels/registry/Utils.java
1
package com.knowledgepixels.registry;
2

3
import com.github.jsonldjava.shaded.com.google.common.base.Charsets;
4
import com.github.jsonldjava.shaded.com.google.common.reflect.TypeToken;
5
import com.google.common.hash.Hashing;
6
import com.google.gson.Gson;
7
import com.google.gson.JsonIOException;
8
import com.google.gson.JsonSyntaxException;
9
import com.mongodb.client.ClientSession;
10
import io.vertx.ext.web.RoutingContext;
11
import net.trustyuri.TrustyUriUtils;
12
import org.apache.commons.lang.StringUtils;
13
import org.commonjava.mimeparse.MIMEParse;
14
import org.eclipse.rdf4j.common.exception.RDF4JException;
15
import org.eclipse.rdf4j.model.IRI;
16
import org.eclipse.rdf4j.model.Resource;
17
import org.eclipse.rdf4j.model.Statement;
18
import org.eclipse.rdf4j.model.ValueFactory;
19
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
20
import org.nanopub.MalformedNanopubException;
21
import org.nanopub.Nanopub;
22
import org.nanopub.NanopubImpl;
23
import org.nanopub.NanopubUtils;
24
import org.nanopub.extra.setting.NanopubSetting;
25
import org.nanopub.vocabulary.NPX;
26

27
import java.io.File;
28
import java.io.IOException;
29
import java.io.InputStreamReader;
30
import java.io.UnsupportedEncodingException;
31
import java.lang.reflect.Type;
32
import java.net.MalformedURLException;
33
import java.net.URL;
34
import java.net.URLEncoder;
35
import java.util.*;
36

37
public class Utils {
38

39
    private Utils() {
40
    }  // no instances allowed
41

42
    public static String getMimeType(RoutingContext context, String supported) {
43
        List<String> supportedList = Arrays.asList(StringUtils.split(supported, ','));
×
44
        String mimeType = supportedList.get(0);
×
45
        try {
46
            mimeType = MIMEParse.bestMatch(supportedList, context.request().getHeader("Accept"));
×
47
        } catch (Exception ex) {
×
48
        }
×
49
        return mimeType;
×
50
    }
51

52
    public static String urlEncode(Object o) {
53
        try {
54
            return URLEncoder.encode((o == null ? "" : o.toString()), "UTF-8");
×
55
        } catch (UnsupportedEncodingException ex) {
×
56
            throw new RuntimeException(ex);
×
57
        }
58
    }
59

60
    public static String getHash(String s) {
61
        return Hashing.sha256().hashString(s, Charsets.UTF_8).toString();
18✔
62
    }
63

64
    public static Set<IRI> getInvalidatedNanopubIds(Nanopub np) {
65
        Set<IRI> l = new HashSet<IRI>();
×
66
        for (Statement st : NanopubUtils.getStatements(np)) {
×
67
            if (!(st.getObject() instanceof IRI)) continue;
×
68
            Resource s = st.getSubject();
×
69
            IRI p = st.getPredicate();
×
70
            if ((p.equals(NPX.RETRACTS) || p.equals(NPX.INVALIDATES)) || (p.equals(NPX.SUPERSEDES) && s.equals(np.getUri()))) {
×
71
                if (TrustyUriUtils.isPotentialTrustyUri(st.getObject().stringValue())) {
×
72
                    l.add((IRI) st.getObject());
×
73
                }
74
            }
75
        }
×
76
        return l;
×
77
    }
78

79
    public static String getEnv(String name, String defaultValue) {
80
        String value = System.getenv(name);
9✔
81
        if (value == null) value = defaultValue;
12!
82
        return value;
6✔
83
    }
84

85
    public static String getTypeHash(ClientSession mongoSession, Object type) {
86
        String typeHash = Utils.getHash(type.toString());
×
87
        if (type.toString().equals("$")) {
×
88
            typeHash = "$";
×
89
        } else {
90
            RegistryDB.recordHash(mongoSession, type.toString());
×
91
        }
92
        return typeHash;
×
93
    }
94

95
    public static String getAgentLabel(String agentId) {
96
        if (agentId == null || agentId.isBlank()) {
15✔
97
            throw new IllegalArgumentException("Agent ID cannot be null or blank");
15✔
98
        }
99
        agentId = agentId.replaceFirst("^https://orcid\\.org/", "orcid:");
15✔
100
        if (agentId.length() > 55) {
12!
101
            return agentId.substring(0, 50) + "...";
×
102
        }
103
        return agentId;
6✔
104
    }
105

106
    public static boolean isUnloadedStatus(String status) {
107
        if (status.equals("seen")) return true;  // only exists in "accounts_loading"?
×
108
        if (status.equals("skipped")) return true;
×
109
        return false;
×
110
    }
111

112
    public static boolean isCoreLoadedStatus(String status) {
113
        if (status.equals("visited")) return true;  // only exists in "accounts_loading"?
×
114
        if (status.equals("expanded")) return true;  // only exists in "accounts_loading"?
×
115
        if (status.equals("processed")) return true;  // only exists in "accounts_loading"?
×
116
        if (status.equals("aggregated")) return true;  // only exists in "accounts_loading"?
×
117
        if (status.equals("approved")) return true;  // only exists in "accounts_loading"?
×
118
        if (status.equals("contested")) return true;
×
119
        if (status.equals("toLoad")) return true;  // only exists in "accounts_loading"?
×
120
        if (status.equals("loaded")) return true;
×
121
        return false;
×
122
    }
123

124
    public static boolean isFullyLoadedStatus(String status) {
125
        if (status.equals("loaded")) return true;
×
126
        return false;
×
127
    }
128

129
    private static ValueFactory vf = SimpleValueFactory.getInstance();
6✔
130
    public static final IRI APPROVES_OF = vf.createIRI("http://purl.org/nanopub/x/approvesOf");
12✔
131

132
    public static final IRI APPROVAL_TYPE = vf.createIRI("http://purl.org/nanopub/x/approvesOf");
12✔
133

134
    public static final String TYPE_JSON = "application/json";
135
    public static final String TYPE_TRIG = "application/trig";
136
    public static final String TYPE_JELLY = "application/x-jelly-rdf";
137
    public static final String TYPE_JSONLD = "application/ld+json";
138
    public static final String TYPE_NQUADS = "application/n-quads";
139
    public static final String TYPE_TRIX = "application/trix";
140
    public static final String TYPE_HTML = "text/html";
141

142
    // Content types supported on a ListPage
143
    public static final String SUPPORTED_TYPES_LIST = TYPE_JSON + "," + TYPE_JELLY + "," + TYPE_HTML;
144
    // Content types supported on a NanopubPage
145
    public static final String SUPPORTED_TYPES_NANOPUB = TYPE_TRIG + "," + TYPE_JELLY + "," + TYPE_JSONLD + "," + TYPE_NQUADS + "," + TYPE_TRIX + "," + TYPE_HTML;
146

147
    private static Map<String, String> extensionTypeMap;
148

149
    public static String getType(String extension) {
150
        if (extension == null) {
×
151
            return null;
×
152
        }
153
        if (extensionTypeMap == null) {
×
154
            extensionTypeMap = new HashMap<>();
×
155
            extensionTypeMap.put("trig", TYPE_TRIG);
×
156
            extensionTypeMap.put("jelly", TYPE_JELLY);
×
157
            extensionTypeMap.put("jsonld", TYPE_JSONLD);
×
158
            extensionTypeMap.put("nq", TYPE_NQUADS);
×
159
            extensionTypeMap.put("xml", TYPE_TRIX);
×
160
            extensionTypeMap.put("html", TYPE_HTML);
×
161
            extensionTypeMap.put("json", TYPE_JSON);
×
162
        }
163
        return extensionTypeMap.get(extension);
×
164
    }
165

166
    private static List<String> peerUrls;
167

168
    public static List<String> getPeerUrls() {
169
        if (peerUrls == null) {
×
170
            String envPeerUrls = getEnv("REGISTRY_PEER_URLS", "");
×
171
            String thisRegistryUrl = getEnv("REGISTRY_SERVICE_URL", "");
×
172
            if (!envPeerUrls.isEmpty()) {
×
173
                peerUrls = new ArrayList<>();
×
174
                for (String peerUrl : envPeerUrls.split(";")) {
×
175
                    if (thisRegistryUrl.equals(peerUrl)) continue;
×
176
                    peerUrls.add(peerUrl);
×
177
                }
178
            } else {
179
                NanopubSetting setting;
180
                try {
181
                    setting = getSetting();
×
182
                } catch (Exception ex) {
×
183
                    throw new RuntimeException(ex);
×
184
                }
×
185
                peerUrls = new ArrayList<>();
×
186
                for (IRI iri : setting.getBootstrapServices()) {
×
187
                    String peerUrl = iri.stringValue();
×
188
                    if (thisRegistryUrl.equals(peerUrl)) continue;
×
189
                    peerUrls.add(peerUrl);
×
190
                }
×
191
            }
192
        }
193
        return peerUrls;
×
194
    }
195

196
    private static final String SETTING_FILE_PATH = Utils.getEnv("REGISTRY_SETTING_FILE", "/data/setting.trig");
12✔
197
    private static NanopubSetting settingNp;
198

199
    public static NanopubSetting getSetting() throws RDF4JException, MalformedNanopubException, IOException {
200
        if (settingNp == null) {
×
201
            settingNp = new NanopubSetting(new NanopubImpl(new File(SETTING_FILE_PATH)));
×
202
        }
203
        return settingNp;
×
204
    }
205

206
    public static String getRandomPeer() throws RDF4JException, MalformedNanopubException, IOException {
207
        List<String> peerUrls = getPeerUrls();
×
208
        return peerUrls.get(random.nextInt(peerUrls.size()));
×
209
    }
210

211
    private static Random random = new Random();
12✔
212

213
    public static Random getRandom() {
214
        return random;
×
215
    }
216

217
    private static Gson g = new Gson();
12✔
218
    private static Type listType = new TypeToken<List<String>>() {
21✔
219
    }.getType();
6✔
220

221
    public static List<String> retrieveListFromJsonUrl(String url) throws JsonIOException, JsonSyntaxException, MalformedURLException, IOException {
222
        return g.fromJson(new InputStreamReader(new URL(url).openStream()), listType);
×
223
    }
224

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