summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2013-05-09 10:00:28 +0000
committerRobert Godfrey <rgodfrey@apache.org>2013-05-09 10:00:28 +0000
commit74b560985b35ceb6e5f82e80e388d425ff4cfb8e (patch)
tree6e2e990b39ce60da45cdf239aca82d4f3f3e5484
parent669d382706e6bb414a710aaf3e8565c4ba6fa0f8 (diff)
downloadqpid-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
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java3
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java2
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java99
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;
}