1ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard/** 2ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * Copyright (C) 2012 The Android Open Source Project 3ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * 4ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * use this file except in compliance with the License. You may obtain a copy of 6ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * the License at 7ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * 8ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * http://www.apache.org/licenses/LICENSE-2.0 9ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * 10ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * Unless required by applicable law or agreed to in writing, software 11ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * License for the specific language governing permissions and limitations under 14ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard * the License. 15ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard */ 16ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 17ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardpackage com.android.inputmethod.latin.dicttool; 18ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 19ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardimport java.io.IOException; 20ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardimport java.io.InputStream; 21ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardimport java.io.OutputStream; 22ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardimport java.util.zip.GZIPInputStream; 23ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardimport java.util.zip.GZIPOutputStream; 24ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 25ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalardpublic class Compress { 26ba98b639836953ee3be8f7b58000123822fd2865Jean Chalard private Compress() { 27ba98b639836953ee3be8f7b58000123822fd2865Jean Chalard // This container class is not publicly instantiable. 28ba98b639836953ee3be8f7b58000123822fd2865Jean Chalard } 29ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 30fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka public static OutputStream getCompressedStream(final OutputStream out) throws IOException { 31ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard return new GZIPOutputStream(out); 32ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 33ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 34b3c98901c5fc1460b54cdf27d74405f27c88e74bJean Chalard public static InputStream getUncompressedStream(final InputStream in) throws IOException { 35ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard return new GZIPInputStream(in); 36ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 37ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 38ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard static public class Compressor extends Dicttool.Command { 39ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public static final String COMMAND = "compress"; 40ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 41ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public Compressor() { 42ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 43ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 446ecc50a867dc09eb1d9dafe62f40e73de01b30cbJean Chalard @Override 45ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public String getHelp() { 46ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard return COMMAND + " <src_filename> <dst_filename>: " 47ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard + "Compresses a file using gzip compression"; 48ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 49ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 506ecc50a867dc09eb1d9dafe62f40e73de01b30cbJean Chalard @Override 51ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public void run() throws IOException { 52ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard if (mArgs.length > 2) { 53ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard throw new RuntimeException("Too many arguments for command " + COMMAND); 5477c8c738374c5f63cad0ef015904d37b7591a203Jean Chalard } 55ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT; 56ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT; 57fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka try ( 58fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka final InputStream input = getFileInputStreamOrStdIn(inFilename); 59fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka final OutputStream compressedOutput = getCompressedStream( 60fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka getFileOutputStreamOrStdOut(outFilename)) 61fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka ) { 62fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka BinaryDictOffdeviceUtils.copy(input, compressedOutput); 63fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka } 64ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 65ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 66ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 67ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard static public class Uncompressor extends Dicttool.Command { 68ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public static final String COMMAND = "uncompress"; 69ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 70ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public Uncompressor() { 71ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 72ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 736ecc50a867dc09eb1d9dafe62f40e73de01b30cbJean Chalard @Override 74ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public String getHelp() { 75ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard return COMMAND + " <src_filename> <dst_filename>: " 76ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard + "Uncompresses a file compressed with gzip compression"; 77ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 78ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard 796ecc50a867dc09eb1d9dafe62f40e73de01b30cbJean Chalard @Override 80ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard public void run() throws IOException { 81ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard if (mArgs.length > 2) { 82ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard throw new RuntimeException("Too many arguments for command " + COMMAND); 8377c8c738374c5f63cad0ef015904d37b7591a203Jean Chalard } 84ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT; 85ccd8ed53b33a5f91961f40d576abd0a91b87a66dJean Chalard final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT; 86fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka try ( 87fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka final InputStream uncompressedInput = getUncompressedStream( 88fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka getFileInputStreamOrStdIn(inFilename)); 89fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka final OutputStream output = getFileOutputStreamOrStdOut(outFilename) 90fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka ) { 91fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka BinaryDictOffdeviceUtils.copy(uncompressedInput, output); 92fec4769e0b5eb43e1fad795a986acb0af8bb8a8fTadashi G. Takaoka } 93ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 94ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard } 95ddcb4847df9c9c04e1c8a118f99655a4a93cda40Jean Chalard} 96