Skip to content

Commit d4e92dc

Browse files
committed
Don't implement byte transfer as a facet.
1 parent 19a8c85 commit d4e92dc

File tree

4 files changed

+28
-61
lines changed

4 files changed

+28
-61
lines changed

src/main/java/com/amazon/ion/impl/IonReaderContinuableTopLevelBinary.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
* stream's values risk exceeding the available memory, then continuable reading must not be used.
4646
* </p>
4747
*/
48-
final class IonReaderContinuableTopLevelBinary extends IonReaderContinuableApplicationBinary implements IonReader, _Private_ReaderWriter {
48+
final class IonReaderContinuableTopLevelBinary extends IonReaderContinuableApplicationBinary implements IonReader, _Private_ReaderWriter, _Private_ByteTransferReader {
4949

5050
// True if continuable reading is disabled.
5151
private final boolean isNonContinuable;
@@ -316,12 +316,13 @@ public void hoist(Span span) {
316316
}
317317
}
318318

319-
private class ByteTransferReaderFacet implements _Private_ByteTransferReader {
320-
321-
@Override
322-
public void transferCurrentValue(_Private_ByteTransferSink writer) throws IOException {
323-
writer.writeBytes(buffer, (int) valuePreHeaderIndex, (int) (valueMarker.endIndex - valuePreHeaderIndex));
319+
@Override
320+
public boolean transferCurrentValue(_Private_ByteTransferSink writer) throws IOException {
321+
if (hasAnnotations || !isByteBacked() || isInStruct()) {
322+
return false;
324323
}
324+
writer.writeBytes(buffer, (int) valuePreHeaderIndex, (int) (valueMarker.endIndex - valuePreHeaderIndex));
325+
return true;
325326
}
326327

327328
@Override
@@ -343,11 +344,6 @@ public <T> T asFacet(Class<T> facetType) {
343344
if (facetType == RawValueSpanProvider.class) {
344345
return facetType.cast(new RawValueSpanProviderFacet());
345346
}
346-
if (facetType == _Private_ByteTransferReader.class) {
347-
if (!hasAnnotations && !isInStruct()) {
348-
return facetType.cast(new ByteTransferReaderFacet());
349-
}
350-
}
351347
}
352348
return null;
353349
}

src/main/java/com/amazon/ion/impl/_Private_ByteTransferReader.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
*/
2525
public interface _Private_ByteTransferReader
2626
{
27-
public void transferCurrentValue(_Private_ByteTransferSink writer)
27+
/**
28+
* Copies the raw bytes representing the current value, excluding any field name or annotations, if possible.
29+
* @param writer the sink for the bytes
30+
* @return true if the byte transfer occurred; false if it was not possible.
31+
* @throws IOException if thrown by the sink during transfer.
32+
*/
33+
public boolean transferCurrentValue(_Private_ByteTransferSink writer)
2834
throws IOException;
2935
}

src/main/java/com/amazon/ion/impl/bin/AbstractIonWriter.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,15 @@ public final void writeValue(final IonReader reader) throws IOException
5454
{
5555
final IonType type = reader.getType();
5656

57-
if (isStreamCopyOptimized())
57+
if (isStreamCopyOptimized() && reader instanceof _Private_ByteTransferReader)
5858
{
59-
final _Private_ByteTransferReader transferReader =
60-
reader.asFacet(_Private_ByteTransferReader.class);
61-
62-
if (transferReader != null
63-
&& (_Private_Utils.isNonSymbolScalar(type)
64-
|| symtabExtendsCache.symtabsCompat(getSymbolTable(), reader.getSymbolTable())))
59+
if (_Private_Utils.isNonSymbolScalar(type)
60+
|| symtabExtendsCache.symtabsCompat(getSymbolTable(), reader.getSymbolTable()))
6561
{
6662
// we have something we can pipe over
67-
transferReader.transferCurrentValue(this);
68-
return;
63+
if (((_Private_ByteTransferReader) reader).transferCurrentValue(this)) {
64+
return;
65+
}
6966
}
7067
}
7168

src/test/java/com/amazon/ion/impl/OptimizedBinaryWriterTestCase.java

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public abstract class OptimizedBinaryWriterTestCase
4646

4747
/**
4848
* Denotes whether the
49-
* {@link _Private_ByteTransferReader#transferCurrentValue(IonWriterSystemBinary)}
49+
* {@link _Private_ByteTransferReader#transferCurrentValue(_Private_ByteTransferSink)}
5050
* has been called after an {@link IonWriter#writeValue(IonReader)}.
5151
*/
5252
private boolean isTransferCurrentValueInvoked = false;
@@ -107,60 +107,28 @@ protected byte[] outputByteArray()
107107
return bytes;
108108
}
109109

110-
private class TransferCurrentValueWatchingReader
111-
implements _Private_ByteTransferReader
112-
{
113-
private final _Private_ByteTransferReader myDelegate;
114-
115-
TransferCurrentValueWatchingReader(_Private_ByteTransferReader byteTransferReader)
116-
{
117-
myDelegate = byteTransferReader;
118-
}
119-
120-
public void transferCurrentValue(_Private_ByteTransferSink sink)
121-
throws IOException
122-
{
123-
OptimizedBinaryWriterTestCase.this.isTransferCurrentValueInvoked = true;
124-
myDelegate.transferCurrentValue(sink);
125-
}
126-
}
127-
128110
/**
129111
* Obtains a dynamic proxy of {@link IonReader} over the passed in byte[],
130112
* with an invocation handler hook over {@link _Private_ByteTransferReader} facet,
131-
* so as to verify whether the transferCurrentValue() method is actually
113+
* to verify whether the transferCurrentValue() method is actually
132114
* being called.
133-
*
134-
* @see TransferCurrentValueWatchingReader
135115
*/
136116
protected IonReader makeReaderProxy(byte[] bytes)
137117
{
138118
final IonReader reader = system().newReader(bytes);
139119

140-
InvocationHandler handler = new InvocationHandler()
141-
{
142-
public Object invoke(Object proxy, Method method, Object[] args)
143-
throws Throwable
120+
InvocationHandler handler = (proxy, method, args) -> {
121+
if (method.getName().equals("transferCurrentValue"))
144122
{
145-
if (method.getName().equals("asFacet") &&
146-
args.length == 1 &&
147-
args[0] == _Private_ByteTransferReader.class)
148-
{
149-
_Private_ByteTransferReader transferReader =
150-
(_Private_ByteTransferReader) method.invoke(reader, args);
151-
152-
if (transferReader == null)
153-
return null;
154-
155-
return new TransferCurrentValueWatchingReader(transferReader);
156-
}
157-
123+
OptimizedBinaryWriterTestCase.this.isTransferCurrentValueInvoked = (boolean) method.invoke(reader, args);
124+
return isTransferCurrentValueInvoked;
125+
} else {
158126
return method.invoke(reader, args);
159127
}
160128
};
161129

162130
return (IonReader) newProxyInstance(reader.getClass().getClassLoader(),
163-
new Class[] { IonReader.class },
131+
new Class[] { IonReader.class, _Private_ByteTransferReader.class },
164132
handler);
165133
}
166134

0 commit comments

Comments
 (0)