/** * '$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 edu.ucsb.nceas.metacat.dataone.CNodeService; import edu.ucsb.nceas.metacat.dataone.MNodeService; import edu.ucsb.nceas.metacat.properties.SkinPropertyService; import edu.ucsb.nceas.metacat.service.ServiceService; import edu.ucsb.nceas.utilities.IOUtil; import gov.loc.repository.bagit.Bag; import gov.loc.repository.bagit.BagFactory; import gov.loc.repository.bagit.BagFile; import gov.loc.repository.bagit.Manifest; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.dataone.client.v2.formats.ObjectFormatCache; import org.dataone.configuration.Settings; import org.dataone.ore.ResourceMapFactory; import org.dataone.service.util.Constants; import org.dataone.service.util.TypeMarshaller; import org.dataone.service.exceptions.IdentifierNotUnique; import org.dataone.service.exceptions.InsufficientResources; import org.dataone.service.exceptions.InvalidRequest; import org.dataone.service.exceptions.InvalidSystemMetadata; import org.dataone.service.exceptions.InvalidToken; import org.dataone.service.exceptions.NotAuthorized; import org.dataone.service.exceptions.NotFound; import org.dataone.service.exceptions.NotImplemented; import org.dataone.service.exceptions.ServiceFailure; import org.dataone.service.exceptions.SynchronizationFailed; import org.dataone.service.exceptions.UnsupportedType; import org.dataone.service.types.v1.AccessPolicy; import org.dataone.service.types.v1.AccessRule; import org.dataone.service.types.v1.Checksum; import org.dataone.service.types.v1.DescribeResponse; import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v2.Log; import org.dataone.service.types.v2.Node; import org.dataone.service.types.v2.OptionList; import org.dataone.service.types.v1.NodeReference; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.Permission; import org.dataone.service.types.v1.Person; import org.dataone.service.types.v1.Session; import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.SubjectInfo; import org.dataone.service.types.v1.util.ChecksumUtil; import org.dataone.service.types.v2.SystemMetadata; import org.dspace.foresite.ResourceMap; import org.jibx.runtime.JiBXException; import org.junit.After; import org.junit.Before; /** * A JUnit test to exercise the Metacat Member Node service implementation. * This also tests a few of the D1NodeService superclass methods * * @author cjones * */ public class MNodeServiceTest extends D1NodeServiceTest { private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml"; /** * 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 MNodeServiceTest("initialize")); // MNStorage tests suite.addTest(new MNodeServiceTest("testCreate")); suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier")); suite.addTest(new MNodeServiceTest("testUpdate")); suite.addTest(new MNodeServiceTest("testUpdateSystemMetadata")); suite.addTest(new MNodeServiceTest("testUpdateObsoletesAndObsoletedBy")); suite.addTest(new MNodeServiceTest("testArchive")); suite.addTest(new MNodeServiceTest("testUpdateSciMetadata")); // this requires MN certificate suite.addTest(new MNodeServiceTest("testDelete")); // MNRead tests suite.addTest(new MNodeServiceTest("testGet")); suite.addTest(new MNodeServiceTest("testGetChecksum")); suite.addTest(new MNodeServiceTest("testGetSystemMetadata")); suite.addTest(new MNodeServiceTest("testDescribe")); suite.addTest(new MNodeServiceTest("testListObjects")); suite.addTest(new MNodeServiceTest("testGetSID")); // this requires CN certificate suite.addTest(new MNodeServiceTest("testSynchronizationFailed")); // MNCore tests suite.addTest(new MNodeServiceTest("testPing")); suite.addTest(new MNodeServiceTest("testGetLogRecords")); suite.addTest(new MNodeServiceTest("testGetCapabilities")); // MNAuthorization tests suite.addTest(new MNodeServiceTest("testIsAuthorized")); suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized")); suite.addTest(new MNodeServiceTest("testSetAccessPolicy")); // MNreplication tests suite.addTest(new MNodeServiceTest("testReplicate")); // MN packaging tests suite.addTest(new MNodeServiceTest("testGetPackage")); suite.addTest(new MNodeServiceTest("testGetOREPackage")); suite.addTest(new MNodeServiceTest("testReadDeletedObject")); suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding")); suite.addTest(new MNodeServiceTest("testListViews")); return suite; } /** * Constructor for the tests * * @param name - the name of the test */ public MNodeServiceTest(String name) { super(name); } /** * Initial blank test */ public void initialize() { assertTrue(1 == 1); } /** * Test getting a known object */ public void testGet() { printTestHeader("testGet"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testGet." + 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); InputStream result = MNodeService.getInstance(request).get(session, guid); // go back to beginning of original stream object.reset(); // check assertTrue(object.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, object)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotFound e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test getting the system metadata of an object */ public void testGetSystemMetadata() { printTestHeader("testGetSystemMetadata"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testGetSystemMetadata." + 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); SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid); assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue()); assertEquals(newsysmeta.getSeriesId(), null); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotFound e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test object creation */ public void testCreate() { printTestHeader("testCreate"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testCreate." + 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()); Thread.sleep(1000); try { Identifier guid2 = new Identifier(); guid2.setValue("testCreate." + System.currentTimeMillis()); SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object); sysmeta2.setSeriesId(guid); MNodeService.getInstance(request).create(session, guid2, object, sysmeta2); fail("It should fail since the system metadata using an existing id as the sid"); } catch (InvalidSystemMetadata ee) { } Thread.sleep(1000); try { Identifier guid3 = new Identifier(); guid3.setValue("testCreate." + System.currentTimeMillis()); SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object); sysmeta3.setSeriesId(guid3); MNodeService.getInstance(request).create(session, guid3, object, sysmeta3); fail("It should fail since the system metadata using the pid as the sid"); } catch (InvalidSystemMetadata ee) { } } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * test object deletion */ public void testDelete() { printTestHeader("testDelete"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testDelete." + 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); // use MN admin to delete session = getMNSession(); Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid); assertEquals(pid.getValue(), deletedPid.getValue()); // check that we cannot get the object session = getTestSession(); InputStream deletedObject = null; try { deletedObject = MNodeService.getInstance(request).get(session, deletedPid); } catch (NotFound nf) { // this is expected } assertNull(deletedObject); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } public void testArchive() throws Exception { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testUpdate." + 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); MNodeService.getInstance(request).archive(session, guid); SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(result.getArchived()); System.out.println("the identifier is ==================="+pid.getValue()); } /** * Test object updating */ public void testUpdate() { printTestHeader("testUpdate"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testUpdate." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object); Identifier newPid = new Identifier(); newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta); SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object); newSysMeta.setArchived(true); System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue()); // do the update Identifier updatedPid = MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta); // get the updated system metadata SystemMetadata updatedSysMeta = MNodeService.getInstance(request).getSystemMetadata(session, updatedPid); assertEquals(updatedPid.getValue(), newPid.getValue()); //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue())); //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue())); //try to update an archived object and need to get an exception Identifier newPid2 = new Identifier(); newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object); try { updatedPid = MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2); fail("update an archived object should get an invalid request exception"); } catch (Exception ee) { assertTrue( ee instanceof InvalidRequest); } //update the authoritative node on the existing pid (newPid) SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid); BigInteger version = meta.getSerialVersion(); version = version.add(BigInteger.ONE); newSysMeta.setSerialVersion(version); NodeReference newMN = new NodeReference(); newMN.setValue("urn:node:river1"); newSysMeta.setAuthoritativeMemberNode(newMN); newSysMeta.setArchived(false); MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta); try { updatedPid = MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2); fail("update an object on non-authoritatvie node should get anexception"); } catch (Exception ee) { assertTrue( ee instanceof NotAuthorized); } //cn can succeed even though it updates an object on the non-authoritative node. Session cnSession = getCNSession(); updatedPid = MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2); assertEquals(updatedPid.getValue(), newPid2.getValue()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test object updating */ public void testUpdateSciMetadata() { printTestHeader("testUpdate"); try { String st1="" +"" +"publicread" +"testtest" +"test"; Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testUpdate." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object); sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId()); MNodeService.getInstance(request).create(session, guid, object, sysmeta); String st2="" +"" +"publicread" +"test2test" +"test"; Identifier newPid = new Identifier(); newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original System.out.println("=================the pid is "+newPid.getValue()); object = new ByteArrayInputStream(st2.getBytes("UTF-8")); SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object); sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId()); sysmeta2.setObsoletes(guid); Checksum sum1= sysmeta2.getChecksum(); System.out.println("the checksum before sending is "+sum1.getValue()); object = new ByteArrayInputStream(st2.getBytes("UTF-8")); MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2); SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid); System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue()); assertTrue(meta.getChecksum().getValue().equals(sum1.getValue())); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * We currently expect this unit test to fail because it should rely on a different member node * to retrieve the object from. Currently it gets the object from itself and throws * and expected error for duplicate entry. * */ public void testReplicate() { printTestHeader("testReplicate"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testReplicate." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object); // save locally Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta); // get our node reference (attempting to replicate with self) NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier(); // attempt to replicate with ourselves -- this should fail! boolean result = false; try { result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode); } catch (Exception inu) { // we are expecting this to fail since we already have the doc result = true; } assertTrue(result); } catch (Exception e) { e.printStackTrace(); fail("Probably not yet implemented: " + e.getMessage()); } } /** * Test describing an object */ public void testDescribe() { printTestHeader("testDescribe"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testGetSystemMetadata." + 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); DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotFound e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test getting the checksum of an object */ public void testGetChecksum() { printTestHeader("testGetChecksum"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testGetChecksum." + 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); Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5"); assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotFound e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Testing listing objects on the Member Node */ public void testListObjects() { printTestHeader("testListObjects"); try { Session session = getTestSession(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date startTime = sdf.parse("2010-01-01"); Date endTime = new Date(); ObjectFormatIdentifier objectFormatId = null; boolean replicaStatus = false; int start = 0; int count = 1; // insert at least one object testCreate(); // now check that we have at least one ObjectList objectList = MNodeService.getInstance(request).listObjects(session, startTime, endTime, objectFormatId, null, replicaStatus, start, count); assertNotNull(objectList); assertTrue(objectList.getCount() == count); assertTrue(objectList.getStart() == 0); assertTrue(objectList.getTotal() >= 1); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } public void testGetCapabilities() { printTestHeader("testGetCapabilities"); try { Node node = MNodeService.getInstance(request).getCapabilities(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); TypeMarshaller.marshalTypeToOutputStream(node, baos); assertNotNull(node); // TODO: should probably test other parts of the node information } catch (JiBXException e) { e.printStackTrace(); fail("The node instance couldn't be parsed correctly:" + e.getMessage()); } catch (IOException e) { e.printStackTrace(); fail("The node instance couldn't be read correctly:" + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Probably not yet implemented: " + e.getMessage()); } } public void testPing() { try { Date mnDate = MNodeService.getInstance(request).ping(); assertTrue(mnDate != null); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } public void testSynchronizationFailed() { printTestHeader("testSynchronizationFailed"); try { Session session = getTestSession(); // create the object Identifier pid = new Identifier(); pid.setValue("testSynchronizationFailed." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object); Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta); assertEquals(retPid.getValue(), pid.getValue()); // pretend the sync failed, act as CN SynchronizationFailed syncFailed = new SynchronizationFailed("0000", "Testing Synch Failure"); syncFailed.setPid(pid.getValue()); session = getCNSession(); MNodeService.getInstance(request).synchronizationFailed(session, syncFailed ); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } public void testSystemMetadataChanged() { printTestHeader("testSystemMetadataChanged"); try { Session session = getTestSession(); // create the object Identifier pid = new Identifier(); pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis()); Identifier sid = new Identifier(); sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object); sysmeta.setSeriesId(sid); Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta); assertEquals(retPid.getValue(), pid.getValue()); // pretend the system metadata changed on the CN MNodeService.getInstance(request).systemMetadataChanged(session, retPid, 5000L, Calendar.getInstance().getTime()); MNodeService.getInstance(request).systemMetadataChanged(session, sid, 5000L, Calendar.getInstance().getTime()); edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, retPid, 5000L, Calendar.getInstance().getTime()); edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, sid, 5000L, Calendar.getInstance().getTime()); } catch (Exception e) { if (e instanceof NotAuthorized) { // only CN subjects can call this // TODO: use a CN certificate in the tests } else { fail("Unexpected error: " + e.getMessage()); } } } public void testGetLogRecords() { printTestHeader("testLogRecords"); try { Log log = null; Session session = getCNSession(); Date fromDate = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(fromDate); calendar.roll(Calendar.YEAR, false); fromDate = calendar.getTime(); Date toDate = new Date(); Event event = Event.CREATE; int start = 0; int count = 1; log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, event.xmlValue(), null, start, count); assertNotNull(log); assertTrue(log.getCount() == count); assertTrue(log.getStart() == start); assertTrue(log.getTotal() >= 1); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Testing setting access on a known object */ public void testSetAccessPolicy() { printTestHeader("testSetAccess"); //boolean accessWasSet = false; // //try { // // create an object to set access on // Session session = getTestSession(); // Identifier guid = new Identifier(); // guid.setValue("testSetAccess." + 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); // // set the access // AccessPolicy accessPolicy = new AccessPolicy(); // AccessRule allow = new AccessRule(); // allow.addPermission(Permission.WRITE); // Subject publicSubject = new Subject(); // publicSubject.setValue(Constants.SUBJECT_PUBLIC); // allow.addSubject(publicSubject); // accessPolicy.addAllow(allow); // // accessWasSet = // MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy); // assertTrue(accessWasSet); // // test that it is enforced // session.setSubject(publicSubject); // boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE); // assertTrue(isAuthorized); // //} catch (UnsupportedEncodingException e) { // e.printStackTrace(); // //} catch (InvalidToken e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (ServiceFailure e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (NotAuthorized e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (IdentifierNotUnique e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (UnsupportedType e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (InsufficientResources e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (InvalidSystemMetadata e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (NotImplemented e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (InvalidRequest e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (NotFound e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} catch (Exception e) { // e.printStackTrace(); // fail("Unexpected error: " + e.getMessage()); // //} } /** * Test if a subject is authorized to read a known object */ public void testIsAuthorized() { printTestHeader("testIsAuthorized"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testIsAuthorized." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object); //non-public readable AccessPolicy accessPolicy = new AccessPolicy(); AccessRule allow = new AccessRule(); allow.addPermission(Permission.READ); Subject subject = new Subject(); subject.setValue("cn=test2,dc=dataone,dc=org"); allow.addSubject(subject); accessPolicy.addAllow(allow); sysmeta.setAccessPolicy(accessPolicy); Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta); boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ); assertEquals(isAuthorized, true); isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE); assertEquals(isAuthorized, true); try { isAuthorized = MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ); fail("we can reach here"); } catch(NotAuthorized ee) { } Session session2= getAnotherSession(); isAuthorized = MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ); assertEquals(isAuthorized, true); try { isAuthorized = MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE); fail("we can reach here"); } catch(NotAuthorized ee) { } try { isAuthorized = MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION); fail("we can reach here"); } catch(NotAuthorized ee) { } } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidToken e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (ServiceFailure e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotAuthorized e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (IdentifierNotUnique e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (UnsupportedType e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InsufficientResources e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidSystemMetadata e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (NotImplemented e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (InvalidRequest e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test if node admin is authorized to read a known object */ public void testIsAdminAuthorized() { printTestHeader("testIsAdminAuthorized"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testIsAdminAuthorized." + 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); // test as public - read boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ); assertEquals(isAuthorized, true); // test as public - change perm isAuthorized = MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION); assertEquals(isAuthorized, false); //test write by another session Session session2 = getAnotherSession(); isAuthorized = MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE); assertEquals(isAuthorized, false); // test as admin isAuthorized = MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION); assertEquals(isAuthorized, true); // test as cn isAuthorized = MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION); assertEquals(isAuthorized, true); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } public void testIsEquivIdentityAuthorized() { printTestHeader("testIsEquivIdentityAuthorized"); try { Session session = new Session(); Subject s = new Subject(); s.setValue("cn=test,dc=dataone,dc=org"); session.setSubject(s); Identifier pid = new Identifier(); pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object); // reset the access policy to only allow 'self' read (no public) AccessPolicy ap = new AccessPolicy(); AccessRule ar = new AccessRule(); List sList = new ArrayList(); sList.add(session.getSubject()); ar.setSubjectList(sList); List permList = new ArrayList(); permList.add(Permission.CHANGE_PERMISSION); ar.setPermissionList(permList); ap.addAllow(ar); sysmeta.setAccessPolicy(ap); // save it Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta); assertEquals(pid.getValue(), retPid.getValue()); //check it against an equivalent identity not listed in the access policy session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org"); SubjectInfo subjectInfo = new SubjectInfo(); Person person = new Person(); person.setSubject(session.getSubject()); List givenNames = new ArrayList(); givenNames.add("New"); person.setGivenNameList(givenNames); person.setFamilyName("Subject"); // add equivalent identities List equivIdentities = new ArrayList(); Subject mappedSubject2 = new Subject(); mappedSubject2.setValue("cn=test2,dc=dataone,dc=org"); equivIdentities.add(mappedSubject2); Subject mappedSubject = new Subject(); mappedSubject.setValue("cn=test,dc=dataone,dc=org"); equivIdentities.add(mappedSubject); person.setEquivalentIdentityList(equivIdentities); List personList = new ArrayList(); personList.add(person); subjectInfo.setPersonList(personList); // update the session to include subject info with a mapped identity session.setSubjectInfo(subjectInfo); boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ); assertTrue(result); } catch (Exception e) { e.printStackTrace(); } } /** * Test object creation failure when there is a space in the identifier */ public void testCreateInvalidIdentifier() { printTestHeader("testCreateInvalidIdentifier"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testCreate withspace." + 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); fail("Should not be able to create with whitespace in indentifier"); } catch (InvalidRequest e) { // expect that this request fails assertTrue(true); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test getting a known object */ public void testGetPackage() { printTestHeader("testGetPackage"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testGetPackage." + 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); ObjectFormatIdentifier format = new ObjectFormatIdentifier(); format.setValue("application/bagit-097"); InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid); /*File bagFile = File.createTempFile("bagit.", ".zip"); IOUtils.copy(bagStream, new FileOutputStream(bagFile)); BagFactory bagFactory = new BagFactory(); Bag bag = bagFactory.createBag(bagFile); InputStream result = bag.getPayload().iterator().next().newInputStream(); // go back to beginning of original stream object.reset(); // check assertTrue(object.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, object)); // clean up bagFile.delete();*/ } catch(InvalidRequest e) { } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test getting a known object */ public void testGetOREPackage() { printTestHeader("testGetOREPackage"); try { // construct the ORE package Identifier resourceMapId = new Identifier(); //resourceMapId.setValue("doi://1234/AA/map.1.1"); resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis()); Identifier metadataId = new Identifier(); metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis()); List dataIds = new ArrayList(); Identifier dataId = new Identifier(); dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis()); Identifier dataId2 = new Identifier(); dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis()); dataIds.add(dataId); dataIds.add(dataId2); Map> idMap = new HashMap>(); idMap.put(metadataId, dataIds); ResourceMapFactory rmf = ResourceMapFactory.getInstance(); ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap); assertNotNull(resourceMap); String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap); assertNotNull(rdfXml); Session session = getTestSession(); InputStream object = null; SystemMetadata sysmeta = null; // save the data objects (data just contains their ID) InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8")); sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1); MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta); // second data file InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8")); sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2); MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta); // metadata file InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8")); sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject); MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta); // save the ORE object object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8")); sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object); sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId()); Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta); // get the package we uploaded ObjectFormatIdentifier format = new ObjectFormatIdentifier(); format.setValue("application/bagit-097"); InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid); File bagFile = File.createTempFile("bagit.", ".zip"); IOUtils.copy(bagStream, new FileOutputStream(bagFile)); BagFactory bagFactory = new BagFactory(); Bag bag = bagFactory.createBag(bagFile); Iterator manifestIter = bag.getTagManifests().iterator(); while (manifestIter.hasNext()) { String filepath = manifestIter.next().getFilepath(); BagFile entryFile = bag.getBagFile(filepath); InputStream result = entryFile.newInputStream(); // check ORE if (filepath.contains(resourceMapId.getValue())) { object.reset(); assertTrue(object.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, object)); } // check metadata if (filepath.contains(metadataId.getValue())) { metadataObject.reset(); assertTrue(metadataObject.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, metadataObject)); } if (filepath.contains(dataId.getValue())) { dataObject1.reset(); assertTrue(dataObject1.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, dataObject1)); } if (filepath.contains(dataId2.getValue())) { dataObject2.reset(); assertTrue(dataObject2.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, dataObject2)); } } // clean up bagFile.delete(); // test the ORE lookup List oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true); assertTrue(oreIds.contains(resourceMapId)); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test the extra "delete information" was added to the NotFoundException * if the object was delete in the following methods: * MN.get * MN.getSystemmetadata * MN.describe * MN.getChecksum * MN.getRelica */ public void testReadDeletedObject() { printTestHeader("testDelete"); try { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testDelete." + 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); Thread.sleep(3000); // use MN admin to delete session = getMNSession(); Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid); System.out.println("after deleting"); assertEquals(pid.getValue(), deletedPid.getValue()); // check that we cannot get the object session = getTestSession(); InputStream deletedObject = null; try { //System.out.println("before read ==============="); deletedObject = MNodeService.getInstance(request).get(session, deletedPid); //System.out.println("after read ==============="); } catch (NotFound nf) { assertTrue(nf.getMessage().contains("deleted")); } try { //System.out.println("before read ==============="); SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid); //System.out.println("after read ==============="); } catch (NotFound nf) { //System.out.println("the exception is "+nf.getMessage()); assertTrue(nf.getMessage().contains("deleted")); } try { //System.out.println("before read ==============="); DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid); //System.out.println("after read ==============="); } catch (NotFound nf) { //System.out.println("the exception is "+nf.getMessage()); assertTrue(nf.getMessage().contains("deleted")); } try { //System.out.println("before read ==============="); Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5"); //System.out.println("after read ==============="); } catch (NotFound nf) { //System.out.println("the exception 3 is "+nf.getMessage()); assertTrue(nf.getMessage().contains("deleted")); } try { //System.out.println("before read ==============="); boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ); //System.out.println("after read ==============="); } catch (NotFound nf) { System.out.println("the exception 4 is "+nf.getMessage()); assertTrue(nf.getMessage().contains("deleted")); } assertNull(deletedObject); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); fail("Unexpected error: " + e.getMessage()); } } /** * Test to create and update a metadata which xml declaration is ASCII, but actually * has some special charaters. The saved document should has the same bytes as the origianl. */ public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception { String algorithm = "md5"; Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue("testCreateAndUpdate." + System.currentTimeMillis()); InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath))); Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm); //System.out.println("the original checksum is "+orgChecksum.getValue()); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object); Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta); InputStream readResult = MNodeService.getInstance(request).get(session, pid); byte[] readBytes = IOUtils.toByteArray(readResult); Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm); //System.out.println("the read checksum1 is "+checksum1.getValue()); assertEquals(orgChecksum.getValue(), checksum1.getValue()); Identifier newPid = new Identifier(); newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object); // do the update Identifier updatedPid = MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta); InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid); byte[] readBytes2 = IOUtils.toByteArray(readResult2); Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm); assertEquals(orgChecksum.getValue(), checksum2.getValue()); //System.out.println("the read checksum2 is "+checksum2.getValue()); } /** * Test the method - get api for a speicified SID */ public void testGetSID() { String str1 = "object1"; String str2 = "object2"; String str3 = "object3"; Date fromDate = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(fromDate); calendar.roll(Calendar.YEAR, false); fromDate = calendar.getTime(); try { //insert test documents with a series id Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue(generateDocumentId()); InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1); String sid1= "sid."+System.nanoTime(); Identifier seriesId = new Identifier(); seriesId.setValue(sid1); System.out.println("the first sid is "+seriesId.getValue()); sysmeta.setSeriesId(seriesId); MNodeService.getInstance(request).create(session, guid, object1, sysmeta); System.out.println("the first pid is "+guid.getValue()); //test the get(pid) for v2 InputStream result = MNodeService.getInstance(request).get(session, guid); // go back to beginning of original stream object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result.available() > 0); assertTrue(IOUtils.contentEquals(result, object1)); // test the get(id) for v2 InputStream result1 = MNodeService.getInstance(request).get(session, seriesId); object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result1.available() > 0); assertTrue(IOUtils.contentEquals(result1, object1)); //test the get(pid) for v1 InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid); object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result2.available() > 0); assertTrue(IOUtils.contentEquals(result2, object1)); //test the get(sid) for v1 try { InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId); fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue())); assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue())); DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue()); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue())); assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, guid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue()); org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue())); try { org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId); fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch(NotFound nf2) { } describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue()); try { describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId); fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch(NotFound nf2) { } Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5"); assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97")); try { sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5"); fail("the getCheckSum shouldn't work for sid"); } catch(NotFound nf3) { } sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5"); assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97")); try { sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5"); fail("the getCheckSum shouldn't work for sid"); } catch(NotFound nf3) { } boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ); assertEquals(isAuthorized, true); isAuthorized = MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ); assertEquals(isAuthorized, true); isAuthorized = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ); assertEquals(isAuthorized, true); try { isAuthorized = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ); fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id"); } catch (NotFound e) { } Session cnsession = getCNSession(); Date toDate = new Date(); Event event = Event.READ; int start = 0; int count = 1; Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, event.xmlValue(), seriesId.getValue(), start, count); assertNotNull(log); assertTrue(log.getCount() == count); assertTrue(log.getStart() == start); assertTrue(log.getTotal() >= 1); assertTrue(log.getLogEntry(0).getIdentifier().equals(guid)); //do a update with the same series id Thread.sleep(1000); Identifier newPid = new Identifier(); newPid.setValue(generateDocumentId()+"1"); System.out.println("the second pid is "+newPid.getValue()); InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8")); SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2); newSysMeta.setObsoletes(guid); newSysMeta.setSeriesId(seriesId); MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta); InputStream result4 = MNodeService.getInstance(request).get(session, guid); // go back to beginning of original stream object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result4.available() > 0); assertTrue(IOUtils.contentEquals(result4, object1)); InputStream result5 = MNodeService.getInstance(request).get(session, newPid); // go back to beginning of original stream object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result5.available() > 0); assertTrue(IOUtils.contentEquals(result5, object2)); InputStream result6 = MNodeService.getInstance(request).get(session, seriesId); object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result6.available() > 0); assertTrue(IOUtils.contentEquals(result6, object2)); //test the get(pid) for v1 InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid); object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result7.available() > 0); assertTrue(IOUtils.contentEquals(result7, object1)); InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid); object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result8.available() > 0); assertTrue(IOUtils.contentEquals(result8, object2)); //test the get(sid) for v1 try { InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId); fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue())); assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, seriesId); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue()); SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue())); assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, guid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue()); SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid); assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue())); assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, newPid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue()); //do another update with different series id Thread.sleep(1000); String sid2 = "sid."+System.nanoTime(); Identifier seriesId2= new Identifier(); seriesId2.setValue(sid2); System.out.println("the second sid is "+seriesId2.getValue()); Identifier newPid2 = new Identifier(); newPid2.setValue(generateDocumentId()+"2"); System.out.println("the third pid is "+newPid2.getValue()); InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8")); SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3); sysmeta3.setObsoletes(newPid); sysmeta3.setSeriesId(seriesId2); MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3); InputStream result9 = MNodeService.getInstance(request).get(session, guid); // go back to beginning of original stream object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result9.available() > 0); assertTrue(IOUtils.contentEquals(result9, object1)); InputStream result10 = MNodeService.getInstance(request).get(session, newPid); // go back to beginning of original stream object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result10.available() > 0); assertTrue(IOUtils.contentEquals(result10, object2)); InputStream result11 = MNodeService.getInstance(request).get(session, newPid2); // go back to beginning of original stream object3.reset(); // check assertTrue(object3.available() > 0); assertTrue(result11.available() > 0); assertTrue(IOUtils.contentEquals(result11, object3)); InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2); object3.reset(); // check assertTrue(object3.available() > 0); assertTrue(result12.available() > 0); assertTrue(IOUtils.contentEquals(result12, object3)); InputStream result16 = MNodeService.getInstance(request).get(session, seriesId); object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result16.available() > 0); assertTrue(IOUtils.contentEquals(result16, object2)); //test the get(pid) for v1 InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid); object1.reset(); // check assertTrue(object1.available() > 0); assertTrue(result13.available() > 0); assertTrue(IOUtils.contentEquals(result13, object1)); InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid); object2.reset(); // check assertTrue(object2.available() > 0); assertTrue(result14.available() > 0); assertTrue(IOUtils.contentEquals(result14, object2)); InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2); object3.reset(); // check assertTrue(object3.available() > 0); assertTrue(result15.available() > 0); assertTrue(IOUtils.contentEquals(result15, object3)); SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue())); assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, seriesId); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue()); SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2); assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue())); assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, seriesId2); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue()); SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue())); assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, guid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue()); SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid); assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue())); assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, newPid); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue()); SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2); assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue())); assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue())); describeResponse = MNodeService.getInstance(request).describe(session, newPid2); assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue()); assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue()); //test the get(sid) for v1 try { InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId); fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } //test the get(sid) for v1 try { InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2); fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } //test to get non-existing id for v2 try { // the pid should be null when we try to get a no-exist sid Identifier non_exist_sid = new Identifier(); non_exist_sid.setValue("no-sid-exist-123qwe"); InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid); fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } try { // the pid should be null when we try to get a no-exist sid Identifier non_exist_sid = new Identifier(); non_exist_sid.setValue("no-sid-exist-123qwe"); SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid); fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } try { // the pid should be null when we try to get a no-exist sid Identifier non_exist_sid = new Identifier(); non_exist_sid.setValue("no-sid-exist-123qwe"); MNodeService.getInstance(request).describe(session, non_exist_sid); fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue()); } catch (NotFound ee) { } toDate = new Date(); event = Event.READ; start = 0; count = 1; log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, event.xmlValue(), seriesId.getValue(), start, count); assertNotNull(log); assertTrue(log.getCount() == count); assertTrue(log.getStart() == start); assertTrue(log.getTotal() >= 1); assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid)); //do another update with invalid series ids Thread.sleep(1000); Identifier newPid3 = new Identifier(); newPid3.setValue(generateDocumentId()+"3"); System.out.println("the third pid is "+newPid3.getValue()); InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8")); SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4); sysmeta4.setObsoletes(newPid2); sysmeta4.setSeriesId(seriesId); try { MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4); fail("we can't reach here since the sid is using an old one "); } catch (InvalidSystemMetadata eee) { } sysmeta4.setSeriesId(newPid3); try { MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4); fail("we can't reach here since the sid is using the pid "); } catch (InvalidSystemMetadata eee) { } //test archive a series id by v1 try { edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2); fail("we can't reach here since the v1 archive method doesn't support the sid "); } catch (NotFound nf2) { } // test delete a series id by v1 Session mnSession = getMNSession(); try { edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2); fail("we can't reach here since the v1 delete method doesn't support the sid "); } catch (NotFound nf2) { } // test archive a series id by v2 MNodeService.getInstance(request).archive(session, seriesId2); SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2); assertTrue(archived.getArchived()); archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2); assertTrue(archived.getArchived()); // test delete a series id by v2 MNodeService.getInstance(request).delete(mnSession, seriesId2); try { MNodeService.getInstance(request).get(session, seriesId2); fail("we can't reach here since the series id was deleted "); } catch (NotFound nf3) { System.out.println("the message is ============="+nf3.getMessage()); //assertTrue(nf3.getMessage().indexOf("delete") >0); } try { MNodeService.getInstance(request).get(session, newPid2); fail("we can't reach here since the series id was deleted "); } catch (NotFound nf3) { //System.out.println("the message is ============="+nf3.getMessage()); assertTrue(nf3.getMessage().indexOf("delete") >0); } try { edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2); fail("we can't reach here since the series id was deleted "); } catch (NotFound nf3) { System.out.println("the message is ============="+nf3.getMessage()); assertTrue(nf3.getMessage().indexOf("delete") >0); } //archive seriesId MNodeService.getInstance(request).archive(mnSession, seriesId); archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(archived.getArchived()); archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid); assertTrue(archived.getArchived()); //delete seriesId MNodeService.getInstance(request).delete(mnSession, seriesId); try { MNodeService.getInstance(request).get(session, newPid); fail("we can't reach here since the series id was deleted "); } catch (NotFound nf3) { //System.out.println("the message is ============="+nf3.getMessage()); assertTrue(nf3.getMessage().indexOf("delete") >0); } SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(meta.getIdentifier().getValue().equals(guid.getValue())); } catch (Exception e) { fail(e.getMessage()); } } /** * Test the listView methods. * @throws Excpetion */ public void testListViews() throws Exception { Session session = null; OptionList list = MNodeService.getInstance(request).listViews(session); assertTrue(list.sizeOptionList() >0); List names = list.getOptionList(); for(String name : names) { System.out.println("It has the view named "+name); } } public void testUpdateSystemMetadata() throws Exception { String str1 = "object1"; String str2 = "object2"; String str3 = "object3"; Date date = new Date(); Thread.sleep(2000); //insert test documents with a series id Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue(generateDocumentId()); InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8")); SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1); String sid1= "sid."+System.nanoTime(); Identifier seriesId = new Identifier(); seriesId.setValue(sid1); System.out.println("the first sid is "+seriesId.getValue()); sysmeta.setSeriesId(seriesId); sysmeta.setArchived(false); MNodeService.getInstance(request).create(session, guid, object1, sysmeta); //Test the generating object succeeded. SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid); assertTrue(metadata.getIdentifier().equals(guid)); assertTrue(metadata.getArchived().equals(false)); System.out.println("the checksum from request is "+metadata.getChecksum().getValue()); assertTrue(metadata.getSize().equals(sysmeta.getSize())); System.out.println("the identifier is "+guid.getValue()); Date current = sysmeta.getDateSysMetadataModified(); //updating system metadata failed since the date doesn't match sysmeta.setArchived(true); sysmeta.setDateSysMetadataModified(date); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } //update system metadata sucessfully sysmeta.setDateSysMetadataModified(current); BigInteger serialVersion = metadata.getSerialVersion(); //System.out.println("the current version is "+serialVersion.toString()); //serialVersion = serialVersion.add(BigInteger.ONE); //System.out.println("the new version is "+serialVersion.toString()); //sysmeta.setSerialVersion(serialVersion); System.out.println("the identifier is ----------------------- "+guid.getValue()); MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId); assertTrue(metadata2.getIdentifier().equals(guid)); assertTrue(metadata2.getSeriesId().equals(seriesId)); assertTrue(metadata2.getArchived().equals(true)); assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue())); assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime()); Identifier newId = new Identifier(); newId.setValue("newValue"); sysmeta.setIdentifier(newId); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta.setSerialVersion(serialVersion); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } newId.setValue("newValue"); sysmeta.setSeriesId(newId); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } Date newDate = new Date(); sysmeta.setDateUploaded(newDate); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } Checksum checkSum = new Checksum(); checkSum.setValue("12345"); sysmeta.setChecksum(checkSum); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } BigInteger size = new BigInteger("4000"); sysmeta.setSize(size); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta); fail("We shouldn't get there"); } catch (Exception e) { assertTrue(e instanceof InvalidRequest); } } public void testUpdateObsoletesAndObsoletedBy() throws Exception { String str1 = "object1"; String str2 = "object2"; String str3 = "object3"; //insert two documents Session session = getTestSession(); Identifier guid1 = new Identifier(); guid1.setValue(generateDocumentId()); InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8")); SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1); MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1); //Test the generating object succeeded. SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1); assertTrue(metadata.getIdentifier().equals(guid1)); assertTrue(metadata.getSize().equals(sysmeta1.getSize())); Identifier guid2 = new Identifier(); guid2.setValue(generateDocumentId()); InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8")); SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2); MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2); //Test the generating object succeeded. metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2); assertTrue(metadata.getIdentifier().equals(guid2)); assertTrue(metadata.getSize().equals(sysmeta2.getSize())); //update the system metadata without touching the obsoletes and obsoletdBy AccessPolicy accessPolicy = new AccessPolicy(); AccessRule allow = new AccessRule(); allow.addPermission(Permission.WRITE); Subject subject = new Subject(); subject.setValue("user_foo"); allow.addSubject(subject); accessPolicy.addAllow(allow); sysmeta1.setAccessPolicy(accessPolicy); BigInteger serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta1.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1); assertTrue(metadata.getIdentifier().equals(guid1)); assertTrue(metadata.getObsoletedBy() == null); assertTrue(metadata.getObsoletes() == null); Session newSession = new Session(); newSession.setSubject(subject); boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE); assertTrue(isAuthorized); sysmeta2.setAccessPolicy(accessPolicy); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta2.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2); assertTrue(metadata.getIdentifier().equals(guid2)); assertTrue(metadata.getObsoletes() == null); assertTrue(metadata.getObsoletedBy() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue())); isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE); assertTrue(isAuthorized); //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1 sysmeta1.setObsoletedBy(guid2); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta1.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1); assertTrue(metadata.getIdentifier().equals(guid1)); assertTrue(metadata.getObsoletedBy().equals(guid2)); assertTrue(metadata.getObsoletes() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue())); sysmeta2.setObsoletes(guid1); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta2.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2); assertTrue(metadata.getIdentifier().equals(guid2)); assertTrue(metadata.getObsoletes().equals(guid1)); assertTrue(metadata.getObsoletedBy() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue())); //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2 sysmeta1.setObsoletedBy(guid2); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta1.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1); assertTrue(metadata.getIdentifier().equals(guid1)); assertTrue(metadata.getObsoletedBy().equals(guid2)); assertTrue(metadata.getObsoletes() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue())); sysmeta2.setObsoletes(guid1); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta2.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2); assertTrue(metadata.getIdentifier().equals(guid2)); assertTrue(metadata.getObsoletes().equals(guid1)); assertTrue(metadata.getObsoletedBy() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue())); //resetting the obsoletes and obsoletedBy fails Identifier newId = new Identifier(); newId.setValue("newValue"); sysmeta1.setObsoletedBy(newId); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta1.setSerialVersion(serialVersion); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1); fail("We shouldn't get there"); } catch (Exception e) { e.printStackTrace(); assertTrue(e instanceof InvalidRequest); } sysmeta2.setObsoletes(newId); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta2.setSerialVersion(serialVersion); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2); fail("We shouldn't get there"); } catch (Exception e) { e.printStackTrace(); assertTrue(e instanceof InvalidRequest); } //insert another object Identifier guid5 = new Identifier(); guid5.setValue(generateDocumentId()); object1 = new ByteArrayInputStream(str1.getBytes("UTF-8")); SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1); MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5); //Test the generating object succeeded. metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5); assertTrue(metadata.getIdentifier().equals(guid5)); assertTrue(metadata.getSize().equals(sysmeta5.getSize())); //Setting p5 obosletes p1 fails since p2 already obsoletes p1 sysmeta5.setObsoletes(guid1); serialVersion = metadata.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta5.setSerialVersion(serialVersion); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5); fail("We shouldn't get there"); } catch (Exception e) { e.printStackTrace(); } //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2 sysmeta5.setObsoletes(null); sysmeta5.setObsoletedBy(guid2); try { MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5); fail("We shouldn't get there"); } catch (Exception e) { e.printStackTrace(); } //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2. sysmeta5.setObsoletedBy(null); sysmeta5.setObsoletes(guid2); MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5); assertTrue(metadata.getIdentifier().equals(guid5)); assertTrue(metadata.getObsoletes().equals(guid2)); assertTrue(metadata.getObsoletedBy() == null); assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue())); //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything sysmeta2.setObsoletes(guid1); sysmeta2.setObsoletedBy(guid5); serialVersion = sysmeta2.getSerialVersion(); serialVersion = serialVersion.add(BigInteger.ONE); sysmeta2.setSerialVersion(serialVersion); MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2); metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2); assertTrue(metadata.getIdentifier().equals(guid2)); assertTrue(metadata.getObsoletes().equals(guid1)); assertTrue(metadata.getObsoletedBy().equals(guid5)); assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue())); } }