Skip to content

Commit

Permalink
Snapshot: Define getAddsObservable/getRemovesObservable
Browse files Browse the repository at this point in the history
Replace all reimplementations of toObservable() with reimplementations of
getAddsObservable and getRemovesObservable.
  • Loading branch information
fducroquet committed Sep 1, 2017
1 parent ee71551 commit a78d639
Show file tree
Hide file tree
Showing 13 changed files with 364 additions and 215 deletions.
25 changes: 24 additions & 1 deletion gs-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,29 @@
<name>Generic System API</name>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjavafx</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
Expand All @@ -19,7 +42,7 @@
<artifactId>maven-javadoc-plugin</artifactId>
<version>${maven-javadoc-plugin.version}</version>
<configuration>
<!-- javadocExecutable>${java.home}/bin/javadoc</javadocExecutable-->
<!-- javadocExecutable>${java.home}/bin/javadoc</javadocExecutable -->
</configuration>
<executions>
<execution>
Expand Down
61 changes: 58 additions & 3 deletions gs-api/src/main/java/org/genericsystem/api/core/Snapshot.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.genericsystem.api.core;

import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
Expand All @@ -8,6 +9,10 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.reactivex.Observable;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

Expand Down Expand Up @@ -152,6 +157,17 @@ public Stream<T> unfilteredStream() {
return Snapshot.this.stream().filter(predicate);
}

@Override
public Observable<T> getAddsObservable() {
return getParent().getAddsObservable().filter(g -> predicate.test(g));
}

@Override
public Observable<T> getRemovesObservable() {
return getParent().getRemovesObservable().filter(g -> predicate.test(g));
}


@Override
public T get(Object o) {
T result = Snapshot.this.get(o);
Expand All @@ -172,6 +188,16 @@ public IndexFilter getFilter() {
return filter;
}

@Override
public Observable<T> getAddsObservable() {
return getParent().getAddsObservable().filter(g -> filter.test((IGeneric<?>) g));
}

@Override
public Observable<T> getRemovesObservable() {
return getParent().getRemovesObservable().filter(g -> filter.test((IGeneric<?>) g));
}

@Override
public Stream<T> unfilteredStream() {
throw new UnsupportedOperationException("unfilteredStream() should be called only on unfiltered snapshots.");
Expand All @@ -187,6 +213,17 @@ public Stream<T> unfilteredStream() {
return Snapshot.this.stream().filter(g -> filters.stream().allMatch(filter -> filter.test((IGeneric<?>) g)));
}

@Override
public Observable<T> getAddsObservable() {
return Snapshot.this.getAddsObservable().filter(g -> filters.stream().allMatch(filter -> filter.test((IGeneric<?>) g)));
}

@Override
public Observable<T> getRemovesObservable() {
return Snapshot.this.getRemovesObservable().filter(g -> filters.stream().allMatch(filter -> filter.test((IGeneric<?>) g)));
}


@Override
public T get(Object o) {
T result = Snapshot.this.get(o);
Expand All @@ -199,9 +236,27 @@ default List<T> toList() {
return stream().collect(Collectors.toList());
}

default Observable<T> getAddsObservable() {
return Observable.never();
}

default Observable<T> getRemovesObservable() {
return Observable.never();
}

default ObservableList<T> toObservableList() {
if (getParent() != null)
return getParent().toObservableList().filtered(g -> getFilter().test((IGeneric<?>) g));
return FXCollections.observableArrayList(toList());
Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
ObservableList<T> result = FXCollections.observableArrayList(toList());
getAddsObservable().subscribe(g -> {
if (!result.contains(g)) {
logger.debug("Snapshot {}, generic added, {}", System.identityHashCode(this), g);
result.add(g);
}
}, e -> logger.error("Exception while computing observable list.", e));
getRemovesObservable().subscribe(g -> {
logger.debug("Snapshot {}, generic removed, {}", System.identityHashCode(this), g);
result.remove(g);
}, e -> logger.error("Exception while computing observable list.", e));
return result;
}
}
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -354,11 +354,13 @@ public final ObservableValue<IDifferential<Generic>> getObservable(Generic gener

@Override
public Observable<Generic> getAddsObservable(Generic generic) {
// TODO
return Observable.never();
}

@Override
public Observable<Generic> getRemovesObservable(Generic generic) {
// TODO
return Observable.never();
}
}
Expand Down
20 changes: 9 additions & 11 deletions gs-common/src/main/java/org/genericsystem/common/Container.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import java.util.stream.Stream;

import org.genericsystem.api.core.Snapshot;
import org.genericsystem.defaults.tools.RxJavaHelpers;

import io.reactivex.Observable;
import javafx.collections.FXCollections;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;

/**
Expand All @@ -31,14 +31,12 @@ public Stream<Generic> unfilteredStream() {
}

@Override
public ObservableList<Generic> toObservableList() {
ObservableList<Generic> result = FXCollections.observableArrayList();
container.addListener((MapChangeListener<Generic, Generic>) c -> {
if (c.wasAdded() && !c.wasRemoved())
result.add(c.getKey());
if (c.wasRemoved() && !c.wasAdded())
result.remove(c.getKey());
});
return result;
public Observable<Generic> getAddsObservable() {
return RxJavaHelpers.additionsOf(container).map(entry -> entry.getKey());
}

@Override
public Observable<Generic> getRemovesObservable() {
return RxJavaHelpers.removalsOf(container).map(entry -> entry.getKey());
}
}
40 changes: 10 additions & 30 deletions gs-common/src/main/java/org/genericsystem/common/Differential.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
Expand Down Expand Up @@ -107,40 +106,21 @@ public Stream<Generic> unfilteredStream() {
return Stream.concat(adds.contains(generic) ? Stream.empty() : subDifferential.getDependencies(generic).filter(new IndexFilter(FiltersBuilder.NOT_CONTAINED_IN_PARAM, new ArrayList<>(removes.toList()))).stream(),
adds.filter(new IndexFilter(FiltersBuilder.IS_DIRECT_DEPENDENCY_OF, generic)).stream());
}

@Override
public Snapshot<Generic> filter(List<IndexFilter> filters) {
return new Snapshot<Generic>() {

@Override
public Stream<Generic> unfilteredStream() {
List<IndexFilter> filters_ = new ArrayList<>(filters);
filters_.add(new IndexFilter(FiltersBuilder.NOT_CONTAINED_IN_PARAM, new ArrayList<>(removes.toList())));
return Stream.concat(adds.contains(generic) ? Stream.empty() : subDifferential.getDependencies(generic).filter(filters_).stream(), adds.filter(filters).stream().filter(x -> generic.isDirectAncestorOf(x)));
}
};
List<IndexFilter> filters_ = new ArrayList<>(filters);
filters_.add(new IndexFilter(FiltersBuilder.NOT_CONTAINED_IN_PARAM, new ArrayList<>(removes.toList())));
return Snapshot.super.filter(filters_);
}

@Override
public Observable<Generic> getAddsObservable() {
return getDifferentialObservable().flatMap(diff -> diff.getAddsObservable(generic));
}

@Override
public ObservableList<Generic> toObservableList() {
ObservableList<Generic> result = getDependenciesAsOservableListCacheMap().get(generic);
if (result == null) {
final ObservableList<Generic> result_ = FXCollections.observableArrayList(getDifferentialProperty().getValue().getDependencies(generic).toList());
Observable<Differential> differentialObs = getDifferentialObservable();
Observable<Generic> adds = differentialObs.flatMap(diff -> diff.getAddsObservable(generic));
Observable<Generic> removes = differentialObs.flatMap(diff -> diff.getRemovesObservable(generic));
adds.subscribe(g -> {
logger.debug("Generic added, {}", g);
result_.add(g);
}, e -> logger.error("Exception while computing observable list.", e));
removes.subscribe(g -> {
logger.debug("Generic removed, {}", g);
result_.remove(g);
}, e -> logger.error("Exception while computing observable list.", e));
result = result_;
getDependenciesAsOservableListCacheMap().put(generic, result);
}
return result;
public Observable<Generic> getRemovesObservable() {
return getDifferentialObservable().flatMap(diff -> diff.getRemovesObservable(generic));
}
};
}
Expand Down
23 changes: 0 additions & 23 deletions gs-defaults/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,5 @@
<artifactId>gs-api</artifactId>
<version>4.0-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>

<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjavafx</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
</project>
Loading

0 comments on commit a78d639

Please sign in to comment.