de.anbos.eclipse.easyshell.plugin.legacy.PrefsV1_4.java Source code

Java tutorial

Introduction

Here is the source code for de.anbos.eclipse.easyshell.plugin.legacy.PrefsV1_4.java

Source

/*******************************************************************************
 * Copyright (c) 2014 - 2016 Andre Bossert.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Andre Bossert - initial API and implementation and/or initial documentation
 *******************************************************************************/

package de.anbos.eclipse.easyshell.plugin.legacy;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.preference.IPreferenceStore;

import de.anbos.eclipse.easyshell.plugin.preferences.CommandData;
import de.anbos.eclipse.easyshell.plugin.preferences.CommandDataList;
import de.anbos.eclipse.easyshell.plugin.preferences.MenuData;
import de.anbos.eclipse.easyshell.plugin.preferences.MenuDataList;
import de.anbos.eclipse.easyshell.plugin.types.Category;
import de.anbos.eclipse.easyshell.plugin.types.CommandType;
import de.anbos.eclipse.easyshell.plugin.types.MenuNameType;
import de.anbos.eclipse.easyshell.plugin.types.OS;
import de.anbos.eclipse.easyshell.plugin.types.PresetType;
import de.anbos.eclipse.easyshell.plugin.types.ResourceType;
import de.anbos.eclipse.easyshell.plugin.types.Version;

public class PrefsV1_4 {

    /**
     * Commands.
     */
    private enum Command {
        cmdUnknown(0, "Unknown", "shell", "file browser", null, "open {1}", "cd {1} && run ./''{3}''",
                "explore {2}", "{2}{5}"), cmdWinDOS(1, "Windows", "DOS-Shell", "Explorer", null,
                        "cmd.exe /C start \"{4}\" /D {1} cmd.exe /K", "cmd.exe /C start \"{4}\" /D {1} {3}",
                        "explorer.exe /select, {2}", "{2}{5}"), cmdWinPower(2, "Windows", "PowerShell", "Explorer",
                                null, "cmd.exe /C start \"{4}\" /D {1} powershell.exe",
                                "cmd.exe /C start \"{4}\" /D {1} powershell.exe -command ./''{3}''",
                                "explorer.exe /select, {2}", "{2}{5}"), cmdWinCyg(3, "Windows", "Cygwin (Bash)",
                                        "Explorer", null,
                                        "cmd.exe /C start \"{4}\" /D {1} \"C:\\Cygwin\\bin\\bash.exe\"",
                                        "cmd.exe /C start \"{4}\" /D {1} \"C:\\Cygwin\\bin\\bash.exe\" -c ./''{3}''",
                                        "explorer.exe /select, {2} ", "{2}{5}"), cmdKonsoleKDEKonqueror(4, "Linux",
                                                "KDE Konsole", "Konqueror", null, "konsole --noclose --workdir {1}",
                                                "konsole --noclose --workdir {1} -e ./''{3}''",
                                                "konqueror file:\"{2}\"", "{2}{5}"), cmdKonsoleGnome(5, "Linux",
                                                        "Gnome Terminal", "Nautilus", null,
                                                        "gnome-terminal --working-directory=\"{1}\"",
                                                        "gnome-terminal --working-directory=\"{1}\" --command=./''{3}''",
                                                        "nautilus {2}", "{2}{5}"), cmdXtermDtfile(6, "Linux",
                                                                "CDE Xterm", "Dtfile", null, "cd {1} && xterm",
                                                                "cd {1} && xterm -e ./''{3}''", "cd {1} && dtfile",
                                                                "{2}{5}"), cmdTerminalFinder(7, "MAC OS X",
                                                                        "Terminal", "Finder", null,
                                                                        "open -a Terminal {1}",
                                                                        "open -a Terminal {2}", "open -R {2}",
                                                                        "{2}{5}"), cmdKonsoleKDEDolphin(8, "Linux",
                                                                                "KDE Konsole", "Dolphin", null,
                                                                                "konsole --workdir {1}",
                                                                                "konsole --workdir {1} --noclose -e {2}",
                                                                                "dolphin --select {2}",
                                                                                "{2}{5}"), cmdWinConsole(9,
                                                                                        "Windows", "Console",
                                                                                        "Explorer", null,
                                                                                        "console.exe -w \"{4}\" -d {1}",
                                                                                        "console.exe -w \"{4}\" -d {1} -r \"/k\\\"{3}\\\"\"",
                                                                                        "explorer.exe /select, {2}",
                                                                                        "{2}{5}"), cmdWinTotalCommander(
                                                                                                10, "Windows",
                                                                                                "DOS-Shell",
                                                                                                "TotalCommander",
                                                                                                null,
                                                                                                "cmd.exe /C start \"{4}\" /D {1} cmd.exe /K",
                                                                                                "cmd.exe /C start \"{4}\" /D {1} {3}",
                                                                                                "totalcmd.exe /O /T {1}",
                                                                                                "{2}{5}"), cmdWinGitBash(
                                                                                                        11,
                                                                                                        "Windows",
                                                                                                        "Git-Bash",
                                                                                                        "Explorer",
                                                                                                        null,
                                                                                                        "cmd.exe /C start \"{4}\" /D {1} \"C:\\Program Files (x86)\\Git\\bin\\bash.exe\" --login -i",
                                                                                                        "cmd.exe /C start \"{4}\" /D {1} \"C:\\Program Files (x86)\\Git\\bin\\bash.exe\" --login -i -c ./''{3}''",
                                                                                                        "explorer.exe /select, {2} ",
                                                                                                        "{2}{5}"), cmdWinConEmu(
                                                                                                                12,
                                                                                                                "Windows",
                                                                                                                "ConEmu",
                                                                                                                "Explorer",
                                                                                                                null,
                                                                                                                "ConEmu.exe /Title \"{4}\" /Dir \"{1}\" /Single /cmd cmd",
                                                                                                                "ConEmu.exe /Title \"{4}\" /Dir \"{1}\" /Single /cmd \"{3}\"",
                                                                                                                "explorer.exe /select, {2} ",
                                                                                                                "{2}{5}");
        // attributes
        private final int id;
        private final String os;
        private final String console;
        private final String explorer;
        private final String label;
        private final String openCmd;
        private final String runCmd;
        private final String exploreCmd;
        private final String copyPathCmd;

        // construct
        Command(int id, String os, String console, String explorer, String label, String openCmd, String runCmd,
                String exploreCmd, String copyPathCmd) {
            this.id = id;
            this.os = os;
            this.console = console;
            this.explorer = explorer;
            if (label != null) {
                this.label = label;
            } else {
                this.label = os + " " + console + " / " + explorer;
            }
            this.openCmd = openCmd;
            this.runCmd = runCmd;
            this.exploreCmd = exploreCmd;
            this.copyPathCmd = copyPathCmd;
        }

        public int getId() {
            return id;
        }

        @SuppressWarnings("unused")
        public String getOS() {
            return os;
        }

        public String getConsole() {
            return console;
        }

        public String getExplorer() {
            return explorer;
        }

        @SuppressWarnings("unused")
        public String getLabel() {
            return label;
        }

        public String getOpenCmd() {
            return openCmd;
        }

        public String getRunCmd() {
            return runCmd;
        }

        public String getExploreCmd() {
            return exploreCmd;
        }

        public String getCopyPathCmd() {
            return copyPathCmd;
        }

        @SuppressWarnings("unused")
        static Command getFromId(int id) {
            Command ret = cmdUnknown;
            for (int i = 0; i < Command.values().length; i++) {
                if (Command.values()[i].getId() == id) {
                    ret = Command.values()[i];
                }
            }
            return ret;
        }
    }

    public PrefsV1_4() {
    }

    /**
     * Sets the default values of the preferences.
     */
    private static void initializeDefaults(IPreferenceStore store, Command cmd) {
        // set default commands
        store.setDefault(PreferenceEntry.preferenceTargetOpen.getString(), cmd.getOpenCmd());
        store.setDefault(PreferenceEntry.preferenceTargetRun.getString(), cmd.getRunCmd());
        store.setDefault(PreferenceEntry.preferenceTargetExplore.getString(), cmd.getExploreCmd());
        store.setDefault(PreferenceEntry.preferenceTargetCopyPath.getString(), cmd.getCopyPathCmd());
        // set default selected preset
        store.setDefault(PreferenceEntry.preferenceListId.getString(), cmd.getId() - 1);
        store.setDefault(PreferenceEntry.preferenceListString.getString(), cmd.name());
        // set default
        store.setDefault(PreferenceEntry.preferenceQuotes.getString(), Quotes.quotesNo.name());
        store.setDefault(PreferenceEntry.preferenceDebug.getString(), Debug.debugNo.name());
        store.setDefault(PreferenceEntry.preferenceTokenizer.getString(), Tokenizer.EasyShellTokenizerYes.name());
    }

    public static List<String> getPreferenceList() {
        List<String> list = new ArrayList<String>();
        //list.add(PreferenceEntry.preferenceListId.getString());
        list.add(PreferenceEntry.preferenceListString.getString());
        list.add(PreferenceEntry.preferenceTargetOpen.getString());
        list.add(PreferenceEntry.preferenceTargetRun.getString());
        list.add(PreferenceEntry.preferenceTargetExplore.getString());
        list.add(PreferenceEntry.preferenceTargetCopyPath.getString());
        //list.add(PreferenceEntry.preferenceQuotes.getString());
        //list.add(PreferenceEntry.preferenceDebug.getString());
        //list.add(PreferenceEntry.preferenceTokenizer.getString());
        return list;
    }

    /**
     * Loads the preference store and sets the data to controls.
     *
     * @return store loaded.
     */
    public static boolean loadStore(IPreferenceStore store, OS os, CommandDataList cmdDataList,
            MenuDataList menuDataList) {
        // get proper command (detect)
        Command cmdProper = getProperCommand();
        // set defaults first
        initializeDefaults(store, cmdProper);
        // get the properties now
        final String postfix = " (" + Version.v1_4.getName() + ")";
        String IdStr = store.getString(PreferenceEntry.preferenceListString.getString());
        Command command = Command.valueOf(IdStr);
        int position = menuDataList.size();
        // open
        String openCmd = store.getString(PreferenceEntry.preferenceTargetOpen.getString());
        CommandData cmdDataOpen = new CommandData(null, PresetType.presetUser, os, command.getConsole(),
                ResourceType.resourceTypeFileOrDirectory, false, null, Category.categoryOpen,
                CommandType.commandTypeExecute, migrateCommandVariables(openCmd));
        cmdDataList.add(cmdDataOpen);
        MenuData menuDataOpen = new MenuData(cmdDataOpen.getId(), true, MenuNameType.menuNameTypeOpenHere, null,
                cmdDataOpen.getId());
        menuDataOpen.setPosition(position++);
        menuDataOpen.setNamePattern(menuDataOpen.getNamePattern() + postfix);
        menuDataOpen.setNameType(MenuNameType.menuNameTypeUser);
        menuDataList.add(menuDataOpen);
        // run
        String runCmd = store.getString(PreferenceEntry.preferenceTargetRun.getString());
        CommandData cmdDataRun = new CommandData(null, PresetType.presetUser, os, command.getConsole(),
                ResourceType.resourceTypeFileOrDirectory, false, null, Category.categoryRun,
                CommandType.commandTypeExecute, migrateCommandVariables(runCmd));
        cmdDataList.add(cmdDataRun);
        MenuData menuDataRun = new MenuData(cmdDataRun.getId(), true, MenuNameType.menuNameTypeRunWith, null,
                cmdDataRun.getId());
        menuDataRun.setPosition(position++);
        menuDataRun.setNamePattern(menuDataRun.getNamePattern() + postfix);
        menuDataRun.setNameType(MenuNameType.menuNameTypeUser);
        menuDataList.add(menuDataRun);
        // explore
        String exploreCmd = store.getString(PreferenceEntry.preferenceTargetExplore.getString());
        CommandData cmdDataExplore = new CommandData(null, PresetType.presetUser, os, command.getExplorer(),
                ResourceType.resourceTypeFileOrDirectory, false, null, Category.categoryExplore,
                CommandType.commandTypeExecute, migrateCommandVariables(exploreCmd));
        cmdDataList.add(cmdDataExplore);
        MenuData menuDataExplore = new MenuData(cmdDataExplore.getId(), true, MenuNameType.menuNameTypeShowIn, null,
                cmdDataExplore.getId());
        menuDataExplore.setPosition(position++);
        menuDataExplore.setNamePattern(menuDataExplore.getNamePattern() + postfix);
        menuDataExplore.setNameType(MenuNameType.menuNameTypeUser);
        menuDataList.add(menuDataExplore);
        // copy to clipboard
        String copyPathCmd = store.getString(PreferenceEntry.preferenceTargetCopyPath.getString());
        CommandData cmdDataCopyPath = new CommandData(null, PresetType.presetUser, os, "Full Path",
                ResourceType.resourceTypeFileOrDirectory, false, null, Category.categoryClipboard,
                CommandType.commandTypeClipboard, migrateCommandVariables(copyPathCmd));
        cmdDataList.add(cmdDataCopyPath);
        MenuData menuDataCopyPath = new MenuData(cmdDataCopyPath.getId(), true,
                MenuNameType.menuNameTypeCopyToClipboard, null, cmdDataCopyPath.getId());
        menuDataCopyPath.setPosition(position++);
        menuDataCopyPath.setNamePattern(menuDataCopyPath.getNamePattern() + postfix);
        menuDataCopyPath.setNameType(MenuNameType.menuNameTypeUser);
        menuDataList.add(menuDataCopyPath);
        /*
        String QuotesStr = store.getString(PreferenceEntry.preferenceQuotes.getString());
        Quotes quotes = Quotes.valueOf(QuotesStr);
        String DebugStr = store.getString(PreferenceEntry.preferenceDebug.getString());
        Debug debug = Debug.valueOf(DebugStr);
        String TokenizerStr = store.getString(PreferenceEntry.preferenceTokenizer.getString());
        Tokenizer tokenizer = Tokenizer.valueOf(TokenizerStr);
        */
        return true;
    }

    public static String migrateCommandVariables(String cmdString) {
        /*
        {0} == ${easyshell:drive}
        {1} == ${easyshell:container_loc}
        {2} == ${easyshell:resource_loc}
        {3} == ${easyshell:resource_name}
        {4} == ${easyshell:project_name}
        {5} == ${easyshell:line_separator}
        */
        String migratedString = cmdString;
        migratedString = migratedString.replace("{0}", "${easyshell:drive}");
        migratedString = migratedString.replace("{1}", "${easyshell:container_loc}");
        migratedString = migratedString.replace("{2}", "${easyshell:resource_loc}");
        migratedString = migratedString.replace("{3}", "${easyshell:resource_name}");
        migratedString = migratedString.replace("{4}", "${easyshell:project_name}");
        migratedString = migratedString.replace("{5}", "${easyshell:line_separator}");
        return migratedString;
    }

    private static Command getProperCommand() {
        Command cmd = Command.cmdUnknown;
        /* possible OS string:
        AIX
        Digital UNIX
        FreeBSD
        HP UX
        Irix
        Linux
        Mac OS
        Mac OS X
        MPE/iX
        Netware 4.11
        OS/2
        Solaris
        Windows 95
        Windows 98
        Windows NT
        Windows Me
        Windows 2000
        Windows XP
        Windows 2003
        Windows CE
        Windows Vista
        Windows 7
         */
        String osname = System.getProperty("os.name", "").toLowerCase();
        if (osname.indexOf("windows") != -1) {
            cmd = Command.cmdWinDOS;
        } else if (osname.indexOf("mac os x") != -1) {
            cmd = Command.cmdTerminalFinder;
        } else if (osname.indexOf("unix") != -1 || osname.indexOf("irix") != -1 || osname.indexOf("freebsd") != -1
                || osname.indexOf("hp-ux") != -1 || osname.indexOf("aix") != -1 || osname.indexOf("sunos") != -1
                || osname.indexOf("linux") != -1) {
            LinuxDesktop desktop = detectDesktopNew(); // old: detectDesktop()
            if (desktop == LinuxDesktop.desktopKde) {
                cmd = Command.cmdKonsoleKDEDolphin;
            } else if (desktop == LinuxDesktop.desktopGnome) {
                cmd = Command.cmdKonsoleGnome;
            } else if (desktop == LinuxDesktop.desktopCde) {
                cmd = Command.cmdXtermDtfile;
            }
        }
        return cmd;
    }

    private static LinuxDesktop detectDesktopNew() {
        LinuxDesktop resultCode = LinuxDesktop.desktopUnknown;
        if (isKDE()) {
            resultCode = LinuxDesktop.desktopKde;
        } else if (isGnome()) {
            resultCode = LinuxDesktop.desktopGnome;
        }
        return resultCode;
    }

    /**
     * detects KDE desktop
     *
     * @see http://techbase.kde.org/KDE_System_Administration/Environment_Variables#KDE_FULL_SESSION
     */
    private static boolean isKDE() {
        boolean kde = false;
        String[] cmd = new String[2];
        cmd[0] = "echo";
        cmd[1] = "$KDE_FULL_SESSION";
        kde = isExpectedCommandOutput(cmd, "true", true);
        // if not found try another env
        if (!kde) {
            cmd[1] = "$DESKTOP_SESSION";
            kde = isExpectedCommandOutput(cmd, "kde", true);
        }
        return kde;
    }

    /**
     * detects Gnome desktop
     */
    private static boolean isGnome() {
        boolean gnome = false;
        String[] cmd = new String[2];
        cmd[0] = "echo";
        cmd[1] = "$GNOME_DESKTOP_SESSION_ID";
        gnome = isExpectedCommandOutput(cmd, "*", true);
        // if not found try another env
        if (!gnome) {
            cmd[1] = "$DESKTOP_SESSION";
            gnome = isExpectedCommandOutput(cmd, "gnome", true);
        }
        return gnome;
    }

    /**
     * Detects which desktop is used on a unix / linux system.
     *
     * @todo use regex
     *
     * @return The type of desktop.
     * @see detectDesktop
     */
    private static boolean isExpectedCommandOutput(String[] command, String expectedOutput, boolean toLowerCase) {
        boolean found = false;
        try {
            Process proc = Runtime.getRuntime().exec(command);
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null && !found) {
                // in case of * just something should be returned
                if (expectedOutput.indexOf("*") != -1) {
                    if (line.isEmpty()) {
                        found = false;
                        break;
                    } else {
                        found = true;
                    }
                } else {
                    if (toLowerCase)
                        line = line.toLowerCase();
                    if (line.indexOf(expectedOutput) != -1) {
                        found = true;
                    }
                }
            }
            BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
            line = null;
            // If there is any error output, print it to
            // stdout for debugging purposes
            while ((line = err.readLine()) != null) {
                //EasyShellPlugin.getDefault().sysout(true, "detectDesktop stderr >" + line + "<");
            }

            int result = proc.waitFor();
            if (result != 0) {
                // If there is any error code, print it to
                // stdout for debugging purposes
                //EasyShellPlugin.getDefault().sysout(true, "detectDesktop return code: " + result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return found;
    }

}