org.pentaho.di.www.CarteIT.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.www.CarteIT.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2017 by Hitachi Vantara : http://www.pentaho.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 org.pentaho.di.www;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.html.dom.HTMLDocumentImpl;
import org.cyberneko.html.parsers.DOMFragmentParser;
import org.eclipse.jetty.testing.HttpTester;
import org.eclipse.jetty.testing.ServletTester;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.logging.LogChannel;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaFactory;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransConfiguration;
import org.pentaho.di.trans.TransExecutionConfiguration;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransPreviewFactory;
import org.pentaho.di.trans.steps.rowgenerator.RowGeneratorMeta;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.html.HTMLDocument;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class CarteIT {

    private ServletTester tester = null;

    private CarteSingleton carte = CarteSingleton.getInstance();

    @Before
    public void before() {

        carte.setJobMap(new JobMap());
        carte.setTransformationMap(new TransformationMap());
        carte.setSocketRepository(new SocketRepository(new LogChannel("Carte")));

        tester = new ServletTester();
        tester.addServlet(GetRootServlet.class, "/*");
        tester.addServlet(GetStatusServlet.class, GetStatusServlet.CONTEXT_PATH);
        tester.addServlet(AddTransServlet.class, RegisterTransServlet.CONTEXT_PATH);
        tester.addServlet(StartTransServlet.class, StartTransServlet.CONTEXT_PATH);
        tester.addServlet(PauseTransServlet.class, PauseTransServlet.CONTEXT_PATH);
        try {
            tester.start();
            System.out.println("Started");
        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    @After
    public void after() {
        try {
            tester.stop();
            carte.getDetections().clear();
            carte.getSocketRepository().closeAll();
            System.out.println("Stopped");
        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    @Test
    public void testGetRootServlet() {
        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(GetRootServlet.CONTEXT_PATH);
        request.setVersion("HTTP/1.0");
        try {
            response.parse(tester.getResponses(request.generate()));

            Node document = parse(response.getContent());
            String title = BaseMessages.getString(GetRootServlet.class, "GetRootServlet.KettleSlaveServer.Title");
            Assert.assertEquals(title, findTextNode(document, "TITLE").getTextContent());
            String menu = BaseMessages.getString(GetRootServlet.class, "GetRootServlet.SlaveServerMenu");
            Assert.assertEquals(menu, findTextNode(document, "H2").getTextContent());
            String status = BaseMessages.getString(GetRootServlet.class, "GetRootServlet.ShowStatus");
            Assert.assertEquals(status, findTextNode(document, "A").getTextContent());

        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    @Test
    public void testGetStatusServlet() {
        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(GetStatusServlet.CONTEXT_PATH + "?xml=Y");
        request.setVersion("HTTP/1.0");
        try {
            response.parse(tester.getResponses(request.generate()));
            // just test if we actually can create a SlaveServerStatus from the webservice
            // and that it is the same going in as out
            String xml = XMLHandler.getXMLHeader(Const.XML_ENCODING)
                    + SlaveServerStatus.fromXML(response.getContent()).getXML();
            Assert.assertEquals(response.getContent().trim(), xml.trim());
        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    public SlaveServerStatus getStatus() {
        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(GetStatusServlet.CONTEXT_PATH + "?xml=Y");
        request.setVersion("HTTP/1.0");
        try {
            response.parse(tester.getResponses(request.generate()));
            return SlaveServerStatus.fromXML(response.getContent());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    @Test
    public void testAddTransServlet() {

        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(RegisterTransServlet.CONTEXT_PATH + "?xml=Y");
        request.setVersion("HTTP/1.0");
        try {

            TransExecutionConfiguration transExecConfig = new TransExecutionConfiguration();
            Trans trans = CarteIT.generateTestTransformation();
            TransConfiguration transConfig = new TransConfiguration(trans.getTransMeta(), transExecConfig);
            request.setContent(transConfig.getXML());
            response.parse(tester.getResponses(request.generate()));

            Document document = XMLHandler.loadXMLString(response.getContent());
            NodeList nodes = document.getElementsByTagName("result");
            Assert.assertEquals(1, nodes.getLength());
            Assert.assertEquals(WebResult.STRING_OK, nodes.item(0).getTextContent());

            SlaveServerStatus status = getStatus();
            SlaveServerTransStatus transStatus = status.findTransStatus(trans.getName(), null); // find the first one
            Assert.assertNotNull(transStatus);
            Assert.assertFalse(transStatus.isPaused());
            Assert.assertFalse(transStatus.isRunning());

        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    @Test
    public void testStartTransServlet() {

        // add our test transformation
        testAddTransServlet();

        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(StartTransServlet.CONTEXT_PATH + "?xml=Y&name=CarteUnitTest");
        request.setVersion("HTTP/1.0");
        try {
            response.parse(tester.getResponses(request.generate()));

            Document document = XMLHandler.loadXMLString(response.getContent());
            NodeList nodes = document.getElementsByTagName("result");
            Assert.assertEquals(1, nodes.getLength());
            Assert.assertEquals(WebResult.STRING_OK, nodes.item(0).getTextContent());

            SlaveServerStatus status = getStatus();
            SlaveServerTransStatus transStatus = status.findTransStatus("CarteUnitTest", null);
            Assert.assertNotNull(transStatus);
            Assert.assertFalse(transStatus.isPaused());
            Assert.assertTrue(transStatus.isRunning());

        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    @Test
    public void testPauseTransServlet() {

        // add our test transformation
        testAddTransServlet();
        // start our test transformation
        testStartTransServlet();

        HttpTester request = new HttpTester();
        HttpTester response = new HttpTester();
        request.setMethod("GET");
        request.setHeader("Host", "tester");
        request.setURI(PauseTransServlet.CONTEXT_PATH + "?xml=Y&name=CarteUnitTest");
        request.setVersion("HTTP/1.0");
        try {

            SlaveServerStatus status = getStatus();
            SlaveServerTransStatus transStatus = status.findTransStatus("CarteUnitTest", null);
            Assert.assertNotNull(transStatus);
            // let's make sure that it is not paused
            Assert.assertFalse(transStatus.isPaused());

            response.parse(tester.getResponses(request.generate()));

            Document document = XMLHandler.loadXMLString(response.getContent());
            NodeList nodes = document.getElementsByTagName("result");
            Assert.assertEquals(1, nodes.getLength());
            Assert.assertEquals(WebResult.STRING_OK, nodes.item(0).getTextContent());

            status = getStatus();
            transStatus = status.findTransStatus("CarteUnitTest", null);
            Assert.assertNotNull(transStatus);
            // now check to be sure it is paused
            Assert.assertTrue(transStatus.isPaused());

        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail(ex.getMessage());
        }
    }

    public static Node parse(String content) throws SAXException, IOException {
        DOMFragmentParser parser = new DOMFragmentParser();
        HTMLDocument document = new HTMLDocumentImpl();
        DocumentFragment fragment = document.createDocumentFragment();

        InputSource is = new InputSource(new StringReader(content));
        parser.parse(is, fragment);
        return fragment;
    }

    public static Node findTextNode(Node parent, String parentNodeName) {
        List<Node> nodes = flatten(parent, null);
        for (Node node : nodes) {
            if (node.getNodeType() == Node.TEXT_NODE
                    && node.getParentNode().getNodeName().equalsIgnoreCase(parentNodeName)) {
                return node;
            }
        }
        return null;
    }

    // public static Node findNode(Node parent, String nodeName, short nodeType, int index) {
    // List<Node> nodes = flatten(parent, null);
    // for (Node node : nodes) {
    // if (node.getNodeName().equals(nodeName) && node.getNodeType() == nodeType) {
    // return node;
    // }
    // }
    // return null;
    // }

    public static List<Node> flatten(Node parent, List<Node> nodes) {
        Node child = parent.getFirstChild();
        if (nodes == null) {
            nodes = new ArrayList<Node>();
        }
        nodes.add(parent);
        while (child != null) {
            flatten(child, nodes);
            child = child.getNextSibling();
        }
        return nodes;
    }

    public static void print(Node node, String indent) {
        // System.out.println(indent + node.getClass().getName());
        if (node.getNodeType() == Node.TEXT_NODE && !StringUtils.isEmpty(node.getTextContent().trim())) {
            System.out.println(node.getParentNode().getNodeName());
            System.out.println(node.getNodeName() + node.getTextContent());
        }
        Node child = node.getFirstChild();
        while (child != null) {
            print(child, indent + " ");
            child = child.getNextSibling();
        }
    }

    //CHECKSTYLE:Indentation:OFF
    public static Trans generateTestTransformation() {
        RowGeneratorMeta A = new RowGeneratorMeta();
        A.allocate(3);
        A.setRowLimit("10000000");

        A.getFieldName()[0] = "ID";
        A.getFieldType()[0] = ValueMetaFactory.getValueMetaName(ValueMetaInterface.TYPE_INTEGER);
        A.getFieldLength()[0] = 7;
        A.getValue()[0] = "1234";

        A.getFieldName()[1] = "Name";
        A.getFieldType()[1] = ValueMetaFactory.getValueMetaName(ValueMetaInterface.TYPE_STRING);
        A.getFieldLength()[1] = 35;
        A.getValue()[1] = "Some name";

        A.getFieldName()[2] = "Last updated";
        A.getFieldType()[2] = ValueMetaFactory.getValueMetaName(ValueMetaInterface.TYPE_DATE);
        A.getFieldFormat()[2] = "yyyy/MM/dd";
        A.getValue()[2] = "2010/02/09";

        TransMeta transMeta = TransPreviewFactory.generatePreviewTransformation(null, A, "A");
        transMeta.setName("CarteUnitTest");
        transMeta.setSizeRowset(2500);
        transMeta.setFeedbackSize(50000);
        transMeta.setUsingThreadPriorityManagment(false);

        return new Trans(transMeta);
    }
}