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

kit-data-manager / ro-crate-java / #578

11 Nov 2025 01:46AM UTC coverage: 91.327% (-0.1%) from 91.45%
#578

Pull #303

github

web-flow
Merge 48b203e5a into 6a21367d1
Pull Request #303: chore(deps): update plugin io.freefair.maven-publish-java to v9.1.0

2243 of 2456 relevant lines covered (91.33%)

0.91 hits per line

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

94.0
/src/main/java/edu/kit/datamanager/ro_crate/externalproviders/dataentities/ImportFromZenodo.java
1
package edu.kit.datamanager.ro_crate.externalproviders.dataentities;
2

3
import com.apicatalog.jsonld.JsonLd;
4
import com.apicatalog.jsonld.JsonLdError;
5
import com.apicatalog.jsonld.document.JsonDocument;
6
import com.fasterxml.jackson.databind.ObjectMapper;
7
import com.fasterxml.jackson.databind.node.ObjectNode;
8

9
import edu.kit.datamanager.ro_crate.Crate;
10
import edu.kit.datamanager.ro_crate.RoCrate;
11
import edu.kit.datamanager.ro_crate.RoCrate.RoCrateBuilder;
12
import edu.kit.datamanager.ro_crate.entities.contextual.ContextualEntity;
13
import edu.kit.datamanager.ro_crate.entities.data.DataEntity;
14
import edu.kit.datamanager.ro_crate.objectmapper.MyObjectMapper;
15

16
import java.io.ByteArrayInputStream;
17
import java.io.IOException;
18
import java.nio.charset.StandardCharsets;
19
import java.util.Optional;
20

21
import org.apache.http.HttpHeaders;
22
import org.apache.http.client.methods.CloseableHttpResponse;
23
import org.apache.http.client.methods.HttpGet;
24
import org.apache.http.impl.client.CloseableHttpClient;
25
import org.apache.http.impl.client.HttpClients;
26

27
/**
28
 * Class providing functionality for importing a resource from zenodo.
29
 */
30
public class ImportFromZenodo {
31

32
  /**
33
   * Class has only static methods, therefore forbid instance creation.
34
   */
35
  private ImportFromZenodo() {}
36

37
  /**
38
   * Creating a crate and adding the zenodo resource to it.
39
   *
40
   * @param url           the url of the zenodo resource.
41
   * @param name          the name of the crate created.
42
   * @param description   the description of the crate created.
43
   * @param datePublished the published date of the crate.
44
   * @param licenseId     the license identifier of the crate.
45
   * @return the created crate.
46
   */
47
  public static Crate createCrateWithItem(
48
      String url,
49
      Optional<String> name,
50
      Optional<String> description,
51
      Optional<String> datePublished,
52
      Optional<String> licenseId) {
53

54
    RoCrateBuilder builder = new RoCrate.RoCrateBuilder();
1✔
55
    name.ifPresent(builder::addName);
1✔
56
    description.ifPresent(builder::addDescription);
1✔
57
    datePublished.ifPresent(builder::addDatePublishedWithExceptions);
1✔
58
    licenseId.ifPresent(builder::setLicense);
1✔
59

60
    Crate crate = builder.build();
1✔
61
    addToCrateFromZotero(url, crate);
1✔
62
    return crate;
1✔
63
  }
64

65
  public static void addZenodoToCrate(String ulr, Crate crate) {
66
    addToCrateFromZotero(ulr, crate);
1✔
67
  }
1✔
68

69
  private static void addToCrateFromZotero(String url, Crate crate) {
70
    ObjectMapper objectMapper = MyObjectMapper.getMapper();
1✔
71
    CloseableHttpClient httpClient = HttpClients.createDefault();
1✔
72
    HttpGet requestZenodo = new HttpGet(url);
1✔
73

74
    // HttpGet requestSchema= new HttpGet("https://www.researchobject.org/ro-crate/1.1/context.jsonld");
75
    HttpGet requestSchema = new HttpGet("https://schema.org/docs/jsonldcontext.json");
1✔
76
    requestZenodo.addHeader(HttpHeaders.ACCEPT, "application/ld+json");
1✔
77
    ObjectNode jsonNode;
78
    String mainId;
79
    try {
80
      CloseableHttpResponse response = httpClient.execute(requestZenodo);
1✔
81
      var stream = response.getEntity().getContent();
1✔
82

83
      // get the item of the main entity
84
      jsonNode = (ObjectNode) objectMapper.readTree(stream);
1✔
85
      mainId = jsonNode.get("@id").asText();
1✔
86

87
      final var el = JsonLd.flatten(JsonDocument.of(
1✔
88
              new ByteArrayInputStream(
89
                  jsonNode.toString().getBytes(StandardCharsets.UTF_8)))).get();
1✔
90

91
      CloseableHttpResponse schema = httpClient.execute(requestSchema);
1✔
92
      ObjectNode doc = (ObjectNode) objectMapper.readTree(schema.getEntity().getContent());
1✔
93
      var con = (ObjectNode) doc.get("@context");
1✔
94
      con.remove("type");
1✔
95
      con.remove("id");
1✔
96
      doc.set("@context", con);
1✔
97
      var finalVersion = JsonLd.compact(
1✔
98
          JsonDocument.of(el),
1✔
99
          JsonDocument.of(new ByteArrayInputStream(
1✔
100
              doc.toString().getBytes(StandardCharsets.UTF_8)))).get();
1✔
101

102

103
      jsonNode = (ObjectNode) objectMapper.readTree(finalVersion.toString());
1✔
104
    } catch (IOException | JsonLdError e) {
×
105
      e.printStackTrace();
×
106
      return;
×
107
    }
1✔
108
    // we don't need this context since we are going to add it to a crate which allready has one
109
    jsonNode.remove("@context");
1✔
110
    var graph = jsonNode.get("@graph");
1✔
111
    if (graph != null) {
1✔
112
      for (var entity : graph) {
1✔
113
        if (entity.get("@id").asText().equals(mainId)) {
1✔
114
          var dataEntity = new DataEntity.DataEntityBuilder()
1✔
115
              .setAllUnsafe((ObjectNode) entity).build();
1✔
116
          crate.addDataEntity(dataEntity);
1✔
117
        } else {
1✔
118
          // here we have to think of a way to differentiate between data and contextual entities.
119
          var contextualEntity = new ContextualEntity.ContextualEntityBuilder()
1✔
120
              .setAllUnsafe((ObjectNode) entity).build();
1✔
121
          crate.addContextualEntity(contextualEntity);
1✔
122
        }
123
      }
1✔
124
    }
125
  }
1✔
126
}
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

© 2025 Coveralls, Inc