You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/11/24 12:35:22 UTC
[1/3] ignite git commit: IGNITE-1956: WIP.
Repository: ignite
Updated Branches:
refs/heads/ignite-1956 [created] da8257b97
IGNITE-1956: WIP.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fe16b193
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fe16b193
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fe16b193
Branch: refs/heads/ignite-1956
Commit: fe16b1935b823215eadd361355c6e31ab44a1b51
Parents: dcbfbd2
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Nov 24 12:23:26 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Nov 24 12:23:26 2015 +0300
----------------------------------------------------------------------
.../java/org/apache/ignite/IgniteBinary.java | 9 +++
.../org/apache/ignite/binary/BinaryObject.java | 8 ++
.../org/apache/ignite/binary/BinaryType.java | 7 ++
.../ignite/binary/BinaryTypeConfiguration.java | 21 +++++
.../internal/portable/BinaryEnumObjectImpl.java | 83 ++++++++++++++++++++
.../internal/portable/BinaryMetadata.java | 16 +++-
.../internal/portable/BinaryObjectEx.java | 5 ++
.../internal/portable/BinaryTypeImpl.java | 5 ++
.../portable/PortableClassDescriptor.java | 9 ++-
.../internal/portable/PortableContext.java | 24 ++++--
.../ignite/internal/portable/PortableUtils.java | 10 ++-
.../builder/BinaryObjectBuilderImpl.java | 2 +-
.../portable/CacheObjectBinaryProcessor.java | 3 +-
.../CacheObjectBinaryProcessorImpl.java | 6 +-
.../platform/PlatformContextImpl.java | 52 ++++++++++--
15 files changed, 240 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java b/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
index 5eb2670..af2c0ba 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
@@ -354,4 +354,13 @@ public interface IgniteBinary {
* @throws org.apache.ignite.binary.BinaryObjectException In case of error.
*/
public Collection<BinaryType> metadata() throws BinaryObjectException;
+
+ /**
+ * Create enum object.
+ *
+ * @param typeName Type name.
+ * @param ordinal Ordinal.
+ * @return Enum object.
+ */
+ public BinaryObject buildEnum(String typeName, int ordinal);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/binary/BinaryObject.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryObject.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryObject.java
index 2691c7b..0b2ee35 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryObject.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryObject.java
@@ -146,4 +146,12 @@ public interface BinaryObject extends Serializable, Cloneable {
* @return Copy of this binary object.
*/
public BinaryObject clone() throws CloneNotSupportedException;
+
+ /**
+ * Get ordinal for this enum object. Use {@link BinaryType#isEnum()} to check if object is of enum type.
+ *
+ * @return Ordinal.
+ * @throws BinaryObjectException If object is not enum.
+ */
+ public int enumOrdinal() throws BinaryObjectException;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/binary/BinaryType.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryType.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryType.java
index 52bb212..d50b763 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryType.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryType.java
@@ -65,4 +65,11 @@ public interface BinaryType {
* @return Affinity key field name.
*/
public String affinityKeyFieldName();
+
+ /**
+ * Check whether type represents enum or not.
+ *
+ * @return {@code True} if type is enum.
+ */
+ public boolean isEnum();
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/binary/BinaryTypeConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryTypeConfiguration.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryTypeConfiguration.java
index d216866..a694eaf 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryTypeConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryTypeConfiguration.java
@@ -38,6 +38,9 @@ public class BinaryTypeConfiguration {
/** Serializer. */
private BinarySerializer serializer;
+ /** Enum flag. */
+ private boolean isEnum;
+
/**
*/
public BinaryTypeConfiguration() {
@@ -105,6 +108,24 @@ public class BinaryTypeConfiguration {
this.serializer = serializer;
}
+ /**
+ * Gets whether this is enum type.
+ *
+ * @return {@code True} if enum.
+ */
+ public boolean isEnum() {
+ return isEnum;
+ }
+
+ /**
+ * Sets whether this is enum type.
+ *
+ * @param isEnum {@code True} if enum.
+ */
+ public void setEnum(boolean isEnum) {
+ this.isEnum = isEnum;
+ }
+
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(BinaryTypeConfiguration.class, this, super.toString());
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
new file mode 100644
index 0000000..ddbb8d6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
@@ -0,0 +1,83 @@
+package org.apache.ignite.internal.portable;
+
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.binary.BinaryType;
+
+import java.io.Externalizable;
+
+/**
+ * Created by vozerov on 11/24/2015.
+ */
+public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
+ /** Context. */
+ private PortableContext ctx;
+
+ /** Type ID. */
+ private int typeId;
+
+ /** Ordinal. */
+ private int ord;
+
+ /**
+ * {@link Externalizable} support.
+ */
+ public BinaryEnumObjectImpl() {
+ // No-op.
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param ctx Context.
+ * @param typeId Type ID.
+ * @param ord Ordinal.
+ */
+ public BinaryEnumObjectImpl(PortableContext ctx, int typeId, int ord) {
+ assert ctx != null;
+ assert typeId != 0;
+
+ this.ctx = ctx;
+ this.typeId = typeId;
+ this.ord = ord;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int typeId() {
+ return typeId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public BinaryType type() throws BinaryObjectException {
+ return ctx.metadata(typeId);
+ }
+
+ /** {@inheritDoc} */
+ @Override public <F> F field(String fieldName) throws BinaryObjectException {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean hasField(String fieldName) {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T deserialize() throws BinaryObjectException {
+ Class cls = ctx.descriptorForTypeId(true, typeId, null).describedClass();
+
+ return BinaryEnumCache.get(cls, ord);
+ }
+
+ /** {@inheritDoc} */
+ @Override public BinaryObject clone() throws CloneNotSupportedException {
+ return (BinaryObject)super.clone();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int enumOrdinal() throws BinaryObjectException {
+ return ord;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryMetadata.java
index a464d6e..8ba2e23 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryMetadata.java
@@ -52,6 +52,9 @@ public class BinaryMetadata implements Externalizable {
/** Schemas associated with type. */
private Collection<PortableSchema> schemas;
+ /** Whether this is enum type. */
+ private boolean isEnum;
+
/**
* For {@link Externalizable}.
*/
@@ -67,9 +70,10 @@ public class BinaryMetadata implements Externalizable {
* @param fields Fields map.
* @param affKeyFieldName Affinity key field name.
* @param schemas Schemas.
+ * @param isEnum Enum flag.
*/
public BinaryMetadata(int typeId, String typeName, @Nullable Map<String, Integer> fields,
- @Nullable String affKeyFieldName, @Nullable Collection<PortableSchema> schemas) {
+ @Nullable String affKeyFieldName, @Nullable Collection<PortableSchema> schemas, boolean isEnum) {
assert typeName != null;
this.typeId = typeId;
@@ -77,6 +81,7 @@ public class BinaryMetadata implements Externalizable {
this.fields = fields;
this.affKeyFieldName = affKeyFieldName;
this.schemas = schemas;
+ this.isEnum = isEnum;
}
/**
@@ -132,6 +137,13 @@ public class BinaryMetadata implements Externalizable {
}
/**
+ * @return {@code True} if this is enum type.
+ */
+ public boolean isEnum() {
+ return isEnum;
+ }
+
+ /**
* Wrap metadata into binary type.
*
* @param ctx Portable context.
@@ -148,6 +160,7 @@ public class BinaryMetadata implements Externalizable {
U.writeMap(out, fields);
U.writeString(out, affKeyFieldName);
U.writeCollection(out, schemas);
+ out.writeBoolean(isEnum);
}
/** {@inheritDoc} */
@@ -157,6 +170,7 @@ public class BinaryMetadata implements Externalizable {
fields = U.readMap(in);
affKeyFieldName = U.readString(in);
schemas = U.readCollection(in);
+ isEnum = in.readBoolean();
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryObjectEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryObjectEx.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryObjectEx.java
index 597fad5..7f5d38c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryObjectEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryObjectEx.java
@@ -101,6 +101,11 @@ public abstract class BinaryObjectEx implements BinaryObject {
}
/** {@inheritDoc} */
+ @Override public int enumOrdinal() throws BinaryObjectException {
+ throw new BinaryObjectException("Object is not enum.");
+ }
+
+ /** {@inheritDoc} */
public boolean equals(Object other) {
if (other == this)
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryTypeImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryTypeImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryTypeImpl.java
index 2630a40..9a45fb7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryTypeImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryTypeImpl.java
@@ -68,6 +68,11 @@ public class BinaryTypeImpl implements BinaryType {
}
/** {@inheritDoc} */
+ @Override public boolean isEnum() {
+ return meta.isEnum();
+ }
+
+ /** {@inheritDoc} */
public PortableContext context() {
return ctx;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
index 78d4bc5..a206b8b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
@@ -286,6 +286,13 @@ public class PortableClassDescriptor {
}
/**
+ * @return {@code True} if enum.
+ */
+ boolean isEnum() {
+ return mode == BinaryWriteMode.ENUM;
+ }
+
+ /**
* @return Described class.
*/
Class<?> describedClass() {
@@ -576,7 +583,7 @@ public class PortableClassDescriptor {
PortableSchema newSchema = collector.schema();
BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(),
- affKeyFieldName, Collections.singleton(newSchema));
+ affKeyFieldName, Collections.singleton(newSchema), false);
ctx.updateMetadata(typeId, meta);
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
index 01bc9d8..1b9680e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
@@ -290,16 +290,16 @@ public class PortableContext implements Externalizable {
for (String clsName0 : classesInPackage(pkgName))
descs.add(clsName0, idMapper, serializer, affFields.get(clsName0),
- true);
+ typeCfg.isEnum(), true);
}
else
descs.add(clsName, idMapper, serializer, affFields.get(clsName),
- false);
+ typeCfg.isEnum(), false);
}
}
for (TypeDescriptor desc : descs.descriptors()) {
- registerUserType(desc.clsName, desc.idMapper, desc.serializer, desc.affKeyFieldName);
+ registerUserType(desc.clsName, desc.idMapper, desc.serializer, desc.affKeyFieldName, desc.isEnum);
}
}
@@ -519,7 +519,7 @@ public class PortableContext implements Externalizable {
Collection<PortableSchema> schemas = desc.schema() != null ? Collections.singleton(desc.schema()) : null;
- metaHnd.addMeta(typeId, new BinaryMetadata(typeId, typeName, desc.fieldsMeta(), null, schemas).wrap(this));
+ metaHnd.addMeta(typeId, new BinaryMetadata(typeId, typeName, desc.fieldsMeta(), null, schemas, desc.isEnum()).wrap(this));
// perform put() instead of putIfAbsent() because "registered" flag might have been changed or class loader
// might have reloaded described class.
@@ -670,13 +670,15 @@ public class PortableContext implements Externalizable {
* @param idMapper ID mapper.
* @param serializer Serializer.
* @param affKeyFieldName Affinity key field name.
+ * @param isEnum If enum.
* @throws org.apache.ignite.binary.BinaryObjectException In case of error.
*/
@SuppressWarnings("ErrorNotRethrown")
public void registerUserType(String clsName,
BinaryIdMapper idMapper,
@Nullable BinarySerializer serializer,
- @Nullable String affKeyFieldName)
+ @Nullable String affKeyFieldName,
+ boolean isEnum)
throws BinaryObjectException {
assert idMapper != null;
@@ -734,7 +736,7 @@ public class PortableContext implements Externalizable {
descByCls.put(cls, desc);
}
- metaHnd.addMeta(id, new BinaryMetadata(id, typeName, fieldsMeta, affKeyFieldName, schemas).wrap(this));
+ metaHnd.addMeta(id, new BinaryMetadata(id, typeName, fieldsMeta, affKeyFieldName, schemas, isEnum).wrap(this));
}
/**
@@ -905,6 +907,7 @@ public class PortableContext implements Externalizable {
* @param idMapper ID mapper.
* @param serializer Serializer.
* @param affKeyFieldName Affinity key field name.
+ * @param isEnum Enum flag.
* @param canOverride Whether this descriptor can be override.
* @throws org.apache.ignite.binary.BinaryObjectException If failed.
*/
@@ -912,12 +915,14 @@ public class PortableContext implements Externalizable {
BinaryIdMapper idMapper,
BinarySerializer serializer,
String affKeyFieldName,
+ boolean isEnum,
boolean canOverride)
throws BinaryObjectException {
TypeDescriptor desc = new TypeDescriptor(clsName,
idMapper,
serializer,
affKeyFieldName,
+ isEnum,
canOverride);
TypeDescriptor oldDesc = descs.get(clsName);
@@ -954,6 +959,9 @@ public class PortableContext implements Externalizable {
/** Affinity key field name. */
private String affKeyFieldName;
+ /** Enum flag. */
+ private boolean isEnum;
+
/** Whether this descriptor can be override. */
private boolean canOverride;
@@ -964,14 +972,16 @@ public class PortableContext implements Externalizable {
* @param idMapper ID mapper.
* @param serializer Serializer.
* @param affKeyFieldName Affinity key field name.
+ * @param isEnum Enum type.
* @param canOverride Whether this descriptor can be override.
*/
private TypeDescriptor(String clsName, BinaryIdMapper idMapper, BinarySerializer serializer,
- String affKeyFieldName, boolean canOverride) {
+ String affKeyFieldName, boolean isEnum, boolean canOverride) {
this.clsName = clsName;
this.idMapper = idMapper;
this.serializer = serializer;
this.affKeyFieldName = affKeyFieldName;
+ this.isEnum = isEnum;
this.canOverride = canOverride;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index 5c798b8..e186760 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -875,6 +875,14 @@ public class PortableUtils {
);
}
+ // Check enum flag.
+ if (oldMeta.isEnum() != newMeta.isEnum()) {
+ throw new BinaryObjectException(
+ "Binary type has different enum flags [" + "typeName=" + newMeta.typeName() +
+ ", isEnum1=" + oldMeta.isEnum() + ", isEnum2=" + newMeta.isEnum() + ']'
+ );
+ }
+
// Check and merge fields.
boolean changed = false;
@@ -906,7 +914,7 @@ public class PortableUtils {
// Return either old meta if no changes detected, or new merged meta.
return changed ? new BinaryMetadata(oldMeta.typeId(), oldMeta.typeName(), mergedFields,
- oldMeta.affinityKeyFieldName(), mergedSchemas) : oldMeta;
+ oldMeta.affinityKeyFieldName(), mergedSchemas, oldMeta.isEnum()) : oldMeta;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
index b2fb7d8..1589c0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
@@ -378,7 +378,7 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder {
PortableSchema curSchema = writer.currentSchema();
ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta,
- ctx.affinityKeyFieldName(typeId), Collections.singleton(curSchema)));
+ ctx.affinityKeyFieldName(typeId), Collections.singleton(curSchema), false));
schemaReg.addSchema(curSchema.schemaId(), curSchema);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
index e4db77c..82d87b9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
@@ -57,10 +57,11 @@ public interface CacheObjectBinaryProcessor extends IgniteCacheObjectProcessor {
* @param typeName Type name.
* @param affKeyFieldName Affinity key field name.
* @param fieldTypeIds Fields map.
+ * @param isEnum Enum flag.
* @throws IgniteException In case of error.
*/
public void updateMetadata(int typeId, String typeName, @Nullable String affKeyFieldName,
- Map<String, Integer> fieldTypeIds) throws IgniteException;
+ Map<String, Integer> fieldTypeIds, boolean isEnum) throws IgniteException;
/**
* @param typeId Type ID.
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
index 05e9263..b5ad1f0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
@@ -446,8 +446,10 @@ public class CacheObjectBinaryProcessorImpl extends IgniteCacheObjectProcessorIm
/** {@inheritDoc} */
@Override public void updateMetadata(int typeId, String typeName, @Nullable String affKeyFieldName,
- Map<String, Integer> fieldTypeIds) throws BinaryObjectException {
- portableCtx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldTypeIds, affKeyFieldName, null));
+ Map<String, Integer> fieldTypeIds, boolean isEnum) throws BinaryObjectException {
+ BinaryMetadata meta = new BinaryMetadata(typeId, typeName, fieldTypeIds, affKeyFieldName, null, isEnum);
+
+ portableCtx.updateMetadata(typeId, meta);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/fe16b193/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
index 9a7f0df..339da58 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
@@ -70,6 +70,7 @@ import org.apache.ignite.internal.processors.platform.utils.PlatformReaderClosur
import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.T4;
+import org.apache.ignite.internal.util.typedef.T5;
import org.apache.ignite.lang.IgniteBiTuple;
import org.jetbrains.annotations.Nullable;
@@ -341,9 +342,9 @@ public class PlatformContextImpl implements PlatformContext {
/** {@inheritDoc} */
@SuppressWarnings("ConstantConditions")
@Override public void processMetadata(BinaryRawReaderEx reader) {
- Collection<T4<Integer, String, String, Map<String, Integer>>> metas = PlatformUtils.readCollection(reader,
- new PlatformReaderClosure<T4<Integer, String, String, Map<String, Integer>>>() {
- @Override public T4<Integer, String, String, Map<String, Integer>> read(BinaryRawReaderEx reader) {
+ Collection<T5<Integer, String, String, Map<String, Integer>, Boolean>> metas = PlatformUtils.readCollection(reader,
+ new PlatformReaderClosure<T5<Integer, String, String, Map<String, Integer>, Boolean>>() {
+ @Override public T5<Integer, String, String, Map<String, Integer>, Boolean> read(BinaryRawReaderEx reader) {
int typeId = reader.readInt();
String typeName = reader.readString();
String affKey = reader.readString();
@@ -355,13 +356,52 @@ public class PlatformContextImpl implements PlatformContext {
}
});
- return new T4<>(typeId, typeName, affKey, fields);
+ boolean isEnum = reader.readBoolean();
+
+ return new T5<>(typeId, typeName, affKey, fields, isEnum);
}
}
);
- for (T4<Integer, String, String, Map<String, Integer>> meta : metas)
- cacheObjProc.updateMetadata(meta.get1(), meta.get2(), meta.get3(), meta.get4());
+ for (T5<Integer, String, String, Map<String, Integer>, Boolean> meta : metas)
+ cacheObjProc.updateMetadata(meta.get1(), meta.get2(), meta.get3(), meta.get4(), meta.get5());
+ }
+
+ /**
+ * Metadata holder.
+ */
+ private static class Metadata {
+ /** Type ID. */
+ private final int typeId;
+
+ /** Type name. */
+ private final String typeName;
+
+ /** Affinity key. */
+ private final String affKey;
+
+ /** Fields map. */
+ private final Map<String, Integer> fields;
+
+ /** Enum flag. */
+ private final boolean isEnum;
+
+ /**
+ * Constructor.
+ *
+ * @param typeId
+ * @param typeName
+ * @param affKey
+ * @param fields
+ * @param isEnum
+ */
+ public Metadata(int typeId, String typeName, String affKey, Map<String, Integer> fields, boolean isEnum) {
+ this.typeId = typeId;
+ this.typeName = typeName;
+ this.affKey = affKey;
+ this.fields = fields;
+ this.isEnum = isEnum;
+ }
}
/** {@inheritDoc} */
[3/3] ignite git commit: IGNITE-1956: Minors.
Posted by vo...@apache.org.
IGNITE-1956: Minors.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/da8257b9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/da8257b9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/da8257b9
Branch: refs/heads/ignite-1956
Commit: da8257b971a8f08c22e385aeac18ea3ef243f495
Parents: 701758d
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Nov 24 14:35:55 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Nov 24 14:35:55 2015 +0300
----------------------------------------------------------------------
.../ignite/internal/portable/PortableUtils.java | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/da8257b9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index dd0790e..958c5da 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -1325,15 +1325,15 @@ public class PortableUtils {
* @param in Input stream.
* @return Plain type.
*/
- private static PlainType doReadPlainType(PortableInputStream in) {
+ private static EnumType doReadEnumType(PortableInputStream in) {
int typeId = in.readInt();
if (typeId != UNREGISTERED_TYPE_ID)
- return new PlainType(typeId, null);
+ return new EnumType(typeId, null);
else {
String clsName = doReadClassName(in);
- return new PlainType(UNREGISTERED_TYPE_ID, clsName);
+ return new EnumType(UNREGISTERED_TYPE_ID, clsName);
}
}
@@ -1422,7 +1422,7 @@ public class PortableUtils {
* @return Enum.
*/
private static BinaryEnumObjectImpl doReadPortableEnum(PortableInputStream in, PortableContext ctx,
- PlainType type) {
+ EnumType type) {
return new BinaryEnumObjectImpl(ctx, type.typeId, type.clsName, in.readInt());
}
@@ -1434,7 +1434,7 @@ public class PortableUtils {
* @param type Plain type.
* @return Enum array.
*/
- private static Object[] doReadPortableEnumArray(PortableInputStream in, PortableContext ctx, PlainType type) {
+ private static Object[] doReadPortableEnumArray(PortableInputStream in, PortableContext ctx, EnumType type) {
int len = in.readInt();
Object[] arr = (Object[]) Array.newInstance(BinaryObject.class, len);
@@ -1692,10 +1692,10 @@ public class PortableUtils {
return doReadPortableObject(in, ctx);
case ENUM:
- return doReadPortableEnum(in, ctx, doReadPlainType(in));
+ return doReadPortableEnum(in, ctx, doReadEnumType(in));
case ENUM_ARR:
- return doReadPortableEnumArray(in, ctx, doReadPlainType(in));
+ return doReadPortableEnumArray(in, ctx, doReadEnumType(in));
case CLASS:
return doReadClass(in, ctx, ldr);
@@ -1943,9 +1943,9 @@ public class PortableUtils {
}
/**
- * Plain type.
+ * Enum type.
*/
- private static class PlainType {
+ private static class EnumType {
/** Type ID. */
private final int typeId;
@@ -1958,7 +1958,7 @@ public class PortableUtils {
* @param typeId Type ID.
* @param clsName Class name.
*/
- public PlainType(int typeId, @Nullable String clsName) {
+ public EnumType(int typeId, @Nullable String clsName) {
assert typeId != UNREGISTERED_TYPE_ID && clsName == null ||
typeId == UNREGISTERED_TYPE_ID && clsName != null;
[2/3] ignite git commit: IGNITE-1956: WIP.
Posted by vo...@apache.org.
IGNITE-1956: WIP.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/701758d7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/701758d7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/701758d7
Branch: refs/heads/ignite-1956
Commit: 701758d7b958e3c9529c072eeb43f1f3643a73c3
Parents: fe16b19
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Nov 24 13:46:16 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Nov 24 13:46:16 2015 +0300
----------------------------------------------------------------------
.../java/org/apache/ignite/IgniteBinary.java | 4 +-
.../internal/portable/BinaryEnumObjectImpl.java | 109 ++++++++++++++-
.../internal/portable/BinaryWriteMode.java | 3 +
.../internal/portable/BinaryWriterExImpl.java | 17 +++
.../portable/PortableClassDescriptor.java | 13 +-
.../ignite/internal/portable/PortableUtils.java | 134 ++++++++++++++++++-
.../portable/CacheObjectBinaryProcessor.java | 8 ++
.../CacheObjectBinaryProcessorImpl.java | 12 ++
.../cache/portable/IgniteBinaryImpl.java | 12 ++
.../processors/cacheobject/NoOpBinary.java | 5 +
10 files changed, 302 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java b/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
index af2c0ba..e7d77e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteBinary.java
@@ -359,8 +359,8 @@ public interface IgniteBinary {
* Create enum object.
*
* @param typeName Type name.
- * @param ordinal Ordinal.
+ * @param ord Ordinal.
* @return Enum object.
*/
- public BinaryObject buildEnum(String typeName, int ordinal);
+ public BinaryObject buildEnum(String typeName, int ord);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
index ddbb8d6..e97ef93 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryEnumObjectImpl.java
@@ -1,13 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.ignite.internal.portable;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectException;
import org.apache.ignite.binary.BinaryType;
+import org.apache.ignite.internal.util.typedef.internal.SB;
+import org.jetbrains.annotations.Nullable;
import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
/**
- * Created by vozerov on 11/24/2015.
+ * Binary enum object.
*/
public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
/** Context. */
@@ -16,6 +38,9 @@ public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
/** Type ID. */
private int typeId;
+ /** Raw data. */
+ private String clsName;
+
/** Ordinal. */
private int ord;
@@ -31,17 +56,25 @@ public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
*
* @param ctx Context.
* @param typeId Type ID.
+ * @param clsName Class name.
* @param ord Ordinal.
*/
- public BinaryEnumObjectImpl(PortableContext ctx, int typeId, int ord) {
+ public BinaryEnumObjectImpl(PortableContext ctx, int typeId, @Nullable String clsName, int ord) {
assert ctx != null;
- assert typeId != 0;
this.ctx = ctx;
this.typeId = typeId;
+ this.clsName = clsName;
this.ord = ord;
}
+ /**
+ * @return Class name.
+ */
+ @Nullable public String className() {
+ return clsName;
+ }
+
/** {@inheritDoc} */
@Override public int typeId() {
return typeId;
@@ -49,7 +82,7 @@ public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
/** {@inheritDoc} */
@Override public BinaryType type() throws BinaryObjectException {
- return ctx.metadata(typeId);
+ return ctx.metadata(typeId());
}
/** {@inheritDoc} */
@@ -63,8 +96,9 @@ public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
}
/** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
@Override public <T> T deserialize() throws BinaryObjectException {
- Class cls = ctx.descriptorForTypeId(true, typeId, null).describedClass();
+ Class cls = PortableUtils.resolveClass(ctx, typeId, clsName, null);
return BinaryEnumCache.get(cls, ord);
}
@@ -79,5 +113,70 @@ public class BinaryEnumObjectImpl implements BinaryObject, Externalizable {
return ord;
}
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ return 31 * typeId + ord;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (obj != null && (obj instanceof BinaryEnumObjectImpl)) {
+ BinaryEnumObjectImpl other = (BinaryEnumObjectImpl)obj;
+
+ return typeId == other.typeId && ord == other.ord;
+ }
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // 1. Try deserializing the object.
+ try {
+ Object val = deserialize();
+
+ return new SB().a(val).toString();
+ }
+ catch (Exception e) {
+ // No-op.
+ }
+
+ // 2. Try getting meta.
+ BinaryType type;
+
+ try {
+ type = type();
+ }
+ catch (Exception e) {
+ type = null;
+ }
+
+ if (type != null) {
+ return type.typeName() + "[ordinal=" + ord + ']';
+ }
+ else {
+ if (typeId == GridPortableMarshaller.UNREGISTERED_TYPE_ID)
+ return "BinaryEnum[clsName=" + clsName + ", ordinal=" + ord + ']';
+ else
+ return "BinaryEnum[typeId=" + typeId + ", ordinal=" + ord + ']';
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(ctx);
+
+ out.writeInt(typeId);
+ out.writeObject(clsName);
+ out.writeInt(ord);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ ctx = (PortableContext)in.readObject();
+
+ typeId = in.readInt();
+ clsName = (String)in.readObject();
+ ord = in.readInt();
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriteMode.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriteMode.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriteMode.java
index a26b741..bd73ad0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriteMode.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriteMode.java
@@ -141,6 +141,9 @@ public enum BinaryWriteMode {
/** */
ENUM(GridPortableMarshaller.ENUM),
+ /** Portable enum. */
+ PORTABLE_ENUM(GridPortableMarshaller.ENUM),
+
/** */
ENUM_ARR(GridPortableMarshaller.ENUM_ARR),
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
index ec47f57..be10849 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
@@ -803,6 +803,23 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje
}
/**
+ * @param val Value.
+ */
+ void doWritePortableEnum(BinaryEnumObjectImpl val) {
+ assert val != null;
+
+ int typeId = val.typeId();
+
+ out.unsafeEnsure(1 + 4);
+
+ out.unsafeWriteByte(ENUM);
+ out.unsafeWriteInt(typeId);
+
+ if (typeId == UNREGISTERED_TYPE_ID)
+ doWriteString(val.className());
+ }
+
+ /**
* @param val Array.
*/
void doWriteEnumArray(@Nullable Object[] val) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
index a206b8b..2e9c57e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
@@ -161,8 +161,12 @@ public class PortableClassDescriptor {
if (excluded)
mode = BinaryWriteMode.EXCLUSION;
- else
- mode = serializer != null ? BinaryWriteMode.PORTABLE : PortableUtils.mode(cls);
+ else {
+ if (cls == BinaryEnumObjectImpl.class)
+ mode = BinaryWriteMode.PORTABLE_ENUM;
+ else
+ mode = serializer != null ? BinaryWriteMode.PORTABLE : PortableUtils.mode(cls);
+ }
switch (mode) {
case P_BYTE:
@@ -541,6 +545,11 @@ public class PortableClassDescriptor {
break;
+ case PORTABLE_ENUM:
+ writer.doWritePortableEnum((BinaryEnumObjectImpl)obj);
+
+ break;
+
case ENUM_ARR:
writer.doWriteEnumArray((Object[])obj);
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index e186760..dd0790e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -1320,6 +1320,37 @@ public class PortableUtils {
}
/**
+ * Read plain type.
+ *
+ * @param in Input stream.
+ * @return Plain type.
+ */
+ private static PlainType doReadPlainType(PortableInputStream in) {
+ int typeId = in.readInt();
+
+ if (typeId != UNREGISTERED_TYPE_ID)
+ return new PlainType(typeId, null);
+ else {
+ String clsName = doReadClassName(in);
+
+ return new PlainType(UNREGISTERED_TYPE_ID, clsName);
+ }
+ }
+
+ /**
+ * @param in Input stream.
+ * @return Class name.
+ */
+ private static String doReadClassName(PortableInputStream in) {
+ byte flag = in.readByte();
+
+ if (flag != STRING)
+ throw new BinaryObjectException("Failed to read class name [position=" + (in.position() - 1) + ']');
+
+ return doReadString(in);
+ }
+
+ /**
* @param typeId Type id.
* @return Value.
*/
@@ -1333,13 +1364,41 @@ public class PortableUtils {
if (typeId != UNREGISTERED_TYPE_ID)
cls = ctx.descriptorForTypeId(true, typeId, ldr).describedClass();
else {
- byte flag = in.readByte();
+ String clsName = doReadClassName(in);
- if (flag != STRING)
- throw new BinaryObjectException("No class definition for typeId: " + typeId);
+ try {
+ cls = U.forName(clsName, ldr);
+ }
+ catch (ClassNotFoundException e) {
+ throw new BinaryInvalidTypeException("Failed to load the class: " + clsName, e);
+ }
- String clsName = doReadString(in);
+ // forces registering of class by type id, at least locally
+ ctx.descriptorForClass(cls);
+ }
+ return cls;
+ }
+
+ /**
+ * Resolve the class.
+ *
+ * @param ctx Portable context.
+ * @param typeId Type ID.
+ * @param clsName Class name.
+ * @param ldr Class loaded.
+ * @return Resovled class.
+ */
+ public static Class resolveClass(PortableContext ctx, int typeId, @Nullable String clsName,
+ @Nullable ClassLoader ldr) {
+ Class cls;
+
+ if (typeId == OBJECT_TYPE_ID)
+ return Object.class;
+
+ if (typeId != UNREGISTERED_TYPE_ID)
+ cls = ctx.descriptorForTypeId(true, typeId, ldr).describedClass();
+ else {
try {
cls = U.forName(clsName, ldr);
}
@@ -1355,6 +1414,44 @@ public class PortableUtils {
}
/**
+ * Read portable enum.
+ *
+ * @param in Input stream.
+ * @param ctx Portable context.
+ * @param type Plain type.
+ * @return Enum.
+ */
+ private static BinaryEnumObjectImpl doReadPortableEnum(PortableInputStream in, PortableContext ctx,
+ PlainType type) {
+ return new BinaryEnumObjectImpl(ctx, type.typeId, type.clsName, in.readInt());
+ }
+
+ /**
+ * Read portable enum array.
+ *
+ * @param in Input stream.
+ * @param ctx Portable context.
+ * @param type Plain type.
+ * @return Enum array.
+ */
+ private static Object[] doReadPortableEnumArray(PortableInputStream in, PortableContext ctx, PlainType type) {
+ int len = in.readInt();
+
+ Object[] arr = (Object[]) Array.newInstance(BinaryObject.class, len);
+
+ for (int i = 0; i < len; i++) {
+ byte flag = in.readByte();
+
+ if (flag == NULL)
+ arr[i] = null;
+ else
+ arr[i] = doReadPortableEnum(in, ctx, type);
+ }
+
+ return arr;
+ }
+
+ /**
* Having target class in place we simply read ordinal and create final representation.
*
* @param cls Enum class.
@@ -1595,10 +1692,10 @@ public class PortableUtils {
return doReadPortableObject(in, ctx);
case ENUM:
- return doReadEnum(in, doReadClass(in, ctx, ldr));
+ return doReadPortableEnum(in, ctx, doReadPlainType(in));
case ENUM_ARR:
- return doReadEnumArray(in, ctx, ldr, doReadClass(in, ctx, ldr));
+ return doReadPortableEnumArray(in, ctx, doReadPlainType(in));
case CLASS:
return doReadClass(in, ctx, ldr);
@@ -1844,4 +1941,29 @@ public class PortableUtils {
public static int positionForHandle(PortableInputStream in) {
return in.position() - 1;
}
+
+ /**
+ * Plain type.
+ */
+ private static class PlainType {
+ /** Type ID. */
+ private final int typeId;
+
+ /** Class name. */
+ private final String clsName;
+
+ /**
+ * Constructor.
+ *
+ * @param typeId Type ID.
+ * @param clsName Class name.
+ */
+ public PlainType(int typeId, @Nullable String clsName) {
+ assert typeId != UNREGISTERED_TYPE_ID && clsName == null ||
+ typeId == UNREGISTERED_TYPE_ID && clsName != null;
+
+ this.typeId = typeId;
+ this.clsName = clsName;
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
index 82d87b9..7ef4b91 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessor.java
@@ -84,6 +84,14 @@ public interface CacheObjectBinaryProcessor extends IgniteCacheObjectProcessor {
public Collection<BinaryType> metadata() throws IgniteException;
/**
+ * @param typeName Type name.
+ * @param ord ordinal.
+ * @return Enum object.
+ * @throws IgniteException If failed.
+ */
+ public BinaryObject buildEnum(String typeName, int ord) throws IgniteException;
+
+ /**
* @return Portables interface.
* @throws IgniteException If failed.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
index b5ad1f0..4bff81a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectBinaryProcessorImpl.java
@@ -30,6 +30,7 @@ import org.apache.ignite.cluster.ClusterTopologyException;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
+import org.apache.ignite.internal.portable.BinaryEnumObjectImpl;
import org.apache.ignite.internal.portable.BinaryMetadata;
import org.apache.ignite.internal.portable.BinaryMetadataHandler;
import org.apache.ignite.internal.portable.BinaryObjectImpl;
@@ -536,6 +537,17 @@ public class CacheObjectBinaryProcessorImpl extends IgniteCacheObjectProcessorIm
}
/** {@inheritDoc} */
+ @Override public BinaryObject buildEnum(String typeName, int ord) throws IgniteException {
+ typeName = PortableContext.typeName(typeName);
+
+ int typeId = portableCtx.typeId(typeName);
+
+ updateMetadata(typeId, typeName, null, null, true);
+
+ return new BinaryEnumObjectImpl(portableCtx, typeId, null, ord);
+ }
+
+ /** {@inheritDoc} */
@Override public IgniteBinary binary() throws IgniteException {
return portables;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/IgniteBinaryImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/IgniteBinaryImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/IgniteBinaryImpl.java
index 72f4d24..517362e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/IgniteBinaryImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/IgniteBinaryImpl.java
@@ -142,6 +142,18 @@ public class IgniteBinaryImpl implements IgniteBinary {
}
}
+ /** {@inheritDoc} */
+ @Override public BinaryObject buildEnum(String typeName, int ord) {
+ guard();
+
+ try {
+ return proc.buildEnum(typeName, ord);
+ }
+ finally {
+ unguard();
+ }
+ }
+
/**
* @return Portable processor.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/701758d7/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/NoOpBinary.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/NoOpBinary.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/NoOpBinary.java
index 5bbc194..c8a6448 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/NoOpBinary.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/NoOpBinary.java
@@ -69,6 +69,11 @@ public class NoOpBinary implements IgniteBinary {
}
/** {@inheritDoc} */
+ @Override public BinaryObject buildEnum(String typeName, int ord) {
+ throw unsupported();
+ }
+
+ /** {@inheritDoc} */
private BinaryObjectException unsupported() {
return new BinaryObjectException("Binary marshaller is not configured.");
}