Skip to content

Commit

Permalink
support for #1398
Browse files Browse the repository at this point in the history
  • Loading branch information
呈铭 committed Feb 28, 2024
1 parent 357fdf0 commit 09b6f23
Show file tree
Hide file tree
Showing 7 changed files with 265 additions and 1 deletion.
8 changes: 8 additions & 0 deletions bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
<!-- Build args -->
<module.install.skip>true</module.install.skip>
<module.deploy.skip>true</module.deploy.skip>

<commons_compress_version>1.25.0</commons_compress_version>
</properties>

<dependencyManagement>
Expand Down Expand Up @@ -598,6 +600,12 @@
<version>0.16.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>${commons_compress_version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down
5 changes: 5 additions & 0 deletions codec/codec-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* 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.
*/
package com.alipay.sofa.rpc.codec.biz2;

import com.alipay.sofa.rpc.codec.Compressor;
import com.alipay.sofa.rpc.ext.Extension;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
* bzip2 compressor, faster compression efficiency
*
* @author chengming
* @version Bzip2RpcCompressor.java, v 0.1 2024年02月28日 10:45 AM chengming
* @link https://commons.apache.org/proper/commons-compress/
*/
@Extension(value = "bzip2", code = 3)
public class Bzip2RpcCompressor implements Compressor {

@Override
public byte[] compress(byte[] src) {
if (null == src || 0 == src.length) {
return new byte[0];
}

ByteArrayOutputStream out = new ByteArrayOutputStream();
BZip2CompressorOutputStream cos;
try {
cos = new BZip2CompressorOutputStream(out);
cos.write(src);
cos.close();
} catch (Exception e) {
throw new IllegalStateException(e);
}

return out.toByteArray();
}

@Override
public byte[] deCompress(byte[] src) {
if (null == src || 0 == src.length) {
return new byte[0];
}

ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(src);
try {
BZip2CompressorInputStream unZip = new BZip2CompressorInputStream(in);
byte[] buffer = new byte[2048];
int n;
while ((n = unZip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
return out.toByteArray();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* 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.
*/
package com.alipay.sofa.rpc.codec.gzip;

import com.alipay.sofa.rpc.codec.Compressor;
import com.alipay.sofa.rpc.ext.Extension;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
* @author chengming
* @version GzipRpcCompressor.java, v 0.1 2024年02月28日 11:25 AM chengming
*/
@Extension(value = "bzip2", code = 4)
public class GzipRpcCompressor implements Compressor {

@Override
public byte[] compress(byte[] src) {
if (null == src || 0 == src.length) {
return new byte[0];
}

ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteOutStream)) {
gzipOutputStream.write(src);
} catch (Exception exception) {
throw new IllegalStateException(exception);
}

return byteOutStream.toByteArray();
}

@Override
public byte[] deCompress(byte[] src) {
if (null == src || 0 == src.length) {
return new byte[0];
}

ByteArrayInputStream byteInStream = new ByteArrayInputStream(src);
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
try (GZIPInputStream gzipInputStream = new GZIPInputStream(byteInStream)) {
int readByteNum;
byte[] bufferArr = new byte[256];
while ((readByteNum = gzipInputStream.read(bufferArr)) >= 0) {
byteOutStream.write(bufferArr, 0, readByteNum);
}
} catch (Exception exception) {
throw new IllegalStateException(exception);
}

return byteOutStream.toByteArray();
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
snappy=com.alipay.sofa.rpc.codec.snappy.SnappyRpcCompressor
snappy=com.alipay.sofa.rpc.codec.snappy.SnappyRpcCompressor
bzip2=com.alipay.sofa.rpc.codec.biz2.Bzip2RpcCompressor
gzip=com.alipay.sofa.rpc.codec.gzip.GzipRpcCompressor
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* 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.
*/
package com.alipay.sofa.rpc.codec.biz2;

import org.junit.Assert;
import org.junit.Test;

import java.io.UnsupportedEncodingException;

/**
* @author chengming
* @version Bzip2RpcCompressorTest.java, v 0.1 2024年02月28日 2:19 PM chengming
*/
public class Bzip2RpcCompressorTest {

private static final String TEST_STR;

static {
StringBuilder builder = new StringBuilder();
int charNum = 1000000;
for (int i = 0; i < charNum; i++) {
builder.append("a");
}

TEST_STR = builder.toString();
}

@Test
public void testCompression() throws UnsupportedEncodingException {
Bzip2RpcCompressor compressor = new Bzip2RpcCompressor();
byte[] bs = compressor.compress(TEST_STR.getBytes("utf-8"));
Assert.assertNotNull(TEST_STR);

String s1 = new String(compressor.deCompress(bs), "utf-8");
Assert.assertEquals(TEST_STR, s1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* 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.
*/
package com.alipay.sofa.rpc.codec.gzip;

import org.junit.Assert;
import org.junit.Test;

import java.io.UnsupportedEncodingException;

/**
* @author chengming
* @version GzipRpcCompressorTest.java, v 0.1 2024年02月28日 2:09 PM chengming
*/
public class GzipRpcCompressorTest {

private static final String TEST_STR;

static {
StringBuilder builder = new StringBuilder();
int charNum = 1000000;
for (int i = 0; i < charNum; i++) {
builder.append("a");
}

TEST_STR = builder.toString();
}

@Test
public void testCompression() throws UnsupportedEncodingException {
GzipRpcCompressor compressor = new GzipRpcCompressor();
byte[] bs = compressor.compress(TEST_STR.getBytes("utf-8"));
Assert.assertNotNull(TEST_STR);

String s1 = new String(compressor.deCompress(bs), "utf-8");
Assert.assertEquals(TEST_STR, s1);
}

}

0 comments on commit 09b6f23

Please sign in to comment.