summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2013-01-23 14:36:10 +0100
committerBenoit Foucher <benoit@zeroc.com>2013-01-23 14:36:10 +0100
commit66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0 (patch)
treebd6aca447179f8d2e586c12cb961d683552504be /java/src
parentMinor code style fixes (diff)
downloadice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.tar.bz2
ice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.tar.xz
ice-66bf1a7f2d0d46281ebf3d62caab6b9158eaa8a0.zip
Fix for ICE-4841 - added no copy option when creating input stream
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Freeze/ObjectStore.java16
-rw-r--r--java/src/Ice/InputStreamI.java31
-rw-r--r--java/src/Ice/Util.java37
-rw-r--r--java/src/IceInternal/BasicStream.java15
-rw-r--r--java/src/IceInternal/Buffer.java13
5 files changed, 80 insertions, 32 deletions
diff --git a/java/src/Freeze/ObjectStore.java b/java/src/Freeze/ObjectStore.java
index 82ccc40ac55..17c6c35f836 100644
--- a/java/src/Freeze/ObjectStore.java
+++ b/java/src/Freeze/ObjectStore.java
@@ -310,13 +310,8 @@ class ObjectStore implements IceUtil.Store
static Ice.Identity
unmarshalKey(byte[] b, Ice.Communicator communicator, Ice.EncodingVersion encoding)
{
- IceInternal.BasicStream is =
- new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, true, false);
- is.resize(b.length, true);
- IceInternal.Buffer buf = is.getBuffer();
- buf.b.position(0);
- buf.b.put(b);
- buf.b.position(0);
+ IceInternal.BasicStream is =
+ new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, b);
Ice.Identity key = new Ice.Identity();
key.__read(is);
return key;
@@ -349,13 +344,8 @@ class ObjectStore implements IceUtil.Store
unmarshalValue(byte[] b, Ice.Communicator communicator, Ice.EncodingVersion encoding, boolean keepStats)
{
IceInternal.BasicStream is =
- new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, true, false);
+ new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, b);
is.sliceObjects(false);
- is.resize(b.length, true);
- IceInternal.Buffer buf = is.getBuffer();
- buf.b.position(0);
- buf.b.put(b);
- buf.b.position(0);
ObjectRecord rec = new ObjectRecord();
is.startReadEncaps();
if(keepStats)
diff --git a/java/src/Ice/InputStreamI.java b/java/src/Ice/InputStreamI.java
index 68676199847..2fd21254f57 100644
--- a/java/src/Ice/InputStreamI.java
+++ b/java/src/Ice/InputStreamI.java
@@ -12,32 +12,37 @@ package Ice;
public class InputStreamI implements InputStream
{
public
- InputStreamI(Communicator communicator, byte[] data)
+ InputStreamI(Communicator communicator, byte[] data, boolean copyData)
{
_communicator = communicator;
IceInternal.Instance instance = IceInternal.Util.getInstance(communicator);
- _is = new IceInternal.BasicStream(instance, instance.defaultsAndOverrides().defaultEncoding, true, false);
- initialize(data);
+ initialize(instance, data, instance.defaultsAndOverrides().defaultEncoding, copyData);
}
public
- InputStreamI(Communicator communicator, byte[] data, EncodingVersion v)
+ InputStreamI(Communicator communicator, byte[] data, EncodingVersion v, boolean copyData)
{
_communicator = communicator;
- IceInternal.Instance instance = IceInternal.Util.getInstance(communicator);
- _is = new IceInternal.BasicStream(instance, v, true, false);
- initialize(data);
+ initialize(IceInternal.Util.getInstance(communicator), data, v, copyData);
}
private void
- initialize(byte[] data)
+ initialize(IceInternal.Instance instance, byte[] data, EncodingVersion v, boolean copyData)
{
+ if(copyData)
+ {
+ _is = new IceInternal.BasicStream(instance, v, true, false);
+ _is.resize(data.length, true);
+ IceInternal.Buffer buf = _is.getBuffer();
+ buf.b.position(0);
+ buf.b.put(data);
+ buf.b.position(0);
+ }
+ else
+ {
+ _is = new IceInternal.BasicStream(instance, v, data);
+ }
_is.closure(this);
- _is.resize(data.length, true);
- IceInternal.Buffer buf = _is.getBuffer();
- buf.b.position(0);
- buf.b.put(data);
- buf.b.position(0);
}
public Communicator
diff --git a/java/src/Ice/Util.java b/java/src/Ice/Util.java
index 328aee186fa..049d82f0e7f 100644
--- a/java/src/Ice/Util.java
+++ b/java/src/Ice/Util.java
@@ -440,7 +440,7 @@ public final class Util
public static InputStream
createInputStream(Communicator communicator, byte[] bytes)
{
- return new InputStreamI(communicator, bytes);
+ return createInputStream(communicator, bytes, true);
}
/**
@@ -455,7 +455,40 @@ public final class Util
public static InputStream
createInputStream(Communicator communicator, byte[] bytes, EncodingVersion v)
{
- return new InputStreamI(communicator, bytes, v);
+ return createInputStream(communicator, bytes, v, true);
+ }
+
+ /**
+ * Creates an input stream for dynamic invocation and dispatch. The stream uses
+ * the communicator's default encoding version.
+ *
+ * @param communicator The communicator for the stream.
+ * @param bytes An encoded request or reply.
+ * @param copyBytes True if the given bytes should be copied,
+ * false otherwise.
+ * @return The input stream.
+ **/
+ public static InputStream
+ createInputStream(Communicator communicator, byte[] bytes, boolean copyBytes)
+ {
+ return new InputStreamI(communicator, bytes, copyBytes);
+ }
+
+ /**
+ * Creates an input stream for dynamic invocation and dispatch. The stream uses
+ * the given encoding version.
+ *
+ * @param communicator The communicator for the stream.
+ * @param bytes An encoded request or reply.
+ * @param v The desired encoding version.
+ * @param copyBytes True if the given bytes should be copied,
+ * false otherwise.
+ * @return The input stream.
+ **/
+ public static InputStream
+ createInputStream(Communicator communicator, byte[] bytes, EncodingVersion v, boolean copyBytes)
+ {
+ return new InputStreamI(communicator, bytes, v, copyBytes);
}
/**
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index c8e9f819605..f3d4966b6e8 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -20,20 +20,27 @@ public class BasicStream
public
BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited)
{
- initialize(instance, encoding, unlimited, instance.cacheMessageBuffers() > 1);
+ this(instance, encoding, unlimited, instance.cacheMessageBuffers() > 1);
}
public
BasicStream(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct)
{
- initialize(instance, encoding, unlimited, direct);
+ initialize(instance, encoding, unlimited);
+ _buf = new Buffer(_instance.messageSizeMax(), direct);
+ }
+
+ public
+ BasicStream(Instance instance, Ice.EncodingVersion encoding, byte[] data)
+ {
+ initialize(instance, encoding, true);
+ _buf = new Buffer(data);
}
private void
- initialize(Instance instance, Ice.EncodingVersion encoding, boolean unlimited, boolean direct)
+ initialize(Instance instance, Ice.EncodingVersion encoding, boolean unlimited)
{
_instance = instance;
- _buf = new Buffer(_instance.messageSizeMax(), direct);
_closure = null;
_encoding = encoding;
diff --git a/java/src/IceInternal/Buffer.java b/java/src/IceInternal/Buffer.java
index 3f880586719..e2182243785 100644
--- a/java/src/IceInternal/Buffer.java
+++ b/java/src/IceInternal/Buffer.java
@@ -25,6 +25,17 @@ public class Buffer
_direct = direct;
}
+ public
+ Buffer(byte[] data)
+ {
+ b = java.nio.ByteBuffer.wrap(data);
+ b.order(java.nio.ByteOrder.LITTLE_ENDIAN);
+ _size = data.length;
+ _capacity = 0;
+ _maxCapacity = 0;
+ _direct = false;
+ }
+
public int
size()
{
@@ -64,6 +75,8 @@ public class Buffer
public void
resize(int n, boolean reading)
{
+ assert(b == _emptyBuffer || _capacity > 0);
+
if(n == 0)
{
clear();