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

IQSS / dataverse / #23580

25 Oct 2024 08:18PM CUT coverage: 21.187% (+0.3%) from 20.87%
#23580

Pull #10790

github

web-flow
Merge ae058d107 into 5f5126a87
Pull Request #10790: fix: issues in exporters and citations for PermaLink/non-DOI PIDs

48 of 69 new or added lines in 7 files covered. (69.57%)

1410 existing lines in 14 files now uncovered.

18260 of 86183 relevant lines covered (21.19%)

0.21 hits per line

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

0.0
/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractCreateDatasetCommand.java
1
package edu.harvard.iq.dataverse.engine.command.impl;
2

3
import edu.harvard.iq.dataverse.DataFile;
4
import edu.harvard.iq.dataverse.Dataset;
5
import edu.harvard.iq.dataverse.DatasetVersion;
6
import edu.harvard.iq.dataverse.authorization.Permission;
7
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
8
import edu.harvard.iq.dataverse.dataaccess.DataAccess;
9
import edu.harvard.iq.dataverse.dataset.DatasetType;
10
import edu.harvard.iq.dataverse.engine.command.CommandContext;
11
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
12
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
13
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
14
import edu.harvard.iq.dataverse.pidproviders.PidProvider;
15
import static edu.harvard.iq.dataverse.util.StringUtil.isEmpty;
16
import java.io.IOException;
17
import java.util.Objects;
18
import java.util.logging.Logger;
19
import org.apache.solr.client.solrj.SolrServerException;
20

21
/**;
22
 * An abstract base class for commands that creates {@link Dataset}s.
23
 *
24
 * @author michael
25
 */
26
@RequiredPermissions(Permission.AddDataset)
27
public abstract class AbstractCreateDatasetCommand extends AbstractDatasetCommand<Dataset> {
28
    
UNCOV
29
    private static final Logger logger = Logger.getLogger(AbstractCreateDatasetCommand.class.getCanonicalName());
×
30
    
31
    final protected boolean harvested;
32
    final protected boolean validate;
33
    
34
    public AbstractCreateDatasetCommand(Dataset theDataset, DataverseRequest aRequest) {
UNCOV
35
        this(theDataset, aRequest, false);
×
UNCOV
36
    }
×
37

38
    public AbstractCreateDatasetCommand(Dataset theDataset, DataverseRequest aRequest, boolean isHarvested) {
39
        super(aRequest, theDataset);
×
40
        harvested=isHarvested;
×
UNCOV
41
        this.validate = true;
×
UNCOV
42
    }
×
43

44
    public AbstractCreateDatasetCommand(Dataset theDataset, DataverseRequest aRequest, boolean isHarvested, boolean validate) {
45
        super(aRequest, theDataset);
×
46
        harvested=isHarvested;
×
UNCOV
47
        this.validate = validate;
×
UNCOV
48
    }
×
49
   
50
    protected void additionalParameterTests(CommandContext ctxt) throws CommandException {
51
        // base class - do nothing.
UNCOV
52
    }
×
53
    
54
    protected DatasetVersion getVersionToPersist( Dataset theDataset ) {
UNCOV
55
        return theDataset.getLatestVersion();
×
56
    }
57
    
58
    /**
59
     * Called after the dataset has been persisted, but before the persistence context
60
     * has been flushed. 
61
     * @param theDataset The em-managed dataset.
62
     * @param ctxt 
63
     * @throws edu.harvard.iq.dataverse.engine.command.exception.CommandException 
64
     */
65
    protected void postPersist( Dataset theDataset, CommandContext ctxt ) throws CommandException {
66
        // base class - default to nothing.
UNCOV
67
    }
×
68
    
69

70
    protected void postDBFlush( Dataset theDataset, CommandContext ctxt ) throws CommandException {
71
        // base class - default to nothing.
UNCOV
72
    }
×
73
    
74
    protected abstract void handlePid( Dataset theDataset, CommandContext ctxt ) throws CommandException ;
75
    
76
    @Override
77
    public Dataset execute(CommandContext ctxt) throws CommandException {
78
        
79
        additionalParameterTests(ctxt);
×
80
        
UNCOV
81
        Dataset theDataset = getDataset();
×
82
        PidProvider pidProvider = ctxt.dvObjects().getEffectivePidGenerator(theDataset);
×
83
        
UNCOV
84
        if ( isEmpty(theDataset.getIdentifier()) ) {
×
UNCOV
85
            pidProvider.generatePid(theDataset);
×
86
        }
87
        
UNCOV
88
        DatasetVersion dsv = getVersionToPersist(theDataset);
×
89
        // This re-uses the state setup logic of CreateDatasetVersionCommand, but
90
        // without persisting the new version, or altering its files. 
91
        new CreateDatasetVersionCommand(getRequest(), theDataset, dsv, validate).prepareDatasetAndVersion();
×
92
        
UNCOV
93
        if(!harvested) {
×
UNCOV
94
            checkSystemMetadataKeyIfNeeded(dsv, null);
×
95
        }
96

97
        registerExternalVocabValuesIfAny(ctxt, dsv);
×
98
        
99
        theDataset.setCreator((AuthenticatedUser) getRequest().getUser());
×
100
        
101
        theDataset.setCreateDate(getTimestamp());
×
102

103
        theDataset.setModificationTime(getTimestamp());
×
104
        for (DataFile dataFile: theDataset.getFiles() ){
×
105
            dataFile.setCreator((AuthenticatedUser) getRequest().getUser());
×
UNCOV
106
            dataFile.setCreateDate(theDataset.getCreateDate());
×
107
        }
×
108
        
UNCOV
109
        if (theDataset.getProtocol()==null) {
×
110
            theDataset.setProtocol(pidProvider.getProtocol());
×
111
        }
UNCOV
112
        if (theDataset.getAuthority()==null) {
×
113
            theDataset.setAuthority(pidProvider.getAuthority());
×
114
        }
115
        if (theDataset.getStorageIdentifier() == null) {
×
UNCOV
116
                String driverId = theDataset.getEffectiveStorageDriverId();
×
117
                theDataset.setStorageIdentifier(driverId  + DataAccess.SEPARATOR + theDataset.getAuthorityForFileStorage() + "/" + theDataset.getIdentifierForFileStorage());
×
118
        }
UNCOV
119
        if (theDataset.getIdentifier()==null) {
×
UNCOV
120
            pidProvider.generatePid(theDataset);
×
121
        }
122
        
123
        DatasetType defaultDatasetType = ctxt.datasetTypes().getByName(DatasetType.DEFAULT_DATASET_TYPE);
×
124
        DatasetType existingDatasetType = theDataset.getDatasetType();
×
UNCOV
125
        logger.fine("existing dataset type: " + existingDatasetType);
×
126
        if (existingDatasetType != null) {
×
127
            // A dataset type can be specified via API, for example.
128
            theDataset.setDatasetType(existingDatasetType);
×
129
        } else {
UNCOV
130
            theDataset.setDatasetType(defaultDatasetType);
×
131
        }
132
        
133
        // Attempt the registration if importing dataset through the API, or the app (but not harvest)
UNCOV
134
        handlePid(theDataset, ctxt);
×
135

136

137

138
        ctxt.em().persist(theDataset);
×
139
        
140
        postPersist(theDataset, ctxt);
×
141
        
142
        createDatasetUser(ctxt);
×
143
        
UNCOV
144
        theDataset = ctxt.em().merge(theDataset); // store last updates
×
145
        
146
        // DB updates - done.
147
        
148
        // Now we need the acutal dataset id, so we can start indexing.
UNCOV
149
        ctxt.em().flush();
×
150
        
151
        //Use for code that requires database ids
152
        postDBFlush(theDataset, ctxt);
×
153

154
        if (harvested) {
×
155
            try {
UNCOV
156
                ctxt.index().indexDataset(theDataset, true);
×
UNCOV
157
            } catch (SolrServerException | IOException solrEx) {
×
UNCOV
158
                logger.warning("Failed to index harvested dataset. " + solrEx.getMessage());
×
159
            }
×
160
        } else {
161
            // The asynchronous version does not throw any exceptions, 
162
            // logging them internally instead. 
UNCOV
163
            ctxt.index().asyncIndexDataset(theDataset, true);
×
164
        }
165
               
UNCOV
166
        return theDataset;
×
167
    }
168

169
    @Override
170
    public int hashCode() {
171
        return 97 + Objects.hashCode(getDataset());
×
172
    }
173

174
    @Override
175
    public boolean equals(Object obj) {
176
        if (obj == null) {
×
UNCOV
177
            return false;
×
178
        }
UNCOV
179
        if (!(obj instanceof AbstractCreateDatasetCommand)) {
×
UNCOV
180
            return false;
×
181
        }
UNCOV
182
        final AbstractCreateDatasetCommand other = (AbstractCreateDatasetCommand) obj;
×
UNCOV
183
        return Objects.equals(getDataset(), other.getDataset());
×
184
    }
185

186
    @Override
187
    public String toString() {
UNCOV
188
        return "[DatasetCreate dataset:" + getDataset().getId() + "]";
×
189
    }
190

191
}
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