You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/06/05 16:00:47 UTC
incubator-ignite git commit: ignite-950: implemented fieldOffset,
hasField functions for ObjectInputStream
Repository: incubator-ignite
Updated Branches:
refs/heads/ignite-950 dee21a458 -> 8592c8d42
ignite-950: implemented fieldOffset, hasField functions for ObjectInputStream
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/8592c8d4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/8592c8d4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/8592c8d4
Branch: refs/heads/ignite-950
Commit: 8592c8d42fbd9beb09efe7d876b14afb81cf9f48
Parents: dee21a4
Author: Denis Magda <dm...@gridgain.com>
Authored: Fri Jun 5 17:00:34 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Fri Jun 5 17:00:34 2015 +0300
----------------------------------------------------------------------
.../optimized/OptimizedMarshallerUtils.java | 11 ++++
.../optimized/OptimizedObjectInputStream.java | 69 +++++++++++++++-----
2 files changed, 64 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8592c8d4/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
index 6e7f6c2..a0e8a71 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
@@ -146,6 +146,8 @@ class OptimizedMarshallerUtils {
/** */
static final byte EMPTY_FOOTER = -1;
+ /** */
+ static final byte FOOTER_LEN_OFF = 4;
/** UTF-8 character name. */
static final Charset UTF_8 = Charset.forName("UTF-8");
@@ -233,6 +235,15 @@ class OptimizedMarshallerUtils {
}
/**
+ * Checks whether a given type supports and should include footer with fields info into the serialized form.
+ *
+ * @param type Type.
+ * @return {@code true} if supported, {@code false} otherwise.
+ */
+ public static boolean supportsFooter(int type) {
+ return type == SERIALIZABLE;
+ }
+ /**
* @param fieldName Field name.
* @return Field ID.
*/
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8592c8d4/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
index 27222c9..6f4df7d 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
@@ -961,38 +961,80 @@ class OptimizedObjectInputStream extends ObjectInputStream {
*
* @param fieldName Field name.
* @return {@code true} if field exists, {@code false} otherwise.
+ * @throws IOException in case of error.
*/
- public boolean hasField(String fieldName) {
+ public boolean hasField(String fieldName) throws IOException {
+ int pos = in.position();
- return false;
+ // TODO: IGNITE-950, do we need move to start position?
+ if (!supportsFooter(in.readByte()))
+ return false;
+
+ int off = fieldOffset(fieldName);
+
+ in.position(pos);
+
+ return off > 0;
}
- //TODO
+ /**
+ * TODO: IGNITE-950
+ * @param fieldName
+ * @return
+ * @throws IOException
+ * @throws ClassNotFoundException
+ */
Object readField(String fieldName) throws IOException, ClassNotFoundException {
- byte type = in.readByte();
+ int pos = in.position();
- if (type != SERIALIZABLE)
- return -1;
+ // TODO: IGNITE-950, do we need move to start position?
+ if (!supportsFooter(in.readByte()))
+ return false;
+
+ int off = fieldOffset(fieldName);
+
+ Object obj = null;
+
+ if (off > 0) {
+ in.position(off);
+ obj = readObject();
+ }
+
+ in.position(pos);
+ return obj;
+ }
+
+ /**
+ * Returns field offset in the byte stream.
+ *
+ * @param fieldName Field name.
+ * @return positive offset or -1 if the object doesn't have such a field.
+ * @throws IOException in case of error.
+ */
+ private int fieldOffset(String fieldName) throws IOException {
int fieldId = resolveFieldId(fieldName);
int end = in.size();
- in.position(end - 4);
+
+ in.position(end - FOOTER_LEN_OFF);
int footerLen = in.readInt();
if (footerLen == EMPTY_FOOTER)
- return null; //TODO: IGNITE-950
+ return -1;
- int footerStartOff = in.size() - footerLen;
+ int footerStartOff = end - footerLen;
in.position(footerStartOff);
int fieldsDataPos = in.readInt();
int fieldOff = -1;
+ // 8 - size of footer len and object total len fields.
+ int bound = end - 8;
- while (footerStartOff < end - 8) {
+ while (footerStartOff < bound) {
int id = in.readInt();
if (fieldId == id) {
@@ -1006,12 +1048,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
footerStartOff += 12;
}
- if (fieldOff > 0) {
- in.position(fieldOff);
- return readObject();
- }
-
- return null; //TODO
+ return fieldOff;
}
/**