blob: 83641dbe47497b80fc2f4f53835458f87c1b3d16 [file] [log] [blame]
package org.codehaus.jackson.map.ser;
import java.util.*;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.introspect.BasicBeanDescription;
/**
* Builder class used for aggregating deserialization information about
* a POJO, in order to build a {@link JsonSerializer} for serializing
* intances.
* Main reason for using separate builder class is that this makes it easier
* to make actual serializer class fully immutable.
*
* @since 1.7
*/
public class BeanSerializerBuilder
{
private final static BeanPropertyWriter[] NO_PROPERTIES = new BeanPropertyWriter[0];
/*
/**********************************************************
/* General information about POJO
/**********************************************************
*/
final protected BasicBeanDescription _beanDesc;
/*
/**********************************************************
/* Accumulated information about properties
/**********************************************************
*/
/**
* Bean properties, in order of serialization
*/
protected List<BeanPropertyWriter> _properties;
/**
* Optional array of filtered property writers; if null, no
* view-based filtering is performed.
*/
protected BeanPropertyWriter[] _filteredProperties;
/**
* Writer used for "any getter" properties, if any.
*/
protected AnyGetterWriter _anyGetter;
/**
* Id of the property filter to use for POJO, if any.
*/
protected Object _filterId;
/*
/**********************************************************
/* Construction and setter methods
/**********************************************************
*/
public BeanSerializerBuilder(BasicBeanDescription beanDesc) {
_beanDesc = beanDesc;
}
/**
* Copy-constructor that may be used for sub-classing
*/
protected BeanSerializerBuilder(BeanSerializerBuilder src) {
_beanDesc = src._beanDesc;
_properties = src._properties;
_filteredProperties = src._filteredProperties;
_anyGetter = src._anyGetter;
_filterId = src._filterId;
}
public BasicBeanDescription getBeanDescription() { return _beanDesc; }
public List<BeanPropertyWriter> getProperties() { return _properties; }
public BeanPropertyWriter[] getFilteredProperties() { return _filteredProperties; }
/**
* @since 1.9
*/
public boolean hasProperties() {
return (_properties != null) && (_properties.size() > 0);
}
public void setProperties(List<BeanPropertyWriter> properties) {
_properties = properties;
}
public void setFilteredProperties(BeanPropertyWriter[] properties) {
_filteredProperties = properties;
}
public void setAnyGetter(AnyGetterWriter anyGetter) {
_anyGetter = anyGetter;
}
public void setFilterId(Object filterId) {
_filterId = filterId;
}
/*
/**********************************************************
/* Build methods for actually creating serializer instance
/**********************************************************
*/
/**
* Method called to create {@link BeanSerializer} instance with
* all accumulated information. Will construct a serializer if we
* have enough information, or return null if not.
*/
public JsonSerializer<?> build()
{
BeanPropertyWriter[] properties;
// No properties or any getter? No real serializer; caller gets to handle
if (_properties == null || _properties.isEmpty()) {
if (_anyGetter == null) {
return null;
}
properties = NO_PROPERTIES;
} else {
properties = _properties.toArray(new BeanPropertyWriter[_properties.size()]);
}
return new BeanSerializer(_beanDesc.getType(), properties, _filteredProperties, _anyGetter, _filterId);
}
/**
* Factory method for constructing an "empty" serializer; one that
* outputs no properties (but handles JSON objects properly, including
* type information)
*/
public BeanSerializer createDummy() {
return BeanSerializer.createDummy(_beanDesc.getBeanClass());
}
}