Package org.fcrepo.server.storage.translation

Source Code of org.fcrepo.server.storage.translation.TestAtomDOSerializer

/* 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.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 org.fcrepo.common.Constants;
import org.fcrepo.common.Models;
import org.fcrepo.common.PID;
import org.fcrepo.server.storage.translation.AtomDOSerializer;
import org.fcrepo.server.storage.translation.DODeserializer;
import org.fcrepo.server.storage.translation.DOSerializer;
import org.fcrepo.server.storage.translation.FOXML1_1DODeserializer;
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.fcrepo.utilities.FileUtils;
import org.fcrepo.utilities.XmlTransformUtility;




import static org.fcrepo.common.Models.FEDORA_OBJECT_3_0;
import static org.fcrepo.server.storage.translation.DOTranslationUtility.DESERIALIZE_INSTANCE;
import static org.fcrepo.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);
    }

}
TOP

Related Classes of org.fcrepo.server.storage.translation.TestAtomDOSerializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.