de.bsvrz.pat.datgen.generator.main
Class DataGenerator

java.lang.Object
  extended by de.bsvrz.pat.datgen.generator.main.DataGenerator
All Implemented Interfaces:
ClientSenderInterface

public class DataGenerator
extends Object
implements ClientSenderInterface

Generator-Applikation zur zeitlich gesteuerten Erzeugung von Online-Daten beliebiger Attributgruppen zu Test- und Analysezwecken. Über Aufrufparameter können Attributgruppe, Aspekt, Simulationsvariante und die Objekte, für die die Daten erzeugt werden, die Art der Anmeldung (als Quelle oder Sender) und das zeitliche Verhalten vorgegeben werden. Die erzeugten Daten können bei Bedarf beim Versand protokolliert werden. Aufruf:

java de.bsvrz.pat.datgen.generator.main.DataGenerator [-protModul=] [-datei=] [-autark] [] ([-zyklus=[-]] [-anzahl=] [-spreizung=] [-zeit=] [-rolle=] –objekte= -daten=)+
oder
java de.bsvrz.pat.datgen.generator.main.DataGenerator [-protModul=] -eingabe= [-basisUri=] [-zeitstempel=] [-validieren=ja|nein] [-datei=] [-autark] [] ([-rolle=] [-objekte= -daten=])+

Beispiel:

java de.bsvrz.pat.datgen.generator.main.DataGenerator -ausgabe=kopf -objekte=vrz.aachen:MQ -daten=atg.verkehrswerte:asp.analyseWerte
Es können also eine oder mehrere Anmeldespezifikationen beim Start des Programms angegeben werden. Jede Anmeldespezifikation kann optional die Zykluszeit, Anmelde-Rolle, die Art der Protokollierung und die Angabe der Objekte, für die die Anmeldung durchgeführt werden soll, enthalten. Wenn diese Argumente weggelassen werden, dann übernehmen sie ihren Wert aus der vorhergegangenen Anmeldespezifikation. Über die Datenspezifikation muss angegeben werden, welche Daten angemeldet werden sollen.

Die Zykluszeit kann durch eine relative Zeitangabe spezifiziert werden.

Für den Platzhalter anmeldeRolle können die Werte quelle bzw. sender eingesetzt werden, um zu signalisieren, dass die anzumeldenden Daten als Quelle an beliebige Empfänger bzw. als Sender an eine Senke übertragen werden sollen. Wenn keine Anmelde-Rolle angegeben wurde, wird standardmäßig der Wert empfänger benutzt.

Mit dem Platzhalter objektSpezifikationen können mehrere Objekte durch Komma getrennt spezifiziert werden. Ein Objekt wird entweder durch die Objekt-Id oder vorzugsweise durch die PID des Objekts spezifiziert. Optional kann hinter der Objekt-ID oder PID mit Doppelpunkt getrennt ein Mengenname angegeben werden; damit wird dann nicht das angegebene Objekt, sondern alle in der angegebenen Menge unterhalb des angegebenen Objekts enthaltenen Objekte spezifiziert.

Mit dem Platzhalter datenSpezifikation werden durch Doppelpunkt getrennt die PID der Attributgruppe, die PID des Aspekts und die Simulationsvariante für die Anmeldung und die Datenerzeugung spezifiziert. Die Simulationsvariante kann (einschließlich des vorhergehenden Doppelpunkts) weggelassen werden um die Default-Simulationsvariante (i.a. 0) zu benutzen.

Nach der Anmeldung auf die spezifizierten Daten werden für jede Anmeldespezifikation unabhängig zyklisch Daten für die jeweiligen Objekte generiert. Dabei wird das Senden der Datensätze über den im Platzhalter spreizungsGrad angegeben Wert (in Prozent) über den entsprechenden Anteil der Zykluszeit homogen verteilt. Bei der Angabe -zyklus=1m -spreizung=50 werden minütlich Datensätze für die Objekte generiert und innerhalb der ersten 30 Sekunden eines jeden Zyklus übertragen. Wenn kein Spreizungsgrad angegeben wurde, wird der Wert 0 benutzt. Dabei werden die Datensätze der einzelnen Objekte in jedem Zyklus im Block übertragen.

Die Anzahl der Zyklen, kann über den Platzhalter anzahlZyklen vorgegeben werden. Wenn keine Anzahl vorgegeben ist, dann wird der Wert 0 benutzt, der als unbeschränkt interpretiert wird.

Beim Versenden von Datensätzen können diese mit Hilfe der Ausgabefunktion des Onlineprotokollierers ausgegeben werden.

Beim Erzeugen von Daten berücksichtigt der Datengenerator die im Metamodell angegebenen Wertebereichsgrenzen. Ansonsten sind die erzeugten Daten im wesentlichen zufällig, d.h. aus fachlicher Sicht i.a. nicht sinnvoll.

Author:
Kappich Systemberatung

Nested Class Summary
private static class DataGenerator.DataCycler
          Datenerzeugungs-Thread
private static class DataGenerator.QueueSurrogate
          Klasse die statt der Klasse Queue zum Versenden eingesetzt wird, aber die Datensätze ungepuffert an die Datenverteiler-Applikationsfunktionen weitergibt.
private static class DataGenerator.Sender
          Implementiert den Sende-Thread
 
Field Summary
private static ClientDavInterface connection
          Verbindung zum DaV
private static DataModel dataModel
          Das Datenmodell
private static Debug debug
          Die Debug-Ausgabe
private static DataKindDeterminer dkd
          Das Objekt zur Bestimmung der Datenart
private static boolean hasSendControl
          Gibt an, ober der Datengenerator Sendesteuerung wünscht oder nicht.
private static boolean isAutarkic
          Zeigt an, ob Datengenerator autark arbeiten, d.
private static boolean isGenerator
           
private static boolean isSendControlValid
          true, wenn Sendesteuerung verlangt wird.
private static int numberOfThreads
          Anzahl der laufenden Datenerzeugungs-Threads
private static ProtocolModuleConnector pmc
          Andockstelle für Protokollierungsmodule
private static Set registeredObjects
          Liste der Objekte, für die Sendeerlaubnis vorliegt
private static SendInterface sendQueue
          Sende-Queue
private static long waitForDataRequests
          Wartezeit nach dem Anmelden , damit die Sendesteuerungen eintreffen können, bevor Daten gesendet werden
 
Fields inherited from interface de.bsvrz.dav.daf.main.ClientSenderInterface
START_SENDING, STOP_SENDING, STOP_SENDING_NO_RIGHTS, STOP_SENDING_NOT_A_VALID_SUBSCRIPTION
 
Constructor Summary
private DataGenerator(ClientDavParameters parameters, List subscriptionInfos)
          Erzeugt einen neuen Datengenerator, der Zufallsdaten erzeugt und als Datentelegramme versendet
private DataGenerator(ClientDavParameters parameters, List subscriptionInfos, XmlFormatReader xfr)
          Erzeugt einen neuen Datengenerator, der Daten aus einer XML-Protokolldatei einliest und als Datentelegramme versendet
 
Method Summary
static void checkSubscription(List subscriptions)
          Anmeldungen durchgehen und den Wunsch nach Sendesteuerung entsprechend setzen.
 void dataRequest(SystemObject object, DataDescription dataDescription, byte state)
          Sendesteuerung des Datenverteilers an die Applikation.
 boolean getIsAutarkic()
          Liefert Information, ob Datengenerator autark läuft oder nicht.
private static boolean hasDataRequest(ResultData data)
          Methode zur Feststellung, ob angegebenes Objekt gesendet werden darf
 boolean isRequestSupported(SystemObject object, DataDescription dataDescription)
          Diese Methode muss von der Applikation implementiert werden, um zu signalisieren, ob Sendesteuerungen gewünscht sind und mit der Methode dataRequest verarbeitet werden.
static void main(String[] arguments)
          Hauptfunktion des Datengenerators
private  List register(List subscriptionInfos)
          Registrierung durchführen
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

dkd

private static DataKindDeterminer dkd
Das Objekt zur Bestimmung der Datenart


isGenerator

private static boolean isGenerator

isSendControlValid

private static boolean isSendControlValid
true, wenn Sendesteuerung verlangt wird.


registeredObjects

private static Set registeredObjects
Liste der Objekte, für die Sendeerlaubnis vorliegt


sendQueue

private static final SendInterface sendQueue
Sende-Queue


waitForDataRequests

private static long waitForDataRequests
Wartezeit nach dem Anmelden , damit die Sendesteuerungen eintreffen können, bevor Daten gesendet werden


connection

private static ClientDavInterface connection
Verbindung zum DaV


dataModel

private static DataModel dataModel
Das Datenmodell


debug

private static Debug debug
Die Debug-Ausgabe


isAutarkic

private static boolean isAutarkic
Zeigt an, ob Datengenerator autark arbeiten, d. h. die Ausgabe lediglich mitprotokollieren, soll, ohne generierte Daten an einen DaV zu senden


numberOfThreads

private static int numberOfThreads
Anzahl der laufenden Datenerzeugungs-Threads


pmc

private static ProtocolModuleConnector pmc
Andockstelle für Protokollierungsmodule


hasSendControl

private static boolean hasSendControl
Gibt an, ober der Datengenerator Sendesteuerung wünscht oder nicht.

Constructor Detail

DataGenerator

private DataGenerator(ClientDavParameters parameters,
                      List subscriptionInfos,
                      XmlFormatReader xfr)
               throws Exception
Erzeugt einen neuen Datengenerator, der Daten aus einer XML-Protokolldatei einliest und als Datentelegramme versendet

Parameters:
subscriptionInfos - Liste der anzumeldenden Daten
xfr - XmlFormatReader zum Interprtieren der XML-Datei
parameters - ClientDavParameters mit den Kommandozeilenparametern
Throws:
Exception - bei Problemen

DataGenerator

private DataGenerator(ClientDavParameters parameters,
                      List subscriptionInfos)
               throws Exception
Erzeugt einen neuen Datengenerator, der Zufallsdaten erzeugt und als Datentelegramme versendet

Parameters:
parameters - ClientDavParameters der Applikation
subscriptionInfos - Liste der anzumeldenden Daten
Throws:
Exception - bei Problemen
Method Detail

checkSubscription

public static void checkSubscription(List subscriptions)
Anmeldungen durchgehen und den Wunsch nach Sendesteuerung entsprechend setzen. Sind keine Objekte angegeben, wird die Auswertung auf einen späteren Zeitpunkt verschoben. Sonst gilt die Regel, daß generell keine Sendesteuerung gewünscht wird, außer es ist mindestens ein Sender vorhanden.

Parameters:
subscriptions - Liste der Anmeldunge

dataRequest

public void dataRequest(SystemObject object,
                        DataDescription dataDescription,
                        byte state)
Sendesteuerung des Datenverteilers an die Applikation.

Specified by:
dataRequest in interface ClientSenderInterface
Parameters:
object - Das in der zugehörigen Sendeanmeldung angegebene Objekt, auf das sich die Sendesteuerung bezieht.
dataDescription - Beschreibende Informationen zu den angemeldeten Daten auf die sich die Sendesteuerung bezieht.
state - Status der Sendesteuerung. Kann einen der Werte START_SENDING, STOP_SENDING, STOP_SENDING_NO_RIGHTS, STOP_SENDING_NOT_A_VALID_SUBSCRIPTION enthalten.

getIsAutarkic

public boolean getIsAutarkic()
Liefert Information, ob Datengenerator autark läuft oder nicht.

Returns:
boolean, welches true ist, falls der Datengenerator autark läuft. Sonst ist es false.

hasDataRequest

private static boolean hasDataRequest(ResultData data)
Methode zur Feststellung, ob angegebenes Objekt gesendet werden darf

Parameters:
data - Der zu prüfende Datensatz
Returns:
boolean welches anzeigt, ob das angegebene Objekt gesendet werden darf

isRequestSupported

public boolean isRequestSupported(SystemObject object,
                                  DataDescription dataDescription)
Diese Methode muss von der Applikation implementiert werden, um zu signalisieren, ob Sendesteuerungen gewünscht sind und mit der Methode dataRequest verarbeitet werden. Da hier Sendesteuerung erwünscht ist, liefert diese Methode true zurück.

Specified by:
isRequestSupported in interface ClientSenderInterface
Parameters:
object - Das in der zugehörigen Sendeanmeldung angegebene System-Objekt.
dataDescription - Die in der zugehörigen Sendeanmeldung angegebenen beschreibenden Informationen der angemeldeten Daten.
Returns:
true, falls Sendesteuerungen gewünscht sind, sonst false.

main

public static void main(String[] arguments)
Hauptfunktion des Datengenerators

Parameters:
arguments - String[] mit Aufrufargumenten

register

private List register(List subscriptionInfos)
               throws Exception
Registrierung durchführen

Parameters:
subscriptionInfos - List mit den Anmeldeinformationen
Returns:
List mit allen angemeldeten Objekten
Throws:
Exception - bei Problemen