diff options
author | Jisi Liu <jisi.liu@gmail.com> | 2015-02-05 14:52:17 -0800 |
---|---|---|
committer | Jisi Liu <jisi.liu@gmail.com> | 2015-02-05 14:52:17 -0800 |
commit | bd3573cb096cb8f0ec4bf29f0e11744a06a9e5a6 (patch) | |
tree | 8114227aef1743eb20cdf6022fb1cebb9992c9d6 /javanano/src/main/java/com/google | |
parent | ca35a8030339d85cb4efb928b1aae8e38584d214 (diff) | |
download | protobuf-bd3573cb096cb8f0ec4bf29f0e11744a06a9e5a6.tar.gz protobuf-bd3573cb096cb8f0ec4bf29f0e11744a06a9e5a6.tar.bz2 protobuf-bd3573cb096cb8f0ec4bf29f0e11744a06a9e5a6.zip |
Fix the behavior when merging conflicting keys, the new value always
override the existing one even for message types.
Diffstat (limited to 'javanano/src/main/java/com/google')
-rw-r--r-- | javanano/src/main/java/com/google/protobuf/nano/InternalNano.java | 40 |
1 files changed, 7 insertions, 33 deletions
diff --git a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java index 0705b0c0..fc0a36cd 100644 --- a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java +++ b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java @@ -391,12 +391,12 @@ public final class InternalNano { * be called by generated messages. * * @param map the map field; may be null, in which case a map will be - * instantiated using the {@link MapUtil.MapFactory} + * instantiated using the {@link MapFactories.MapFactory} * @param input the input byte buffer * @param keyType key type, as defined in InternalNano.TYPE_* * @param valueType value type, as defined in InternalNano.TYPE_* - * @param valueClazz class of the value field if the valueType is - * TYPE_MESSAGE; otherwise the parameter is ignored and can be null. + * @param value an new instance of the value, if the value is a TYPE_MESSAGE; + * otherwise this parameter can be null and will be ignored. * @param keyTag wire tag for the key * @param valueTag wire tag for the value * @return the map field @@ -408,15 +408,13 @@ public final class InternalNano { Map<K, V> map, int keyType, int valueType, - Class<V> valueClazz, + V value, int keyTag, int valueTag) throws IOException { map = MapFactories.getMapFactory().forMap(map); final int length = input.readRawVarint32(); final int oldLimit = input.pushLimit(length); - byte[] payload = null; K key = null; - V value = null; while (true) { int tag = input.readTag(); if (tag == 0) { @@ -426,7 +424,7 @@ public final class InternalNano { key = (K) input.readData(keyType); } else if (tag == valueTag) { if (valueType == TYPE_MESSAGE) { - payload = input.readBytes(); + input.readMessage((MessageNano) value); } else { value = (V) input.readData(valueType); } @@ -440,36 +438,12 @@ public final class InternalNano { input.popLimit(oldLimit); if (key == null) { + // key can only be primitive types. key = (K) primitiveDefaultValue(keyType); } - // Special case: merge the value when the value is a message. - if (valueType == TYPE_MESSAGE) { - MessageNano oldMessageValue = (MessageNano) map.get(key); - if (oldMessageValue != null) { - if (payload != null) { - MessageNano.mergeFrom(oldMessageValue, payload); - } - return map; - } - // Otherwise, create a new value message. - try { - value = valueClazz.newInstance(); - } catch (InstantiationException e) { - throw new IOException( - "Unable to create value message " + valueClazz.getName() - + " in maps."); - } catch (IllegalAccessException e) { - throw new IOException( - "Unable to create value message " + valueClazz.getName() - + " in maps."); - } - if (payload != null) { - MessageNano.mergeFrom((MessageNano) value, payload); - } - } - if (value == null) { + // message type value = (V) primitiveDefaultValue(valueType); } |