Roblet®-Development-Kit
2.2 (30Dez2015)
API für Anwendungen

genRob.genControl.client
Class Sieve

java.lang.Object
  extended by genRob.genControl.client.Sieve

public class Sieve
extends Object

Ein Sieb filtert aus den vom zugehörigen Klienten (Client) ermittelten Kandiaten (Nominee) passende Roblet®-Server-Repräsentanten (Server) heraus.  Es erlaubt daher einen selektiven Zugriff auf Roblet®-Server bestimmter Typen, d.h. mit bestimmten Einheiten (Unit).  Das Sieb funktioniert nur, wenn der Klient für Verzeichnisdienste vorbereitet wurde (vgl. Client.Client()).

Die Vermittelung der Information geschieht über Server-Interessenten (ServerListener).  Die Server-Interessenten eines Siebs werden über neu bekannt gewordene bzw. ausgetragene Server unterrichtet, sofern sie den gewünschten Kriterien entsprechen.  Ein Beobachter wird per addListener(ServerListener, Class[][]) zum Sieb hinzugefügt.

Damit ein Sieb wirken kann, muß noch der Verzeichnisdienst im Netz laufen.

ACHTUNG:  Im Gegensatz zur einfachen Kombination Klient/Kandidaten-Interessent (Client/NomineeListener) baut ein Sieb zu sämtlichen Servern eine Verbindung auf und diese wird in der Folge aktiv aufrecht erhalten.  Das beansprucht Systemressourcen, die in kleineren Umgebungen (Handy o.ä.) anderwertig benötigt werden könnten.

Beispiel ohne Kriterium

Das folgende Beispiel liefert alle dem Klienten bekannt bzw. unbekannt werdenden Server zurück:
 import  genRob.genControl.client.Client;
 import  genRob.genControl.client.Server;
 import  genRob.genControl.client.ServerListener;
 import  genRob.genControl.client.Sieve;
 
 public class  ObserveAll
 {
     public static void  main (String[] args)
         throws Exception
     {
         Client  client = new Client ();
         Sieve  sieve = new Sieve (client);
         sieve. addListener
         (
             new ServerListener ()
             {
                 public void  addedServer (Server server)
                 {
                     System.out.println ("Found " + server);
                 }
                 public void  removedServer (Server server)
                 {
                     System.out.println ("Lost " + server);
                 }
             },
             null  // No criteria
         );
         System.out.println ("Hit enter to end");
         System.in.read ();
         sieve. close ();
         client. close ();
     }
 }
 

Beispiel mit Kriterium

Das folgende Beispiel liefert alle dem Klienten bekannt bzw. unbekannt werdenden Server zurück, die die Standard-Einheiten Logger2 oder Logger zur Verfügung stellen:
 import  genRob.genControl.client.Client;
 import  genRob.genControl.client.Server;
 import  genRob.genControl.client.ServerListener;
 import  genRob.genControl.client.Sieve;
 import  genRob.genControl.unit.log.Logger;
 import  genRob.genControl.unit.log.Logger2;
 
 public class  ObserveLogger
 {
     public static void  main (String[] args)
         throws Exception
     {
         Client  client = new Client ();
         Sieve  sieve = new Sieve (client);
         sieve. addListener
         (
             new ServerListener ()
             {
                 public void  addedServer (Server server)
                 {
                     System.out.println ("Found " + server);
                 }
                 public void  removedServer (Server server)
                 {
                     System.out.println ("Lost " + server);
                 }
             },
             new Class[][]   // OR
             {
                 new Class[]     // AND
                 {
                     Logger2.class,
                 },
                 new Class[]     // AND
                 {
                     Logger.class,
                 },
             }
         );
         System.out.println ("Hit enter to end");
         System.in.read ();
         sieve. close ();
         client. close ();
     }
 }
 


Constructor Summary
Sieve(Client client)
          Erzeugt ein Sieb.
 
Method Summary
 void addListener(ServerListener listener, Class<?>[][] criteria)
          Fügt einen Server-Interessenten hinzu.
 void close()
          Schließt das Sieb.
 void removeListener(ServerListener listener)
          Entfernt einen Server-Interessenten.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Sieve

public Sieve(Client client)
Erzeugt ein Sieb.

Ein Sieb wird solange arbeiten, bis es per close() geschlossen wird.

Parameters:
client - Klient, dessen Kandidaten verarbeitet werden
Method Detail

close

public void close()
Schließt das Sieb.

Das Schließen eines Siebs umfaßt neben dem Ignorieren weiterer Kandidaten vom Klienten auch das Beenden laufender Aktivitäten (Beenden von Threads) und das Freigeben von Ressourcen.  Das Einmelden von weiteren Server-Interessenten (ServerListener) wird von einem geschlossenen Sieb ignoriert.

Die Methode kann ohne Schaden mehrfach aufgerufen werden.  Ein einmal geschlossenes Sieb läßt sich nicht wieder reaktivieren.

Das Schließen eines Siebes bedeutet keinesfalls, daß der zugehörige Klient geschlossen wird.  Anders herum genauso.


addListener

public void addListener(ServerListener listener,
                        Class<?>[][] criteria)
Fügt einen Server-Interessenten hinzu.  Er wird solange über passende Server informiert, bis er per removeListener(ServerListener) wieder entfernt oder das Sieb per close() geschlossen wird.

Nach dem Einmelden wird zunächst der Interessent über alle bereits bekannten und passenden Server informiert.  Danach nur noch, wenn der zugehörige Klient neue Server findet und das hier übergebene Kriterium paßt.

Wird als Kriterium null angegeben, so werden alle Server geliefert.  Andernfalls wird das Kriterium auf dem Server abgeprüft.  In jedem Fall wird Verbindung zum Server aufgenommen - mindestens um die Identität des Servers zu erfahren.

Das Kriterium ist ein Feld von Feldern, wobei das äußere Feld (zugegriffen über den ersten Index) die oder-Varianten des Kriteriums in Form von jeweils eingehängten inneren Feldern, die und-Varianten, enthält.  Die schließlich eingehängten Klassen müssen von Unit abgeleitet sein.  Sie werden vom Server erfragt.

Beispiel:

 Class[][]  criteria = new Class [][]   // OR
 {
     new Class []     // AND
     {
         dom.domain.unit.MyUnit.class,
     },
     new Class []     // AND
     {
         dom.domain.unit.OtherUnit.class,
         dom.somewhere.unit.SomeUnit.class,
     },
 }
 
Die Logik zwischen dem Fall ohne Kriterium (null) und mit Kriterium (ungleich null) kehrt sich komplett um.  Im ersten Fall wird quasi locker nicht geprüft - im zweiten Fall jedoch streng.

Ein inneres Feld vom Wert null entspricht dem Fall, daß der Server die Einheiten dieses inneren Feldes nicht kennt.  Gleiches gilt, wenn gar keine inneren Felder vorliegen.

Erfüllt der Server ein inneres Kriterium, so wird die Untersuchung abgebrochen.  Ein leeres inneres Feld, bzw. leere Einheitendefinitionen (null) werden als nichterfüllend gewertet.

Wird ein Interessent ein weiteres Mal hinzugefügt, so wird zunächst die existierende Zuordnung aufgelöst (entspricht dem Aufruf von removeListener(ServerListener)) und danach erst die Hinzufügung durchgeführt.

Parameters:
listener - Server-Interessent
criteria - Kriterium oder null
Throws:
NullPointerException - falls der Interressent null ist

removeListener

public void removeListener(ServerListener listener)
Entfernt einen Server-Interessenten.  Der Interessent erhält fortan keine Informationen mehr über Hinzukommen oder Wegbleiben von Servern.

Ist der Interessent beim Aufruf dieser Methode gar nicht (mehr) enthalten oder gleich null, so wird nichts gemacht.

Parameters:
listener - Server-Interessent

Roblet®-Development-Kit
2.2 (30Dez2015)
API für Anwendungen

Copyright © 2001-2015, roblet®.org, Hagen Stanek, http://roblet.org/rdk