Package org.jnode.command.system

Source Code of org.jnode.command.system.LoadkeysCommand

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.command.system;

import java.io.PrintWriter;
import java.util.Collection;

import org.jnode.driver.Device;
import org.jnode.driver.DeviceUtils;
import org.jnode.driver.input.KeyboardAPI;
import org.jnode.driver.input.KeyboardInterpreter;
import org.jnode.driver.input.KeyboardInterpreterException;
import org.jnode.driver.input.KeyboardLayoutManager;
import org.jnode.naming.InitialNaming;
import org.jnode.shell.AbstractCommand;
import org.jnode.shell.syntax.Argument;
import org.jnode.shell.syntax.ClassNameArgument;
import org.jnode.shell.syntax.CommandSyntaxException;
import org.jnode.shell.syntax.CountryArgument;
import org.jnode.shell.syntax.FlagArgument;
import org.jnode.shell.syntax.KeyboardLayoutArgument;
import org.jnode.shell.syntax.LanguageArgument;
import org.jnode.shell.syntax.StringArgument;

/**
* @author Marc DENTY
* @author crawley@jnode.org
*/
public class LoadkeysCommand extends AbstractCommand {

    private static final String help_layout = "keyboard layout";
    private static final String help_country = "country code";
    private static final String help_lang = "language parameter";
    private static final String help_variant = "variant parameter";
    private static final String help_triple = "use layout triples";
    private static final String help_add = "add a layout binding";
    private static final String help_remove = "remove a layout binding";
    private static final String help_set = "set the current layout";
    private static final String help_class = "the keyboard interpreter class name";
    private static final String help_super = "display or change the current keyboard layout";
    private static final String ex_syntax_class = "'class' is required with 'add'";
    private static final String ex_syntax_layout = "'layout' is required if 'triple' is not set";
    private static final String ex_syntax_country = "'country' is required if 'triple' is set";
    private static final String ex_set_interp = "Keyboard interpreter for %s not set: %s%n";
    private static final String fmt_add = "Keyboard layout %s added%n";
    private static final String fmt_remove = "Keybard layout %s removed%n";
    private static final String fmt_set_interp = "Keyboard interpreter for %s set to %s%n";
    private static final String fmt_list_interp = "Current keyboard interpreter for %s is %s%n";
   
   
    private final KeyboardLayoutArgument argLayout;
    private final CountryArgument argCountry;
    private final LanguageArgument argLanguage;
    private final StringArgument argVariant;
    private final FlagArgument argTriple;
    private final FlagArgument argAdd;
    private final FlagArgument argRemove;
    private final FlagArgument argSet;
    private final ClassNameArgument argClass;
       
   
    public LoadkeysCommand() {
        super(help_super);
        argLayout   = new KeyboardLayoutArgument("layout", Argument.OPTIONAL, help_layout);
        argCountry  = new CountryArgument("country", Argument.OPTIONAL, help_country);
        argLanguage = new LanguageArgument("language", Argument.OPTIONAL, help_lang);
        argVariant  = new StringArgument("variant", Argument.OPTIONAL, help_variant);
        argTriple   = new FlagArgument("triple", Argument.OPTIONAL, help_triple);
        argAdd      = new FlagArgument("add", Argument.OPTIONAL, help_add);
        argRemove   = new FlagArgument("remove", Argument.OPTIONAL, help_remove);
        argSet      = new FlagArgument("set", Argument.OPTIONAL, help_set);
        argClass    = new ClassNameArgument("class", Argument.OPTIONAL, help_class);
        registerArguments(argTriple, argLayout, argCountry, argLanguage, argVariant,
                          argAdd, argRemove, argSet, argClass);
    }

    public static void main(String[] args) throws Exception {
        new LoadkeysCommand().execute(args);
    }

    /**
     * Execute this command
     */
    public void execute() throws Exception {
        PrintWriter out = getOutput().getPrintWriter();
        PrintWriter err = getError().getPrintWriter();
        final KeyboardLayoutManager mgr = InitialNaming.lookup(KeyboardLayoutManager.NAME);
        final Collection<Device> kbDevs =
            DeviceUtils.getDevicesByAPI(KeyboardAPI.class);

        if (argAdd.isSet()) {
            String layoutID = getLayoutID(mgr);
            if (!argClass.isSet()) {
                throw new CommandSyntaxException(ex_syntax_class);
            }
            String className = argClass.getValue();
            mgr.add(layoutID, className);
            out.format(fmt_add, layoutID);
        } else if (argRemove.isSet()) {
            String layoutID = getLayoutID(mgr);
            mgr.remove(layoutID);
            out.format(fmt_remove, layoutID);
        } else if (argSet.isSet()) {
            String layoutID = getLayoutID(mgr);
            for (Device kb : kbDevs) {
                final KeyboardAPI api = kb.getAPI(KeyboardAPI.class);
                try {
                    final KeyboardInterpreter kbInt = mgr.createKeyboardInterpreter(layoutID);
                    out.format(fmt_set_interp, kb.getId(), kbInt.getClass().getName());
                    api.setKbInterpreter(kbInt);
                } catch (KeyboardInterpreterException ex) {
                    err.format(ex_set_interp, kb.getId(), ex.getLocalizedMessage());
                    // Re-throw the exception so that the shell can decide whether or not
                    // to print a stacktrace.
                    throw ex;
                }
            }
        } else {
            for (Device kb : kbDevs) {
                final KeyboardAPI api = kb.getAPI(KeyboardAPI.class);
                out.format(fmt_list_interp, kb.getId(), api.getKbInterpreter().getClass().getName());
            }
        }
    }

    private String getLayoutID(KeyboardLayoutManager mgr) throws CommandSyntaxException {
        if (!argTriple.isSet()) {
            if (argLayout.isSet()) {
                return argLayout.getValue();
            } else {
                throw new CommandSyntaxException(ex_syntax_layout);
            }
        } else {
            if (!argCountry.isSet()) {
                throw new CommandSyntaxException(ex_syntax_country);
            }
            String country = argCountry.getValue();
            String language = argLanguage.isSet() ? argLanguage.getValue() : "";
            String variant = argVariant.isSet() ? argVariant.getValue() : "";
            if (language.trim().length() == 0) {
                language = null;
            }
            if (variant.trim().length() == 0) {
                variant = null;
            }
            return mgr.makeKeyboardInterpreterID(country, language, variant);
        }
    }
}
TOP

Related Classes of org.jnode.command.system.LoadkeysCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.