Skip to content

Alternate approach for issue #17 #353

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 23, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
*/
package com.fasterxml.jackson.core;

import static com.fasterxml.jackson.core.JsonTokenId.*;
import com.fasterxml.jackson.core.JsonParser.NumberType;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.util.VersionUtil;

import java.io.*;
import java.math.BigDecimal;
Expand All @@ -13,9 +15,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import com.fasterxml.jackson.core.JsonParser.NumberType;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.util.VersionUtil;
import static com.fasterxml.jackson.core.JsonTokenId.*;

/**
* Base class that defines public API for writing JSON content.
Expand Down Expand Up @@ -932,6 +932,18 @@ public void writeArray(double[] array, int offset, int length) throws IOExceptio
*/
public abstract void writeString(String text) throws IOException;

/**
* Method for outputting a String value. Depending on context
* this means either array element, (object) field value or
* a stand alone String; but in all cases, String will be
* surrounded in double quotes, and contents will be properly
* escaped as required by JSON specification.
* If the reader is null, then write a null.
* If len is < 0, then write all contents of the reader.
* Otherwise, write only len characters.
*/
public abstract void writeString(Reader reader, int len) throws IOException;

/**
* Method for outputting a String value. Depending on context
* this means either array element, (object) field value or
Expand Down
14 changes: 11 additions & 3 deletions src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package com.fasterxml.jackson.core.base;

import java.io.*;
import java.math.BigDecimal;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.json.DupDetector;
import com.fasterxml.jackson.core.json.JsonWriteContext;
import com.fasterxml.jackson.core.json.PackageVersion;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;

/**
* This base class implements part of API that a JSON generator exposes
* to applications, adds shared internal methods that sub-classes
Expand Down Expand Up @@ -339,6 +341,12 @@ public int writeBinary(Base64Variant b64variant, InputStream data, int dataLengt
return 0;
}

@Override
public void writeString(Reader reader, int len) throws IOException {
// Let's implement this as "unsupported" to make it easier to add new parser impls
_reportUnsupportedOperation();
}

/*
/**********************************************************
/* Public API, write methods, primitive
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package com.fasterxml.jackson.core.json;

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.CharTypes;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.core.io.NumberOutput;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.*;

public class UTF8JsonGenerator
extends JsonGeneratorImpl
{
Expand Down Expand Up @@ -461,6 +467,54 @@ public void writeString(String text) throws IOException
_outputBuffer[_outputTail++] = _quoteChar;
}

@Override
public void writeString(Reader reader, int len) throws IOException {
_verifyValueWrite(WRITE_STRING);
if (reader == null) {
_reportError("null reader");
}

int toRead = (len >= 0) ? len : Integer.MAX_VALUE;

//TODO: Check that this use is OK
final char[] buf = _charBuffer;

//Add leading quote
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = _quoteChar;

//read
while(toRead > 0){
int toReadNow = Math.min(toRead, buf.length);
if(toRead <= 0){
break;
}
int numRead = reader.read(buf, 0, toReadNow);
if(numRead <= 0){
break;
}
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_writeStringSegments(buf, 0, numRead);

//decrease tracker
toRead -= numRead;
}

//Add trailing quote
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = _quoteChar;

if(toRead > 0 && len >= 0){
_reportError("Didn't read enough from reader");
}
}

@Override
public void writeString(char[] text, int offset, int len) throws IOException
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package com.fasterxml.jackson.core.json;

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.CharTypes;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.core.io.NumberOutput;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.*;

/**
* {@link JsonGenerator} that outputs JSON content using a {@link java.io.Writer}
* which handles character encoding.
Expand Down Expand Up @@ -69,6 +75,17 @@ public class WriterBasedJsonGenerator
*/
protected char[] _entityBuffer;

/**
* Intermediate buffer in which characters of a String are copied
* before being encoded.
*/
protected char[] _charBuffer;

/**
* Length of <code>_charBuffer</code>
*/
protected final int _charBufferLength;

/**
* When custom escapes are used, this member variable is used
* internally to hold a reference to currently used escape
Expand All @@ -88,6 +105,8 @@ public WriterBasedJsonGenerator(IOContext ctxt, int features,
_writer = w;
_outputBuffer = ctxt.allocConcatBuffer();
_outputEnd = _outputBuffer.length;
_charBuffer = new char[_outputBuffer.length];
_charBufferLength = _charBuffer.length;
}

/*
Expand Down Expand Up @@ -371,6 +390,54 @@ public void writeString(String text) throws IOException
_outputBuffer[_outputTail++] = _quoteChar;
}

@Override
public void writeString(Reader reader, int len) throws IOException {
_verifyValueWrite(WRITE_STRING);
if (reader == null) {
_reportError("null reader");
} else {
int toRead = (len >= 0) ? len : Integer.MAX_VALUE;

//TODO: Check that this use is OK
final char[] buf = _charBuffer;

//Add leading quote
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = _quoteChar;

//read
while (toRead > 0) {
int toReadNow = Math.min(toRead, buf.length);
if (toRead <= 0) {
break;
}
int numRead = reader.read(buf, 0, toReadNow);
if (numRead <= 0) {
break;
}
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_writeString(buf, 0, numRead);

//decrease tracker
toRead -= numRead;
}

//Add trailing quote
if ((_outputTail + len) >= _outputEnd) {
_flushBuffer();
}
_outputBuffer[_outputTail++] = _quoteChar;

if (toRead > 0 && len >= 0) {
_reportError("Didn't read enough from reader");
}
}
}

@Override
public void writeString(char[] text, int offset, int len) throws IOException
{
Expand Down Expand Up @@ -890,6 +957,7 @@ protected void _releaseBuffers()
_outputBuffer = null;
_ioContext.releaseConcatBuffer(buf);
}
_charBuffer = null;
}

/*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.fasterxml.jackson.core.util;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.CharacterEscapes;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.CharacterEscapes;

public class JsonGeneratorDelegate extends JsonGenerator
{
/**
Expand Down Expand Up @@ -246,6 +247,11 @@ public void writeArray(double[] array, int offset, int length) throws IOExceptio
@Override
public void writeString(String text) throws IOException { delegate.writeString(text); }

@Override
public void writeString(Reader reader, int len) throws IOException {
delegate.writeString(reader, len);
}

@Override
public void writeString(char[] text, int offset, int len) throws IOException { delegate.writeString(text, offset, len); }

Expand Down
Loading