Skip to content

Commit 620034b

Browse files
committed
Convert JWT test
1 parent 6d1bb23 commit 620034b

File tree

9 files changed

+340
-0
lines changed

9 files changed

+340
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.fugerit.java.code.samples.convert;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@AllArgsConstructor
8+
public class ConvertFacade {
9+
10+
@Getter @Setter
11+
private ConvertUtil util;
12+
13+
public ConvertFacade() {
14+
this( new ConvertUtil() {} );
15+
}
16+
17+
public String load(String input) {
18+
return util.load(input);
19+
}
20+
21+
public String store(String input) {
22+
return util.store(input);
23+
}
24+
25+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.fugerit.java.code.samples.convert;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import org.fugerit.java.core.function.SafeFunction;
5+
6+
import java.util.Base64;
7+
import java.util.LinkedHashMap;
8+
9+
public class ConvertJWT implements ConvertUtil {
10+
11+
private ObjectMapper mapper = new ObjectMapper();
12+
13+
@Override
14+
public String load(String input) {
15+
return SafeFunction.get( () -> {
16+
LinkedHashMap<String, Object> map = this.mapper.readValue(input, LinkedHashMap.class);
17+
Base64.Encoder encoder = Base64.getUrlEncoder();
18+
StringBuilder res = new StringBuilder();
19+
res.append( encoder.encodeToString( mapper.writeValueAsString( map.get( "h" ) ).getBytes() ).replace( "=", "" ) );
20+
res.append( "." );
21+
res.append( encoder.encodeToString( mapper.writeValueAsString( map.get( "p" ) ).getBytes() ).replace( "=", "" ) );
22+
res.append( map.get( "c" ) );
23+
return res.toString();
24+
} );
25+
}
26+
27+
@Override
28+
public String store(String input) {
29+
Base64.Decoder decoder = Base64.getUrlDecoder();
30+
StringBuilder res = new StringBuilder();
31+
String[] chunks = input.split("\\.");
32+
String header = new String(decoder.decode(chunks[0]));
33+
String payload = new String(decoder.decode(chunks[1]));
34+
res.append( "{\"h\":" );
35+
res.append( header );
36+
res.append( ",\"p\":" );
37+
res.append( payload );
38+
res.append( ",\"c\":\"" );
39+
for ( int k=2; k<chunks.length; k++ ) {
40+
res.append( "." );
41+
res.append( chunks[k] );
42+
}
43+
res.append( "\"}" );
44+
return res.toString();
45+
}
46+
47+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.fugerit.java.code.samples.convert;
2+
3+
/**
4+
* Conversion interface, default implementation is to return input both on load() and store()
5+
*/
6+
public interface ConvertUtil {
7+
8+
default String store( String input ) { return input; }
9+
10+
default String load( String input ) { return input; }
11+
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.fugerit.java.code.samples.convert;
2+
3+
import org.fugerit.java.code.samples.deflate.DeflateUtil;
4+
5+
public class DeflateJWT implements ConvertUtil {
6+
7+
private ConvertUtil deflate;
8+
9+
private ConvertUtil jwt;
10+
11+
public DeflateJWT() {
12+
this.deflate = new DeflateUtil();
13+
this.jwt = new ConvertJWT();
14+
}
15+
16+
@Override
17+
public String store(String input) {
18+
return this.deflate.store( this.jwt.store( input ) );
19+
}
20+
21+
@Override
22+
public String load(String input) {
23+
return this.jwt.load( this.deflate.load( input ) );
24+
}
25+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.fugerit.java.code.samples.convert;
2+
3+
public class PassThroughConvertUtil implements ConvertUtil {
4+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.fugerit.java.code.samples.deflate;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.fugerit.java.code.samples.convert.ConvertUtil;
5+
import org.fugerit.java.core.function.SafeFunction;
6+
import org.fugerit.java.core.io.StreamIO;
7+
8+
import java.io.ByteArrayInputStream;
9+
import java.io.ByteArrayOutputStream;
10+
import java.nio.charset.StandardCharsets;
11+
import java.util.Base64;
12+
import java.util.zip.GZIPInputStream;
13+
import java.util.zip.GZIPOutputStream;
14+
15+
@Slf4j
16+
public class DeflateGzipUtil implements ConvertUtil {
17+
18+
public String load( String input ) {
19+
return this.decompress( Base64.getUrlDecoder().decode( input ) );
20+
}
21+
22+
public String decompress( byte[] input ) {
23+
return SafeFunction.get( () -> {
24+
try (ByteArrayInputStream bis = new ByteArrayInputStream( input );
25+
GZIPInputStream gis = new GZIPInputStream( bis ) ) {
26+
byte[] data = StreamIO.readBytes( gis );
27+
return new String( data, StandardCharsets.UTF_8 );
28+
}
29+
} );
30+
}
31+
32+
public String store( String input ) {
33+
return Base64.getUrlEncoder().encodeToString( this.compress( input ) );
34+
}
35+
36+
public byte[] compress( String input ) {
37+
return SafeFunction.get( () -> {
38+
try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
39+
try (GZIPOutputStream gzip = new GZIPOutputStream( buffer ) ) {
40+
gzip.write( input.getBytes( StandardCharsets.UTF_8 ) );
41+
}
42+
return buffer.toByteArray();
43+
}
44+
} );
45+
}
46+
47+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.fugerit.java.code.samples.deflate;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.fugerit.java.code.samples.convert.ConvertUtil;
5+
import org.fugerit.java.core.function.SafeFunction;
6+
import org.fugerit.java.core.io.StreamIO;
7+
8+
import java.io.ByteArrayInputStream;
9+
import java.io.ByteArrayOutputStream;
10+
import java.nio.charset.StandardCharsets;
11+
import java.util.Arrays;
12+
import java.util.Base64;
13+
import java.util.zip.Deflater;
14+
import java.util.zip.GZIPInputStream;
15+
import java.util.zip.GZIPOutputStream;
16+
import java.util.zip.Inflater;
17+
18+
@Slf4j
19+
public class DeflateUtil implements ConvertUtil {
20+
21+
public String load( String input ) {
22+
return this.decompress( Base64.getUrlDecoder().decode( input ) );
23+
}
24+
25+
public String decompress( byte[] input ) {
26+
return SafeFunction.get( () -> {
27+
Inflater inflater = new Inflater();
28+
byte[] output = new byte[8192];
29+
inflater.setInput( input );
30+
int resultLength = inflater.inflate( output );
31+
inflater.end();
32+
return new String(output, 0, resultLength, StandardCharsets.UTF_8);
33+
} );
34+
}
35+
36+
public String store( String input ) {
37+
return Base64.getUrlEncoder().encodeToString( this.compress( input ) );
38+
}
39+
40+
public byte[] compress( String input ) {
41+
return SafeFunction.get( () -> {
42+
// Compress the bytes
43+
byte[] output = new byte[8192];
44+
Deflater deflater = new Deflater();
45+
//deflater.setLevel(Deflater.BEST_COMPRESSION);
46+
deflater.setInput( input.getBytes( StandardCharsets.UTF_8 ) );
47+
deflater.finish();
48+
int compressedDataLength = deflater.deflate(output);
49+
deflater.end();
50+
log.info( "original size : {}, compressed size : {}", input.length(), compressedDataLength );
51+
return Arrays.copyOf( output, compressedDataLength );
52+
} );
53+
}
54+
55+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package test.org.fugerit.java.code.samples.convert;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.fugerit.java.code.samples.convert.ConvertFacade;
5+
import org.fugerit.java.code.samples.convert.ConvertJWT;
6+
import org.fugerit.java.code.samples.convert.DeflateJWT;
7+
import org.fugerit.java.code.samples.convert.PassThroughConvertUtil;
8+
import org.fugerit.java.code.samples.deflate.DeflateGzipUtil;
9+
import org.fugerit.java.code.samples.deflate.DeflateUtil;
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.Test;
12+
13+
import java.math.BigDecimal;
14+
import java.math.RoundingMode;
15+
16+
@Slf4j
17+
class TestConvertFacade {
18+
19+
/*
20+
* Example jwt from : https://jwt.io/#debugger-io
21+
*/
22+
private static final String TEXT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
23+
24+
private void testWorker( ConvertFacade facade ) {
25+
String original = TEXT;
26+
String data = facade.getUtil().store( original );
27+
BigDecimal gain = new BigDecimal( 100D-((double)data.length())/((double)original.length())*100D ).setScale( 2, RoundingMode.HALF_EVEN );
28+
log.info( " original lenfth : {}, store length : {}, gain : {}, Convert FQCN {}, data : {}", original.length(), data.length(), gain, facade.getUtil().getClass().getName(), data );
29+
String load = facade.getUtil().load( data );
30+
Assertions.assertEquals( original, load );
31+
}
32+
33+
@Test
34+
public void testConvert() {
35+
ConvertFacade facade = new ConvertFacade();
36+
// conversion with pass
37+
log.info( "*** 1) convert : pass through" );
38+
facade.setUtil( new PassThroughConvertUtil() );
39+
testWorker( facade );
40+
// conversion deflate
41+
log.info( "*** 2) convert : deflate" );
42+
facade.setUtil( new DeflateUtil() );
43+
testWorker( facade );
44+
// convert jwt
45+
log.info( "*** 3) convert : custom" );
46+
facade.setUtil( new ConvertJWT() );
47+
testWorker( facade );
48+
// convert / deflate jwt
49+
log.info( "*** 4) convert : composite deflate / custom" );
50+
facade.setUtil( new DeflateJWT() );
51+
testWorker( facade );
52+
// convert / deflate alt
53+
log.info( "*** 5) convert : composite deflate alt" );
54+
facade.setUtil( new DeflateGzipUtil() );
55+
testWorker( facade );
56+
}
57+
58+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package test.org.fugerit.java.code.samples.deflate;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.fugerit.java.code.samples.deflate.DeflateUtil;
5+
import org.fugerit.java.core.function.SafeFunction;
6+
import org.junit.jupiter.api.Assertions;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.util.zip.Deflater;
10+
import java.util.zip.Inflater;
11+
12+
@Slf4j
13+
class TestDeflateUtil {
14+
15+
/*
16+
* Example jwt from : https://jwt.io/#debugger-io
17+
*/
18+
private static final String TEXT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
19+
20+
@Test
21+
public void testDeflate() {
22+
DeflateUtil util = new DeflateUtil();
23+
String data = util.store( TEXT );
24+
log.info( "original length : {}, new length {}, data : {}", TEXT.length(), data.length(), data );
25+
String test = util.load( data );
26+
Assertions.assertEquals( TEXT, test );
27+
}
28+
29+
@Test
30+
void testDeflate2() {
31+
DeflateUtil util = new DeflateUtil();
32+
byte[] data = util.compress( TEXT );
33+
log.info( "original length : {}, new length {}", TEXT.length(), data.length );
34+
String test = util.decompress( data );
35+
Assertions.assertEquals( TEXT, test );
36+
}
37+
38+
@Test
39+
void testDeflate3() {
40+
SafeFunction.apply( () -> {
41+
// Compress the bytes
42+
byte[] output = new byte[1024];
43+
Deflater deflater = new Deflater();
44+
deflater.setInput( TEXT.getBytes() );
45+
deflater.finish();
46+
int compressedDataLength = deflater.deflate(output);
47+
deflater.end();
48+
49+
log.info("Compressed Message length : {}", compressedDataLength);
50+
51+
// Decompress the bytes
52+
Inflater inflater = new Inflater();
53+
inflater.setInput(output, 0, compressedDataLength);
54+
byte[] result = new byte[1024];
55+
int resultLength = inflater.inflate(result);
56+
inflater.end();
57+
58+
log.info("Result Message length : {}", resultLength);
59+
60+
String decompressedText = new String( result, 0 , resultLength );
61+
Assertions.assertEquals( TEXT, decompressedText );
62+
63+
} );
64+
65+
}
66+
67+
}

0 commit comments

Comments
 (0)