com.stratio.ingestion.morphline.commons.ReadXmlTest.java Source code

Java tutorial

Introduction

Here is the source code for com.stratio.ingestion.morphline.commons.ReadXmlTest.java

Source

/**
 * Copyright (C) 2014 Stratio (http://stratio.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.stratio.ingestion.morphline.commons;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.kitesdk.morphline.api.Command;
import org.kitesdk.morphline.api.MorphlineContext;
import org.kitesdk.morphline.api.Record;
import org.kitesdk.morphline.base.Compiler;
import org.kitesdk.morphline.base.Fields;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.google.common.base.Preconditions;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigObject;
import com.typesafe.config.ConfigValue;

@RunWith(JUnit4.class)
public class ReadXmlTest {

    private static final String XML_FILE = "/readxml/test.xml";
    private static final String MORPH_CONF_FILE = "/readxml/readXml.conf";
    private static final String MORPH_CONFALL_FILE = "/readxml/readXmlAll.conf";
    private static final String MORPH_CONFHEADER_FILE = "/readxml/readXmlHeader.conf";
    private static final String MORPH_CONFERROR_FILE = "/readxml/readXmlError.conf";

    private Document doc;
    private Config config;
    private Config configAll;
    private Config configHeader;
    private Config configError;

    @Before
    public void setUp() throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder;
        docBuilder = factory.newDocumentBuilder();

        URL url = getClass().getResource(XML_FILE);
        File file = new File(url.getPath());

        doc = docBuilder.parse(file);
        doc.getDocumentElement().normalize();

        config = parse(MORPH_CONF_FILE).getConfigList("commands").get(0).getConfig("readXml");
        configAll = parse(MORPH_CONFALL_FILE).getConfigList("commands").get(0).getConfig("readXml");
        configHeader = parse(MORPH_CONFHEADER_FILE).getConfigList("commands").get(0).getConfig("readXml");
        configError = parse(MORPH_CONFERROR_FILE).getConfigList("commands").get(0).getConfig("readXml");
    }

    @Test
    public void testConfiguration() throws URISyntaxException {
        ConfigObject object = config.getObject("paths");
        Set<String> keySet = object.keySet();
        List<String> values = new ArrayList<String>();

        for (String key : keySet) {
            ConfigValue configValue = object.get(key);
            values.add(configValue.render());
        }

        assertEquals(keySet.size(), 2);

        List<String> result = new ArrayList<String>();
        result.add(new String("\"/catalog/book[@id='bk101']/author\""));
        result.add(new String("\"/catalog/book[@id='bk102']/genre\""));
        assertTrue(values.size() == result.size());
    }

    @Test
    public void testRecordCreated() throws IOException {
        final MorphlineContext context = new MorphlineContext.Builder().build();
        Collector collectorParent = new Collector();
        Collector collectorChild = new Collector();
        final Command command = new ReadXmlBuilder().build(config, collectorParent, collectorChild, context);

        Record record = new Record();
        record.put(Fields.ATTACHMENT_BODY,
                new FileInputStream(new File(getClass().getResource(XML_FILE).getPath())));

        command.process(record);

        Record result = collectorChild.getRecords().get(0);
        assertEquals(result.get("book1").get(0), "Gambardella, Matthew");
    }

    @Test
    public void testAll() throws FileNotFoundException {
        final MorphlineContext context = new MorphlineContext.Builder().build();
        Collector collectorParent = new Collector();
        Collector collectorChild = new Collector();
        final Command command = new ReadXmlBuilder().build(configAll, collectorParent, collectorChild, context);

        Record record = new Record();
        record.put(Fields.ATTACHMENT_BODY,
                new FileInputStream(new File(getClass().getResource(XML_FILE).getPath())));

        command.process(record);

        Record result = collectorChild.getRecords().get(0);
        assertTrue(((String) result.get("_xml").get(0)).length() > 0);
    }

    @Test
    public void testSourceField() throws FileNotFoundException {
        final MorphlineContext context = new MorphlineContext.Builder().build();
        Collector collectorParent = new Collector();
        Collector collectorChild = new Collector();
        final Command command = new ReadXmlBuilder().build(configHeader, collectorParent, collectorChild, context);

        Record record = new Record();
        record.put("field",
                "<book id=\"bk101\"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book>");
        record.put(Fields.ATTACHMENT_BODY,
                new FileInputStream(new File(getClass().getResource(XML_FILE).getPath())));
        command.process(record);

        Record result = collectorChild.getRecords().get(0);
        assertTrue(((String) result.get("book1").get(0)).equals("Gambardella, Matthew"));
    }

    @Test
    public void testNonExistentField() throws FileNotFoundException {
        final MorphlineContext context = new MorphlineContext.Builder().build();
        Collector collectorParent = new Collector();
        Collector collectorChild = new Collector();
        final Command command = new ReadXmlBuilder().build(configError, collectorParent, collectorChild, context);

        Record record = new Record();
        record.put(Fields.ATTACHMENT_BODY,
                new FileInputStream(new File(getClass().getResource(XML_FILE).getPath())));
        command.process(record);

        Record result = collectorChild.getRecords().get(0);
    }

    protected Config parse(String file, Config... overrides) throws IOException {
        File tmpFile = File.createTempFile("morphlines_", ".conf");
        IOUtils.copy(getClass().getResourceAsStream(file), new FileOutputStream(tmpFile));
        Config config = new Compiler().parse(tmpFile, overrides);
        config = config.getConfigList("morphlines").get(0);
        Preconditions.checkNotNull(config);
        return config;
    }

}