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>birthdate</w>
<w>bool</w> <w>bool</w>
<w>booleans</w> <w>booleans</w>
<w>camelcase</w>
<w>checksum</w> <w>checksum</w>
<w>closeable</w> <w>closeable</w>
<w>commitable</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>>() { private static final ThreadLocal<ThreadLocals.CleanableValue<BinaryJsonBuilder>> cache = new ThreadLocal<ThreadLocals.CleanableValue<BinaryJsonBuilder>>() {
@Override protected ThreadLocals.CleanableValue<BinaryJsonBuilder> initialValue() { @Override protected ThreadLocals.CleanableValue<BinaryJsonBuilder> initialValue() {
try { 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) { } catch (IOException e) {
throw new ElasticSearchException("Failed to create json generator", 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 final JsonFactory factory;
private StringBuilder cachedStringBuilder;
public BinaryJsonBuilder() throws IOException { public BinaryJsonBuilder() throws IOException {
this(Jackson.defaultJsonFactory()); this(Jackson.defaultJsonFactory());
} }
@ -81,6 +85,10 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
this.builder = this; this.builder = this;
} }
@Override protected StringBuilder cachedStringBuilder() {
return cachedStringBuilder;
}
@Override public BinaryJsonBuilder raw(byte[] json) throws IOException { @Override public BinaryJsonBuilder raw(byte[] json) throws IOException {
flush(); flush();
bos.write(json); bos.write(json);
@ -88,6 +96,7 @@ public class BinaryJsonBuilder extends JsonBuilder<BinaryJsonBuilder> {
} }
@Override public BinaryJsonBuilder reset() throws IOException { @Override public BinaryJsonBuilder reset() throws IOException {
fieldCaseConversion = globalFieldCaseConversion;
bos.reset(); bos.reset();
generator = factory.createJsonGenerator(bos, JsonEncoding.UTF8); generator = factory.createJsonGenerator(bos, JsonEncoding.UTF8);
return this; return this;

View File

@ -19,6 +19,7 @@
package org.elasticsearch.util.json; package org.elasticsearch.util.json;
import org.elasticsearch.util.Strings;
import org.elasticsearch.util.concurrent.NotThreadSafe; import org.elasticsearch.util.concurrent.NotThreadSafe;
import org.joda.time.DateTimeZone; import org.joda.time.DateTimeZone;
import org.joda.time.ReadableInstant; import org.joda.time.ReadableInstant;
@ -39,12 +40,35 @@ import java.util.Date;
@NotThreadSafe @NotThreadSafe
public abstract class JsonBuilder<T extends JsonBuilder> { 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); 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 org.codehaus.jackson.JsonGenerator generator;
protected T builder; protected T builder;
protected FieldCaseConversion fieldCaseConversion = globalFieldCaseConversion;
public static StringJsonBuilder stringJsonBuilder() throws IOException { public static StringJsonBuilder stringJsonBuilder() throws IOException {
return StringJsonBuilder.Cached.cached(); return StringJsonBuilder.Cached.cached();
} }
@ -57,6 +81,11 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
return BinaryJsonBuilder.Cached.cached(); return BinaryJsonBuilder.Cached.cached();
} }
public T fieldCaseConversion(FieldCaseConversion fieldCaseConversion) {
this.fieldCaseConversion = fieldCaseConversion;
return builder;
}
public T prettyPrint() { public T prettyPrint() {
generator.useDefaultPrettyPrinter(); generator.useDefaultPrettyPrinter();
return builder; return builder;
@ -113,6 +142,11 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
} }
public T field(String name) throws IOException { 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); generator.writeFieldName(name);
return builder; return builder;
} }
@ -369,6 +403,10 @@ public abstract class JsonBuilder<T extends JsonBuilder> {
public abstract String string() throws IOException; public abstract String string() throws IOException;
protected StringBuilder cachedStringBuilder() {
return null;
}
public void close() { public void close() {
try { try {
generator.close(); 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>>() { private static final ThreadLocal<ThreadLocals.CleanableValue<StringJsonBuilder>> cache = new ThreadLocal<ThreadLocals.CleanableValue<StringJsonBuilder>>() {
@Override protected ThreadLocals.CleanableValue<StringJsonBuilder> initialValue() { @Override protected ThreadLocals.CleanableValue<StringJsonBuilder> initialValue() {
try { 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) { } catch (IOException e) {
throw new ElasticSearchException("Failed to create json generator", 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(); final UnicodeUtil.UTF8Result utf8Result = new UnicodeUtil.UTF8Result();
private StringBuilder cachedStringBuilder;
public StringJsonBuilder() throws IOException { public StringJsonBuilder() throws IOException {
this(Jackson.defaultJsonFactory()); this(Jackson.defaultJsonFactory());
} }
@ -85,6 +89,10 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
this.builder = this; this.builder = this;
} }
@Override protected StringBuilder cachedStringBuilder() {
return cachedStringBuilder;
}
@Override public StringJsonBuilder raw(byte[] json) throws IOException { @Override public StringJsonBuilder raw(byte[] json) throws IOException {
flush(); flush();
Unicode.UTF16Result result = Unicode.unsafeFromBytesAsUtf16(json); Unicode.UTF16Result result = Unicode.unsafeFromBytesAsUtf16(json);
@ -93,6 +101,7 @@ public class StringJsonBuilder extends JsonBuilder<StringJsonBuilder> {
} }
public StringJsonBuilder reset() throws IOException { public StringJsonBuilder reset() throws IOException {
fieldCaseConversion = globalFieldCaseConversion;
writer.reset(); writer.reset();
generator = factory.createJsonGenerator(writer); generator = factory.createJsonGenerator(writer);
return this; return this;

View File

@ -33,6 +33,7 @@ import java.util.Date;
import java.util.Map; import java.util.Map;
import static org.elasticsearch.util.json.Jackson.*; import static org.elasticsearch.util.json.Jackson.*;
import static org.elasticsearch.util.json.JsonBuilder.FieldCaseConversion.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
@ -100,4 +101,14 @@ public class JsonBuilderTests {
.map(); .map();
System.out.println("Data: " + defaultObjectMapper().writeValueAsString(data)); 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\"}"));
}
} }