package com.fasterxml.jackson.databind;
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.core.base.ParserBase;
import com.fasterxml.jackson.core.base.GeneratorBase;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Basic tests to ensure that {@link FormatSchema} instances are properly
* passed to {@link JsonGenerator} and {@link JsonParser} instances if
* mapper, reader or writer is configured with one.
*/
public class TestFormatSchema extends BaseMapTest
{
/*
/**********************************************************************
/* Helper classes
/**********************************************************************
*/
static class MySchema implements FormatSchema {
@Override
public String getSchemaType() { return "test"; }
}
static class FactoryWithSchema extends JsonFactory
{
@Override
public String getFormatName() { return "test"; }
@Override
public boolean canUseSchema(FormatSchema schema) {
return (schema instanceof MySchema);
}
private static final long serialVersionUID = 1L;
@Override
protected JsonParser _createParser(Reader r, IOContext ctxt)
throws IOException, JsonParseException
{
return new ParserWithSchema(ctxt, _parserFeatures);
}
@Override
protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException
{
return new GeneratorWithSchema(_generatorFeatures, _objectCodec);
}
}
// Ugly, but easiest way to get schema back is to throw exception...
@SuppressWarnings("serial")
static class SchemaException extends RuntimeException
{
public final FormatSchema _schema;
public SchemaException(FormatSchema s) {
_schema = s;
}
}
static class ParserWithSchema extends ParserBase
{
public ParserWithSchema(IOContext ioCtxt, int features)
{
super(ioCtxt, features);
}
@Override
public void setSchema(FormatSchema schema) {
throw new SchemaException(schema);
}
@Override
protected void _finishString() throws IOException, JsonParseException { }
@Override
public byte[] getBinaryValue(Base64Variant b64variant) {
return null;
}
@Override
public byte[] getEmbeddedObject() {
return null;
}
@Override
public String getText() throws IOException, JsonParseException {
return null;
}
@Override
public char[] getTextCharacters() throws IOException {
return null;
}
@Override
public int getTextLength() throws IOException, JsonParseException {
return 0;
}
@Override
public int getTextOffset() throws IOException, JsonParseException {
return 0;
}
@Override
public JsonToken nextToken() throws IOException, JsonParseException {
return null;
}
@Override
public ObjectCodec getCodec() {
return null;
}
@Override
public void setCodec(ObjectCodec c) { }
@Override
protected void _closeInput() throws IOException {
}
@Override
public int readBinaryValue(Base64Variant b64variant, OutputStream out) {
return 0;
}
}
static class GeneratorWithSchema extends GeneratorBase
{
public GeneratorWithSchema(int features, ObjectCodec codec)
{
super(features, codec);
}
@Override
public void setSchema(FormatSchema schema) {
throw new SchemaException(schema);
}
@Override
protected void _releaseBuffers() { }
@Override
protected void _verifyValueWrite(String typeMsg) throws IOException { }
@Override
public void flush() throws IOException { }
@Override
public void writeBinary(Base64Variant b64variant, byte[] data,
int offset, int len) throws IOException { }
@Override
public void writeBoolean(boolean state) throws IOException { }
@Override
public void writeFieldName(String name) throws IOException { }
@Override
public void writeNull() throws IOException, JsonGenerationException { }
@Override
public void writeNumber(short v) throws IOException { }
@Override
public void writeNumber(int v) throws IOException { }
@Override
public void writeNumber(long v) throws IOException { }
@Override
public void writeNumber(BigInteger v) throws IOException { }
@Override
public void writeNumber(double d) throws IOException { }
@Override
public void writeNumber(float f) throws IOException { }
@Override
public void writeNumber(BigDecimal dec) throws IOException { }
@Override
public void writeNumber(String encodedValue) throws IOException { }
@Override
public void writeRaw(String text) throws IOException { }
@Override
public void writeRaw(String text, int offset, int len) { }
@Override
public void writeRaw(char[] text, int offset, int len) { }
@Override
public void writeRaw(char c) throws IOException { }
@Override
public void writeRawUTF8String(byte[] text, int offset, int length) { }
@Override
public void writeString(String text) throws IOException { }
@Override
public void writeString(char[] text, int offset, int len) { }
@Override
public void writeUTF8String(byte[] text, int offset, int length) { }
@Override
public void writeStartArray() { }
@Override
public void writeEndArray() throws IOException, JsonGenerationException { }
@Override
public void writeStartObject() { }
@Override
public void writeEndObject() { }
@Override
public int writeBinary(Base64Variant b64variant, InputStream data, int dataLength) {
return -1;
}
}
/*
/**********************************************************************
/* Unit tests
/**********************************************************************
*/
public void testFormatForParsers() throws Exception
{
ObjectMapper mapper = new ObjectMapper(new FactoryWithSchema());
MySchema s = new MySchema();
StringReader r = new StringReader("{}");
// bit ugly, but can't think of cleaner simple way to check this...
try {
mapper.reader(s).forType(Object.class).readValue(r);
fail("Excpected exception");
} catch (SchemaException e) {
assertSame(s, e._schema);
}
}
public void testFormatForGenerators() throws Exception
{
ObjectMapper mapper = new ObjectMapper(new FactoryWithSchema());
MySchema s = new MySchema();
StringWriter sw = new StringWriter();
// bit ugly, but can't think of cleaner simple way to check this...
try {
mapper.writer(s).writeValue(sw, "Foobar");
fail("Excpected exception");
} catch (SchemaException e) {
assertSame(s, e._schema);
}
}
}