package org.openflexo.foundation.toc;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.openflexo.antar.binding.AbstractBinding.BindingEvaluationContext;
import org.openflexo.antar.binding.Bindable;
import org.openflexo.antar.binding.BindingDefinition;
import org.openflexo.antar.binding.BindingDefinition.BindingDefinitionType;
import org.openflexo.antar.binding.BindingFactory;
import org.openflexo.antar.binding.BindingModel;
import org.openflexo.antar.binding.BindingVariableImpl;
import org.openflexo.antar.binding.ParameterizedTypeImpl;
import org.openflexo.antar.binding.WilcardTypeImpl;
import org.openflexo.foundation.xml.FlexoTOCBuilder;
public class IterationSection extends ControlSection {
private String iteratorName;
private ConditionalOwner conditionalOwner;
public class ConditionalOwner implements Bindable {
@Override
public BindingFactory getBindingFactory() {
return IterationSection.this.getBindingFactory();
}
@Override
public BindingModel getBindingModel() {
return IterationSection.this.getInferedBindingModel();
}
}
public IterationSection(FlexoTOCBuilder builder) {
this(builder.tocData);
initializeDeserialization(builder);
}
public IterationSection(TOCData data) {
super(data);
conditionalOwner = new ConditionalOwner();
}
private TOCDataBinding iteration;
private Type LIST_BINDING_TYPE = new ParameterizedTypeImpl(List.class, new WilcardTypeImpl(Object.class));;
private BindingDefinition ITERATION = new BindingDefinition("iteration", LIST_BINDING_TYPE, BindingDefinitionType.GET, false);
public BindingDefinition getIterationBindingDefinition() {
return ITERATION;
}
@Override
public boolean isIteration() {
return true;
}
public TOCDataBinding getIteration() {
if (iteration == null) {
iteration = new TOCDataBinding(this, ControlSectionBindingAttribute.iteration, getIterationBindingDefinition());
}
return iteration;
}
public void setIteration(TOCDataBinding iteration) {
if (iteration != null) {
iteration.setOwner(this);
iteration.setBindingAttribute(ControlSectionBindingAttribute.iteration);
iteration.setBindingDefinition(getIterationBindingDefinition());
}
this.iteration = iteration;
rebuildInferedBindingModel();
}
private TOCDataBinding condition;
private BindingDefinition CONDITION = new BindingDefinition("condition", Boolean.class, BindingDefinitionType.GET, false);
public BindingDefinition getConditionBindingDefinition() {
return CONDITION;
}
public TOCDataBinding getCondition() {
if (condition == null) {
condition = new TOCDataBinding(conditionalOwner, ControlSectionBindingAttribute.condition, getConditionBindingDefinition());
}
return condition;
}
public void setCondition(TOCDataBinding condition) {
if (condition != null) {
condition.setOwner(conditionalOwner);
condition.setBindingAttribute(ControlSectionBindingAttribute.condition);
condition.setBindingDefinition(getConditionBindingDefinition());
}
this.condition = condition;
}
public String getIteratorName() {
return iteratorName;
}
public void setIteratorName(String iteratorName) {
this.iteratorName = iteratorName;
}
public Type getItemType() {
if (getIteration() != null && getIteration().hasBinding()) {
Type accessedType = getIteration().getBinding().getAccessedType();
if (accessedType instanceof ParameterizedType && ((ParameterizedType) accessedType).getActualTypeArguments().length > 0) {
return ((ParameterizedType) accessedType).getActualTypeArguments()[0];
}
}
return Object.class;
}
public ConditionalOwner getConditionalOwner() {
return conditionalOwner;
}
@Override
protected BindingModel buildInferedBindingModel() {
BindingModel returned = super.buildInferedBindingModel();
returned.addToBindingVariables(new BindingVariableImpl(this, getIteratorName(), getItemType()) {
@Override
public Object getBindingValue(Object target, BindingEvaluationContext context) {
logger.info("What should i return for " + getIteratorName() + " ? target " + target + " context=" + context);
return super.getBindingValue(target, context);
}
@Override
public Type getType() {
return getItemType();
}
});
getIteration().finalizeDeserialization();
getCondition().finalizeDeserialization();
return returned;
}
/*@Override
protected BindingModel buildBindingModel() {
BindingModel returned = super.buildBindingModel();
returned.addToBindingVariables(new BindingVariableImpl(this, getIteratorName(), getItemType()) {
@Override
public Object getBindingValue(Object target, BindingEvaluationContext context) {
logger.info("What should i return for " + getIteratorName() + " ? target " + target + " context=" + context);
return super.getBindingValue(target, context);
}
@Override
public Type getType() {
return getItemType();
}
});
return returned;
}*/
@Override
public void finalizeDeserialization(Object builder) {
super.finalizeDeserialization(builder);
getIteration().finalizeDeserialization();
getCondition().finalizeDeserialization();
}
}