| /* |
| * libbrlapi - A library providing access to braille terminals for applications. |
| * |
| * Copyright (C) 2006-2023 by |
| * Samuel Thibault <Samuel.Thibault@ens-lyon.org> |
| * Sébastien Hinderer <Sebastien.Hinderer@ens-lyon.org> |
| * |
| * libbrlapi comes with ABSOLUTELY NO WARRANTY. |
| * |
| * This is free software, placed 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. Please see the file LICENSE-LGPL for details. |
| * |
| * Web Page: http://brltty.app/ |
| * |
| * This software is maintained by Dave Mielke <dave@mielke.cc>. |
| */ |
| |
| package org.a11y.brlapi.commands; |
| |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import org.a11y.brlapi.*; |
| import org.a11y.brlapi.clients.*; |
| import org.a11y.brlapi.programs.*; |
| |
| public class ApiToolCommand extends Program { |
| private static final KeywordMap<Class<? extends Program>> knownPrograms = new KeywordMap<>(); |
| |
| private static void addProgram(Class<? extends Program> type) { |
| String name = type.getSimpleName(); |
| |
| if (isClient(type)) { |
| name = Strings.replaceAll(name, "Client$", ""); |
| } else { |
| name = Strings.replaceAll(name, "Program$", ""); |
| } |
| |
| name = toOperandName(Strings.wordify(name)); |
| knownPrograms.put(name, type); |
| } |
| |
| static { |
| addProgram(ApiErrorClient.class); |
| addProgram(ApiExceptionClient.class); |
| addProgram(BoundCommandsClient.class); |
| addProgram(ComputerBrailleClient.class); |
| addProgram(DriverKeysClient.class); |
| addProgram(EchoClient.class); |
| addProgram(GetDriverClient.class); |
| addProgram(GetModelClient.class); |
| addProgram(GetSizeClient.class); |
| addProgram(ListParametersClient.class); |
| addProgram(PauseClient.class); |
| addProgram(SetParameterClient.class); |
| addProgram(VersionProgram.class); |
| addProgram(WriteArgumentsClient.class); |
| addProgram(WriteDotsClient.class); |
| addProgram(WriteTextClient.class); |
| } |
| |
| public ApiToolCommand(String... arguments) { |
| super(arguments); |
| addRequiredParameters("program/client"); |
| addRepeatingParameter("argument"); |
| } |
| |
| @Override |
| public String getPurpose() { |
| return "Command line access to the functionality provided by the BrlAPI interface."; |
| } |
| |
| @Override |
| protected final void extendUsageSummary(StringBuilder usage) { |
| super.extendUsageSummary(usage); |
| |
| if (knownPrograms.isEmpty()) { |
| usage.append("\nNo programs or clients have been defined."); |
| } else { |
| usage |
| .append("\nThese programs and clients have been defined") |
| .append(" (each has its own -help option):"); |
| |
| for (String name : knownPrograms.getKeywords()) { |
| usage.append("\n ").append(name); |
| } |
| } |
| } |
| |
| private String programName = null; |
| private Class<? extends Program> programType = null; |
| private String[] programArguments = null; |
| |
| @Override |
| protected final void processParameters(String[] parameters) throws SyntaxException { |
| int count = parameters.length; |
| |
| if (count == 0) { |
| throw new SyntaxException("missing program/client name"); |
| } |
| |
| programName = parameters[0]; |
| programType = knownPrograms.get(programName); |
| |
| if (programType == null) { |
| throw new SyntaxException("unknown program/client: %s", programName); |
| } |
| |
| count -= 1; |
| programArguments = new String[count]; |
| System.arraycopy(parameters, 1, programArguments, 0, count); |
| } |
| |
| @Override |
| protected final void runProgram() throws ProgramException { |
| String objectName = getObjectName(); |
| Program program = null; |
| |
| try { |
| Constructor<? extends Program> constructor = |
| programType.getConstructor(programArguments.getClass()); |
| |
| program = (Program) constructor.newInstance((Object) programArguments); |
| } catch (NoSuchMethodException exception) { |
| throw new ProgramException("constructor not found: %s", objectName); |
| } catch (InstantiationException exception) { |
| throw new ProgramException( |
| "instantiation failed: %s: %s", objectName, exception.getMessage()); |
| } catch (IllegalAccessException exception) { |
| throw new ProgramException("access denied: %s: %s", objectName, exception.getMessage()); |
| } catch (InvocationTargetException exception) { |
| Throwable cause = exception.getCause(); |
| |
| String message = |
| String.format( |
| "construction failed: %s: %s", objectName, cause.getClass().getSimpleName()); |
| |
| { |
| String problem = cause.getMessage(); |
| if (problem != null) message += ": " + problem; |
| } |
| |
| throw new ProgramException(message); |
| } |
| |
| program.setProgramName(programName).run(); |
| } |
| |
| public static void main(String... arguments) { |
| try { |
| new ApiToolCommand(arguments).setProgramName("apitool").run(); |
| } catch (ExitException exception) { |
| System.exit(exception.getExitCode()); |
| } |
| } |
| } |