| 16 | import org.jetbrains.annotations.NotNull; |
| 17 | |
| 18 | public final class Meta1<V> { |
| 19 | private static final long beanHeadHash = Bean.hash64("Zeze.Transaction.Log<"); |
| 20 | private static final long logOneHeadHash = Bean.hash64("Zeze.Transaction.Collections.LogOne<"); |
| 21 | private static final long list1HeadHash = Bean.hash64("Zeze.Transaction.Collections.LogList1<"); |
| 22 | private static final long list2HeadHash = Bean.hash64("Zeze.Transaction.Collections.LogList2<"); |
| 23 | private static final long set1HeadHash = Bean.hash64("Zeze.Transaction.Collections.LogSet1<"); |
| 24 | private static final int dynamicBeanTypeId = Bean.hash32("Zeze.Transaction.Collections.LogList2<Zeze.Transaction.DynamicBean>"); |
| 25 | private static final ConcurrentHashMap<Class<?>, Meta1<?>> beanMetas = new ConcurrentHashMap<>(); |
| 26 | private static final ConcurrentHashMap<Class<?>, Meta1<?>> logOneMetas = new ConcurrentHashMap<>(); |
| 27 | private static final ConcurrentHashMap<Class<?>, Meta1<?>> list1Metas = new ConcurrentHashMap<>(); |
| 28 | private static final ConcurrentHashMap<Class<?>, Meta1<?>> list2Metas = new ConcurrentHashMap<>(); |
| 29 | private static final ConcurrentHashMap<Class<?>, Meta1<?>> set1Metas = new ConcurrentHashMap<>(); |
| 30 | |
| 31 | public final int logTypeId; |
| 32 | public final int valueEncodeType; |
| 33 | public final BiConsumer<ByteBuffer, V> valueEncoder; // 只用于非Bean类型 |
| 34 | public final Function<IByteBuffer, V> valueDecoder; // 只用于非Bean类型 |
| 35 | public final SerializeHelper.ObjectIntFunction<IByteBuffer, V> valueDecoderWithType; // 只用于非Bean类型 |
| 36 | public final MethodHandle valueFactory; // 只用于Bean类型 |
| 37 | public final @NotNull String name; // 主要用于分析查错 |
| 38 | |
| 39 | private Meta1(@NotNull String headStr, long headHash, @NotNull Class<V> valueClass) { |
| 40 | logTypeId = Bean.hashLog(headHash, valueClass); |
| 41 | var valueCodecFuncs = SerializeHelper.createCodec(valueClass); |
| 42 | valueEncodeType = valueCodecFuncs.encodeType; |
| 43 | valueEncoder = valueCodecFuncs.encoder; |
| 44 | valueDecoder = valueCodecFuncs.decoder; |
| 45 | valueDecoderWithType = valueCodecFuncs.decoderWithType; |
| 46 | valueFactory = BeanKey.class.isAssignableFrom(valueClass) || Bean.class.isAssignableFrom(valueClass) |
| 47 | ? Reflect.getDefaultConstructor(valueClass) : null; |
| 48 | name = headStr + valueClass.getName(); |
| 49 | } |
| 50 | |
| 51 | private Meta1(@NotNull ToLongFunction<Bean> get, @NotNull LongFunction<Bean> create) { |
| 52 | logTypeId = dynamicBeanTypeId; |
| 53 | valueEncodeType = IByteBuffer.DYNAMIC; |
| 54 | valueEncoder = null; |
| 55 | valueDecoder = null; |
| 56 | valueDecoderWithType = null; |
| 57 | valueFactory = SerializeHelper.createDynamicFactory(get, create); |
| 58 | name = "LogList2:DynamicBean"; |
| 59 | } |
| 60 | |
| 61 | @SuppressWarnings("unchecked") |
| 62 | public static <V extends Bean> @NotNull Meta1<V> getLogOneMeta(@NotNull Class<V> beanClass) { |
| 63 | return (Meta1<V>)logOneMetas.computeIfAbsent(beanClass, vc -> new Meta1<>("LogOne:", logOneHeadHash, (Class<V>)vc)); |
| 64 | } |
| 65 | |
| 66 | @SuppressWarnings("unchecked") |
| 67 | public static <V extends Serializable> @NotNull Meta1<V> getBeanMeta(@NotNull Class<V> beanClass) { |
| 68 | return (Meta1<V>)beanMetas.computeIfAbsent(beanClass, vc -> new Meta1<>("LogBeanKey:", beanHeadHash, (Class<V>)vc)); |
| 69 | } |
| 70 | |
| 71 | @SuppressWarnings("unchecked") |
| 72 | public static <V> @NotNull Meta1<V> getList1Meta(@NotNull Class<V> valueClass) { |
| 73 | return (Meta1<V>)list1Metas.computeIfAbsent(valueClass, vc -> new Meta1<>("LogList1:", list1HeadHash, (Class<V>)vc)); |
| 74 | } |
| 75 | |