Add a tool to do intendance tasks on dictionaries.
Bug: 6429606 Change-Id: I0c7258d992a4bfa9707002f8fbc425ccde7c6172main
parent
1c69942683
commit
ddcb4847df
|
@ -0,0 +1,25 @@
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under,src)
|
||||||
|
LOCAL_JAR_MANIFEST := etc/manifest.txt
|
||||||
|
LOCAL_MODULE := dicttool
|
||||||
|
LOCAL_MODULE_TAGS := eng
|
||||||
|
|
||||||
|
include $(BUILD_HOST_JAVA_LIBRARY)
|
||||||
|
include $(LOCAL_PATH)/etc/Android.mk
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Copyright (C) 2012 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := eng
|
||||||
|
LOCAL_PREBUILT_EXECUTABLES := dicttool
|
||||||
|
include $(BUILD_HOST_PREBUILT)
|
|
@ -0,0 +1,62 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Copyright 2011, The Android Open Source Project
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Set up prog to be the path of this script, including following symlinks,
|
||||||
|
# and set up progdir to be the fully-qualified pathname of its directory.
|
||||||
|
prog="$0"
|
||||||
|
while [ -h "${prog}" ]; do
|
||||||
|
newProg=`/bin/ls -ld "${prog}"`
|
||||||
|
newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
|
||||||
|
if expr "x${newProg}" : 'x/' >/dev/null; then
|
||||||
|
prog="${newProg}"
|
||||||
|
else
|
||||||
|
progdir=`dirname "${prog}"`
|
||||||
|
prog="${progdir}/${newProg}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
oldwd=`pwd`
|
||||||
|
progdir=`dirname "${prog}"`
|
||||||
|
cd "${progdir}"
|
||||||
|
progdir=`pwd`
|
||||||
|
prog="${progdir}"/`basename "${prog}"`
|
||||||
|
cd "${oldwd}"
|
||||||
|
|
||||||
|
jarfile=dicttool.jar
|
||||||
|
frameworkdir="$progdir"
|
||||||
|
if [ ! -r "$frameworkdir/$jarfile" ]
|
||||||
|
then
|
||||||
|
frameworkdir=`dirname "$progdir"`/tools/lib
|
||||||
|
libdir=`dirname "$progdir"`/tools/lib
|
||||||
|
fi
|
||||||
|
if [ ! -r "$frameworkdir/$jarfile" ]
|
||||||
|
then
|
||||||
|
frameworkdir=`dirname "$progdir"`/framework
|
||||||
|
libdir=`dirname "$progdir"`/lib
|
||||||
|
fi
|
||||||
|
if [ ! -r "$frameworkdir/$jarfile" ]
|
||||||
|
then
|
||||||
|
echo `basename "$prog"`": can't find $jarfile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$OSTYPE" = "cygwin" ] ; then
|
||||||
|
jarpath=`cygpath -w "$frameworkdir/$jarfile"`
|
||||||
|
progdir=`cygpath -w "$progdir"`
|
||||||
|
else
|
||||||
|
jarpath="$frameworkdir/$jarfile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# might need more memory, e.g. -Xmx128M
|
||||||
|
exec java -ea -jar "$jarpath" "$@"
|
|
@ -0,0 +1 @@
|
||||||
|
Main-Class: com.android.inputmethod.latin.dicttool.Dicttool
|
|
@ -0,0 +1,94 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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 com.android.inputmethod.latin.dicttool;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
|
public class Compress {
|
||||||
|
|
||||||
|
private static OutputStream getCompressedStream(final OutputStream out)
|
||||||
|
throws java.io.IOException {
|
||||||
|
return new GZIPOutputStream(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static InputStream getUncompressedStream(final InputStream in) throws IOException {
|
||||||
|
return new GZIPInputStream(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void copy(final InputStream input, final OutputStream output) throws IOException {
|
||||||
|
final byte[] buffer = new byte[1000];
|
||||||
|
for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer))
|
||||||
|
output.write(buffer, 0, readBytes);
|
||||||
|
input.close();
|
||||||
|
output.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
static public class Compressor extends Dicttool.Command {
|
||||||
|
public static final String COMMAND = "compress";
|
||||||
|
private static final String SUFFIX = ".compressed";
|
||||||
|
|
||||||
|
public Compressor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHelp() {
|
||||||
|
return "compress <filename>: Compresses a file using gzip compression";
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getArity() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() throws IOException {
|
||||||
|
final String inFilename = mArgs[0];
|
||||||
|
final String outFilename = inFilename + SUFFIX;
|
||||||
|
final FileInputStream input = new FileInputStream(new File(inFilename));
|
||||||
|
final FileOutputStream output = new FileOutputStream(new File(outFilename));
|
||||||
|
copy(input, new GZIPOutputStream(output));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static public class Uncompressor extends Dicttool.Command {
|
||||||
|
public static final String COMMAND = "uncompress";
|
||||||
|
private static final String SUFFIX = ".uncompressed";
|
||||||
|
|
||||||
|
public Uncompressor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHelp() {
|
||||||
|
return "uncompress <filename>: Uncompresses a file compressed with gzip compression";
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getArity() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() throws IOException {
|
||||||
|
final String inFilename = mArgs[0];
|
||||||
|
final String outFilename = inFilename + SUFFIX;
|
||||||
|
final FileInputStream input = new FileInputStream(new File(inFilename));
|
||||||
|
final FileOutputStream output = new FileOutputStream(new File(outFilename));
|
||||||
|
copy(new GZIPInputStream(input), output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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 com.android.inputmethod.latin.dicttool;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class Dicttool {
|
||||||
|
|
||||||
|
public static abstract class Command {
|
||||||
|
protected String[] mArgs;
|
||||||
|
public void setArgs(String[] args) throws IllegalArgumentException {
|
||||||
|
mArgs = args;
|
||||||
|
}
|
||||||
|
abstract public int getArity();
|
||||||
|
abstract public String getHelp();
|
||||||
|
abstract public void run() throws Exception;
|
||||||
|
}
|
||||||
|
static HashMap<String, Class<? extends Command>> sCommands =
|
||||||
|
new HashMap<String, Class<? extends Command>>();
|
||||||
|
static {
|
||||||
|
sCommands.put("info", Info.class);
|
||||||
|
sCommands.put("compress", Compress.Compressor.class);
|
||||||
|
sCommands.put("uncompress", Compress.Uncompressor.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Command getCommandInstance(final String commandName) {
|
||||||
|
try {
|
||||||
|
return sCommands.get(commandName).newInstance();
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
throw new RuntimeException(commandName + " is not installed");
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(commandName + " is not installed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void help() {
|
||||||
|
System.out.println("Syntax: dicttool <command [arguments]>\nAvailable commands:\n");
|
||||||
|
for (final String commandName : sCommands.keySet()) {
|
||||||
|
System.out.println("*** " + commandName);
|
||||||
|
System.out.println(getCommandInstance(commandName).getHelp());
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isCommand(final String commandName) {
|
||||||
|
return sCommands.containsKey(commandName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String mPreviousCommand = null; // local to the getNextCommand function
|
||||||
|
private Command getNextCommand(final ArrayList<String> arguments) {
|
||||||
|
final String firstArgument = arguments.get(0);
|
||||||
|
final String commandName;
|
||||||
|
if (isCommand(firstArgument)) {
|
||||||
|
commandName = firstArgument;
|
||||||
|
arguments.remove(0);
|
||||||
|
} else if (isCommand(mPreviousCommand)) {
|
||||||
|
commandName = mPreviousCommand;
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Unknown command : " + firstArgument);
|
||||||
|
}
|
||||||
|
final Command command = getCommandInstance(commandName);
|
||||||
|
final int arity = command.getArity();
|
||||||
|
if (arguments.size() < arity) {
|
||||||
|
throw new RuntimeException("Not enough arguments to command " + commandName);
|
||||||
|
}
|
||||||
|
final String[] argsArray = new String[arity];
|
||||||
|
arguments.subList(0, arity).toArray(argsArray);
|
||||||
|
for (int i = 0; i < arity; ++i) {
|
||||||
|
// For some reason, ArrayList#removeRange is protected
|
||||||
|
arguments.remove(0);
|
||||||
|
}
|
||||||
|
command.setArgs(argsArray);
|
||||||
|
mPreviousCommand = commandName;
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void execute(final ArrayList<String> arguments) {
|
||||||
|
ArrayList<Command> commandsToExecute = new ArrayList<Command>();
|
||||||
|
while (!arguments.isEmpty()) {
|
||||||
|
commandsToExecute.add(getNextCommand(arguments));
|
||||||
|
}
|
||||||
|
for (final Command command : commandsToExecute) {
|
||||||
|
try {
|
||||||
|
command.run();
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Exception while processing command "
|
||||||
|
+ command.getClass().getSimpleName() + " : " + e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
if (0 == args.length) {
|
||||||
|
help();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!isCommand(args[0])) throw new RuntimeException("Unknown command : " + args[0]);
|
||||||
|
|
||||||
|
final ArrayList<String> arguments = new ArrayList<String>(args.length);
|
||||||
|
arguments.addAll(Arrays.asList(args));
|
||||||
|
new Dicttool().execute(arguments);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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 com.android.inputmethod.latin.dicttool;
|
||||||
|
|
||||||
|
public class Info extends Dicttool.Command {
|
||||||
|
public Info() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHelp() {
|
||||||
|
return "info <filename>: prints various information about a dictionary file";
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getArity() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
// TODO: implement this
|
||||||
|
System.out.println("Not implemented yet");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue