package freemarker.ext.beans;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import freemarker.ext.util.ModelCache;
import freemarker.ext.util.ModelFactory;
import freemarker.template.TemplateModel;

public class BeansModelCache extends ModelCache
{
    private final Map classToFactory = new HashMap();
    private final Set mappedClassNames = new HashSet();

    private final BeansWrapper wrapper;
    
    BeansModelCache(BeansWrapper wrapper) {
        this.wrapper = wrapper;
    }
    
    protected boolean isCacheable(Object object) {
        return object.getClass() != Boolean.class; 
    }
    
    protected TemplateModel create(Object object) {
        Class clazz = object.getClass();

        ModelFactory factory;
        synchronized(classToFactory) {
            factory = (ModelFactory)classToFactory.get(clazz);
            if(factory == null) {
                String className = clazz.getName();
                // clear mappings when class reloading is detected
                if(!mappedClassNames.add(className)) {
                    classToFactory.clear();
                    mappedClassNames.clear();
                    mappedClassNames.add(className);
                }
                factory = wrapper.getModelFactory(clazz);
                classToFactory.put(clazz, factory);
            }
        }
        return factory.create(object, wrapper);
    }
}
