Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions citation/src/main/webapp/js/citation.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,19 +126,20 @@
window.open('/citation/request?doi=' + doiSuffix, '_blank');
}

// GET
// POST
function loadDoiList() {
clearTable()
page.setProgressBar('busy')
setTableStatus('Loading...')
page.setInfoModal('Please wait ', 'Fetching current DOI list... (may take up to 10 seconds)', false, true)

page.prepareCall().then(function(serviceURL) {
page.prepareSearchCall().then(function(serviceURL) {
$.ajax({
xhrFields: { withCredentials: true },
url: serviceURL,
method: 'GET',
method: 'POST',
dataType: 'json',
data: JSON.stringify({role:'owner'}),
contentType: 'application/json'
})
.success(function(stringdata) {
Expand Down
16 changes: 15 additions & 1 deletion citation/src/main/webapp/js/citation_page.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@
return _registryClient
.getServiceURL(
'ivo://cadc.nrc.ca/doi',
'vos://cadc.nrc.ca~vospace/CADC/std/DOI#instances-1.0',
'http://www.opencadc.org/std/doi#instances-1.0',
'vs:ParamHTTP',
'cookie'
)
Expand All @@ -169,6 +169,19 @@
})
}

function prepareSearchCall() {
return _registryClient
.getServiceURL(
'ivo://cadc.nrc.ca/doi',
'http://www.opencadc.org/std/doi#search-1.0',
'vs:ParamHTTP',
'cookie'
)
.catch(function (err) {
setAjaxFail('Error obtaining Service URL > ' + err)
})
}

function setAjaxCount(count) {
_ajaxCallCount = count
}
Expand Down Expand Up @@ -374,6 +387,7 @@
parseUrl: parseUrl,
serviceState: serviceState,
prepareCall: prepareCall,
prepareSearchCall: prepareSearchCall,
setAjaxCount: setAjaxCount,
setAjaxSuccess: setAjaxSuccess,
setAjaxFail: setAjaxFail,
Expand Down
2 changes: 1 addition & 1 deletion doi/VERSION
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
# semantic version tag: major.minor[.patch]
# build version tag: timestamp
# tag: {semantic}-{build}
VER=1.1.2
VER=1.2.0
TAGS="${VER} ${VER}-$(date --utc +"%Y%m%dT%H%M%S")"
unset VER
93 changes: 40 additions & 53 deletions doi/src/intTest/java/ca/nrc/cadc/doi/AltPermissionsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,18 @@
import ca.nrc.cadc.doi.status.DoiStatus;
import ca.nrc.cadc.doi.status.DoiStatusListXmlReader;
import ca.nrc.cadc.doi.status.Status;
import ca.nrc.cadc.net.FileContent;
import ca.nrc.cadc.net.HttpDelete;
import ca.nrc.cadc.net.HttpGet;
import ca.nrc.cadc.net.HttpPost;
import ca.nrc.cadc.util.Log4jInit;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Test;
import org.opencadc.vospace.ContainerNode;
Expand Down Expand Up @@ -101,9 +107,7 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {
log.debug("readWriteSubject - found recently created DOI's Status Object = " + doiID);

// verify draft DOI status in search
Map<String, Object> draftSearchFilter = new HashMap<>();
draftSearchFilter.put("status", "in progress");
List<DoiStatus> draftDoiStatusList = searchDOIStatuses(draftSearchFilter);
List<DoiStatus> draftDoiStatusList = searchDOIStatuses(null, List.of("in progress"));
long draftDOIsCount = draftDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.DRAFT)).count();
Assert.assertEquals(draftDoiStatusList.size(), draftDOIsCount);
return doiID;
Expand Down Expand Up @@ -142,16 +146,12 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {
log.debug("publisherSubject - DOI minting Successful for DOI ID: " + doiSuffix);

// verify minted DOI status in search
Map<String, Object> mintedSearchFilter = new HashMap<>();
mintedSearchFilter.put("status", "minted");
List<DoiStatus> mintedDoiStatusList = searchDOIStatuses(mintedSearchFilter);
List<DoiStatus> mintedDoiStatusList = searchDOIStatuses(null, List.of("minted"));
long draftDOIsCount = mintedDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.MINTED)).count();
Assert.assertEquals(mintedDoiStatusList.size(), draftDOIsCount);

// verify owned DOI in search
Map<String, Object> ownedDOIsSearchFilter = new HashMap<>();
ownedDOIsSearchFilter.put("role", "owner");
List<DoiStatus> ownedDOIsStatusList = searchDOIStatuses(ownedDOIsSearchFilter);
List<DoiStatus> ownedDOIsStatusList = searchDOIStatuses("owner", null);
Optional<DoiStatus> mintedDoiStatus = ownedDOIsStatusList.stream().filter(e -> getDOISuffix(e.getIdentifier().getValue()).equals(doiSuffix)).findFirst();
Assert.assertTrue(mintedDoiStatus.isEmpty());
return doiSuffix;
Expand All @@ -168,9 +168,7 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {
log.debug("readWriteSubject - get All DOI Status success with the recently minted DOI : " + doiSuffix);

// verify minted DOI status in search
Map<String, Object> mintedSearchFilter = new HashMap<>();
mintedSearchFilter.put("status", "minted");
List<DoiStatus> mintedDoiStatusList = searchDOIStatuses(mintedSearchFilter);
List<DoiStatus> mintedDoiStatusList = searchDOIStatuses(null, List.of("minted"));
long mintedDOIsCount = mintedDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.MINTED)).count();
Assert.assertEquals(mintedDoiStatusList.size(), mintedDOIsCount);
return doiSuffix;
Expand Down Expand Up @@ -274,16 +272,12 @@ public void testPublisherAsDOIOwnerForMintAction() throws PrivilegedActionExcept
log.debug("publisherSubject - DOI's DRAFT status verified: " + doiID);

// verify DOI in search as an owner
Map<String, Object> ownedDOIsSearchFilter = new HashMap<>();
ownedDOIsSearchFilter.put("role", "owner");
List<DoiStatus> ownedDOIsStatusList = searchDOIStatuses(ownedDOIsSearchFilter);
List<DoiStatus> ownedDOIsStatusList = searchDOIStatuses("owner", null);
Optional<DoiStatus> mintedDoiStatus = ownedDOIsStatusList.stream().filter(e -> getDOISuffix(e.getIdentifier().getValue()).equals(doiID)).findFirst();
Assert.assertTrue(mintedDoiStatus.isPresent());

// verify DOI in search as publisher
Map<String, Object> publisherDOIsSearchFilter = new HashMap<>();
publisherDOIsSearchFilter.put("role", "publisher");
List<DoiStatus> filteredDOIStatusList = searchDOIStatuses(publisherDOIsSearchFilter);
List<DoiStatus> filteredDOIStatusList = searchDOIStatuses("publisher", null);
Optional<DoiStatus> optionalDoiStatus = filteredDOIStatusList.stream().filter(e -> getDOISuffix(e.getIdentifier().getValue()).equals(doiID)).findFirst();
Assert.assertTrue(optionalDoiStatus.isEmpty());
return doiID;
Expand Down Expand Up @@ -355,10 +349,7 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing

Subject.doAs(readWriteSubject, (PrivilegedExceptionAction<String>) () -> {
// fetch all draft DOIs
Map<String, Object> searchFilter = new HashMap<>();
searchFilter.put("status", "in progress");

List<DoiStatus> draftDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> draftDoiStatusList = searchDOIStatuses(null, List.of("in progress"));

long draftDOIsCount = draftDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.DRAFT)).count();
Assert.assertEquals(draftDoiStatusList.size(), draftDOIsCount);
Expand All @@ -370,10 +361,7 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing
Assert.assertFalse(nonDraftDOIStatus.isPresent());

// fetch all minted DOIs
searchFilter = new HashMap<>();
searchFilter.put("status", "minted");

List<DoiStatus> publishedDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> publishedDoiStatusList = searchDOIStatuses(null, List.of("minted"));

long publishedDOIsCount = publishedDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.MINTED)).count();
Assert.assertEquals(publishedDoiStatusList.size(), publishedDOIsCount);
Expand All @@ -385,30 +373,21 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing
Assert.assertFalse(nonMintedDOIStatus.isPresent());

// fetch all Own DOIs
searchFilter = new HashMap<>();
searchFilter.put("role", "owner");

List<DoiStatus> ownDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> ownDoiStatusList = searchDOIStatuses("owner", null);

long ownDOIsCount = ownDoiStatusList.stream().filter(doiStatus -> getDOISuffix(doiStatus.getIdentifier().getValue()).equals(mintedDOIId) || getDOISuffix(doiStatus.getIdentifier().getValue()).equals(draftDOIId)).count();
Assert.assertEquals(2, ownDOIsCount); // both should be present

// fetch all DOIs which user has access to publish
searchFilter = new HashMap<>();
searchFilter.put("role", "publisher");

List<DoiStatus> publisherDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> publisherDoiStatusList = searchDOIStatuses("publisher", null);
Assert.assertTrue(publisherDoiStatusList.isEmpty());
return null;
});

Subject.doAs(publisherSubject, (PrivilegedExceptionAction<String>) () -> {

// fetch all draft DOIs
Map<String, Object> searchFilter = new HashMap<>();
searchFilter.put("status", "in progress");

List<DoiStatus> draftDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> draftDoiStatusList = searchDOIStatuses(null, List.of("in progress"));

long draftDOIsCount = draftDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.DRAFT)).count();
Assert.assertEquals(draftDoiStatusList.size(), draftDOIsCount);
Expand All @@ -417,10 +396,7 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing
Assert.assertEquals(2, draftDOIsCount);

// fetch all Own DOIs
searchFilter = new HashMap<>();
searchFilter.put("role", "owner");

List<DoiStatus> ownDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> ownDoiStatusList = searchDOIStatuses("owner", null);

long ownDOIsCount = ownDoiStatusList.stream().filter(doiStatus -> getDOISuffix(doiStatus.getIdentifier().getValue()).equals(publisherOwnedDOIId) || getDOISuffix(doiStatus.getIdentifier().getValue()).equals(draftDOIId)).count();
Assert.assertEquals(1, ownDOIsCount);
Expand All @@ -432,10 +408,7 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing
Assert.assertFalse(notOwnedDOIStatus.isPresent());

// fetch all DOIs which user has access to publish
searchFilter = new HashMap<>();
searchFilter.put("role", "publisher");

List<DoiStatus> publisherDoiStatusList = searchDOIStatuses(searchFilter);
List<DoiStatus> publisherDoiStatusList = searchDOIStatuses("publisher", null);

long publisherDOIsCount = publisherDoiStatusList.stream().filter(doiStatus -> getDOISuffix(doiStatus.getIdentifier().getValue()).equals(publisherOwnedDOIId) || getDOISuffix(doiStatus.getIdentifier().getValue()).equals(draftDOIId)).count();
Assert.assertEquals(1, publisherDOIsCount);
Expand Down Expand Up @@ -506,18 +479,32 @@ private static List<DoiStatus> getDoiStatuses() throws DoiParsingException, IOEx
return reader.read(new StringReader(bos.toString(StandardCharsets.UTF_8)));
}

public List<DoiStatus> searchDOIStatuses(Map<String, Object> params) throws IOException, DoiParsingException {
URL doiURL = new URL(String.format("%s", doiSearchServiceURL));
ByteArrayOutputStream bos = new ByteArrayOutputStream();

HttpPost post = new HttpPost(doiURL, params, bos);
public List<DoiStatus> searchDOIStatuses(String role, List<String> status)
throws IOException, DoiParsingException {
JSONObject json = new JSONObject();
if (role != null) {
json.put("role", role);
}
if (status != null && !status.isEmpty()) {
JSONArray statusArray = new JSONArray();
for (String s : status) {
statusArray.put(s);
}
json.put("status", statusArray);
}
String jsonString = json.toString();
log.debug("Searching DOI statuses with filter: " + jsonString);

FileContent content = new FileContent(json.toString().getBytes(StandardCharsets.UTF_8),
TestUtil.JSON_CONTENT_TYPE);
HttpPost post = new HttpPost(doiSearchServiceURL, content, false);
post.run();

Assert.assertNull(post.getThrowable());
Assert.assertEquals(200, post.getResponseCode());

InputStream in = post.getInputStream();
DoiStatusListXmlReader reader = new DoiStatusListXmlReader();
return reader.read(new StringReader(bos.toString(StandardCharsets.UTF_8)));
return reader.read(new InputStreamReader(in, StandardCharsets.UTF_8));
}

}
2 changes: 2 additions & 0 deletions doi/src/intTest/java/ca/nrc/cadc/doi/TestUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ public class TestUtil {
Log4jInit.setLevel("ca.nrc.cadc.doi", Level.INFO);
}

static String JSON_CONTENT_TYPE = "application/json";

// ADMIN_CERT is the owner of the test DOI
static String ADMIN_CERT = "doi-admin.pem";

Expand Down
11 changes: 7 additions & 4 deletions doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@
import ca.nrc.cadc.cred.client.CredUtil;
import ca.nrc.cadc.doi.datacite.Identifier;
import ca.nrc.cadc.doi.datacite.Title;
import ca.nrc.cadc.doi.search.DoiSearchFilter;
import ca.nrc.cadc.doi.status.DoiStatus;
import ca.nrc.cadc.doi.status.DoiStatusListJsonWriter;
import ca.nrc.cadc.doi.status.DoiStatusListXmlWriter;
Expand Down Expand Up @@ -300,7 +299,9 @@ protected List<Node> getAccessibleDOIs() throws Exception {
}

Long requesterUserId = Long.parseLong(requester.getValue());
if (callersNumericId.equals(requesterUserId) || isCallingUserDOIAdmin() || isCallingUserPublisher()) {
if (callersNumericId.equals(requesterUserId)
|| isCallingUserDOIAdmin()
|| isCallingUserPublisher()) {
ownedNodes.add(childNode);
}
} catch (NumberFormatException e) {
Expand Down Expand Up @@ -349,7 +350,8 @@ protected void getStatusList(List<Node> nodes) throws Exception {
}
}

protected DoiStatus getDoiStatus(String doiSuffixString, ContainerNode doiContainerNode, boolean authorize) throws Exception {
protected DoiStatus getDoiStatus(String doiSuffixString, ContainerNode doiContainerNode, boolean authorize)
throws Exception {
DoiStatus doiStatus;
if (!authorize || vospaceDoiClient.hasCallerReadDOIAccess(doiContainerNode, getAdminSubject())) {
// get status
Expand Down Expand Up @@ -386,7 +388,8 @@ protected DoiStatus getDoiStatus(String doiSuffixString, ContainerNode doiContai
return doiStatus;
}

protected String updateMintingStatus(final ContainerNode doiContainerNode, final String status) throws Exception {
protected String updateMintingStatus(final ContainerNode doiContainerNode, final String status)
throws Exception {
return (String) Subject.doAs(getAdminSubject(), (PrivilegedExceptionAction<Object>) () -> {
// update status based on the result of the minting service
String localStatus = status;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ public class DoiInlineContentHandler implements InlineContentHandler {

public static final String CONTENT_KEY = "DOImetadata";

public DoiInlineContentHandler() {}
public DoiInlineContentHandler() {
}

/**
* Receive data.
Expand Down
Loading