• 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

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

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

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

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

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

100
    @Inject
101
    DataverseSession session;
102

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

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

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

122
    }
123
        
124
    public boolean index(Dataverse dataverse, boolean indexPermissions) {    
125
        /**
126
         * @todo check the result to see if indexing was successful or not
127
         * added logging of exceptions 
128
         */
129
        try {
UNCOV
130
            indexService.indexDataverse(dataverse);
×
131
            if (indexPermissions) {
×
132
                solrIndexService.indexPermissionsOnSelfAndChildren(dataverse);
×
133
            }
UNCOV
134
        } catch (IOException | SolrServerException e) {
×
135
            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();
×
136
            failureLogText += "\r\n" + e.getLocalizedMessage();
×
137
            LoggingUtil.writeOnSuccessFailureLog(null, failureLogText, dataverse);
×
138
            return false;
×
139
        }
×
140

UNCOV
141
        return true;
×
142
    }    
143

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

446
    public List<Dataverse> findDataversesThisIdHasLinkedTo(long dataverseId) {
UNCOV
447
        return dataverseLinkingService.findLinkedDataverses(dataverseId);
×
448
    }
449

450
    public List<Dataverse> findDataversesThatLinkToThisDvId(long dataverseId) {
UNCOV
451
        return dataverseLinkingService.findLinkingDataverses(dataverseId);
×
452
    }
453

454
    public List<Dataset> findDatasetsThisIdHasLinkedTo(long dataverseId) {
UNCOV
455
        return datasetLinkingService.findLinkedDatasets(dataverseId);
×
456
    }
457

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

UNCOV
479
        List<Dataverse> dataverseList = new ArrayList<>();
×
480

UNCOV
481
        List<Dataverse> results = filterDataversesByNamePattern(query);
×
482
        
UNCOV
483
        if (results == null || results.size() == 0) {
×
484
            return null; 
×
485
        }
486

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

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

UNCOV
504
        return dataverseList;
×
505
    }
506
    
507
    public List<Dataverse> filterDataversesForHosting(String pattern, DataverseRequest req) {
508

509
        // Find the dataverses matching the search parameters: 
510
        
UNCOV
511
        List<Dataverse> searchResults = filterDataversesByNamePattern(pattern);
×
512
        
UNCOV
513
        if (searchResults == null || searchResults.size() == 0) {
×
514
            return null; 
×
515
        }
516
        
UNCOV
517
        logger.fine("search query found " + searchResults.size() + " results");
×
518
        
519
        // Filter the results and drop the dataverses where the user is not allowed to 
520
        // add datasets:
521
        
UNCOV
522
        if (req.getAuthenticatedUser().isSuperuser()) {
×
523
            logger.fine("will skip permission check...");
×
524
            return searchResults;
×
525
        }
526
        
UNCOV
527
        List<Dataverse> finalResults = new ArrayList<>();
×
528
        
UNCOV
529
        for (Dataverse res : searchResults) {
×
530
            if (this.permissionService.requestOn(req, res).has(Permission.AddDataset)) {
×
531
                finalResults.add(res);
×
532
            }
UNCOV
533
        }
×
534
        
UNCOV
535
        logger.fine("returning " + finalResults.size() + " final results");
×
536

UNCOV
537
        return finalResults;
×
538
    }
539
    
540
    
541
    /* 
542
        This method takes a search parameter and expands it into a list of 
543
        Dataverses with matching names. 
544
        The search is performed on the name with the trailing word "dataverse"
545
        stripped (if present). This way the search on "data" (or on "da" pr 
546
        "dat") does NOT return almost every dataverse in the database - since
547
        most of them have names that end in "... Dataverse". 
548
        The query isn't pretty, but it works, and it's still EJB QL (and NOT a 
549
        native query). 
550
    */
551
    public List<Dataverse> filterDataversesByNamePattern(String pattern) {
552

UNCOV
553
        pattern = pattern.toLowerCase();
×
554
        
UNCOV
555
        String pattern1 = pattern + "%";
×
556
        String pattern2 = "% " + pattern + "%";
×
557

558
        // Adjust the queries for very short, 1 and 2-character patterns:
UNCOV
559
        if (pattern.length() == 1) {
×
560
            pattern1 = pattern;
×
561
            pattern2 = pattern + " %";
×
562
        } 
563
        /*if (pattern.length() == 2) {
564
            pattern2 = pattern + "%";
565
        }*/
566
        
567
        
UNCOV
568
        String qstr = "select dv from Dataverse dv "
×
569
                + "where (LOWER(dv.name) LIKE :dataverse and ((SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE :pattern1) "
570
                + "     or (SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE :pattern2))) "
571
                + "or (LOWER(dv.name) NOT LIKE :dataverse and ((LOWER(dv.name) LIKE :pattern1) "
572
                + "     or (LOWER(dv.name) LIKE :pattern2))) "
573
                + "order by dv.alias";
574
                
UNCOV
575
        List<Dataverse> searchResults = null;
×
576
        
577
        try {
UNCOV
578
            searchResults = em.createQuery(qstr, Dataverse.class)
×
579
                    .setParameter("dataverse", "%dataverse")
×
580
                    .setParameter("pattern1", pattern1)
×
581
                    .setParameter("pattern2", pattern2)
×
582
                    .getResultList();
×
583
        } catch (Exception ex) {
×
584
            searchResults = null;
×
585
        }
×
586
        
UNCOV
587
        return searchResults;
×
588
    }
589
    
590
    /**
591
     * Used to identify and properly display Harvested objects on the dataverse page.
592
     * 
593
     *//*
594
    @Deprecated
595
    public Map<Long, String> getAllHarvestedDataverseDescriptions(){
596
        
597
        String qstr = "SELECT dataverse_id, archiveDescription FROM harvestingClient;";
598
        List<Object[]> searchResults = null;
599
        
600
        try {
601
            searchResults = em.createNativeQuery(qstr).getResultList();
602
        } catch (Exception ex) {
603
            searchResults = null;
604
        }
605
        
606
        if (searchResults == null) {
607
            return null;
608
        }
609
        
610
        Map<Long, String> ret = new HashMap<>();
611
        
612
        for (Object[] result : searchResults) {
613
            Long dvId = null;
614
            if (result[0] != null) {
615
                try {
616
                    dvId = (Long)result[0];
617
                } catch (Exception ex) {
618
                    dvId = null;
619
                }
620
                if (dvId == null) {
621
                    continue;
622
                }
623
                
624
                ret.put(dvId, (String)result[1]);
625
            }
626
        }
627
        
628
        return ret;        
629
    }*/
630
    
631
    public String getParentAliasString(SolrSearchResult solrSearchResult){
UNCOV
632
        Long dvId = solrSearchResult.getEntityId();
×
633
        String retVal = "";
×
634
        
UNCOV
635
        if (dvId == null) {
×
636
            return retVal;
×
637
        }
638
        
639
        String searchResult;
640
        try {
UNCOV
641
            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();
×
642

UNCOV
643
        } catch (Exception ex) {
×
644
            return retVal;
×
645
        }
×
646

UNCOV
647
        if (searchResult == null) {
×
648
            return retVal;
×
649
        }
650

UNCOV
651
        if (searchResult != null) {
×
652
            return searchResult;
×
653
        }
654
        
UNCOV
655
        return retVal;
×
656
    }
657
    
658
    
659
    public void populateDvSearchCard(SolrSearchResult solrSearchResult) {
660
  
UNCOV
661
        Long dvId = solrSearchResult.getEntityId();
×
662
        
UNCOV
663
        if (dvId == null) {
×
664
            return;
×
665
        }
666
        
UNCOV
667
        Long parentDvId = null;
×
668
        String parentId = solrSearchResult.getParent().get("id");
×
669
        if (parentId != null) {
×
670
            try {
UNCOV
671
                parentDvId = Long.parseLong(parentId);
×
672
            } catch (NumberFormatException ex) {
×
673
                parentDvId = null;
×
674
            }
×
675
        }
676
        
677
        Object[] searchResult;
678
        
679
        try {
UNCOV
680
            if (parentDvId == null) {
×
681
                searchResult = (Object[]) em.createNativeQuery("SELECT t0.AFFILIATION, t0.ALIAS FROM DATAVERSE t0 WHERE t0.ID = " + dvId).getSingleResult();
×
682
            } else {
UNCOV
683
                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();
×
684
            }
UNCOV
685
        } catch (Exception ex) {
×
686
            return;
×
687
        }
×
688

UNCOV
689
        if (searchResult == null) {
×
690
            return;
×
691
        }
692
        
UNCOV
693
        if (searchResult[0] != null) {
×
694
            solrSearchResult.setDataverseAffiliation((String) searchResult[0]);
×
695
        }
696

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

757
        List<Integer> childIds;
758
        try {
UNCOV
759
            childIds = em.createNativeQuery(qstr).getResultList();
×
760
        } catch (Exception ex) {
×
761
            childIds = null;
×
762
        }
×
763

764
        // Set up to track the set of users/groups that get assigned a role and those
765
        // that don't
UNCOV
766
        JsonArrayBuilder usedNames = Json.createArrayBuilder();
×
767
        JsonArrayBuilder unusedNames = Json.createArrayBuilder();
×
768
        // Set up to track the list of dataverses, by id and alias, that are traversed.
UNCOV
769
        JsonArrayBuilder dataverseIds = Json.createArrayBuilder();
×
770
        JsonArrayBuilder dataverseAliases = Json.createArrayBuilder();
×
771
        // Get the Dataverses for the returned ids
772

UNCOV
773
        List<Dataverse> children = new ArrayList<Dataverse>();
×
774

UNCOV
775
        for (int i = 0; i < childIds.size(); i++) {
×
776
            Integer childId = childIds.get(i);
×
777
            Dataverse child = find(new Long(childId.longValue()));
×
778
            if (child != null) {
×
779
                // Add to the list of Dataverses
UNCOV
780
                children.add(child);
×
781
                // Add ids and aliases to the tracking arrays
UNCOV
782
                dataverseIds.add(childId.longValue());
×
783
                dataverseAliases.add(child.getAlias());
×
784
            }
785
        }
786
        // Find the role assignments on the specified Dataverse
UNCOV
787
        List<RoleAssignment> allRAsOnOwner = rolesService.directRoleAssignments(owner);
×
788

789
        // Create a list of just the inheritable role assignments on the original
790
        // dataverse
UNCOV
791
        List<RoleAssignment> inheritableRAsOnOwner = new ArrayList<RoleAssignment>();
×
792
        for (RoleAssignment role : allRAsOnOwner) {
×
793
            if (inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias())) {
×
794
                //Only supporting built-in/non-dataverse-specific custom roles. Custom roles all have an owner.
UNCOV
795
                if(role.getRole().getOwner()==null) {
×
796
                    inheritableRAsOnOwner.add(role);
×
797
                }
798
            }
UNCOV
799
        }
×
800

UNCOV
801
        String privateUrlToken = null;
×
802
        // Create lists of the existing inheritable roles for each child Dataverse
UNCOV
803
        Map<Long, List<RoleAssignment>> existingRAs = new HashMap<Long, List<RoleAssignment>>();
×
804
        for (Dataverse childDv : children) {
×
805
            List<RoleAssignment> allRAsOnChild = rolesService.directRoleAssignments(childDv);
×
806
            List<RoleAssignment> inheritableRoles = new ArrayList<RoleAssignment>();
×
807
            for (RoleAssignment role : allRAsOnChild) {
×
808
                if (inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias())) {
×
809
                    inheritableRoles.add(role);
×
810
                }
UNCOV
811
            }
×
812
            existingRAs.put(childDv.getId(), inheritableRoles);
×
813
        }
×
814

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

UNCOV
888
        return em.createNativeQuery(cqString).getResultList();
×
889
    }
890

891
        
892
    public  String getCollectionDatasetSchema(String dataverseAlias) {
893
        
UNCOV
894
        Dataverse testDV = this.findByAlias(dataverseAlias);
×
895
        
UNCOV
896
        while (!testDV.isMetadataBlockRoot()) {
×
897
            if (testDV.getOwner() == null) {
×
UNCOV
898
                break; // we are at the root; which by defintion is metadata blcok root, regarldess of the value
×
899
            }
900
            testDV = testDV.getOwner();
×
901
        }
902
        
903
        /* Couldn't get the 'return base if no extra required fields to work with the path provided
904
        leaving it as 'out of scope' for now SEK 11/27/2023
905

906
        List<DataverseFieldTypeInputLevel> required = new ArrayList<>();
907

908
        required = dataverseFieldTypeInputLevelService.findRequiredByDataverseId(testDV.getId());
909
        
910
        if (required == null || required.isEmpty()){
911
            String pathToJsonFile = "src/main/resources/edu/harvas/iq/dataverse/baseDatasetSchema.json";
912
            String baseSchema = getBaseSchemaStringFromFile(pathToJsonFile);
913
            if (baseSchema != null && !baseSchema.isEmpty()){
914
                return baseSchema;
915
            }
916
        }
917
        
918
        */
UNCOV
919
        List<MetadataBlock> selectedBlocks = new ArrayList<>();
×
UNCOV
920
        List<DatasetFieldType> requiredDSFT = new ArrayList<>();
×
921
        
922
        selectedBlocks.addAll(testDV.getMetadataBlocks());
×
923

UNCOV
924
        for (MetadataBlock mdb : selectedBlocks) {
×
925
            for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
×
UNCOV
926
                if (!dsft.isChild()) {
×
927
                    DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(testDV.getId(), dsft.getId());
×
928
                    if (dsfIl != null) {
×
929
                        dsft.setRequiredDV(dsfIl.isRequired());
×
930
                        dsft.setInclude(dsfIl.isInclude());
×
931
                    } else {
932
                        dsft.setRequiredDV(dsft.isRequired());
×
933
                        dsft.setInclude(true);
×
934
                    }
935
                    if (dsft.isHasChildren()) {
×
936
                        for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) {
×
UNCOV
937
                            DataverseFieldTypeInputLevel dsfIlChild = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(testDV.getId(), child.getId());
×
938
                            if (dsfIlChild != null) {
×
939
                                child.setRequiredDV(dsfIlChild.isRequired());
×
940
                                child.setInclude(dsfIlChild.isInclude());
×
941
                            } else {
942
                                // in the case of conditionally required (child = true, parent = false)
943
                                // we set this to false; i.e this is the default "don't override" value
944
                                child.setRequiredDV(child.isRequired() && dsft.isRequired());
×
945
                                child.setInclude(true);
×
946
                            }
UNCOV
947
                        }
×
948
                    }
949
                    if(dsft.isRequiredDV()){
×
950
                        requiredDSFT.add(dsft);
×
951
                    }
952
                }
953
            }            
×
954

955
        }
×
956
        
UNCOV
957
        String reqMDBNames = "";
×
958
        List<MetadataBlock> hasReqFields = new ArrayList<>();
×
959
        String retval = datasetSchemaPreface;
×
960
        for (MetadataBlock mdb : selectedBlocks) {
×
961
            for (DatasetFieldType dsft : requiredDSFT) {
×
962
                if (dsft.getMetadataBlock().equals(mdb)) {
×
UNCOV
963
                    hasReqFields.add(mdb);
×
964
                    if (!reqMDBNames.isEmpty()) reqMDBNames += ",";
×
965
                    reqMDBNames += "\"" + mdb.getName() + "\"";
×
UNCOV
966
                    break;
×
967
                }
968
            }
×
UNCOV
969
        }
×
970
        int countMDB = 0;
×
UNCOV
971
        for (MetadataBlock mdb : hasReqFields) {
×
972
            if (countMDB>0){
×
973
                retval += ",";
×
974
            }
975
            retval += getCustomMDBSchema(mdb, requiredDSFT);
×
976
            countMDB++;            
×
977
        }
×
978
        
979
        retval += "\n                     }";
×
980
        
981
        retval += endOfjson.replace("blockNames", reqMDBNames);
×
982

983
        return retval;
×
984
    
985
    }    
986
    
987
    private String getCustomMDBSchema (MetadataBlock mdb, List<DatasetFieldType> requiredDSFT){
988
        String retval = "";
×
UNCOV
989
        boolean mdbHasReqField = false;
×
990
        int numReq = 0;
×
991
        List<DatasetFieldType> requiredThisMDB = new ArrayList<>();
×
992
        
UNCOV
993
        for (DatasetFieldType dsft : requiredDSFT ){
×
994

UNCOV
995
            if(dsft.getMetadataBlock().equals(mdb)){
×
996
                numReq++;
×
UNCOV
997
                mdbHasReqField = true;
×
998
                requiredThisMDB.add(dsft);
×
999
            }
UNCOV
1000
        }
×
UNCOV
1001
        if (mdbHasReqField){
×
UNCOV
1002
        retval  += startOfMDB.replace("blockName", mdb.getName());
×
1003
        
1004
        retval += minItemsTemplate.replace("numMinItems", Integer.toString(requiredThisMDB.size()));
×
1005
        int count = 0;
×
1006
        for (DatasetFieldType dsft:requiredThisMDB ){
×
UNCOV
1007
            count++;
×
1008
            String reqValImp = reqValTemplate.replace("reqFieldTypeName", dsft.getName());
×
UNCOV
1009
            if (count < requiredThisMDB.size()){
×
1010
                retval += reqValImp + "\n";
×
1011
            } else {
1012
               reqValImp = StringUtils.substring(reqValImp, 0, reqValImp.length() - 1);
×
1013
               retval += reqValImp+ "\n";
×
UNCOV
1014
               retval += endOfReqVal;
×
1015
            }            
1016
        }
×
1017
        
1018
        }
1019
        
1020
        return retval;
×
1021
    }
1022
    
1023
    public String isDatasetJsonValid(String dataverseAlias, String jsonInput) {
1024
        JSONObject rawSchema = new JSONObject(new JSONTokener(getCollectionDatasetSchema(dataverseAlias)));
×
1025
        
1026
        try {               
1027
            Schema schema = SchemaLoader.load(rawSchema);
×
1028
            schema.validate(new JSONObject(jsonInput)); // throws a ValidationException if this object is invalid
×
1029
        } catch (ValidationException vx) {
×
UNCOV
1030
            logger.info(BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " " + vx.getErrorMessage()); 
×
1031
            String accumulatedexceptions = "";
×
UNCOV
1032
            for (ValidationException va : vx.getCausingExceptions()){
×
UNCOV
1033
                accumulatedexceptions = accumulatedexceptions + va;
×
UNCOV
1034
                accumulatedexceptions = accumulatedexceptions.replace("org.everit.json.schema.ValidationException:", " ");
×
1035
            }
×
UNCOV
1036
            if (!accumulatedexceptions.isEmpty()){
×
UNCOV
1037
                return BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " "  + accumulatedexceptions;
×
1038
            } else {
1039
                return BundleUtil.getStringFromBundle("dataverses.api.validate.json.failed") + " "  + vx.getErrorMessage();
×
1040
            }
1041
            
UNCOV
1042
        } catch (Exception ex) {            
×
1043
            logger.info(BundleUtil.getStringFromBundle("dataverses.api.validate.json.exception") + ex.getLocalizedMessage());
×
1044
            return BundleUtil.getStringFromBundle("dataverses.api.validate.json.exception") + ex.getLocalizedMessage();
×
1045
        } 
×
1046

1047
        return BundleUtil.getStringFromBundle("dataverses.api.validate.json.succeeded");
×
1048
    }
1049
    
1050
    static String getBaseSchemaStringFromFile(String pathToJsonFile) {
1051
        File datasetSchemaJson = new File(pathToJsonFile);
×
1052
        try {
1053
            String datasetSchemaAsJson = new String(Files.readAllBytes(Paths.get(datasetSchemaJson.getAbsolutePath())));
×
1054
            return datasetSchemaAsJson;
×
UNCOV
1055
        } catch (IOException ex) {
×
1056
            logger.info("IO - failed to get schema file  - will build on fly " +ex.getMessage());
×
UNCOV
1057
            return null;
×
UNCOV
1058
        } catch (Exception e){
×
1059
            logger.info("Other exception - failed to get schema file  - will build on fly. " + e.getMessage());
×
1060
            return null;
×
1061
        }
1062
    }
1063
    
1064
    private  String datasetSchemaPreface = 
1✔
1065
    "{\n" +
1066
    "    \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n" +
1067
    "    \"$defs\": {\n" +
1068
    "    \"field\": {\n" + 
1069
    "        \"type\": \"object\",\n" +
1070
    "        \"required\": [\"typeClass\", \"multiple\", \"typeName\"],\n" +
1071
    "        \"properties\": {\n" + 
1072
    "            \"value\": {\n" +
1073
    "                \"anyOf\": [\n" +
1074
    "                    {\n" +
1075
    "                        \"type\": \"array\"\n" +
1076
    "                    },\n" +
1077
    "                    {\n" + 
1078
    "                        \"type\": \"string\"\n" +
1079
    "                    },\n" +
1080
    "                    {\n" +
1081
    "                        \"$ref\": \"#/$defs/field\"\n" +
1082
    "                    }\n" + 
1083
    "                ]\n" + 
1084
    "            },\n" + 
1085
    "            \"typeClass\": {\n" +
1086
    "                \"type\": \"string\"\n" +
1087
    "            },\n" +
1088
    "            \"multiple\": {\n" +
1089
    "                \"type\": \"boolean\"\n" +
1090
    "            },\n" +
1091
    "            \"typeName\": {\n" + 
1092
    "                \"type\": \"string\"\n" +
1093
    "            }\n" +
1094
    "        }\n" +
1095
    "    }\n" + 
1096
    "},\n" + 
1097
    "\"type\": \"object\",\n" +
1098
    "\"properties\": {\n" + 
1099
    "    \"datasetVersion\": {\n" + 
1100
    "        \"type\": \"object\",\n" +
1101
    "        \"properties\": {\n" + 
1102
    "           \"license\": {\n" + 
1103
    "                \"type\": \"object\",\n" + 
1104
    "                \"properties\": {\n" + 
1105
    "                    \"name\": {\n" +
1106
    "                        \"type\": \"string\"\n" + 
1107
    "                    },\n" + 
1108
    "                    \"uri\": {\n" + 
1109
    "                        \"type\": \"string\",\n" + 
1110
    "                        \"format\": \"uri\"\n" + 
1111
    "                   }\n" + 
1112
    "                },\n" + 
1113
    "                \"required\": [\"name\", \"uri\"]\n" + 
1114
    "            },\n" + 
1115
    "            \"metadataBlocks\": {\n" + 
1116
    "                \"type\": \"object\",\n" + 
1117
    "               \"properties\": {\n" +
1118
    ""  ;
1119
    
1120
    private String startOfMDB = "" +
1✔
1121
"                           \"blockName\": {\n" +
1122
"                            \"type\": \"object\",\n" +
1123
"                            \"properties\": {\n" +
1124
"                                \"fields\": {\n" +
1125
"                                    \"type\": \"array\",\n" +
1126
"                                    \"items\": {\n" +
1127
"                                        \"$ref\": \"#/$defs/field\"\n" +
1128
"                                    },";
1129
    
1130
    private String reqValTemplate = "                                        {\n" +
1✔
1131
"                                            \"contains\": {\n" +
1132
"                                                \"properties\": {\n" +
1133
"                                                    \"typeName\": {\n" +
1134
"                                                        \"const\": \"reqFieldTypeName\"\n" +
1135
"                                                    }\n" +
1136
"                                                }\n" +
1137
"                                            }\n" +
1138
"                                        },";
1139
    
1140
    private String minItemsTemplate = "\n                                    \"minItems\": numMinItems,\n" +
1✔
1141
"                                    \"allOf\": [\n";
1142
    private String endOfReqVal = "                                    ]\n" +
1✔
1143
"                                }\n" +
1144
"                            },\n" +
1145
"                            \"required\": [\"fields\"]\n" +
1146
"                        }";
1147
    
1148
    private String endOfjson = ",\n" +
1✔
1149
"                    \"required\": [blockNames]\n" +
1150
"                }\n" +
1151
"            },\n" +
1152
"            \"required\": [\"metadataBlocks\"]\n" +
1153
"        }\n" +
1154
"    },\n" +
1155
"    \"required\": [\"datasetVersion\"]\n" +
1156
"}\n";
1157
    
1158
    public void saveStorageQuota(Dataverse target, Long allocation) {
UNCOV
1159
        StorageQuota storageQuota = target.getStorageQuota();
×
1160
        
UNCOV
1161
        if (storageQuota != null) {
×
UNCOV
1162
            storageQuota.setAllocation(allocation);
×
UNCOV
1163
            em.merge(storageQuota);
×
1164
        } else {
UNCOV
1165
            storageQuota = new StorageQuota(); 
×
UNCOV
1166
            storageQuota.setDefinitionPoint(target);
×
UNCOV
1167
            storageQuota.setAllocation(allocation);
×
UNCOV
1168
            target.setStorageQuota(storageQuota);
×
UNCOV
1169
            em.persist(storageQuota);
×
1170
        }
UNCOV
1171
        em.flush();
×
UNCOV
1172
    }
×
1173
    
1174
    public void disableStorageQuota(StorageQuota storageQuota) {
UNCOV
1175
        if (storageQuota != null && storageQuota.getAllocation() != null) {
×
1176
            storageQuota.setAllocation(null);
×
UNCOV
1177
            em.merge(storageQuota);
×
1178
            em.flush();
×
1179
        }
1180
    }
×
1181
}
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