Open Source Repository

Home /json/flexjson-2.1 | Repository Home



flexjson/locators/TypeLocator.java
package flexjson.locators;

import flexjson.ClassLocator;
import flexjson.Path;
import flexjson.ObjectBinder;
import flexjson.JSONException;

import java.util.Map;
import java.util.HashMap;

/**
 * This implementation uses a single field out of the object as the type discriminator.
 * Each unique value of the type field is mapped to a java class using the
 {@link TypeLocator#add(Object, Class)} method.
 */
public class TypeLocator<T> implements ClassLocator {

    private String fieldname;
    private Map<T,Class> types = new HashMap<T,Class>();

    public TypeLocatorString fieldname ) {
        this.fieldname = fieldname;
    }

    public TypeLocator addT value, Class type ) {
        types.putvalue, type );
        return this;
    }

    public Class locate(ObjectBinder context, Path currentPaththrows ClassNotFoundException {
        Object source = context.getSource();
        ifsource instanceof Map ) {
            Map map = (Map)source;
            return types.getmap.getfieldname ) );
        else {
            throw new JSONExceptionString.format("%s: Don't know how to locate types for source %s using fieldname %s.  TypeLocator requires the source object be a java.util.Map in order to work.", context.getCurrentPath(), source.getClass(), fieldname ) );
        }
    }
}