diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2013-05-09 10:00:28 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2013-05-09 10:00:28 +0000 |
| commit | 74b560985b35ceb6e5f82e80e388d425ff4cfb8e (patch) | |
| tree | 6e2e990b39ce60da45cdf239aca82d4f3f3e5484 | |
| parent | 669d382706e6bb414a710aaf3e8565c4ba6fa0f8 (diff) | |
| download | qpid-python-74b560985b35ceb6e5f82e80e388d425ff4cfb8e.tar.gz | |
QPID-4824 : [Java AMQP 1.0] Reduce memory usage of codec
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1480584 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 36 insertions, 68 deletions
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java index 73c4d4bd95..8e09e093e0 100644 --- a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java +++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java @@ -31,7 +31,6 @@ public abstract class CompoundWriter<V> implements ValueWriter<V> private Registry _registry; private static final int LARGE_COMPOUND_THRESHOLD_COUNT = 25; private ValueWriter _delegate; - private Map<Class, ValueWriter> _writerCache = new HashMap<Class, ValueWriter>(); public CompoundWriter(final Registry registry) { @@ -305,7 +304,7 @@ public abstract class CompoundWriter<V> implements ValueWriter<V> for(int i = 0; i < getCount(); i++) { Object val = next(); - ValueWriter writer = _registry.getValueWriter(val, _writerCache); + ValueWriter writer = _registry.getValueWriter(val); if(writer == null) { // TODO diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java index 93e0fea740..6b77620e5e 100644 --- a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java +++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java @@ -127,7 +127,7 @@ public class UnsignedLongWriter implements ValueWriter<UnsignedLong> { _delegate = _zeroByteWriter; } - else if(ulong.compareTo(UnsignedLong.valueOf(256))<0) + else if((ulong.longValue() & 0xffL) == ulong.longValue()) { _delegate = _oneByteWriter; } diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java index 4ee0fd1f70..82e6216c21 100644 --- a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java +++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java @@ -298,102 +298,71 @@ public class AMQPDescribedTypeRegistry implements DescribedTypeConstructorRegist private final Map<Class, ValueWriter.Factory> _writerMap = new HashMap<Class, ValueWriter.Factory>(); - private final Map<Class, ValueWriter> _cachedWriters = new HashMap<Class,ValueWriter>(); public <V extends Object> ValueWriter<V> getValueWriter(V value, Map<Class, ValueWriter> localCache) { - Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass(); - ValueWriter writer = null; // TODO localCache.get(clazz); - if(writer == null || !writer.isComplete()) - { - writer = getValueWriter(value); - localCache.put(clazz, writer); - } - else - { - writer.setValue(value); - } + return getValueWriter(value); - - return writer; } public <V extends Object> ValueWriter<V> getValueWriter(V value) { + ValueWriter writer; Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass(); - ValueWriter writer = null; // TODO _cachedWriters.get(clazz); - if(writer == null || !writer.isComplete()) + ValueWriter.Factory<V> factory = (ValueWriter.Factory<V>) (_writerMap.get(clazz)); + + if(factory == null) { - ValueWriter.Factory<V> factory = (ValueWriter.Factory<V>) (_writerMap.get(clazz)); + if(value instanceof List) + { + factory = _writerMap.get(List.class); + _writerMap.put(value.getClass(), factory); + writer = factory.newInstance(this); + writer.setValue(value); - if(factory == null) + } + else if(value instanceof Map) { - if(value instanceof List) - { - factory = _writerMap.get(List.class); - _writerMap.put(value.getClass(), factory); - writer = factory.newInstance(this); - if(writer.isCacheable()) - { - _cachedWriters.put(clazz, writer); - } - writer.setValue(value); + factory = _writerMap.get(Map.class); + _writerMap.put(value.getClass(), factory); + writer = factory.newInstance(this); + writer.setValue(value); - } - else if(value instanceof Map) + } + else if(value.getClass().isArray()) + { + if(RestrictedType.class.isAssignableFrom(value.getClass().getComponentType())) { - factory = _writerMap.get(Map.class); - _writerMap.put(value.getClass(), factory); - writer = factory.newInstance(this); - if(writer.isCacheable()) + RestrictedType[] restrictedTypes = (RestrictedType[]) value; + Object[] newVals = (Object[]) Array.newInstance(restrictedTypes[0].getValue().getClass(), + restrictedTypes.length); + for(int i = 0; i < restrictedTypes.length; i++) { - _cachedWriters.put(clazz, writer); + newVals[i] = restrictedTypes[i].getValue(); } - writer.setValue(value); - + return (ValueWriter<V>) getValueWriter(newVals); } - else if(value.getClass().isArray()) - { - if(RestrictedType.class.isAssignableFrom(value.getClass().getComponentType())) - { - RestrictedType[] restrictedTypes = (RestrictedType[]) value; - Object[] newVals = (Object[]) Array.newInstance(restrictedTypes[0].getValue().getClass(), - restrictedTypes.length); - for(int i = 0; i < restrictedTypes.length; i++) - { - newVals[i] = restrictedTypes[i].getValue(); - } - return (ValueWriter<V>) getValueWriter(newVals); - } - // TODO primitive array types - factory = _writerMap.get(List.class); - writer = factory.newInstance(this); - writer.setValue(Arrays.asList((Object[])value)); + // TODO primitive array types + factory = _writerMap.get(List.class); + writer = factory.newInstance(this); + writer.setValue(Arrays.asList((Object[])value)); - } - else - { - return null; - } } else { - writer = factory.newInstance(this); - if(writer.isCacheable()) - { - _cachedWriters.put(clazz, writer); - } - writer.setValue(value); + return null; } } else { + writer = factory.newInstance(this); writer.setValue(value); } + return writer; } |
