BeanShell - Textdatei auslesen

Bei Problemen mit der Bedienung von TV-Browser, bitte hier posten.
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Tja, das mit dem core-Aufruf klingt noch am besten, aber das ist aus dem von Dir genannten und nachvollziehbaren Grund nicht wirdklich eine gute Idee.

Eine interaktive Lösung, die dem User gestattet, die Aktualisierung zu triggern wäre mir ja am liebsten.
Darum habe ich an einen Button gedacht.

Falls nicht interaktiv, könnte man das natürlich auch über einen Timer lösen, der in einem definierten Zeitzyklus die Daten aktualisiert. Für den Zeitzyklus könnte man im Plugin ja eine Einstellung "alle x Minuten aktuelisieren" vorsehen.
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Die Frage ist zuerst, was du überhaupt aktualisieren willst? Der Filter der Programmtabelle aktualisiert sich von selbst, wenn er nicht der Standardfilter ist.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Das Problem derzeit ist, dass nach Änderungen in der CSV-Datei diese erst nach einem Neustart in die HashMap gelesen werden. Was also eigentlich zu triggern wäre, ist das Lesen der CVS-Datei.
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Dafür ist die letzte vorgeschlagene Lösung die richtige. Wirkt aber eben nur wenn der Filter selbst angewendet wird.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Warum kein Timer?
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Der ist in dem Fall nicht sinnvoll, denn der wird die meiste Zeit sowieso nichts zu tun haben. Das Prüfen des Änderungsdatum der Datei im Moment der Filterung ist da besser. Das Laden der Änderungen wirkt sich, wie ich schon schrieb, sowieso nicht aus, bevor accept aufgerufen wird und darüber hast du keine Kontrolle, denn bloß weil du die Änderungen geladen hast, wird z.B. die Lieblingssendung die einen solchen Filter verwenden keine neue Suche durchführen.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Ich dachte eher daran, den Timer so zu bauen, das die Datei z.B. alle 10 Minuten neu in die HashMap geschrieben wird.
Dann würden sich die Änderungen doch direkt auswirken, oder? Die Daten in der Map sind schließlich dann immer modulo 10 Minuten aktuell.
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Nein, denn wann accept aufgerufen wird, bestimmt das Plugin nicht, vielleicht mit Ausnahme des aktuellen Filters, den ein Plugin setzen kann. Und wozu willst du die Datei alle 10 Minuten auslesen, wenn du sie auch einfach nur dann neu einlesen kannst, wenn sich was geändert hat? Eine Datei hat nicht umsonst eine Änderungsdatum. Natürlich könntest du dafür auch einen Timer nehmen, es ändert aber nichts an den Abfolgen, wann ein Filter angewendet wird.

Also so lange accept der Instanzen der Filterkomponente nicht aufgerufen wird, lohnt es sich nicht wirklich die Datei neu einzulesen, schon gar nicht dann wenn sich die Datei nicht geändert hat.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Du hast natürlich recht. Wenn die Daten beim Aufruf von accept() aktualisiert werden, reicht das völlig.
Erst dann werden sie ja gebraucht.

Ich war gestern in meiner Konzentration wohl etwas abgelenkt. Ich hatte da einen besonders schweren Fall zu lösen.
Das war alles nicht so einfach. Jetzt ist der Patient aber wohl über den Berg! :)

Danke für Deinen Tipp!
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Dann werde ich das wohl einbauen.
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Irgendwas läuft da schief.
Also ich habe ein Klassenfeld lastFileModificationTime angelegt.
In accept(program) rufe ich readfile() auf
In readFile() mache ich dann

Code: Alles auswählen

      if (mFile != null){
         File data = new File(mFile);         
         
         if (data.lastModified() == lastFileModificationTime) {
        	return;
         }
         
         lastFileModificationTime = data.lastModified(); 



Alles andere sollte doch gleich laufen, aber die HashMap wird nicht aktualisiert. Die hat immer noch die alten Daten,
trotz clear() und File data = new File(mFile);. Wo ist da mein Denkfehler? Nach dem Neustart hat er die aktualisierten daten.
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Woher weißt du denn, dass die Daten noch die alten sind? Hast du mit System.out.println geprüft, ob die Methode richtig abläuft.
Du musst auch bedenken, dass accept durchaus auch mehrfach gleichzeitig aufgerufen werden könnte, d.h. du solltest die Methode readfile() synchronized machen, damit die immer nur einmal zu einer bestimmten Zeit aufgerufen werden kann.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Also ich habe jetzt mit

Code: Alles auswählen

System.out.println
mittels

Code: Alles auswählen

                     if (mCSVData.isEmpty()) {
                        System.out.println("Map is empty");
                     }
geprüft. Die Map wird in private synchronized void readFile() geleert. Trotzdem liefern ein bestehender Filter und ein neuer Filter immer noch die alten Ergebnisse nach einer Änderung in der Datei. Er scheint immer noch auf die alten Daten zuzugreifen und das trotz

Code: Alles auswählen


     if (mFile != null){
         File data = new File(mFile);

in private synchronized void readFile().

Es wird doch eine Instanz der Filterkomponenete erstellt. Kann es sein, das TV-Browser immer noch mit der alten Instanz arbeitet? Dann könnte ich natürlich die CSVData ändern, bis der Arzt kommt. Muß die Instanz eventuell überschrieben bzw. neu initialisiert werden? Dann wäre die Frage, wie man das macht.
ds10
Site Admin
Beiträge: 19125
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Die Instanz(en) einer Klasse ist/sind sozusagen immer die aktuell vorhandenen Umsetzungen dieser Klasse. Alles was du in der Klasse programmiert hast, wird die Instanz auch so machen. Was du natürlich nicht weißt ist, welche Instanzen dieser Klasse, wo aufgerufen werden. D.h. auch wenn du siehst, dass die neuen Daten eingelesen werden, heißt das nicht, dass du das Ergebnis auch in TV-Browser siehst, denn womöglich wird dort nur eine Instanz aufgerufen, die nicht direkt sichtbar in der Anzeige auswirkt. Von einer angelegten Filterkomponente sollte es normalerweise nur eine Instanz geben, von der Klasse der Filterkomponente kann es aber mehrere Instanzen geben (beispielsweise zwei Filterkomponenten mit unterschiedlichen CSV-Dateien).

Bei einem Neustart von TV-Browser werden natürlich alle Instanzen neu erzeugt und die Filterung muss dann an entsprechender Stelle für eine mögliche Anzeige durchgeführt werden.

Wenn du kontrollieren möchtest, woher der Aufruf stammt, dann kannst du entweder mit dem Debugger arbeiten, oder du fügst Folgendes in den Quellcode ein:

Code: Alles auswählen

StackTraceElement[] stackTraceEl = Thread.currentThread().getStackTrace();
        
for(StackTraceElement el : stackTraceEl) {
  System.out.println(el);
}
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Aber dann wäre es natürlich sinvoller, den Neustart sozusagen zu simulieren und alle Instanzenm neu zu erzeugen.
Das kann ich aber wohl nicht aus der Klasse selbst machen.

Ich habe mal zur Laufzeit die CSV-Datei umbenannt. Das stört ihn aber gar nicht. Er arbeitet einfach mit den alten Daten weiter. Die Instanz wird also nicht aktualisiert, sondern ist statisch. Dann funktioniert Dein Ansatz in diesem Umfeld nicht.

Kann ich die Instanz irgendwie überschreiben?
Antworten