From 48a0432ffd3faee907313f111b857483d5e374d2 Mon Sep 17 00:00:00 2001 From: Alexander Kalankhodzhaev Date: Fri, 20 May 2022 20:40:00 +0700 Subject: [PATCH] added Unit type support moved Array to types --- build.gradle | 2 +- .../substrateclient/common/CommonType.java | 6 ------ .../common/codegen/Constants.java | 10 ---------- rpc/rpc-codegen/build.gradle | 1 + .../rpc/codegen/decoder/DecoderCompositor.java | 4 ++-- .../rpc/codegen/encoder/EncoderCompositor.java | 4 ++-- rpc/rpc-core/build.gradle | 1 + .../rpc/core/decoders/UnitDecoder.java | 16 ++++++++++++++++ .../rpc/core/encoders/UnitEncoder.java | 16 ++++++++++++++++ .../rpc/core/registries/RpcDecoderRegistry.java | 6 ++++-- .../rpc/core/registries/RpcEncoderRegistry.java | 11 +++++------ scale/scale-codegen/build.gradle | 3 ++- .../scale/codegen/reader/ReaderCompositor.java | 4 ++-- .../scale/codegen/writer/WriterCompositor.java | 4 ++-- .../scale/readers/UnitReader.java | 17 +++++++++++++++++ .../scale/registries/ScaleReaderRegistry.java | 6 ++++-- .../scale/registries/ScaleWriterRegistry.java | 8 +++----- .../scale/writers/UnitWriter.java | 16 ++++++++++++++++ .../substrateclient/types/Array.java | 4 ++++ .../substrateclient/types/Unit.java | 12 ++++++++++++ 20 files changed, 110 insertions(+), 41 deletions(-) delete mode 100644 common/src/main/java/com/strategyobject/substrateclient/common/CommonType.java delete mode 100644 common/src/main/java/com/strategyobject/substrateclient/common/codegen/Constants.java create mode 100644 rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/decoders/UnitDecoder.java create mode 100644 rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/encoders/UnitEncoder.java create mode 100644 scale/src/main/java/com/strategyobject/substrateclient/scale/readers/UnitReader.java create mode 100644 scale/src/main/java/com/strategyobject/substrateclient/scale/writers/UnitWriter.java create mode 100644 types/src/main/java/com/strategyobject/substrateclient/types/Array.java create mode 100644 types/src/main/java/com/strategyobject/substrateclient/types/Unit.java diff --git a/build.gradle b/build.gradle index 978d20a1..f99f518e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'io.freefair.lombok' version '6.1.0' apply false + id 'io.freefair.lombok' version '6.4.3' apply false id 'maven-publish' } diff --git a/common/src/main/java/com/strategyobject/substrateclient/common/CommonType.java b/common/src/main/java/com/strategyobject/substrateclient/common/CommonType.java deleted file mode 100644 index 4d5aa968..00000000 --- a/common/src/main/java/com/strategyobject/substrateclient/common/CommonType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.strategyobject.substrateclient.common; - -public interface CommonType { - class Array implements CommonType { - } -} diff --git a/common/src/main/java/com/strategyobject/substrateclient/common/codegen/Constants.java b/common/src/main/java/com/strategyobject/substrateclient/common/codegen/Constants.java deleted file mode 100644 index 0b6e0068..00000000 --- a/common/src/main/java/com/strategyobject/substrateclient/common/codegen/Constants.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.strategyobject.substrateclient.common.codegen; - -import com.strategyobject.substrateclient.common.CommonType; - -public class Constants { - public static final Class ARRAY_TYPE = CommonType.Array.class; - - private Constants() { - } -} diff --git a/rpc/rpc-codegen/build.gradle b/rpc/rpc-codegen/build.gradle index 2f6ad931..c1601b50 100644 --- a/rpc/rpc-codegen/build.gradle +++ b/rpc/rpc-codegen/build.gradle @@ -4,6 +4,7 @@ dependencies { implementation project(':scale') implementation project(':scale:scale-codegen') implementation project(':transport') + implementation project(':types') compileOnly 'com.google.auto.service:auto-service-annotations:1.0.1' annotationProcessor 'com.google.auto.service:auto-service:1.0.1' diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java index e9404519..22a1f025 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java @@ -1,7 +1,6 @@ package com.strategyobject.substrateclient.rpc.codegen.decoder; import com.squareup.javapoet.CodeBlock; -import com.strategyobject.substrateclient.common.codegen.Constants; import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; import com.strategyobject.substrateclient.rpc.core.DecoderPair; @@ -9,6 +8,7 @@ import com.strategyobject.substrateclient.rpc.core.RpcRegistryHelper; import com.strategyobject.substrateclient.scale.ScaleReader; import com.strategyobject.substrateclient.scale.ScaleRegistryHelper; +import com.strategyobject.substrateclient.types.Array; import lombok.NonNull; import lombok.var; @@ -44,7 +44,7 @@ public DecoderCompositor(@NonNull ProcessorContext context, this.readerMethod = readerMethod; this.decoderRegistryVarName = decoderRegistryVarName; this.scaleRegistryVarName = scaleRegistryVarName; - this.arrayType = context.erasure(context.getType(Constants.ARRAY_TYPE)); + this.arrayType = context.erasure(context.getType(Array.class)); } private CodeBlock getTypeVarCodeBlock(TypeVariable type) { diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java index 158876ea..bbfebc07 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java @@ -1,7 +1,6 @@ package com.strategyobject.substrateclient.rpc.codegen.encoder; import com.squareup.javapoet.CodeBlock; -import com.strategyobject.substrateclient.common.codegen.Constants; import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; import com.strategyobject.substrateclient.rpc.core.EncoderPair; @@ -9,6 +8,7 @@ import com.strategyobject.substrateclient.rpc.core.RpcRegistryHelper; import com.strategyobject.substrateclient.scale.ScaleRegistryHelper; import com.strategyobject.substrateclient.scale.ScaleWriter; +import com.strategyobject.substrateclient.types.Array; import lombok.NonNull; import lombok.val; import lombok.var; @@ -45,7 +45,7 @@ public EncoderCompositor(@NonNull ProcessorContext context, this.writerMethod = writerMethod; this.encoderRegistryVarName = encoderRegistryVarName; this.scaleRegistryVarName = scaleRegistryVarName; - this.arrayType = context.erasure(context.getType(Constants.ARRAY_TYPE)); + this.arrayType = context.erasure(context.getType(Array.class)); } private CodeBlock getNonGenericCodeBlock(TypeMirror type) { diff --git a/rpc/rpc-core/build.gradle b/rpc/rpc-core/build.gradle index 2cf62202..3eda7960 100644 --- a/rpc/rpc-core/build.gradle +++ b/rpc/rpc-core/build.gradle @@ -2,6 +2,7 @@ dependencies { implementation project(':common') implementation project(':scale') implementation project(':transport') + implementation project(':types') testImplementation project(':tests') diff --git a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/decoders/UnitDecoder.java b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/decoders/UnitDecoder.java new file mode 100644 index 00000000..edea9fc4 --- /dev/null +++ b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/decoders/UnitDecoder.java @@ -0,0 +1,16 @@ +package com.strategyobject.substrateclient.rpc.core.decoders; + +import com.google.common.base.Preconditions; +import com.strategyobject.substrateclient.rpc.core.DecoderPair; +import com.strategyobject.substrateclient.rpc.core.RpcDecoder; +import com.strategyobject.substrateclient.transport.RpcObject; +import com.strategyobject.substrateclient.types.Unit; + +public class UnitDecoder implements RpcDecoder { + @Override + public Unit decode(RpcObject value, DecoderPair... decoders) { + Preconditions.checkArgument(decoders == null || decoders.length == 0); + + return Unit.get(); + } +} diff --git a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/encoders/UnitEncoder.java b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/encoders/UnitEncoder.java new file mode 100644 index 00000000..cdc7fe68 --- /dev/null +++ b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/encoders/UnitEncoder.java @@ -0,0 +1,16 @@ +package com.strategyobject.substrateclient.rpc.core.encoders; + +import com.google.common.base.Preconditions; +import com.strategyobject.substrateclient.rpc.core.EncoderPair; +import com.strategyobject.substrateclient.rpc.core.RpcEncoder; +import com.strategyobject.substrateclient.types.Unit; + +public class UnitEncoder implements RpcEncoder { + + @Override + public Object encode(Unit source, EncoderPair... encoders) { + Preconditions.checkArgument(encoders == null || encoders.length == 0); + + return null; + } +} diff --git a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcDecoderRegistry.java b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcDecoderRegistry.java index dd14802c..05e5ef1e 100644 --- a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcDecoderRegistry.java +++ b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcDecoderRegistry.java @@ -1,10 +1,11 @@ package com.strategyobject.substrateclient.rpc.core.registries; -import com.strategyobject.substrateclient.common.CommonType; import com.strategyobject.substrateclient.common.reflection.Scanner; import com.strategyobject.substrateclient.rpc.core.RpcDecoder; import com.strategyobject.substrateclient.rpc.core.annotations.AutoRegister; import com.strategyobject.substrateclient.rpc.core.decoders.*; +import com.strategyobject.substrateclient.types.Array; +import com.strategyobject.substrateclient.types.Unit; import lombok.NonNull; import lombok.val; import org.slf4j.Logger; @@ -26,6 +27,7 @@ private RpcDecoderRegistry() { register(new ListDecoder(), List.class); register(new MapDecoder(), Map.class); register(new VoidDecoder(), Void.class); + register(new UnitDecoder(), Unit.class); register(new BooleanDecoder(), Boolean.class, boolean.class); register(new ByteDecoder(), Byte.class, byte.class); register(new DoubleDecoder(), Double.class, double.class); @@ -34,7 +36,7 @@ private RpcDecoderRegistry() { register(new LongDecoder(), Long.class, long.class); register(new ShortDecoder(), Short.class, short.class); register(new StringDecoder(), String.class); - register(new ArrayDecoder(), CommonType.Array.class); + register(new ArrayDecoder(), Array.class); registerAnnotatedFrom(ROOT_PREFIX); } diff --git a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcEncoderRegistry.java b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcEncoderRegistry.java index b4423f1c..9d953f1e 100644 --- a/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcEncoderRegistry.java +++ b/rpc/rpc-core/src/main/java/com/strategyobject/substrateclient/rpc/core/registries/RpcEncoderRegistry.java @@ -1,13 +1,11 @@ package com.strategyobject.substrateclient.rpc.core.registries; -import com.strategyobject.substrateclient.common.CommonType; import com.strategyobject.substrateclient.common.reflection.Scanner; import com.strategyobject.substrateclient.rpc.core.RpcEncoder; import com.strategyobject.substrateclient.rpc.core.annotations.AutoRegister; -import com.strategyobject.substrateclient.rpc.core.encoders.ArrayEncoder; -import com.strategyobject.substrateclient.rpc.core.encoders.ListEncoder; -import com.strategyobject.substrateclient.rpc.core.encoders.MapEncoder; -import com.strategyobject.substrateclient.rpc.core.encoders.PlainEncoder; +import com.strategyobject.substrateclient.rpc.core.encoders.*; +import com.strategyobject.substrateclient.types.Array; +import com.strategyobject.substrateclient.types.Unit; import lombok.NonNull; import lombok.val; import org.slf4j.Logger; @@ -29,9 +27,10 @@ private RpcEncoderRegistry() { register(new PlainEncoder<>(), Void.class, String.class, Boolean.class, boolean.class, Byte.class, byte.class, Double.class, double.class, Float.class, float.class, Integer.class, int.class, Long.class, long.class, Short.class, short.class); + register(new UnitEncoder(), Unit.class); register(new ListEncoder(), List.class); register(new MapEncoder(), Map.class); - register(new ArrayEncoder(), CommonType.Array.class); + register(new ArrayEncoder(), Array.class); registerAnnotatedFrom(ROOT_PREFIX); } diff --git a/scale/scale-codegen/build.gradle b/scale/scale-codegen/build.gradle index d85b5311..654b8555 100644 --- a/scale/scale-codegen/build.gradle +++ b/scale/scale-codegen/build.gradle @@ -1,6 +1,7 @@ dependencies { - implementation project(':scale') implementation project(':common') + implementation project(':scale') + implementation project(':types') compileOnly 'com.google.auto.service:auto-service-annotations:1.0.1' annotationProcessor 'com.google.auto.service:auto-service:1.0.1' diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java index 1ae4da6e..bb9622c4 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java @@ -2,9 +2,9 @@ import com.google.common.base.Strings; import com.squareup.javapoet.CodeBlock; -import com.strategyobject.substrateclient.common.codegen.Constants; import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; +import com.strategyobject.substrateclient.types.Array; import lombok.NonNull; import lombok.var; @@ -28,7 +28,7 @@ private ReaderCompositor(ProcessorContext context, this.typeVarMap = typeVarMap; this.readerAccessor = readerAccessor; this.registryVarName = registryVarName; - this.arrayType = context.erasure(context.getType(Constants.ARRAY_TYPE)); + this.arrayType = context.erasure(context.getType(Array.class)); } public static ReaderCompositor forAnyType(@NonNull ProcessorContext context, diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java index 5410e817..73e5d2c0 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java @@ -1,9 +1,9 @@ package com.strategyobject.substrateclient.scale.codegen.writer; import com.squareup.javapoet.CodeBlock; -import com.strategyobject.substrateclient.common.codegen.Constants; import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; +import com.strategyobject.substrateclient.types.Array; import lombok.NonNull; import lombok.var; @@ -32,7 +32,7 @@ private WriterCompositor(ProcessorContext context, this.selfWritable = context.erasure(context.getType(SCALE_SELF_WRITABLE)); this.writerAccessor = writerAccessor; this.registryVarName = registryVarName; - this.arrayType = context.erasure(context.getType(Constants.ARRAY_TYPE)); + this.arrayType = context.erasure(context.getType(Array.class)); } public static WriterCompositor forAnyType(@NonNull ProcessorContext context, diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/readers/UnitReader.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/readers/UnitReader.java new file mode 100644 index 00000000..4fdb7c64 --- /dev/null +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/readers/UnitReader.java @@ -0,0 +1,17 @@ +package com.strategyobject.substrateclient.scale.readers; + +import com.google.common.base.Preconditions; +import com.strategyobject.substrateclient.scale.ScaleReader; +import com.strategyobject.substrateclient.types.Unit; +import lombok.NonNull; + +import java.io.InputStream; + +public class UnitReader implements ScaleReader { + @Override + public Unit read(@NonNull InputStream stream, ScaleReader... readers) { + Preconditions.checkArgument(readers == null || readers.length == 0); + + return Unit.get(); + } +} diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java index e2d9d342..e76d83eb 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java @@ -1,13 +1,14 @@ package com.strategyobject.substrateclient.scale.registries; -import com.strategyobject.substrateclient.common.CommonType; import com.strategyobject.substrateclient.common.reflection.Scanner; import com.strategyobject.substrateclient.scale.ScaleReader; import com.strategyobject.substrateclient.scale.ScaleType; import com.strategyobject.substrateclient.scale.annotations.AutoRegister; import com.strategyobject.substrateclient.scale.readers.*; import com.strategyobject.substrateclient.scale.readers.union.*; +import com.strategyobject.substrateclient.types.Array; import com.strategyobject.substrateclient.types.Result; +import com.strategyobject.substrateclient.types.Unit; import com.strategyobject.substrateclient.types.union.*; import lombok.NonNull; import lombok.val; @@ -59,13 +60,14 @@ private ScaleReaderRegistry() { register(new Union11Reader(), Union11.class, ScaleType.Union11.class); register(new Union12Reader(), Union12.class, ScaleType.Union12.class); register(new VecReader(), ScaleType.Vec.class, List.class); - register(new ArrayReader(), CommonType.Array.class); + register(new ArrayReader(), Array.class); register(new BooleanArrayReader(), boolean[].class); register(new ByteArrayReader(), byte[].class); register(new ShortArrayReader(), short[].class); register(new IntArrayReader(), int[].class); register(new LongArrayReader(), long[].class); register(new VoidReader(), Void.class); + register(new UnitReader(), Unit.class); registerAnnotatedFrom(ROOT_PREFIX); } diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java index 2368863e..56b61889 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java @@ -1,6 +1,5 @@ package com.strategyobject.substrateclient.scale.registries; -import com.strategyobject.substrateclient.common.CommonType; import com.strategyobject.substrateclient.common.reflection.Scanner; import com.strategyobject.substrateclient.scale.ScaleSelfWritable; import com.strategyobject.substrateclient.scale.ScaleType; @@ -8,9 +7,7 @@ import com.strategyobject.substrateclient.scale.annotations.AutoRegister; import com.strategyobject.substrateclient.scale.writers.*; import com.strategyobject.substrateclient.scale.writers.union.*; -import com.strategyobject.substrateclient.types.PublicKey; -import com.strategyobject.substrateclient.types.Result; -import com.strategyobject.substrateclient.types.SignatureData; +import com.strategyobject.substrateclient.types.*; import com.strategyobject.substrateclient.types.union.*; import lombok.NonNull; import lombok.val; @@ -62,13 +59,14 @@ private ScaleWriterRegistry() { register(new Union11Writer(), Union11.class, ScaleType.Union11.class); register(new Union12Writer(), Union12.class, ScaleType.Union12.class); register(new VecWriter(), ScaleType.Vec.class, List.class); - register(new ArrayWriter(), CommonType.Array.class); + register(new ArrayWriter(), Array.class); register(new BooleanArrayWriter(), boolean[].class); register(new ByteArrayWriter(), byte[].class); register(new ShortArrayWriter(), short[].class); register(new IntArrayWriter(), int[].class); register(new LongArrayWriter(), long[].class); register(new VoidWriter(), Void.class); + register(new UnitWriter(), Unit.class); register(new SelfWriter(), ScaleSelfWritable.class); register(new PublicKeyWriter(), PublicKey.class); register(new SignatureDataWriter(), SignatureData.class); diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/writers/UnitWriter.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/writers/UnitWriter.java new file mode 100644 index 00000000..d467cdeb --- /dev/null +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/writers/UnitWriter.java @@ -0,0 +1,16 @@ +package com.strategyobject.substrateclient.scale.writers; + +import com.google.common.base.Preconditions; +import com.strategyobject.substrateclient.scale.ScaleWriter; +import com.strategyobject.substrateclient.types.Unit; +import lombok.NonNull; + +import java.io.OutputStream; + +public class UnitWriter implements ScaleWriter { + @Override + public void write(@NonNull Unit value, @NonNull OutputStream stream, ScaleWriter... writers) { + Preconditions.checkArgument(writers == null || writers.length == 0); + } +} + diff --git a/types/src/main/java/com/strategyobject/substrateclient/types/Array.java b/types/src/main/java/com/strategyobject/substrateclient/types/Array.java new file mode 100644 index 00000000..98e3849e --- /dev/null +++ b/types/src/main/java/com/strategyobject/substrateclient/types/Array.java @@ -0,0 +1,4 @@ +package com.strategyobject.substrateclient.types; + +public interface Array { +} diff --git a/types/src/main/java/com/strategyobject/substrateclient/types/Unit.java b/types/src/main/java/com/strategyobject/substrateclient/types/Unit.java new file mode 100644 index 00000000..c561276c --- /dev/null +++ b/types/src/main/java/com/strategyobject/substrateclient/types/Unit.java @@ -0,0 +1,12 @@ +package com.strategyobject.substrateclient.types; + +public class Unit { + private static final Unit UNIT = new Unit(); + + public static Unit get() { + return UNIT; + } + + private Unit() { + } +}