package edu.ucsb.nceas.metacat.doi.datacite; import java.io.FileInputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.List; import org.dataone.client.v2.formats.ObjectFormatCache; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.Session; import org.dataone.service.types.v2.Node; import org.dataone.service.types.v2.SystemMetadata; import org.ecoinformatics.datamanager.parser.DataPackage; import org.ecoinformatics.datamanager.parser.Party; import org.ecoinformatics.datamanager.parser.generic.DataPackageParserInterface; import org.ecoinformatics.datamanager.parser.generic.Eml200DataPackageParser; import edu.ucsb.nceas.metacat.dataone.D1NodeServiceTest; import edu.ucsb.nceas.metacat.dataone.MNodeService; import junit.framework.Test; import junit.framework.TestSuite; public class EML2DataCiteFactoryTest extends D1NodeServiceTest { public static final String section = ""; public static final String section0 = ""; public static final String section1 = "Lehman, ClarenceInouye, Richard0001-0005-9751-1234Idaho State University0001-0005-9751-1111" + "Smith, Mike0001-0005-9751-6987National Center for Ecological Analysis and SynthesisEd, John0001-0005-9751-0000NCEAS" + "Data managerNCEAS, University of CaliforniaData from Cedar Creek LTER on productivity and species richness"; public static final String section2 = "for use in a workshop titled \"An Analysis of the Relationship between"; public static final String section3 = "Productivity and Diversity using Experimental Results from the Long-Term"; public static final String section4 = "Ecological Research Network\" held at NCEAS in September 1996.Jefferson, John. Director. Institute of Ecology"; public static final String section41 = "2009Old field grasslandbiomassproductivityspecies-areaspecies richnessen"; public static final String section5 = "This data package contains information about the first year of participation in SNAPP synthesis working groups for different institutions"; public static final String section6 = "The data source is NCEAS administrative database. The R Script compute the yearly statistics and generate the bar chart. The scripts outputs 1 csv file with the yearly stats and one png file wit the plot."; public static final String section7 = "text/xml"; /** * Constructor * @param name */ public EML2DataCiteFactoryTest(String name) { super(name); } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new EML2DataCiteFactoryTest("initialize")); suite.addTest(new EML2DataCiteFactoryTest("testCanProcess")); suite.addTest(new EML2DataCiteFactoryTest("testGenerateMetadata")); suite.addTest(new EML2DataCiteFactoryTest("testLookupPublisher")); suite.addTest(new EML2DataCiteFactoryTest("testLookupPublishingYear")); return suite; } public void initialize() { assertTrue(true); } public void testCanProcess() { String EML200 = "eml://ecoinformatics.org/eml-2.0.0"; String EML201 = "eml://ecoinformatics.org/eml-2.0.1"; String EML210 = "eml://ecoinformatics.org/eml-2.1.0"; String EML211 = "eml://ecoinformatics.org/eml-2.1.1"; String EML220 = "eml://ecoinformatics.org/eml-2.2.0"; String other = "http://www.isotc211.org/2005/gmx "; EML2DataCiteFactory factory = new EML2DataCiteFactory(); assertTrue(factory.canProcess(EML200)); assertTrue(factory.canProcess(EML201)); assertTrue(factory.canProcess(EML210)); assertTrue(factory.canProcess(EML211)); assertTrue(factory.canProcess(EML220)); assertTrue(!factory.canProcess(other)); } public void testGenerateMetadata() throws Exception{ Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue(generateDocumentId()); String emlFile = "test/eml-datacite.xml"; InputStream content = null; 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()); sysmeta.setAccessPolicy(null); content = new FileInputStream(emlFile); Identifier pid = MNodeService.getInstance(request).create(session, guid, content, sysmeta); content.close(); Node node = MNodeService.getInstance(null).getCapabilities(); String nodeName = node.getName(); EML2DataCiteFactory factory = new EML2DataCiteFactory(); assertTrue(factory.canProcess(sysmeta.getFormatId().getValue())); String result = factory.generateMetadata(guid, sysmeta); String id = pid.getValue(); id = id.replaceFirst("doi:", ""); assertTrue(result.contains(section)); assertTrue(result.contains(section0 + id + section1)); assertTrue(result.contains(section2)); assertTrue(result.contains(section3)); assertTrue(result.contains(section4 + section41)); assertTrue(result.contains(section5)); assertTrue(result.contains(section6)); assertTrue(result.contains(section7)); } /** * Test the lookupPublisher method. * @throws Exception */ public void testLookupPublisher() throws Exception { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue(generateDocumentId()); String emlFile = "test/eml-sample.xml"; InputStream content = null; content = new FileInputStream(emlFile); DataPackageParserInterface parser = new Eml200DataPackageParser(); parser.parse(content); DataPackage emlPackage = parser.getDataPackage(); content.close(); Node node = MNodeService.getInstance(null).getCapabilities(); String nodeName = node.getName(); EML2DataCiteFactory factory = new EML2DataCiteFactory(); //the eml-sample.xml file doesn't have a publisher, it falls back to the memember node. String publisher = factory.lookupPublisher(emlPackage); assertTrue(publisher.equals(node.getName())); //only has the organization name String surName = null; List givenNames = null; String organization = "University of Calfiornia"; Party party = new Party(surName, givenNames, organization); emlPackage.setPublisher(party); publisher = factory.lookupPublisher(emlPackage); assertTrue(publisher.equals(organization)); // has both position name and organization name String positionName = "Director"; party.setPositionName(positionName); publisher = factory.lookupPublisher(emlPackage); assertTrue(publisher.equals(positionName + ". " + organization)); } /** * Test the formatPublishingYear method. * @throws Exception */ public void testLookupPublishingYear() throws Exception { Session session = getTestSession(); Identifier guid = new Identifier(); guid.setValue(generateDocumentId()); String emlFile = "test/eml-sample.xml"; InputStream content = null; 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); DataPackageParserInterface parser = new Eml200DataPackageParser(); parser.parse(content); DataPackage emlPackage = parser.getDataPackage(); content.close(); EML2DataCiteFactory factory = new EML2DataCiteFactory(); //The eml-sample.xml file doesn't have the pubDate, so it falls back to the upload date on the system meta data. String publishYear = factory.lookupPublishingYear(emlPackage, sysmeta); SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); String yearInSysMeta = sdf.format(sysmeta.getDateUploaded()); assertTrue(publishYear.equals(yearInSysMeta)); //set the pubDate with the format yyyy String year = "2000"; emlPackage.setPubDate(year); publishYear = factory.lookupPublishingYear(emlPackage, sysmeta); assertTrue(publishYear.equals(year)); //set the pubDate with the format yyyy-mm-dd year = "2001-03-29"; emlPackage.setPubDate(year); publishYear = factory.lookupPublishingYear(emlPackage, sysmeta); assertTrue(publishYear.equals("2001")); //set the pubDate with an unrecognized format, so it falls back to the upload date on the system meta data year = "2009-05-28T21:45:46.931+00:00"; emlPackage.setPubDate(year); publishYear = factory.lookupPublishingYear(emlPackage, sysmeta); assertTrue(!publishYear.equals("2009")); assertTrue(publishYear.equals(yearInSysMeta)); } }