/* The contents of this file are subject to the license and copyright terms * detailed in the license directory at the root of the source tree (also * available online at http://fedora-commons.org/license/). */ package org.fcrepo.server.storage.translation; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.Date; import java.util.concurrent.Callable; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.fcrepo.common.FedoraTestConstants; import org.fcrepo.common.Models; import org.fcrepo.server.storage.types.BasicDigitalObject; import org.fcrepo.server.storage.types.Datastream; import org.fcrepo.server.storage.types.DatastreamXMLMetadata; import org.fcrepo.server.storage.types.DigitalObject; import org.junit.Test; /** * @author Edwin Shin * @version $Id$ */ public class TestAtomDODeserializer extends TestXMLDODeserializer implements FedoraTestConstants { private final AtomDOSerializer m_zip_serializer; private final AtomDODeserializer m_zip_deserializer; public TestAtomDODeserializer() { this(new AtomDODeserializer(AtomDODeserializer.DEFAULT_FORMAT, translationUtility()), new AtomDOSerializer(AtomDODeserializer.DEFAULT_FORMAT, translationUtility())); } public TestAtomDODeserializer(DODeserializer deserializer, DOSerializer serializer) { super(deserializer, serializer); m_zip_serializer = new AtomDOSerializer(AtomDODeserializer.ATOM_ZIP1_1, translationUtility()); m_zip_deserializer = new AtomDODeserializer(AtomDODeserializer.ATOM_ZIP1_1, translationUtility()); } @Test public void testDeserializeSimpleCModelObject() { doSimpleTest(Models.CONTENT_MODEL_3_0); } @Test public void testDeserialize() throws Exception { // create a digital object DigitalObject original = createTestObject(Models.FEDORA_OBJECT_3_0); original.setLastModDate(new Date()); DatastreamXMLMetadata ds1 = createXDatastream("DS1"); ds1.DSCreateDT = new Date(); original.addDatastreamVersion(ds1, true); // serialize the object as Atom File f = File.createTempFile("test", null); OutputStream out = new FileOutputStream(f); m_serializer.serialize(original, out, "utf-8", DOTranslationUtility.SERIALIZE_EXPORT_ARCHIVE); // deserialize the object DigitalObject candidate = new BasicDigitalObject(); InputStream in = new FileInputStream(f); m_deserializer.deserialize(in, candidate, "utf-8", DOTranslationUtility.DESERIALIZE_INSTANCE); // check the deserialization assertEquals(original.getLastModDate(), candidate.getLastModDate()); DatastreamXMLMetadata candidateDS = (DatastreamXMLMetadata) candidate.datastreams("DS1").iterator() .next(); assertEquals(ds1.DatastreamID, candidateDS.DatastreamID); assertEquals(ds1.DSCreateDT, candidateDS.DSCreateDT); // FIXME dsSize tests omitted for now b/c of handling of closing tags //assertEquals(ds1.DSSize, candidateDS.DSSize); // also make sure we can serialize the object as foxml DOSerializer serF = new FOXML1_1DOSerializer(); serF.serialize(candidate, out, "utf-8", DOTranslationUtility.SERIALIZE_EXPORT_ARCHIVE); } @Test public void testConcurrentDeserialization() throws Exception { File [] files = getDemoZipExports(); Callable<?>[] callables = { new DeserializerCallable(m_zip_deserializer, new FileInputStream(files[0])), new DeserializerCallable(m_zip_deserializer, new FileInputStream(files[1])), new DeserializerCallable(m_zip_deserializer, new ByteArrayInputStream(get_demo1001_zip())) }; runConcurrent(callables); } private DigitalObject[] getDemoObjects() throws Exception { String[] demoSources = {"atom/local-server-demos/simple-image-demo/sdep_demo_2.xml", "atom/local-server-demos/formatting-objects-demo/obj_demo_26.xml"}; DigitalObject[] objects = new DigitalObject[demoSources.length]; int i = 0; for (String source : demoSources) { File sourceFile = new File(DEMO_DIR_PREFIX + source); InputStream in = new FileInputStream(sourceFile); DigitalObject candidate = new BasicDigitalObject(); m_deserializer.deserialize(in, candidate, "utf-8", DOTranslationUtility.DESERIALIZE_INSTANCE); assertNotNull(candidate); objects[i++] = candidate; } return objects; } private File[] getDemoZipExports() throws Exception { DigitalObject[] demoObjects = getDemoObjects(); File [] exports = new File[demoObjects.length]; int i = 0; for (DigitalObject object : demoObjects) { File f = File.createTempFile("test", null); OutputStream out = new FileOutputStream(f); try { m_zip_serializer.serialize(object, out, "utf-8", DOTranslationUtility.SERIALIZE_EXPORT_ARCHIVE); } catch (Exception e) { e.printStackTrace(); if (e.getCause() != null) e.getCause().printStackTrace(); throw e; } exports[i++] = f; } return exports; } private byte[] get_demo1001_manifest() { StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); sb.append("<feed xmlns=\"http://www.w3.org/2005/Atom\">"); sb.append(" <id>info:fedora/demo:1001</id>"); sb.append(" <title type=\"text\">Image of Coliseum in Rome</title>"); sb.append(" <updated>2008-04-30T03:54:31.525Z</updated>"); sb.append(" <author>"); sb.append(" <name>fedoraAdmin</name>"); sb.append(" </author>"); sb.append(" <category term=\"Active\" scheme=\"info:fedora/fedora-system:def/model#state\"></category>"); sb.append(" <category term=\"2008-04-30T03:54:31.525Z\" scheme=\"info:fedora/fedora-system:def/model#createdDate\"></category>"); sb.append(" <icon>http://www.fedora-commons.org/images/logo_vertical_transparent_200_251.png</icon>"); sb.append(" <entry>"); sb.append(" <id>info:fedora/demo:1001/DC</id>"); sb.append(" <title type=\"text\">DC</title>"); sb.append(" <updated>2008-04-30T03:54:31.459Z</updated>"); sb.append(" <link href=\"info:fedora/demo:1001/DC/2008-04-30T03:54:31.459Z\" rel=\"alternate\"></link>"); sb.append(" <category term=\"A\" scheme=\"info:fedora/fedora-system:def/model#state\"></category>"); sb.append(" <category term=\"X\" scheme=\"info:fedora/fedora-system:def/model#controlGroup\"></category>"); sb.append(" <category term=\"true\" scheme=\"info:fedora/fedora-system:def/model#versionable\"></category>"); sb.append(" </entry>"); sb.append(" <entry xmlns:thr=\"http://purl.org/syndication/thread/1.0\">"); sb.append(" <id>info:fedora/demo:1001/DC/2008-04-30T03:54:31.459Z</id>"); sb.append(" <title type=\"text\">DC1.0</title>"); sb.append(" <updated>2008-04-30T03:54:31.459Z</updated>"); sb.append(" <thr:in-reply-to ref=\"info:fedora/demo:1001/DC\"></thr:in-reply-to>"); sb.append(" <category term=\"DC Record for Coliseum image object\" scheme=\"info:fedora/fedora-system:def/model#label\"></category>"); sb.append(" <category term=\"DISABLED\" scheme=\"info:fedora/fedora-system:def/model#digestType\"></category>"); sb.append(" <category term=\"none\" scheme=\"info:fedora/fedora-system:def/model#digest\"></category>"); sb.append(" <category term=\"491\" scheme=\"info:fedora/fedora-system:def/model#length\"></category>"); sb.append(" <summary type=\"text\">DC1.0</summary>"); sb.append(" <content type=\"text/xml\" src=\"DC1.0.xml\"/>"); sb.append(" </entry>"); sb.append(" <entry>"); sb.append(" <id>info:fedora/demo:1001/RELS-EXT</id>"); sb.append(" <title type=\"text\">RELS-EXT</title>"); sb.append(" <updated>2008-04-30T03:54:31.459Z</updated>"); sb.append(" <link href=\"info:fedora/demo:1001/RELS-EXT/2008-04-30T03:54:31.459Z\" rel=\"alternate\"></link>"); sb.append(" <category term=\"A\" scheme=\"info:fedora/fedora-system:def/model#state\"></category>"); sb.append(" <category term=\"X\" scheme=\"info:fedora/fedora-system:def/model#controlGroup\"></category>"); sb.append(" <category term=\"false\" scheme=\"info:fedora/fedora-system:def/model#versionable\"></category>"); sb.append(" </entry>"); sb.append(" <entry xmlns:thr=\"http://purl.org/syndication/thread/1.0\">"); sb.append(" <id>info:fedora/demo:1001/RELS-EXT/2008-04-30T03:54:31.459Z</id>"); sb.append(" <title type=\"text\">RELS-EXT1.0</title>"); sb.append(" <updated>2008-04-30T03:54:31.459Z</updated>"); sb.append(" <thr:in-reply-to ref=\"info:fedora/demo:1001/RELS-EXT\"></thr:in-reply-to>"); sb.append(" <category term=\"Relationships\" scheme=\"info:fedora/fedora-system:def/model#label\"></category>"); // sb.append(" <category term=\"DISABLED\" scheme=\"info:fedora/fedora-system:def/model#digestType\"></category>"); // sb.append(" <category term=\"none\" scheme=\"info:fedora/fedora-system:def/model#digest\"></category>"); sb.append(" <category term=\"472\" scheme=\"info:fedora/fedora-system:def/model#length\"></category>"); sb.append(" <content type=\"application/rdf+xml\" src=\"RELS-EXT1.0.xml\"/>"); sb.append(" <summary type=\"text\">RELS-EXT1.0</summary>"); sb.append(" </entry>"); sb.append("</feed>"); return sb.toString().getBytes(Charset.forName("UTF-8")); } private byte[] get_demo1001_dc() { StringBuilder sb = new StringBuilder(); sb.append(" <oai_dc:dc xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">"); sb.append(" <dc:title>Coliseum in Rome</dc:title>"); sb.append(" <dc:creator>Thornton Staples</dc:creator>"); sb.append(" <dc:subject>Architecture, Roman</dc:subject>"); sb.append(" <dc:description>Image of Coliseum in Rome</dc:description>"); sb.append(" <dc:publisher>University of Virginia Library</dc:publisher>"); sb.append(" <dc:format>image/jpeg</dc:format>"); sb.append(" <dc:identifier>demo:1001</dc:identifier>"); sb.append(" </oai_dc:dc>"); return sb.toString().getBytes(Charset.forName("UTF-8")); } private byte[] get_demo1001_rels() { StringBuilder sb = new StringBuilder(); sb.append(" <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:fedora-model=\"info:fedora/fedora-system:def/model#\">"); sb.append(" <rdf:Description rdf:about=\"info:fedora/demo:1001\">"); sb.append(" <fedora-model:hasModel rdf:resource=\"info:fedora/demo:UVA_STD_IMAGE_1\"></fedora-model:hasModel>"); sb.append(" </rdf:Description>"); sb.append(" </rdf:RDF>"); return sb.toString().getBytes(Charset.forName("UTF-8")); } private byte[] get_demo1001_zip() throws IOException { byte[] demo1001_manifest = get_demo1001_manifest(); byte[] demo1001_dc = get_demo1001_dc(); byte[] demo1001_relsext = get_demo1001_rels(); ZipEntry manifest = new ZipEntry("atommanifest.xml"); ZipEntry dc = new ZipEntry("DC1.0.xml"); ZipEntry relsext = new ZipEntry("RELS-EXT1.0.xml"); ByteArrayOutputStream bout = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(bout); zip.putNextEntry(manifest); zip.write(demo1001_manifest); zip.putNextEntry(dc); zip.write(demo1001_dc); zip.putNextEntry(relsext); zip.write(demo1001_relsext); zip.flush(); zip.close(); return bout.toByteArray(); } @Test public void testDeserializeWithAutoChecksum() throws Exception { Datastream.defaultChecksumType = "MD5"; Datastream.autoChecksum = true; byte[] demo1001ATOMZip = get_demo1001_zip(); InputStream in = new ByteArrayInputStream(demo1001ATOMZip); DigitalObject obj = new BasicDigitalObject(); m_zip_deserializer.deserialize(in, obj, "UTF-8", DOTranslationUtility.DESERIALIZE_INSTANCE); assertEquals("demo:1001", obj.getPid()); assertEquals(true, Datastream.autoChecksum); // RELS-EXT is not marked, so should default String id = "RELS-EXT"; for (Datastream version : obj.datastreams(id)) { System.out.println("Test object was: " + obj.getPid()); assertEquals(obj.getPid() + "/" + id + " did not have expected CS type", Datastream.getDefaultChecksumType(), version.DSChecksumType); assertEquals(32, version.getChecksum().length()); } } @Test public void testDeserializeWithoutAutoChecksum() throws Exception { Datastream.defaultChecksumType = "DISABLED"; Datastream.autoChecksum = false; byte[] demo1001ATOMZip = get_demo1001_zip(); InputStream in = new ByteArrayInputStream(demo1001ATOMZip); DigitalObject obj = new BasicDigitalObject(); m_zip_deserializer.deserialize(in, obj, "UTF-8", DOTranslationUtility.DESERIALIZE_INSTANCE); assertEquals("demo:1001", obj.getPid()); assertEquals(false, Datastream.autoChecksum); String id = "RELS-EXT"; for (Datastream version : obj.datastreams(id)) { System.out.println("Test object was: " + obj.getPid()); assertEquals(obj.getPid() + "/" + id + " did not have expected CS type", Datastream.CHECKSUMTYPE_DISABLED, version.DSChecksumType); assertEquals(Datastream.CHECKSUM_NONE, version.getChecksum()); } } // Supports legacy test runners public static junit.framework.Test suite() { return new junit.framework.JUnit4TestAdapter(TestAtomDODeserializer.class); } }