Skip to content

Commit

Permalink
fix-format
Browse files Browse the repository at this point in the history
  • Loading branch information
deshanxiao committed Dec 28, 2023
1 parent ae62834 commit 556053e
Show file tree
Hide file tree
Showing 2 changed files with 281 additions and 281 deletions.
318 changes: 159 additions & 159 deletions java/core/src/java/org/apache/orc/impl/BrotliCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
package org.apache.orc.impl;

import com.aayushatharva.brotli4j.Brotli4jLoader;
import com.aayushatharva.brotli4j.decoder.Decoder;
import com.aayushatharva.brotli4j.decoder.DecoderJNI;
import com.aayushatharva.brotli4j.encoder.Encoder;
import org.apache.orc.CompressionCodec;
Expand All @@ -29,187 +28,188 @@
import java.nio.ByteBuffer;

public class BrotliCodec implements CompressionCodec, DirectDecompressionCodec {
// load jni library.
static {
Brotli4jLoader.ensureAvailability();
}

public BrotliCodec() {
}

static class BrotliOptions implements Options {

private Encoder.Mode mode = Encoder.Mode.GENERIC;
private int quality = -1;
private int lgwin = -1;
// load jni library.
static {
Brotli4jLoader.ensureAvailability();
}

public BrotliOptions() {
public BrotliCodec() {
}

}
static class BrotliOptions implements Options {

public BrotliOptions(int quality, int lgwin, Encoder.Mode mode) {
this.quality = quality;
this.lgwin = lgwin;
this.mode = mode;
}
private Encoder.Mode mode = Encoder.Mode.GENERIC;
private int quality = -1;
private int lgwin = -1;

@Override
public Options copy() {
return new BrotliOptions(quality, lgwin, mode);
}
BrotliOptions() {

@Override
public Options setSpeed(SpeedModifier newValue) {
switch (newValue) {
case FAST:
// best speed + 1.
quality = 1;
break;
case DEFAULT:
// best quality. Keep default with default value.
quality = -1;
break;
case FASTEST:
// best speed.
quality = 0;
break;
default:
break;
}
return this;
}

@Override
public Options setData(DataKind newValue) {
switch (newValue) {
case BINARY:
mode = Encoder.Mode.GENERIC;
break;
case TEXT:
mode = Encoder.Mode.TEXT;
break;
default:
break;
}
return this;
}

public Encoder.Parameters brotli4jParameter() {
return new Encoder.Parameters()
.setQuality(quality).setWindow(lgwin).setMode(mode);
}
}

private static final BrotliCodec.BrotliOptions DEFAULT_OPTIONS = new BrotliOptions();
BrotliOptions(int quality, int lgwin, Encoder.Mode mode) {
this.quality = quality;
this.lgwin = lgwin;
this.mode = mode;
}

@Override
public Options getDefaultOptions() {
return DEFAULT_OPTIONS;
public Options copy() {
return new BrotliOptions(quality, lgwin, mode);
}

@Override
public boolean compress(
ByteBuffer in,
ByteBuffer out,
ByteBuffer overflow,
Options options) throws IOException {
BrotliOptions brotliOptions = (BrotliOptions) options;
int inBytes = in.remaining();
// TODO Make EncoderJNI and EncoderJNI.Wrapper public and then we can avoid data copy. See:https://github.com/hyperxpro/Brotli4j/issues/123
byte[] compressed = null;
if (in.arrayOffset() + in.position() == 0) {
compressed = Encoder.compress(in.array(), in.arrayOffset() + in.position(), inBytes, brotliOptions.brotli4jParameter());
} else {
byte[] input = new byte[in.remaining()];
ByteBuffer slice = in.slice();
slice.get(0, input);
compressed = Encoder.compress(input, 0, inBytes, brotliOptions.brotli4jParameter());
}
int outBytes = compressed.length;
if (outBytes < inBytes) {
int remaining = out.remaining();
if (remaining >= outBytes) {
System.arraycopy(compressed, 0, out.array(), out.arrayOffset() +
out.position(), outBytes);
out.position(out.position() + outBytes);
} else {
System.arraycopy(compressed, 0, out.array(), out.arrayOffset() +
out.position(), remaining);
out.position(out.limit());
System.arraycopy(compressed, remaining, overflow.array(),
overflow.arrayOffset(), outBytes - remaining);
overflow.position(outBytes - remaining);
}
return true;
} else {
return false;
}
public Options setSpeed(SpeedModifier newValue) {
switch (newValue) {
case FAST:
// best speed + 1.
quality = 1;
break;
case DEFAULT:
// best quality. Keep default with default value.
quality = -1;
break;
case FASTEST:
// best speed.
quality = 0;
break;
default:
break;
}
return this;
}

@Override
public void decompress(ByteBuffer in, ByteBuffer out) throws IOException {
int compressedBytes = in.remaining();
DecoderJNI.Wrapper decoder = new DecoderJNI.Wrapper(compressedBytes);
try {
decoder.getInputBuffer().put(in);
decoder.push(compressedBytes);
while (decoder.getStatus() != DecoderJNI.Status.DONE) {
switch (decoder.getStatus()) {
case OK:
decoder.push(0);
break;

case NEEDS_MORE_OUTPUT:
ByteBuffer buffer = decoder.pull();
out.put(buffer);
break;

case NEEDS_MORE_INPUT:
// Give decoder a chance to process the remaining of the buffered byte.
decoder.push(0);
// If decoder still needs input, this means that stream is truncated.
if (decoder.getStatus() == DecoderJNI.Status.NEEDS_MORE_INPUT) {
return;
}
break;

default:
return;
}
}
} finally {
out.flip();
decoder.destroy();
}
public Options setData(DataKind newValue) {
switch (newValue) {
case BINARY:
mode = Encoder.Mode.GENERIC;
break;
case TEXT:
mode = Encoder.Mode.TEXT;
break;
default:
break;
}
return this;
}

@Override
public boolean isAvailable() {
return true;
public Encoder.Parameters brotli4jParameter() {
return new Encoder.Parameters()
.setQuality(quality).setWindow(lgwin).setMode(mode);
}
}

private static final BrotliCodec.BrotliOptions DEFAULT_OPTIONS = new BrotliOptions();

@Override
public Options getDefaultOptions() {
return DEFAULT_OPTIONS;
}

@Override
public boolean compress(
ByteBuffer in,
ByteBuffer out,
ByteBuffer overflow,
Options options) throws IOException {
BrotliOptions brotliOptions = (BrotliOptions) options;
int inBytes = in.remaining();
// TODO Make EncoderJNI and EncoderJNI.Wrapper public and then we can avoid data copy. See:https://github.com/hyperxpro/Brotli4j/issues/123
byte[] compressed = null;
if (in.arrayOffset() + in.position() == 0) {
compressed = Encoder.compress(
in.array(), in.arrayOffset() + in.position(), inBytes, brotliOptions.brotli4jParameter());
} else {
byte[] input = new byte[in.remaining()];
ByteBuffer slice = in.slice();
slice.get(0, input);
compressed = Encoder.compress(input, 0, inBytes, brotliOptions.brotli4jParameter());
}
int outBytes = compressed.length;
if (outBytes < inBytes) {
int remaining = out.remaining();
if (remaining >= outBytes) {
System.arraycopy(compressed, 0, out.array(), out.arrayOffset() +
out.position(), outBytes);
out.position(out.position() + outBytes);
} else {
System.arraycopy(compressed, 0, out.array(), out.arrayOffset() +
out.position(), remaining);
out.position(out.limit());
System.arraycopy(compressed, remaining, overflow.array(),
overflow.arrayOffset(), outBytes - remaining);
overflow.position(outBytes - remaining);
}
return true;
} else {
return false;
}
}

@Override
public void decompress(ByteBuffer in, ByteBuffer out) throws IOException {
int compressedBytes = in.remaining();
DecoderJNI.Wrapper decoder = new DecoderJNI.Wrapper(compressedBytes);
try {
decoder.getInputBuffer().put(in);
decoder.push(compressedBytes);
while (decoder.getStatus() != DecoderJNI.Status.DONE) {
switch (decoder.getStatus()) {
case OK:
decoder.push(0);
break;

case NEEDS_MORE_OUTPUT:
ByteBuffer buffer = decoder.pull();
out.put(buffer);
break;

case NEEDS_MORE_INPUT:
// Give decoder a chance to process the remaining of the buffered byte.
decoder.push(0);
// If decoder still needs input, this means that stream is truncated.
if (decoder.getStatus() == DecoderJNI.Status.NEEDS_MORE_INPUT) {
return;
}
break;

@Override
public CompressionKind getKind() {
return CompressionKind.BROTLI;
default:
return;
}
}
} finally {
out.flip();
decoder.destroy();
}
}

@Override
public boolean isAvailable() {
return true;
}

@Override
public void directDecompress(ByteBuffer in, ByteBuffer out) throws IOException {
decompress(in, out);
}
@Override
public CompressionKind getKind() {
return CompressionKind.BROTLI;
}

@Override
public void reset() {

}
@Override
public void directDecompress(ByteBuffer in, ByteBuffer out) throws IOException {
decompress(in, out);
}

@Override
public void destroy() {
}
@Override
public void reset() {

@Override
public void close() {
OrcCodecPool.returnCodec(CompressionKind.BROTLI, this);
}
}
}

@Override
public void destroy() {
}

@Override
public void close() {
OrcCodecPool.returnCodec(CompressionKind.BROTLI, this);
}
}
Loading

0 comments on commit 556053e

Please sign in to comment.