BeanShell - Textdatei auslesen

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.

BBCode ist eingeschaltet
[img] ist eingeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Ansicht erweitern Die letzten Beiträge des Themas: BeanShell - Textdatei auslesen

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 20:17

Ja, um die gefundenen Sendungen mit einem Icon zu kennzeichnen, verwende ich den Filter dort.

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 20:15

Warum die accept-Methode nun genau aufgerufen wird, kann ich auch nicht sagen, es wird aber einen sinnvollen Grund dafür geben. Vielleicht verwendest du die Filterkomponente ja woanders, z.B. in Filter-Info-Icons.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 20:00

Interessant ist, das die Daten auch aktualisiert werden, wenn ein Filter (Sendungstitelfilter) verwendet wird, der die Komponente nicht verwendet.
Das hätte ich eigentlich nicht erwartet. Läuft da im TV-Browser noch etwas im Hintergrund.
Oder liegt das am Scroller im Tab Lieblingssendungen. Wenn ich mich richtig erinnere, hattest Du damals erwähnt, das der permanent Filter aufruft.

Natürlich ist es so noch praktischer. Ich verstehe es aber nicht.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 19:49

Mist! Daran hatte ich nicht gedacht! Vielen Dank für den Hinweis!

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 19:44

Ja, das wird die wohl sein.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 19:42

Ach je! Du meinst die mPogramStatusMap! Richtig?
Vielen Dank! Das war's!

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 19:38

Wenn ich mich recht entsinne hatten wir doch einen Cache für die Sendungen vorgesehen, in dem der Status der Filterung für eine Sendung gespeichert wird. Der muss natürlich auch gelöscht werden, sonst werden die neu eingelesenen Daten nicht benutzt werden.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 19:28

Wenn Du da mal reinschauen möchtest, kannst Du die CSVFileFilterComponent.jar unter Plugins - Sonstige finden.
Da ist der aktuelle Code drin. Dann kann ich Dir sagen, was ich für die Aktualisierung modifizeirt habe. Das sind nur die 3 Stellen, die ich bereits gepostet habe. Das ist vielleicht einfacher, als den ganzen Code zu posten.

Ein neues Klassenfeld

Code: Alles auswählen


public class CSVFileFilterComp extends PluginsFilterComponent{
   ......
   private long lastFileModificationTime; 
  .....
   
Auruf von readFile() in accept(Program program)

Code: Alles auswählen


   @Override
   public boolean accept(Program program) {     
	  if(program != null && mCSVData != null) {         
    	 readFile(); 
         ......

Und der Vergleich der Timestamps in Millisekunden in readFile()

Code: Alles auswählen


   private synchronized void readFile() {     
      String line = EMPTY_STRING;
   
      if (mFile != null){
         File data = new File(mFile);         
         
         if (data.lastModified() == lastFileModificationTime) {
        	return;
         }
         
         lastFileModificationTime = data.lastModified(); 
                  
         Reader r;
         try {		                    
            if(data.isFile()) {
               r = new InputStreamReader(new FileInputStream(mFile), "UTF-8");	
               try{           
                  // Read CSV file
                  br = new BufferedReader(r);
           
                  // Clear the map
                  if (mCSVData != null){
                     mCSVData.clear();
                     
                     if (mCSVData.isEmpty()) {
                        System.out.println("Map is empty!");
                     }
                  } 
                  
                  line = br.readLine();
 
                  while (line != null){
                     processLine(line);
                     line = br.readLine();
                  } 
           
                  closeReaders(r,br);   
               } catch (IOException ioe) {
                  closeReaders(r,br);
                  ioe.printStackTrace();
               }
            }               
		 } catch (UnsupportedEncodingException e) {
		   e.printStackTrace();
		 } catch (FileNotFoundException e) {
			e.printStackTrace();
		 }
      }
   }  

Re: BeanShell - Textdatei auslesen

von uzi » 10 Jul 2015, 19:19

vielleicht solltest du mal den code der fraglichen klasse komplett posten. aus den schnippseln und beim überfliegen werd ich nicht schlau daraus. nur, weil du das file nochmal neu instanziierst (File data = new File(mFile);), werden die daten ja nicht neu eingelesen.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 18:54

Das da was falsch läuft, ist schon klar. Aber was? ich finde den Fehler einfach nicht!

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 18:42

Sheldon2012 hat geschrieben:Ich habe mal zur Laufzeit die CSV-Datei umbenannt. Das stört ihn aber gar nicht. Er arbeitet einfach mit den alten Daten weiter.
Dann machst du etwas falsch. Die Instanz muss nicht aktualisiert werden (was du im Übrigen auch gar nicht kannst), denn sie hat den Code den du programmiert hast und wenn der nicht richtig arbeitet, dann funktioniert es halt nicht.

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 18:11

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?

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 17:53

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);
}

Re: BeanShell - Textdatei auslesen

von Sheldon2012 » 10 Jul 2015, 17:09

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.

Re: BeanShell - Textdatei auslesen

von ds10 » 10 Jul 2015, 09:49

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.

Nach oben