1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2025 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 org.a11y.brlapi.*;
import org.a11y.brlapi.programs.*;
import org.a11y.brlapi.clients.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ApiToolCommand extends Program {
private final static 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());
}
}
}
|