Skip to content

Commit 77cd617

Browse files
committed
#2438 Add Asynchronous File registration to Publish Dataset Command
1 parent 7eaa16e commit 77cd617

File tree

12 files changed

+91
-110
lines changed

12 files changed

+91
-110
lines changed

src/main/java/edu/harvard/iq/dataverse/AbstractIdServiceBean.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package edu.harvard.iq.dataverse;
22

3-
import static edu.harvard.iq.dataverse.IdServiceBean.logger;
4-
import edu.harvard.iq.dataverse.engine.command.CommandContext;
53
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
64
import edu.harvard.iq.dataverse.util.SystemConfig;
7-
import java.text.SimpleDateFormat;
85

96
import javax.ejb.EJB;
107
import java.util.*;
@@ -20,6 +17,12 @@ public abstract class AbstractIdServiceBean implements IdServiceBean {
2017
@EJB
2118
SettingsServiceBean settingsService;
2219
@EJB
20+
EjbDataverseEngine commandEngine;
21+
@EJB
22+
DatasetServiceBean datasetService;
23+
@EJB
24+
DataFileServiceBean datafileService;
25+
@EJB
2326
SystemConfig systemConfig;
2427

2528
@Override
@@ -87,5 +90,28 @@ public HashMap<String, String> getMetadataForTargetURL(DvObject dvObject) {
8790
metadata.put("_target", getTargetUrl(dvObject));
8891
return metadata;
8992
}
93+
94+
@Override
95+
public DvObject generateIdentifier(DvObject dvObject) {
9096

97+
String protocol = dvObject.getProtocol() == null ? settingsService.getValueForKey(SettingsServiceBean.Key.Protocol) : dvObject.getProtocol();
98+
String authority = dvObject.getAuthority() == null ? settingsService.getValueForKey(SettingsServiceBean.Key.Authority) : dvObject.getAuthority();
99+
String doiSeparator = dvObject.getDoiSeparator() == null ? settingsService.getValueForKey(SettingsServiceBean.Key.DoiSeparator) : dvObject.getDoiSeparator();
100+
IdServiceBean idServiceBean = IdServiceBean.getBean(protocol, commandEngine.getContext());
101+
if (dvObject.isInstanceofDataset()) {
102+
dvObject.setIdentifier(datasetService.generateDatasetIdentifier((Dataset) dvObject, idServiceBean));
103+
} else {
104+
dvObject.setIdentifier(datafileService.generateDataFileIdentifier((DataFile) dvObject, idServiceBean));
105+
}
106+
if (dvObject.getProtocol() == null) {
107+
dvObject.setProtocol(protocol);
108+
}
109+
if (dvObject.getAuthority() == null) {
110+
dvObject.setAuthority(authority);
111+
}
112+
if (dvObject.getDoiSeparator() == null) {
113+
dvObject.setDoiSeparator(doiSeparator);
114+
}
115+
return dvObject;
116+
}
91117
}

src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public boolean alreadyExists(DvObject dvObject) {
5252
@Override
5353
public String createIdentifier(DvObject dvObject) throws Exception {
5454
logger.log(Level.FINE,"createIdentifier");
55+
if(dvObject.getIdentifier() == null || dvObject.getIdentifier().isEmpty() ){
56+
dvObject = generateIdentifier(dvObject);
57+
}
5558
String identifier = getIdentifier(dvObject);
5659
HashMap<String, String> metadata = getMetadataForCreateIndicator(dvObject);
5760
metadata.put("_status", "reserved");

src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ public List<String> getProviderInformation(){
246246
public String createIdentifier(DvObject dvObject) throws Throwable {
247247

248248
logger.log(Level.FINE, "createIdentifier");
249+
if(dvObject.getIdentifier() == null || dvObject.getIdentifier().isEmpty() ){
250+
dvObject = generateIdentifier(dvObject);
251+
}
249252
String identifier = getIdentifier(dvObject);
250253
HashMap<String, String> metadata = getMetadataForCreateIndicator(dvObject);
251254
metadata.put("datacite.resourcetype", "Dataset");
@@ -260,6 +263,7 @@ public String createIdentifier(DvObject dvObject) throws Throwable {
260263
logger.log(Level.WARNING, "localized message {0}", e.getLocalizedMessage());
261264
logger.log(Level.WARNING, "cause", e.getCause());
262265
logger.log(Level.WARNING, "message {0}", e.getMessage());
266+
logger.log(Level.WARNING, "identifier: ", identifier);
263267
throw e;
264268
}
265269
}

src/main/java/edu/harvard/iq/dataverse/DatasetPage.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,10 +1885,12 @@ private String releaseDataset(boolean minor) {
18851885
// the process. So it may be premature to show the "success" message at this point.
18861886
if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) {
18871887
JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("dataset.locked.message"), BundleUtil.getStringFromBundle("dataset.publish.workflow.inprogress"));
1888-
} else if (dataset.isLockedFor(DatasetLock.Reason.pidRegister) || dataset.getFiles().size() > systemConfig.getPIDAsynchRegFileCount()){
1888+
}
1889+
else if (dataset.isLockedFor(DatasetLock.Reason.pidRegister) || dataset.getFiles().size() > systemConfig.getPIDAsynchRegFileCount()){
18891890
JsfHelper.addWarningMessage(BundleUtil.getStringFromBundle("dataset.pidRegister.workflow.inprogress"));
18901891
JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("dataset.locked.message"), BundleUtil.getStringFromBundle("dataset.pidRegister.workflow.inprogress"));
1891-
} else {
1892+
}
1893+
else {
18921894
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.publishSuccess"));
18931895
}
18941896
} catch (CommandException ex) {

src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
import edu.harvard.iq.dataverse.authorization.users.User;
77
import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter;
88
import edu.harvard.iq.dataverse.dataset.DatasetUtil;
9+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
10+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
11+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
12+
import edu.harvard.iq.dataverse.engine.command.impl.FinalizeDatasetPublicationCommand;
913
import edu.harvard.iq.dataverse.harvest.server.OAIRecordServiceBean;
1014
import edu.harvard.iq.dataverse.search.IndexServiceBean;
1115
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
@@ -904,6 +908,14 @@ public WorkflowComment addWorkflowComment(WorkflowComment workflowComment) {
904908
return workflowComment;
905909
}
906910

911+
@Asynchronous
912+
public void callFinalizePublishCommandAsynchronously(Dataset theDataset, CommandContext ctxt, DataverseRequest request) throws CommandException {
913+
914+
String nonNullDefaultIfKeyNotFound = "";
915+
String doiProvider = ctxt.settings().getValueForKey(SettingsServiceBean.Key.DoiProvider, nonNullDefaultIfKeyNotFound);
916+
commandEngine.submit(new FinalizeDatasetPublicationCommand(theDataset, doiProvider, request));
917+
}
918+
907919
/*
908920
Experimental asynchronous method for requesting persistent identifiers for
909921
datafiles. We decided not to run this method on upload/create (so files

src/main/java/edu/harvard/iq/dataverse/IdServiceBean.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ static IdServiceBean getBean(CommandContext ctxt) {
7171
String protocol = ctxt.settings().getValueForKey(SettingsServiceBean.Key.Protocol, nonNullDefaultIfKeyNotFound);
7272
return getBean(protocol, ctxt);
7373
}
74+
75+
DvObject generateIdentifier(DvObject dvObject);
7476

7577

7678
}

src/main/java/edu/harvard/iq/dataverse/api/Datasets.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,6 @@ public Response publishDataset(@PathParam("id") String id, @QueryParam("type") S
442442
@Path("{id}/move/{targetDataverseAlias}")
443443
public Response moveDataset(@PathParam("id") String id, @PathParam("targetDataverseAlias") String targetDataverseAlias, @QueryParam("forceMove") Boolean force) {
444444
try{
445-
System.out.print("force: " + force);
446445
User u = findUserOrDie();
447446
Dataset ds = findDatasetOrDie(id);
448447
Dataverse target = dataverseService.findByAlias(targetDataverseAlias);

src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,7 @@ private boolean step_060_addFilesViaIngestService(){
14271427
maxIdentifier++;
14281428
dataFileIdentifier = datasetIdentifier + "/" + maxIdentifier.toString();
14291429
}
1430+
//commandEngine.submit(new CreateDataFileCommand(dataFile, workingVersion, dvRequest, dataFileIdentifier));
14301431
commandEngine.submit(new CreateDataFileCommand(dataFile, workingVersion, dvRequest, dataFileIdentifier, true));
14311432
}
14321433
} catch (CommandException cmdex) {

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
7474
// comes from there. There's a chance that the final merge, at the end of this
7575
// command, would be sufficient. -- L.A. Sep. 6 2017
7676
theDataset = ctxt.em().merge(theDataset);
77-
7877
//if the publisher hasn't contributed to this version
7978
DatasetVersionUser ddu = ctxt.datasets().getDatasetVersionUser(theDataset.getLatestVersion(), getUser());
8079

@@ -91,7 +90,6 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
9190

9291
updateParentDataversesSubjectsField(theDataset, ctxt);
9392
publicizeExternalIdentifier(ctxt);
94-
9593
PrivateUrl privateUrl = ctxt.engine().submit(new GetPrivateUrlCommand(getRequest(), theDataset));
9694
if (privateUrl != null) {
9795
ctxt.engine().submit(new DeletePrivateUrlCommand(getRequest(), theDataset));
@@ -170,29 +168,19 @@ private void updateParentDataversesSubjectsField(Dataset savedDataset, CommandCo
170168
private void publicizeExternalIdentifier(CommandContext ctxt) throws CommandException {
171169
String protocol = theDataset.getProtocol();
172170
IdServiceBean idServiceBean = IdServiceBean.getBean(protocol, ctxt);
173-
if (idServiceBean != null) {
174-
try {
175-
idServiceBean.publicizeIdentifier(theDataset);
176-
theDataset.setGlobalIdCreateTime(new Date());
177-
theDataset.setIdentifierRegistered(true);
178-
//if the dataset is locked for PID registration then don't register here
179-
//done asynch before calling
180-
if (!theDataset.isLockedFor(DatasetLock.Reason.pidRegister)) {
181-
for (DataFile df : theDataset.getFiles()) {
182-
idServiceBean.publicizeIdentifier(df);
183-
df.setGlobalIdCreateTime(new Date());
184-
df.setIdentifierRegistered(true);
185-
}
186-
} else {
187-
DatasetLock doomed = theDataset.getLockFor(DatasetLock.Reason.pidRegister);
188-
theDataset.getLocks().remove(doomed);
189-
ctxt.em().remove(doomed);
190-
ctxt.em().flush();
191-
}
192-
193-
} catch (Throwable e) {
194-
throw new CommandException(BundleUtil.getStringFromBundle("dataset.publish.error", idServiceBean.getProviderInformation()), this);
171+
try {
172+
idServiceBean.publicizeIdentifier(theDataset);
173+
theDataset.setGlobalIdCreateTime(new Date());
174+
theDataset.setIdentifierRegistered(true);
175+
for (DataFile df : theDataset.getFiles()) {
176+
idServiceBean.publicizeIdentifier(df);
177+
df.setGlobalIdCreateTime(new Date());
178+
df.setIdentifierRegistered(true);
179+
DataFile merged = ctxt.em().merge(df);
180+
merged = null;
195181
}
182+
} catch (Throwable e) {
183+
throw new CommandException(BundleUtil.getStringFromBundle("dataset.publish.error", idServiceBean.getProviderInformation()), this);
196184
}
197185
}
198186

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
1313
import edu.harvard.iq.dataverse.workflow.Workflow;
1414
import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType;
15-
import edu.harvard.iq.dataverse.workflow.step.WorkflowStep;
1615
import java.util.Date;
1716
import java.util.Optional;
1817
import static java.util.stream.Collectors.joining;
18+
import javax.ejb.Asynchronous;
1919

2020
/**
2121
* Kick-off a dataset publication process. The process may complete immediately,
@@ -75,24 +75,34 @@ public PublishDatasetResult execute(CommandContext ctxt) throws CommandException
7575
return new PublishDatasetResult(theDataset, false);
7676

7777
} else {
78-
//if there are more than required size files register them asychronously (default is 10)
79-
if (theDataset.getFiles().size() > ctxt.systemConfig().getPIDAsynchRegFileCount()){
80-
Workflow dummy = new Workflow();
81-
ctxt.workflows().startPIDRegister(dummy, buildContext(doiProvider, TriggerType.PrePublishDataset), ctxt );
82-
AuthenticatedUser requestor = request.getAuthenticatedUser();
83-
DatasetLock lock = new DatasetLock(DatasetLock.Reason.pidRegister, requestor);
78+
//if there are more than required size files then call Finalize asychronously (default is 10)
79+
if (theDataset.getFiles().size() > ctxt.systemConfig().getPIDAsynchRegFileCount()) {
80+
String info = "Adding File PIDs asynchronously";
81+
AuthenticatedUser user = request.getAuthenticatedUser() ;
82+
DatasetLock lock = new DatasetLock(DatasetLock.Reason.pidRegister, user);
8483
lock.setDataset(theDataset);
84+
lock.setInfo(info);
8585
lock.setStartTime(new Date());
86-
ctxt.em().merge(lock);
87-
return new PublishDatasetResult(ctxt.em().merge(theDataset), false);
86+
theDataset.getLocks().add(lock);
87+
callFinalizeAsync(ctxt);
88+
return new PublishDatasetResult(theDataset, false);
8889
}
8990
// Synchronous publishing (no workflow involved)
90-
theDataset = ctxt.engine().submit( new FinalizeDatasetPublicationCommand(theDataset, doiProvider, getRequest()) );
91+
theDataset = ctxt.engine().submit(new FinalizeDatasetPublicationCommand(theDataset, doiProvider, getRequest()));
9192
return new PublishDatasetResult(ctxt.em().merge(theDataset), true);
9293
}
9394
}
9495

9596

97+
@Asynchronous
98+
private void callFinalizeAsync(CommandContext ctxt) throws CommandException {
99+
try {
100+
ctxt.datasets().callFinalizePublishCommandAsynchronously(theDataset, ctxt, request);
101+
} catch (CommandException ce){
102+
throw new CommandException("Publish Dataset failed", this);
103+
}
104+
}
105+
96106
/**
97107
* See that publishing the dataset in the requested manner makes sense, at
98108
* the given state of the dataset.

0 commit comments

Comments
 (0)