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

IQSS / dataverse / #22985

23 Aug 2024 06:32PM UTC coverage: 20.61% (-0.2%) from 20.791%
#22985

Pull #10781

github

landreev
added an upfront locks check to the /addGlobusFiles api #10623
Pull Request #10781: Improved handling of Globus uploads

4 of 417 new or added lines in 15 files covered. (0.96%)

4194 existing lines in 35 files now uncovered.

17388 of 84365 relevant lines covered (20.61%)

0.21 hits per line

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

0.0
/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java
1
package edu.harvard.iq.dataverse.util.bagit;
2

3
import edu.harvard.iq.dataverse.*;
4
import edu.harvard.iq.dataverse.DatasetVersion.VersionState;
5
import edu.harvard.iq.dataverse.branding.BrandingUtil;
6
import edu.harvard.iq.dataverse.export.OAI_OREExporter;
7
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
8
import edu.harvard.iq.dataverse.util.SystemConfig;
9
import edu.harvard.iq.dataverse.util.json.JsonLDNamespace;
10
import edu.harvard.iq.dataverse.util.json.JsonLDTerm;
11
import edu.harvard.iq.dataverse.util.json.JsonPrinter;
12

13
import java.io.OutputStream;
14
import java.time.LocalDate;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.TreeMap;
18
import java.util.Map.Entry;
19
import java.util.logging.Level;
20
import java.util.logging.Logger;
21

22
import jakarta.json.Json;
23
import jakarta.json.JsonArray;
24
import jakarta.json.JsonArrayBuilder;
25
import jakarta.json.JsonObject;
26
import jakarta.json.JsonObjectBuilder;
27
import jakarta.json.JsonValue;
28

29
import org.apache.commons.lang3.exception.ExceptionUtils;
30

31
/**
32
 * This class is used to generate a JSON-LD representation of a Dataverse object leveraging the OAI_ORE and other community vocabularies. As of v1.0.0,
33
 * the format is being versioned and ANY CHANGES TO THE OUTPUT of this class must be reflected in a version increment (see DATAVERSE_ORE_FORMAT_VERSION).
34
 * 
35
 * The OREMap class is intended to record ALL the information needed to recreate an existing Dataverse dataset. As of v1.0.0, this is true with the 
36
 * exception that auxiliary files are not referenced in the OREMap. While many types of auxiliary files will be regenerated automatically based on datafile
37
 *  contents, Dataverse now allows manually uploaded auxiliary files and these cannot be reproduced solely from the dataset/datafile contents. 
38
 */
39
public class OREMap {
40

41
    //Required Services
42
    static SettingsServiceBean settingsService;
43
    static DatasetFieldServiceBean datasetFieldService;
44
    static SystemConfig systemConfig;
45
    
UNCOV
46
    private static final Logger logger = Logger.getLogger(OREMap.class.getCanonicalName());
×
47
    
48
    public static final String NAME = "OREMap";
49
    
50
    //NOTE: Update this value whenever the output of this class is changed
51
    private static final String DATAVERSE_ORE_FORMAT_VERSION = "Dataverse OREMap Format v1.0.0";
52
    private static final String DATAVERSE_SOFTWARE_NAME = "Dataverse";
53
    private static final String DATAVERSE_SOFTWARE_URL = "https://github.com/iqss/dataverse";
54
    
55
    
UNCOV
56
    private Map<String, String> localContext = new TreeMap<String, String>();
×
57
    private DatasetVersion version;
UNCOV
58
    private Boolean excludeEmail = null;
×
59

UNCOV
60
    public OREMap(DatasetVersion version) {
×
61
        this.version = version;
×
62
    }
×
63

64
    //Used when the ExcludeEmailFromExport needs to be overriden, i.e. for archiving
UNCOV
65
    public OREMap(DatasetVersion dv, boolean exclude) {
×
66
        this.version = dv;
×
67
        this.excludeEmail = exclude;
×
68
    }
×
69

70
    public void writeOREMap(OutputStream outputStream) throws Exception {
UNCOV
71
        outputStream.write(getOREMap().toString().getBytes("UTF8"));
×
72
        outputStream.flush();
×
73
    }
×
74

75
    public JsonObject getOREMap() {
UNCOV
76
        return getOREMap(false);
×
77
    }
78
    
79
    public JsonObject getOREMap(boolean aggregationOnly) {
UNCOV
80
        return getOREMapBuilder(aggregationOnly).build();
×
81
    }
82
    
83
    public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) {
84

85
        //Set this flag if it wasn't provided
UNCOV
86
        if(excludeEmail==null) {
×
87
            excludeEmail = settingsService.isTrueForKey(SettingsServiceBean.Key.ExcludeEmailFromExport, false);
×
88
        }
89
        
90
        // Add namespaces we'll definitely use to Context
91
        // Additional namespaces are added as needed below
UNCOV
92
        localContext.putIfAbsent(JsonLDNamespace.ore.getPrefix(), JsonLDNamespace.ore.getUrl());
×
93
        localContext.putIfAbsent(JsonLDNamespace.dcterms.getPrefix(), JsonLDNamespace.dcterms.getUrl());
×
94
        localContext.putIfAbsent(JsonLDNamespace.dvcore.getPrefix(), JsonLDNamespace.dvcore.getUrl());
×
95
        localContext.putIfAbsent(JsonLDNamespace.schema.getPrefix(), JsonLDNamespace.schema.getUrl());
×
96

UNCOV
97
        Dataset dataset = version.getDataset();
×
98
        String id = dataset.getGlobalId().asURL();
×
99
        JsonArrayBuilder fileArray = Json.createArrayBuilder();
×
100
        // The map describes an aggregation
UNCOV
101
        JsonObjectBuilder aggBuilder = Json.createObjectBuilder();
×
102
        List<DatasetField> fields = version.getDatasetFields();
×
103
        // That has it's own metadata
UNCOV
104
        Map<Long, JsonObject> cvocMap = datasetFieldService.getCVocConf(true);
×
105
        for (DatasetField field : fields) {
×
106
            if (!field.isEmpty()) {
×
107
                DatasetFieldType dfType = field.getDatasetFieldType();
×
108
                JsonLDTerm fieldName = dfType.getJsonLDTerm();
×
109
                JsonValue jv = getJsonLDForField(field, excludeEmail, cvocMap, localContext);
×
110
                if(jv!=null) {
×
111
                    aggBuilder.add(fieldName.getLabel(), jv);
×
112
                }
113
            }
UNCOV
114
        }
×
115
        // Add metadata related to the Dataset/DatasetVersion
UNCOV
116
        aggBuilder.add("@id", id)
×
117
                .add("@type",
×
118
                        Json.createArrayBuilder().add(JsonLDTerm.ore("Aggregation").getLabel())
×
119
                                .add(JsonLDTerm.schemaOrg("Dataset").getLabel()))
×
120
                .add(JsonLDTerm.schemaOrg("version").getLabel(), version.getFriendlyVersionNumber())
×
121
                .add(JsonLDTerm.schemaOrg("name").getLabel(), version.getTitle())
×
122
                .add(JsonLDTerm.schemaOrg("dateModified").getLabel(), version.getLastUpdateTime().toString());
×
123
        addIfNotNull(aggBuilder, JsonLDTerm.schemaOrg("datePublished"), dataset.getPublicationDateFormattedYYYYMMDD());
×
124
        //Add version state info - DRAFT, RELEASED, DEACCESSIONED, ARCHIVED with extra info for DEACCESIONED
UNCOV
125
        VersionState vs = version.getVersionState();
×
126
        if(vs.equals(VersionState.DEACCESSIONED)) {
×
127
            JsonObjectBuilder deaccBuilder = Json.createObjectBuilder();
×
128
            deaccBuilder.add(JsonLDTerm.schemaOrg("name").getLabel(), vs.name());
×
129
            deaccBuilder.add(JsonLDTerm.DVCore("reason").getLabel(), version.getVersionNote());
×
130
            addIfNotNull(deaccBuilder, JsonLDTerm.DVCore("forwardUrl"), version.getArchiveNote());
×
131
            aggBuilder.add(JsonLDTerm.schemaOrg("creativeWorkStatus").getLabel(), deaccBuilder);
×
132
            
UNCOV
133
        } else {
×
134
            aggBuilder.add(JsonLDTerm.schemaOrg("creativeWorkStatus").getLabel(), vs.name());
×
135
        }
136

UNCOV
137
        TermsOfUseAndAccess terms = version.getTermsOfUseAndAccess();
×
138
        if (terms.getLicense() != null) {
×
139
            aggBuilder.add(JsonLDTerm.schemaOrg("license").getLabel(),
×
140
                    terms.getLicense().getUri().toString());
×
141
        } else {
UNCOV
142
            addIfNotNull(aggBuilder, JsonLDTerm.termsOfUse, terms.getTermsOfUse());
×
143
            addIfNotNull(aggBuilder, JsonLDTerm.confidentialityDeclaration, terms.getConfidentialityDeclaration());
×
144
            addIfNotNull(aggBuilder, JsonLDTerm.specialPermissions, terms.getSpecialPermissions());
×
145
            addIfNotNull(aggBuilder, JsonLDTerm.restrictions, terms.getRestrictions());
×
146
            addIfNotNull(aggBuilder, JsonLDTerm.citationRequirements, terms.getCitationRequirements());
×
147
            addIfNotNull(aggBuilder, JsonLDTerm.depositorRequirements, terms.getDepositorRequirements());
×
148
            addIfNotNull(aggBuilder, JsonLDTerm.conditions, terms.getConditions());
×
149
            addIfNotNull(aggBuilder, JsonLDTerm.disclaimer, terms.getDisclaimer());
×
150
        }
151
        // Add fileTermsofAccess as an object since it is compound
UNCOV
152
        JsonObjectBuilder fAccess = Json.createObjectBuilder();
×
153
        addIfNotNull(fAccess, JsonLDTerm.termsOfAccess, terms.getTermsOfAccess());
×
154
        addIfNotNull(fAccess, JsonLDTerm.fileRequestAccess, terms.isFileAccessRequest());
×
155
        addIfNotNull(fAccess, JsonLDTerm.dataAccessPlace, terms.getDataAccessPlace());
×
156
        addIfNotNull(fAccess, JsonLDTerm.originalArchive, terms.getOriginalArchive());
×
157
        addIfNotNull(fAccess, JsonLDTerm.availabilityStatus, terms.getAvailabilityStatus());
×
158
        addIfNotNull(fAccess, JsonLDTerm.contactForAccess, terms.getContactForAccess());
×
159
        addIfNotNull(fAccess, JsonLDTerm.sizeOfCollection, terms.getSizeOfCollection());
×
160
        addIfNotNull(fAccess, JsonLDTerm.studyCompletion, terms.getStudyCompletion());
×
161
        JsonObject fAccessObject = fAccess.build();
×
162
        if (!fAccessObject.isEmpty()) {
×
163
            aggBuilder.add(JsonLDTerm.fileTermsOfAccess.getLabel(), fAccessObject);
×
164
        }
165

UNCOV
166
        aggBuilder.add(JsonLDTerm.schemaOrg("includedInDataCatalog").getLabel(),
×
167
                BrandingUtil.getInstallationBrandName());
×
168

UNCOV
169
        aggBuilder.add(JsonLDTerm.schemaOrg("isPartOf").getLabel(), getDataverseDescription(dataset.getOwner()));
×
170
        String mdl = dataset.getMetadataLanguage();
×
171
        if (DvObjectContainer.isMetadataLanguageSet(mdl)) {
×
172
            aggBuilder.add(JsonLDTerm.schemaOrg("inLanguage").getLabel(), mdl);
×
173
        }
174
        
175
        // The aggregation aggregates aggregatedresources (Datafiles) which each have
176
        // their own entry and metadata
UNCOV
177
        JsonArrayBuilder aggResArrayBuilder = Json.createArrayBuilder();
×
178
        if (!aggregationOnly) {
×
179

UNCOV
180
            for (FileMetadata fmd : version.getFileMetadatas()) {
×
181
                DataFile df = fmd.getDataFile();
×
182
                JsonObjectBuilder aggRes = Json.createObjectBuilder();
×
183

UNCOV
184
                if (fmd.getDescription() != null) {
×
185
                    aggRes.add(JsonLDTerm.schemaOrg("description").getLabel(), fmd.getDescription());
×
186
                } else {
UNCOV
187
                    addIfNotNull(aggRes, JsonLDTerm.schemaOrg("description"), df.getDescription());
×
188
                }
UNCOV
189
                String fileName = fmd.getLabel();// "label" is the filename
×
190
                long fileSize = df.getFilesize();
×
191
                String mimeType = df.getContentType();
×
192
                String currentIngestedName = null;
×
193
                boolean ingested=df.getOriginalFileName()!= null || df.getOriginalFileSize()!=null || df.getOriginalFileFormat()!=null;
×
194
                if(ingested) {
×
195
                    if(df.getOriginalFileName()!=null) {
×
196
                        currentIngestedName= fileName;
×
197
                        fileName = df.getOriginalFileName();
×
198
                    } else {
UNCOV
199
                        logger.warning("Missing Original file name for id: " + df.getId());
×
200
                    }
UNCOV
201
                    if(df.getOriginalFileSize()!=null) {
×
202
                        fileSize = df.getOriginalFileSize();
×
203
                    } else {
UNCOV
204
                        logger.warning("Missing Original file size for id: " + df.getId());
×
205
                    }
UNCOV
206
                    if(df.getOriginalFileFormat()!=null) {
×
207
                        mimeType = df.getOriginalFileFormat();
×
208
                    } else {
UNCOV
209
                        logger.warning("Missing Original file format for id: " + df.getId());
×
210
                    }
211

212
                    
213
                }
UNCOV
214
                addIfNotNull(aggRes, JsonLDTerm.schemaOrg("name"), fileName); 
×
215
                addIfNotNull(aggRes, JsonLDTerm.restricted, fmd.isRestricted());
×
216
                Embargo embargo=df.getEmbargo(); 
×
217
                if(embargo!=null) {
×
218
                    String date = embargo.getFormattedDateAvailable();
×
219
                    String reason= embargo.getReason();
×
220
                    JsonObjectBuilder embargoObject = Json.createObjectBuilder();
×
221
                    embargoObject.add(JsonLDTerm.DVCore("dateAvailable").getLabel(), date);
×
222
                    if(reason!=null) {
×
223
                        embargoObject.add(JsonLDTerm.DVCore("reason").getLabel(), reason);
×
224
                    }
UNCOV
225
                    aggRes.add(JsonLDTerm.DVCore("embargoed").getLabel(), embargoObject);
×
226
                }
UNCOV
227
                Retention retention = df.getRetention();
×
228
                if(retention!=null) {
×
229
                    String date = retention.getFormattedDateUnavailable();
×
230
                    String reason= retention.getReason();
×
231
                    JsonObjectBuilder retentionObject = Json.createObjectBuilder();
×
232
                    retentionObject.add(JsonLDTerm.DVCore("dateUnavailable").getLabel(), date);
×
233
                    if(reason!=null) {
×
234
                        retentionObject.add(JsonLDTerm.DVCore("reason").getLabel(), reason);
×
235
                    }
UNCOV
236
                    aggRes.add(JsonLDTerm.DVCore("retained").getLabel(), retentionObject);
×
237
                }
UNCOV
238
                addIfNotNull(aggRes, JsonLDTerm.directoryLabel, fmd.getDirectoryLabel());
×
239
                addIfNotNull(aggRes, JsonLDTerm.schemaOrg("version"), fmd.getVersion());
×
240
                addIfNotNull(aggRes, JsonLDTerm.datasetVersionId, fmd.getDatasetVersion().getId());
×
241
                JsonArray catArray = null;
×
242
                if (fmd != null) {
×
243
                    List<String> categories = fmd.getCategoriesByName();
×
244
                    if (categories.size() > 0) {
×
245
                        JsonArrayBuilder jab = Json.createArrayBuilder();
×
246
                        for (String s : categories) {
×
247
                            jab.add(s);
×
248
                        }
×
249
                        catArray = jab.build();
×
250
                    }
251
                }
UNCOV
252
                addIfNotNull(aggRes, JsonLDTerm.categories, catArray);
×
253
                // File DOI if it exists
UNCOV
254
                String fileId = null;
×
255
                String fileSameAs = null;
×
256
                if (df.getGlobalId()!=null) {
×
257
                    fileId = df.getGlobalId().asString();
×
258
                    fileSameAs = SystemConfig.getDataverseSiteUrlStatic()
×
259
                            + "/api/access/datafile/:persistentId?persistentId=" + fileId + (ingested ? "&format=original":"");
×
260
                } else {
UNCOV
261
                    fileId = SystemConfig.getDataverseSiteUrlStatic() + "/file.xhtml?fileId=" + df.getId();
×
262
                    fileSameAs = SystemConfig.getDataverseSiteUrlStatic() + "/api/access/datafile/" + df.getId() + (ingested ? "?format=original":"");
×
263
                }
UNCOV
264
                aggRes.add("@id", fileId);
×
265
                aggRes.add(JsonLDTerm.schemaOrg("sameAs").getLabel(), fileSameAs);
×
266
                fileArray.add(fileId);
×
267

UNCOV
268
                aggRes.add("@type", JsonLDTerm.ore("AggregatedResource").getLabel());
×
269
                addIfNotNull(aggRes, JsonLDTerm.schemaOrg("fileFormat"), mimeType);
×
270
                addIfNotNull(aggRes, JsonLDTerm.filesize, fileSize);
×
271
                addIfNotNull(aggRes, JsonLDTerm.storageIdentifier, df.getStorageIdentifier());
×
272
                addIfNotNull(aggRes, JsonLDTerm.currentIngestedName, currentIngestedName);
×
273
                addIfNotNull(aggRes, JsonLDTerm.UNF, df.getUnf());
×
274
                addIfNotNull(aggRes, JsonLDTerm.rootDataFileId, df.getRootDataFileId());
×
275
                addIfNotNull(aggRes, JsonLDTerm.previousDataFileId, df.getPreviousDataFileId());
×
276
                JsonObject checksum = null;
×
277
                // Add checksum. RDA recommends SHA-512
UNCOV
278
                if (df.getChecksumType() != null && df.getChecksumValue() != null) {
×
279
                    checksum = Json.createObjectBuilder().add("@type", df.getChecksumType().toString())
×
280
                            .add("@value", df.getChecksumValue()).build();
×
281
                    aggRes.add(JsonLDTerm.checksum.getLabel(), checksum);
×
282
                }
UNCOV
283
                JsonArray tabTags = null;
×
284
                JsonArrayBuilder jab = JsonPrinter.getTabularFileTags(df);
×
285
                if (jab != null) {
×
286
                    tabTags = jab.build();
×
287
                }
UNCOV
288
                addIfNotNull(aggRes, JsonLDTerm.tabularTags, tabTags);
×
289
                // Add latest resource to the array
UNCOV
290
                aggResArrayBuilder.add(aggRes.build());
×
291
            }
×
292
        }
293
        // Build the '@context' object for json-ld based on the localContext entries
UNCOV
294
        JsonObjectBuilder contextBuilder = Json.createObjectBuilder();
×
295
        for (Entry<String, String> e : localContext.entrySet()) {
×
296
            contextBuilder.add(e.getKey(), e.getValue());
×
297
        }
×
298
        if (aggregationOnly) {
×
299
            return aggBuilder.add("@context", contextBuilder.build());
×
300
        } else {
301
            // Now create the overall map object with it's metadata
302
            
303
            //Start with a reference to the Dataverse software
UNCOV
304
            JsonObjectBuilder dvSoftwareBuilder = Json.createObjectBuilder()
×
305
                    .add("@type", JsonLDTerm.schemaOrg("SoftwareApplication").getLabel())
×
306
                    .add(JsonLDTerm.schemaOrg("name").getLabel(), DATAVERSE_SOFTWARE_NAME)
×
307
                    .add(JsonLDTerm.schemaOrg("version").getLabel(), systemConfig.getVersion(true))
×
308
                    .add(JsonLDTerm.schemaOrg("url").getLabel(), DATAVERSE_SOFTWARE_URL);
×
309
            
310
            //Now the OREMAP object itself
UNCOV
311
            JsonObjectBuilder oremapBuilder = Json.createObjectBuilder()
×
312
                    .add(JsonLDTerm.dcTerms("modified").getLabel(), LocalDate.now().toString())
×
313
                    .add(JsonLDTerm.dcTerms("creator").getLabel(), BrandingUtil.getInstallationBrandName())
×
314
                    .add("@type", JsonLDTerm.ore("ResourceMap").getLabel())
×
315
                    //Add the version of our ORE format used
UNCOV
316
                    .add(JsonLDTerm.schemaOrg("additionalType").getLabel(), DATAVERSE_ORE_FORMAT_VERSION)
×
317
                    //Indicate which Dataverse version created it
UNCOV
318
                    .add(JsonLDTerm.DVCore("generatedBy").getLabel(), dvSoftwareBuilder)
×
319
                    // Define an id for the map itself (separate from the @id of the dataset being
320
                    // described
UNCOV
321
                    .add("@id",
×
322
                            SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/export?exporter="
×
323
                                    + OAI_OREExporter.NAME + "&persistentId=" + id)
324
                    // Add the aggregation (Dataset) itself to the map.
UNCOV
325
                    .add(JsonLDTerm.ore("describes").getLabel(),
×
326
                            aggBuilder.add(JsonLDTerm.ore("aggregates").getLabel(), aggResArrayBuilder.build())
×
327
                                    .add(JsonLDTerm.schemaOrg("hasPart").getLabel(), fileArray.build()).build())
×
328
                    // and finally add the context
UNCOV
329
                    .add("@context", contextBuilder.build());
×
330
            return oremapBuilder;
×
331
        }
332
    }
333

334
    private JsonObjectBuilder getDataverseDescription(Dataverse dv) {
335
        //Schema.org is already in local context, no updates needed as long as we only use chemaOrg and "@id" here
UNCOV
336
        JsonObjectBuilder dvjob = Json.createObjectBuilder().add(JsonLDTerm.schemaOrg("name").getLabel(), dv.getCurrentName()).add("@id", dv.getLocalURL());
×
337
        addIfNotNull(dvjob, JsonLDTerm.schemaOrg("description"), dv.getDescription());
×
338
        Dataverse owner = dv.getOwner();
×
339
        if(owner!=null) {
×
340
            dvjob.add(JsonLDTerm.schemaOrg("isPartOf").getLabel(), getDataverseDescription(owner));
×
341
        }
UNCOV
342
        return dvjob;
×
343
    }
344

345
    /*
346
     * Simple methods to only add an entry to JSON if the value of the term is
347
     * non-null. Methods created for string, JsonValue, boolean, and long
348
     */
349

350
    private void addIfNotNull(JsonObjectBuilder builder, JsonLDTerm key, String value) {
UNCOV
351
        if (value != null) {
×
352
            builder.add(key.getLabel(), value);
×
353
            addToContextMap(key);
×
354
        }
UNCOV
355
    }
×
356

357
    private void addIfNotNull(JsonObjectBuilder builder, JsonLDTerm key, JsonValue value) {
UNCOV
358
        if (value != null) {
×
359
            builder.add(key.getLabel(), value);
×
360
            addToContextMap(key);
×
361
        }
UNCOV
362
    }
×
363

364
    private void addIfNotNull(JsonObjectBuilder builder, JsonLDTerm key, Boolean value) {
UNCOV
365
        if (value != null) {
×
366
            builder.add(key.getLabel(), value);
×
367
            addToContextMap(key);
×
368
        }
UNCOV
369
    }
×
370

371
    private void addIfNotNull(JsonObjectBuilder builder, JsonLDTerm key, Long value) {
UNCOV
372
        if (value != null) {
×
373
            builder.add(key.getLabel(), value);
×
374
            addToContextMap(key);
×
375
        }
UNCOV
376
    }
×
377

378
    private void addToContextMap(JsonLDTerm key) {
UNCOV
379
        if (!key.inNamespace()) {
×
380
            localContext.putIfAbsent(key.getLabel(), key.getUrl());
×
381
        }
UNCOV
382
    }
×
383

384
    public JsonLDTerm getContactTerm() {
UNCOV
385
        return getTermFor(DatasetFieldConstant.datasetContact);
×
386
    }
387

388
    public JsonLDTerm getContactNameTerm() {
UNCOV
389
        return getTermFor(DatasetFieldConstant.datasetContactName);
×
390
    }
391

392
    public JsonLDTerm getContactEmailTerm() {
UNCOV
393
        return getTermFor(DatasetFieldConstant.datasetContactEmail);
×
394
    }
395

396
    public JsonLDTerm getDescriptionTerm() {
UNCOV
397
        return getTermFor(DatasetFieldConstant.description);
×
398
    }
399

400
    public JsonLDTerm getDescriptionTextTerm() {
UNCOV
401
        return getTermFor(DatasetFieldConstant.descriptionText);
×
402
    }
403

404
    private JsonLDTerm getTermFor(String fieldTypeName) {
405
        //Could call datasetFieldService.findByName(fieldTypeName) - is that faster/prefereable?
UNCOV
406
        for (DatasetField dsf : version.getFlatDatasetFields()) {
×
407
            DatasetFieldType dsft = dsf.getDatasetFieldType();
×
408
            if (dsft.getName().equals(fieldTypeName)) {
×
409
                return dsft.getJsonLDTerm();
×
410
            }
UNCOV
411
        }
×
412
        return null;
×
413
    }
414
    
415
    public static JsonValue getJsonLDForField(DatasetField field, Boolean excludeEmail, Map<Long, JsonObject> cvocMap,
416
            Map<String, String> localContext) {
417

UNCOV
418
        DatasetFieldType dfType = field.getDatasetFieldType();
×
419
        if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dfType.getFieldType())) {
×
420
            return null;
×
421
        }
422

UNCOV
423
        JsonLDTerm fieldName = dfType.getJsonLDTerm();
×
424
        if (fieldName.inNamespace()) {
×
425
            localContext.putIfAbsent(fieldName.getNamespace().getPrefix(), fieldName.getNamespace().getUrl());
×
426
        } else {
UNCOV
427
            localContext.putIfAbsent(fieldName.getLabel(), fieldName.getUrl());
×
428
        }
UNCOV
429
        JsonArrayBuilder vals = Json.createArrayBuilder();
×
430
        if (!dfType.isCompound()) {
×
431
            for (String val : field.getValues_nondisplay()) {
×
432
                if (cvocMap.containsKey(dfType.getId())) {
×
433
                    addCvocValue(val, vals, cvocMap.get(dfType.getId()), localContext);
×
434
                } else {
UNCOV
435
                    vals.add(val);
×
436
                }
UNCOV
437
            }
×
438
        } else {
439
            // ToDo: Needs to be recursive (as in JsonPrinter?)
UNCOV
440
            for (DatasetFieldCompoundValue dscv : field.getDatasetFieldCompoundValues()) {
×
441
                // compound values are of different types
UNCOV
442
                JsonObjectBuilder child = Json.createObjectBuilder();
×
443

UNCOV
444
                for (DatasetField dsf : dscv.getChildDatasetFields()) {
×
445
                    DatasetFieldType dsft = dsf.getDatasetFieldType();
×
446
                    if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dsft.getFieldType())) {
×
447
                        continue;
×
448
                    }
449
                    // which may have multiple values
UNCOV
450
                    if (!dsf.isEmpty()) {
×
451
                        // Add context entry
452
                        // ToDo - also needs to recurse here?
UNCOV
453
                        JsonLDTerm subFieldName = dsft.getJsonLDTerm();
×
454
                        if (subFieldName.inNamespace()) {
×
455
                            localContext.putIfAbsent(subFieldName.getNamespace().getPrefix(),
×
456
                                    subFieldName.getNamespace().getUrl());
×
457
                        } else {
UNCOV
458
                            localContext.putIfAbsent(subFieldName.getLabel(), subFieldName.getUrl());
×
459
                        }
460

UNCOV
461
                        List<String> values = dsf.getValues_nondisplay();
×
462

UNCOV
463
                        JsonArrayBuilder childVals = Json.createArrayBuilder();
×
464

UNCOV
465
                        for (String val : dsf.getValues_nondisplay()) {
×
466
                            logger.fine("Child name: " + dsft.getName());
×
467
                            if (cvocMap.containsKey(dsft.getId())) {
×
468
                                logger.fine("Calling addcvocval for: " + dsft.getName());
×
469
                                addCvocValue(val, childVals, cvocMap.get(dsft.getId()), localContext);
×
470
                            } else {
UNCOV
471
                                childVals.add(val);
×
472
                            }
UNCOV
473
                        }
×
474
                        if (values.size() > 1) {
×
475
                            child.add(subFieldName.getLabel(), childVals);
×
476
                        } else {
UNCOV
477
                            child.add(subFieldName.getLabel(), childVals.build().get(0));
×
478
                        }
479
                    }
UNCOV
480
                }
×
481
                vals.add(child);
×
482
            }
×
483
        }
484
        // Add metadata value to aggregation, suppress array when only one value
UNCOV
485
        JsonArray valArray = vals.build();
×
486
        return (valArray.size() != 1) ? valArray : valArray.get(0);
×
487
    }
488

489
    private static void addCvocValue(String val, JsonArrayBuilder vals, JsonObject cvocEntry,
490
            Map<String, String> localContext) {
491
        try {
UNCOV
492
            if (cvocEntry.containsKey("retrieval-filtering")) {
×
493
                JsonObject filtering = cvocEntry.getJsonObject("retrieval-filtering");
×
494
                JsonObject context = filtering.getJsonObject("@context");
×
495
                for (String prefix : context.keySet()) {
×
496
                    localContext.putIfAbsent(prefix, context.getString(prefix));
×
497
                }
×
498
                JsonObjectBuilder job = Json.createObjectBuilder(datasetFieldService.getExternalVocabularyValue(val));
×
499
                job.add("@id", val);
×
500
                JsonObject extVal = job.build();
×
501
                logger.fine("Adding: " + extVal);
×
502
                vals.add(extVal);
×
503
            } else {
×
504
                vals.add(val);
×
505
            }
UNCOV
506
        } catch (Exception e) {
×
507
            logger.warning("Couldn't interpret value for : " + val + " : " + e.getMessage());
×
508
            logger.log(Level.FINE, ExceptionUtils.getStackTrace(e));
×
509
            vals.add(val);
×
510
        }
×
511
    }
×
512

513
    //These are used to pick up various settings/constants from the application
514
    public static void injectServices(SettingsServiceBean settingsSvc, DatasetFieldServiceBean datasetFieldSvc, SystemConfig systemCfg) {
UNCOV
515
        settingsService = settingsSvc;
×
516
        datasetFieldService = datasetFieldSvc;
×
517
        systemConfig = systemCfg;
×
518
    }
×
519
}
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