Skip to content

Commit

Permalink
Speicherentlastung
Browse files Browse the repository at this point in the history
  • Loading branch information
encrypTimM committed Jun 17, 2022
1 parent 66f523f commit 7176df0
Show file tree
Hide file tree
Showing 28 changed files with 683 additions and 316 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ public interface EditierBefehl {
*/
@Override
public String toString();

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
package io.github.aid_labor.classifier.basis.projekt;

import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Objects;
import java.util.logging.Logger;

import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.collections.WeakListChangeListener;


/**
Expand All @@ -24,7 +26,7 @@
* @author Tim Muehle
*
*/
public interface EditierBeobachter {
public interface EditierBeobachter extends AutoCloseable {

public static final Logger log = Logger.getLogger(EditierBeobachter.class.getName());

Expand All @@ -39,64 +41,79 @@ public interface EditierBeobachter {
*/
public void verarbeiteEditierung(EditierBefehl editierung);

public List<Object> getBeobachterListe();

/**
* Installiert einen {@code ChangeListener}, der diesen {@code EditierBeobachter} bei
* Aenderung der uebergebenen Eigenschaft mit einem entsprechenden {@link EditierBefehl}
* benachrichtigt
*
* @param <T> Typparameter des Uebergabeparameters
* @param property Eigenschaft, die ueber Anderungen informiert
* @param id ID zur eindeutigen Identifizierung von Editierungen
*/
public default <T> void ueberwachePropertyAenderung(Property<T> property) {
property.addListener(new PropertyUeberwachung<>(this, property));
public default <T> void ueberwachePropertyAenderung(Property<T> property, String id) {
var beobachter = new PropertyUeberwachung<>(this, property, id);
getBeobachterListe().add(beobachter);
property.addListener(beobachter);
}

public static class PropertyUeberwachung<T> implements ChangeListener<T> {

private boolean wiederhole;
private final WeakReference<EditierBeobachter> beobachterRef;
private final WeakReference<Property<T>> propertyRef;
private final String id;

private PropertyUeberwachung(EditierBeobachter beobachter, Property<T> property) {
private PropertyUeberwachung(EditierBeobachter beobachter, Property<T> property, String id) {
this.wiederhole = false;
this.beobachterRef = new WeakReference<>(beobachter);
this.propertyRef = new WeakReference<>(property);
this.id = id;
}

@Override
public void changed(ObservableValue<? extends T> aufrufer, T alterWert, T neuerWert) {
if (!Objects.equals(alterWert, neuerWert) && !wiederhole) {
beobachterRef.get().verarbeiteEditierung(new EditierBefehl() {
beobachterRef.get().verarbeiteEditierung(new WertEditierBefehl<T>() {

@Override
public void wiederhole() {
wiederhole = true;
propertyRef.get().setValue(neuerWert);
wiederhole = false;
public String toString() {
return "EditierBefehl: %s -> %s { alt: %s neu: %s }".formatted(beobachterRef.get(),
propertyRef.get(), alterWert, neuerWert);
}

@Override
public void macheRueckgaengig() {
wiederhole = true;
propertyRef.get().setValue(alterWert);
wiederhole = false;
public String id() {
return id;
}

@Override
public String toString() {
return "EditierBefehl: %s -> %s { alt: %s neu: %s }"
.formatted(beobachterRef.get(), propertyRef.get(),
alterWert, neuerWert);
public T getVorher() {
return alterWert;
}

@Override
public T getNachher() {
return neuerWert;
}

@Override
public void set(T wert) {
wiederhole = true;
propertyRef.get().setValue(wert);
wiederhole = false;
}
});
}
}

}

public default <E extends Editierbar> void ueberwacheListenAenderung(
ObservableList<E> liste) {
liste.addListener(new ListenUeberwacher<>(liste, this));
public default <E extends Editierbar> void ueberwacheListenAenderung(ObservableList<E> liste) {
var beobachter = new ListenUeberwacher<>(liste, this);
getBeobachterListe().add(beobachter);
liste.addListener(new WeakListChangeListener<>(beobachter));
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,13 @@ public final void meldeAn(EditierBeobachter beobachter) {
@Override
public final void meldeAb(EditierBeobachter beobachter) {
while (this.beobachterListe.contains(beobachter)) {
log.config(() -> this + " -- Melde Beobachter ab: " + beobachter);
log.config(() -> {
try {
return this + " -- Melde Beobachter ab: " + beobachter;
} catch (Exception e) {
return "";
}
});
this.beobachterListe.remove(beobachter);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* @param <T>
*/
public class EinfacherEditierBefehl<T> implements EditierBefehl {
public class EinfacherEditierBefehl<T> implements WertEditierBefehl<T> {
private static final Logger log = Logger.getLogger(EinfacherEditierBefehl.class.getName());

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Expand All @@ -40,6 +40,7 @@ public class EinfacherEditierBefehl<T> implements EditierBefehl {
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

private String quelle;
private final String id;
private final T alterWert;
private final T neuerWert;
private final Consumer<T> setter;
Expand All @@ -48,7 +49,7 @@ public class EinfacherEditierBefehl<T> implements EditierBefehl {
// * Konstruktoren *
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

public EinfacherEditierBefehl(T alterWert, T neuerWert, Consumer<T> setter) {
public EinfacherEditierBefehl(T alterWert, T neuerWert, Consumer<T> setter, String id) {
try {
var aufrufer = Thread.currentThread().getStackTrace()[1];
quelle = "%s.%s[%d]".formatted(aufrufer.getClassName(), aufrufer.getMethodName(),
Expand All @@ -61,6 +62,7 @@ public EinfacherEditierBefehl(T alterWert, T neuerWert, Consumer<T> setter) {
this.alterWert = alterWert;
this.neuerWert = neuerWert;
this.setter = setter;
this.id = id;
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Expand All @@ -82,18 +84,28 @@ public EinfacherEditierBefehl(T alterWert, T neuerWert, Consumer<T> setter) {
// public ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##

@Override
public void wiederhole() {
setter.accept(neuerWert);
public String toString() {
return alterWert + " -> " + neuerWert + "\n -> Quelle: " + quelle;
}

@Override
public void macheRueckgaengig() {
setter.accept(alterWert);
public String id() {
return id;
}

@Override
public String toString() {
return alterWert + " -> " + neuerWert + "\n -> Quelle: " + quelle;
public T getVorher() {
return alterWert;
}

@Override
public T getNachher() {
return neuerWert;
}

@Override
public void set(T wert) {
setter.accept(wert);
}

// protected ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

package io.github.aid_labor.classifier.basis.projekt;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand Down Expand Up @@ -46,7 +47,7 @@ public class ListenUeberwacher<E extends Editierbar> implements ListChangeListen
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

private final List<E> liste;
private final EditierBeobachter beobachter;
private final WeakReference<EditierBeobachter> beobachter;

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// * Konstruktoren *
Expand All @@ -61,7 +62,7 @@ public class ListenUeberwacher<E extends Editierbar> implements ListChangeListen
*/
public ListenUeberwacher(List<E> liste, EditierBeobachter beobachter) {
this.liste = liste;
this.beobachter = beobachter;
this.beobachter = new WeakReference<EditierBeobachter>(beobachter);
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Expand Down Expand Up @@ -107,7 +108,7 @@ public void onChanged(Change<? extends E> aenderung) {
for (EditierBefehl editierBefehl : befehle) {
sammelEditierung.speicherEditierung(editierBefehl);
}
beobachter.verarbeiteEditierung(sammelEditierung);
beobachter.get().verarbeiteEditierung(sammelEditierung);
}

// protected ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
Expand Down Expand Up @@ -149,10 +150,16 @@ public String toString() {

private void behandleEntfernung(Change<? extends E> aenderung,
List<EditierBefehl> befehle) {
log.finer(() -> "%s: -> entfernt [%s]".formatted(beobachter,
Arrays.toString(aenderung.getRemoved().toArray())));
log.finer(() -> {
try {
return "%s: -> entfernt [%s]".formatted(beobachter, Arrays.toString(aenderung.getRemoved().toArray()));
} catch (Exception e) {
return "";
}
});

for (E entfernt : aenderung.getRemoved()) {
entfernt.meldeAb(beobachter);
entfernt.meldeAb(beobachter.get());
}
var befehl = new EditierBefehl() {

Expand All @@ -172,8 +179,12 @@ public void macheRueckgaengig() {

@Override
public String toString() {
return "%s: -> entfernt <index %d> %s".formatted(beobachter, startIndex,
Arrays.toString(entfernteAttribute.toArray()));
try {
return "%s: -> entfernt <index %d> %s".formatted(beobachter, startIndex,
Arrays.toString(entfernteAttribute.toArray()));
} catch (Exception e) {
return "";
}
}
};
befehle.add(befehl);
Expand All @@ -184,7 +195,7 @@ private void behandleHinzugefuegt(Change<? extends E> aenderung,
log.finer(() -> "%s: -> hinzugefuegt [%s]".formatted(beobachter,
Arrays.toString(aenderung.getAddedSubList().toArray())));
for (E hinzu : aenderung.getAddedSubList()) {
hinzu.meldeAn(beobachter);
hinzu.meldeAn(beobachter.get());
}
var befehl = new EditierBefehl() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import java.io.IOException;
import java.nio.file.Path;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand Down Expand Up @@ -114,6 +116,8 @@ public abstract class ProjektBasis implements Projekt {
private UeberwachungsStatus ueberwachungsStatus;
@JsonIgnore
private long gespeicherterHash;
@JsonIgnore
private final List<Object> beobachterListe;

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// * Konstruktoren *
Expand Down Expand Up @@ -149,8 +153,9 @@ public ProjektBasis(String name, boolean automatischSpeichern)
Einstellungen.getBenutzerdefiniert().verlaufAnzahl.get());
this.wiederholenVerlauf = VerketteterVerlauf.synchronisierterVerlauf(
Einstellungen.getBenutzerdefiniert().verlaufAnzahl.get());
this.beobachterListe = new LinkedList<>();

this.ueberwachePropertyAenderung(this.name);
this.ueberwachePropertyAenderung(this.name, "projektname");
this.istGespeichertProperty.addListener((__, ___, istGespeichert) -> {
if (istGespeichert) {
int neuerHash = hashCode();
Expand Down Expand Up @@ -185,6 +190,11 @@ public static <T extends ProjektBasis> T ausDateiOeffnen(Path datei, Class<T> ty

// public ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##

@Override
public List<Object> getBeobachterListe() {
return beobachterListe;
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -493,6 +503,16 @@ public boolean equals(Object obj) {
return istGleich;
}

@Override
public void close() throws Exception {
log.fine(() -> "Raueme Projekt " + this.getName() + " auf und schliesse");
this.setUeberwachungsStatus(UeberwachungsStatus.IGNORIEREN);
rueckgaengigVerlauf.leeren();
wiederholenVerlauf.leeren();
beobachterListe.clear();
sammelEditierung = null;
}

// protected ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##

// package ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
Expand Down
Loading

0 comments on commit 7176df0

Please sign in to comment.