All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.fhframework.binding.DesignerModelBinding Maven / Gradle / Ivy

package pl.fhframework.binding;

import pl.fhframework.core.FhFormException;
import pl.fhframework.BindingResult;
import pl.fhframework.annotations.DesignerXMLProperty;
import pl.fhframework.annotations.RepeaterTraversable;
import pl.fhframework.annotations.XMLProperty;
import pl.fhframework.format.FhConversionService;
import pl.fhframework.model.forms.Component;
import pl.fhframework.model.forms.Form;
import pl.fhframework.model.forms.designer.IDesignerPreviewProvider;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by Adam Zareba on 16.03.2017. Binding class simulating fake binding for designer
 * purpose.
 */
@RepeaterTraversable
public class DesignerModelBinding extends AdHocModelBinding {

    private static Map, IDesignerPreviewProvider> PROVIDERS_CACHE = new ConcurrentHashMap<>();

    /**
     * Attribute xmlProperty.
     */
    private Field field;
    private XMLProperty xmlProperty;
    private DesignerXMLProperty designerXmlProperty;
    private FhConversionService conversionService;

    public DesignerModelBinding(Form form, Component owner, String bindingExpression, Field field, FhConversionService conversionService) {
        super(form, owner, bindingExpression);
        this.xmlProperty = field.getAnnotation(XMLProperty.class);
        this.designerXmlProperty = field.getAnnotation(DesignerXMLProperty.class);
        if (this.designerXmlProperty == null) {
            this.designerXmlProperty = DesignerXMLProperty.Defaults.getDefaults();
        }
        this.field = field;
        this.conversionService = conversionService;
    }

    public BindingResult getBindingResult() {
        //FIXME Unused classes , shuldn't it be checked??
        List classes = Arrays.asList(designerXmlProperty.allowedTypes());

        String defaultValue = xmlProperty.defaultValue();
        if (defaultValue.isEmpty()) {
            defaultValue = null;
        }

        IDesignerPreviewProvider provider = getPreviewValueProvider(designerXmlProperty);
        Object previewValue = provider.getPreviewValue(owner, field, this, bindingExpression, getStaticValueText(), defaultValue);
        return new BindingResult(null, null, previewValue);
    }

    private IDesignerPreviewProvider getPreviewValueProvider(DesignerXMLProperty designerXmlProperty) {
        Class providerClass = designerXmlProperty.previewValueProvider();
        if (!PROVIDERS_CACHE.containsKey(providerClass)) {
            try {
                PROVIDERS_CACHE.put(providerClass, providerClass.newInstance());
            } catch (InstantiationException | IllegalAccessException e) {
                throw new FhFormException("Cannot create preview value provider: " + providerClass.getName(), e);
            }
        }
        return PROVIDERS_CACHE.get(providerClass);
    }

    @Override
    public DesignerModelBinding clone(Component newOwner) {
        return new DesignerModelBinding<>(getForm(), newOwner, bindingExpression, field, conversionService);
    }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy