org.apache.zeppelin.submarine.commons.SubmarineUI.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.zeppelin.submarine.commons.SubmarineUI.java

Source

/*
 * 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.apache.zeppelin.submarine.commons;

import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hubspot.jinjava.Jinjava;
import org.apache.commons.lang.StringUtils;
import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static org.apache.zeppelin.submarine.commons.SubmarineUtils.unifyKey;

public class SubmarineUI {
    private Logger LOGGER = LoggerFactory.getLogger(SubmarineUI.class);

    InterpreterContext intpContext;

    private static final String SUBMARINE_DASHBOARD_JINJA = "ui_templates/submarine-dashboard.jinja";
    //private static final String SUBMARINE_COMMAND_RUN_JINJA
    //    = "ui_templates/submarine-command-run.jinja";
    private static final String SUBMARINE_USAGE_JINJA = "ui_templates/submarine-usage.jinja";
    private static final String SUBMARINE_COMMAND_OPTIONS_JSON = "ui_templates/submarine-command-options.json";
    private static final String SUBMARINE_LOG_HEAD_JINJA = "ui_templates/submarine-log-head.jinja";

    public SubmarineUI(InterpreterContext context) {
        intpContext = context;

        createUILayer();
    }

    // context.out::List<InterpreterResultMessageOutput> resultMessageOutputs
    // resultMessageOutputs[0] is UI
    // resultMessageOutputs[1] is Execution information
    // resultMessageOutputs[2] is Execution LOG
    public void createUILayer() {
        try {
            // The first one is the UI interface.
            intpContext.out.setTypeAndConfig(InterpreterResult.Type.ANGULAR);
            // The second is Execution information.
            intpContext.out.setTypeAndConfig(InterpreterResult.Type.ANGULAR);
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

    public void createSubmarineUI(SubmarineCommand submarineCmd) {
        try {
            HashMap<String, Object> mapParams = new HashMap();
            mapParams.put(unifyKey(SubmarineConstants.PARAGRAPH_ID), intpContext.getParagraphId());
            mapParams.put(unifyKey(SubmarineConstants.COMMAND_TYPE), submarineCmd.getCommand());

            String templateName = "";
            switch (submarineCmd) {
            case USAGE:
                templateName = SUBMARINE_USAGE_JINJA;
                List<CommandlineOption> commandlineOptions = getCommandlineOptions();
                mapParams.put(SubmarineConstants.COMMANDLINE_OPTIONS, commandlineOptions);
                break;
            default:
                templateName = SUBMARINE_DASHBOARD_JINJA;
                break;
            }

            URL urlTemplate = Resources.getResource(templateName);
            String template = Resources.toString(urlTemplate, Charsets.UTF_8);
            Jinjava jinjava = new Jinjava();
            String submarineUsage = jinjava.render(template, mapParams);

            // UI
            InterpreterResultMessageOutput outputUI = intpContext.out.getOutputAt(0);
            outputUI.clear();
            outputUI.write(submarineUsage);
            outputUI.flush();

            // UI update, log needs to be cleaned at the same time
            InterpreterResultMessageOutput outputLOG = intpContext.out.getOutputAt(1);
            outputLOG.clear();
            outputLOG.flush();
        } catch (IOException e) {
            LOGGER.error("Can't print usage", e);
        }
    }

    public List<CommandlineOption> getCommandlineOptions() throws IOException {
        List<CommandlineOption> commandlineOptions = new ArrayList<>();

        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(this.getClass().getResourceAsStream("/" + SUBMARINE_COMMAND_OPTIONS_JSON)));

        String line;
        StringBuffer strbuf = new StringBuffer();
        int licensedLineCount = 14;
        while ((line = bufferedReader.readLine()) != null) {
            if (licensedLineCount-- > 0) {
                continue;
            }
            strbuf.append(line);
        }
        Gson gson = new Gson();
        commandlineOptions = gson.fromJson(strbuf.toString(), new TypeToken<List<CommandlineOption>>() {
        }.getType());

        return commandlineOptions;
    }

    public void createUsageUI() {
        try {
            List<CommandlineOption> commandlineOptions = getCommandlineOptions();
            HashMap<String, Object> mapParams = new HashMap();
            mapParams.put(unifyKey(SubmarineConstants.PARAGRAPH_ID), intpContext.getParagraphId());
            mapParams.put(SubmarineConstants.COMMANDLINE_OPTIONS, commandlineOptions);

            URL urlTemplate = Resources.getResource(SUBMARINE_USAGE_JINJA);
            String template = Resources.toString(urlTemplate, Charsets.UTF_8);
            Jinjava jinjava = new Jinjava();
            String submarineUsage = jinjava.render(template, mapParams);

            InterpreterResultMessageOutput outputUI = intpContext.out.getOutputAt(0);
            outputUI.clear();
            outputUI.write(submarineUsage);
            outputUI.flush();

            // UI update, log needs to be cleaned at the same time
            InterpreterResultMessageOutput outputLOG = intpContext.out.getOutputAt(1);
            outputLOG.clear();
            outputLOG.flush();
        } catch (IOException e) {
            LOGGER.error("Can't print usage", e);
        }
    }

    public void createLogHeadUI() {
        try {
            HashMap<String, Object> mapParams = new HashMap();
            URL urlTemplate = Resources.getResource(SUBMARINE_LOG_HEAD_JINJA);
            String template = Resources.toString(urlTemplate, Charsets.UTF_8);
            Jinjava jinjava = new Jinjava();
            String submarineUsage = jinjava.render(template, mapParams);

            InterpreterResultMessageOutput outputUI = intpContext.out.getOutputAt(1);
            outputUI.clear();
            outputUI.write(submarineUsage);
            outputUI.flush();
        } catch (IOException e) {
            LOGGER.error("Can't print usage", e);
        }
    }

    public void printCommnadUI(SubmarineCommand submarineCmd) {
        try {
            HashMap<String, Object> mapParams = new HashMap();
            mapParams.put(unifyKey(SubmarineConstants.PARAGRAPH_ID), intpContext.getParagraphId());

            URL urlTemplate = Resources.getResource(SUBMARINE_DASHBOARD_JINJA);
            String template = Resources.toString(urlTemplate, Charsets.UTF_8);
            Jinjava jinjava = new Jinjava();
            String submarineUsage = jinjava.render(template, mapParams);

            InterpreterResultMessageOutput outputUI = intpContext.out.getOutputAt(0);
            outputUI.clear();
            outputUI.write(submarineUsage);
            outputUI.flush();

            // UI update, log needs to be cleaned at the same time
            InterpreterResultMessageOutput outputLOG = intpContext.out.getOutputAt(1);
            outputLOG.clear();
            outputLOG.flush();
        } catch (IOException e) {
            LOGGER.error("Can't print usage", e);
        }
    }

    public void outputLog(String title, String message) {
        try {
            StringBuffer formatMsg = new StringBuffer();
            InterpreterResultMessageOutput output = null;
            output = intpContext.out.getOutputAt(1);
            formatMsg.append("<div style=\"width:100%\">");
            if (!StringUtils.isEmpty(title)) {
                formatMsg.append(title);
            }
            formatMsg.append("<pre style=\"max-height:120px\">");
            formatMsg.append(message);
            formatMsg.append("</pre>");
            formatMsg.append("</div>\n");
            output.write(formatMsg.toString());
            output.flush();
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

    /**
     * submarine Commandline Option
     */
    class CommandlineOption {
        private String name;
        private String description;

        CommandlineOption(String name, String description) {
            this.name = name;
            this.description = description;
        }

        public String getName() {
            return name;
        }

        public String getDescription() {
            return description;
        }
    }
}