Useful tools written with pure java. Includes ecdsa, sm2, sm3, encryption, excel reader, http(s) client and server etc.
maven:
<dependency>
<groupId>io.github.tagaryen</groupId>
<artifactId>archer-tools</artifactId>
<version>1.2.27</version>
</dependency>
see AsyncProxy.java and TestService.test1 call Async test3()
the example shows how to use 'com.archer.tools.bytecode.ClassBytecode' for generating a child class and change the behavier of the super class
byte[] sk = {29, -3, 74, 47, 123, 64, 41, 123, 67, -9, 89, 16, 84, 115, 18, -8, -41, -97, -57, 36, 103, 60, 115, -123, -5, -38, -97, 127, 32, -21, -25, 2};
byte[] pk = {36, 117, -87, 86, -21, 0, 78, 37, -128, -38, -1, -36, -74, -16, 60, -55, -46, 47, -29, -101, 95, 53, 113, 31, 0, 37, -46, 89, -70, -126, 10, -86, 44, -69, -127, -11, -19, 120, -83, 90, 46, 81, 15, -101, -16, -87, -106, -67, -33, -23, 18, 54, -67, 36, 99, 11, 59, -73, -96, 99, -98, 95, -115, -68};
byte[] hash = {21, -31, 75, 47, 123, 64, 41, 123, 67, -9, 89, 16, 84, 115, 18, -8, -41, -97, -57, 36, 103, 60, 115, -123, -5, -38, -97, 127, 32, -21, -25, 2};
Signature sig = new Signature(Signature.PopularCurve.secp256k1);
byte[] rs = sig.sign(sk, hash);
// print result
System.out.println("ret: "+sig.verify(pk, hash, rs));
byte[] sm2Sk = {29, -3, 74, 47, 123, 64, 41, 123, 67, -9, 89, 16, 84, 115, 18, -8, -41, -97, -57, 36, 103, 60, 115, -123, -5, -38, -97, 127, 32, -21, -25, 2};
byte[] sm2Pk = {124, -111, 78, 61, -127, 10, -126, -115, 18, -118, 16, 64, 63, -12, 77, 32, 8, 95, -32, 73, 36, 98, 63, -81, -1, -112, -45, -87, -119, -31, -91, -5, -76, 120, -20, -101, -57, 45, -115, -110, -52, -50, 83, -74, -117, -113, -38, -51, -125, 18, -42, -84, 59, -33, -105, -3, 23, -8, 83, 51, 45, 74, -31, -105};
Signature sig = new Signature(Signature.PopularCurve.sm2p256v1);
rs = sig.sign(sm2Sk, hash);
// print result
System.out.println("ret: "+sig.verify(sm2Pk, hash, rs));
SM2KeyPair keypair = SM2Crypto.genSM2KeyPair();
byte[] pri = keypair.getPrivateKey();
byte[] pub = keypair.getPublicKey(); //SM2Crypto.getPublicKeyFromPrivateKey(pri);
byte[] data = "nihao, shuaige".getBytes();
byte[] cipher = SM2Crypto.encrypt(pub, data, SM2CryptoMode.C1C2C3);
// print cipher
System.out.println(Arrays.toString(cipher));
byte[] text = SM2Crypto.decrypt(pri, cipher, SM2CryptoMode.C1C2C3);
// print text
System.out.println(new String(text));
String body = JSONRequest.get("https://www.baidu.com");
// print body
System.out.println(body);
BaseRequest<UserLoginReqVO> userLoginReq = ...;
BaseResonse<UserLoginRspVO> userLoginRsp = JSONRequest.post("http://localhost:8080/api/test/login", userLoginReq, new JavaTypeRef<BaseResonse<UserLoginRspVO>>() {});
// print body
System.out.println(userLoginRsp);
(new SimpleHttpServer()).listen(8080, new HttpListener() {
@Override
public void inComingMessage(HttpRequest req, HttpResponse res) {
// print request body
System.out.println("req: " + new String(req.getContent()));
String body = "{\"nihao\":\"shuaige\"}";
res.setContentType(ContentType.APPLICATION_JSON);
res.setContent(body.getBytes());
}
@Override
public void onServerException(HttpRequest req, HttpResponse res, Throwable t) {
t.printStackTrace();
}
});
// reading a middle size file
List<Sheet> sheets = XlsxReader.read("e:/work/10w_line.xlsx");
for(Sheet s: sheets) {
System.out.println(s.getName());
for(Row r: s.rows()) {
for(Cell c: r.cells()) {
System.out.println(c.getName() + ":" + c.getValue());
}
}
}
// reading a large size file
List<SimpleSheet> simpleSheets = SimpleXlsxReader.read("e:/work/100w_line.xlsx");
for(SimpleSheet s: simpleSheets) {
System.out.println(s.getName());
for(List<String> row: s.rows()) {
for(String cell: row) {
System.out.println(cell);
}
}
}
ARPCServer server = new ARPCServer("127.0.0.1", 9612);
ARPCClient client = new ARPCClient("127.0.0.1", 9612);
server.registerListener(new ARPCServerListenner<MessageB, MessageC>(MessageB.class, MessageC.class) {
@Override
public MessageC onMessage(MessageB p) {
System.out.println("receive client messageB " + XJSONStatic.stringify(p));
return new MessageC();
}});
server.registerListener(new ARPCServerListenner<MessageA, MessageB>(MessageA.class, MessageB.class) {
@Override
public MessageB onMessage(MessageA p) {
System.out.println("receive client messageA " + XJSONStatic.stringify(p));
return new MessageB();
}});
server.start();
client.registerListener(new ARPCClientListenner<MessageB, MessageC>(MessageB.class, MessageC.class));
client.registerListener(new ARPCClientListenner<MessageA, MessageB>(MessageA.class, MessageB.class));
client.callRemoteAsync(new MessageB(), new ARPCClientCallback<MessageC>() {
@Override
public void onReturn(MessageC r) {
System.out.println("client receive MessageC " + XJSONStatic.stringify(r));
}});
MessageB b = client.callRemote(new MessageA(), MessageB.class);
System.out.println("client receive MessageB " + XJSONStatic.stringify(b));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
client.close();
server.close();
int count = 100000000;
Integer[] a = new Integer[count];
Random r = new Random();
for(int i = 0; i < count; i++) {
a[i] = r.nextInt(count);
}
System.out.println(Arrays.toString(Arrays.copyOfRange(a, 0, 20)));
System.out.println(Arrays.toString(Arrays.copyOfRange(a, count -20, count)));
QuickSort.sort(a, new Comparison<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}});
System.out.println(Arrays.toString(Arrays.copyOfRange(a, 0, 20)));
System.out.println(Arrays.toString(Arrays.copyOfRange(a, count -20, count)));