/* 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 fedora.server.storage.translation; 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.io.StringReader; import java.io.StringWriter; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.abdera.Abdera; import org.apache.abdera.model.Document; import org.apache.abdera.model.Feed; import org.apache.abdera.parser.Parser; import org.custommonkey.xmlunit.NamespaceContext; import org.custommonkey.xmlunit.SimpleNamespaceContext; import org.custommonkey.xmlunit.XMLUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; import fedora.common.Constants; import fedora.common.Models; import fedora.common.PID; import fedora.server.storage.types.BasicDigitalObject; import fedora.server.storage.types.Datastream; import fedora.server.storage.types.DatastreamXMLMetadata; import fedora.server.storage.types.DigitalObject; import fedora.utilities.FileUtils; import fedora.utilities.XmlTransformUtility; import static fedora.common.Models.FEDORA_OBJECT_3_0; import static fedora.server.storage.translation.DOTranslationUtility.DESERIALIZE_INSTANCE; import static fedora.server.storage.translation.DOTranslationUtility.SERIALIZE_EXPORT_ARCHIVE; /** * @author Edwin Shin */ public class TestAtomDOSerializer extends TestXMLDOSerializer { private static final String iso_tron = "src/main/resources/schematron/iso_schematron_skeleton.xsl"; private static final String atom_tron = "src/main/resources/schematron/atom.sch"; public TestAtomDOSerializer() { super(new AtomDOSerializer()); } /** * @throws java.lang.Exception */ @Before @Override public void setUp() { super.setUp(); Map<String, String> nsMap = new HashMap<String, String>(); nsMap.put("fedora", "http://www.example.org"); NamespaceContext ctx = new SimpleNamespaceContext(nsMap); XMLUnit.setXpathNamespaceContext(ctx); } /** * @throws java.lang.Exception */ @After @Override public void tearDown() throws Exception { XMLUnit.setXpathNamespaceContext(SimpleNamespaceContext.EMPTY_CONTEXT); } @Test public void testSerializeFromFOXML() throws Exception { String source = "src/main/resources/demo/demo-objects/foxml/local-server-demos/image-collection-demo/dataObjects/demo_SmileyBeerGlass.xml"; source = "src/main/resources/demo/demo-objects/foxml/local-server-demos/formatting-objects-demo/obj_demo_26.xml"; InputStream in = new FileInputStream(source); File f = File.createTempFile("test", null); OutputStream out = new FileOutputStream(f); DODeserializer deser = new FOXML1_1DODeserializer(); DigitalObject obj = new BasicDigitalObject(); deser.deserialize(in, obj, "UTF-8", DESERIALIZE_INSTANCE); // some sanity checks setObjectDefaults(obj); DOSerializer serializer = new AtomDOSerializer(); serializer.serialize(obj, out, "UTF-8", SERIALIZE_EXPORT_ARCHIVE); } @Test public void testSerialize() throws Exception { DigitalObject obj = createTestObject(Models.FEDORA_OBJECT_3_0); obj.setLastModDate(new Date()); DatastreamXMLMetadata ds1 = createXDatastream("DS1"); ds1.DSCreateDT = new Date(); obj.addDatastreamVersion(ds1, true); OutputStream out = new ByteArrayOutputStream(); DOSerializer serializer = new AtomDOSerializer(); serializer.serialize(obj, out, "UTF-8", SERIALIZE_EXPORT_ARCHIVE); // TODO //validateWithISOSchematron(out.toString()); } @Test public void testAtomZip() throws Exception { DigitalObject obj = createTestObject(FEDORA_OBJECT_3_0); obj.setLastModDate(new Date()); DatastreamXMLMetadata ds1 = createXDatastream("DS1"); ds1.DSCreateDT = new Date(); obj.addDatastreamVersion(ds1, true); File f = File.createTempFile("atom", ".zip"); OutputStream out = new FileOutputStream(f); DOSerializer serializer = new AtomDOSerializer(Constants.ATOM_ZIP1_1); serializer.serialize(obj, out, "UTF-8", SERIALIZE_EXPORT_ARCHIVE); out.close(); ZipInputStream zip = new ZipInputStream(new FileInputStream(f)); ZipEntry entry; int count = 0; while ((entry = zip.getNextEntry()) != null) { if (entry.getName().equals("atommanifest.xml")) { count++; ByteArrayOutputStream manifest = new ByteArrayOutputStream(); FileUtils.copy(zip, manifest); Abdera abdera = Abdera.getInstance(); Parser parser = abdera.getParser(); Document<Feed> feedDoc = parser.parse(new StringReader(manifest.toString("UTF-8"))); Feed feed = feedDoc.getRoot(); assertEquals(PID.getInstance(TEST_PID).toURI(), feed.getId().toString()); // TODO other tests? } } assertEquals("Expected exactly 1 manifest file", 1, count); zip.close(); //f.delete(); } // TODO private void validateWithISOSchematron(String candidate) throws TransformerException, IOException { StreamSource skeleton = new StreamSource(new File(iso_tron)); StreamSource schema = new StreamSource(new File(atom_tron)); StringWriter temp = new StringWriter(); StreamResult result = new StreamResult(temp); // generate the stylesheet TransformerFactory factory = XmlTransformUtility.getTransformerFactory(); Transformer xform = factory.newTransformer(skeleton); xform.transform(schema, result); temp.flush(); temp.close(); String stylesheet = temp.toString(); // now flip StringReader in = new StringReader(stylesheet); StreamSource sheet = new StreamSource(in); Transformer validator = factory.newTransformer(sheet); validator.setOutputProperty("method", "text"); temp = new StringWriter(); result = new StreamResult(temp); validator.transform(new StreamSource(new StringReader(candidate)), result); temp.flush(); String output = temp.toString(); // Check for no output if all tests pass. assertEquals(output, "", output); } private void setObjectDefaults(DigitalObject obj) { if (obj.getCreateDate() == null) obj.setCreateDate(new Date()); Iterator<String> dsIds = obj.datastreamIdIterator(); while (dsIds.hasNext()) { String dsid = dsIds.next(); for (Datastream ds : obj.datastreams(dsid)) { if (ds.DSCreateDT == null) { ds.DSCreateDT = new Date(); } } } } // Supports legacy test runners public static junit.framework.Test suite() { return new junit.framework.JUnit4TestAdapter(TestAtomDOSerializer.class); } }