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

IQSS / dataverse / #23048

03 Sep 2024 05:39PM UTC coverage: 20.761% (+0.002%) from 20.759%
#23048

Pull #10820

github

landreev
added a size == 0 check to DatasetUtil.getThumbnail (copied from #10687) #10819
Pull Request #10820: A Fix for the Dataset Thumbnail Bug on Publish, 10819

3 of 38 new or added lines in 4 files covered. (7.89%)

1 existing line in 1 file now uncovered.

17527 of 84424 relevant lines covered (20.76%)

0.21 hits per line

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

2.54
/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java
1
package edu.harvard.iq.dataverse;
2

3
import edu.harvard.iq.dataverse.DatasetVersion.VersionState;
4
import edu.harvard.iq.dataverse.ingest.IngestUtil;
5
import edu.harvard.iq.dataverse.pidproviders.PidUtil;
6
import edu.harvard.iq.dataverse.search.IndexServiceBean;
7
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
8
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
9
import static edu.harvard.iq.dataverse.batch.jobs.importer.filesystem.FileRecordJobListener.SEP;
10
import edu.harvard.iq.dataverse.batch.util.LoggingUtil;
11
import edu.harvard.iq.dataverse.search.SolrSearchResult;
12
import edu.harvard.iq.dataverse.settings.FeatureFlags;
13
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
14
import edu.harvard.iq.dataverse.util.BundleUtil;
15
import edu.harvard.iq.dataverse.util.MarkupChecker;
16
import edu.harvard.iq.dataverse.util.SystemConfig;
17

18
import java.text.SimpleDateFormat;
19
import java.util.ArrayList;
20
import java.util.Arrays;
21
import java.util.Collections;
22
import java.util.Date;
23
import java.util.HashMap;
24
import java.util.Iterator;
25
import java.util.List;
26
import java.util.logging.Level;
27
import java.util.logging.Logger;
28
import jakarta.ejb.EJB;
29
import jakarta.ejb.EJBException;
30
import jakarta.ejb.Stateless;
31
import jakarta.inject.Named;
32
import jakarta.json.Json;
33
import jakarta.json.JsonObjectBuilder;
34
import jakarta.persistence.EntityManager;
35
import jakarta.persistence.NoResultException;
36
import jakarta.persistence.PersistenceContext;
37
import jakarta.persistence.Query;
38
import jakarta.persistence.TypedQuery;
39
import org.apache.commons.lang3.StringUtils;
40

41
/**
42
 *
43
 * @author skraffmiller
44
 */
45
@Stateless
46
@Named
47
public class DatasetVersionServiceBean implements java.io.Serializable {
1✔
48

49
    private static final Logger logger = Logger.getLogger(DatasetVersionServiceBean.class.getCanonicalName());
1✔
50

51
    private static final SimpleDateFormat logFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss");
1✔
52

53
    @EJB
54
    DatasetServiceBean datasetService;
55
    
56
    @EJB
57
    DataFileServiceBean datafileService;
58
    
59
    @EJB
60
    SettingsServiceBean settingsService;
61
    
62
    @EJB
63
    AuthenticationServiceBean authService;
64
    
65
    @EJB
66
    SystemConfig systemConfig;
67

68
    @EJB
69
    IndexServiceBean indexService;
70

71
    @PersistenceContext(unitName = "VDCNet-ejbPU")
72
    private EntityManager em;
73

74
    /**
75
     *  Response to a successful request from the DatasetPage
76
     * 
77
     *  Used to help display messages in the cases when:
78
     *      (1) A specific dataset version (including a DRAFT) is requested
79
     *      (2) A different dataset is returned b/c the first one doesn't exist
80
     * 
81
     *  Simple example:  "DRAFT" requested but no longer exists b/c it
82
     *      was published and is now version "1.0"
83
     */
84
    public class RetrieveDatasetVersionResponse{
85
    
86
        private DatasetVersion datasetVersionForResponse;
87
        private boolean wasSpecificVersionRequested = false;
×
88
        private boolean didSpecificVersionMatch = false;
×
89
        private String actualVersion = null;  
×
90
        private String requestedVersion = null;  
×
91
        
92
        public RetrieveDatasetVersionResponse(DatasetVersion datasetVersion, String requestedVersion){
×
93
            if (datasetVersion == null){
×
94
                throw new IllegalArgumentException("datasetVersion cannot be null");
×
95
            }
96
            //logger.fine("RetrieveDatasetVersionResponse: datasetVersion: " + datasetVersion.getSemanticVersion() + " requestedVersion: " + requestedVersion);
97
            //logger.fine("chosenVersion id: " + datasetVersion.getId() + "  getFriendlyVersionNumber: " + datasetVersion.getFriendlyVersionNumber());
98
            this.datasetVersionForResponse = datasetVersion;
×
99
            
100
            this.actualVersion = datasetVersion.getSemanticVersion();
×
101
            this.requestedVersion = requestedVersion;
×
102
            this.checkVersion();
×
103
        }
×
104
        
105
        public String getDifferentVersionMessage(){
106
            
107
            if (this.wasSpecificVersionRequested && !this.didSpecificVersionMatch){
×
108
                String userMsg;
109
                if (DatasetVersionServiceBean.this.isVersionAskingForDraft(this.requestedVersion)){
×
110
                    userMsg = BundleUtil.getStringFromBundle("file.viewDiffDialog.msg.draftNotFound");
×
111
                }else{
112
                    userMsg = BundleUtil.getStringFromBundle("file.viewDiffDialog.msg.versionNotFound", Arrays.asList(MarkupChecker.escapeHtml(this.requestedVersion)));
×
113
                }
114
                
115
                if (DatasetVersionServiceBean.this.isVersionAskingForDraft(this.actualVersion)){
×
116
                    userMsg += BundleUtil.getStringFromBundle("file.viewDiffDialog.msg.draftFound");
×
117
                }else{
118
                    userMsg += BundleUtil.getStringFromBundle("file.viewDiffDialog.msg.versionFound", Arrays.asList(this.actualVersion));
×
119
                }
120
                
121
                return userMsg;
×
122
            }
123
            return null;
×
124
        }
125
        
126
        private void checkVersion(){
127
            if (actualVersion==null){   // this shouldn't happen
×
128
                return;
×
129
            }
130
            //logger.fine("check version. requested: " + this.requestedVersion + " returned: " + actualVersion);
131
            // This may often be the case if version is not specified
132
            //
133
            if (requestedVersion == null || requestedVersion.isEmpty()){
×
134
                this.wasSpecificVersionRequested = false;         
×
135
                return;
×
136
            }
137

138
            this.wasSpecificVersionRequested = true;                
×
139

140
            this.didSpecificVersionMatch = this.requestedVersion.equalsIgnoreCase(actualVersion);
×
141
            
142
        }
×
143
        
144
        public boolean wasRequestedVersionRetrieved(){
145
            return !(this.wasSpecificVersionRequested && !this.didSpecificVersionMatch);
×
146
        }
147
        
148
        
149
        public DatasetVersion getDatasetVersion(){
150
            return this.datasetVersionForResponse;
×
151
        }                
152
    } // end RetrieveDatasetVersionResponse
153

154
    public DatasetVersion find(Object pk) {
155
        return em.find(DatasetVersion.class, pk);
×
156
    }
157
    
158
    public DatasetVersion findDeep(Object pk) {
159
        return (DatasetVersion) em.createNamedQuery("DatasetVersion.findById")
×
160
            .setParameter("id", pk)
×
161
            // Optimization hints: retrieve all data in one query; this prevents point queries when iterating over the files 
162
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.ingestRequest")
×
163
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.thumbnailForDataset")
×
164
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.dataTables")
×
165
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.fileCategories")
×
166
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.embargo")
×
167
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.retention")
×
168
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.datasetVersion")
×
169
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.releaseUser")
×
170
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.creator")
×
171
            .setHint("eclipselink.left-join-fetch", "o.fileMetadatas.dataFile.dataFileTags")
×
172
            .getSingleResult();
×
173
    }
174
    
175
    /**
176
     * Performs the same database lookup as the one behind Dataset.getVersions().
177
     * Additionally, provides the arguments for selecting a partial list of 
178
     * (length-offset) versions for pagination, plus the ability to pre-select 
179
     * only the publicly-viewable versions. 
180
     * It is recommended that individual software components utilize the 
181
     * ListVersionsCommand, instead of calling this service method directly.
182
     * @param datasetId
183
     * @param offset for pagination through long lists of versions
184
     * @param length for pagination through long lists of versions
185
     * @param includeUnpublished retrieves all the versions, including drafts and deaccessioned. 
186
     * @return (partial) list of versions
187
     */
188
    public List<DatasetVersion> findVersions(Long datasetId, Integer offset, Integer length, boolean includeUnpublished) {
189
        TypedQuery<DatasetVersion> query;  
190
        if (includeUnpublished) {
×
191
            query = em.createNamedQuery("DatasetVersion.findByDataset", DatasetVersion.class);
×
192
        } else {
193
            query = em.createNamedQuery("DatasetVersion.findReleasedByDataset", DatasetVersion.class)
×
194
                    .setParameter("datasetId", datasetId);
×
195
        }
196
        
197
        query.setParameter("datasetId", datasetId);
×
198
        
199
        if (offset != null) {
×
200
            query.setFirstResult(offset);
×
201
        }
202
        if (length != null) {
×
203
            query.setMaxResults(length);
×
204
        }
205
        
206
        return query.getResultList();
×
207
    }
208
    
209
    public DatasetVersion findByFriendlyVersionNumber(Long datasetId, String friendlyVersionNumber) {
210
        Long majorVersionNumber = null;
×
211
        Long minorVersionNumber = null;
×
212

213
        String[] versions = friendlyVersionNumber.split("\\.");
×
214
        try {
215
            if (versions.length == 1) {
×
216
                majorVersionNumber = Long.parseLong(versions[0]);
×
217
            } else if (versions.length == 2) {
×
218
                majorVersionNumber = Long.parseLong(versions[0]);
×
219
                minorVersionNumber = Long.parseLong(versions[1]);
×
220
            } else {
221
                return null;
×
222
            }
223
        } catch (NumberFormatException n) {
×
224
            return null;
×
225
        }
×
226
        if (minorVersionNumber != null) {
×
227
            String queryStr = "SELECT v from DatasetVersion v where v.dataset.id = :datasetId  and v.versionNumber= :majorVersionNumber and v.minorVersionNumber= :minorVersionNumber";
×
228
            DatasetVersion foundDatasetVersion = null;
×
229
            try {
230
                Query query = em.createQuery(queryStr);
×
231
                query.setParameter("datasetId", datasetId);
×
232
                query.setParameter("majorVersionNumber", majorVersionNumber);
×
233
                query.setParameter("minorVersionNumber", minorVersionNumber);
×
234
                foundDatasetVersion = (DatasetVersion) query.getSingleResult();
×
235
            } catch (NoResultException e) {
×
236
                logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber);
×
237
                // DO nothing, just return null.
238
            }
×
239
            return foundDatasetVersion;
×
240
        }
241

242
        if (majorVersionNumber == null && minorVersionNumber == null) {
×
243
            return null;
×
244
        }
245

246
        if (majorVersionNumber != null && minorVersionNumber == null) {
×
247
            try {
248
                TypedQuery<DatasetVersion> typedQuery = em.createQuery("SELECT v from DatasetVersion v where v.dataset.id = :datasetId  and v.versionNumber= :majorVersionNumber", DatasetVersion.class);
×
249
                typedQuery.setParameter("datasetId", datasetId);
×
250
                typedQuery.setParameter("majorVersionNumber", majorVersionNumber);
×
251
                DatasetVersion retVal = null;
×
252
                List<DatasetVersion> versionsList = typedQuery.getResultList();
×
253
                for (DatasetVersion dsvTest : versionsList) {
×
254
                    if (retVal == null) {
×
255
                        retVal = dsvTest;
×
256
                    } else {
257
                        if (retVal.getMinorVersionNumber().intValue() < dsvTest.getMinorVersionNumber().intValue()) {
×
258
                            retVal = dsvTest;
×
259
                        }
260
                    }
261
                }
×
262
                return retVal;
×
263
            } catch (NoResultException e) {
×
264
                logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber);
×
265
                // DO nothing, just return null.
266
            }
267

268
        }
269
        return null;
×
270
    }
271

272
    
273
    /** 
274
     *   Parse a Persistent Id and return as 3 strings.        
275
     * 
276
     *   Example: 1.0, 1.1. 3.4, etc.
277
     * 
278
     * @param version
279
     * @return Long[] with [ major_version, minor_version ] 
280
     *                  - either or both may be null
281
     */
282
     public Long[] parseVersionNumber(String version){
283
        if (version == null){
×
284
            return null;            
×
285
        }
286
        
287
        Long majorVersion;
288
        Long minorVersion = null;
×
289
        
290
        String[] vparts = version.split("\\.");
×
291
        if (vparts.length == 1){
×
292
            try{
293
                majorVersion = Long.parseLong(vparts[0]);
×
294
            }catch (NumberFormatException n) {
×
295
                return null;
×
296
            }
×
297
        }else if (vparts.length == 2){
×
298
            try{
299
                majorVersion = Long.parseLong(vparts[0]);
×
300
                minorVersion = Long.parseLong(vparts[1]);
×
301
            }catch (NumberFormatException n) {
×
302
                return null;
×
303
            }            
×
304
        }else{
305
            return null;
×
306
        }
307
        
308
        Long versionNumbers[] = { majorVersion, minorVersion };
×
309
        
310
        return versionNumbers;
×
311
    }
312
         
313

314
    
315
    private void msg(String s){
316
        //logger.fine(s);
317
    }
×
318
    
319
    public boolean isVersionDefaultCustomTerms(DatasetVersion datasetVersion) {
320
        //SEK - belt and suspenders here, but this is where the bug 10719 first manifested
321
        if (datasetVersion != null && datasetVersion.getId() != null) {
×
322
            try {
323
                TermsOfUseAndAccess toua = (TermsOfUseAndAccess) em.createNamedQuery("TermsOfUseAndAccess.findByDatasetVersionIdAndDefaultTerms")
×
324
                        .setParameter("id", datasetVersion.getId()).setParameter("defaultTerms", TermsOfUseAndAccess.DEFAULT_NOTERMS).getSingleResult();
×
325
                if (toua != null && datasetVersion.getTermsOfUseAndAccess().getLicense() == null) {
×
326
                    return true;
×
327
                }
328

329
            } catch (NoResultException e) {
×
330
                return false;
×
331
            }
×
332
        }
333
        return false;
×
334
    }
335
    
336
    /**
337
     * Does the version identifier in the URL ask for a "DRAFT"?
338
     * 
339
     * @param version
340
     * @return boolean
341
     */
342
    public boolean isVersionAskingForDraft(String version){
343
        
344
        if (version == null){
×
345
            return false;
×
346
        }
347
    
348
        return version.toUpperCase().equals(VersionState.DRAFT.toString());
×
349
    }
350
    
351
    private String getDatasetVersionBasicQuery(String identifierClause, String extraClause){
352
        
353
        if (identifierClause == null){
×
354
            return null;
×
355
        }
356
        
357
        if (extraClause == null){
×
358
            extraClause = "";
×
359
        }
360
                          
361
        String queryStr = "SELECT dv.* FROM DatasetVersion dv";
×
362
        queryStr += " INNER JOIN Dataset ds";
×
363
        queryStr += " ON dv.dataset_id=ds.id";
×
364
        queryStr += identifierClause;      // either persistentId or id
×
365
        queryStr += extraClause;   // may be an empty string
×
366
        queryStr += " ORDER BY versionNumber DESC, minorVersionNumber DESC";
×
367
        queryStr += " LIMIT 1;";
×
368
         
369
        return queryStr;
×
370
        
371
    }
372
    
373
    public String getContributorsNames(DatasetVersion version) {
374
        String contNames = "";
1✔
375
        for (String id : version.getVersionContributorIdentifiers()) {
1✔
376
            id = id.startsWith("@") ? id.substring(1) : id;
1✔
377
            AuthenticatedUser au = authService.getAuthenticatedUser(id);
1✔
378
            if (au != null) {
1✔
379
                if (contNames.isEmpty()) {
1✔
380
                    contNames = au.getName();
1✔
381
                } else {
382
                    contNames = contNames + ", " + au.getName();
1✔
383
                }
384
            }
385
        }
1✔
386
        return contNames;
1✔
387
    } 
388
    
389
    public List<DatasetVersionUser> getDatasetVersionUsersByAuthenticatedUser(AuthenticatedUser user){
390
        
391
        TypedQuery<DatasetVersionUser> typedQuery = em.createQuery("SELECT u from DatasetVersionUser u where u.authenticatedUser.id = :authenticatedUserId", DatasetVersionUser.class);
×
392
                typedQuery.setParameter("authenticatedUserId", user.getId());
×
393
                return typedQuery.getResultList();        
×
394

395
    }
396

397
    /**
398
     * Query to return the last Released DatasetVersion by Persistent ID
399
     * 
400
     * @param identifierClause  - query clause to retrieve via DatasetVersion.Id or DatasetVersion.persistentId 
401
     * @return String fullQuery
402
     */
403
    private String getLatestReleasedDatasetVersionQuery(String identifierClause){
404
        
405
        if (identifierClause == null){
×
406
            return null;
×
407
        }
408
        String releasedClause = " AND dv.versionstate = '" + VersionState.RELEASED.toString() + "'";
×
409

410
        return getDatasetVersionBasicQuery(identifierClause, releasedClause);
×
411
        
412
    }
413

414
     /**
415
     * Query to return a DatasetVersion by Specific Version
416
     * 
417
     * @param identifierClause  - query clause to retrieve via DatasetVersion.Id or DatasetVersion.persistentId 
418
     * @return String fullQuery
419
     */
420
    private String getNumericDatasetVersionQueryByIdentifier(String identifierClause, Long majorVersion, Long minorVersion){
421
        
422
        if (identifierClause == null){
×
423
            return null;
×
424
        }
425
        String extraQueryClause = "";
×
426

427
        
428
        // For an exact version: retrieve either RELEASED or DEACCESSIONED
429
        //
430
        if (majorVersion != null && minorVersion != null){
×
431
            extraQueryClause += " AND dv.versionNumber= " + majorVersion;
×
432
            extraQueryClause += " AND dv.minorVersionNumber= " + minorVersion;
×
433
            extraQueryClause += " AND (dv.versionstate = '" + VersionState.RELEASED.toString() + "' or dv.versionstate = '" + VersionState.DEACCESSIONED.toString() + "')";
×
434
        } else {
435
            // Last released major version
436
            //
437
            extraQueryClause += " AND dv.versionNumber= " + majorVersion;
×
438
            extraQueryClause += " AND dv.versionstate = '" + VersionState.RELEASED.toString() + "'";
×
439
        }
440
        
441
        return getDatasetVersionBasicQuery(identifierClause, extraQueryClause);
×
442
        
443
    }
444
    
445
    /**
446
     * Query to return a Draft DatasetVersion by Persistent ID
447
     * 
448
     * @param identifierClause  - query clause to retrieve via DatasetVersion.Id or DatasetVersion.persistentId 
449
     * @return String fullQuery
450
     */
451
    private String getDraftDatasetVersionQuery(String identifierClause){
452
        
453
        if (identifierClause == null){
×
454
            return null;
×
455
        }
456
        String draftClause = " AND dv.versionstate = '" + VersionState.DRAFT.toString() + "'";
×
457

458
        return getDatasetVersionBasicQuery(identifierClause, draftClause);
×
459
        
460
    }
461
    
462
        /**
463
     * Query to return a DEACCESSIONED DatasetVersion by Persistent ID
464
     * 
465
     * @param identifierClause  - query clause to retrieve via DatasetVersion.Id or DatasetVersion.persistentId 
466
     * @return String fullQuery
467
     */
468
    private String getDeaccessionedDatasetVersionQuery(String identifierClause){
469
        
470
        if (identifierClause == null){
×
471
            return null;
×
472
        }
473
        String draftClause = " AND dv.versionstate = '" + VersionState.DEACCESSIONED.toString() + "'";
×
474

475
        return getDatasetVersionBasicQuery(identifierClause, draftClause);
×
476
        
477
    }
478
    
479
    
480
    
481
    
482
    /**
483
     * Execute a query to return DatasetVersion
484
     * 
485
     * @param queryString
486
     * @return 
487
     */
488
    private DatasetVersion getDatasetVersionByQuery(String queryString){
489
        msg("getDatasetVersionByQuery queryString: " + queryString);
×
490
        if (queryString == null){
×
491
            return null;
×
492
        }
493
        
494
        // Inexact check to see if one of the selected tables is DATASETVERSION
495
        //
496
        if (!queryString.toUpperCase().contains("FROM DATASETVERSION")){
×
497
            throw new IllegalArgumentException("This query does not select from the table DATASETVERSION");
×
498
        }
499
        
500
        try{
501
            Query query = em.createNativeQuery(queryString, DatasetVersion.class);           
×
502
            DatasetVersion ds = (DatasetVersion) query.getSingleResult();
×
503
            
504
            msg("Found: " + ds);
×
505
            return ds;
×
506
            
507
        } catch (NoResultException e) {
×
508
            msg("DatasetVersion not found: " + queryString);
×
509
            logger.log(Level.FINE, "DatasetVersion not found: {0}", queryString);
×
510
            return null;
×
511
         } catch (EJBException e) {
×
512
             logger.log(Level.WARNING, "EJBException exception: {0}", e.getMessage());
×
513
             return null;
×
514
         }
515
    } // end getDatasetVersionByQuery
516
    
517
    /**
518
     * @deprecated because of a typo; use {@link #retrieveDatasetVersionByIdentifierClause(String, String) retrieveDatasetVersionByIdentifierClause} instead
519
     * @see #retrieveDatasetVersionByIdentifierClause(String, String)
520
     * @param identifierClause
521
     * @param version
522
     * @return a DatasetVersion if found, or {@code null} otherwise
523
     */
524
    @Deprecated
525
    public DatasetVersion retrieveDatasetVersionByIdentiferClause(String identifierClause, String version) {
526
        return retrieveDatasetVersionByIdentifierClause(identifierClause, version);
×
527
    }
528

529
    /**
530
     * @param identifierClause
531
     * @param version
532
     * @return a DatasetVersion if found, or {@code null} otherwise
533
     */
534
    public DatasetVersion retrieveDatasetVersionByIdentifierClause(String identifierClause, String version) {
535
        
536
        if (identifierClause == null){
×
537
            return null;
×
538
        }
539
        
540
        DatasetVersion chosenVersion;
541
        
542
        /* --------------------------------------------
543
            (1) Scenario: User asking for a DRAFT?
544
                - (1a) Look for draft
545
                - (1b) Not found: Get Latest Release
546
                - Permissions: check on DatasetPage
547
        -------------------------------------------- */
548
        if (DatasetVersionServiceBean.this.isVersionAskingForDraft(version)){
×
549

550
            // (1a) Try to retrieve a draft
551
            msg("(1a) Try to retrieve a draft");
×
552
            String draftQuery = this.getDraftDatasetVersionQuery(identifierClause);            
×
553
            chosenVersion = this.getDatasetVersionByQuery(draftQuery);
×
554

555
            // Draft Exists! Return it!
556
            msg("Draft Exists! Return it!");
×
557
            if (chosenVersion != null){
×
558
                return chosenVersion;   // let DatasetPage check permissions
×
559
            }
560
            
561
            // (1b) No draft found - check for last released
562
            msg("(1b) No draft found - check for last released");
×
563
            String lastReleasedQuery = this.getLatestReleasedDatasetVersionQuery(identifierClause);
×
564
            chosenVersion = this.getDatasetVersionByQuery(lastReleasedQuery);
×
565
            
566
            return chosenVersion;  // This may be null -- let DatasetPage check
×
567
        }
568
        // END: User asking for a Draft
569
        
570
        /* --------------------------------------------
571
            (2) Scenario: Version specified
572
                - (2a) Look for major and minor version - RELEASE OR DEACCESSIONED
573
                    - OR Look for major version - RELEASE
574
                - (2c) Not found: look for latest released version
575
                - (2c) Not found: look for DEACCESSIONED
576
                - (2d) Not found: look for draft
577
                - Permissions: check on DatasetPage        
578
        
579
            (3) Scenario: No version specified
580
                - Same as (2c)(2d) above
581
                - Permissions: check on DatasetPage        
582
        -------------------------------------------- */
583
        Long[] versionNumbers = parseVersionNumber(version);
×
584
        if (versionNumbers != null && versionNumbers.length == 2){        // At least a major version found
×
585
            
586
            // (2a) Look for major and minor version - RELEASE OR DEACCESSIONED
587
            msg("(2a) Look for major and minor version -" + Arrays.toString(versionNumbers));
×
588
            String specificVersionQuery = this.getNumericDatasetVersionQueryByIdentifier(identifierClause, versionNumbers[0], versionNumbers[1]);            
×
589
            
590
            chosenVersion = this.getDatasetVersionByQuery(specificVersionQuery);
×
591
            if (chosenVersion != null){
×
592
                return chosenVersion;
×
593
            }
594
        }
595
        
596
        // (2b) Look for latest released version
597
        msg("(2b) Look for latest released version");        
×
598
        String latestVersionQuery = this.getLatestReleasedDatasetVersionQuery(identifierClause);
×
599
        //msg("latestVersionQuery: " + latestVersionQuery);
600
        chosenVersion = this.getDatasetVersionByQuery(latestVersionQuery);
×
601
        if (chosenVersion != null){
×
602
            return chosenVersion;
×
603
        }
604

605
        // (2c) Look for DEACCESSIONED
606
        msg("(2c) Look for draft");        
×
607
        String dQuery = this.getDeaccessionedDatasetVersionQuery(identifierClause);            
×
608
        //msg("draftQuery: " + draftQuery);
609
        chosenVersion = this.getDatasetVersionByQuery(dQuery);
×
610
        if (chosenVersion != null){
×
611
            return chosenVersion;
×
612
        }
613
        
614
        // (2d) Look for draft
615
        msg("(2d) Look for draft");        
×
616
        String draftQuery = this.getDraftDatasetVersionQuery(identifierClause);            
×
617
        //msg("draftQuery: " + draftQuery);
618
        chosenVersion = this.getDatasetVersionByQuery(draftQuery);
×
619

620
        return chosenVersion;   // This may be null -- let DatasetPage check
×
621

622
                  
623
    } // end: retrieveDatasetVersionByPersistentId
624
    
625
    
626
    /**
627
     * Find a DatasetVersion using the persisentID and version string
628
     * 
629
     * @param persistentId doi:10.5072/FK2/BYM3IW
630
     * @param version  "DRAFT", 1.0, 2, 3.4, null, etc
631
     * @return 
632
     */
633
    public RetrieveDatasetVersionResponse retrieveDatasetVersionByPersistentId(String persistentId, String version){
634
        
635
        msg("retrieveDatasetVersionByPersistentId: " + persistentId + " " + version);
×
636
        if (persistentId==null){
×
637
            return null;
×
638
        }
639
        
640
        /*        
641
            Parse the persistent id
642
        */
643
        GlobalId parsedId;
644
        try{
645
            parsedId = PidUtil.parseAsGlobalID(persistentId);   // [ protocol, authority, identifier]
×
646
        } catch (IllegalArgumentException e){
×
647
            logger.log(Level.WARNING, "Failed to parse persistentID: {0}", persistentId);
×
648
            return null;
×
649
        }
×
650
        
651
        String identifierClause = " AND ds.protocol= '" + parsedId.getProtocol() + "'"; 
×
652
        identifierClause += " AND ds.authority = '" + parsedId.getAuthority() + "'"; 
×
653
        identifierClause += " AND ds.identifier = '" + parsedId.getIdentifier() + "'"; 
×
654
        
655

656
        DatasetVersion ds = retrieveDatasetVersionByIdentifierClause(identifierClause, version);
×
657
        
658
        if (ds != null){
×
659
            msg("retrieved dataset: " + ds.getId() + " semantic: " + ds.getSemanticVersion());
×
660
            return new RetrieveDatasetVersionResponse(ds, version);
×
661
        }
662
        
663
        return null;
×
664
        
665
    }
666
    
667
    public RetrieveDatasetVersionResponse selectRequestedVersion(List<DatasetVersion> versions, String versionTag) {
668
        
669
        Long[] versionNumbers = parseVersionNumber(versionTag);
×
670
        Long majorVersion = null; 
×
671
        Long minorVersion = null; 
×
672
        
673
        if (versionNumbers != null && versionNumbers.length == 2) { 
×
674
            majorVersion = versionNumbers[0];
×
675
            minorVersion = versionNumbers[1];
×
676
        }
677
        
678
        for (DatasetVersion version : versions) {
×
679

680
            if (this.isVersionAskingForDraft(versionTag)) {
×
681

682
                if (version.isDraft()) {
×
683
                    return new RetrieveDatasetVersionResponse(version, versionTag);
×
684
                }
685

686
            } else if (majorVersion != null && minorVersion != null) {
×
687
                if (majorVersion.equals(version.getVersionNumber()) && minorVersion.equals(version.getMinorVersionNumber()) && (version.isReleased() || version.isDeaccessioned())) {
×
688
                    return new RetrieveDatasetVersionResponse(version, versionTag);
×
689
                }
690
            } else if (majorVersion != null) {
×
691
                if (majorVersion.equals(version.getVersionNumber()) && version.isReleased()) {
×
692
                    return new RetrieveDatasetVersionResponse(version, versionTag);
×
693
                }
694
                //
695
            }
696
        }
×
697
        
698
        // second pass - grab the first  released version:
699
        
700
        for (DatasetVersion version : versions) {
×
701
            if (version.isReleased()) {
×
702
                return new RetrieveDatasetVersionResponse(version, versionTag);
×
703
            }
704
        }
×
705
        
706
        // third pass - grab the first (latest!) deaccessioned version
707
        
708
        for (DatasetVersion version : versions) {
×
709
            if (version.isDeaccessioned()) {
×
710
                return new RetrieveDatasetVersionResponse(version, versionTag);
×
711
            }
712
        }
×
713
            
714
        // fourth pass -  draft is the last choice:
715
        
716
        for (DatasetVersion version : versions) {
×
717
            if (version.isDraft()) {
×
718
                return new RetrieveDatasetVersionResponse(version, versionTag);
×
719
            }
720
        }    
×
721
        
722
        return null; 
×
723
    }
724
     
725
     /**
726
     * Find a DatasetVersion using the persisentID and version string
727
     * 
728
     * @param datasetId
729
     * @param version  "DRAFT", 1.0, 2, 3.4, null, etc
730
     * @return 
731
     */
732
    public RetrieveDatasetVersionResponse retrieveDatasetVersionById(Long datasetId, String version){
733
        msg("retrieveDatasetVersionById: " + datasetId + " " + version);
×
734
        
735
        DatasetVersion ds = getDatasetVersionById(datasetId, version);
×
736
        
737
        if (ds != null){
×
738
            return new RetrieveDatasetVersionResponse(ds, version);
×
739
        }
740
        
741
        return null;
×
742

743
          
744
    } // end: retrieveDatasetVersionById
745
    
746
    public DatasetVersion getDatasetVersionById(Long datasetId, String version){
747
        msg("retrieveDatasetVersionById: " + datasetId + " " + version);
×
748
        if (datasetId==null){
×
749
            return null;
×
750
        }        
751
        
752
        String identifierClause = this.getIdClause(datasetId);
×
753

754
        DatasetVersion ds = retrieveDatasetVersionByIdentifierClause(identifierClause, version);
×
755
        
756
        return ds;
×
757

758
          
759
    } // end: getDatasetVersionById
760
    
761
    public DatasetVersion getLatestReleasedVersionFast(Long datasetId) {
762
        String identifierClause = this.getIdClause(datasetId);
×
763
        String latestVersionQuery = this.getLatestReleasedDatasetVersionQuery(identifierClause);
×
764
        return this.getDatasetVersionByQuery(latestVersionQuery);
×
765
    }
766
    
767
    private String getIdClause(Long datasetId) {
768
        return " AND ds.id = " + datasetId;
×
769
    }
770
    
771
     /**
772
     * Find a DatasetVersion using the dataset versionId
773
     * 
774
     * @param versionId DatasetVersion id
775
     * @return 
776
     */
777
    public RetrieveDatasetVersionResponse retrieveDatasetVersionByVersionId(Long versionId){
778
        //msg("retrieveDatasetVersionById: " + datasetId + " " + versionId);
779
        if (versionId==null ){
×
780
            return null;
×
781
        }        
782
        
783
        // Try versionId - release state doesn't matte
784
        //
785
        String retrieveSpecifiedDSVQuery = "SELECT dv.* FROM DatasetVersion dv WHERE dv.id = " + versionId;
×
786
        
787
        DatasetVersion chosenVersion = this.getDatasetVersionByQuery(retrieveSpecifiedDSVQuery);
×
788
        if (chosenVersion != null) {
×
789
            return new RetrieveDatasetVersionResponse(chosenVersion, "");
×
790
        }
791
        return null;          
×
792
    } // end: retrieveDatasetVersionByVersionId
793
    
794
    // This is an optimized, native query-based method for picking an image 
795
    // that can be used as the thumbnail for a given dataset/version. 
796
    // It is primarily designed to be used when thumbnails are requested
797
    // from the Dataverse page, which is Solr search object based; meaning we 
798
    // may not have the Dataset, DatasetVersion, etc. entities initialized.
799
    // And since we may need to look up/generate these thumbnails for a large 
800
    // number of search results, actually instantiating full entities for each
801
    // one may be prohibitively expensive. It is also used by the DatasetPage, 
802
    // when in read-only, optimized mode, when we similarly try to serve the 
803
    // page while minimizing full lookup of entities via EJB. 
804
    // (in both cases above the method is called via ThumbnailServiceWrapper)
805
    
806
    public Long getThumbnailByVersionId(Long versionId) {
807
        if (versionId == null) {
×
808
            return null;
×
809
        }
810

NEW
811
        if (!FeatureFlags.DISABLE_DATASET_THUMBNAIL_AUTOSELECT.enabled()) {
×
812
            Long thumbnailFileId;
813

814
            // First, let's see if there are thumbnails that have already been 
815
            // generated:
816
            try {
817
                thumbnailFileId = (Long) em.createNativeQuery("SELECT df.id "
×
818
                        + "FROM datafile df, filemetadata fm, datasetversion dv, dvobject o "
819
                        + "WHERE dv.id = " + versionId + " "
820
                        + "AND df.id = o.id "
821
                        + "AND fm.datasetversion_id = dv.id "
822
                        + "AND fm.datafile_id = df.id "
823
                        + "AND df.restricted = false "
824
                        + "AND df.embargo_id is null "
825
                        + "AND df.retention_id is null "
826
                        + "AND o.previewImageAvailable = true "
NEW
827
                        + "ORDER BY df.id LIMIT 1;").getSingleResult();
×
828
            } catch (Exception ex) {
×
829
                thumbnailFileId = null;
×
830
            }
×
831

832
            if (thumbnailFileId != null) {
×
NEW
833
                logger.fine("DatasetVersionService,getThumbnailByVersionid(): found already generated thumbnail for version " + versionId + ": " + thumbnailFileId);
×
NEW
834
                assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
×
NEW
835
                return thumbnailFileId;
×
836
            }
837

NEW
838
            if (!systemConfig.isThumbnailGenerationDisabledForImages()) {
×
839
                // OK, let's try and generate an image thumbnail!
NEW
840
                long imageThumbnailSizeLimit = systemConfig.getThumbnailSizeLimitImage();
×
841

842
                try {
NEW
843
                    thumbnailFileId = (Long) em.createNativeQuery("SELECT df.id "
×
844
                            + "FROM datafile df, filemetadata fm, datasetversion dv, dvobject o "
845
                            + "WHERE dv.id = " + versionId + " "
846
                            + "AND df.id = o.id "
847
                            + "AND fm.datasetversion_id = dv.id "
848
                            + "AND fm.datafile_id = df.id "
849
                            + "AND o.previewimagefail = false "
850
                            + "AND df.restricted = false "
851
                            + "AND df.embargo_id is null "
852
                            + "AND df.retention_id is null "
853
                            + "AND df.contenttype LIKE 'image/%' "
854
                            + "AND NOT df.contenttype = 'image/fits' "
855
                            + "AND df.filesize < " + imageThumbnailSizeLimit + " "
NEW
856
                            + "ORDER BY df.filesize ASC LIMIT 1;").getSingleResult();
×
NEW
857
                } catch (Exception ex) {
×
NEW
858
                    thumbnailFileId = null;
×
NEW
859
                }
×
860

NEW
861
                if (thumbnailFileId != null) {
×
NEW
862
                    logger.fine("obtained file id: " + thumbnailFileId);
×
NEW
863
                    DataFile thumbnailFile = datafileService.find(thumbnailFileId);
×
NEW
864
                    if (thumbnailFile != null) {
×
NEW
865
                        if (datafileService.isThumbnailAvailable(thumbnailFile)) {
×
NEW
866
                            assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
×
NEW
867
                            return thumbnailFileId;
×
868
                        }
869
                    }
870
                }
871
            }
872

873
            // And if that didn't work, try the same thing for PDFs:
NEW
874
            if (!systemConfig.isThumbnailGenerationDisabledForPDF()) {
×
875
                // OK, let's try and generate an image thumbnail!
NEW
876
                long imageThumbnailSizeLimit = systemConfig.getThumbnailSizeLimitPDF();
×
877
                try {
NEW
878
                    thumbnailFileId = (Long) em.createNativeQuery("SELECT df.id "
×
879
                            + "FROM datafile df, filemetadata fm, datasetversion dv, dvobject o "
880
                            + "WHERE dv.id = " + versionId + " "
881
                            + "AND df.id = o.id "
882
                            + "AND fm.datasetversion_id = dv.id "
883
                            + "AND fm.datafile_id = df.id "
884
                            + "AND o.previewimagefail = false "
885
                            + "AND df.restricted = false "
886
                            + "AND df.embargo_id is null "
887
                            + "AND df.retention_id is null "
888
                            + "AND df.contenttype = 'application/pdf' "
889
                            + "AND df.filesize < " + imageThumbnailSizeLimit + " "
NEW
890
                            + "ORDER BY df.filesize ASC LIMIT 1;").getSingleResult();
×
NEW
891
                } catch (Exception ex) {
×
NEW
892
                    thumbnailFileId = null;
×
NEW
893
                }
×
894

NEW
895
                if (thumbnailFileId != null) {
×
NEW
896
                    DataFile thumbnailFile = datafileService.find(thumbnailFileId);
×
NEW
897
                    if (thumbnailFile != null) {
×
NEW
898
                        if (datafileService.isThumbnailAvailable(thumbnailFile)) {
×
NEW
899
                            assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
×
NEW
900
                            return thumbnailFileId;
×
901
                        }
902
                    }
903
                }
904
            }
905
        }
UNCOV
906
        return null;
×
907
    }
908
    
909
    private void assignDatasetThumbnailByNativeQuery(Long versionId, Long dataFileId) {
910
        try {
911
            em.createNativeQuery("UPDATE dataset SET thumbnailfile_id=" + dataFileId + " WHERE id in (SELECT dataset_id FROM datasetversion WHERE id=" + versionId + ")").executeUpdate();
×
912
        } catch (Exception ex) {
×
913
            // it's ok to just ignore... 
914
        }
×
915
    }
×
916
    
917
    public void writeEditVersionLog(DatasetVersionDifference dvd, AuthenticatedUser au) {
918

919
        String logDir = System.getProperty("com.sun.aas.instanceRoot") + SEP + "logs" + SEP + "edit-drafts" + SEP;
×
920
        String identifier = dvd.getOriginalVersion().getDataset().getIdentifier();
×
921
        identifier = identifier.substring(identifier.indexOf("/") + 1);
×
922
        String datasetId = dvd.getOriginalVersion().getDataset().getId().toString();
×
923
        String summary = au.getFirstName() + " " + au.getLastName() + " (" + au.getIdentifier() + ") updated " + dvd.getEditSummaryForLog();
×
924
        String logTimestamp = logFormatter.format(new Date());
×
925
        String fileName = "/edit-draft-" + datasetId + "-" + identifier + "-" + logTimestamp + ".txt";
×
926
        LoggingUtil.saveLogFile(summary, logDir, fileName);
×
927
        
928
    }
×
929
    
930
    public void populateDatasetSearchCard(SolrSearchResult solrSearchResult) {
931
        Long dataverseId = Long.parseLong(solrSearchResult.getParent().get("id"));
×
932
        Long datasetVersionId = solrSearchResult.getDatasetVersionId();
×
933
        Long datasetId = solrSearchResult.getEntityId();
×
934
        
935
        if (dataverseId == 0) {
×
936
            return;
×
937
        }
938
        
939
        Object[] searchResult;
940
        
941
        try {
942
            if (datasetId != null) {
×
943
                searchResult = (Object[]) em.createNativeQuery("SELECT t0.VERSIONSTATE, t1.ALIAS, t2.THUMBNAILFILE_ID, t2.USEGENERICTHUMBNAIL, t3.STORAGEIDENTIFIER FROM DATASETVERSION t0, DATAVERSE t1, DATASET t2, DVOBJECT t3 WHERE t0.ID = " 
×
944
                        + datasetVersionId 
945
                        + " AND t1.ID = " 
946
                        + dataverseId
947
                        + " AND t2.ID = "
948
                        + datasetId
949
                        + " AND t2.ID = t3.ID").getSingleResult()
×
950
                        
951
                        ;
952
            } else {
953
                // Why is this method ever called with dataset_id = null? -- L.A.
954
                searchResult = (Object[]) em.createNativeQuery("SELECT t0.VERSIONSTATE, t1.ALIAS FROM DATASETVERSION t0, DATAVERSE t1 WHERE t0.ID = " + datasetVersionId + " AND t1.ID = " + dataverseId).getSingleResult();
×
955
            }
956
        } catch (Exception ex) {
×
957
            return;
×
958
        }
×
959

960
        if (searchResult == null) {
×
961
            return;
×
962
        }
963
        
964
        if (searchResult[0] != null) {
×
965
            String versionState = (String)searchResult[0];
×
966
            if ("DEACCESSIONED".equals(versionState)) {
×
967
                solrSearchResult.setDeaccessionedState(true);
×
968
            }
969
        }
970
        
971
        /**
972
          * @todo (from pdurbin) can a dataverse alias ever be null?
973
          */
974
        
975
        if (searchResult[1] != null) {
×
976
            solrSearchResult.setDataverseAlias((String) searchResult[1]);
×
977
        }
978
        
979
        if (searchResult.length == 5) {
×
980
            Dataset datasetEntity = new Dataset();
×
981
            String globalIdentifier = solrSearchResult.getIdentifier();
×
982
            GlobalId globalId = PidUtil.parseAsGlobalID(globalIdentifier);
×
983

984
            datasetEntity.setProtocol(globalId.getProtocol());
×
985
            datasetEntity.setAuthority(globalId.getAuthority());
×
986
            datasetEntity.setIdentifier(globalId.getIdentifier());
×
987
            if (searchResult[4] != null) {
×
988
                datasetEntity.setStorageIdentifier(searchResult[4].toString());
×
989
            }
990
            solrSearchResult.setEntity(datasetEntity);
×
991
            if (searchResult[2] != null) {
×
992
                // This is the image file specifically assigned as the "icon" for
993
                // the dataset:
994
                Long thumbnailFile_id = (Long) searchResult[2];
×
995
                if (thumbnailFile_id != null) {
×
996
                    DataFile thumbnailFile;
997
                    try {
998
                        thumbnailFile = datafileService.findCheapAndEasy(thumbnailFile_id);
×
999
                    } catch (Exception ex) {
×
1000
                        thumbnailFile = null;
×
1001
                    }
×
1002

1003
                    if (thumbnailFile != null) {
×
1004
                        ((Dataset) solrSearchResult.getEntity()).setThumbnailFile(thumbnailFile);
×
1005
                    }
1006
                }
1007
            }
1008
            if (searchResult[3] != null) {
×
1009
                ((Dataset)solrSearchResult.getEntity()).setUseGenericThumbnail((Boolean) searchResult[3]);
×
1010
            } else {
1011
                ((Dataset)solrSearchResult.getEntity()).setUseGenericThumbnail(false);
×
1012
            }
1013
        }
1014
    }
×
1015
    
1016
    /**
1017
     * Return a list of the checksum Strings for files in the specified DatasetVersion
1018
     * 
1019
     * This is used to help check for duplicate files within a DatasetVersion
1020
     * 
1021
     * @param datasetVersion
1022
     * @return a list of checksum Strings for files in the specified DatasetVersion
1023
     */
1024
    public List<String> getChecksumListForDatasetVersion(DatasetVersion datasetVersion) {
1025

1026
        if (datasetVersion == null){
×
1027
            throw new NullPointerException("datasetVersion cannot be null");
×
1028
        }
1029

1030
        String query = "SELECT df.md5 FROM datafile df, filemetadata fm WHERE fm.datasetversion_id = " + datasetVersion.getId() + " AND fm.datafile_id = df.id;";
×
1031

1032
        logger.log(Level.FINE, "query: {0}", query);
×
1033
        Query nativeQuery = em.createNativeQuery(query);
×
1034

1035
        return nativeQuery.getResultList();
×
1036
    }
1037
    
1038
        
1039
    /**
1040
     * Check for the existence of a single checksum value within a DatasetVersion's files
1041
     * 
1042
     * @param datasetVersion
1043
     * @param selectedChecksum
1044
     * @return 
1045
     */
1046
    public boolean doesChecksumExistInDatasetVersion(DatasetVersion datasetVersion, String selectedChecksum) {
1047
        if (datasetVersion == null){
×
1048
            throw new NullPointerException("datasetVersion cannot be null");
×
1049
        }
1050
        
1051
        String query = "SELECT df.md5 FROM datafile df, filemetadata fm" 
×
1052
                + " WHERE fm.datasetversion_id = " + datasetVersion.getId() 
×
1053
                + " AND fm.datafile_id = df.id"
1054
                + " AND df.md5 = '" + selectedChecksum + "';";
1055
        
1056
        Query nativeQuery = em.createNativeQuery(query);
×
1057
        List<?> checksumList = nativeQuery.getResultList();
×
1058

1059
        return !checksumList.isEmpty();
×
1060
    }
1061
        
1062
    
1063
    public List<HashMap<String, Object>> getBasicDatasetVersionInfo(Dataset dataset){
1064
        
1065
        if (dataset == null){
×
1066
            throw new NullPointerException("dataset cannot be null");
×
1067
        }
1068
        
1069
        String query = "SELECT id, dataset_id, releasetime, versionnumber,"
×
1070
                    + " minorversionnumber, versionstate, versionnote" 
1071
                    + " FROM datasetversion"
1072
                    + " WHERE dataset_id = " + dataset.getId()
×
1073
                    + " ORDER BY versionnumber DESC,"
1074
                    + " minorversionnumber DESC," 
1075
                    + " versionstate;";
1076
        msg("query: " + query);
×
1077
        Query nativeQuery = em.createNativeQuery(query);
×
1078
        List<Object[]> datasetVersionInfoList = nativeQuery.getResultList();
×
1079

1080
        List<HashMap<String, Object>> hashList = new ArrayList<>();
×
1081
        
1082
        HashMap<String, Object> mMap = new HashMap<>();
×
1083
        for (Object[] dvInfo : datasetVersionInfoList) {
×
1084
            mMap = new HashMap<>();
×
1085
            mMap.put("datasetVersionId", dvInfo[0]);
×
1086
            mMap.put("datasetId", dvInfo[1]);
×
1087
            mMap.put("releaseTime", dvInfo[2]);
×
1088
            mMap.put("versionnumber", dvInfo[3]);
×
1089
            mMap.put("minorversionnumber", dvInfo[4]);
×
1090
            mMap.put("versionstate", dvInfo[5]);
×
1091
            mMap.put("versionnote", dvInfo[6]);
×
1092
            hashList.add(mMap);
×
1093
        }
×
1094
        return hashList;
×
1095
    } // end getBasicDatasetVersionInfo
1096
    
1097
    
1098
    
1099
    public HashMap getFileMetadataHistory(DataFile df){
1100
        
1101
        if (df == null){
×
1102
            throw new NullPointerException("DataFile 'df' cannot be null");
×
1103
        }
1104
        
1105
        String rootFileIdClause = "";
×
1106
        if (df.getRootDataFileId() != null){
×
1107
            rootFileIdClause = " OR rootdatafileid = " + df.getRootDataFileId();
×
1108
        }
1109
        
1110
        List<String> colsToRetrieve = Arrays.asList("df.id", "df.contenttype" 
×
1111
                 , "df.filesize", "df.checksumtype", "df.checksumvalue"
1112
                 , "fm.label", "fm.description", "fm.version"        
1113
        );
1114
                
1115
        String colsToRetrieveString = StringUtils.join(colsToRetrieve, ",");
×
1116
                
1117
        
1118
        String query = "SELECT " + colsToRetrieveString
×
1119
                    + " FROM datafile df, filemetadata fm"
1120
                    + " WHERE (df.id = " + df.getId()
×
1121
                    + "    OR rootdatafileid = "  + df.getId()
×
1122
                    + rootFileIdClause + ")"
1123
                    + " AND fm.datafile_id = df.id"
1124
                    + " ORDER BY df.id;";
1125
        
1126
        Query nativeQuery = em.createNativeQuery(query);
×
1127
        List<Object[]> infoList = nativeQuery.getResultList();
×
1128

1129
        List<HashMap> hashList = new ArrayList<>();
×
1130
        
1131
        /*
1132
        HashMap mMap;
1133
        List<String> hashKeys = colsToRetrieve.stream()
1134
                                  .map(String :: trim)  
1135
          */                              
1136

1137
        /*
1138
                                                        .map(x -> x.getTypeLabel())
1139
w
1140
                 return tagsToCheck.stream()
1141
                        .filter(p -> p != null)         // no nulls
1142
                        .map(String :: trim)            // strip strings
1143
                        .filter(p -> p.length() > 0 )   // no empty strings
1144
                        .distinct()                     // distinct
1145
                        .collect(Collectors.toList());
1146
                */        
1147
        return null;/*
×
1148
        for (Object[] dvInf: infoList) {
1149
                        
1150
            mMap = new HashMap();
1151
            for(int idx=0; idx < colsToRetrieve.size(); idx++){
1152
                String keyName = colsToRetrieve.get(idx);
1153
                if ()
1154
                mMap.put(colsToRetrieve.get(idx), dvInfo[idx]);
1155
            }
1156
            hashList.add(mMap);
1157
        }
1158
        return hashList;
1159
        */
1160
    }
1161

1162
    public JsonObjectBuilder fixMissingUnf(String datasetVersionId, boolean forceRecalculate) {
1163
        JsonObjectBuilder info = Json.createObjectBuilder();
×
1164
        if (datasetVersionId == null || datasetVersionId.isEmpty()) {
×
1165
            info.add("message", "datasetVersionId was null or empty!");
×
1166
            return info;
×
1167
        }
1168
        long dsvId = Long.parseLong(datasetVersionId);
×
1169
        DatasetVersion datasetVersion = find(dsvId);
×
1170
        if (datasetVersion == null) {
×
1171
            info.add("message", "Could not find a dataset version based on datasetVersionId " + datasetVersionId + ".");
×
1172
            return info;
×
1173
        }
1174
        if (!StringUtils.isBlank(datasetVersion.getUNF())) {
×
1175
            info.add("message", "Dataset version (id=" + datasetVersionId + ") already has a UNF. Blank the UNF value in the database if you must change it.");
×
1176
            return info;
×
1177
        }
1178
            
1179
        List<String> fileUnfsInVersion = getFileUnfsInVersion(datasetVersion);
×
1180
        if (fileUnfsInVersion.isEmpty()) {
×
1181
            info.add("message", "Dataset version (id=" + datasetVersionId + ") has no tabular data files with UNF signatures. The version UNF will remain blank.");
×
1182
            return info;
×
1183
        }
1184
        
1185
        if (!forceRecalculate) {
×
1186
            DatasetVersion previousDatasetVersion = getPreviousVersionWithUnf(datasetVersion);
×
1187
            if (previousDatasetVersion != null) {
×
1188
                List<String> fileUnfsInPreviousVersion = getFileUnfsInVersion(previousDatasetVersion);
×
1189
                
1190
                if (isFileUnfsIdentical(fileUnfsInVersion, fileUnfsInPreviousVersion)) {
×
1191
                    datasetVersion.setUNF(previousDatasetVersion.getUNF());
×
1192
                    DatasetVersion saved = em.merge(datasetVersion);
×
1193
                    info.add("message", "Dataset version (id=" + datasetVersionId + ") has the same tabular file UNFs as a previous version. Assigned the UNF of the previous version without recalculation (" + previousDatasetVersion.getUNF() + "). Use the --forceRecalculate option if you insist on recalculating this UNF.");
×
1194
                }
1195
            }
1196
        }
1197
        
1198
        // is the UNF still unset? 
1199
        if (StringUtils.isBlank(datasetVersion.getUNF())) {
×
1200
            IngestUtil.recalculateDatasetVersionUNF(datasetVersion);
×
1201
            DatasetVersion saved = em.merge(datasetVersion);
×
1202
            info.add("message", "New UNF value saved (" + saved.getUNF() + "). Reindexing dataset.");
×
1203
        }
1204

1205
        // reindexing the dataset, to make sure the new UNF is in SOLR:
1206
        boolean doNormalSolrDocCleanUp = true;
×
1207
        indexService.asyncIndexDataset(datasetVersion.getDataset(), doNormalSolrDocCleanUp);
×
1208
        return info;
×
1209
    }
1210
    
1211
    private boolean isFileUnfsIdentical(List<String> fileUnfs1, List<String> fileUnfs2) {
1212
        if (fileUnfs1.size() != fileUnfs2.size()) {
×
1213
            return false;
×
1214
        }
1215
        
1216
        for (int i = 0; i < fileUnfs1.size(); i++) {
×
1217
            if (!fileUnfs1.get(i).equalsIgnoreCase(fileUnfs2.get(i))) {
×
1218
                return false;
×
1219
            }
1220
        }
1221
        
1222
        return true;
×
1223
    }
1224
    
1225
    private List<String> getFileUnfsInVersion(DatasetVersion datasetVersion) {
1226
        ArrayList<String> fileUnfs = new ArrayList<>();
×
1227
        
1228
        Iterator<FileMetadata> fileMetadataIterator = datasetVersion.getFileMetadatas().iterator();
×
1229
        
1230
        while (fileMetadataIterator.hasNext()) {
×
1231
            FileMetadata fileMetadata = fileMetadataIterator.next();
×
1232
            
1233
            String fileUnf = fileMetadata.getDataFile().getUnf();
×
1234
            
1235
            if (fileUnf != null && !StringUtils.isBlank(fileUnf)) {
×
1236
                fileUnfs.add(fileUnf);
×
1237
            }
1238
        }
×
1239
        
1240
        if (fileUnfs.size() > 0) {
×
1241
            Collections.sort(fileUnfs, String.CASE_INSENSITIVE_ORDER);
×
1242
        }
1243
        
1244
        return fileUnfs;
×
1245
    }
1246
    
1247
    private DatasetVersion getPreviousVersionWithUnf(DatasetVersion datasetVersion) {
1248
        if (datasetVersion.getDataset().getVersions().size() < 2) {
×
1249
            // this is the only version - so there's no previous version.
1250
            return null;
×
1251
        }
1252
        
1253
        Iterator<DatasetVersion> versionIterator = datasetVersion.getDataset().getVersions().iterator();
×
1254
        boolean returnNext = false; 
×
1255
        
1256
        while (versionIterator.hasNext()) {
×
1257
            DatasetVersion iteratedVersion = versionIterator.next();
×
1258
            
1259
            if (returnNext) {
×
1260
                if (!StringUtils.isBlank(iteratedVersion.getUNF())) {
×
1261
                    return iteratedVersion;
×
1262
                }
1263
            } else if (DatasetVersion.compareByVersion.compare(datasetVersion, iteratedVersion) == 0) {
×
1264
                returnNext = true;
×
1265
            }
1266
        }
×
1267
        
1268
        return null;
×
1269
    }
1270
    
1271
    /**
1272
     * Merges the passed datasetversion to the persistence context.
1273
     * @param ver the DatasetVersion whose new state we want to persist.
1274
     * @return The managed entity representing {@code ver}.
1275
     */
1276
    public DatasetVersion merge( DatasetVersion ver ) {
1277
        return em.merge(ver);
×
1278
    }
1279
    
1280
    /**
1281
     * Execute a query to return DatasetVersion
1282
     * 
1283
     * @param queryString
1284
     * @return 
1285
     */
1286
    public List<DatasetVersion> getUnarchivedDatasetVersions(){
1287
        
1288
        try {
1289
            List<DatasetVersion> dsl = em.createNamedQuery("DatasetVersion.findUnarchivedReleasedVersion", DatasetVersion.class).getResultList();
×
1290
            return dsl;
×
1291
        } catch (NoResultException e) {
×
1292
            logger.log(Level.FINE, "No unarchived DatasetVersions found: {0}");
×
1293
            return null;
×
1294
        } catch (EJBException e) {
×
1295
            logger.log(Level.WARNING, "EJBException exception: {0}", e.getMessage());
×
1296
            return null;
×
1297
        }
1298
    } // end getUnarchivedDatasetVersions
1299
} // end class
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