add field case casing support for JsonBuilder

This commit is contained in:
kimchy 2010-04-09 15:36:27 +03:00
parent 152aa3553e
commit aa046cc18d
5 changed files with 70 additions and 2 deletions

View File

@ -8,6 +8,7 @@
<w>birthdate</w>
<w>bool</w>
<w>booleans</w>
<w>camelcase</w>
<w>checksum</w>
<w>closeable</w>
<w>commitable</w>

View File

@ -42,7 +42,9 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
private static final ThreadLocal<ThreadLocals.CleanableValue<BinaryJsonBuilder>> cache = new ThreadLocal<ThreadLocals.CleanableValue<BinaryJsonBuilder>>() {
@Override protected ThreadLocals.CleanableValue<BinaryJsonBuilder> initialValue() {
try {
return new ThreadLocals.CleanableValue<BinaryJsonBuilder>(new BinaryJsonBuilder());
BinaryJsonBuilder builder = new BinaryJsonBuilder();
builder.cachedStringBuilder = new StringBuilder();
return new ThreadLocals.CleanableValue<BinaryJsonBuilder>(builder);
} catch (IOException e) {
throw new ElasticSearchException("Failed to create json generator", e);
}
@ -63,6 +65,8 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
private final JsonFactory factory;
private StringBuilder cachedStringBuilder;
public BinaryJsonBuilder() throws IOException {
this(Jackson.defaultJsonFactory());
}
@ -81,6 +85,10 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
this.builder = this;
}
@Override protected StringBuilder cachedStringBuilder() {
return cachedStringBuilder;
}
@Override public BinaryJsonBuilder raw(byte[] json) throws IOException {
flush();
bos.write(json);
@ -88,6 +96,7 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
}
@Override public BinaryJsonBuilder reset() throws IOException {
fieldCaseConversion = globalFieldCaseConversion;
bos.reset();
generator = factory.createJsonGenerator(bos, JsonEncoding.UTF8);
return this;

View File

@ -19,6 +19,7 @@
package org.elasticsearch.util.json;
import org.elasticsearch.util.Strings;
import org.elasticsearch.util.concurrent.NotThreadSafe;
import org.joda.time.DateTimeZone;
import org.joda.time.ReadableInstant;
@ -39,12 +40,35 @@ import java.util.Date;
@NotThreadSafe
public abstract class JsonBuilder<T extends JsonBuilder> {
public static enum FieldCaseConversion {
/**
* No came conversion will occur.
*/
NONE,
/**
* Camel Case will be converted to Underscore casing.
*/
UNDERSCORE,
/**
* Underscore will be converted to Camel case conversion.
*/
CAMELCASE
}
private final static DateTimeFormatter defaultDatePrinter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
protected static FieldCaseConversion globalFieldCaseConversion = FieldCaseConversion.CAMELCASE;
public static void globalFieldCaseConversion(FieldCaseConversion globalFieldCaseConversion) {
JsonBuilder.globalFieldCaseConversion = globalFieldCaseConversion;
}
protected org.codehaus.jackson.JsonGenerator generator;
protected T builder;
protected FieldCaseConversion fieldCaseConversion = globalFieldCaseConversion;
public static StringJsonBuilder stringJsonBuilder() throws IOException {
return StringJsonBuilder.Cached.cached();
}
@ -57,6 +81,11 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
return BinaryJsonBuilder.Cached.cached();
}
public T fieldCaseConversion(FieldCaseConversion fieldCaseConversion) {
this.fieldCaseConversion = fieldCaseConversion;
return builder;
}
public T prettyPrint() {
generator.useDefaultPrettyPrinter();
return builder;
@ -113,6 +142,11 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
}
public T field(String name) throws IOException {
if (fieldCaseConversion == FieldCaseConversion.UNDERSCORE) {
name = Strings.toUnderscoreCase(name);
} else if (fieldCaseConversion == FieldCaseConversion.CAMELCASE) {
name = Strings.toCamelCase(name);
}
generator.writeFieldName(name);
return builder;
}
@ -369,6 +403,10 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
public abstract String string() throws IOException;
protected StringBuilder cachedStringBuilder() {
return null;
}
public void close() {
try {
generator.close();

View File

@ -44,7 +44,9 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
private static final ThreadLocal<ThreadLocals.CleanableValue<StringJsonBuilder>> cache = new ThreadLocal<ThreadLocals.CleanableValue<StringJsonBuilder>>() {
@Override protected ThreadLocals.CleanableValue<StringJsonBuilder> initialValue() {
try {
return new ThreadLocals.CleanableValue<StringJsonBuilder>(new StringJsonBuilder());
StringJsonBuilder builder = new StringJsonBuilder();
builder.cachedStringBuilder = new StringBuilder();
return new ThreadLocals.CleanableValue<StringJsonBuilder>(builder);
} catch (IOException e) {
throw new ElasticSearchException("Failed to create json generator", e);
}
@ -67,6 +69,8 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
final UnicodeUtil.UTF8Result utf8Result = new UnicodeUtil.UTF8Result();
private StringBuilder cachedStringBuilder;
public StringJsonBuilder() throws IOException {
this(Jackson.defaultJsonFactory());
}
@ -85,6 +89,10 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
this.builder = this;
}
@Override protected StringBuilder cachedStringBuilder() {
return cachedStringBuilder;
}
@Override public StringJsonBuilder raw(byte[] json) throws IOException {
flush();
Unicode.UTF16Result result = Unicode.unsafeFromBytesAsUtf16(json);
@ -93,6 +101,7 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
}
public StringJsonBuilder reset() throws IOException {
fieldCaseConversion = globalFieldCaseConversion;
writer.reset();
generator = factory.createJsonGenerator(writer);
return this;

View File

@ -33,6 +33,7 @@ import java.util.Date;
import java.util.Map;
import static org.elasticsearch.util.json.Jackson.*;
import static org.elasticsearch.util.json.JsonBuilder.FieldCaseConversion.*;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
@ -100,4 +101,14 @@ public class JsonBuilderTests {
.map();
System.out.println("Data: " + defaultObjectMapper().writeValueAsString(data));
}
@Test public void testFieldCaseConversion() throws Exception {
StringJsonBuilder builder = JsonBuilder.stringJsonBuilder().fieldCaseConversion(CAMELCASE);
builder.startObject().field("test_name", "value").endObject();
assertThat(builder.string(), equalTo("{\"testName\":\"value\"}"));
builder = JsonBuilder.stringJsonBuilder().fieldCaseConversion(UNDERSCORE);
builder.startObject().field("testName", "value").endObject();
assertThat(builder.string(), equalTo("{\"test_name\":\"value\"}"));
}
}