cz.cas.lib.proarc.common.export.cejsh.CejshBuilderTest.java Source code

Java tutorial

Introduction

Here is the source code for cz.cas.lib.proarc.common.export.cejsh.CejshBuilderTest.java

Source

/*
 * Copyright (C) 2015 Jan Pokorsky
 *
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 */
package cz.cas.lib.proarc.common.export.cejsh;

import cz.cas.lib.proarc.common.CustomTemporaryFolder;
import cz.cas.lib.proarc.common.export.cejsh.CejshBuilder.Article;
import cz.cas.lib.proarc.common.export.cejsh.CejshBuilder.Issue;
import cz.cas.lib.proarc.common.export.cejsh.CejshBuilder.Title;
import cz.cas.lib.proarc.common.export.cejsh.CejshBuilder.Volume;
import cz.cas.lib.proarc.common.object.DigitalObjectElement;
import cz.cas.lib.proarc.common.xml.ProarcXmlUtils;
import cz.cas.lib.proarc.common.xml.SimpleNamespaceContext;
import cz.cas.lib.proarc.common.xml.TransformErrorListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;
import javax.xml.bind.DatatypeConverter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import org.apache.commons.io.Charsets;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
 *
 * @author Jan Pokorsky
 */
public class CejshBuilderTest {

    @Rule
    public CustomTemporaryFolder temp = new CustomTemporaryFolder(true);

    public CejshBuilderTest() {
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    @Test
    public void testWriteProperties() throws Exception {
        CejshBuilder cb = new CejshBuilder(new CejshConfig());
        File folder = temp.getRoot();
        int articleCount = 3;
        cb.writeProperties(folder, articleCount);
        File file = new File(folder, CejshBuilder.IMPORT_PROPERTIES_FILENAME);
        assertTrue(file.exists());
        Properties props = new Properties();
        props.load(new InputStreamReader(new FileInputStream(file), Charsets.UTF_8));
        assertEquals(String.valueOf(articleCount), props.getProperty(CejshBuilder.PROP_IMPORT_OBJECTS));
        assertEquals("1", props.getProperty(CejshBuilder.PROP_IMPORT_BWMETA_FILES));
        assertEquals("0", props.getProperty(CejshBuilder.PROP_IMPORT_CONTENT_FILES));
        String resultDate = props.getProperty(CejshBuilder.PROP_IMPORT_INFODATE);
        assertNotNull(resultDate);
        String expDated = DatatypeConverter.printDateTime(new GregorianCalendar(CejshBuilder.UTC)).substring(0, 14);
        assertEquals(resultDate, expDated, resultDate.substring(0, 14));
    }

    @Test
    public void testMissingXsl() throws Exception {
        CejshConfig conf = new CejshConfig();
        conf.setCejshXslUrl("/???");
        try {
            CejshBuilder cb = new CejshBuilder(conf);
            fail();
        } catch (TransformerConfigurationException ex) {
            //            System.out.println(ex.getMessage());
        }
    }

    @Test
    public void testCreateCejshXml_TitleVolumeIssue() throws Exception {
        CejshConfig conf = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(conf);
        Document articleDoc = cb.getDocumentBuilder()
                .parse(CejshBuilderTest.class.getResource("article_mods.xml").toExternalForm());
        // issn must match some cejsh_journals.xml/cejsh/journal[@issn=$issn]
        final String pkgIssn = "0231-5955";
        Issue issue = new Issue();
        issue.setIssn(pkgIssn);
        issue.setIssueId("uuid-issue");
        issue.setIssueNumber("issue1");
        Volume volume = new Volume();
        volume.setVolumeId("uuid-volume");
        volume.setVolumeNumber("volume1");
        volume.setYear("1985");
        Article article = new Article(null, articleDoc.getDocumentElement(), null);
        cb.setIssue(issue);
        cb.setVolume(volume);

        Document articleCollectionDoc = cb.mergeElements(Collections.singletonList(article));
        DOMSource cejshSource = new DOMSource(articleCollectionDoc);
        DOMResult cejshResult = new DOMResult();
        //        dump(cejshSource);

        TransformErrorListener xslError = cb.createCejshXml(cejshSource, cejshResult);
        assertEquals(Collections.emptyList(), xslError.getErrors());
        final Node cejshRootNode = cejshResult.getNode();
        //        dump(new DOMSource(cejshRootNode));

        List<String> errors = cb.validateCejshXml(new DOMSource(cejshRootNode));
        assertEquals(Collections.emptyList(), errors);

        XPath xpath = ProarcXmlUtils.defaultXPathFactory().newXPath();
        xpath.setNamespaceContext(new SimpleNamespaceContext().add("b", CejshBuilder.NS_BWMETA105));
        assertNotNull(
                xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.ebfd7bf2-169d-476e-a230-0cc39f01764c']",
                        cejshRootNode, XPathConstants.NODE));
        assertEquals("volume1", xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.uuid-volume']/b:name",
                cejshRootNode, XPathConstants.STRING));
        assertEquals("issue1", xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.uuid-issue']/b:name",
                cejshRootNode, XPathConstants.STRING));
        assertEquals("1985", xpath.evaluate(
                "/b:bwmeta/b:element[@id='bwmeta1.element.9358223b-b135-388f-a71e-24ac2c8422c7-1985']/b:name",
                cejshRootNode, XPathConstants.STRING));
    }

    @Test
    public void testCreateCejshXml_TitleVolume() throws Exception {
        CejshConfig conf = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(conf);
        Document articleDoc = cb.getDocumentBuilder()
                .parse(CejshBuilderTest.class.getResource("article_mods.xml").toExternalForm());
        // issn must match some cejsh_journals.xml/cejsh/journal[@issn=$issn]
        final String pkgIssn = "0231-5955";
        Title title = new Title();
        title.setIssn(pkgIssn);
        Volume volume = new Volume();
        volume.setVolumeId("uuid-volume");
        volume.setVolumeNumber("volume1");
        volume.setYear("1985");
        Article article = new Article(null, articleDoc.getDocumentElement(), null);
        cb.setTitle(title);
        cb.setVolume(volume);

        Document articleCollectionDoc = cb.mergeElements(Collections.singletonList(article));
        DOMSource cejshSource = new DOMSource(articleCollectionDoc);
        DOMResult cejshResult = new DOMResult();
        //        dump(cejshSource);

        TransformErrorListener xslError = cb.createCejshXml(cejshSource, cejshResult);
        assertEquals(Collections.emptyList(), xslError.getErrors());
        final Node cejshRootNode = cejshResult.getNode();
        //        dump(new DOMSource(cejshRootNode));

        List<String> errors = cb.validateCejshXml(new DOMSource(cejshRootNode));
        assertEquals(Collections.emptyList(), errors);

        XPath xpath = ProarcXmlUtils.defaultXPathFactory().newXPath();
        xpath.setNamespaceContext(new SimpleNamespaceContext().add("b", CejshBuilder.NS_BWMETA105));
        assertNotNull(
                xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.ebfd7bf2-169d-476e-a230-0cc39f01764c']",
                        cejshRootNode, XPathConstants.NODE));
        assertEquals("volume1", xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.uuid-volume']/b:name",
                cejshRootNode, XPathConstants.STRING));
        //        assertEquals("issue1", xpath.evaluate("/b:bwmeta/b:element[@id='bwmeta1.element.uuid-issue']/b:name", cejshRootNode, XPathConstants.STRING));
        assertEquals("1985", xpath.evaluate(
                "/b:bwmeta/b:element[@id='bwmeta1.element.9358223b-b135-388f-a71e-24ac2c8422c7-1985']/b:name",
                cejshRootNode, XPathConstants.STRING));
    }

    @Test
    public void testCreateCejshElement_UnknownIssn() throws Exception {
        CejshConfig conf = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(conf);
        Document articleDoc = cb.getDocumentBuilder()
                .parse(CejshBuilderTest.class.getResource("article_mods.xml").toExternalForm());
        final String pkgIssn = "XXX-XXX";
        Issue issue = new Issue();
        issue.setIssn(pkgIssn);
        issue.setIssueId("uuid-issue");
        issue.setIssueNumber("issue1");
        Volume volume = new Volume();
        volume.setVolumeId("uuid-volume");
        volume.setVolumeNumber("volume1");
        volume.setYear("1985");
        Article article = new Article(null, articleDoc.getDocumentElement(), null);
        cb.setIssue(issue);
        cb.setVolume(volume);
        Document articleCollectionDoc = cb.mergeElements(Collections.singletonList(article));
        DOMResult cejshResult = new DOMResult();
        cb.createCejshXml(new DOMSource(articleCollectionDoc), cejshResult);
        //        dump(new DOMSource(cejshResult.getNode()));

        // issn must match some cejsh_journals.xml/cejsh/journal[@issn=$issn]
        assertEquals(1, cb.getTranformationErrors().size());
        assertTrue(cb.getTranformationErrors().get(0),
                cb.getTranformationErrors().get(0).startsWith("ERROR: Missing journalId"));
    }

    @Test
    public void testCreatePackageName_TitleVolumeIssue() throws Exception {
        CejshConfig cejshConfig = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(cejshConfig);
        cb.setTitle(new Title());
        cb.getTitle().setIssn("1111-1111");
        cb.setVolume(new Volume());
        cb.getVolume().setVolumeNumber("2");
        cb.getVolume().setVolumeId("uuid-volume");
        cb.getVolume().setYear("1980");
        cb.setIssue(new Issue());
        cb.getIssue().setIssn("2222-2222");
        cb.getIssue().setIssueNumber("3");
        cb.getIssue().setIssueId("uuid:issue");
        assertEquals("2222-2222_1980_2_3", cb.createPackageName());

        cb.getVolume().setVolumeNumber(null);
        cb.getVolume().setYear(null);
        cb.getIssue().setIssueNumber("");
        assertEquals("2222-2222_NA_NA_NA", cb.createPackageName());
    }

    @Test
    public void testCreatePackageName_TitleVolume() throws Exception {
        CejshConfig cejshConfig = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(cejshConfig);
        cb.setTitle(new Title());
        cb.getTitle().setIssn("1111-1111");
        cb.setVolume(new Volume());
        cb.getVolume().setVolumeNumber("2");
        cb.getVolume().setVolumeId("uuid-volume");
        cb.getVolume().setYear("1980");
        assertEquals("1111-1111_1980_2_NA", cb.createPackageName());

        cb.getVolume().setVolumeNumber(null);
        cb.getVolume().setYear(null);
        assertEquals("1111-1111_NA_NA_NA", cb.createPackageName());
    }

    @Test
    public void testWritePackage() throws Exception {
        CejshConfig cejshConfig = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(cejshConfig);
        CejshContext ctx = new CejshContext(temp.getRoot(), new CejshStatusHandler(), cejshConfig);
        cb.setTitle(new Title());
        cb.getTitle().setIssn("1111-1111");
        cb.setVolume(new Volume());
        cb.getVolume().setVolumeNumber("2");
        cb.getVolume().setVolumeId("uuid-volume");
        cb.getVolume().setYear("1980");
        cb.setIssue(new Issue());
        cb.getIssue().setIssn("0231-5955");
        cb.getIssue().setIssueNumber("3");
        cb.getIssue().setIssueId("uuid-issue");
        Document articleDoc = cb.getDocumentBuilder()
                .parse(CejshBuilderTest.class.getResource("article_mods.xml").toExternalForm());
        Article addArticle = cb.addArticle(articleDoc, DigitalObjectElement.NULL, ctx);
        assertNotNull(addArticle);
        assertTrue(addArticle.isReviewed());
        File resultPkg = cb.writePackage(DigitalObjectElement.NULL, Arrays.asList(addArticle), ctx);
        assertTrue(ctx.getStatus().isOk());
        assertNotNull(resultPkg);
        assertTrue(resultPkg.isDirectory());
        assertTrue(new File(resultPkg.getAbsolutePath() + ".zip").exists());
        assertTrue(new File(resultPkg, CejshBuilder.IMPORT_PROPERTIES_FILENAME).exists());
        assertTrue(new File(new File(resultPkg, CejshBuilder.IMPORTS_NEW_FILENAME), CejshBuilder.P0XML_FILENAME)
                .exists());
    }

    @Test
    public void testAddArticleNotReviewed() throws Exception {
        CejshConfig cejshConfig = new CejshConfig();
        CejshBuilder cb = new CejshBuilder(cejshConfig);
        CejshContext ctx = new CejshContext(temp.getRoot(), new CejshStatusHandler(), cejshConfig);
        cb.setTitle(new Title());
        cb.getTitle().setIssn("1111-1111");
        cb.setVolume(new Volume());
        cb.getVolume().setVolumeNumber("2");
        cb.getVolume().setVolumeId("uuid-volume");
        cb.getVolume().setYear("1980");
        cb.setIssue(new Issue());
        cb.getIssue().setIssn("0231-5955");
        cb.getIssue().setIssueNumber("3");
        cb.getIssue().setIssueId("uuid-issue");
        Document articleDoc = cb.getDocumentBuilder()
                .parse(CejshBuilderTest.class.getResource("article_not_reviewed_mods.xml").toExternalForm());
        Article addArticle = cb.addArticle(articleDoc, DigitalObjectElement.NULL, ctx);
        assertNotNull(addArticle);
        assertFalse(addArticle.isReviewed());
    }

    private void dump(Source src) throws TransformerException {
        dump(src, new StreamResult(System.out));
    }

    private void dump(Source src, Result res) throws TransformerException {
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.transform(src, res);
    }

}