org.apache.zeppelin.lens.LensJLineShellComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.zeppelin.lens.LensJLineShellComponent.java

Source

/*
 * Copyright 2011-2012 the original author or authors.
 * 
 * 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.lens;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.SmartLifecycle;
import org.springframework.shell.CommandLine;
import org.springframework.shell.plugin.BannerProvider;
import org.springframework.shell.plugin.HistoryFileNameProvider;
import org.springframework.shell.plugin.PluginUtils;
import org.springframework.shell.plugin.PromptProvider;
import org.springframework.shell.core.*;

/**
 * workaround for https://github.com/spring-projects/spring-shell/issues/73
 */
public class LensJLineShellComponent extends JLineShell
        implements SmartLifecycle, ApplicationContextAware, InitializingBean {

    @Autowired
    private CommandLine commandLine;

    private volatile boolean running = false;
    private Thread shellThread;

    private ApplicationContext applicationContext;
    private boolean printBanner = true;

    private String historyFileName;
    private String promptText;
    private String productName;
    private String banner;
    private String version;
    private String welcomeMessage;

    private ExecutionStrategy executionStrategy = new LensSimpleExecutionStrategy();
    private SimpleParser parser = new SimpleParser();

    private static final Logger LOGGER = LoggerFactory.getLogger(LensJLineShellComponent.class);

    public SimpleParser getSimpleParser() {
        return parser;
    }

    public boolean isAutoStartup() {
        return false;
    }

    public void stop(Runnable callback) {
        stop();
        callback.run();
    }

    public int getPhase() {
        return 1;
    }

    public void start() {
        //customizePlug must run before start thread to take plugin's configuration into effect
        customizePlugin();
        shellThread = new Thread(this, "Spring Shell");
        shellThread.start();
        running = true;
    }

    public void stop() {
        if (running) {
            closeShell();
            running = false;
        }
    }

    public boolean isRunning() {
        return running;
    }

    @SuppressWarnings("rawtypes")
    public void afterPropertiesSet() {

        Map<String, CommandMarker> commands = BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext,
                CommandMarker.class);
        for (CommandMarker command : commands.values()) {
            getSimpleParser().add(command);
        }

        Map<String, Converter> converters = BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext,
                Converter.class);
        for (Converter<?> converter : converters.values()) {
            getSimpleParser().add(converter);
        }

        setHistorySize(commandLine.getHistorySize());
        if (commandLine.getShellCommandsToExecute() != null) {
            setPrintBanner(false);
        }
    }

    /**
     * wait the shell command to complete by typing "quit" or "exit" 
     * 
     */
    public void waitForComplete() {
        try {
            shellThread.join();
        } catch (InterruptedException e) {
            LOGGER.error(e.toString(), e);
        }
    }

    @Override
    protected ExecutionStrategy getExecutionStrategy() {
        return executionStrategy;
    }

    @Override
    protected Parser getParser() {
        return parser;
    }

    @Override
    public String getStartupNotifications() {
        return null;
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void customizePlugin() {
        this.historyFileName = getHistoryFileName();
        this.promptText = getPromptText();
        String[] banner = getBannerText();
        this.banner = banner[0];
        this.welcomeMessage = banner[1];
        this.version = banner[2];
        this.productName = banner[3];
    }

    /**
     * get history file name from provider. The provider has highest order 
     * <link>org.springframework.core.Ordered.getOder</link> will win. 
     * 
     * @return history file name 
     */
    protected String getHistoryFileName() {
        HistoryFileNameProvider historyFileNameProvider = PluginUtils
                .getHighestPriorityProvider(this.applicationContext, HistoryFileNameProvider.class);
        String providerHistoryFileName = historyFileNameProvider.getHistoryFileName();
        if (providerHistoryFileName != null) {
            return providerHistoryFileName;
        } else {
            return historyFileName;
        }
    }

    /**
     * get prompt text from provider. The provider has highest order 
     * <link>org.springframework.core.Ordered.getOder</link> will win. 
     * 
     * @return prompt text
     */
    protected String getPromptText() {
        PromptProvider promptProvider = PluginUtils.getHighestPriorityProvider(this.applicationContext,
                PromptProvider.class);
        String providerPromptText = promptProvider.getPrompt();
        if (providerPromptText != null) {
            return providerPromptText;
        } else {
            return promptText;
        }
    }

    /**
     * Get Banner and Welcome Message from provider. The provider has highest order 
     * <link>org.springframework.core.Ordered.getOder</link> will win. 
     * @return BannerText[0]: Banner
     *         BannerText[1]: Welcome Message
     *         BannerText[2]: Version
     *         BannerText[3]: Product Name
     */
    private String[] getBannerText() {
        String[] bannerText = new String[4];
        BannerProvider provider = PluginUtils.getHighestPriorityProvider(this.applicationContext,
                BannerProvider.class);
        bannerText[0] = provider.getBanner();
        bannerText[1] = provider.getWelcomeMessage();
        bannerText[2] = provider.getVersion();
        bannerText[3] = provider.getProviderName();
        return bannerText;
    }

    public void printBannerAndWelcome() {
        if (printBanner) {
            logger.info(this.banner);
            logger.info(getWelcomeMessage());
        }
    }

    /**
     * get the welcome message at start.
     * 
     * @return welcome message
     */
    public String getWelcomeMessage() {
        return this.welcomeMessage;
    }

    /**
     * @param printBanner the printBanner to set
     */
    public void setPrintBanner(boolean printBanner) {
        this.printBanner = printBanner;
    }

    protected String getProductName() {
        return productName;
    }

    protected String getVersion() {
        return version;
    }
}