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

IQSS / dataverse / #22495

05 Jun 2024 08:44PM CUT coverage: 20.57% (-0.003%) from 20.573%
#22495

Pull #10614

github

web-flow
Merge 3d9592cdc into 3c55c3fa5
Pull Request #10614: 8796 fix no license display and indexing

1 of 17 new or added lines in 3 files covered. (5.88%)

1 existing line in 1 file now uncovered.

17233 of 83776 relevant lines covered (20.57%)

0.21 hits per line

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

2.55
/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.SettingsServiceBean;
13
import edu.harvard.iq.dataverse.util.BundleUtil;
14
import edu.harvard.iq.dataverse.util.MarkupChecker;
15
import edu.harvard.iq.dataverse.util.SystemConfig;
16

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

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

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

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

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

67
    @EJB
68
    IndexServiceBean indexService;
69

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

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

137
            this.wasSpecificVersionRequested = true;                
×
138

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

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

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

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

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

267
        }
268
        return null;
×
269
    }
270

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

313
    
314
    private void msg(String s){
315
        //logger.fine(s);
316
    }
×
317
    
318
    public boolean isVersionDefaultCustomTerms(DatasetVersion datasetVersion) {
319

NEW
320
        if (datasetVersion.getId() != null) {
×
321
            try {
NEW
322
                TermsOfUseAndAccess toua = (TermsOfUseAndAccess) em.createNamedQuery("TermsOfUseAndAccess.findByDatasetVersionIdAndDefaultTerms")
×
NEW
323
                        .setParameter("id", datasetVersion.getId()).setParameter("defaultTerms", TermsOfUseAndAccess.DEFAULT_NOTERMS).getSingleResult();
×
NEW
324
                if (toua != null && datasetVersion.getTermsOfUseAndAccess().getLicense() == null) {
×
NEW
325
                    return true;
×
326
                }
327

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

394
    }
395

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

810
        Long thumbnailFileId;
811

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

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

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

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

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

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

893
            if (thumbnailFileId != null) {
×
894
                DataFile thumbnailFile = datafileService.find(thumbnailFileId);
×
895
                if (thumbnailFile != null) {
×
896
                    if (datafileService.isThumbnailAvailable(thumbnailFile)) {
×
897
                        assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
×
898
                        return thumbnailFileId;
×
899
                    }
900
                }
901
            }
902
        }
903

904
        return null;
×
905
    }
906
    
907
    private void assignDatasetThumbnailByNativeQuery(Long versionId, Long dataFileId) {
908
        try {
909
            em.createNativeQuery("UPDATE dataset SET thumbnailfile_id=" + dataFileId + " WHERE id in (SELECT dataset_id FROM datasetversion WHERE id=" + versionId + ")").executeUpdate();
×
910
        } catch (Exception ex) {
×
911
            // it's ok to just ignore... 
912
        }
×
913
    }
×
914
    
915
    public void writeEditVersionLog(DatasetVersionDifference dvd, AuthenticatedUser au) {
916

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

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

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

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

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

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

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

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

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

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

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

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

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

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