2.7.0-SNAPSHOT

This commit is contained in:
Redkale
2022-05-27 10:39:58 +08:00
parent 6e21fe56e9
commit 8d1b9a18b4
182 changed files with 8970 additions and 3173 deletions

View File

@@ -0,0 +1,83 @@
/*
*/
package org.redkale.test.convert;
import java.math.BigInteger;
import java.util.*;
import org.junit.jupiter.api.*;
import org.redkale.convert.ConvertCoder;
import org.redkale.convert.bson.BsonConvert;
import org.redkale.convert.ext.BigIntegerSimpledCoder.BigIntegerHexJsonSimpledCoder;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class ConvertCoderTest {
private boolean main;
public static void main(String[] args) throws Throwable {
ConvertCoderTest test = new ConvertCoderTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
BigMessage msg = new BigMessage();
msg.big = new BigInteger("255");
msg.big2 = new BigInteger("255");
msg.big3 = new BigInteger("255");
msg.map = new HashMap<>();
msg.map.put("haha", new BigInteger("254"));
BigMessage2 msg2 = new BigMessage2();
msg2.big = new BigInteger("255");
msg2.big2 = new BigInteger("255");
msg2.big3 = new BigInteger("255");
msg2.map = new HashMap<>();
msg2.map.put("haha", new BigInteger("254"));
System.out.println(convert.convertTo(msg));
String json = "{\"big\":\"0xff\",\"big2\":\"0xff\",\"big3\":\"255\",\"map\":{\"haha\":\"0xfe\"},\"num1\":0}";
if (!main) Assertions.assertEquals(convert.convertTo(msg), json);
BigMessage msg12 = convert.convertFrom(BigMessage.class, json);
if (!main) Assertions.assertEquals(convert.convertTo(msg12), json);
byte[] bs1 = BsonConvert.root().convertTo(msg);
byte[] bs2 = BsonConvert.root().convertTo(msg2);
if (!main) Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(bs2));
}
public static class BigMessage {
@ConvertCoder(coder = BigIntegerHexJsonSimpledCoder.class)
public BigInteger big;
@ConvertCoder(encoder = BigIntegerHexJsonSimpledCoder.class, decoder = BigIntegerHexJsonSimpledCoder.class)
public BigInteger big2;
public BigInteger big3;
public int num1;
@ConvertCoder(coder = BigIntegerHexJsonSimpledCoder.class)
public Map<String, BigInteger> map;
}
public static class BigMessage2 {
public BigInteger big;
public BigInteger big2;
public BigInteger big3;
public int num1;
public Map<String, BigInteger> map;
}
}

View File

@@ -0,0 +1,222 @@
/*
*/
package org.redkale.test.convert;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.function.*;
import org.junit.jupiter.api.*;
import org.redkale.convert.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.*;
/**
*
* @author zhangjx
*/
public class CustMessage2Test {
private boolean main;
public static void main(String[] args) throws Throwable {
CustMessage2Test test = new CustMessage2Test();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
final BiFunction<Attribute, Object, Object> objFieldFunc = (Attribute t, Object u) -> {
if (t.field().equals("retinfo")) return null;
return t.get(u);
};
OnPlayerLeaveMessage msg1 = new OnPlayerLeaveMessage(100, "haha");
System.out.println(msg1);
OnPlayerLeaveMessage2 msg2 = new OnPlayerLeaveMessage2(100, "haha");
System.out.println(msg2);
if (!main) Assertions.assertEquals(msg1.toString(), msg2.toString());
System.out.println();
String json = msg1.toString();
OnPlayerLeaveMessage2 newmsg2 = JsonConvert.root().convertFrom(OnPlayerLeaveMessage2.class, json);
System.out.println(newmsg2);
System.out.println();
JsonConvert convert = JsonConvert.root().newConvert(objFieldFunc);
System.out.println(convert.convertTo(msg1));
System.out.println(convert.convertTo(msg2));
if (!main) Assertions.assertEquals(convert.convertTo(msg1), convert.convertTo(msg2));
}
public static interface BaseMessage {
@Inherited
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public @interface MessageName {
String value();
}
public static String getMessageName(Class<?> clazz) {
MessageName mn = clazz.getAnnotation(MessageName.class);
if (mn != null) return mn.value();
char[] fieldChars = clazz.getSimpleName().toCharArray();
fieldChars[0] = Character.toLowerCase(fieldChars[0]);
return new String(fieldChars);
}
public static Encodeable<Writer, BaseMessage> createConvertEnCoder(final ConvertFactory factory, final Class<? extends BaseMessage> clazz) {
Encodeable valEncoder = factory.createEncoder(clazz, true);
final String eventName = getMessageName(clazz);
ObjectEncoder encoder = new ObjectEncoder<Writer, BaseMessage>(clazz) {
@Override
protected void afterInitEnMember(ConvertFactory factory) {
Function func1 = t -> eventName;
Attribute attribute1 = Attribute.create(clazz, "event", String.class, func1, null);
EnMember member1 = new EnMember(attribute1, factory.loadEncoder(String.class), null, null);
setIndex(member1, 1);
setPosition(member1, 1);
initForEachEnMember(factory, member1);
Function func2 = t -> t;
Attribute attribute2 = Attribute.create(clazz, "result", clazz, func2, null);
EnMember member2 = new EnMember(attribute2, valEncoder, null, null);
setIndex(member2, 2);
setPosition(member2, 2);
initForEachEnMember(factory, member2);
this.members = new EnMember[]{member1, member2};
}
};
encoder.init(factory);
return encoder;
}
public static Decodeable<Reader, BaseMessage> createConvertDeCoder(final ConvertFactory factory, final Class<? extends BaseMessage> clazz) {
Decodeable valDecoder = factory.createDecoder(clazz, true);
final String eventName = getMessageName(clazz);
ObjectDecoder decoder = new ObjectDecoder<Reader, BaseMessage>(clazz) {
@Override
protected void afterInitDeMember(ConvertFactory factory) {
Function func1 = t -> eventName;
Attribute attribute1 = Attribute.create(clazz, "event", String.class, func1, null);
DeMember member1 = new DeMember(attribute1, factory.loadDecoder(String.class), null, null);
setIndex(member1, 1);
setPosition(member1, 1);
initForEachDeMember(factory, member1);
this.creator = (Creator) objs -> new Object[1];
Function func2 = t -> t;
BiConsumer consumer2 = (t, v) -> ((Object[]) t)[0] = v;
Attribute attribute2 = Attribute.create(clazz, "result", clazz, func2, consumer2);
DeMember member2 = new DeMember(attribute2, valDecoder, null, null);
setIndex(member2, 2);
setPosition(member2, 2);
initForEachDeMember(factory, member2);
this.members = new DeMember[]{member1, member2};
}
@Override
public BaseMessage convertFrom(Reader in) {
Object result = (Object) super.convertFrom(in);
return (BaseMessage) ((Object[]) result)[0];
}
};
decoder.init(factory);
return decoder;
}
}
@BaseMessage.MessageName("onPlayerLeaveMessage")
public static class OnPlayerLeaveMessage2 implements BaseMessage {
@ConvertColumn(index = 1)
public int userid;
@ConvertColumn(index = 2)
public String retinfo;
public OnPlayerLeaveMessage2() {
}
public OnPlayerLeaveMessage2(int userid, String retinfo) {
this.userid = userid;
this.retinfo = retinfo;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
public static class OnPlayerLeaveMessage {
private String event = "onPlayerLeaveMessage";
private OnPlayerLeaveContent result;
public OnPlayerLeaveMessage() {
}
public OnPlayerLeaveMessage(int userid) {
this.result = new OnPlayerLeaveContent(userid);
}
public OnPlayerLeaveMessage(int userid, String retinfo) {
this.result = new OnPlayerLeaveContent(userid, retinfo);
}
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public OnPlayerLeaveContent getResult() {
return result;
}
public void setResult(OnPlayerLeaveContent result) {
this.result = result;
}
public static class OnPlayerLeaveContent {
@ConvertColumn(index = 1)
public int userid;
@ConvertColumn(index = 2)
public String retinfo;
public OnPlayerLeaveContent() {
}
public OnPlayerLeaveContent(int userid) {
this.userid = userid;
}
public OnPlayerLeaveContent(int userid, String retinfo) {
this.userid = userid;
this.retinfo = retinfo;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
}

View File

@@ -0,0 +1,196 @@
/*
*/
package org.redkale.test.convert;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.function.*;
import org.junit.jupiter.api.*;
import org.redkale.convert.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.*;
/**
*
* @author zhangjx
*/
public class CustMessageTest {
private boolean main;
public static void main(String[] args) throws Throwable {
CustMessageTest test = new CustMessageTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
final BiFunction<Attribute, Object, Object> objFieldFunc = (Attribute t, Object u) -> {
if (t.field().equals("retinfo")) return null;
return t.get(u);
};
OnPlayerLeaveMessage msg1 = new OnPlayerLeaveMessage(100, "haha");
System.out.println(msg1);
OnPlayerLeaveMessage2 msg2 = new OnPlayerLeaveMessage2(100, "haha");
System.out.println(msg2);
if (!main) Assertions.assertEquals(msg1.toString(), msg2.toString());
System.out.println();
String json = msg1.toString();
OnPlayerLeaveMessage2 newmsg2 = JsonConvert.root().convertFrom(OnPlayerLeaveMessage2.class, json);
System.out.println(newmsg2);
System.out.println();
JsonConvert convert = JsonConvert.root().newConvert(objFieldFunc);
System.out.println(convert.convertTo(msg1));
System.out.println(convert.convertTo(msg2));
if (!main) Assertions.assertEquals(convert.convertTo(msg1), convert.convertTo(msg2));
}
public static interface BaseMessage {
@Inherited
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public @interface MessageName {
String value();
}
public static String getMessageName(Class<?> clazz) {
MessageName mn = clazz.getAnnotation(MessageName.class);
if (mn != null) return mn.value();
char[] fieldChars = clazz.getSimpleName().toCharArray();
fieldChars[0] = Character.toLowerCase(fieldChars[0]);
return new String(fieldChars);
}
public static Encodeable<Writer, BaseMessage> createConvertEnCoder(ConvertFactory factory, Class<?> clazz) {
Encodeable valEncoder = factory.createEncoder(clazz, true);
ObjectEncoder encoder = new ObjectEncoder<Writer, BaseMessage>(clazz) {
@Override
protected void afterInitEnMember(ConvertFactory factory) {
Function func = t -> t;
Attribute attribute = Attribute.create(clazz, getMessageName(clazz), clazz, func, null);
EnMember member = new EnMember(attribute, valEncoder, null, null);
setIndex(member, 1);
setPosition(member, 1);
initForEachEnMember(factory, member);
this.members = new EnMember[]{member};
}
};
encoder.init(factory);
return encoder;
}
public static Decodeable<Reader, BaseMessage> createConvertDeCoder(ConvertFactory factory, Class<?> clazz) {
Decodeable valDecoder = factory.createDecoder(clazz, true);
ObjectDecoder decoder = new ObjectDecoder<Reader, BaseMessage>(clazz) {
@Override
protected void afterInitDeMember(ConvertFactory factory) {
this.creator = (Creator) objs -> new Object[1];
Function func = t -> t;
BiConsumer consumer = (t, v) -> ((Object[]) t)[0] = v;
Attribute attribute = Attribute.create(clazz, getMessageName(clazz), clazz, func, consumer);
DeMember member = new DeMember(attribute, valDecoder, null, null);
setIndex(member, 1);
setPosition(member, 1);
initForEachDeMember(factory, member);
this.members = new DeMember[]{member};
}
@Override
public BaseMessage convertFrom(Reader in) {
Object result = (Object) super.convertFrom(in);
return (BaseMessage) ((Object[]) result)[0];
}
};
decoder.init(factory);
return decoder;
}
}
@BaseMessage.MessageName("onPlayerLeaveMessage")
public static class OnPlayerLeaveMessage2 implements BaseMessage {
@ConvertColumn(index = 1)
public int userid;
@ConvertColumn(index = 2)
public String retinfo;
public OnPlayerLeaveMessage2() {
}
public OnPlayerLeaveMessage2(int userid, String retinfo) {
this.userid = userid;
this.retinfo = retinfo;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
public static class OnPlayerLeaveMessage {
private OnPlayerLeaveContent onPlayerLeaveMessage;
public OnPlayerLeaveMessage() {
}
public OnPlayerLeaveMessage(int userid) {
this.onPlayerLeaveMessage = new OnPlayerLeaveContent(userid);
}
public OnPlayerLeaveMessage(int userid, String retinfo) {
this.onPlayerLeaveMessage = new OnPlayerLeaveContent(userid, retinfo);
}
public OnPlayerLeaveContent getOnPlayerLeaveMessage() {
return onPlayerLeaveMessage;
}
public void setOnPlayerLeaveMessage(OnPlayerLeaveContent onPlayerLeaveMessage) {
this.onPlayerLeaveMessage = onPlayerLeaveMessage;
}
public static class OnPlayerLeaveContent {
@ConvertColumn(index = 1)
public int userid;
@ConvertColumn(index = 2)
public String retinfo;
public OnPlayerLeaveContent() {
}
public OnPlayerLeaveContent(int userid) {
this.userid = userid;
}
public OnPlayerLeaveContent(int userid, String retinfo) {
this.userid = userid;
this.retinfo = retinfo;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
}

View File

@@ -5,6 +5,7 @@
*/
package org.redkale.test.convert;
import java.util.*;
import org.redkale.convert.*;
import org.redkale.convert.bson.*;
import org.redkale.convert.json.*;
@@ -32,20 +33,25 @@ public class InnerCoderEntity {
/**
* 该方法提供给Convert组件自动加载。
* 1) 方法名可以随意。
2) 方法必须是static
3方法的参数有且只能有一个 且必须是org.redkale.convert.ConvertFactory或子类。
—3.1) 参数类型为org.redkale.convert.ConvertFactory 表示适合JSON和BSON。
—3.2) 参数类型为org.redkale.convert.json.JsonFactory 表示仅适合JSON。
—3.3) 参数类型为org.redkale.convert.bson.BsonFactory 表示仅适合BSON。
4方法的返回类型必须是org.redkale.convert.Decodeable/org.redkale.convert.Encodeable/org.redkale.convert.SimpledCoder
若返回类型不是org.redkale.convert.SimpledCoder, 就必须提供两个方法: 一个返回Decodeable 一个返回 Encodeable。
* 2) 方法必须是static
* 3方法的参数有且只能有一个 且必须是org.redkale.convert.ConvertFactory或子类。
* —3.1) 参数类型为org.redkale.convert.ConvertFactory 表示适合JSON和BSON。
* —3.2) 参数类型为org.redkale.convert.json.JsonFactory 表示仅适合JSON。
* —3.3) 参数类型为org.redkale.convert.bson.BsonFactory 表示仅适合BSON。
* 4方法的返回类型必须是org.redkale.convert.Decodeable/org.redkale.convert.Encodeable/org.redkale.convert.SimpledCoder
* 若返回类型不是org.redkale.convert.SimpledCoder, 就必须提供两个方法: 一个返回Decodeable 一个返回 Encodeable。
*
* @param factory
*
* @return
*/
private static SimpledCoder<Reader, Writer, InnerCoderEntity> createConvertCoder(final org.redkale.convert.ConvertFactory factory) {
static SimpledCoder<Reader, Writer, InnerCoderEntity> createConvertCoder(final org.redkale.convert.ConvertFactory factory) {
return new SimpledCoder<Reader, Writer, InnerCoderEntity>() {
private Map<String, DeMember> deMemberFieldMap;
private Map<Integer, DeMember> deMemberTagMap;
//必须与EnMember[] 顺序一致
private final DeMember[] deMembers = new DeMember[]{
DeMember.create(factory, InnerCoderEntity.class, "id"),
@@ -56,6 +62,15 @@ public class InnerCoderEntity {
EnMember.create(factory, InnerCoderEntity.class, "id"),
EnMember.create(factory, InnerCoderEntity.class, "val")};
{
this.deMemberFieldMap = new HashMap<>(this.deMembers.length);
this.deMemberTagMap = new HashMap<>(this.deMembers.length);
for (DeMember member : this.deMembers) {
this.deMemberFieldMap.put(member.getAttribute().field(), member);
this.deMemberTagMap.put(member.getTag(), member);
}
}
@Override
public void convertTo(Writer out, InnerCoderEntity value) {
if (value == null) {
@@ -75,7 +90,7 @@ public class InnerCoderEntity {
int index = 0;
final Object[] params = new Object[deMembers.length];
while (in.hasNext()) {
DeMember member = in.readFieldName(deMembers); //读取字段名
DeMember member = in.readFieldName(deMembers, deMemberFieldMap, deMemberTagMap); //读取字段名
in.readBlank(); //读取字段名与字段值之间的间隔符JSON则是跳过冒号:
if (member == null) {
in.skipValue(); //跳过不存在的字段的值, 一般不会发生

View File

@@ -0,0 +1,86 @@
/*
*/
package org.redkale.test.convert;
import java.util.*;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class Json5Test {
private boolean main;
public static void main(String[] args) throws Throwable {
Json5Test test = new Json5Test();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
Json5Bean bean = new Json5Bean();
bean.id = 500;
bean.decmails = 3.2f;
bean.value = 44444;
bean.name = "haha";
String json = "{/*多行\r\n注释**/\"decmails\":3.2,//单行注释\r\n\"id\":0x1F4,\"name\":\"haha\",\"value\":44444,}";
Json5Bean bean2 = convert.convertFrom(Json5Bean.class, json);
if (!main) Assertions.assertTrue(bean.equals(bean2));
System.out.println(convert.convertTo(bean2));
String arrayJson = "[" + json + "," + json + "," + "]";
Json5Bean[] beans = convert.convertFrom(Json5Bean[].class, arrayJson);
System.out.println(convert.convertTo(beans));
String intjson = "[1,2,3,4,]";
int[] ints1 = convert.convertFrom(int[].class, intjson);
System.out.println(Arrays.toString(ints1));
}
public static class Json5Bean {
public int id;
public float decmails;
public long value;
public String name;
@Override
public int hashCode() {
int hash = 7;
hash = 47 * hash + this.id;
hash = 47 * hash + Float.floatToIntBits(this.decmails);
hash = 47 * hash + (int) (this.value ^ (this.value >>> 32));
hash = 47 * hash + Objects.hashCode(this.name);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Json5Bean other = (Json5Bean) obj;
if (this.id != other.id)
return false;
if (Float.floatToIntBits(this.decmails) != Float.floatToIntBits(other.decmails))
return false;
if (this.value != other.value)
return false;
if (!Objects.equals(this.name, other.name))
return false;
return true;
}
}
}

View File

@@ -18,7 +18,19 @@ import org.redkale.convert.json.*;
*
* @author zhangjx
*/
public class JsonTestMain {
public class JsonMainTest {
private boolean main;
public static void main(String[] args) throws Throwable {
JsonMainTest test = new JsonMainTest();
test.main = true;
test.run1();
test.run2();
test.run3();
test.run4();
test.run5();
}
@Test
public void run1() throws Throwable {
@@ -33,7 +45,7 @@ public class JsonTestMain {
byte[] bs = new byte[buffers[0].remaining()];
buffers[0].get(bs);
System.out.println(new String(bs));
Assertions.assertEquals(rs, new String(bs));
Assertions.assertEquals(rs, new String(bs));
}
@Test
@@ -88,4 +100,11 @@ public class JsonTestMain {
java.sql.Date rs = convert.convertFrom(java.sql.Date.class, json);
System.out.println(convert.convertTo(rs));
}
@Test
public void run5() throws Throwable {
final JsonConvert convert = JsonConvert.root();
long v = convert.convertFrom(long.class, "100");
Assertions.assertEquals(100, v);
}
}

View File

@@ -0,0 +1,32 @@
/*
*/
package org.redkale.test.convert;
import java.lang.reflect.Type;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class JsonMultiDecoderTest {
private boolean main;
public static void main(String[] args) throws Throwable {
JsonMultiDecoderTest test = new JsonMultiDecoderTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
String json = "[\"aaaa\",{\"name\":\"haha\"}]";
Type[] types = new Type[]{String.class, JsonConvert.TYPE_MAP_STRING_STRING};
Object[] objs = convert.convertFrom(types, json);
System.out.println(convert.convertTo(objs));
if (!main) Assertions.assertEquals(convert.convertTo(objs), json);
}
}

View File

@@ -0,0 +1,123 @@
/*
*/
package org.redkale.test.convert;
import org.junit.jupiter.api.*;
import org.redkale.convert.ConvertImpl;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class JsonMultiObjectDecoderTest {
private boolean main;
public static void main(String[] args) throws Throwable {
JsonMultiObjectDecoderTest test = new JsonMultiObjectDecoderTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
{
String json = "{\"a0\":\"000\",\"a6\":\"666\"}";
AbstractBean bean = JsonConvert.root().convertFrom(AbstractBean.class, json);
if (!main) Assertions.assertEquals(bean.getClass().getName(), Bean69.class.getName());
System.out.println(bean);
}
{
String json = "{\"a0\":\"000\",\"a2\":\"222\",\"a4\":\"444\"}";
AbstractBean bean = JsonConvert.root().convertFrom(AbstractBean.class, json);
if (!main) Assertions.assertEquals(bean.getClass().getName(), Bean423.class.getName());
System.out.println(bean);
}
{
String json = "{\"a0\":\"000\",\"a6\":\"666\",\"a5\":\"555\"}";
AbstractBean bean = JsonConvert.root().convertFrom(AbstractBean.class, json);
if (!main) Assertions.assertEquals(bean.getClass().getName(), Bean65.class.getName());
System.out.println(bean);
}
}
//[{"1", "2", "3"}, {"2", "3"}, {"4", "2", "3"}, {"6", "7", "8"}, {"6", "5"}, {"6", "9"}]
@ConvertImpl(types = {Bean123.class, Bean23.class, Bean423.class, Bean678.class, Bean65.class, Bean69.class})
public static abstract class AbstractBean {
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
public static class Bean123 extends AbstractBean {
public String a1;
public String a2;
public String a3;
}
public static class Bean23 extends AbstractBean {
public String a2;
public String a3;
}
public static class Bean423 extends AbstractBean {
public String a4;
public String a2;
public String a3;
}
public static class Bean678 extends AbstractBean {
public String a6;
public String a7;
public String a8;
}
public static class Bean69 extends AbstractBean {
public String a6;
public String a9;
public Bean69(String a9) {
this.a9 = a9;
}
}
public static class Bean65 extends AbstractBean {
private String a6;
private String a5;
public Bean65(String a5) {
this.a5 = a5;
}
public String getA6() {
return a6;
}
public void setA6(String a6) {
this.a6 = a6;
}
public String getA5() {
return a5;
}
}
}

View File

@@ -0,0 +1,116 @@
/*
*/
package org.redkale.test.convert;
import java.lang.reflect.Type;
import org.junit.jupiter.api.*;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
*
* @author zhangjx
*/
public class ObjectOrStringTest {
private boolean main;
public static void main(String[] args) throws Throwable {
ObjectOrStringTest test = new ObjectOrStringTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
String json = "[\"aaaaa\",{\"id\":200,\"name\":\"haha\"}]";
AbstractBean[] beans = convert.convertFrom(AbstractBean[].class, json);
System.out.println(convert.convertTo(beans[0]));
System.out.println(convert.convertTo(beans[1]));
System.out.println(convert.convertTo(beans));
if (!main) Assertions.assertEquals(json, convert.convertTo(beans));
}
public static abstract class AbstractBean {
//必须声明为private 否则加载StringBean时配置Decoder会采用此方法
private static Decodeable<JsonReader, AbstractBean> createDecoder(final org.redkale.convert.json.JsonFactory factory) {
Decodeable<JsonReader, StringBean> stringDecoder = factory.loadDecoder(StringBean.class);
Decodeable<JsonReader, ObjectBean> objectDecoder = factory.loadDecoder(ObjectBean.class);
return new Decodeable<JsonReader, AbstractBean>() {
@Override
public AbstractBean convertFrom(JsonReader in) {
Decodeable coder = in.isNextObject() ? objectDecoder : stringDecoder;
return (AbstractBean) coder.convertFrom(in);
}
@Override
public Type getType() {
return AbstractBean.class;
}
};
}
}
public static class ObjectBean extends AbstractBean {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class StringBean extends AbstractBean {
private String value;
public StringBean() {
}
public StringBean(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
static SimpledCoder<Reader, Writer, StringBean> createConvertCoder(final org.redkale.convert.ConvertFactory factory) {
return new SimpledCoder<Reader, Writer, StringBean>() {
@Override
public void convertTo(Writer out, StringBean val) {
out.writeString(val == null ? null : val.value);
}
@Override
public StringBean convertFrom(Reader in) {
String val = in.readString();
return new StringBean(val);
}
};
}
}
}

View File

@@ -0,0 +1,52 @@
/*
*/
package org.redkale.test.convert;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.OneOrList;
/**
*
* @author zhangjx
*/
public class OneOrListTest {
private boolean main;
public static void main(String[] args) throws Throwable {
OneOrListTest test = new OneOrListTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
String json = "[\"aaaaa\"]";
{
StringOneList sol = convert.convertFrom(StringOneList.class, json);
System.out.println("sol.list = " + convert.convertTo(sol.getList()));
if (!main) Assertions.assertEquals(json, convert.convertTo(sol));
System.out.println(convert.convertTo(sol));
}
{
String2OneList sol2 = convert.convertFrom(String2OneList.class, json);
System.out.println("sol2.list = " + convert.convertTo(sol2.getList()));
if (!main) Assertions.assertEquals(json, convert.convertTo(sol2));
System.out.println(convert.convertTo(sol2));
}
{
OneOrList<String> sol3 = convert.convertFrom(OneOrList.TYPE_OL_STRING, json);
System.out.println("sol3.list = " + convert.convertTo(sol3.getList()));
if (!main) Assertions.assertEquals(json, convert.convertTo(OneOrList.TYPE_OL_STRING, sol3));
System.out.println(convert.convertTo(OneOrList.TYPE_OL_STRING, sol3));
}
}
public static class StringOneList extends OneOrList<String> {
}
public static class String2OneList extends StringOneList {
}
}

View File

@@ -0,0 +1,44 @@
/*
*/
package org.redkale.test.convert;
import java.nio.charset.StandardCharsets;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.StringWrapper;
/**
*
* @author zhangjx
*/
public class StringWrapperTest {
private boolean main;
public static void main(String[] args) throws Throwable {
StringWrapperTest test = new StringWrapperTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
JsonConvert convert = JsonConvert.root();
{
String val = "{}";
StringWrapper wrapper = new StringWrapper(val);
if (!main) Assertions.assertEquals(val, convert.convertTo(wrapper));
if (!main) Assertions.assertEquals(val, new String(convert.convertToBytes(wrapper)));
System.out.println(convert.convertTo(wrapper));
System.out.println(new String(convert.convertToBytes(wrapper)));
}
{
String val = "{id:'带中文'}";
StringWrapper wrapper = new StringWrapper(val);
if (!main) Assertions.assertEquals(val, convert.convertTo(wrapper));
if (!main) Assertions.assertEquals(val, new String(convert.convertToBytes(wrapper), StandardCharsets.UTF_8));
System.out.println(convert.convertTo(wrapper));
System.out.println(new String(convert.convertToBytes(wrapper), StandardCharsets.UTF_8));
}
}
}

View File

@@ -0,0 +1,48 @@
/*
*/
package org.redkale.test.convert;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.*;
/**
*
* @author zhangjx
*/
public class TinyTest {
private boolean main;
public static void main(String[] args) throws Throwable {
TinyTest test = new TinyTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
TinyRecord record = new TinyRecord();
record.id = 5;
{
JsonFactory factory = JsonFactory.create().tiny(true);
JsonConvert convert = factory.getConvert();
String json = "{\"id\":5}";
if (!main) Assertions.assertEquals(json, convert.convertTo(record));
System.out.println(convert.convertTo(record));
}
{
JsonFactory factory = JsonFactory.create().tiny(false);
JsonConvert convert = factory.getConvert();
String json = "{\"id\":5,\"name\":\"\"}";
if (!main) Assertions.assertEquals(json, convert.convertTo(record));
System.out.println(convert.convertTo(record));
}
}
public static class TinyRecord {
public String name = "";
public int id;
}
}

View File

@@ -105,7 +105,7 @@ public class FilterNodeTest {
FilterNode joinNode1 = FilterJoinNode.create(UserTestTable.class, new String[]{"userid", "username"}, "username", LIKE, bean.username)
.or(FilterJoinNode.create(UserTestTable.class, new String[]{"userid", "username"}, "createtime", GREATERTHAN, bean.createtime));
FilterNode joinNode2 = FilterJoinNode.create(CarTypeTestTable.class, "cartype", "typename", LIKE, bean.typename);
final FilterNode node = CarTestBean.caridTransient() ? (joinNode2.or(joinNode1)) : FilterNode.create("carid", GREATERTHAN, bean.carid).and(joinNode1).or(joinNode2);
final FilterNode node = CarTestBean.caridTransient() ? (joinNode2.or(joinNode1)) : FilterNode.filter("carid", GREATERTHAN, bean.carid).and(joinNode1).or(joinNode2);
final FilterNode beanNode = FilterNodeBean.createFilterNode(bean);
System.out.println("node.string = " + node);
System.out.println("bean.string = " + beanNode);

View File

@@ -1,41 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.test.source;
import org.redkale.source.*;
/**
*
* @author zhangjx
*/
public class JDBCTest {
public static void main(String[] args) throws Exception {
DataSource source = DataSources.createDataSource(null, ""); //耗时37415
int count = 1000;
LoginTestRecord last = null;
long s = System.currentTimeMillis();
int c = 0;
try {
for (int i = 0; i < count; i++) {
LoginTestRecord record = new LoginTestRecord();
record.setSessionid(Long.toHexString(System.nanoTime()));
record.setLoginagent("win7");
record.setLogintime(System.currentTimeMillis());
record.setLoginip("127.0.0.1");
record.setUserid(i);
source.insert(record);
last = record;
c = i;
}
} catch (Exception e) {
System.out.println("异常了: " + c);
e.printStackTrace();
}
long e = System.currentTimeMillis() - s;
System.out.println("耗时:" + e);
}
}

View File

@@ -10,6 +10,7 @@ import java.util.*;
import javax.persistence.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.source.*;
import org.redkale.util.AnyValue.DefaultAnyValue;
/**
*
@@ -60,11 +61,13 @@ public class JsonRecord {
}
public static void main(String[] args) throws Throwable {
Properties properties = new Properties();
properties.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/center?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true");
properties.put("javax.persistence.jdbc.user", "root");
properties.put("javax.persistence.jdbc.password", "");
DataSource source = DataSources.createDataSource("", properties);
DefaultAnyValue conf = DefaultAnyValue.create();
conf.addValue("name", "");
conf.addValue("url", "jdbc:mysql://localhost:3306/center?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true");
conf.addValue("user", "root");
conf.addValue("password", "");
DataJdbcSource source = new DataJdbcSource();
source.init(conf);
JsonRecord record = JsonRecord.create();
source.insert(record);
source.updateColumn(JsonRecord.class, record.getRecordid(), ColumnValue.mov("recordname", "my name 2"));

View File

@@ -66,7 +66,7 @@ public class TestSourceCache {
final Flipper flipper = new Flipper(2);
flipper.setSort("userid DESC, createtime DESC");
final FilterNode node = FilterNode.create("userid", FilterExpress.GREATERTHAN, 1000).and("username", FilterExpress.LIKE, "用户");
final FilterNode node = FilterNode.filter("userid", FilterExpress.GREATERTHAN, 1000).and("username", FilterExpress.LIKE, "用户");
System.out.println("node = " + node);
Sheet<TestEntity> sheet = info.getCache().querySheet(null, flipper, node);
System.out.println(sheet);

View File

@@ -0,0 +1,79 @@
/*
*/
package org.redkale.test.util;
import java.util.Properties;
import org.junit.jupiter.api.*;
import org.redkale.util.AnyValue;
/**
*
* @author zhangjx
*/
public class AnyValuePropertiesTest {
@Test
public void run1() {
Properties properties = new Properties();
properties.put("redkale.aaa.ooo", "value o");
properties.put("redkale.aaa.ppp", "value p");
properties.put("redkale.bbb.qqq.rrr", "value r");
properties.put("redkale.bbb.sss", "value s");
properties.put("redkale.source[my].sss", "my s");
properties.put("redkale.source[my].ttt", "my t");
properties.put("redkale.source[you].sss", "you s");
properties.put("redkale.source[you].ttt", "you t");
properties.put("redkale.ddd[2].ww", "ww 2");
properties.put("redkale.ddd[2].nn", "nn 2");
properties.put("redkale.ddd[0].ww", "ww 0");
properties.put("redkale.ddd[0].nn", "nn 0");
properties.put("redkale.ddd[10].ww", "ww 10");
properties.put("redkale.ddd[10].nn", "nn 10");
properties.put("redkale.mmm.node[5]", "n5");
properties.put("redkale.mmm.node[0]", "n0");
properties.put("redkale.mmm.node[20]", "n20");
String result = "{\r\n"
+ " 'redkale': '{\r\n"
+ " 'source': '{\r\n"
+ " 'my': '{\r\n"
+ " 'sss': 'my s',\r\n"
+ " 'ttt': 'my t',\r\n"
+ " }',\r\n"
+ " 'you': '{\r\n"
+ " 'ttt': 'you t',\r\n"
+ " 'sss': 'you s',\r\n"
+ " }',\r\n"
+ " }',\r\n"
+ " 'ddd': '{\r\n"
+ " 'ww': 'ww 0',\r\n"
+ " 'nn': 'nn 0',\r\n"
+ " }',\r\n"
+ " 'ddd': '{\r\n"
+ " 'ww': 'ww 2',\r\n"
+ " 'nn': 'nn 2',\r\n"
+ " }',\r\n"
+ " 'ddd': '{\r\n"
+ " 'ww': 'ww 10',\r\n"
+ " 'nn': 'nn 10',\r\n"
+ " }',\r\n"
+ " 'mmm': '{\r\n"
+ " 'node': 'n0',\r\n"
+ " 'node': 'n5',\r\n"
+ " 'node': 'n20',\r\n"
+ " }',\r\n"
+ " 'bbb': '{\r\n"
+ " 'sss': 'value s',\r\n"
+ " 'qqq': '{\r\n"
+ " 'rrr': 'value r',\r\n"
+ " }',\r\n"
+ " }',\r\n"
+ " 'aaa': '{\r\n"
+ " 'ppp': 'value p',\r\n"
+ " 'ooo': 'value o',\r\n"
+ " }',\r\n"
+ " }',\r\n"
+ "}";
Assertions.assertEquals(result, AnyValue.loadFromProperties(properties).toString());
}
}

View File

@@ -10,6 +10,7 @@ import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.reflect.Field;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.*;
@@ -17,25 +18,35 @@ import org.redkale.util.*;
*
* @author zhangjx
*/
public class ResourceInjectMain {
public class ResourceAnnotationTest {
private boolean main;
public static void main(String[] args) throws Throwable {
ResourceFactory factory = ResourceFactory.create();
factory.register(new CustomConfLoader());
InjectBean bean = new InjectBean();
factory.inject(bean);
ResourceAnnotationTest test = new ResourceAnnotationTest();
test.main = true;
test.run();
}
public static class CustomConfLoader implements ResourceInjectLoader<CustomConf> {
@Test
public void run() throws Exception {
ResourceFactory factory = ResourceFactory.create();
factory.register(new CustomConfProvider());
InjectBean bean = new InjectBean();
factory.inject(bean);
if (!main) Assertions.assertEquals(new File("conf/test.xml").toString(), bean.conf.toString());
}
public static class CustomConfProvider implements ResourceAnnotationProvider<CustomConf> {
@Override
public void load(ResourceFactory factory, Object src, CustomConf annotation, Field field, Object attachment) {
public void load(ResourceFactory factory, String srcResourceName, Object srcObj, CustomConf annotation, Field field, Object attachment) {
try {
field.set(src, new File(annotation.path()));
field.set(srcObj, new File(annotation.path()));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("对象是 src =" + src + ", path=" + annotation.path());
System.out.println("对象是 src =" + srcObj + ", path=" + annotation.path());
}
@Override

View File

@@ -0,0 +1,68 @@
/*
*/
package org.redkale.test.util;
import javax.annotation.Resource;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonFactory;
import org.redkale.util.*;
/**
*
* @author zhangjx
*/
public class ResourceLoaderTest {
private boolean main;
public static void main(String[] args) throws Throwable {
ResourceLoaderTest test = new ResourceLoaderTest();
test.main = true;
test.run();
}
@Test
public void run() throws Exception {
ResourceFactory factory = ResourceFactory.create();
factory.register("a.id", 1234);
factory.register("a.name", "my a name");
factory.register("b.id", 4321);
factory.register("b.name", "my b name");
Bean bean = new Bean();
factory.register("a", bean);
factory.inject("a", bean);
ParentBean pb = new ParentBean();
factory.inject(pb);
if (!main) Assertions.assertEquals(new Bean(1234, "my a name").toString(), pb.bean.toString());
System.out.println(pb.bean);
}
public static class ParentBean {
@Resource(name = "a")
public Bean bean;
}
public static class Bean {
@Resource(name = "$.id")
public int id;
@Resource(name = "$.name")
public String name;
public Bean() {
}
public Bean(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return JsonFactory.root().getConvert().convertTo(this);
}
}
}