Skip to content

Commit

Permalink
Refactoring. Create MetaBinding class
Browse files Browse the repository at this point in the history
  • Loading branch information
nfeybesse committed Aug 26, 2016
1 parent 887e0ed commit 5457cb1
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 46 deletions.
@@ -0,0 +1,24 @@
package org.genericsystem.reactor;

import java.util.function.BiFunction;
import java.util.function.Function;

import javafx.collections.ObservableList;

public class MetaBinding<BETWEEN> {
private final Function<Model, ObservableList<BETWEEN>> betweenChildren;
private final BiFunction<Model, BETWEEN, Model> modelBuilder;

public MetaBinding(Function<Model, ObservableList<BETWEEN>> betweenChildren, BiFunction<Model, BETWEEN, Model> modelBuilder) {
this.betweenChildren = betweenChildren;
this.modelBuilder = modelBuilder;
}

public ObservableList<BETWEEN> buildBetweenChildren(Model model) {
return betweenChildren.apply(model);
}

public Model buildModel(Model parent, BETWEEN betweenChild) {
return modelBuilder.apply(parent, betweenChild);
}
}
42 changes: 20 additions & 22 deletions gs-reactor/src/main/java/org/genericsystem/reactor/Tag.java
@@ -1,5 +1,7 @@
package org.genericsystem.reactor;

import io.vertx.core.http.ServerWebSocket;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -11,16 +13,6 @@
import java.util.function.Consumer;
import java.util.function.Function;

import org.genericsystem.api.core.ApiStatics;
import org.genericsystem.reactor.ViewContext.RootViewContext;
import org.genericsystem.reactor.modelproperties.AttributesDefaults;
import org.genericsystem.reactor.modelproperties.StyleClassesDefaults;
import org.genericsystem.reactor.modelproperties.StylesDefaults;
import org.genericsystem.reactor.modelproperties.TextPropertyDefaults;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.vertx.core.http.ServerWebSocket;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
Expand All @@ -30,6 +22,15 @@
import javafx.collections.ObservableMap;
import javafx.util.StringConverter;

import org.genericsystem.api.core.ApiStatics;
import org.genericsystem.reactor.ViewContext.RootViewContext;
import org.genericsystem.reactor.modelproperties.AttributesDefaults;
import org.genericsystem.reactor.modelproperties.StyleClassesDefaults;
import org.genericsystem.reactor.modelproperties.StylesDefaults;
import org.genericsystem.reactor.modelproperties.TextPropertyDefaults;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author Nicolas Feybesse
*
Expand All @@ -39,8 +40,9 @@ public abstract class Tag<M extends Model> implements TextPropertyDefaults<M>, S

private static final Logger log = LoggerFactory.getLogger(Tag.class);
private final String tag;
private Function<Model, ObservableList<?>> metaBinding;
private BiFunction<Model, ?, M> modelBuilder;
private MetaBinding<?> metaBinding;
// private Function<Model, ObservableList<?>> metaBinding;
// private BiFunction<Model, ?, M> modelBuilder;
private final List<BiConsumer<Model, HtmlDomNode>> preFixedBindings = new ArrayList<>();
private final List<BiConsumer<Model, HtmlDomNode>> postFixedBindings = new ArrayList<>();
private final Tag parent;
Expand Down Expand Up @@ -70,15 +72,12 @@ protected List<BiConsumer<Model, HtmlDomNode>> getPostFixedBindings() {
return postFixedBindings;
}

protected Function<Model, ObservableList<?>> getMetaBinding() {
return metaBinding;
}

protected BiFunction<Model, ?, M> getModelBuilder() {
return modelBuilder;
@SuppressWarnings("unchecked")
protected <BETWEEN> MetaBinding<BETWEEN> getMetaBinding() {
return (MetaBinding<BETWEEN>) metaBinding;
}

protected void setMetaBinding(Function<Model, ObservableList<?>> metaBinding) {
protected <BETWEEN> void setMetaBinding(MetaBinding<BETWEEN> metaBinding) {
if (this.metaBinding != null)
throw new IllegalStateException("MetaBinding already defined");
this.metaBinding = metaBinding;
Expand Down Expand Up @@ -114,9 +113,8 @@ public void bindOptionalStyleClass(String styleClass, String modelPropertyName,
bindOptionalStyleClass(styleClass, modelPropertyName);
}

protected <SUBELEMENT> void forEach(Function<Model, ObservableList<?>> applyOnModel, BiFunction<Model, SUBELEMENT, M> modelBuilder) {
setMetaBinding(applyOnModel);
this.modelBuilder = modelBuilder;
protected <BETWEEN> void forEach(Function<Model, ObservableList<BETWEEN>> applyOnModel, BiFunction<Model, BETWEEN, Model> modelBuilder) {
setMetaBinding(new MetaBinding<BETWEEN>(applyOnModel, modelBuilder));
}

@Override
Expand Down
26 changes: 12 additions & 14 deletions gs-reactor/src/main/java/org/genericsystem/reactor/ViewContext.java
@@ -1,5 +1,7 @@
package org.genericsystem.reactor;

import io.vertx.core.http.ServerWebSocket;

import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
Expand All @@ -8,9 +10,6 @@
import org.genericsystem.defaults.tools.TransformationObservableList;
import org.genericsystem.reactor.Tag.RootTag;

import io.vertx.core.http.ServerWebSocket;
import javafx.collections.ObservableList;

/**
* @author Nicolas Feybesse
*
Expand Down Expand Up @@ -40,24 +39,23 @@ protected void init(ViewContext<M> parent, Model modelContext, Tag<M> element, H
this.modelContext = modelContext;
}

protected <SUBELEMENT> void init(int indexInChildren) {
protected <BETWEEN> void init(int indexInChildren) {
modelContext.register(this);
if (parent != null)
insertChild(indexInChildren);
for (BiConsumer<Model, HtmlDomNode> binding : element.getPreFixedBindings())
binding.accept(modelContext, getNode());
for (Tag childTag : element.getObservableChildren())
if (childTag.getMetaBinding() != null) {
Model model = getModelContext();
ObservableList<SUBELEMENT> subElements = (ObservableList<SUBELEMENT>) childTag.getMetaBinding().apply(model);
ObservableList<M> subModels = new TransformationObservableList<SUBELEMENT, M>(subElements, (index, subModel) -> {
M resultModel = (M) childTag.getModelBuilder().apply(model, subModel);
createViewContextChild(index, resultModel, childTag);
return resultModel;
}, Model::destroy);
model.setSubContexts(childTag, subModels);
for (Tag childTag : element.getObservableChildren()) {
MetaBinding<BETWEEN> metaBinding = childTag.<BETWEEN> getMetaBinding();
if (metaBinding != null) {
modelContext.setSubContexts(childTag, new TransformationObservableList<BETWEEN, Model>(metaBinding.buildBetweenChildren(modelContext), (index, between) -> {
Model childModel = metaBinding.buildModel(modelContext, between);
createViewContextChild(index, childModel, childTag);
return childModel;
}, Model::destroy));
} else
createViewContextChild(null, modelContext, childTag);
}
for (BiConsumer<Model, HtmlDomNode> binding : element.getPostFixedBindings())
binding.accept(modelContext, getNode());
}
Expand Down
22 changes: 12 additions & 10 deletions gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoApp.java
Expand Up @@ -5,6 +5,14 @@
import java.util.Map;
import java.util.function.Predicate;

import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableObjectValue;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;

import org.genericsystem.common.Generic;
import org.genericsystem.common.Root;
import org.genericsystem.defaults.tools.ObservableListWrapperExtended;
Expand All @@ -30,14 +38,6 @@
import org.genericsystem.reactor.model.GenericModel;
import org.genericsystem.todomvc.Todos.Completed;

import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableObjectValue;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;

/**
* @author Nicolas Feybesse
*
Expand Down Expand Up @@ -146,8 +146,10 @@ public Observable[] get(Object key) {
new HtmlLi(this) {
{
storeProperty("observableHolder", model -> model.getGeneric().getObservableHolder(model.getGeneric().getRoot().find(Completed.class)));
storeProperty(ReactorStatics.COMPLETED, model -> new SimpleBooleanProperty(
getObservableValue("observableHolder", model).getValue() != null && Boolean.TRUE.equals(((Generic) getObservableValue("observableHolder", model).getValue()).getValue()) ? true : false));
storeProperty(
ReactorStatics.COMPLETED,
model -> new SimpleBooleanProperty(getObservableValue("observableHolder", model).getValue() != null
&& Boolean.TRUE.equals(((Generic) getObservableValue("observableHolder", model).getValue()).getValue()) ? true : false));
forEach(model -> getFilteredTodos(model), (model, generic) -> new GenericModel(model, GenericModel.addToGenerics((Generic) generic, ((GenericModel) model).getGenerics())));
bindOptionalStyleClass(ReactorStatics.COMPLETED, ReactorStatics.COMPLETED);
new HtmlDiv(this) {
Expand Down

0 comments on commit 5457cb1

Please sign in to comment.