IGNITE-4109 - BinaryType.isEnum() throws an exception if typeId==0 (cherry picked from commit 2ccae40)
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8070da31 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8070da31 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8070da31 Branch: refs/heads/ignite-3477 Commit: 8070da317fec537b130164cac03a0b56e2bf388f Parents: 7677f5f Author: dkarachentsev <[email protected]> Authored: Fri Dec 23 17:51:49 2016 +0300 Committer: dkarachentsev <[email protected]> Committed: Mon Dec 26 13:21:52 2016 +0300 ---------------------------------------------------------------------- .../ignite/internal/binary/BinaryContext.java | 4 ++-- .../ignite/internal/binary/BinaryTypeProxy.java | 15 ++++++++++++--- .../ignite/internal/binary/BinaryUtils.java | 4 +++- .../internal/binary/BinaryEnumsSelfTest.java | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/8070da31/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index b132db3..4616f11 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -923,7 +923,7 @@ public class BinaryContext { * @param typeId Type ID. * @return Instance of ID mapper. */ - public BinaryInternalMapper userTypeMapper(int typeId) { + BinaryInternalMapper userTypeMapper(int typeId) { BinaryInternalMapper mapper = typeId2Mapper.get(typeId); return mapper != null ? mapper : SIMPLE_NAME_LOWER_CASE_MAPPER; @@ -933,7 +933,7 @@ public class BinaryContext { * @param clsName Type name. * @return Instance of ID mapper. */ - private BinaryInternalMapper userTypeMapper(String clsName) { + BinaryInternalMapper userTypeMapper(String clsName) { BinaryInternalMapper mapper = cls2Mappers.get(clsName); if (mapper != null) http://git-wip-us.apache.org/repos/asf/ignite/blob/8070da31/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java index 17b0bc6..df9901e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import java.util.Collection; +import org.jetbrains.annotations.Nullable; /** * Binary type proxy. Is used to delay or completely avoid metadata lookup. @@ -34,21 +35,26 @@ public class BinaryTypeProxy implements BinaryType { private final BinaryContext ctx; /** Type ID. */ - private final int typeId; + private int typeId; + + /** Raw data. */ + private final String clsName; /** Target type. */ @GridToStringExclude private volatile BinaryType target; /** - * Constrcutor. + * Constructor. * * @param ctx Context. * @param typeId Type ID. + * @param clsName Class name. */ - public BinaryTypeProxy(BinaryContext ctx, int typeId) { + public BinaryTypeProxy(BinaryContext ctx, int typeId, @Nullable String clsName) { this.ctx = ctx; this.typeId = typeId; + this.clsName = clsName; } /** {@inheritDoc} */ @@ -93,6 +99,9 @@ public class BinaryTypeProxy implements BinaryType { if (target == null) { synchronized (this) { if (target == null) { + if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName != null) + typeId = ctx.typeId(clsName); + target = ctx.metadata(typeId); if (target == null) http://git-wip-us.apache.org/repos/asf/ignite/blob/8070da31/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index cb6e641..bc4260f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -2222,7 +2222,9 @@ public class BinaryUtils { if (ctx == null) throw new BinaryObjectException("BinaryContext is not set for the object."); - return new BinaryTypeProxy(ctx, obj.typeId()); + String clsName = obj instanceof BinaryEnumObjectImpl ? ((BinaryEnumObjectImpl)obj).className() : null; + + return new BinaryTypeProxy(ctx, obj.typeId(), clsName); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/8070da31/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryEnumsSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryEnumsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryEnumsSelfTest.java index fb7e618..91add0d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryEnumsSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryEnumsSelfTest.java @@ -28,6 +28,7 @@ import org.apache.ignite.cache.CacheMode; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.marshaller.Marshaller; @@ -389,6 +390,23 @@ public class BinaryEnumsSelfTest extends GridCommonAbstractTest { } /** + * Check ability to resolve typeId from class name. + * + * @throws Exception If failed. + */ + public void testZeroTypeId() throws Exception { + startUp(true); + + final BinaryContext ctx = + ((CacheObjectBinaryProcessorImpl)((IgniteEx)node1).context().cacheObjects()).binaryContext(); + + final BinaryObject enumObj = + new BinaryEnumObjectImpl(ctx, 0, EnumType.class.getName(), EnumType.ONE.ordinal()); + + assert enumObj.type().isEnum(); + } + + /** * Validate simple array. * * @param registered Registered flag.
