blob: db474d2b112602b04a4524f3b08787a1b6e393e1 [file] [log] [blame]
package org.codehaus.jackson.map.ser;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
/**
* Decorated {@link BeanPropertyWriter} that will filter out
* properties that are not to be included in currently active
* JsonView.
*
* @since 1.4
*/
public abstract class FilteredBeanPropertyWriter
{
public static BeanPropertyWriter constructViewBased(BeanPropertyWriter base, Class<?>[] viewsToIncludeIn)
{
if (viewsToIncludeIn.length == 1) {
return new SingleView(base, viewsToIncludeIn[0]);
}
return new MultiView(base, viewsToIncludeIn);
}
/*
/**********************************************************
/* Concrete sub-classes
/**********************************************************
*/
private final static class SingleView
extends BeanPropertyWriter
{
protected final BeanPropertyWriter _delegate;
protected final Class<?> _view;
protected SingleView(BeanPropertyWriter delegate, Class<?> view)
{
super(delegate);
_delegate = delegate;
_view = view;
}
@Override
public BeanPropertyWriter withSerializer(JsonSerializer<Object> ser) {
return new SingleView(_delegate.withSerializer(ser), _view);
}
@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov)
throws Exception
{
Class<?> activeView = prov.getSerializationView();
if (activeView == null || _view.isAssignableFrom(activeView)) {
_delegate.serializeAsField(bean, jgen, prov);
}
}
}
private final static class MultiView
extends BeanPropertyWriter
{
protected final BeanPropertyWriter _delegate;
protected final Class<?>[] _views;
protected MultiView(BeanPropertyWriter delegate, Class<?>[] views) {
super(delegate);
_delegate = delegate;
_views = views;
}
@Override
public BeanPropertyWriter withSerializer(JsonSerializer<Object> ser) {
return new MultiView(_delegate.withSerializer(ser), _views);
}
@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov)
throws Exception
{
final Class<?> activeView = prov.getSerializationView();
if (activeView != null) {
int i = 0, len = _views.length;
for (; i < len; ++i) {
if (_views[i].isAssignableFrom(activeView)) break;
}
// not included, bail out:
if (i == len) {
return;
}
}
_delegate.serializeAsField(bean, jgen, prov);
}
}
}