package org.codehaus.jackson.map.ser;
import java.io.*;
import java.lang.reflect.Type;
import java.util.*;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.util.Provider;
/**
* Class used for namespacing and to contain serializers for misc
* JDK types that can not use regular {@link ToStringSerializer} or
* such
*/
public class JdkSerializers
implements Provider<Map.Entry<Class<?>,JsonSerializer<?>>>
{
/**
* Method called by {@link BasicSerializerFactory} to access
* all serializers this class provides.
*/
public Collection<Map.Entry<Class<?>, JsonSerializer<?>>> provide()
{
HashMap<Class<?>,JsonSerializer<?>> sers = new HashMap<Class<?>,JsonSerializer<?>>();
// First things that 'toString()' can handle
final ToStringSerializer sls = ToStringSerializer.instance;
sers.put(java.net.URL.class, sls);
sers.put(java.net.URI.class, sls);
sers.put(Currency.class, sls);
sers.put(UUID.class, sls);
sers.put(java.util.regex.Pattern.class, sls);
// then types that need specialized serializers
sers.put(File.class, new FileSerializer());
sers.put(Class.class, new ClassSerializer());
// And then some stranger types... not 100% they are needed but:
sers.put(Void.TYPE, NullSerializer.instance);
return sers.entrySet();
}
/*
********************************************************
* Specialized serializers
********************************************************
*/
/**
* For now, File objects get serialized by just outputting
* absolute (but not canonical) name as String value
*/
public final static class FileSerializer
extends SerializerBase<File>
{
public FileSerializer() { super(File.class); }
@Override
public void serialize(File value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
jgen.writeString(value.getAbsolutePath());
}
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
{
return createSchemaNode("string", true);
}
}
/**
* Also: default bean access will not do much good with Class.class. But
* we can just serialize the class name and that should be enough.
*/
@SuppressWarnings("unchecked")
public final static class ClassSerializer
extends SerializerBase<Class>
{
public ClassSerializer() { super(Class.class); }
@Override
public void serialize(Class value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
jgen.writeString(value.getName());
}
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
throws JsonMappingException
{
return createSchemaNode("string", true);
}
}
}