--- /dev/null
+package org.apache.lucene.document;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+import java.util.zip.Deflater;
+import java.util.zip.Inflater;
+import java.util.zip.DataFormatException;
+import java.io.ByteArrayOutputStream;
+import org.apache.lucene.util.UnicodeUtil;
+
+/** Simple utility class providing static methods to
+ * compress and decompress binary data for stored fields.
+ * This class uses java.util.zip.Deflater and Inflater
+ * classes to compress and decompress.
+ */
+
+public class CompressionTools {
+
+ // Export only static methods
+ private CompressionTools() {}
+
+ /** Compresses the specified byte range using the
+ * specified compressionLevel (constants are defined in
+ * java.util.zip.Deflater). */
+ public static byte[] compress(byte[] value, int offset, int length, int compressionLevel) {
+
+ /* Create an expandable byte array to hold the compressed data.
+ * You cannot use an array that's the same size as the orginal because
+ * there is no guarantee that the compressed data will be smaller than
+ * the uncompressed data. */
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(length);
+
+ Deflater compressor = new Deflater();
+
+ try {
+ compressor.setLevel(compressionLevel);
+ compressor.setInput(value, offset, length);
+ compressor.finish();
+
+ // Compress the data
+ final byte[] buf = new byte[1024];
+ while (!compressor.finished()) {
+ int count = compressor.deflate(buf);
+ bos.write(buf, 0, count);
+ }
+ } finally {
+ compressor.end();
+ }
+
+ return bos.toByteArray();
+ }
+
+ /** Compresses the specified byte range, with default BEST_COMPRESSION level */
+ public static byte[] compress(byte[] value, int offset, int length) {
+ return compress(value, offset, length, Deflater.BEST_COMPRESSION);
+ }
+
+ /** Compresses all bytes in the array, with default BEST_COMPRESSION level */
+ public static byte[] compress(byte[] value) {
+ return compress(value, 0, value.length, Deflater.BEST_COMPRESSION);
+ }
+
+ /** Compresses the String value, with default BEST_COMPRESSION level */
+ public static byte[] compressString(String value) {
+ return compressString(value, Deflater.BEST_COMPRESSION);
+ }
+
+ /** Compresses the String value using the specified
+ * compressionLevel (constants are defined in
+ * java.util.zip.Deflater). */
+ public static byte[] compressString(String value, int compressionLevel) {
+ UnicodeUtil.UTF8Result result = new UnicodeUtil.UTF8Result();
+ UnicodeUtil.UTF16toUTF8(value, 0, value.length(), result);
+ return compress(result.result, 0, result.length, compressionLevel);
+ }
+
+ /** Decompress the byte array previously returned by
+ * compress */
+ public static byte[] decompress(byte[] value) throws DataFormatException {
+ // Create an expandable byte array to hold the decompressed data
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(value.length);
+
+ Inflater decompressor = new Inflater();
+
+ try {
+ decompressor.setInput(value);
+
+ // Decompress the data
+ final byte[] buf = new byte[1024];
+ while (!decompressor.finished()) {
+ int count = decompressor.inflate(buf);
+ bos.write(buf, 0, count);
+ }
+ } finally {
+ decompressor.end();
+ }
+
+ return bos.toByteArray();
+ }
+
+ /** Decompress the byte array previously returned by
+ * compressString back into a String */
+ public static String decompressString(byte[] value) throws DataFormatException {
+ UnicodeUtil.UTF16Result result = new UnicodeUtil.UTF16Result();
+ final byte[] bytes = decompress(value);
+ UnicodeUtil.UTF8toUTF16(bytes, 0, bytes.length, result);
+ return new String(result.result, 0, result.length);
+ }
+}