/**
* '$RCSfile$'
* Copyright: 2010 Regents of the University of California and the
* National Center for Ecological Analysis and Synthesis
* Purpose: To test the Access Controls in metacat by JUnit
*
* '$Author$'
* '$Date$'
* '$Revision$'
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.ucsb.nceas.metacat.dataone;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.io.IOUtils;
import org.dataone.client.v2.formats.ObjectFormatCache;
import org.dataone.configuration.Settings;
import org.dataone.service.exceptions.InvalidRequest;
import org.dataone.service.types.v1.AccessPolicy;
import org.dataone.service.types.v1.AccessRule;
import org.dataone.service.types.v1.Identifier;
import org.dataone.service.types.v1.Permission;
import org.dataone.service.types.v1.Session;
import org.dataone.service.types.v1.Subject;
import org.dataone.service.types.v2.Node;
import org.dataone.service.types.v2.SystemMetadata;
import org.junit.After;
import org.junit.Before;
import edu.ucsb.nceas.ezid.EZIDService;
import edu.ucsb.nceas.ezid.profile.DataCiteProfile;
import edu.ucsb.nceas.ezid.profile.InternalProfile;
import edu.ucsb.nceas.metacat.doi.datacite.EML2DataCiteFactoryTest;
import edu.ucsb.nceas.metacat.properties.PropertyService;
/**
* A JUnit test to exercise the DOI registration for content added
* via the DataONE MN API
*
* @author leinfelder
*
*/
public class RegisterDOITest extends D1NodeServiceTest {
private static final String EMLFILEPATH = "test/tao.14563.1.xml";
public static final String creatorsStr = "onlySurNameNational Center for Ecological Analysis and SynthesisSmith, JohnKing, WendyUniversity of California Santa Barbara";
/**
* Set up the test fixtures
*
* @throws Exception
*/
@Before
public void setUp() throws Exception {
super.setUp();
// set up the configuration for d1client
Settings.getConfiguration().setProperty("D1Client.cnClassName",
MockCNode.class.getName());
}
/**
* Remove the test fixtures
*/
@After
public void tearDown() {
}
/**
* Build the test suite
*
* @return
*/
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new RegisterDOITest("initialize"));
// DOI registration test
suite.addTest(new RegisterDOITest("testCreateDOI"));
suite.addTest(new RegisterDOITest("testMintAndCreateDOI"));
suite.addTest(new RegisterDOITest("testMintAndCreateForEML"));
// publish
suite.addTest(new RegisterDOITest("testPublishDOI"));
// test DOIs in the create method
suite.addTest(new RegisterDOITest("tesCreateDOIinSid"));
suite.addTest(new RegisterDOITest("testUpdateAccessPolicyOnDOIObject"));
suite.addTest(new RegisterDOITest("testUpdateAccessPolicyOnPrivateDOIObject"));
return suite;
}
/**
* Constructor for the tests
*
* @param name
* - the name of the test
*/
public RegisterDOITest(String name) {
super(name);
}
/**
* Initial blank test
*/
public void initialize() {
assertTrue(1 == 1);
}
/**
* constructs a "fake" session with a test subject
* @return
*/
@Override
public Session getTestSession() throws Exception {
Session session = new Session();
Subject subject = new Subject();
subject.setValue("CN=Benjamin Leinfelder A515,O=University of Chicago,C=US,DC=cilogon,DC=org");
session.setSubject(subject);
return session;
}
public void testMintAndCreateDOI() {
printTestHeader("testMintAndCreateDOI");
testMintAndCreateDOI(null);
}
public void testMintAndCreateForEML() {
printTestHeader("testMintAndCreateForEML");
String emlFile = EMLFILEPATH;
InputStream content = null;
try {
content = new FileInputStream(emlFile);
testMintAndCreateDOI(content);
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
}
/**
* Test object creation
*/
private void testMintAndCreateDOI(InputStream inputStream) {
printTestHeader("testMintAndCreateDOI - common");
try {
// get ezid config properties
String ezidUsername = PropertyService.getProperty("guid.ezid.username");
String ezidPassword = PropertyService.getProperty("guid.ezid.password");
String ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl");
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
// Mint a DOI
Session session = getTestSession();
Identifier guid = MNodeService.getInstance(request).generateIdentifier(session, "DOI", null);
// check that EZID knows about it
HashMap metadata = null;
int count = 0;
do {
try {
metadata = ezid.getMetadata(guid.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
assertNotNull(metadata);
// add the actual object for the newly-minted DOI
SystemMetadata sysmeta = null;
InputStream object = null;
boolean isMetadata = false;
if (inputStream != null) {
sysmeta = createSystemMetadata(guid, session.getSubject(), inputStream);
inputStream.close();
object = new FileInputStream(EMLFILEPATH);
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
isMetadata = true;
} else {
object = new ByteArrayInputStream("test".getBytes("UTF-8"));
sysmeta = createSystemMetadata(guid, session.getSubject(), object);
object = new ByteArrayInputStream("test".getBytes("UTF-8"));
}
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertEquals(guid.getValue(), pid.getValue());
// check for the metadata for title element
count = 0;
metadata = null;
do {
try {
metadata = ezid.getMetadata(pid.getValue());
// check if the update thread finished yet, otherwise try again
if (metadata != null && isMetadata) {
String registeredTarget = metadata.get(InternalProfile.TARGET.toString());
if (!registeredTarget.endsWith("/#view/" + pid.getValue())) {
// try fetching it again
metadata = null;
}
}
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
assertNotNull(metadata);
assertTrue(metadata.containsKey(DataCiteProfile.TITLE.toString()));
// check that the target URI was updated
if (isMetadata) {
String registeredTarget = metadata.get(InternalProfile.TARGET.toString());
assertTrue(registeredTarget.endsWith("/#view/" + pid.getValue()));
}
if (isMetadata) {
String creator = metadata.get(DataCiteProfile.CREATOR.toString());
//assertTrue(creator.equals("John Doe;NCEAS"));
}
System.out.println("tested with DOI: " + pid.getValue());
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected error: " + e.getMessage());
}
}
/**
* Test object creation
*/
public void testCreateDOI() {
printTestHeader("testCreateDOI");
try {
// get ezid config properties
String shoulder = PropertyService.getProperty("guid.ezid.doishoulder.1");
String ezidUsername = PropertyService.getProperty("guid.ezid.username");
String ezidPassword = PropertyService.getProperty("guid.ezid.password");
String ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl");
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue(shoulder + "/testCreateDOI." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream( "test".getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertEquals(guid.getValue(), pid.getValue());
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(pid.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
assertNotNull(metadata);
assertTrue(metadata.containsKey(DOIService.DATACITE));
String datacite = metadata.get(DOIService.DATACITE);
System.out.println(""+datacite);
assertTrue(datacite.contains("CN=Benjamin Leinfelder A515,O=University of Chicago,C=US,DC=cilogon,DC=org"));
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected error: " + e.getMessage());
}
}
/**
* Test object publishing
*/
public void testPublishDOI() {
printTestHeader("testPublishDOI");
try {
// get ezid config properties
String ezidUsername = PropertyService.getProperty("guid.ezid.username");
String ezidPassword = PropertyService.getProperty("guid.ezid.password");
String ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl");
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testPublishDOI." + System.currentTimeMillis());
// use EML to test
// TODO: include an ORE to really exercise it
String emlFile = "test/eml-datacite.xml";
InputStream content = null;
try {
content = new FileInputStream(emlFile);
// create the initial version without DOI
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.0.1").getFormatId());
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta);
content.close();
assertEquals(guid.getValue(), pid.getValue());
Thread.sleep(5000);
// now publish it
Identifier publishedIdentifier = MNodeService.getInstance(request).publish(session, pid);
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(publishedIdentifier.getValue());
} catch (Exception e) {
Thread.sleep(2000);
}
count++;
} while (metadata == null && count < 20);
assertNotNull(metadata);
String result = metadata.get(DOIService.DATACITE);
System.out.println("result is\n"+result);
Node node = MNodeService.getInstance(null).getCapabilities();
String nodeName = node.getName();
String id = publishedIdentifier.getValue();
id = id.replaceFirst("doi:", "");
//assertTrue(result.contains(EML2DataCiteFactoryTest.section));
System.out.println(id+EML2DataCiteFactoryTest.section1);
assertTrue(result.contains(id+EML2DataCiteFactoryTest.section1));
assertTrue(result.contains(EML2DataCiteFactoryTest.section2));
assertTrue(result.contains(EML2DataCiteFactoryTest.section3));
assertTrue(result.contains(EML2DataCiteFactoryTest.section4 + EML2DataCiteFactoryTest.section41));
assertTrue(result.contains(EML2DataCiteFactoryTest.section5));
assertTrue(result.contains(EML2DataCiteFactoryTest.section6));
assertTrue(result.contains(EML2DataCiteFactoryTest.section7));
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected error: " + e.getMessage());
}
}
/**
* Test the cases that an DOI is in the SID field.
*/
public void tesCreateDOIinSid() {
printTestHeader("tesCreateDOIinSid");
String scheme = "DOI";
try {
// get ezid config properties
String ezidUsername = PropertyService.getProperty("guid.ezid.username");
String ezidPassword = PropertyService.getProperty("guid.ezid.password");
String ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl");
Session session = getTestSession();
String emlFile = "test/eml-multiple-creators.xml";
InputStream content = null;
//Test the case that the identifier is a doi but no sid.
try {
Identifier publishedIdentifier = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the identifier is "+publishedIdentifier.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(publishedIdentifier, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, publishedIdentifier, content, sysmeta);
content.close();
assertEquals(publishedIdentifier.getValue(), pid.getValue());
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(publishedIdentifier.getValue());
} catch (Exception e) {
Thread.sleep(2000);
}
count++;
} while (metadata == null && count < 10);
System.out.println("The doi on the identifier is "+publishedIdentifier.getValue());
assertNotNull(metadata);
String result = metadata.get(DOIService.DATACITE);
System.out.println("the result is \n"+result);
assertTrue(result.contains("Test EML package - public-readable from morpho"));
assertTrue(result.contains(creatorsStr));
//System.out.println("publisher =======is"+publisher);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
String year = sdf.format(sysmeta.getDateUploaded());
assertTrue(result.contains(year));
//System.out.println("publishing year =======is"+publishingYear);
//System.out.println("resource type =======is"+resourceType);
assertTrue(result.contains("Dataset"));
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
//Test the case that the identifier is non-doi but the sid is an doi
try {
Identifier guid = new Identifier();
guid.setValue("tesCreateDOIinSid." + System.currentTimeMillis());
System.out.println("The identifier is "+guid.getValue());
Identifier publishedIdentifier = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the SID field is "+publishedIdentifier.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
sysmeta.setSeriesId(publishedIdentifier);
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta);
content.close();
assertEquals(guid.getValue(), pid.getValue());
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(publishedIdentifier.getValue());
} catch (Exception e) {
Thread.sleep(2000);
}
count++;
} while (metadata == null && count < 10);
assertNotNull(metadata);
String result = metadata.get(DOIService.DATACITE);
System.out.println("the result is \n"+result);
assertTrue(result.contains("Test EML package - public-readable from morpho"));
assertTrue(result.contains(creatorsStr));
//System.out.println("publisher =======is"+publisher);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
String year = sdf.format(sysmeta.getDateUploaded());
assertTrue(result.contains(year));
//System.out.println("publishing year =======is"+publishingYear);
//System.out.println("resource type =======is"+resourceType);
assertTrue(result.contains("Dataset"));
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
//Test the case that both identifier and sid are dois
try {
Identifier publishedIdentifier = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi in the identifier field is "+publishedIdentifier.getValue());
Identifier doiSid = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi in the sid field is "+doiSid.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(publishedIdentifier, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
sysmeta.setSeriesId(doiSid);
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, publishedIdentifier, content, sysmeta);
content.close();
assertEquals(publishedIdentifier.getValue(), pid.getValue());
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
//query the identifier
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(publishedIdentifier.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
assertNotNull(metadata);
String result = metadata.get(DOIService.DATACITE);
System.out.println("the result is \n"+result);
assertTrue(result.contains("Test EML package - public-readable from morpho"));
assertTrue(result.contains(creatorsStr));
//System.out.println("publisher =======is"+publisher);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
String year = sdf.format(sysmeta.getDateUploaded());
assertTrue(result.contains(year));
//System.out.println("publishing year =======is"+publishingYear);
//System.out.println("resource type =======is"+resourceType);
assertTrue(result.contains("Dataset"));
//query the sid
HashMap metadata2 = null;
do {
try {
metadata2 = ezid.getMetadata(doiSid.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata2 == null && count < 10);
assertNotNull(metadata2);
result = metadata.get(DOIService.DATACITE);
System.out.println("the result is \n"+result);
assertTrue(result.contains("Test EML package - public-readable from morpho"));
assertTrue(result.contains(creatorsStr));
//System.out.println("publisher =======is"+publisher);
sdf = new SimpleDateFormat("yyyy");
year = sdf.format(sysmeta.getDateUploaded());
assertTrue(result.contains(year));
//System.out.println("publishing year =======is"+publishingYear);
//System.out.println("resource type =======is"+resourceType);
assertTrue(result.contains("Dataset"));
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
//Test the case that either identifier or sid is a doi
try {
Identifier guid = new Identifier();
guid.setValue("tesCreateDOIinSid." + System.currentTimeMillis());
System.out.println("The identifier (non-doi) is "+guid.getValue());
Identifier sid = new Identifier();
sid.setValue("tesCreateDOIinSid-2." + System.currentTimeMillis());
System.out.println("The sid field (non-doi) is "+sid.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
sysmeta.setSeriesId(sid);
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta);
content.close();
assertEquals(guid.getValue(), pid.getValue());
// check for the metadata explicitly, using ezid service
EZIDService ezid = new EZIDService(ezidServiceBaseUrl);
ezid.login(ezidUsername, ezidPassword);
int count = 0;
HashMap metadata = null;
do {
try {
metadata = ezid.getMetadata(guid.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
System.out.println("the metadata is "+metadata);
assertNull(metadata);
do {
try {
metadata = ezid.getMetadata(sid.getValue());
} catch (Exception e) {
Thread.sleep(1000);
}
count++;
} while (metadata == null && count < 10);
assertNull(metadata);
content.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
IOUtils.closeQuietly(content);
}
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected error: " + e.getMessage());
}
}
/**
* Test change the access policy on an DOI object
* @throws Exception
*/
public void testUpdateAccessPolicyOnDOIObject() throws Exception {
printTestHeader("testUpdateAccessPolicyOnDOIObject");
String user = "uid=test,o=nceas";
//create an doi object
String scheme = "DOI";
Session session = getTestSession();
String emlFile = "test/eml-multiple-creators.xml";
InputStream content = null;
Identifier publishedIdentifier = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the identifier is "+publishedIdentifier.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(publishedIdentifier, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, publishedIdentifier, content, sysmeta);
content.close();
assertEquals(publishedIdentifier.getValue(), pid.getValue());
SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, publishedIdentifier);
//It should succeed to add a new access policy to the system metadata
Subject subject = new Subject();
subject.setValue(user);
AccessRule rule = new AccessRule();
rule.addSubject(subject);
rule.addPermission(Permission.WRITE);
AccessPolicy access = meta.getAccessPolicy();
access.addAllow(rule);
meta.setAccessPolicy(access);
boolean success = MNodeService.getInstance(request).updateSystemMetadata(session, publishedIdentifier, meta);
assertTrue("The update should be successful since we don't restrict the access rules.", success);
meta = MNodeService.getInstance(request).getSystemMetadata(session, publishedIdentifier);
access = meta.getAccessPolicy();
boolean find = false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equals(user)) {
find = true;
break;
}
}
assertTrue("We should find the user "+user+" on the access rules.", find);
//It should fail to remove the allow rules for the public user.
AccessPolicy newAccess = new AccessPolicy();
for (AccessRule item : access.getAllowList()) {
//don't allow the access rules for the user public
if(item != null && item.getSubject(0) != null && !item.getSubject(0).getValue().equals("public")) {
newAccess.addAllow(item);
}
}
meta.setAccessPolicy(newAccess);
try {
MNodeService.getInstance(request).updateSystemMetadata(session, publishedIdentifier, meta);
fail("We shouldn't get here since removing public-read access rules for a DOI object should fail.");
} catch (InvalidRequest e) {
assertTrue(e.getMessage().contains(publishedIdentifier.getValue()));
}
//test the doi on sid field
Identifier guid = new Identifier();
guid.setValue("testUpdateAccessPolicyOnDOIObject." + System.currentTimeMillis());
System.out.println("The identifier is "+guid.getValue());
Identifier sid = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the sid is "+sid.getValue());
content = new FileInputStream(emlFile);
sysmeta = createSystemMetadata(guid, session.getSubject(), content);
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
sysmeta.setSeriesId(sid);
content = new FileInputStream(emlFile);
pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta);
content.close();
assertEquals(guid.getValue(), pid.getValue());
meta = MNodeService.getInstance(request).getSystemMetadata(session, guid);
//It should succeed to add a new access policy to the system metadata
subject = new Subject();
subject.setValue(user);
rule = new AccessRule();
rule.addSubject(subject);
rule.addPermission(Permission.WRITE);
access = meta.getAccessPolicy();
access.addAllow(rule);
meta.setAccessPolicy(access);
success = MNodeService.getInstance(request).updateSystemMetadata(session, guid, meta);
assertTrue("The update should be successful since we don't restrict the access rules.", success);
meta = MNodeService.getInstance(request).getSystemMetadata(session, guid);
access = meta.getAccessPolicy();
boolean found = false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equals(user)) {
found = true;
break;
}
}
assertTrue("We should find the user "+user+" on the access rules.", found);
//It should fail to remove the allow rules for the public user.
newAccess = new AccessPolicy();
for (AccessRule item : access.getAllowList()) {
//don't allow the access rules for the user public
if(item != null && item.getSubject(0) != null && !item.getSubject(0).getValue().equals("public")) {
newAccess.addAllow(item);
}
}
meta.setAccessPolicy(newAccess);
try {
MNodeService.getInstance(request).updateSystemMetadata(session, guid, meta);
fail("We shouldn't get here since removing public-read access rules for a DOI object should fail.");
} catch (InvalidRequest e) {
assertTrue(e.getMessage().contains(guid.getValue()));
assertTrue(e.getMessage().contains(sid.getValue()));
}
}
/**
* Test change the access policy on an DOI object which is not public readable
* @throws Exception
*/
public void testUpdateAccessPolicyOnPrivateDOIObject() throws Exception {
printTestHeader("testUpdateAccessPolicyOnPrivateDOIObject");
String user = "uid=test,o=nceas";
//create an doi object
String scheme = "DOI";
Session session = getTestSession();
String emlFile = "test/eml-multiple-creators.xml";
InputStream content = null;
Identifier publishedIdentifier = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the identifier is "+publishedIdentifier.getValue());
content = new FileInputStream(emlFile);
SystemMetadata sysmeta = createSystemMetadata(publishedIdentifier, session.getSubject(), content);
sysmeta.setAccessPolicy(new AccessPolicy()); //nobody can read it except the rights holder
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
content = new FileInputStream(emlFile);
Identifier pid = MNodeService.getInstance(request).create(session, publishedIdentifier, content, sysmeta);
content.close();
assertEquals(publishedIdentifier.getValue(), pid.getValue());
SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, publishedIdentifier);
//It should succeed to add a new access policy to the system metadata
Subject subject = new Subject();
subject.setValue(user);
AccessRule rule = new AccessRule();
rule.addSubject(subject);
rule.addPermission(Permission.WRITE);
AccessPolicy access = new AccessPolicy();
access.addAllow(rule);
meta.setAccessPolicy(access);
boolean success = MNodeService.getInstance(request).updateSystemMetadata(session, publishedIdentifier, meta);
assertTrue("The update should be successful even though there is no public readable rule on the new access policy since the old access policy is private.", success);
meta = MNodeService.getInstance(request).getSystemMetadata(session, publishedIdentifier);
access = meta.getAccessPolicy();
boolean find = false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equals(user)) {
find = true;
break;
}
}
assertTrue("We should find the user "+user+" on the access rules.", find);
boolean findPublic= false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equalsIgnoreCase("public")) {
findPublic = true;
break;
}
}
assertFalse("We should not find the public user on the access rules.", findPublic);
//System.out.println("The identifier is ========================================="+publishedIdentifier.getValue());
//test the doi on sid field
Identifier guid = new Identifier();
guid.setValue("testUpdateAccessPolicyOnDOIObject." + System.currentTimeMillis());
System.out.println("The identifier is "+guid.getValue());
Identifier sid = MNodeService.getInstance(request).generateIdentifier(session, scheme, null);
System.out.println("The doi on the sid is "+sid.getValue());
content = new FileInputStream(emlFile);
sysmeta = createSystemMetadata(guid, session.getSubject(), content);
sysmeta.setAccessPolicy(new AccessPolicy());
content.close();
sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.0").getFormatId());
sysmeta.setSeriesId(sid);
content = new FileInputStream(emlFile);
pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta);
content.close();
assertEquals(guid.getValue(), pid.getValue());
meta = MNodeService.getInstance(request).getSystemMetadata(session, guid);
//It should succeed to add a new access policy to the system metadata
subject = new Subject();
subject.setValue(user);
rule = new AccessRule();
rule.addSubject(subject);
rule.addPermission(Permission.WRITE);
access = new AccessPolicy();
access.addAllow(rule);
meta.setAccessPolicy(access);
success = MNodeService.getInstance(request).updateSystemMetadata(session, guid, meta);
assertTrue("he update should be successful even though there is no public readable rule on the new access policy since the old access policy is private.", success);
meta = MNodeService.getInstance(request).getSystemMetadata(session, guid);
access = meta.getAccessPolicy();
boolean found = false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equals(user)) {
found = true;
break;
}
}
assertTrue("We should find the user "+user+" on the access rules.", found);
findPublic= false;
for (AccessRule item : access.getAllowList()) {
if(item != null && item.getSubject(0) != null && item.getSubject(0).getValue().equalsIgnoreCase("public")) {
findPublic = true;
break;
}
}
assertFalse("We should not find the public user on the access rules.", findPublic);
//System.out.println("The identifier is ========================================="+guid.getValue());
}
}