diff --git a/src/main/java/io/github/yezhihao/protostar/FieldFactory.java b/src/main/java/io/github/yezhihao/protostar/FieldFactory.java index 6e466f6..00cc2f8 100644 --- a/src/main/java/io/github/yezhihao/protostar/FieldFactory.java +++ b/src/main/java/io/github/yezhihao/protostar/FieldFactory.java @@ -34,19 +34,13 @@ public abstract class FieldFactory { Schema fieldSchema; switch (dataType) { case BYTE: - fieldSchema = IntSchema.Int8.INSTANCE; - break; case WORD: - fieldSchema = IntSchema.Int16.INSTANCE; - break; case DWORD: - if (Integer.TYPE.isAssignableFrom(typeClass) || Integer.class.isAssignableFrom(typeClass)) - fieldSchema = IntSchema.Int32.INSTANCE; - else - fieldSchema = LongSchema.Long32.INSTANCE; - break; case QWORD: - fieldSchema = LongSchema.Long64.INSTANCE; + if (typeClass.isArray()) + fieldSchema = ArraySchema.getSchema(dataType); + else + fieldSchema = NumberSchema.getSchema(dataType, typeClass); break; case BCD8421: if (LocalDateTime.class.isAssignableFrom(typeClass)) @@ -60,7 +54,7 @@ public abstract class FieldFactory { else if (ByteBuffer.class.isAssignableFrom(typeClass)) fieldSchema = ByteBufferSchema.INSTANCE; else - fieldSchema = ByteArraySchema.INSTANCE; + fieldSchema = ArraySchema.ByteArraySchema.INSTANCE; break; case STRING: fieldSchema = StringSchema.Chars.getInstance(field.pad(), field.charset()); diff --git a/src/main/java/io/github/yezhihao/protostar/PrepareLoadStrategy.java b/src/main/java/io/github/yezhihao/protostar/PrepareLoadStrategy.java index dbb659d..032afc2 100644 --- a/src/main/java/io/github/yezhihao/protostar/PrepareLoadStrategy.java +++ b/src/main/java/io/github/yezhihao/protostar/PrepareLoadStrategy.java @@ -1,7 +1,7 @@ package io.github.yezhihao.protostar; -import io.github.yezhihao.protostar.schema.ByteArraySchema; -import io.github.yezhihao.protostar.schema.IntSchema; +import io.github.yezhihao.protostar.schema.ArraySchema; +import io.github.yezhihao.protostar.schema.NumberSchema; import java.util.HashMap; import java.util.Map; @@ -36,16 +36,16 @@ public abstract class PrepareLoadStrategy extends IdStrategy { public PrepareLoadStrategy addSchema(Object key, DataType dataType) { switch (dataType) { case BYTE: - this.typeIdMapping.put(key, IntSchema.Int8.INSTANCE); + this.typeIdMapping.put(key, NumberSchema.Int8.INSTANCE); break; case WORD: - this.typeIdMapping.put(key, IntSchema.Int16.INSTANCE); + this.typeIdMapping.put(key, NumberSchema.Int16.INSTANCE); break; case DWORD: - this.typeIdMapping.put(key, IntSchema.Int32.INSTANCE); + this.typeIdMapping.put(key, NumberSchema.Int32.INSTANCE); break; case BYTES: - this.typeIdMapping.put(key, ByteArraySchema.INSTANCE); + this.typeIdMapping.put(key, ArraySchema.ByteArraySchema.INSTANCE); break; default: throw new RuntimeException("不支持的类型转换"); diff --git a/src/main/java/io/github/yezhihao/protostar/schema/ArraySchema.java b/src/main/java/io/github/yezhihao/protostar/schema/ArraySchema.java new file mode 100644 index 0000000..c344c6e --- /dev/null +++ b/src/main/java/io/github/yezhihao/protostar/schema/ArraySchema.java @@ -0,0 +1,185 @@ +package io.github.yezhihao.protostar.schema; + +import io.github.yezhihao.protostar.DataType; +import io.github.yezhihao.protostar.Schema; +import io.netty.buffer.ByteBuf; + +public class ArraySchema { + + public static Schema getSchema(DataType dataType) { + Schema schema; + switch (dataType) { + case BYTE: + schema = ByteArraySchema.INSTANCE; + break; + case WORD: + schema = ShortArraySchema.INSTANCE; + break; + case DWORD: + schema = IntArraySchema.INSTANCE; + break; + case QWORD: + schema = LongArraySchema.INSTANCE; + break; + default: + throw new RuntimeException("不支持的类型转换"); + } + return schema; + } + + public static class ByteArraySchema implements Schema { + public static final Schema INSTANCE = new ByteArraySchema(); + + private ByteArraySchema() { + } + + @Override + public byte[] readFrom(ByteBuf input) { + byte[] array = new byte[input.readableBytes()]; + input.readBytes(array); + return array; + } + + @Override + public byte[] readFrom(ByteBuf input, int length) { + if (length < 0) + length = input.readableBytes(); + byte[] array = new byte[length]; + input.readBytes(array); + return array; + } + + @Override + public void writeTo(ByteBuf output, byte[] array) { + output.writeBytes(array); + } + + @Override + public void writeTo(ByteBuf output, int length, byte[] array) { + output.writeBytes(array, 0, length); + } + } + + public static class ShortArraySchema implements Schema { + public static final Schema INSTANCE = new ShortArraySchema(); + + private ShortArraySchema() { + } + + @Override + public short[] readFrom(ByteBuf input) { + int total = input.readableBytes() >> 1; + short[] array = new short[total]; + for (int i = 0; i < total; i++) + array[i] = input.readShort(); + return array; + } + + @Override + public short[] readFrom(ByteBuf input, int length) { + if (length < 0) + length = input.readableBytes(); + int total = length >> 1; + short[] array = new short[total]; + for (int i = 0; i < total; i++) + array[i] = input.readShort(); + return array; + } + + @Override + public void writeTo(ByteBuf output, short[] array) { + for (int i = 0; i < array.length; i++) { + output.writeShort(array[i]); + } + } + + @Override + public void writeTo(ByteBuf output, int length, short[] array) { + for (int i = 0, total = length >> 1; i < total; i++) { + output.writeShort(array[i]); + } + } + } + + public static class IntArraySchema implements Schema { + public static final Schema INSTANCE = new IntArraySchema(); + + private IntArraySchema() { + } + + @Override + public int[] readFrom(ByteBuf input) { + int total = input.readableBytes() >> 2; + int[] array = new int[total]; + for (int i = 0; i < total; i++) + array[i] = input.readInt(); + return array; + } + + @Override + public int[] readFrom(ByteBuf input, int length) { + if (length < 0) + length = input.readableBytes(); + int total = length >> 2; + int[] array = new int[total]; + for (int i = 0; i < total; i++) + array[i] = input.readInt(); + return array; + } + + @Override + public void writeTo(ByteBuf output, int[] array) { + for (int i = 0; i < array.length; i++) { + output.writeInt(array[i]); + } + } + + @Override + public void writeTo(ByteBuf output, int length, int[] array) { + for (int i = 0, total = length >> 2; i < total; i++) { + output.writeInt(array[i]); + } + } + } + + public static class LongArraySchema implements Schema { + public static final Schema INSTANCE = new LongArraySchema(); + + private LongArraySchema() { + } + + @Override + public long[] readFrom(ByteBuf input) { + int total = input.readableBytes() >> 3; + long[] array = new long[total]; + for (int i = 0; i < total; i++) + array[i] = input.readLong(); + return array; + } + + @Override + public long[] readFrom(ByteBuf input, int length) { + if (length < 0) + length = input.readableBytes(); + int total = length >> 3; + long[] array = new long[total]; + for (int i = 0; i < total; i++) + array[i] = input.readLong(); + return array; + } + + @Override + public void writeTo(ByteBuf output, long[] array) { + for (int i = 0; i < array.length; i++) { + output.writeLong(array[i]); + } + } + + @Override + public void writeTo(ByteBuf output, int length, long[] array) { + for (int i = 0, total = length >> 3; i < total; i++) { + output.writeLong(array[i]); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/yezhihao/protostar/schema/ByteArraySchema.java b/src/main/java/io/github/yezhihao/protostar/schema/ByteArraySchema.java deleted file mode 100644 index 960f1c8..0000000 --- a/src/main/java/io/github/yezhihao/protostar/schema/ByteArraySchema.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.yezhihao.protostar.schema; - -import io.netty.buffer.ByteBuf; -import io.github.yezhihao.protostar.Schema; - -public class ByteArraySchema implements Schema { - - public static final Schema INSTANCE = new ByteArraySchema(); - - private ByteArraySchema() { - } - - @Override - public byte[] readFrom(ByteBuf input) { - byte[] message = new byte[input.readableBytes()]; - input.readBytes(message); - return message; - } - - @Override - public byte[] readFrom(ByteBuf input, int length) { - if (length < 0) - length = input.readableBytes(); - byte[] bytes = new byte[length]; - input.readBytes(bytes); - return bytes; - } - - @Override - public void writeTo(ByteBuf output, byte[] value) { - output.writeBytes(value); - } - - @Override - public void writeTo(ByteBuf output, int length, byte[] message) { - output.writeBytes(message, 0, length); - } -} \ No newline at end of file diff --git a/src/main/java/io/github/yezhihao/protostar/schema/IntSchema.java b/src/main/java/io/github/yezhihao/protostar/schema/IntSchema.java deleted file mode 100644 index 9b6c6e1..0000000 --- a/src/main/java/io/github/yezhihao/protostar/schema/IntSchema.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.github.yezhihao.protostar.schema; - -import io.netty.buffer.ByteBuf; -import io.github.yezhihao.protostar.Schema; - -public class IntSchema { - - public static class Int8 implements Schema { - public static final Schema INSTANCE = new Int8(); - - private Int8() { - } - - @Override - public Integer readFrom(ByteBuf input) { - return (int) input.readUnsignedByte(); - } - - @Override - public void writeTo(ByteBuf output, Integer value) { - output.writeByte(value); - } - } - - public static class Int16 implements Schema { - public static final Schema INSTANCE = new Int16(); - - private Int16() { - } - - @Override - public Integer readFrom(ByteBuf input) { - return input.readUnsignedShort(); - } - - @Override - public void writeTo(ByteBuf output, Integer value) { - output.writeShort(value); - } - } - - public static class Int32 implements Schema { - public static final Schema INSTANCE = new Int32(); - - private Int32() { - } - - @Override - public Integer readFrom(ByteBuf input) { - return (int) input.readUnsignedInt(); - } - - @Override - public void writeTo(ByteBuf output, Integer value) { - output.writeInt(value); - } - } -} \ No newline at end of file diff --git a/src/main/java/io/github/yezhihao/protostar/schema/LongSchema.java b/src/main/java/io/github/yezhihao/protostar/schema/LongSchema.java deleted file mode 100644 index d04b9ee..0000000 --- a/src/main/java/io/github/yezhihao/protostar/schema/LongSchema.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.yezhihao.protostar.schema; - -import io.netty.buffer.ByteBuf; -import io.github.yezhihao.protostar.Schema; - -public class LongSchema { - - public static class Long32 implements Schema { - public static final Schema INSTANCE = new Long32(); - - private Long32() { - } - - @Override - public Long readFrom(ByteBuf input) { - return input.readUnsignedInt(); - } - - @Override - public void writeTo(ByteBuf output, Long value) { - output.writeInt(value.intValue()); - } - } - - public static class Long64 implements Schema { - public static final Schema INSTANCE = new Long64(); - - private Long64() { - } - - @Override - public Long readFrom(ByteBuf input) { - return input.readLong(); - } - - @Override - public void writeTo(ByteBuf output, Long value) { - output.writeLong(value.intValue()); - } - } -} \ No newline at end of file diff --git a/src/main/java/io/github/yezhihao/protostar/schema/NumberSchema.java b/src/main/java/io/github/yezhihao/protostar/schema/NumberSchema.java new file mode 100644 index 0000000..786c448 --- /dev/null +++ b/src/main/java/io/github/yezhihao/protostar/schema/NumberSchema.java @@ -0,0 +1,117 @@ +package io.github.yezhihao.protostar.schema; + +import io.github.yezhihao.protostar.DataType; +import io.github.yezhihao.protostar.Schema; +import io.netty.buffer.ByteBuf; + +public class NumberSchema { + + public static Schema getSchema(DataType dataType, Class typeClass) { + Schema schema; + switch (dataType) { + case BYTE: + schema = Int8.INSTANCE; + break; + case WORD: + schema = Int16.INSTANCE; + break; + case DWORD: + if (Integer.TYPE.isAssignableFrom(typeClass) || Integer.class.isAssignableFrom(typeClass)) + schema = NumberSchema.Int32.INSTANCE; + else + schema = NumberSchema.Long32.INSTANCE; + break; + case QWORD: + schema = Long64.INSTANCE; + break; + default: + throw new RuntimeException("不支持的类型转换"); + } + return schema; + } + + public static class Int8 implements Schema { + public static final Schema INSTANCE = new Int8(); + + private Int8() { + } + + @Override + public Integer readFrom(ByteBuf input) { + return (int) input.readUnsignedByte(); + } + + @Override + public void writeTo(ByteBuf output, Integer value) { + output.writeByte(value); + } + } + + public static class Int16 implements Schema { + public static final Schema INSTANCE = new Int16(); + + private Int16() { + } + + @Override + public Integer readFrom(ByteBuf input) { + return input.readUnsignedShort(); + } + + @Override + public void writeTo(ByteBuf output, Integer value) { + output.writeShort(value); + } + } + + public static class Int32 implements Schema { + public static final Schema INSTANCE = new Int32(); + + private Int32() { + } + + @Override + public Integer readFrom(ByteBuf input) { + return input.readInt(); + } + + @Override + public void writeTo(ByteBuf output, Integer value) { + output.writeInt(value); + } + } + + public static class Long32 implements Schema { + public static final Schema INSTANCE = new Long32(); + + private Long32() { + } + + @Override + public Long readFrom(ByteBuf input) { + return input.readUnsignedInt(); + } + + @Override + public void writeTo(ByteBuf output, Long value) { + output.writeInt(value.intValue()); + } + } + + public static class Long64 implements Schema { + public static final Schema INSTANCE = new Long64(); + + private Long64() { + } + + @Override + public Long readFrom(ByteBuf input) { + return input.readLong(); + } + + @Override + public void writeTo(ByteBuf output, Long value) { + output.writeLong(value.intValue()); + } + } +} \ No newline at end of file diff --git a/src/test/java/io/github/yezhihao/protostar/convert/AttributeType.java b/src/test/java/io/github/yezhihao/protostar/convert/AttributeType.java index fe4a664..610d2c6 100644 --- a/src/test/java/io/github/yezhihao/protostar/convert/AttributeType.java +++ b/src/test/java/io/github/yezhihao/protostar/convert/AttributeType.java @@ -2,7 +2,7 @@ package io.github.yezhihao.protostar.convert; import io.github.yezhihao.protostar.IdStrategy; import io.github.yezhihao.protostar.PrepareLoadStrategy; -import io.github.yezhihao.protostar.schema.IntSchema; +import io.github.yezhihao.protostar.schema.NumberSchema; import io.github.yezhihao.protostar.schema.StringSchema; public class AttributeType extends PrepareLoadStrategy { @@ -12,7 +12,7 @@ public class AttributeType extends PrepareLoadStrategy { @Override protected void addSchemas(PrepareLoadStrategy schemaRegistry) { schemaRegistry - .addSchema(1, IntSchema.Int32.INSTANCE) + .addSchema(1, NumberSchema.Int32.INSTANCE) .addSchema(2, StringSchema.Chars.getInstance((byte) 0, "GBK")) .addSchema(3, Attr1.class)