Skip to content

Commit

Permalink
prevent publishing of unreserved PIDs #5093
Browse files Browse the repository at this point in the history
  • Loading branch information
pdurbin committed May 28, 2020
1 parent 8aacc92 commit f58b24e
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetLock;
import edu.harvard.iq.dataverse.GlobalIdServiceBean;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.engine.command.Command;
Expand Down Expand Up @@ -66,7 +67,17 @@ public PublishDatasetResult execute(CommandContext ctxt) throws CommandException
// When importing a released dataset, the latest version is marked as RELEASED.

Dataset theDataset = getDataset();


// If PID can be reserved, only allow publishing if it is.
String protocol = getDataset().getProtocol();
GlobalIdServiceBean idServiceBean = GlobalIdServiceBean.getBean(protocol, ctxt);
boolean reservingPidsSupported = !idServiceBean.registerWhenPublished();
if (reservingPidsSupported) {
if (theDataset.getGlobalIdCreateTime() == null) {
throw new IllegalCommandException("Cannot publish dataset because its persistent identifier has not been reserved.", this);
}
}

// Set the version numbers:

if (theDataset.getPublicationDate() == null) {
Expand Down
46 changes: 46 additions & 0 deletions src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package edu.harvard.iq.dataverse.api;

import com.jayway.restassured.RestAssured;
import com.jayway.restassured.path.json.JsonPath;
import com.jayway.restassured.response.Response;
import static javax.ws.rs.core.Response.Status.CREATED;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;
import static javax.ws.rs.core.Response.Status.OK;
import org.junit.BeforeClass;
import org.junit.Ignore;
Expand Down Expand Up @@ -108,4 +111,47 @@ public void testDeletePid() {
Response deletePid = UtilIT.deletePid(pid, apiToken);
deletePid.prettyPrint();
}

@Ignore
@Test
public void testCannotPublishUntilReserved() {
Response createUser = UtilIT.createRandomUser();
createUser.prettyPrint();
createUser.then().assertThat()
.statusCode(OK.getStatusCode());
String username = UtilIT.getUsernameFromResponse(createUser);
String apiToken = UtilIT.getApiTokenFromResponse(createUser);

UtilIT.makeSuperUser(username).then().assertThat().statusCode(OK.getStatusCode());

Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken);
createDataverseResponse.prettyPrint();
createDataverseResponse.then().assertThat()
.statusCode(CREATED.getStatusCode());

String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);

Response createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken);
createDataset.prettyPrint();
createDataset.then().assertThat()
.statusCode(CREATED.getStatusCode());

JsonPath createdDataset = JsonPath.from(createDataset.body().asString());
String pid = createdDataset.getString("data.persistentId");

Response deletePid = UtilIT.deletePid(pid, apiToken);
deletePid.prettyPrint();

Response publishDataverse = UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken);
publishDataverse.prettyPrint();
publishDataverse.then().assertThat()
.statusCode(OK.getStatusCode());

// Publishing fails because the PID is not reserved (see deletePid above).
Response publishDataset = UtilIT.publishDatasetViaNativeApi(pid, "major", apiToken);
publishDataset.prettyPrint();
publishDataset.then().assertThat()
.statusCode(FORBIDDEN.getStatusCode());
}

}

0 comments on commit f58b24e

Please sign in to comment.