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

IQSS / dataverse / #23077

04 Sep 2024 06:52PM UTC coverage: 20.702% (-0.06%) from 20.759%
#23077

Pull #10781

github

web-flow
Merge 9d8bf0ef8 into 8fd8c18e4
Pull Request #10781: Improved handling of Globus uploads

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

417 existing lines in 9 files now uncovered.

17530 of 84679 relevant lines covered (20.7%)

0.21 hits per line

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

1.68
/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package edu.harvard.iq.dataverse;
7

8
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
9
import edu.harvard.iq.dataverse.authorization.DataverseRole;
10
import edu.harvard.iq.dataverse.authorization.Permission;
11
import edu.harvard.iq.dataverse.authorization.groups.Group;
12
import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean;
13
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
14
import edu.harvard.iq.dataverse.authorization.users.User;
15
import edu.harvard.iq.dataverse.batch.util.LoggingUtil;
16
import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter;
17
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
18
import edu.harvard.iq.dataverse.search.IndexServiceBean;
19
import edu.harvard.iq.dataverse.search.SolrIndexServiceBean;
20
import edu.harvard.iq.dataverse.search.SolrSearchResult;
21
import edu.harvard.iq.dataverse.util.BundleUtil;
22
import edu.harvard.iq.dataverse.storageuse.StorageQuota;
23
import edu.harvard.iq.dataverse.util.StringUtil;
24
import edu.harvard.iq.dataverse.util.SystemConfig;
25

26
import java.io.File;
27
import java.io.IOException;
28
import java.sql.Timestamp;
29
import java.util.ArrayList;
30
import java.util.Date;
31
import java.util.HashMap;
32
import java.util.List;
33
import java.util.Map;
34
import java.util.logging.Logger;
35
import java.util.Properties;
36

37
import edu.harvard.iq.dataverse.validation.JSONDataValidation;
38
import jakarta.ejb.EJB;
39
import jakarta.ejb.Stateless;
40
import jakarta.inject.Inject;
41
import jakarta.inject.Named;
42
import jakarta.json.Json;
43
import jakarta.json.JsonArrayBuilder;
44
import jakarta.persistence.EntityManager;
45
import jakarta.persistence.NoResultException;
46
import jakarta.persistence.NonUniqueResultException;
47
import jakarta.persistence.PersistenceContext;
48
import jakarta.persistence.TypedQuery;
49
import java.nio.file.Files;
50
import java.nio.file.Paths;
51
import org.apache.commons.lang3.StringUtils;
52
import org.apache.solr.client.solrj.SolrServerException;
53
import org.everit.json.schema.Schema;
54
import org.everit.json.schema.ValidationException;
55
import org.everit.json.schema.loader.SchemaLoader;
56
import org.json.JSONObject;
57
import org.json.JSONTokener;
58

59
/**
60
 *
61
 * @author gdurand
62
 */
63
@Stateless
64
@Named
65
public class DataverseServiceBean implements java.io.Serializable {
1✔
66

67
    private static final Logger logger = Logger.getLogger(DataverseServiceBean.class.getCanonicalName());
1✔
68
    @EJB
69
    IndexServiceBean indexService;
70
    
71
    @EJB
72
    SolrIndexServiceBean solrIndexService; 
73

74
    @EJB
75
    AuthenticationServiceBean authService;
76
    
77
    @EJB
78
    DatasetServiceBean datasetService;
79
    
80
    @EJB
81
    DataverseLinkingServiceBean dataverseLinkingService;
82

83
    @EJB
84
    DatasetLinkingServiceBean datasetLinkingService;
85
    
86
    @EJB
87
    GroupServiceBean groupService;
88
    
89
    @EJB
90
    DataverseRoleServiceBean rolesService;
91
    
92
    @EJB
93
    PermissionServiceBean permissionService;
94
    
95
    @EJB
96
    DataverseFieldTypeInputLevelServiceBean dataverseFieldTypeInputLevelService;
97
    
98
    @EJB
99
    SystemConfig systemConfig;
100

101
    @Inject
102
    DataverseSession session;
103

104
    @PersistenceContext(unitName = "VDCNet-ejbPU")
105
    private EntityManager em;
106

107
    private static final String BASE_QUERY_DATASET_TITLES_WITHIN_DV = "select v.value, o.id\n" 
108
                + "from datasetfieldvalue v, dvobject o "
109
                + "where " 
110
                + "v.datasetfield_id = (select id from datasetfield f where datasetfieldtype_id = 1 " 
111
                + "and datasetversion_id = (select max(id) from datasetversion where dataset_id = o.id))";
112

113
    public Dataverse save(Dataverse dataverse) {
114
       
115
        dataverse.setModificationTime(new Timestamp(new Date().getTime()));
×
116
        Dataverse savedDataverse = em.merge(dataverse);
×
117
        return savedDataverse;
×
118
    }
119
    
120
    public boolean index(Dataverse dataverse) {
121
        return index(dataverse, false);
×
122

123
    }
124
        
125
    public boolean index(Dataverse dataverse, boolean indexPermissions) {    
126
        /**
127
         * @todo check the result to see if indexing was successful or not
128
         * added logging of exceptions 
129
         */
130
        try {
131
            indexService.indexDataverse(dataverse);
×
132
            if (indexPermissions) {
×
133
                solrIndexService.indexPermissionsOnSelfAndChildren(dataverse);
×
134
            }
135
        } catch (IOException | SolrServerException e) {
×
136
            String failureLogText = "Post-save indexing failed. You can kickoff a re-index of this dataverse with: \r\n curl http://localhost:8080/api/admin/index/dataverses/" + dataverse.getId().toString();
×
137
            failureLogText += "\r\n" + e.getLocalizedMessage();
×
138
            LoggingUtil.writeOnSuccessFailureLog(null, failureLogText, dataverse);
×
139
            return false;
×
140
        }
×
141

142
        return true;
×
143
    }    
144

145
    public Dataverse find(Object pk) {
146
        return em.find(Dataverse.class, pk);
×
147
    }
148

149
    public List<Dataverse> findAll() {
150
        return em.createNamedQuery("Dataverse.findAll").getResultList();
×
151
    }
152
    
153
    public List<Long> findIdStale() {
154
        return em.createNamedQuery("Dataverse.findIdStale").getResultList();
×
155
    }
156
    public List<Long> findIdStalePermission() {
157
        return em.createNamedQuery("Dataverse.findIdStalePermission").getResultList();
×
158
    }
159

160
    /**
161
     * @param numPartitions The number of partitions you intend to split the
162
     * indexing job into. Perhaps you have three Glassfish servers and you'd
163
     * like each one to operate on a subset of dataverses.
164
     *
165
     * @param partitionId Maybe "partitionId" is the wrong term but it's what we
166
     * call in the (text) UI. If you've specified three partitions the three
167
     * partitionIds are 0, 1, and 2. We do `dataverseId % numPartitions =
168
     * partitionId` to figure out which partition the dataverseId falls into.
169
     * 
170
     * @param skipIndexed If true, will skip any dvObjects that have a indexTime set 
171
     *
172
     * @return All dataverses if you say numPartitions=1 and partitionId=0.
173
     * Otherwise, a subset of dataverses.
174
     */
175
    public List<Dataverse> findAllOrSubset(long numPartitions, long partitionId, boolean skipIndexed) {
176
        if (numPartitions < 1) {
×
177
            long saneNumPartitions = 1;
×
178
            numPartitions = saneNumPartitions;
×
179
        }
180
        String skipClause = skipIndexed ? "AND o.indexTime is null " : "";
×
181
        TypedQuery<Dataverse> typedQuery = em.createQuery("SELECT OBJECT(o) FROM Dataverse AS o WHERE MOD( o.id, :numPartitions) = :partitionId " +
×
182
                skipClause +
183
                "ORDER BY o.id", Dataverse.class);
184
        typedQuery.setParameter("numPartitions", numPartitions);
×
185
        typedQuery.setParameter("partitionId", partitionId);
×
186
        return typedQuery.getResultList();
×
187
    }
188
    
189
    public List<Long> findDataverseIdsForIndexing(boolean skipIndexed) {
190
        if (skipIndexed) {
×
191
            return em.createQuery("SELECT o.id FROM Dataverse o WHERE o.indexTime IS null ORDER BY o.id", Long.class).getResultList();
×
192
        }
193
        return em.createQuery("SELECT o.id FROM Dataverse o ORDER BY o.id", Long.class).getResultList();
×
194
        
195
    }
196

197
    public List<Dataverse> findByCreatorId(Long creatorId) {
198
        return em.createNamedQuery("Dataverse.findByCreatorId").setParameter("creatorId", creatorId).getResultList();
×
199
    }
200

201
    public List<Dataverse> findByReleaseUserId(Long releaseUserId) {
202
        return em.createNamedQuery("Dataverse.findByReleaseUserId").setParameter("releaseUserId", releaseUserId).getResultList();
×
203
    }
204

205
    public List<Dataverse> findByOwnerId(Long ownerId) {
206
        return em.createNamedQuery("Dataverse.findByOwnerId").setParameter("ownerId", ownerId).getResultList();
×
207
    }
208
    
209
    public List<Long> findIdsByOwnerId(Long ownerId) {
210
        String qr = "select o.id from Dataverse as o where o.owner.id =:ownerId order by o.id";
×
211
        return em.createQuery(qr, Long.class).setParameter("ownerId", ownerId).getResultList();
×
212
    }
213
    
214
    public List<Dataverse> findPublishedByOwnerId(Long ownerId) {
215
        String qr ="select object(o) from Dataverse as o where o.owner.id =:ownerId and o.publicationDate is not null order by o.name";
×
216
        return em.createQuery(qr, Dataverse.class).setParameter("ownerId", ownerId).getResultList();
×
217
    }
218

219
    /**
220
     * @return the root dataverse
221
     * @todo Do we really want this method to sometimes throw a
222
     * NoResultException which is a RuntimeException?
223
     */
224
    public Dataverse findRootDataverse() {
225
        return em.createNamedQuery("Dataverse.findRoot", Dataverse.class).getSingleResult();
×
226
    }
227
    
228
    
229
    //Similarly - if the above throws that exception, do we need to catch it here?
230
    //ToDo - consider caching?
231
    public String getRootDataverseName() {
232
        Dataverse root = findRootDataverse();
×
233
        String rootDataverseName=root.getName();
×
234
        return StringUtil.isEmpty(rootDataverseName) ? "" : rootDataverseName; 
×
235
    }
236
    
237
    public List<Dataverse> findAllPublishedByOwnerId(Long ownerId) {
238
        List<Dataverse> retVal = new ArrayList<>();       
×
239
        List<Dataverse> previousLevel = findPublishedByOwnerId(ownerId);
×
240
        
241
        retVal.addAll(previousLevel);
×
242
        /*
243
        if (!previousLevel.isEmpty()) {
244
            for (Dataverse dv : previousLevel) {
245
                retVal.addAll(findPublishedByOwnerId(dv.getId()));
246
            }
247
        }*/
248
        return retVal;
×
249
    }
250

251
    /**
252
     * A lookup of a dataverse alias should be case insensitive. If "cfa"
253
     * belongs to the Center for Astrophysics, we don't want to allow Code for
254
     * America to start using "CFA". Force all queries to be lower case.
255
     * @param anAlias
256
     * @return 
257
     */
258
    public Dataverse findByAlias(String anAlias) {
259
        try {
260
            return (anAlias.toLowerCase().equals(":root"))
×
261
              ? findRootDataverse()
×
262
              : em.createNamedQuery("Dataverse.findByAlias", Dataverse.class)
×
263
                  .setParameter("alias", anAlias.toLowerCase())
×
264
                  .getSingleResult();
×
265
        } catch ( NoResultException|NonUniqueResultException ex ) {
×
266
            logger.warning("Unable to find a single dataverse using alias \"" + anAlias + "\": " + ex);
×
267
            return null;
×
268
        }
269
    }
270
    
271
        public boolean hasData( Dataverse dv ) {
272
                TypedQuery<Long> amountQry = em.createNamedQuery("Dataverse.ownedObjectsById", Long.class)
×
273
                                                                .setParameter("id", dv.getId());
×
274
                
275
                return (amountQry.getSingleResult()>0);
×
276
        }
277
        
278
    public boolean isRootDataverseExists() {
279
        long count = em.createQuery("SELECT count(dv) FROM Dataverse dv WHERE dv.owner.id=null", Long.class).getSingleResult();
×
280
        return (count == 1);
×
281
    }
282

283
    public String determineDataversePath(Dataverse dataverse) {
284
        List<String> dataversePathSegments = new ArrayList<>();
×
285
        indexService.findPathSegments(dataverse, dataversePathSegments);
×
286
        StringBuilder dataversePath = new StringBuilder();
×
287
        for (String segment : dataversePathSegments) {
×
288
            dataversePath.append("/").append(segment);
×
289
        }
×
290
        return dataversePath.toString();
×
291
    }
292

293
    public MetadataBlock findMDB(Long id) {
294
        return em.find(MetadataBlock.class, id);
×
295
    }
296

297
    public MetadataBlock findMDBByName(String name) {
298
        return em.createQuery("select m from MetadataBlock m WHERE m.name=:name", MetadataBlock.class)
×
299
                .setParameter("name", name)
×
300
                .getSingleResult();
×
301
    }
302

303
    public List<MetadataBlock> findAllMetadataBlocks() {
304
        return em.createQuery("select object(o) from MetadataBlock as o order by o.id", MetadataBlock.class).getResultList();
×
305
    }
306
    
307
    public List<MetadataBlock> findSystemMetadataBlocks(){
308
        String qr = "select object(o) from MetadataBlock as o where o.owner.id=null  order by o.id";
×
309
        return em.createQuery(qr, MetadataBlock.class).getResultList();
×
310
    }
311
    
312
    public List<MetadataBlock> findMetadataBlocksByDataverseId(Long dataverse_id) {
313
        String qr = "select object(o) from MetadataBlock as o where o.owner.id=:dataverse_id order by o.id";
×
314
        return em.createQuery(qr, MetadataBlock.class)
×
315
                .setParameter("dataverse_id", dataverse_id).getResultList();
×
316
    }
317
    
318
    public DataverseFacet findFacet(Long id) {
319
        return em.find(DataverseFacet.class, id);
×
320
    }
321
    
322
    public List<DataverseFacet> findAllDataverseFacets() {
323
        return em.createQuery("select object(o) from DataverseFacet as o order by o.display", DataverseFacet.class).getResultList();
×
324
    }
325
    
326
    public String getDataverseLogoThumbnailAsBase64(Dataverse dataverse, User user) {
327
        
328
        if (dataverse == null) {
×
329
            return null;
×
330
        }
331

332
        File dataverseLogoFile = getLogo(dataverse);
×
333
        if (dataverseLogoFile != null) {
×
334
            String logoThumbNailPath;
335

336
            if (dataverseLogoFile.exists()) {
×
337
                logoThumbNailPath = ImageThumbConverter.generateImageThumbnailFromFile(dataverseLogoFile.getAbsolutePath(), 48);
×
338
                if (logoThumbNailPath != null) {
×
339
                    return ImageThumbConverter.getImageAsBase64FromFile(new File(logoThumbNailPath));
×
340

341
                }
342
            }
343
        } 
344
        return null;
×
345
    }
346
    
347
    public String getDataverseLogoThumbnailAsBase64ById(Long dvId) {
348
     
349
        File dataverseLogoFile = getLogoById(dvId);
×
350
        
351
        if (dataverseLogoFile != null) {
×
352
            String logoThumbNailPath;
353

354
            if (dataverseLogoFile.exists()) {
×
355
                logoThumbNailPath = ImageThumbConverter.generateImageThumbnailFromFile(dataverseLogoFile.getAbsolutePath(), 48);
×
356
                if (logoThumbNailPath != null) {
×
357
                    return ImageThumbConverter.getImageAsBase64FromFile(new File(logoThumbNailPath));
×
358

359
                }
360
            }
361
        } 
362
        return null;
×
363
    }
364
        
365
    private File getLogo(Dataverse dataverse) {
366
        if (dataverse.getId() == null) {
×
367
            return null; 
×
368
        }
369
        
370
        DataverseTheme theme = dataverse.getDataverseTheme(); 
×
371
        if (theme != null && theme.getLogo() != null && !theme.getLogo().isEmpty()) {
×
372
            return ThemeWidgetFragment.getLogoDir(dataverse.getLogoOwnerId()).resolve(theme.getLogo()).toFile();
×
373
        }
374
            
375
        return null;         
×
376
    }
377
    
378
    private File getLogoById(Long id) {
379
        if (id == null) {
×
380
            return null; 
×
381
        }
382
        
383
        String logoFileName;
384
        
385
        try {
386
                logoFileName = (String) em.createNativeQuery("SELECT logo FROM dataversetheme WHERE dataverse_id = " + id).getSingleResult();
×
387
            
388
        } catch (Exception ex) {
×
389
            return null;
×
390
        }
×
391
        
392
        if (logoFileName != null && !logoFileName.isEmpty()) {
×
393
            Properties p = System.getProperties();
×
394
            String domainRoot = p.getProperty("com.sun.aas.instanceRoot");
×
395
  
396
            if (domainRoot != null && !"".equals(domainRoot)) {
×
397
                return new File (domainRoot + File.separator + 
×
398
                    "docroot" + File.separator + 
399
                    "logos" + File.separator + 
400
                    id + File.separator + 
401
                    logoFileName);
402
            }
403
        }
404
            
405
        return null;         
×
406
    }
407
    
408
    public DataverseTheme findDataverseThemeByIdQuick(Long id) {
409
        if (id == null) {
×
410
            return null; 
×
411
        }
412
        
413
        Object[] result;
414
        
415
        try {
416
            result = (Object[]) em.createNativeQuery("SELECT logo, logoFormat, logothumbnail FROM dataversetheme WHERE dataverse_id = " + id).getSingleResult();
×
417
            
418
        } catch (Exception ex) {
×
419
            return null;
×
420
        }
×
421
        
422
        if (result == null) {
×
423
            return null;
×
424
        }
425
        
426
        DataverseTheme theme = new DataverseTheme();
×
427
        
428
        if (result[0] != null) {
×
429
            theme.setLogo((String) result[0]);
×
430
        }
431

432
        if (result[1] != null) {
×
433
            String format = (String) result[1];
×
434
            switch (format) {
×
435
                case "RECTANGLE":
436
                theme.setLogoFormat(DataverseTheme.ImageFormat.RECTANGLE);
×
437
                    break;
×
438
                case "SQUARE":
439
                theme.setLogoFormat(DataverseTheme.ImageFormat.SQUARE);
×
440
                    break;
441
            }
442
        }
443

444
        if (result[2] != null) {
×
UNCOV
445
            theme.setLogoThumbnail((String) result[2]);
×
446
        }
447
        
448
        return theme;
×
449
    }
450

451
    public List<Dataverse> findDataversesThisIdHasLinkedTo(long dataverseId) {
452
        return dataverseLinkingService.findLinkedDataverses(dataverseId);
×
453
    }
454

455
    public List<Dataverse> findDataversesThatLinkToThisDvId(long dataverseId) {
456
        return dataverseLinkingService.findLinkingDataverses(dataverseId);
×
457
    }
458

459
    public List<Dataset> findDatasetsThisIdHasLinkedTo(long dataverseId) {
460
        return datasetLinkingService.findLinkedDatasets(dataverseId);
×
461
    }
462

463
    public List<Dataverse> findDataversesThatLinkToThisDatasetId(long datasetId) {
UNCOV
464
        return datasetLinkingService.findLinkingDataverses(datasetId);
×
465
    }
466
    
467
    public List<Dataverse> filterByAliasQuery(String filterQuery) {
468
        //Query query = em.createNativeQuery("select o from Dataverse o where o.alias LIKE '" + filterQuery + "%' order by o.alias");
469
        //Query query = em.createNamedQuery("Dataverse.filterByAlias", Dataverse.class).setParameter("alias", filterQuery.toLowerCase() + "%");
UNCOV
470
        List<Dataverse> ret = em.createNamedQuery("Dataverse.filterByAliasNameAffiliation", Dataverse.class)
×
471
                .setParameter("alias", filterQuery.toLowerCase() + "%")
×
472
                .setParameter("name", "%" + filterQuery.toLowerCase() + "%")
×
473
                .setParameter("affiliation", "%" + filterQuery.toLowerCase() + "%").getResultList();
×
474
        //logger.info("created native query: select o from Dataverse o where o.alias LIKE '" + filterQuery + "%' order by o.alias");
475
        logger.info("created named query");
×
UNCOV
476
        if (ret != null) {
×
UNCOV
477
            logger.info("results list: "+ret.size()+" results.");
×
478
        }
UNCOV
479
        return ret;
×
480
    }
481
    
482
    public List<Dataverse> filterDataversesForLinking(String query, DataverseRequest req, Dataset dataset) {
483

484
        List<Dataverse> dataverseList = new ArrayList<>();
×
485

UNCOV
486
        List<Dataverse> results = filterDataversesByNamePattern(query);
×
487
        
488
        if (results == null || results.size() == 0) {
×
489
            return null; 
×
490
        }
491

492
        List<Object> alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id   FROM datasetlinkingdataverse WHERE dataset_id = " + dataset.getId()).getResultList();
×
493
        List<Dataverse> remove = new ArrayList<>();
×
494

UNCOV
495
        if (alreadyLinkeddv_ids != null && !alreadyLinkeddv_ids.isEmpty()) {
×
UNCOV
496
            alreadyLinkeddv_ids.stream().map((testDVId) -> this.find(testDVId)).forEachOrdered((removeIt) -> {
×
497
                remove.add(removeIt);
×
498
            });
×
499
        }
500
        
UNCOV
501
        for (Dataverse res : results) {
×
UNCOV
502
            if (!remove.contains(res)) {
×
503
                if (this.permissionService.requestOn(req, res).has(Permission.PublishDataset)) {
×
UNCOV
504
                    dataverseList.add(res);
×
505
                }
506
            }
UNCOV
507
        }
×
508

509
        return dataverseList;
×
510
    }
511
    public List<Dataverse> filterDataversesForUnLinking(String query, DataverseRequest req, Dataset dataset) {
512
        List<Object> alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM datasetlinkingdataverse WHERE dataset_id = " + dataset.getId()).getResultList();
×
513
        List<Dataverse> dataverseList = new ArrayList<>();
×
UNCOV
514
        if (alreadyLinkeddv_ids != null && !alreadyLinkeddv_ids.isEmpty()) {
×
515
            alreadyLinkeddv_ids.stream().map((testDVId) -> this.find(testDVId)).forEachOrdered((dataverse) -> {
×
UNCOV
516
                if (this.permissionService.requestOn(req, dataverse).has(Permission.PublishDataset)) {
×
517
                    dataverseList.add(dataverse);
×
518
                }
UNCOV
519
            });
×
520
        }
UNCOV
521
        return dataverseList;
×
522
    }
523

524
    public List<Dataverse> filterDataversesForHosting(String pattern, DataverseRequest req) {
525

526
        // Find the dataverses matching the search parameters: 
527
        
UNCOV
528
        List<Dataverse> searchResults = filterDataversesByNamePattern(pattern);
×
529
        
530
        if (searchResults == null || searchResults.size() == 0) {
×
UNCOV
531
            return null; 
×
532
        }
533
        
UNCOV
534
        logger.fine("search query found " + searchResults.size() + " results");
×
535
        
536
        // Filter the results and drop the dataverses where the user is not allowed to 
537
        // add datasets:
538
        
UNCOV
539
        if (req.getAuthenticatedUser().isSuperuser()) {
×
540
            logger.fine("will skip permission check...");
×
UNCOV
541
            return searchResults;
×
542
        }
543
        
544
        List<Dataverse> finalResults = new ArrayList<>();
×
545
        
546
        for (Dataverse res : searchResults) {
×
UNCOV
547
            if (this.permissionService.requestOn(req, res).has(Permission.AddDataset)) {
×
548
                finalResults.add(res);
×
549
            }
550
        }
×
551
        
UNCOV
552
        logger.fine("returning " + finalResults.size() + " final results");
×
553

UNCOV
554
        return finalResults;
×
555
    }
556
    
557
    
558
    /* 
559
        This method takes a search parameter and expands it into a list of 
560
        Dataverses with matching names. 
561
        The search is performed on the name with the trailing word "dataverse"
562
        stripped (if present). This way the search on "data" (or on "da" pr 
563
        "dat") does NOT return almost every dataverse in the database - since
564
        most of them have names that end in "... Dataverse". 
565
        The query isn't pretty, but it works, and it's still EJB QL (and NOT a 
566
        native query). 
567
    */
568
    public List<Dataverse> filterDataversesByNamePattern(String pattern) {
569

UNCOV
570
        pattern = pattern.toLowerCase();
×
571
        
572
        String pattern1 = pattern + "%";
×
573
        String pattern2 = "% " + pattern + "%";
×
574

575
        // Adjust the queries for very short, 1 and 2-character patterns:
UNCOV
576
        if (pattern.length() == 1) {
×
UNCOV
577
            pattern1 = pattern;
×
UNCOV
578
            pattern2 = pattern + " %";
×
579
        } 
580
        /*if (pattern.length() == 2) {
581
            pattern2 = pattern + "%";
582
        }*/
583
        
584
        
UNCOV
585
        String qstr = "select dv from Dataverse dv "
×
586
                + "where (LOWER(dv.name) LIKE :dataverse and ((SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE :pattern1) "
587
                + "     or (SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE :pattern2))) "
588
                + "or (LOWER(dv.name) NOT LIKE :dataverse and ((LOWER(dv.name) LIKE :pattern1) "
589
                + "     or (LOWER(dv.name) LIKE :pattern2))) "
590
                + "order by dv.alias";
591
                
592
        List<Dataverse> searchResults = null;
×
593
        
594
        try {
595
            searchResults = em.createQuery(qstr, Dataverse.class)
×
596
                    .setParameter("dataverse", "%dataverse")
×
597
                    .setParameter("pattern1", pattern1)
×
598
                    .setParameter("pattern2", pattern2)
×
UNCOV
599
                    .getResultList();
×
600
        } catch (Exception ex) {
×
UNCOV
601
            searchResults = null;
×
UNCOV
602
        }
×
603
        
UNCOV
604
        return searchResults;
×
605
    }
606
    
607
    /**
608
     * Used to identify and properly display Harvested objects on the dataverse page.
609
     * 
610
     *//*
611
    @Deprecated
612
    public Map<Long, String> getAllHarvestedDataverseDescriptions(){
613
        
614
        String qstr = "SELECT dataverse_id, archiveDescription FROM harvestingClient;";
615
        List<Object[]> searchResults = null;
616
        
617
        try {
618
            searchResults = em.createNativeQuery(qstr).getResultList();
619
        } catch (Exception ex) {
620
            searchResults = null;
621
        }
622
        
623
        if (searchResults == null) {
624
            return null;
625
        }
626
        
627
        Map<Long, String> ret = new HashMap<>();
628
        
629
        for (Object[] result : searchResults) {
630
            Long dvId = null;
631
            if (result[0] != null) {
632
                try {
633
                    dvId = (Long)result[0];
634
                } catch (Exception ex) {
635
                    dvId = null;
636
                }
637
                if (dvId == null) {
638
                    continue;
639
                }
640
                
641
                ret.put(dvId, (String)result[1]);
642
            }
643
        }
644
        
645
        return ret;        
646
    }*/
647
    
648
    public String getParentAliasString(SolrSearchResult solrSearchResult){
649
        Long dvId = solrSearchResult.getEntityId();
×
UNCOV
650
        String retVal = "";
×
651
        
UNCOV
652
        if (dvId == null) {
×
UNCOV
653
            return retVal;
×
654
        }
655
        
656
        String searchResult;
657
        try {
658
            searchResult = (String) em.createNativeQuery("select  t0.ALIAS FROM DATAVERSE t0, DVOBJECT t1,  DVOBJECT t2 WHERE (t0.ID = t1.ID) AND (t2.OWNER_ID = t1.ID)  AND (t2.ID =" + dvId + ")").getSingleResult();
×
659

660
        } catch (Exception ex) {
×
661
            return retVal;
×
UNCOV
662
        }
×
663

664
        if (searchResult == null) {
×
665
            return retVal;
×
666
        }
667

668
        if (searchResult != null) {
×
UNCOV
669
            return searchResult;
×
670
        }
671
        
UNCOV
672
        return retVal;
×
673
    }
674
    
675
    
676
    public void populateDvSearchCard(SolrSearchResult solrSearchResult) {
677
  
UNCOV
678
        Long dvId = solrSearchResult.getEntityId();
×
679
        
680
        if (dvId == null) {
×
681
            return;
×
682
        }
683
        
684
        Long parentDvId = null;
×
685
        String parentId = solrSearchResult.getParent().get("id");
×
686
        if (parentId != null) {
×
687
            try {
UNCOV
688
                parentDvId = Long.parseLong(parentId);
×
UNCOV
689
            } catch (NumberFormatException ex) {
×
UNCOV
690
                parentDvId = null;
×
UNCOV
691
            }
×
692
        }
693
        
694
        Object[] searchResult;
695
        
696
        try {
UNCOV
697
            if (parentDvId == null) {
×
698
                searchResult = (Object[]) em.createNativeQuery("SELECT t0.AFFILIATION, t0.ALIAS FROM DATAVERSE t0 WHERE t0.ID = " + dvId).getSingleResult();
×
699
            } else {
700
                searchResult = (Object[]) em.createNativeQuery("SELECT t0.AFFILIATION, t0.ALIAS, t2.ALIAS FROM DATAVERSE t0, DVOBJECT t1, DATAVERSE t2, DVOBJECT t3 WHERE (t0.ID = t1.ID) AND (t1.OWNER_ID = t3.ID) AND (t2.ID = t3.ID) AND (t0.ID = " + dvId + ")").getSingleResult();
×
701
            }
702
        } catch (Exception ex) {
×
703
            return;
×
UNCOV
704
        }
×
705

706
        if (searchResult == null) {
×
707
            return;
×
708
        }
709
        
710
        if (searchResult[0] != null) {
×
711
            solrSearchResult.setDataverseAffiliation((String) searchResult[0]);
×
712
        }
713

714
        if (searchResult[1] != null) {
×
715
            solrSearchResult.setDataverseAlias((String) searchResult[1]);
×
716
        }
717
        
UNCOV
718
        if (parentDvId != null) {
×
719
            if (searchResult[2] != null) {
×
UNCOV
720
                solrSearchResult.setDataverseParentAlias((String) searchResult[2]);
×
721
            }
722
        }
UNCOV
723
    }
×
724
    
725
    // function to recursively find ids of all children of a dataverse that 
726
    // are also of type dataverse
727
    public List<Long> findAllDataverseDataverseChildren(Long dvId) {
728
        // get list of Dataverse children
UNCOV
729
        List<Long> dataverseChildren = findIdsByOwnerId(dvId);
×
730
        
731
        if (dataverseChildren == null) {
×
732
            return dataverseChildren;
×
733
        } else {
734
            List<Long> newChildren = new ArrayList<>();
×
735
            for (Long childDvId : dataverseChildren) {
×
UNCOV
736
                newChildren.addAll(findAllDataverseDataverseChildren(childDvId));
×
UNCOV
737
            }
×
UNCOV
738
            dataverseChildren.addAll(newChildren);
×
UNCOV
739
            return dataverseChildren;
×
740
        }
741
    }
742
    
743
    // function to recursively find ids of all children of a dataverse that are 
744
    // of type dataset
745
    public List<Long> findAllDataverseDatasetChildren(Long dvId) {
746
        // get list of Dataverse children
747
        List<Long> dataverseChildren = findIdsByOwnerId(dvId);
×
748
        // get list of Dataset children
UNCOV
749
        List<Long> datasetChildren = datasetService.findIdsByOwnerId(dvId);
×
750
        
751
        if (dataverseChildren == null) {
×
752
            return datasetChildren;
×
753
        } else {
UNCOV
754
            for (Long childDvId : dataverseChildren) {
×
UNCOV
755
                datasetChildren.addAll(findAllDataverseDatasetChildren(childDvId));
×
UNCOV
756
            }
×
UNCOV
757
            return datasetChildren;
×
758
        }
759
    }
760
    
761
    public String addRoleAssignmentsToChildren(Dataverse owner, ArrayList<String> rolesToInherit,
762
            boolean inheritAllRoles) {
763
        /*
764
         * This query recursively finds all Dataverses that are inside/children of the
765
         * specified one. It recursively finds dvobjects of dtype 'Dataverse' whose
766
         * owner_id equals an id already in the list and then returns the list of ids
767
         * found, excluding the id of the original specified Dataverse.
768
         */
UNCOV
769
        String qstr = "WITH RECURSIVE path_elements AS ((" + " SELECT id, dtype FROM dvobject WHERE id in ("
×
UNCOV
770
                + owner.getId() + "))" + " UNION\n"
×
771
                + " SELECT o.id, o.dtype FROM path_elements p, dvobject o WHERE o.owner_id = p.id and o.dtype='Dataverse') "
772
                + "SELECT id FROM path_elements WHERE id !=" + owner.getId() + ";";
×
773

774
        List<Integer> childIds;
775
        try {
UNCOV
776
            childIds = em.createNativeQuery(qstr).getResultList();
×
UNCOV
777
        } catch (Exception ex) {
×
UNCOV
778
            childIds = null;
×
779
        }
×
780

781
        // Set up to track the set of users/groups that get assigned a role and those
782
        // that don't
783
        JsonArrayBuilder usedNames = Json.createArrayBuilder();
×
UNCOV
784
        JsonArrayBuilder unusedNames = Json.createArrayBuilder();
×
785
        // Set up to track the list of dataverses, by id and alias, that are traversed.
786
        JsonArrayBuilder dataverseIds = Json.createArrayBuilder();
×
UNCOV
787
        JsonArrayBuilder dataverseAliases = Json.createArrayBuilder();
×
788
        // Get the Dataverses for the returned ids
789

790
        List<Dataverse> children = new ArrayList<Dataverse>();
×
791

UNCOV
792
        for (int i = 0; i < childIds.size(); i++) {
×
793
            Integer childId = childIds.get(i);
×
UNCOV
794
            Dataverse child = find(new Long(childId.longValue()));
×
795
            if (child != null) {
×
796
                // Add to the list of Dataverses
UNCOV
797
                children.add(child);
×
798
                // Add ids and aliases to the tracking arrays
UNCOV
799
                dataverseIds.add(childId.longValue());
×
800
                dataverseAliases.add(child.getAlias());
×
801
            }
802
        }
803
        // Find the role assignments on the specified Dataverse
804
        List<RoleAssignment> allRAsOnOwner = rolesService.directRoleAssignments(owner);
×
805

806
        // Create a list of just the inheritable role assignments on the original
807
        // dataverse
808
        List<RoleAssignment> inheritableRAsOnOwner = new ArrayList<RoleAssignment>();
×
809
        for (RoleAssignment role : allRAsOnOwner) {
×
UNCOV
810
            if (inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias())) {
×
811
                //Only supporting built-in/non-dataverse-specific custom roles. Custom roles all have an owner.
812
                if(role.getRole().getOwner()==null) {
×
UNCOV
813
                    inheritableRAsOnOwner.add(role);
×
814
                }
815
            }
816
        }
×
817

818
        String privateUrlToken = null;
×
819
        // Create lists of the existing inheritable roles for each child Dataverse
820
        Map<Long, List<RoleAssignment>> existingRAs = new HashMap<Long, List<RoleAssignment>>();
×
821
        for (Dataverse childDv : children) {
×
822
            List<RoleAssignment> allRAsOnChild = rolesService.directRoleAssignments(childDv);
×
UNCOV
823
            List<RoleAssignment> inheritableRoles = new ArrayList<RoleAssignment>();
×
824
            for (RoleAssignment role : allRAsOnChild) {
×
825
                if (inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias())) {
×
826
                    inheritableRoles.add(role);
×
827
                }
828
            }
×
829
            existingRAs.put(childDv.getId(), inheritableRoles);
×
830
        }
×
831

UNCOV
832
        for (RoleAssignment roleAssignment : inheritableRAsOnOwner) {
×
UNCOV
833
            DataverseRole inheritableRole = roleAssignment.getRole();
×
834
            String identifier = roleAssignment.getAssigneeIdentifier();
×
UNCOV
835
            if (identifier.startsWith(AuthenticatedUser.IDENTIFIER_PREFIX)) {
×
836
                // The RoleAssignment is for an individual user
837
                // Add their name to the tracking list
UNCOV
838
                usedNames.add(identifier);
×
839
                // Strip the Identifier prefix so we can retrieve the user
840
                identifier = identifier.substring(AuthenticatedUser.IDENTIFIER_PREFIX.length());
×
UNCOV
841
                AuthenticatedUser roleUser = authService.getAuthenticatedUser(identifier);
×
842
                // Now loop over all children and add the roleUser in this role if they don't
843
                // yet have this role
844
                for (Dataverse childDv : children) {
×
845
                    try {
846
                        RoleAssignment ra = new RoleAssignment(inheritableRole, roleUser, childDv, privateUrlToken);
×
847
                        if (!existingRAs.get(childDv.getId()).contains(ra)) {
×
848
                            rolesService.save(ra);
×
849
                        }
850
                    } catch (Exception e) {
×
851
                        logger.warning("Unable to assign " + roleAssignment.getAssigneeIdentifier()
×
852
                                + "as an admin for new Dataverse: " + childDv.getName());
×
853
                        logger.warning(e.getMessage());
×
UNCOV
854
                        throw (e);
×
855
                    }
×
856
                }
×
857
            } else if (identifier.startsWith(Group.IDENTIFIER_PREFIX)) {
×
858
                // The role assignment is for a group
859
                usedNames.add(identifier);
×
UNCOV
860
                identifier = identifier.substring(Group.IDENTIFIER_PREFIX.length());
×
861
                Group roleGroup = groupService.getGroup(identifier);
×
UNCOV
862
                if (roleGroup != null) {
×
863
                    for (Dataverse childDv : children) {
×
864
                        try {
UNCOV
865
                            RoleAssignment ra = new RoleAssignment(inheritableRole, roleGroup, childDv,
×
866
                                    privateUrlToken);
867
                            if (!existingRAs.get(childDv.getId()).contains(ra)) {
×
868
                                rolesService.save(ra);
×
869
                            }
870
                        } catch (Exception e) {
×
871
                            logger.warning("Unable to assign " + roleAssignment.getAssigneeIdentifier()
×
872
                                    + "as an admin for new Dataverse: " + childDv.getName());
×
UNCOV
873
                            logger.warning(e.getMessage());
×
UNCOV
874
                            throw (e);
×
875
                        }
×
UNCOV
876
                    }
×
877
                } else {
878
                    // Add any groups of types not yet supported
879
                    unusedNames.add(identifier);
×
880
                }
881
            } else {
×
882
                // Add any other types of entity found (not user or group) that aren't supported
UNCOV
883
                unusedNames.add(identifier);
×
884
            }
UNCOV
885
        }
×
886
        /*
887
         * Report the list of Dataverses affected and the set of users/groups that
888
         * should now have admin roles on them (they may already have had them) and any
889
         * entities that had an admin role on the specified dataverse which were not
890
         * handled. Add this to the log and the API return message.
891
         */
892
        String result = Json.createObjectBuilder().add("Dataverses Updated", dataverseIds)
×
UNCOV
893
                .add("Updated Dataverse Aliases", dataverseAliases).add("Assignments added for", usedNames)
×
UNCOV
894
                .add("Assignments not added for", unusedNames).build().toString();
×
UNCOV
895
        logger.info(result);
×
UNCOV
896
        return (result);
×
897
    }
898
    
899
    // A quick custom query that finds all the (direct children) dataset titles 
900
    // with a dataverse and returns a list of (dataset_id, title) pairs. 
901
    public List<Object[]> getDatasetTitlesWithinDataverse(Long dataverseId) {
UNCOV
902
        String cqString = BASE_QUERY_DATASET_TITLES_WITHIN_DV
×
903
                + "and o.owner_id = " + dataverseId;
904

905
        return em.createNativeQuery(cqString).getResultList();
×
906
    }
907

908
    public  String getCollectionDatasetSchema(String dataverseAlias) {
909
        return getCollectionDatasetSchema(dataverseAlias, null);
×
910
    }
911
    public  String getCollectionDatasetSchema(String dataverseAlias, Map<String, Map<String,List<String>>> schemaChildMap) {
912
        
913
        Dataverse testDV = this.findByAlias(dataverseAlias);
×
914
        
915
        while (!testDV.isMetadataBlockRoot()) {
×
UNCOV
916
            if (testDV.getOwner() == null) {
×
UNCOV
917
                break; // we are at the root; which by definition is metadata block root, regardless of the value
×
918
            }
UNCOV
919
            testDV = testDV.getOwner();
×
920
        }
921
        
922
        /* Couldn't get the 'return base if no extra required fields to work with the path provided
923
        leaving it as 'out of scope' for now SEK 11/27/2023
924

925
        List<DataverseFieldTypeInputLevel> required = new ArrayList<>();
926

927
        required = dataverseFieldTypeInputLevelService.findRequiredByDataverseId(testDV.getId());
928
        
929
        if (required == null || required.isEmpty()){
930
            String pathToJsonFile = "src/main/resources/edu/harvas/iq/dataverse/baseDatasetSchema.json";
931
            String baseSchema = getBaseSchemaStringFromFile(pathToJsonFile);
932
            if (baseSchema != null && !baseSchema.isEmpty()){
933
                return baseSchema;
934
            }
935
        }
936
        
937
        */
UNCOV
938
        List<MetadataBlock> selectedBlocks = new ArrayList<>();
×
939
        List<DatasetFieldType> requiredDSFT = new ArrayList<>();
×
940
        
941
        selectedBlocks.addAll(testDV.getMetadataBlocks());
×
942

943
        for (MetadataBlock mdb : selectedBlocks) {
×
944
            for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
×
945
                if (!dsft.isChild()) {
×
UNCOV
946
                    DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(testDV.getId(), dsft.getId());
×
947
                    if (dsfIl != null) {
×
948
                        dsft.setRequiredDV(dsfIl.isRequired());
×
UNCOV
949
                        dsft.setInclude(dsfIl.isInclude());
×
950
                    } else {
951
                        dsft.setRequiredDV(dsft.isRequired());
×
952
                        dsft.setInclude(true);
×
953
                    }
954
                    List<String> childrenRequired = new ArrayList<>();
×
955
                    List<String> childrenAllowed = new ArrayList<>();
×
956
                    if (dsft.isHasChildren()) {
×
957
                        for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) {
×
UNCOV
958
                            DataverseFieldTypeInputLevel dsfIlChild = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(testDV.getId(), child.getId());
×
UNCOV
959
                            if (dsfIlChild != null) {
×
UNCOV
960
                                child.setRequiredDV(dsfIlChild.isRequired());
×
961
                                child.setInclude(dsfIlChild.isInclude());
×
962
                            } else {
963
                                // in the case of conditionally required (child = true, parent = false)
964
                                // we set this to false; i.e this is the default "don't override" value
965
                                child.setRequiredDV(child.isRequired() && dsft.isRequired());
×
UNCOV
966
                                child.setInclude(true);
×
967
                            }
968
                            if (child.isRequired()) {
×
UNCOV
969
                                childrenRequired.add(child.getName());
×
970
                            }
971
                            childrenAllowed.add(child.getName());
×
972
                        }
×
973
                    }
974
                    if (schemaChildMap != null) {
×
UNCOV
975
                        Map<String, List<String>> map = new HashMap<>();
×
976
                        map.put("required", childrenRequired);
×
977
                        map.put("allowed", childrenAllowed);
×
UNCOV
978
                        schemaChildMap.put(dsft.getName(), map);
×
979
                    }
980
                    if(dsft.isRequiredDV()){
×
UNCOV
981
                        requiredDSFT.add(dsft);
×
982
                    }
983
                }
984
            }            
×
985

986
        }
×
987
        
988
        String reqMDBNames = "";
×
989
        List<MetadataBlock> hasReqFields = new ArrayList<>();
×
990
        String retval = datasetSchemaPreface;
×
991
        for (MetadataBlock mdb : selectedBlocks) {
×
992
            for (DatasetFieldType dsft : requiredDSFT) {
×
993
                if (dsft.getMetadataBlock().equals(mdb)) {
×
UNCOV
994
                    hasReqFields.add(mdb);
×
995
                    if (!reqMDBNames.isEmpty()) reqMDBNames += ",";
×
996
                    reqMDBNames += "\"" + mdb.getName() + "\"";
×
997
                    break;
×
998
                }
999
            }
×
1000
        }
×
UNCOV
1001
        int countMDB = 0;
×
1002
        for (MetadataBlock mdb : hasReqFields) {
×
1003
            if (countMDB>0){
×
1004
                retval += ",";
×
1005
            }
1006
            retval += getCustomMDBSchema(mdb, requiredDSFT);
×
UNCOV
1007
            countMDB++;            
×
1008
        }
×
1009
        
1010
        retval += "\n                     }";
×
1011
        
UNCOV
1012
        retval += endOfjson.replace("blockNames", reqMDBNames);
×
1013

UNCOV
1014
        return retval;
×
1015
    
1016
    }    
1017
    
1018
    private String getCustomMDBSchema (MetadataBlock mdb, List<DatasetFieldType> requiredDSFT){
UNCOV
1019
        String retval = "";
×
1020
        boolean mdbHasReqField = false;
×
UNCOV
1021
        int numReq = 0;
×
1022
        List<DatasetFieldType> requiredThisMDB = new ArrayList<>();
×
1023
        
1024
        for (DatasetFieldType dsft : requiredDSFT ){
×
1025

UNCOV
1026
            if(dsft.getMetadataBlock().equals(mdb)){
×
1027
                numReq++;
×
1028
                mdbHasReqField = true;
×
1029
                requiredThisMDB.add(dsft);
×
1030
            }
1031
        }
×
1032
        if (mdbHasReqField){
×
1033
        retval  += startOfMDB.replace("blockName", mdb.getName());
×
1034
        
1035
        retval += minItemsTemplate.replace("numMinItems", Integer.toString(requiredThisMDB.size()));
×
1036
        int count = 0;
×
1037
        for (DatasetFieldType dsft:requiredThisMDB ){
×
UNCOV
1038
            count++;
×
1039
            String reqValImp = reqValTemplate.replace("reqFieldTypeName", dsft.getName());
×
1040
            if (count < requiredThisMDB.size()){
×
1041
                retval += reqValImp + "\n";
×
1042
            } else {
1043
               reqValImp = StringUtils.substring(reqValImp, 0, reqValImp.length() - 1);
×
UNCOV
1044
               retval += reqValImp+ "\n";
×
UNCOV
1045
               retval += endOfReqVal;
×
1046
            }            
1047
        }
×
1048
        
1049
        }
1050
        
1051
        return retval;
×
1052
    }
1053
    
1054
    public String isDatasetJsonValid(String dataverseAlias, String jsonInput) {
1055
        Map<String, Map<String,List<String>>> schemaChildMap = new HashMap<>();
×
1056
        JSONObject rawSchema = new JSONObject(new JSONTokener(getCollectionDatasetSchema(dataverseAlias, schemaChildMap)));
×
1057
        
1058
        try {
1059
            Schema schema = SchemaLoader.load(rawSchema);
×
1060
            schema.validate(new JSONObject(jsonInput)); // throws a ValidationException if this object is invalid
×
1061
            JSONDataValidation.validate(schema, schemaChildMap, jsonInput); // throws a ValidationException if any objects are invalid
×
1062
        } catch (ValidationException vx) {
×
1063
            logger.info(BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " " + vx.getErrorMessage()); 
×
1064
            String accumulatedexceptions = "";
×
1065
            for (ValidationException va : vx.getCausingExceptions()){
×
1066
                accumulatedexceptions = accumulatedexceptions + va;
×
UNCOV
1067
                accumulatedexceptions = accumulatedexceptions.replace("org.everit.json.schema.ValidationException:", " ");
×
1068
            }
×
UNCOV
1069
            if (!accumulatedexceptions.isEmpty()){
×
UNCOV
1070
                return BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " "  + accumulatedexceptions;
×
1071
            } else {
1072
                return BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " "  + vx.getErrorMessage();
×
1073
            }
1074
            
UNCOV
1075
        } catch (Exception ex) {            
×
1076
            logger.info(BundleUtil.getStringFromBundle("dataverses.api.validate.json.exception") + ex.getLocalizedMessage());
×
UNCOV
1077
            return BundleUtil.getStringFromBundle("dataverses.api.validate.json.exception") + ex.getLocalizedMessage();
×
UNCOV
1078
        } 
×
1079

1080
        return BundleUtil.getStringFromBundle("dataverses.api.validate.json.succeeded");
×
1081
    }
1082
    
1083
    static String getBaseSchemaStringFromFile(String pathToJsonFile) {
1084
        File datasetSchemaJson = new File(pathToJsonFile);
×
1085
        try {
1086
            String datasetSchemaAsJson = new String(Files.readAllBytes(Paths.get(datasetSchemaJson.getAbsolutePath())));
×
1087
            return datasetSchemaAsJson;
×
1088
        } catch (IOException ex) {
×
1089
            logger.info("IO - failed to get schema file  - will build on fly " +ex.getMessage());
×
UNCOV
1090
            return null;
×
UNCOV
1091
        } catch (Exception e){
×
UNCOV
1092
            logger.info("Other exception - failed to get schema file  - will build on fly. " + e.getMessage());
×
UNCOV
1093
            return null;
×
1094
        }
1095
    }
1096
    
1097
    private  String datasetSchemaPreface = 
1✔
1098
    "{\n" +
1099
    "    \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n" +
1100
    "    \"$defs\": {\n" +
1101
    "    \"field\": {\n" + 
1102
    "        \"type\": \"object\",\n" +
1103
    "        \"required\": [\"typeClass\", \"multiple\", \"typeName\"],\n" +
1104
    "        \"properties\": {\n" + 
1105
    "            \"value\": {\n" +
1106
    "                \"anyOf\": [\n" +
1107
    "                    {\n" +
1108
    "                        \"type\": \"array\"\n" +
1109
    "                    },\n" +
1110
    "                    {\n" + 
1111
    "                        \"type\": \"string\"\n" +
1112
    "                    },\n" +
1113
    "                    {\n" +
1114
    "                        \"$ref\": \"#/$defs/field\"\n" +
1115
    "                    }\n" + 
1116
    "                ]\n" + 
1117
    "            },\n" + 
1118
    "            \"typeClass\": {\n" +
1119
    "                \"type\": \"string\"\n" +
1120
    "            },\n" +
1121
    "            \"multiple\": {\n" +
1122
    "                \"type\": \"boolean\"\n" +
1123
    "            },\n" +
1124
    "            \"typeName\": {\n" + 
1125
    "                \"type\": \"string\"\n" +
1126
    "            }\n" +
1127
    "        }\n" +
1128
    "    }\n" + 
1129
    "},\n" + 
1130
    "\"type\": \"object\",\n" +
1131
    "\"properties\": {\n" + 
1132
    "    \"datasetVersion\": {\n" + 
1133
    "        \"type\": \"object\",\n" +
1134
    "        \"properties\": {\n" + 
1135
    "           \"license\": {\n" + 
1136
    "                \"type\": \"object\",\n" + 
1137
    "                \"properties\": {\n" + 
1138
    "                    \"name\": {\n" +
1139
    "                        \"type\": \"string\"\n" + 
1140
    "                    },\n" + 
1141
    "                    \"uri\": {\n" + 
1142
    "                        \"type\": \"string\",\n" + 
1143
    "                        \"format\": \"uri\"\n" + 
1144
    "                   }\n" + 
1145
    "                },\n" + 
1146
    "                \"required\": [\"name\", \"uri\"]\n" + 
1147
    "            },\n" + 
1148
    "            \"metadataBlocks\": {\n" + 
1149
    "                \"type\": \"object\",\n" + 
1150
    "               \"properties\": {\n" +
1151
    ""  ;
1152
    
1153
    private String startOfMDB = "" +
1✔
1154
"                           \"blockName\": {\n" +
1155
"                            \"type\": \"object\",\n" +
1156
"                            \"properties\": {\n" +
1157
"                                \"fields\": {\n" +
1158
"                                    \"type\": \"array\",\n" +
1159
"                                    \"items\": {\n" +
1160
"                                        \"$ref\": \"#/$defs/field\"\n" +
1161
"                                    },";
1162
    
1163
    private String reqValTemplate = "                                        {\n" +
1✔
1164
"                                            \"contains\": {\n" +
1165
"                                                \"properties\": {\n" +
1166
"                                                    \"typeName\": {\n" +
1167
"                                                        \"const\": \"reqFieldTypeName\"\n" +
1168
"                                                    }\n" +
1169
"                                                }\n" +
1170
"                                            }\n" +
1171
"                                        },";
1172
    
1173
    private String minItemsTemplate = "\n                                    \"minItems\": numMinItems,\n" +
1✔
1174
"                                    \"allOf\": [\n";
1175
    private String endOfReqVal = "                                    ]\n" +
1✔
1176
"                                }\n" +
1177
"                            },\n" +
1178
"                            \"required\": [\"fields\"]\n" +
1179
"                        }";
1180
    
1181
    private String endOfjson = ",\n" +
1✔
1182
"                    \"required\": [blockNames]\n" +
1183
"                }\n" +
1184
"            },\n" +
1185
"            \"required\": [\"metadataBlocks\"]\n" +
1186
"        }\n" +
1187
"    },\n" +
1188
"    \"required\": [\"datasetVersion\"]\n" +
1189
"}\n";
1190
    
1191
    public void saveStorageQuota(Dataverse target, Long allocation) {
1192
        StorageQuota storageQuota = target.getStorageQuota();
×
1193
        
1194
        if (storageQuota != null) {
×
1195
            storageQuota.setAllocation(allocation);
×
1196
            em.merge(storageQuota);
×
1197
        } else {
1198
            storageQuota = new StorageQuota(); 
×
UNCOV
1199
            storageQuota.setDefinitionPoint(target);
×
1200
            storageQuota.setAllocation(allocation);
×
1201
            target.setStorageQuota(storageQuota);
×
UNCOV
1202
            em.persist(storageQuota);
×
1203
        }
1204
        em.flush();
×
1205
    }
×
1206
    
1207
    public void disableStorageQuota(StorageQuota storageQuota) {
UNCOV
1208
        if (storageQuota != null && storageQuota.getAllocation() != null) {
×
1209
            storageQuota.setAllocation(null);
×
UNCOV
1210
            em.merge(storageQuota);
×
UNCOV
1211
            em.flush();
×
1212
        }
UNCOV
1213
    }
×
1214
}
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