Repository: incubator-ignite Updated Branches: refs/heads/sprint-1 ce0c94a29 -> 1c114052b
IGNITE-61 - Direct marshalling Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/39fcfb63 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/39fcfb63 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/39fcfb63 Branch: refs/heads/sprint-1 Commit: 39fcfb630672dff86780d4c7826af6f27429990b Parents: 43e19ee Author: Valentin Kulichenko <vkuliche...@gridgain.com> Authored: Sat Feb 7 21:52:24 2015 -0800 Committer: Valentin Kulichenko <vkuliche...@gridgain.com> Committed: Sat Feb 7 21:52:24 2015 -0800 ---------------------------------------------------------------------- .../CommunicationMessageCodeGenerator.java | 58 +++++++------------- .../internal/direct/DirectByteBufferStream.java | 11 ++++ .../internal/direct/DirectMessageReader.java | 9 +++ .../internal/direct/DirectMessageWriter.java | 7 +++ .../communication/MessageAdapter.java | 6 ++ .../extensions/communication/MessageReader.java | 2 + .../extensions/communication/MessageWriter.java | 2 + 7 files changed, 58 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/codegen/src/main/java/org/apache/ignite/codegen/CommunicationMessageCodeGenerator.java ---------------------------------------------------------------------- diff --git a/modules/codegen/src/main/java/org/apache/ignite/codegen/CommunicationMessageCodeGenerator.java b/modules/codegen/src/main/java/org/apache/ignite/codegen/CommunicationMessageCodeGenerator.java index b828d73..b8c6aa9 100644 --- a/modules/codegen/src/main/java/org/apache/ignite/codegen/CommunicationMessageCodeGenerator.java +++ b/modules/codegen/src/main/java/org/apache/ignite/codegen/CommunicationMessageCodeGenerator.java @@ -34,6 +34,12 @@ public class CommunicationMessageCodeGenerator { }; /** */ + private static final String[] EXCLUDED_PACKAGES = new String[] { + "org.apache.ignite.internal.processors.rest.client.message", + "org.apache.ignite.internal.processors.rest.protocols.tcp" + }; + + /** */ private static final String SRC_DIR = U.getIgniteHome() + "/modules/core/src/main/java"; /** */ @@ -46,34 +52,13 @@ public class CommunicationMessageCodeGenerator { private static final String TAB = " "; /** */ - private static final String COMM_STATE_VAR = "commState"; - - /** */ private static final String BUF_VAR = "buf"; /** */ - private static final String STATE_VAR = COMM_STATE_VAR + "." + "idx"; - - /** */ - private static final String TYPE_WRITTEN_VAR = COMM_STATE_VAR + "." + "typeWritten"; - - /** */ - private static final String IT_VAR = COMM_STATE_VAR + "." + "it"; - - /** */ - private static final String CUR_VAR = COMM_STATE_VAR + "." + "cur"; + private static final String STATE_VAR = "state"; /** */ - private static final String KEY_DONE_VAR = COMM_STATE_VAR + "." + "keyDone"; - - /** */ - private static final String READ_SIZE_VAR = COMM_STATE_VAR + "." + "readSize"; - - /** */ - private static final String READ_ITEMS_VAR = COMM_STATE_VAR + "." + "readItems"; - - /** */ - private static final String DFLT_LOC_VAR = "_val"; + private static final String TYPE_WRITTEN_VAR = "typeWritten"; /** */ private final Collection<String> write = new ArrayList<>(); @@ -297,14 +282,8 @@ public class CommunicationMessageCodeGenerator { for (Field field : cloningFields) { String name = field.getName(); - Class<?> type = field.getType(); - - String res = name; - - if (BASE_CLS.isAssignableFrom(type)) - res = name + " != null ? (" + type.getSimpleName() + ")" + name + ".clone() : null"; - clone0.add(builder().a("_clone.").a(name).a(" = ").a(res).a(";").toString()); + clone0.add(builder().a("_clone.").a(name).a(" = ").a(name).a(";").toString()); } } @@ -359,12 +338,12 @@ public class CommunicationMessageCodeGenerator { /** * @param code Code lines. * @param superMtd Super class method name. - * @param writeType Whether to write message type. + * @param write Whether write code is generated. */ - private void start(Collection<String> code, @Nullable String superMtd, boolean writeType) { + private void start(Collection<String> code, @Nullable String superMtd, boolean write) { assert code != null; - code.add(builder().a(COMM_STATE_VAR).a(".setBuffer(").a(BUF_VAR).a(");").toString()); + code.add(builder().a(write ? "writer" : "reader").a(".setBuffer(").a(BUF_VAR).a(");").toString()); code.add(EMPTY); if (superMtd != null) { @@ -373,12 +352,12 @@ public class CommunicationMessageCodeGenerator { code.add(EMPTY); } - if (writeType) { + if (write) { code.add(builder().a("if (!").a(TYPE_WRITTEN_VAR).a(") {").toString()); indent++; - returnFalseIfFailed(code, COMM_STATE_VAR + ".putByte", "null", "directType()"); + returnFalseIfFailed(code, "writer.writeByte", "null", "directType()"); code.add(EMPTY); code.add(builder().a(TYPE_WRITTEN_VAR).a(" = true;").toString()); @@ -537,7 +516,7 @@ public class CommunicationMessageCodeGenerator { else if (type.isEnum()) returnFalseIfFailed(write, "writer.writeEnum", field, name); else if (BASE_CLS.isAssignableFrom(type)) - returnFalseIfFailed(write, "writer.writeMessage", field, name); + returnFalseIfFailed(write, "writer.writeMessage", field, name + " != null ? " + name + ".clone() : null"); else if (type.isArray()) { returnFalseIfFailed(write, "writer.writeObjectArray", field, name, type.getComponentType().getSimpleName() + ".class"); @@ -615,7 +594,7 @@ public class CommunicationMessageCodeGenerator { else if (type == IgniteUuid.class) returnFalseIfReadFailed(retType, name, "reader.readGridUuid", field); else if (type.isEnum()) - returnFalseIfReadFailed(retType, name, "reader.readEnum", field); + returnFalseIfReadFailed(retType, name, "reader.readEnum", field, retType + ".class"); else if (BASE_CLS.isAssignableFrom(type)) returnFalseIfReadFailed(retType, name, "reader.readMessage", field); else if (type.isArray()) { @@ -776,6 +755,11 @@ public class CommunicationMessageCodeGenerator { if (path.endsWith(".class")) { String clsName = path.substring(prefixLen, path.length() - 6).replace(File.separatorChar, '.'); + for (String excluded : EXCLUDED_PACKAGES) { + if (clsName.startsWith(excluded)) + return; + } + Class<?> cls = Class.forName(clsName, false, ldr); if (cls.getDeclaringClass() == null && cls.getEnclosingClass() == null && http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectByteBufferStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectByteBufferStream.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectByteBufferStream.java index cbb8d4c..e674861 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectByteBufferStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectByteBufferStream.java @@ -524,6 +524,10 @@ public class DirectByteBufferStream { writeByteArray(val != null ? U.igniteUuidToBytes(val) : null); } + public void writeEnum(Enum<?> val) { + writeByte(val != null ? (byte)val.ordinal() : -1); + } + /** * @param msg Message. */ @@ -840,6 +844,13 @@ public class DirectByteBufferStream { return arr != null ? U.bytesToIgniteUuid(arr, 0) : null; } + @SuppressWarnings("unchecked") + public <T extends Enum<T>> Enum<T> readEnum(Class<T> enumCls) { + byte ord = readByte(); + + return ord >= 0 ? (Enum<T>)GridEnumCache.get(enumCls)[ord] : null; + } + /** * @return Message. */ http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java index 547c71a..3875cfe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java @@ -227,6 +227,15 @@ public class DirectMessageReader implements MessageReader { } /** {@inheritDoc} */ + @Override public <T extends Enum<T>> Enum<T> readEnum(String name, Class<T> enumCls) { + Enum<T> val = stream.readEnum(enumCls); + + lastRead = stream.lastFinished(); + + return val; + } + + /** {@inheritDoc} */ @Nullable @Override public MessageAdapter readMessage(String name) { MessageAdapter msg = stream.readMessage(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java index d7c679d..e5f005d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java @@ -177,6 +177,13 @@ public class DirectMessageWriter implements MessageWriter { } /** {@inheritDoc} */ + @Override public boolean writeEnum(String name, Enum<?> val) { + stream.writeEnum(val); + + return stream.lastFinished(); + } + + /** {@inheritDoc} */ @Override public boolean writeMessage(String name, @Nullable MessageAdapter msg) { if (msg != null) msg.setWriter(this); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageAdapter.java b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageAdapter.java index 89d26fc..2234698 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageAdapter.java @@ -41,6 +41,12 @@ public abstract class MessageAdapter implements Serializable, Cloneable { /** Reader. */ protected MessageReader reader; + /** */ + protected boolean typeWritten; + + /** */ + protected int state; + /** * @param writer Writer. */ http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java index aa1c09b..fa4ca66 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java @@ -60,6 +60,8 @@ public interface MessageReader { public IgniteUuid readIgniteUuid(String name); + public <T extends Enum<T>> Enum<T> readEnum(String name, Class<T> enumCls); + public MessageAdapter readMessage(String name); public <T> T[] readObjectArray(String name, Class<T> itemCls); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/39fcfb63/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java index 19bb268..fc348ee 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java @@ -60,6 +60,8 @@ public interface MessageWriter { public boolean writeIgniteUuid(String name, IgniteUuid val); + public boolean writeEnum(String name, Enum<?> val); + public boolean writeMessage(String name, MessageAdapter val); public <T> boolean writeObjectArray(String name, T[] arr, Class<T> itemCls);