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