Repository: ignite Updated Branches: refs/heads/ignite-1655 [created] c1952acbf
IGNITE-1655: Finished Java part. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/bf8ff944 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/bf8ff944 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/bf8ff944 Branch: refs/heads/ignite-1655 Commit: bf8ff94463bb52634915f0c9151409281d39a9c2 Parents: 7c1ef1a Author: vozerov-gridgain <[email protected]> Authored: Mon Oct 12 16:54:28 2015 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Mon Oct 12 16:54:28 2015 +0300 ---------------------------------------------------------------------- .../portable/GridPortableMarshaller.java | 6 + .../portable/PortableClassDescriptor.java | 69 +++++--- .../internal/portable/PortableContext.java | 59 +------ .../portable/PortableMetaDataCollector.java | 5 + .../internal/portable/PortableReaderExImpl.java | 156 +++++++++++++------ .../ignite/internal/portable/PortableUtils.java | 28 ++-- .../internal/portable/PortableWriterExImpl.java | 93 +++++++---- .../portable/builder/PortableBuilderReader.java | 52 +++++-- .../CacheObjectPortableProcessorImpl.java | 4 + .../marshaller/portable/PortableMarshaller.java | 22 --- .../ignite/portable/PortableRawReader.java | 6 + .../ignite/portable/PortableRawWriter.java | 6 + .../apache/ignite/portable/PortableReader.java | 7 + .../portable/PortableTypeConfiguration.java | 19 --- .../apache/ignite/portable/PortableWriter.java | 7 + .../GridPortableBuilderAdditionalSelfTest.java | 65 +++++++- .../portable/GridPortableBuilderSelfTest.java | 50 +++++- .../GridPortableMarshallerSelfTest.java | 47 +----- .../mutabletest/GridPortableTestClasses.java | 9 ++ 19 files changed, 458 insertions(+), 252 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/portable/GridPortableMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/GridPortableMarshaller.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/GridPortableMarshaller.java index c7a9e6f..d666285 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/GridPortableMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/GridPortableMarshaller.java @@ -132,6 +132,12 @@ public class GridPortableMarshaller { /** */ public static final byte CLASS = 32; + /** Timestamp. */ + public static final byte TIMESTAMP = 33; + + /** Timestamp array. */ + public static final byte TIMESTAMP_ARR = 34; + /** */ public static final byte NULL = (byte)101; http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/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 a2b4b74..6aaa174 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 @@ -88,9 +88,6 @@ public class PortableClassDescriptor { private final Method readResolveMtd; /** */ - private final boolean useTs; - - /** */ private final Map<String, String> fieldsMeta; /** */ @@ -113,7 +110,6 @@ public class PortableClassDescriptor { * @param typeName Type name. * @param idMapper ID mapper. * @param serializer Serializer. - * @param useTs Use timestamp flag. * @param metaDataEnabled Metadata enabled flag. * @param keepDeserialized Keep deserialized flag. * @param registered Whether typeId has been successfully registered by MarshallerContext or not. @@ -128,7 +124,6 @@ public class PortableClassDescriptor { String typeName, @Nullable PortableIdMapper idMapper, @Nullable PortableSerializer serializer, - boolean useTs, boolean metaDataEnabled, boolean keepDeserialized, boolean registered, @@ -143,7 +138,6 @@ public class PortableClassDescriptor { this.typeId = typeId; this.typeName = typeName; this.serializer = serializer; - this.useTs = useTs; this.keepDeserialized = keepDeserialized; this.registered = registered; @@ -169,6 +163,7 @@ public class PortableClassDescriptor { case STRING: case UUID: case DATE: + case TIMESTAMP: case BYTE_ARR: case SHORT_ARR: case INT_ARR: @@ -181,6 +176,7 @@ public class PortableClassDescriptor { case STRING_ARR: case UUID_ARR: case DATE_ARR: + case TIMESTAMP_ARR: case OBJ_ARR: case COL: case MAP: @@ -280,13 +276,6 @@ public class PortableClassDescriptor { } /** - * @return Use timestamp flag. - */ - boolean isUseTimestamp() { - return useTs; - } - - /** * @return Keep deserialized flag. */ boolean keepDeserialized() { @@ -405,10 +394,12 @@ public class PortableClassDescriptor { break; case DATE: - if (obj instanceof Timestamp) - writer.doWriteTimestamp((Timestamp)obj); - else - writer.doWriteDate((Date)obj); + writer.doWriteDate((Date)obj); + + break; + + case TIMESTAMP: + writer.doWriteTimestamp((Timestamp)obj); break; @@ -472,6 +463,11 @@ public class PortableClassDescriptor { break; + case TIMESTAMP_ARR: + writer.doWriteTimestampArray((Timestamp[]) obj); + + break; + case OBJ_ARR: writer.doWriteObjectArray((Object[])obj); @@ -766,8 +762,10 @@ public class PortableClassDescriptor { return Mode.STRING; else if (cls == UUID.class) return Mode.UUID; - else if (cls == Timestamp.class || cls == Date.class) + else if (cls == Date.class) return Mode.DATE; + else if (cls == Timestamp.class) + return Mode.TIMESTAMP; else if (cls == byte[].class) return Mode.BYTE_ARR; else if (cls == short[].class) @@ -792,6 +790,8 @@ public class PortableClassDescriptor { return Mode.UUID_ARR; else if (cls == Date[].class) return Mode.DATE_ARR; + else if (cls == Timestamp[].class) + return Mode.TIMESTAMP_ARR; else if (cls.isArray()) return cls.getComponentType().isEnum() ? Mode.ENUM_ARR : Mode.OBJ_ARR; else if (cls == PortableObjectImpl.class) @@ -926,10 +926,12 @@ public class PortableClassDescriptor { break; case DATE: - if (val instanceof Timestamp) - writer.writeTimestampField((Timestamp)val); - else - writer.writeDateField((Date)val); + writer.writeDateField((Date)val); + + break; + + case TIMESTAMP: + writer.writeTimestampField((Timestamp)val); break; @@ -993,6 +995,11 @@ public class PortableClassDescriptor { break; + case TIMESTAMP_ARR: + writer.writeTimestampArrayField((Timestamp[]) val); + + break; + case OBJ_ARR: writer.writeObjectArrayField((Object[])val); @@ -1110,7 +1117,12 @@ public class PortableClassDescriptor { break; case DATE: - val = field.getType() == Timestamp.class ? reader.readTimestamp(id) : reader.readDate(id); + val = reader.readDate(id); + + break; + + case TIMESTAMP: + val = reader.readTimestamp(id); break; @@ -1174,6 +1186,11 @@ public class PortableClassDescriptor { break; + case TIMESTAMP_ARR: + val = reader.readTimestampArray(id); + + break; + case OBJ_ARR: val = reader.readObjectArray(id); @@ -1274,6 +1291,9 @@ public class PortableClassDescriptor { DATE("Date"), /** */ + TIMESTAMP("Timestamp"), + + /** */ BYTE_ARR("byte[]"), /** */ @@ -1310,6 +1330,9 @@ public class PortableClassDescriptor { DATE_ARR("Date[]"), /** */ + TIMESTAMP_ARR("Timestamp[]"), + + /** */ OBJ_ARR("Object[]"), /** */ http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/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 6f6a407..268c14b 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 @@ -130,9 +130,6 @@ public class PortableContext implements Externalizable { private Map<Integer, Boolean> metaEnabled = new HashMap<>(0); /** */ - private Set<Integer> usingTs = new HashSet<>(); - - /** */ private PortableMetaDataHandler metaHnd; /** */ @@ -148,9 +145,6 @@ public class PortableContext implements Externalizable { private boolean convertStrings; /** */ - private boolean useTs; - - /** */ private boolean metaDataEnabled; /** */ @@ -200,9 +194,9 @@ public class PortableContext implements Externalizable { registerPredefinedType(String.class, GridPortableMarshaller.STRING); registerPredefinedType(BigDecimal.class, GridPortableMarshaller.DECIMAL); registerPredefinedType(Date.class, GridPortableMarshaller.DATE); + registerPredefinedType(Timestamp.class, GridPortableMarshaller.TIMESTAMP); registerPredefinedType(UUID.class, GridPortableMarshaller.UUID); // TODO: How to handle timestamp? It has the same ID in .Net. - registerPredefinedType(Timestamp.class, GridPortableMarshaller.DATE); registerPredefinedType(byte[].class, GridPortableMarshaller.BYTE_ARR); registerPredefinedType(short[].class, GridPortableMarshaller.SHORT_ARR); @@ -216,6 +210,7 @@ public class PortableContext implements Externalizable { registerPredefinedType(String[].class, GridPortableMarshaller.STRING_ARR); registerPredefinedType(UUID[].class, GridPortableMarshaller.UUID_ARR); registerPredefinedType(Date[].class, GridPortableMarshaller.DATE_ARR); + registerPredefinedType(Timestamp[].class, GridPortableMarshaller.TIMESTAMP_ARR); registerPredefinedType(Object[].class, GridPortableMarshaller.OBJ_ARR); registerPredefinedType(ArrayList.class, 0); @@ -250,7 +245,6 @@ public class PortableContext implements Externalizable { return; convertStrings = marsh.isConvertStringToBytes(); - useTs = marsh.isUseTimestamp(); metaDataEnabled = marsh.isMetaDataEnabled(); keepDeserialized = marsh.isKeepDeserialized(); @@ -263,7 +257,6 @@ public class PortableContext implements Externalizable { configure( marsh.getIdMapper(), marsh.getSerializer(), - marsh.isUseTimestamp(), marsh.isMetaDataEnabled(), marsh.isKeepDeserialized(), marsh.getClassNames(), @@ -274,7 +267,6 @@ public class PortableContext implements Externalizable { /** * @param globalIdMapper ID mapper. * @param globalSerializer Serializer. - * @param globalUseTs Use timestamp flag. * @param globalMetaDataEnabled Metadata enabled flag. * @param globalKeepDeserialized Keep deserialized flag. * @param clsNames Class names. @@ -284,7 +276,6 @@ public class PortableContext implements Externalizable { private void configure( PortableIdMapper globalIdMapper, PortableSerializer globalSerializer, - boolean globalUseTs, boolean globalMetaDataEnabled, boolean globalKeepDeserialized, Collection<String> clsNames, @@ -300,11 +291,11 @@ public class PortableContext implements Externalizable { String pkgName = clsName.substring(0, clsName.length() - 2); for (String clsName0 : classesInPackage(pkgName)) - descs.add(clsName0, idMapper, null, null, globalUseTs, globalMetaDataEnabled, + descs.add(clsName0, idMapper, null, null, globalMetaDataEnabled, globalKeepDeserialized, true); } else // Regular single class - descs.add(clsName, idMapper, null, null, globalUseTs, globalMetaDataEnabled, + descs.add(clsName, idMapper, null, null, globalMetaDataEnabled, globalKeepDeserialized, true); } } @@ -328,7 +319,6 @@ public class PortableContext implements Externalizable { if (typeCfg.getSerializer() != null) serializer = typeCfg.getSerializer(); - boolean useTs = typeCfg.isUseTimestamp() != null ? typeCfg.isUseTimestamp() : globalUseTs; boolean metaDataEnabled = typeCfg.isMetaDataEnabled() != null ? typeCfg.isMetaDataEnabled() : globalMetaDataEnabled; boolean keepDeserialized = typeCfg.isKeepDeserialized() != null ? typeCfg.isKeepDeserialized() : @@ -338,17 +328,17 @@ public class PortableContext implements Externalizable { String pkgName = clsName.substring(0, clsName.length() - 2); for (String clsName0 : classesInPackage(pkgName)) - descs.add(clsName0, idMapper, serializer, typeCfg.getAffinityKeyFieldName(), useTs, + descs.add(clsName0, idMapper, serializer, typeCfg.getAffinityKeyFieldName(), metaDataEnabled, keepDeserialized, true); } else - descs.add(clsName, idMapper, serializer, typeCfg.getAffinityKeyFieldName(), useTs, + descs.add(clsName, idMapper, serializer, typeCfg.getAffinityKeyFieldName(), metaDataEnabled, keepDeserialized, false); } } for (TypeDescriptor desc : descs.descriptors()) { - registerUserType(desc.clsName, desc.idMapper, desc.serializer, desc.affKeyFieldName, desc.useTs, + registerUserType(desc.clsName, desc.idMapper, desc.serializer, desc.affKeyFieldName, desc.metadataEnabled, desc.keepDeserialized); } } @@ -505,7 +495,6 @@ public class PortableContext implements Externalizable { clsName, BASIC_CLS_ID_MAPPER, null, - useTs, metaDataEnabled, keepDeserialized, true, /* registered */ @@ -553,7 +542,6 @@ public class PortableContext implements Externalizable { typeName, idMapper, null, - useTs, metaDataEnabled, keepDeserialized, registered, @@ -697,7 +685,6 @@ public class PortableContext implements Externalizable { null, false, false, - false, true, /* registered */ true /* predefined */ ); @@ -715,7 +702,6 @@ public class PortableContext implements Externalizable { * @param idMapper ID mapper. * @param serializer Serializer. * @param affKeyFieldName Affinity key field name. - * @param useTs Use timestamp flag. * @param metaDataEnabled Metadata enabled flag. * @param keepDeserialized Keep deserialized flag. * @throws PortableException In case of error. @@ -725,7 +711,6 @@ public class PortableContext implements Externalizable { PortableIdMapper idMapper, @Nullable PortableSerializer serializer, @Nullable String affKeyFieldName, - boolean useTs, boolean metaDataEnabled, boolean keepDeserialized) throws PortableException { @@ -749,9 +734,6 @@ public class PortableContext implements Externalizable { if (mappers.put(id, idMapper) != null) throw new PortableException("Duplicate type ID [clsName=" + clsName + ", id=" + id + ']'); - if (useTs) - usingTs.add(id); - String typeName = typeName(clsName); typeMappers.put(typeName, idMapper); @@ -769,7 +751,6 @@ public class PortableContext implements Externalizable { typeName, idMapper, serializer, - useTs, metaDataEnabled, keepDeserialized, true, /* registered */ @@ -845,21 +826,6 @@ public class PortableContext implements Externalizable { } /** - * @return Use timestamp flag. - */ - public boolean isUseTimestamp() { - return useTs; - } - - /** - * @param typeId Type ID. - * @return If timestamp used. - */ - public boolean isUseTimestamp(int typeId) { - return usingTs.contains(typeId); - } - - /** * @return Whether to convert string to UTF8 bytes. */ public boolean isConvertString() { @@ -986,7 +952,6 @@ public class PortableContext implements Externalizable { * @param idMapper ID mapper. * @param serializer Serializer. * @param affKeyFieldName Affinity key field name. - * @param useTs Use timestamp flag. * @param metadataEnabled Metadata enabled flag. * @param keepDeserialized Keep deserialized flag. * @param canOverride Whether this descriptor can be override. @@ -996,7 +961,6 @@ public class PortableContext implements Externalizable { PortableIdMapper idMapper, PortableSerializer serializer, String affKeyFieldName, - boolean useTs, boolean metadataEnabled, boolean keepDeserialized, boolean canOverride) @@ -1005,7 +969,6 @@ public class PortableContext implements Externalizable { idMapper, serializer, affKeyFieldName, - useTs, metadataEnabled, keepDeserialized, canOverride); @@ -1044,9 +1007,6 @@ public class PortableContext implements Externalizable { /** Affinity key field name. */ private String affKeyFieldName; - /** Use timestamp flag. */ - private boolean useTs; - /** Metadata enabled flag. */ private boolean metadataEnabled; @@ -1063,19 +1023,17 @@ public class PortableContext implements Externalizable { * @param idMapper ID mapper. * @param serializer Serializer. * @param affKeyFieldName Affinity key field name. - * @param useTs Use timestamp flag. * @param metadataEnabled Metadata enabled flag. * @param keepDeserialized Keep deserialized flag. * @param canOverride Whether this descriptor can be override. */ private TypeDescriptor(String clsName, PortableIdMapper idMapper, PortableSerializer serializer, - String affKeyFieldName, boolean useTs, boolean metadataEnabled, boolean keepDeserialized, + String affKeyFieldName, boolean metadataEnabled, boolean keepDeserialized, boolean canOverride) { this.clsName = clsName; this.idMapper = idMapper; this.serializer = serializer; this.affKeyFieldName = affKeyFieldName; - this.useTs = useTs; this.metadataEnabled = metadataEnabled; this.keepDeserialized = keepDeserialized; this.canOverride = canOverride; @@ -1094,7 +1052,6 @@ public class PortableContext implements Externalizable { idMapper = other.idMapper; serializer = other.serializer; affKeyFieldName = other.affKeyFieldName; - useTs = other.useTs; metadataEnabled = other.metadataEnabled; keepDeserialized = other.keepDeserialized; canOverride = other.canOverride; http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableMetaDataCollector.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableMetaDataCollector.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableMetaDataCollector.java index ae5fbf0..9a88bfb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableMetaDataCollector.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableMetaDataCollector.java @@ -197,6 +197,11 @@ class PortableMetaDataCollector implements PortableWriter { } /** {@inheritDoc} */ + @Override public void writeTimestampArray(String fieldName, @Nullable Timestamp[] val) throws PortableException { + add(fieldName, Timestamp[].class); + } + + /** {@inheritDoc} */ @Override public void writeObjectArray(String fieldName, @Nullable Object[] val) throws PortableException { add(fieldName, Object[].class); } http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java index 4ad125a..60d3bb4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java @@ -17,6 +17,21 @@ package org.apache.ignite.internal.portable; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.portable.streams.PortableHeapInputStream; +import org.apache.ignite.internal.portable.streams.PortableInputStream; +import org.apache.ignite.internal.util.GridEnumCache; +import org.apache.ignite.internal.util.lang.GridMapEntry; +import org.apache.ignite.internal.util.typedef.internal.SB; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.portable.PortableException; +import org.apache.ignite.portable.PortableInvalidClassException; +import org.apache.ignite.portable.PortableObject; +import org.apache.ignite.portable.PortableRawReader; +import org.apache.ignite.portable.PortableReader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.io.ByteArrayInputStream; import java.io.EOFException; import java.io.IOException; @@ -38,20 +53,6 @@ import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.portable.streams.PortableHeapInputStream; -import org.apache.ignite.internal.portable.streams.PortableInputStream; -import org.apache.ignite.internal.util.GridEnumCache; -import org.apache.ignite.internal.util.lang.GridMapEntry; -import org.apache.ignite.internal.util.typedef.internal.SB; -import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.portable.PortableException; -import org.apache.ignite.portable.PortableInvalidClassException; -import org.apache.ignite.portable.PortableObject; -import org.apache.ignite.portable.PortableRawReader; -import org.apache.ignite.portable.PortableReader; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.ignite.internal.portable.GridPortableMarshaller.ARR_LIST; @@ -101,6 +102,8 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT; import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING_ARR; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.TREE_MAP; import static org.apache.ignite.internal.portable.GridPortableMarshaller.TREE_SET; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UNREGISTERED_TYPE_ID; @@ -552,7 +555,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx if (flag == NULL) return null; - if (flag != DATE) + if (flag != TIMESTAMP) throw new PortableException("Invalid flag value: " + flag); return doReadTimestamp(false); @@ -889,6 +892,32 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx * @return Value. * @throws PortableException In case of error. */ + @Nullable Timestamp[] readTimestampArray(int fieldId) throws PortableException { + off = fieldOffset(fieldId); + + if (off >= 0) { + byte flag = doReadByte(false); + + if (flag == NULL) + return null; + + if (flag == HANDLE) + return readHandleField(); + + if (flag != TIMESTAMP_ARR) + throw new PortableException("Invalid flag value: " + flag); + + return doReadTimestampArray(false); + } + else + return null; + } + + /** + * @param fieldId Field ID. + * @return Value. + * @throws PortableException In case of error. + */ @Nullable Object[] readObjectArray(int fieldId) throws PortableException { off = fieldOffset(fieldId); @@ -1314,7 +1343,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx if (flag == NULL) return null; - if (flag != DATE) + if (flag != TIMESTAMP) throw new PortableException("Invalid flag value: " + flag); return doReadTimestamp(true); @@ -1540,6 +1569,11 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx } /** {@inheritDoc} */ + @Nullable @Override public Timestamp[] readTimestampArray(String fieldName) throws PortableException { + return readTimestampArray(fieldId(fieldName)); + } + + /** {@inheritDoc} */ @Nullable @Override public Date[] readDateArray() throws PortableException { byte flag = doReadByte(true); @@ -1553,6 +1587,19 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx } /** {@inheritDoc} */ + @Nullable @Override public Timestamp[] readTimestampArray() throws PortableException { + byte flag = doReadByte(true); + + if (flag == NULL) + return null; + + if (flag != TIMESTAMP_ARR) + throw new PortableException("Invalid flag value: " + flag); + + return doReadTimestampArray(true); + } + + /** {@inheritDoc} */ @Nullable @Override public Object[] readObjectArray(String fieldName) throws PortableException { return readObjectArray(fieldId(fieldName)); } @@ -1797,7 +1844,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx return doReadUuid(raw); case DATE: - return isUseTimestamp() ? doReadTimestamp(raw) : doReadDate(raw); + return doReadDate(raw); + + case TIMESTAMP: + return doReadTimestamp(raw); case BYTE_ARR: return doReadByteArray(raw); @@ -1835,6 +1885,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx case DATE_ARR: return doReadDateArray(raw); + case TIMESTAMP_ARR: + return doReadTimestampArray(raw); + case OBJ_ARR: return doReadObjectArray(raw, false); @@ -2066,12 +2119,6 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx private Date doReadDate(boolean raw) { long time = doReadLong(raw); - // Skip remainder. - if (raw) - rawOff += 4; - else - off += 4; - return new Date(time); } @@ -2081,7 +2128,6 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx */ private Timestamp doReadTimestamp(boolean raw) { long time = doReadLong(raw); - int nanos = doReadInt(raw); Timestamp ts = new Timestamp(time); @@ -2217,7 +2263,12 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx break; case DATE: - obj = isUseTimestamp() ? doReadTimestamp(true) : doReadDate(true); + obj = doReadDate(true); + + break; + + case TIMESTAMP: + obj = doReadTimestamp(true); break; @@ -2281,6 +2332,11 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx break; + case TIMESTAMP_ARR: + obj = doReadTimestampArray(true); + + break; + case OBJ_ARR: obj = doReadObjectArray(true, true); @@ -2353,26 +2409,6 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx } /** - * @return Use timestamp flag. - * @throws PortableInvalidClassException If fails to find object type descriptor. - */ - private boolean isUseTimestamp() throws PortableInvalidClassException { - in.position(start); - - boolean dateObj = in.readByte() == DATE; - - if (!dateObj) { - in.position(start + 2); - - int typeId = in.readInt(start + 2); - - return ctx.isUseTimestamp(typeId); - } - - return ctx.isUseTimestamp(); - } - - /** * @param raw Raw flag. * @return Value. */ @@ -2690,6 +2726,36 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx /** * @param raw Raw flag. + * @return Value. + * @throws PortableException In case of error. + */ + private Timestamp[] doReadTimestampArray(boolean raw) throws PortableException { + int hPos = (raw ? rawOff : off) - 1; + + int len = doReadInt(raw); + + Timestamp[] arr = new Timestamp[len]; + + setHandler(arr, hPos); + + for (int i = 0; i < len; i++) { + byte flag = doReadByte(raw); + + if (flag == NULL) + arr[i] = null; + else { + if (flag != TIMESTAMP) + throw new PortableException("Invalid flag value: " + flag); + + arr[i] = doReadTimestamp(raw); + } + } + + return arr; + } + + /** + * @param raw Raw flag. * @param deep Deep flag. * @return Value. * @throws PortableException In case of error. http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/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 7259cc9..a6f2b35 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 @@ -68,6 +68,8 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT; import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING_ARR; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID_ARR; @@ -135,6 +137,7 @@ public class PortableUtils { PLAIN_CLASS_TO_FLAG.put(String.class, GridPortableMarshaller.STRING); PLAIN_CLASS_TO_FLAG.put(UUID.class, GridPortableMarshaller.UUID); PLAIN_CLASS_TO_FLAG.put(Date.class, GridPortableMarshaller.DATE); + PLAIN_CLASS_TO_FLAG.put(Timestamp.class, GridPortableMarshaller.TIMESTAMP); PLAIN_CLASS_TO_FLAG.put(byte[].class, GridPortableMarshaller.BYTE_ARR); PLAIN_CLASS_TO_FLAG.put(short[].class, GridPortableMarshaller.SHORT_ARR); @@ -148,6 +151,7 @@ public class PortableUtils { PLAIN_CLASS_TO_FLAG.put(String[].class, GridPortableMarshaller.STRING_ARR); PLAIN_CLASS_TO_FLAG.put(UUID[].class, GridPortableMarshaller.UUID_ARR); PLAIN_CLASS_TO_FLAG.put(Date[].class, GridPortableMarshaller.DATE_ARR); + PLAIN_CLASS_TO_FLAG.put(Timestamp[].class, GridPortableMarshaller.TIMESTAMP_ARR); for (Map.Entry<Class<?>, Byte> entry : PLAIN_CLASS_TO_FLAG.entrySet()) FLAG_TO_CLASS.put(entry.getValue(), entry.getKey()); @@ -163,9 +167,9 @@ public class PortableUtils { for (byte b : new byte[] { BYTE, SHORT, INT, LONG, FLOAT, DOUBLE, - CHAR, BOOLEAN, DECIMAL, STRING, UUID, DATE, + CHAR, BOOLEAN, DECIMAL, STRING, UUID, DATE, TIMESTAMP, BYTE_ARR, SHORT_ARR, INT_ARR, LONG_ARR, FLOAT_ARR, DOUBLE_ARR, - CHAR_ARR, BOOLEAN_ARR, DECIMAL_ARR, STRING_ARR, UUID_ARR, DATE_ARR, + CHAR_ARR, BOOLEAN_ARR, DECIMAL_ARR, STRING_ARR, UUID_ARR, DATE_ARR, TIMESTAMP_ARR, ENUM, ENUM_ARR, NULL}) { PLAIN_TYPE_FLAG[b] = true; @@ -249,10 +253,12 @@ public class PortableUtils { break; case DATE: - if (val instanceof Timestamp) - writer.doWriteTimestamp((Timestamp)val); - else - writer.doWriteDate((Date)val); + writer.doWriteDate((Date)val); + + break; + + case TIMESTAMP: + writer.doWriteTimestamp((Timestamp) val); break; @@ -316,6 +322,11 @@ public class PortableUtils { break; + case TIMESTAMP_ARR: + writer.doWriteTimestampArray((Timestamp[])val); + + break; + default: throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); } @@ -366,7 +377,7 @@ public class PortableUtils { * @return {@code true} if content of serialized array value cannot contain references to other object. */ public static boolean isPlainArrayType(int type) { - return type >= BYTE_ARR && type <= DATE_ARR; + return (type >= BYTE_ARR && type <= DATE_ARR) || type == TIMESTAMP_ARR; } /** @@ -374,9 +385,6 @@ public class PortableUtils { * @return Portable field type. */ public static byte typeByClass(Class<?> cls) { - if (Date.class.isAssignableFrom(cls)) - return DATE; - Byte type = PLAIN_CLASS_TO_FLAG.get(cls); if (type != null) http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java index 3152c4b..a8a4295 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java @@ -17,13 +17,18 @@ package org.apache.ignite.internal.portable; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.portable.streams.PortableHeapOutputStream; +import org.apache.ignite.internal.portable.streams.PortableOutputStream; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.portable.PortableException; +import org.apache.ignite.portable.PortableRawWriter; +import org.apache.ignite.portable.PortableWriter; +import org.jetbrains.annotations.Nullable; + import java.io.IOException; -import java.io.ObjectInputStream; import java.io.ObjectOutput; -import java.io.ObjectOutputStream; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; @@ -32,15 +37,6 @@ import java.util.Date; import java.util.IdentityHashMap; import java.util.Map; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.portable.streams.PortableHeapOutputStream; -import org.apache.ignite.internal.portable.streams.PortableOutputStream; -import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.portable.PortableException; -import org.apache.ignite.portable.PortableRawWriter; -import org.apache.ignite.portable.PortableWriter; -import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.ignite.internal.portable.GridPortableMarshaller.BOOLEAN; @@ -77,6 +73,8 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT; import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING_ARR; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.TOTAL_LEN_POS; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UNREGISTERED_TYPE_ID; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID; @@ -506,22 +504,21 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx else { doWriteByte(DATE); doWriteLong(date.getTime()); - doWriteInt(0); } } - /** - * @param ts Timestamp. - */ - public void doWriteTimestamp(@Nullable Timestamp ts) { - if (ts == null) - doWriteByte(NULL); - else { - doWriteByte(DATE); - doWriteLong(ts.getTime()); - doWriteInt(ts.getNanos() % 1000000); - } - } + /** + * @param ts Timestamp. + */ + public void doWriteTimestamp(@Nullable Timestamp ts) { + if (ts== null) + doWriteByte(NULL); + else { + doWriteByte(TIMESTAMP); + doWriteLong(ts.getTime()); + doWriteInt(ts.getNanos() % 1000000); + } + } /** * @param obj Object. @@ -751,6 +748,24 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx } } + /** + * @param val Array of timestamps. + */ + void doWriteTimestampArray(@Nullable Timestamp[] val) { + if (val == null) + doWriteByte(NULL); + else { + if (tryWriteAsHandle(val)) + return; + + doWriteByte(TIMESTAMP_ARR); + doWriteInt(val.length); + + for (Timestamp ts : val) + doWriteTimestamp(ts); + } + } + /** * @param val Array of objects. * @throws PortableException In case of error. @@ -1084,7 +1099,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx * @param val Value. */ void writeDateField(@Nullable Date val) { - doWriteInt(val != null ? 13 : 1); + doWriteInt(val != null ? 9 : 1); doWriteDate(val); } @@ -1242,6 +1257,17 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx /** * @param val Value. + */ + void writeTimestampArrayField(@Nullable Timestamp[] val) { + int lenPos = reserveAndMark(4); + + doWriteTimestampArray(val); + + writeDelta(lenPos); + } + + /** + * @param val Value. * @throws PortableException In case of error. */ void writeObjectArrayField(@Nullable Object[] val) throws PortableException { @@ -1456,7 +1482,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx /** {@inheritDoc} */ @Override public void writeTimestamp(String fieldName, @Nullable Timestamp val) throws PortableException { - writeFieldId(fieldName, DATE); + writeFieldId(fieldName, TIMESTAMP); writeTimestampField(val); } @@ -1618,6 +1644,17 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx } /** {@inheritDoc} */ + @Override public void writeTimestampArray(String fieldName, @Nullable Timestamp[] val) throws PortableException { + writeFieldId(fieldName, TIMESTAMP_ARR); + writeTimestampArrayField(val); + } + + /** {@inheritDoc} */ + @Override public void writeTimestampArray(@Nullable Timestamp[] val) throws PortableException { + doWriteTimestampArray(val); + } + + /** {@inheritDoc} */ @Override public void writeObjectArray(String fieldName, @Nullable Object[] val) throws PortableException { writeFieldId(fieldName, OBJ_ARR); writeObjectArrayField(val); http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java index 45355d7..7f149e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java @@ -252,6 +252,11 @@ class PortableBuilderReader { break; case GridPortableMarshaller.DATE: + len = 8; + + break; + + case GridPortableMarshaller.TIMESTAMP: len = 8 + 4; break; @@ -276,6 +281,7 @@ class PortableBuilderReader { case GridPortableMarshaller.DECIMAL_ARR: case GridPortableMarshaller.DATE_ARR: + case GridPortableMarshaller.TIMESTAMP_ARR: case GridPortableMarshaller.OBJ_ARR: case GridPortableMarshaller.ENUM_ARR: case GridPortableMarshaller.UUID_ARR: @@ -396,6 +402,7 @@ class PortableBuilderReader { case GridPortableMarshaller.STRING: case GridPortableMarshaller.UUID: case GridPortableMarshaller.DATE: + case GridPortableMarshaller.TIMESTAMP: return new PortablePlainLazyValue(this, pos, len); case GridPortableMarshaller.BYTE_ARR: @@ -408,6 +415,7 @@ class PortableBuilderReader { case GridPortableMarshaller.BOOLEAN_ARR: case GridPortableMarshaller.DECIMAL_ARR: case GridPortableMarshaller.DATE_ARR: + case GridPortableMarshaller.TIMESTAMP_ARR: case GridPortableMarshaller.UUID_ARR: case GridPortableMarshaller.STRING_ARR: case GridPortableMarshaller.ENUM_ARR: @@ -546,6 +554,11 @@ class PortableBuilderReader { break; case GridPortableMarshaller.DATE: + plainLazyValLen = 8; + + break; + + case GridPortableMarshaller.TIMESTAMP: plainLazyValLen = 8 + 4; break; @@ -618,18 +631,39 @@ class PortableBuilderReader { pos += 8; - if (ctx.isUseTimestamp()) { - Timestamp ts = new Timestamp(time); + res[i] = new Date(time); + } - ts.setNanos(ts.getNanos() + readInt()); + return res; + } - res[i] = ts; - } - else { - res[i] = new Date(time); + case GridPortableMarshaller.TIMESTAMP_ARR: { + int size = readInt(); - pos += 4; - } + Timestamp[] res = new Timestamp[size]; + + for (int i = 0; i < res.length; i++) { + byte flag = arr[pos++]; + + if (flag == GridPortableMarshaller.NULL) + continue; + + if (flag != GridPortableMarshaller.TIMESTAMP) + throw new PortableException("Invalid flag value: " + flag); + + long time = PRIM.readLong(arr, pos); + + pos += 8; + + int nano = PRIM.readInt(arr, pos); + + pos += 4; + + Timestamp ts = new Timestamp(time); + + ts.setNanos(ts.getNanos() + nano); + + res[i] = ts; } return res; http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java index 1be5aea..7bf32cd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/portable/CacheObjectPortableProcessorImpl.java @@ -118,6 +118,8 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT; import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING; import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING_ARR; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP; +import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP_ARR; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID; import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID_ARR; @@ -190,6 +192,7 @@ public class CacheObjectPortableProcessorImpl extends IgniteCacheObjectProcessor FIELD_TYPE_NAMES[DECIMAL] = "decimal"; FIELD_TYPE_NAMES[STRING] = "String"; FIELD_TYPE_NAMES[DATE] = "Date"; + FIELD_TYPE_NAMES[TIMESTAMP] = "Timestamp"; FIELD_TYPE_NAMES[ENUM] = "Enum"; FIELD_TYPE_NAMES[OBJ] = "Object"; FIELD_TYPE_NAMES[PORTABLE_OBJ] = "Object"; @@ -207,6 +210,7 @@ public class CacheObjectPortableProcessorImpl extends IgniteCacheObjectProcessor FIELD_TYPE_NAMES[DECIMAL_ARR] = "decimal[]"; FIELD_TYPE_NAMES[STRING_ARR] = "String[]"; FIELD_TYPE_NAMES[DATE_ARR] = "Date[]"; + FIELD_TYPE_NAMES[TIMESTAMP_ARR] = "Timestamp[]"; FIELD_TYPE_NAMES[OBJ_ARR] = "Object[]"; FIELD_TYPE_NAMES[ENUM_ARR] = "Enum[]"; } http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/marshaller/portable/PortableMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/portable/PortableMarshaller.java b/modules/core/src/main/java/org/apache/ignite/marshaller/portable/PortableMarshaller.java index bfc34cd..4a64ae8 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/portable/PortableMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/portable/PortableMarshaller.java @@ -21,7 +21,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import org.apache.ignite.IgniteCheckedException; @@ -92,9 +91,6 @@ public class PortableMarshaller extends AbstractMarshaller { /** Types. */ private Collection<PortableTypeConfiguration> typeCfgs; - /** Use timestamp flag. */ - private boolean useTs = true; - /** Whether to convert string to bytes using UTF-8 encoding. */ private boolean convertString = true; @@ -186,24 +182,6 @@ public class PortableMarshaller extends AbstractMarshaller { } /** - * If {@code true} then date values converted to {@link Timestamp} on deserialization. - * <p> - * Default value is {@code true}. - * - * @return Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. - */ - public boolean isUseTimestamp() { - return useTs; - } - - /** - * @param useTs Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. - */ - public void setUseTimestamp(boolean useTs) { - this.useTs = useTs; - } - - /** * Gets strings must be converted to or from bytes using UTF-8 encoding. * <p> * Default value is {@code true}. http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java index 3bae2e1..4b3dc4c 100644 --- a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java @@ -188,6 +188,12 @@ public interface PortableRawReader { @Nullable public Date[] readDateArray() throws PortableException; /** + * @return Timestamp array. + * @throws PortableException In case of error. + */ + @Nullable public Timestamp[] readTimestampArray() throws PortableException; + + /** * @return Object array. * @throws PortableException In case of error. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java index 53f4f92..245f755 100644 --- a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java @@ -191,6 +191,12 @@ public interface PortableRawWriter { * @param val Value to write. * @throws PortableException In case of error. */ + public void writeTimestampArray(@Nullable Timestamp[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ public void writeObjectArray(@Nullable Object[] val) throws PortableException; /** http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java index 58f078d..f2b1cda 100644 --- a/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java @@ -222,6 +222,13 @@ public interface PortableReader { /** * @param fieldName Field name. + * @return Timestamp array. + * @throws PortableException In case of error. + */ + @Nullable public Timestamp[] readTimestampArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. * @return Object array. * @throws PortableException In case of error. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java index 5e6e09d..68f0514 100644 --- a/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java @@ -41,9 +41,6 @@ public class PortableTypeConfiguration { /** Serializer. */ private PortableSerializer serializer; - /** Use timestamp flag. */ - private Boolean useTs; - /** Meta data enabled flag. */ private Boolean metaDataEnabled; @@ -121,22 +118,6 @@ public class PortableTypeConfiguration { } /** - * If {@code true} then date values converted to {@link Timestamp} during unmarshalling. - * - * @return Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. - */ - public Boolean isUseTimestamp() { - return useTs; - } - - /** - * @param useTs Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. - */ - public void setUseTimestamp(Boolean useTs) { - this.useTs = useTs; - } - - /** * Defines whether meta data is collected for this type. If provided, this value will override * {@link PortableMarshaller#isMetaDataEnabled()} property. * http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java index 0d7160f..99bd5c6 100644 --- a/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java @@ -225,6 +225,13 @@ public interface PortableWriter { * @param val Value to write. * @throws PortableException In case of error. */ + public void writeTimestampArray(String fieldName, @Nullable Timestamp[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ public void writeObjectArray(String fieldName, @Nullable Object[] val) throws PortableException; /** http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderAdditionalSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderAdditionalSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderAdditionalSelfTest.java index 61ec714..d8eff6d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderAdditionalSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderAdditionalSelfTest.java @@ -258,6 +258,24 @@ public class GridPortableBuilderAdditionalSelfTest extends GridCommonAbstractTes /** * */ + public void testTimestampArrayModification() { + TestObjectAllTypes obj = new TestObjectAllTypes(); + + obj.tsArr = new Timestamp[] {new Timestamp(111222333), new Timestamp(222333444)}; + + PortableBuilderImpl mutObj = wrap(obj); + + Timestamp[] arr = mutObj.getField("tsArr"); + arr[0] = new Timestamp(333444555); + + TestObjectAllTypes res = mutObj.build().deserialize(); + + Assert.assertArrayEquals(new Timestamp[] {new Timestamp(333444555), new Timestamp(222333444)}, res.tsArr); + } + + /** + * + */ public void testUUIDArrayModification() { TestObjectAllTypes obj = new TestObjectAllTypes(); @@ -1012,6 +1030,19 @@ public class GridPortableBuilderAdditionalSelfTest extends GridCommonAbstractTes PortableBuilderImpl mutableObj = wrap(obj); + assertEquals(Date.class, mutableObj.getField("foo").getClass()); + } + + /** + * + */ + public void testTimestampInObjectField() { + TestObjectContainer obj = new TestObjectContainer(); + + obj.foo = new Timestamp(100020003); + + PortableBuilderImpl mutableObj = wrap(obj); + assertEquals(Timestamp.class, mutableObj.getField("foo").getClass()); } @@ -1025,6 +1056,19 @@ public class GridPortableBuilderAdditionalSelfTest extends GridCommonAbstractTes PortableBuilderImpl mutableObj = wrap(obj); + assertEquals(Date.class, ((List<?>)mutableObj.getField("foo")).get(0).getClass()); + } + + /** + * + */ + public void testTimestampInCollection() { + TestObjectContainer obj = new TestObjectContainer(); + + obj.foo = Lists.newArrayList(new Timestamp(100020003)); + + PortableBuilderImpl mutableObj = wrap(obj); + assertEquals(Timestamp.class, ((List<?>)mutableObj.getField("foo")).get(0).getClass()); } @@ -1037,7 +1081,7 @@ public class GridPortableBuilderAdditionalSelfTest extends GridCommonAbstractTes PortableBuilderImpl mutableObj = wrap(obj); - Date[] arr = {new Date()}; + Date[] arr = { new Date() }; mutableObj.setField("foo", arr); @@ -1050,6 +1094,25 @@ public class GridPortableBuilderAdditionalSelfTest extends GridCommonAbstractTes /** * */ + @SuppressWarnings("AssertEqualsBetweenInconvertibleTypes") + public void testTimestampArrayOverride() { + TestObjectContainer obj = new TestObjectContainer(); + + PortableBuilderImpl mutableObj = wrap(obj); + + Timestamp[] arr = { new Timestamp(100020003) }; + + mutableObj.setField("foo", arr); + + TestObjectContainer res = mutableObj.build().deserialize(); + + assertEquals(Timestamp[].class, res.foo.getClass()); + assertTrue(Objects.deepEquals(arr, res.foo)); + } + + /** + * + */ public void testChangeMap() { AddressBook addrBook = new AddressBook(); http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderSelfTest.java index 7f23c1f..331d9dc 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableBuilderSelfTest.java @@ -18,10 +18,12 @@ package org.apache.ignite.internal.portable; import java.math.BigDecimal; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; @@ -133,7 +135,7 @@ public class GridPortableBuilderSelfTest extends GridCommonAbstractTest { assertEquals("class".hashCode(), po.typeId()); assertEquals(100, po.hashCode()); - assertEquals((byte)1, po.<Byte>field("byteField").byteValue()); + assertEquals((byte) 1, po.<Byte>field("byteField").byteValue()); } /** @@ -301,6 +303,25 @@ public class GridPortableBuilderSelfTest extends GridCommonAbstractTest { /** * @throws Exception If failed. */ + public void testDateField() throws Exception { + Date date = new Date(); + + assertEquals(date, builder("C").setField("d", date).build().<Date>field("d")); + } + + /** + * @throws Exception If failed. + */ + public void testTimestampField() throws Exception { + Timestamp ts = new Timestamp(new Date().getTime()); + ts.setNanos(1000); + + assertEquals(ts, builder("C").setField("t", ts).build().<Timestamp>field("t")); + } + + /** + * @throws Exception If failed. + */ public void testUuidField() throws Exception { PortableBuilder builder = builder("Class"); @@ -506,6 +527,33 @@ public class GridPortableBuilderSelfTest extends GridCommonAbstractTest { /** * @throws Exception If failed. */ + public void testDateArrayField() throws Exception { + Date date1 = new Date(); + Date date2 = new Date(date1.getTime() + 1000); + + Date[] dateArr = new Date[] { date1, date2 }; + + assertTrue(Arrays.equals(dateArr, builder("C").setField("da", dateArr).build().<Date[]>field("da"))); + } + + /** + * @throws Exception If failed. + */ + public void testTimestampArrayField() throws Exception { + Timestamp ts1 = new Timestamp(new Date().getTime()); + Timestamp ts2 = new Timestamp(new Date().getTime() + 1000); + + ts1.setNanos(1000); + ts2.setNanos(2000); + + Timestamp[] tsArr = new Timestamp[] { ts1, ts2 }; + + assertTrue(Arrays.equals(tsArr, builder("C").setField("ta", tsArr).build().<Timestamp[]>field("ta"))); + } + + /** + * @throws Exception If failed. + */ public void testUuidArrayField() throws Exception { PortableBuilder builder = builder("Class"); http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java index 21fc81c..be8610e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java @@ -196,15 +196,6 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest { Date val = marshalUnmarshal(date); assertEquals(date, val); - assertEquals(Timestamp.class, val.getClass()); // With default configuration should unmarshal as Timestamp. - - PortableMarshaller marsh = new PortableMarshaller(); - - marsh.setUseTimestamp(false); - - val = marshalUnmarshal(date, marsh); - - assertEquals(date, val); assertEquals(Date.class, val.getClass()); } @@ -443,16 +434,12 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest { /** * @throws Exception If failed. */ - public void testUseTimestampFlag() throws Exception { + public void testDateAndTimestampInSingleObject() throws Exception { PortableTypeConfiguration cfg1 = new PortableTypeConfiguration(DateClass1.class.getName()); - PortableTypeConfiguration cfg2 = new PortableTypeConfiguration(DateClass2.class.getName()); - - cfg2.setUseTimestamp(false); - PortableMarshaller marsh = new PortableMarshaller(); - marsh.setTypeConfigurations(Arrays.asList(cfg1, cfg2)); + marsh.setTypeConfigurations(Arrays.asList(cfg1)); Date date = new Date(); Timestamp ts = new Timestamp(System.currentTimeMillis()); @@ -461,32 +448,16 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest { obj1.date = date; obj1.ts = ts; - DateClass2 obj2 = new DateClass2(); - obj2.date = date; - obj2.ts = ts; - PortableObject po1 = marshal(obj1, marsh); assertEquals(date, po1.field("date")); - assertEquals(Timestamp.class, po1.field("date").getClass()); + assertEquals(Date.class, po1.field("date").getClass()); assertEquals(ts, po1.field("ts")); - - PortableObject po2 = marshal(obj2, marsh); - - assertEquals(date, po2.field("date")); - assertEquals(Date.class, po2.field("date").getClass()); - assertEquals(new Date(ts.getTime()), po2.field("ts")); - assertEquals(Date.class, po2.field("ts").getClass()); + assertEquals(Timestamp.class, po1.field("ts").getClass()); obj1 = po1.deserialize(); assertEquals(date, obj1.date); - assertEquals(Date.class, obj1.date.getClass()); assertEquals(ts, obj1.ts); - - obj2 = po2.deserialize(); - assertEquals(date, obj2.date); - assertEquals(Date.class, obj2.date.getClass()); - assertEquals(ts, obj2.ts); } /** @@ -3603,16 +3574,6 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest { } /** - */ - private static class DateClass2 { - /** */ - private Date date; - - /** */ - private Timestamp ts; - } - - /** * */ private static class NoPublicConstructor { http://git-wip-us.apache.org/repos/asf/ignite/blob/bf8ff944/modules/core/src/test/java/org/apache/ignite/internal/portable/mutabletest/GridPortableTestClasses.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/mutabletest/GridPortableTestClasses.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/mutabletest/GridPortableTestClasses.java index e49514b..a2ae71f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/portable/mutabletest/GridPortableTestClasses.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/mutabletest/GridPortableTestClasses.java @@ -24,6 +24,7 @@ import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.Serializable; import java.math.BigDecimal; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -184,6 +185,9 @@ public class GridPortableTestClasses { public Date date; /** */ + public Timestamp ts; + + /** */ public byte[] bArr; /** */ @@ -220,6 +224,9 @@ public class GridPortableTestClasses { public Date[] dateArr; /** */ + public Timestamp[] tsArr; + + /** */ public TestObjectEnum anEnum; /** */ @@ -273,6 +280,7 @@ public class GridPortableTestClasses { str = "abc"; uuid = new UUID(1, 1); date = new Date(1000000); + ts = new Timestamp(100020003); bArr = new byte[] {1, 2, 3}; sArr = new short[] {1, 2, 3}; @@ -287,6 +295,7 @@ public class GridPortableTestClasses { uuidArr = new UUID[] {new UUID(1, 1), new UUID(2, 2)}; bdArr = new BigDecimal[] {new BigDecimal(1000), BigDecimal.TEN}; dateArr = new Date[] {new Date(1000000), new Date(200000)}; + tsArr = new Timestamp[] {new Timestamp(100020003), new Timestamp(200030004)}; anEnum = TestObjectEnum.A;
