Commit c6b793bd authored by Christian Kniss's avatar Christian Kniss

Initialisierung GitLab-Repo fuer Sourcecode der SWE de.bsvrz.ste.tmcvew-FREI_V1.0.0_D2016-10-24

parents
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: gysi
Created-By: Apache Maven
Build-Jdk: 1.8.0_20
This diff is collapsed.
/*
* Segment 7 (Ste), SWE TMC-Meldungsverwaltung
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This programm is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.ste.tmcvew;
import de.bsvrz.dav.daf.main.ClientDavInterface;
import de.bsvrz.dav.daf.main.config.ConfigurationObject;
import de.bsvrz.sys.funclib.application.StandardApplication;
import de.bsvrz.sys.funclib.application.StandardApplicationRunner;
import de.bsvrz.sys.funclib.commandLineArgs.ArgumentList;
import de.bsvrz.sys.funclib.debug.Debug;
import de.bsvrz.sys.funclib.operatingMessage.MessageSender;
/**
* Applikationsklasse der SWE TMC-Meldungsverwaltung.<br>
* Für die übergebene LMS wird eine Applikations-Instanz der SWE erzeugt
* und initialisiert.<br>
* SWE-spezifische Parameter:<br>
* -lms: Die Landesmeldestelle, auf welche diese Instanz der SWE sich bezieht.
* Das Konfigurationsobjekt der LMS enthält insbesondere die zu verwendeten
* Parameter.
*
* Erstellt auf Basis der SWE RDS/TMC-Verwaltung von: Dambach Werke GmbH, Stefan Sans
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: $
*/
public class TMCVerwaltungApp implements StandardApplication {
/**
* Debug-Logger für Logging-Ausgaben.
*/
private Debug debug;
/**
* -lms von Kommandozeile.
*/
private String lmsPid;
/**
* -loeschen von Kommandozeile.
*/
private int loeschVerfahren;
/**
* -ohneZeitstempelKorrektur von Kommandozeile.
*/
private int ohneZeitstempelKorrektur;
private static final String LMS_TYP = "typ.tmcLandesMeldeStelle";
/**
* Datenverteiler-Verbindung.
*/
private ClientDavInterface connection;
/**
* Default- Konstruktor.<br>
* Wird typischerweise von <code>main</code> aufgerufen
*/
public TMCVerwaltungApp() {
try {
Thread.sleep(100);
} catch (final InterruptedException e) {
}
}
/**
* Extrahiert das Konfigurationsobjekt zur übergebenenen PID und führt ggf.
* eine Typprüfung durch.
*
* @param pid
* die PID des Konfigurationsobjektes, das extrahiert werden soll
* @param typ
* der Typ, den das Konfigutationsobjekt haben muss - wenn hier
* <code>null</code> übergeben wird, unterbleibt eine Typprüfung.
* @return das gefundene Konfigurationsobjekt
*
* @throws IllegalArgumentException
* falls Konfigurationsobjekt nicht gefunden oder vom falschen
* Typ
*/
private ConfigurationObject getKonfigObjekt(final String pid, final String typ) throws IllegalArgumentException {
ConfigurationObject obj = null;
try {
obj = (ConfigurationObject) connection.getDataModel().getObject(pid);
} catch (final ClassCastException e) {
throw new IllegalArgumentException("Die PID \"" + pid + "\" bezeichnet kein KonfigurationsObjekt");
}
if (obj == null) {
throw new IllegalArgumentException("Zur PID \"" + pid + "\" wurde kein Konfigurationsobjekt gefunden ");
}
if (typ != null && !obj.isOfType(typ)) {
throw new IllegalArgumentException(
"Das Konfigurationsobjekt \"" + obj.getPid() + "\" ist nicht vom Typ " + typ);
}
return obj;
}
/**
* überschriebene Methode von <code>StandardApplication</code>, die die
* speziellen Startparameter auswertet.<br>
* Die Argumtwerte, die ausgewertet werden, sind durch das Attribut
* {@link #lmsPid} spezifiziert
*
* @param argumentList
* siehe
* sys.funclib.application.StandardApplication#parseArguments(sys.funclib.ArgumentList)
*/
public void parseArguments(final ArgumentList argumentList) {
debug = Debug.getLogger();
lmsPid = argumentList.fetchArgument("-lms=").asNonEmptyString();
argumentList.fetchUnusedArguments();
}
/**
* Überschriebene Methode von StandardApplication, die die Initialisierung
* durchführt.<br>
* Es wird eine Instanz von <code>VerwaltungEngstellen</code> erzeugt und
* initialisiert
*
* @param con
* siehe
* sys.funclib.application.StandardApplication#initialize(de.bsvrz.dav.daf.main.ClientDavInterface)
*/
public void initialize(final ClientDavInterface con) {
this.connection = con;
try {
MessageSender.getInstance().setApplicationLabel(connection.getLocalApplicationObject().getName());
final ConfigurationObject lmsobjekt = getKonfigObjekt(lmsPid, LMS_TYP);
if (lmsobjekt == null) {
throw new RuntimeException("Das angegebene Objekt '" + lmsPid + "' kann nicht vom Datenverteiler gelesen werden!");
}
if (!lmsobjekt.isOfType(LMS_TYP)) {
throw new RuntimeException("Das angegebene Objekt '" + lmsPid + "' ist nicht vom Typ '" + LMS_TYP + "'!");
}
final TMCVerwaltung verwaltung = new TMCVerwaltung(connection, lmsobjekt, // Hauptapplikation
loeschVerfahren | ohneZeitstempelKorrektur);
// Raeumt System auf
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
debug.info("Freigabe Ressourcen ...");
verwaltung.dispose();
}
});
debug.info("SWE TMC-Meldungsverwaltung initialisiert");
} catch (final Exception e) {
debug.error("Abbruch der SWE TMC-Meldungsverwaltung während der Initialisierung", e);
System.exit(1);
}
}
/**
* Programmeinstieg TMC-Meldungsverwaltung.
*
* @param arguments
* Kommandozeilenargumente, folgende speziellen Argumente werden
* ausgewertet:
* <p>
* -netz: Netz, dessen Infrastrukturobjekte verwendet werden.
* -lms: Zuständige Landesmeldestelle (LMS).
*/
public static void main(final String[] arguments) {
StandardApplicationRunner.run(new TMCVerwaltungApp(), arguments);
}
}
This diff is collapsed.
This diff is collapsed.
/*
* Segment 7 (Ste), SWE TMC-Meldungsverwaltung
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This programm is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
/** Modul Verwaltung. */
package de.bsvrz.ste.tmcvew;
/*
* Segment 7 (Ste), SWE TMC-Meldungsverwaltung
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This programm is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.ste.tmcvew.parameter;
import java.util.Iterator;
import de.bsvrz.dav.daf.main.Data;
import de.bsvrz.dav.daf.main.Data.Array;
import de.bsvrz.dav.daf.main.config.AttributeGroup;
import de.bsvrz.dav.daf.main.config.DoubleAttributeType;
import de.bsvrz.dav.daf.main.config.IntegerAttributeType;
import de.bsvrz.dav.daf.main.config.ReferenceAttributeType;
import de.bsvrz.dav.daf.main.config.StringAttributeType;
import de.bsvrz.dav.daf.main.config.SystemObject;
import de.bsvrz.dav.daf.main.config.TimeAttributeType;
/**
* Methoden zur Bearbeitung von Datensätzen.
*
* Erstellt auf Basis der SWE RDS/TMC-Verwaltung von: Dambach Werke GmbH, Stefan Sans
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: $
*/
public final class DatenTools {
private DatenTools() {
}
/**
* Fertigt eine tiefe Kopie der Daten, die in quelle enthalten sind, in ziel
* an. Die Daten von quelle werden rekursiv durchlaufen, es werden alle
* Attributlisten, Arrays (werden vor dem Kopieren in Ziel auf die selbe
* Länge gesetzt wie in quelle) und einfache Attribute vom Typ Text, Ganzahl
* unskaliert, Ganzzahl skaliert, Zeit und Referenz unterstützt. ziel muss
* jeweils die exakt gleiche Datenstruktur wie in quelle auf demselben Level
* enthalten, die Struktur muss vollständig vorhanden sein (wie z. B., wenn
* mit
* {@link de.bsvrz.dav.daf.main.ClientDavInterface#createData(AttributeGroup)}
* erzeugt.
*
* @param quelle
* der Datensatz, dessen Daten kopiert werden sollen
* @param ziel
* der Datensatz, in den die Daten kopiert werden. Er muss die
* Struktur von Quelle enthalten
*
* @throws IllegalArgumentException
* wenn Attributtypen oder die Namen eines (Sub-)Datums auf
* einem bestimmten Level nicht gleich sind oder ein in quelle
* vorhandenes Attribut in Ziel auf demselben Level nicht
* vorhanden ist
* @throws UnsupportedOperationException
* wenn ein (Sub-)Datum nicht Attributliste, Array oder
* einfaches Datum ist, bzw. wenn bei einfachem Datum der Typ
* nicht unterstützt wird (s. o.)
*/
public static void tiefeKopie(final Data quelle, final Data ziel) {
/*
* Attributtypen müssen gleich sein auf jedem Level. Auf ATG-Level sind
* beide Attributtypen null!
*/
if ((quelle.getAttributeType() == null && ziel.getAttributeType() != null)
|| (quelle.getAttributeType() != null && ziel.getAttributeType() == null)
|| (quelle.getAttributeType() != null && ziel.getAttributeType() != null
&& !quelle.getAttributeType().equals(ziel.getAttributeType()))) {
/* Attribut-Typen auf diesem Sub-Level sind unterschiedlich */
throw new IllegalArgumentException(
"Attributtypen des Datums \"" + quelle.getName() + "\" sind nicht gleich für Quelle und Ziel");
}
/*
* Namen müssen gleich sein auf jedem Level. Ausnahme: wenn beide
* Attributtypen null sind (auf ATG-Level), wird nicht geprüft
*/
if (quelle.getAttributeType() != null && ziel.getAttributeType() != null
&& !quelle.getName().equals(ziel.getName())) {
/* Item/Attribut-Namen auf diesem Sub-Level sind unterschiedlich */
throw new IllegalArgumentException(
"Attributnamen des Datums \"" + quelle.getName() + "\" sind nicht gleich für Quelle und Ziel");
}
if (quelle.isList()) {
final Iterator<?> it = quelle.iterator();
while (it.hasNext()) {
final Data subQuelle = (Data) it.next();
final Data subZiel = ziel.getItem(subQuelle.getName());
if (subZiel == null) {
/* Ziel-Attribut mit diesem Namen existiert nicht */
throw new IllegalArgumentException(
"Ziel-Datensatz hat kein Sub-Datum \"" + subQuelle.getName() + "\"");
}
tiefeKopie(subQuelle, subZiel);
}
} else if (quelle.isArray()) {
final Array arrQuelle = quelle.asArray();
final Array arrZiel = ziel.asArray();
arrZiel.setLength(arrQuelle.getLength());
for (int i = 0; i < arrQuelle.getLength(); i += 1) {
final Data subSource = arrQuelle.getItem(i);
final Data subTarget = arrZiel.getItem(i);
tiefeKopie(subSource, subTarget);
}
} else if (quelle.isPlain()) {
if (quelle.getAttributeType() instanceof StringAttributeType) {
final String value = quelle.asTextValue().getText();
ziel.asTextValue().setText(value);
} else if (quelle.getAttributeType() instanceof IntegerAttributeType) {
final long value = quelle.asUnscaledValue().longValue();
ziel.asUnscaledValue().set(value);
} else if (quelle.getAttributeType() instanceof DoubleAttributeType) {
final double value = quelle.asScaledValue().doubleValue();
ziel.asScaledValue().set(value);
} else if (quelle.getAttributeType() instanceof TimeAttributeType) {
final long value = quelle.asTimeValue().getMillis();
ziel.asTimeValue().setMillis(value);
} else if (quelle.getAttributeType() instanceof ReferenceAttributeType) {
final SystemObject value = quelle.asReferenceValue().getSystemObject();
ziel.asReferenceValue().setSystemObject(value);
} else {
/* Nicht unterstützter Attributtyp */
throw new UnsupportedOperationException("Operation nicht definiert für Datum \"" + quelle.getName()
+ "\" und Attributtyp" + quelle.getAttributeType());
}
} else {
/* Nicht unterstützte Struktur */
throw new UnsupportedOperationException(
"Operation nur für Attributlisten, Arrays und einfache Datentypen definiert");
}
}
}
/*
* Segment 7 (Ste), SWE TMC-Meldungsverwaltung
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This programm is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.ste.tmcvew.parameter;
import de.bsvrz.dav.daf.main.ClientDavInterface;
import de.bsvrz.dav.daf.main.ClientReceiverInterface;
import de.bsvrz.dav.daf.main.Data;
import de.bsvrz.dav.daf.main.DataDescription;
import de.bsvrz.dav.daf.main.ReceiveOptions;
import de.bsvrz.dav.daf.main.ReceiverRole;
import de.bsvrz.dav.daf.main.ResultData;
import de.bsvrz.dav.daf.main.config.Aspect;
import de.bsvrz.dav.daf.main.config.AttributeGroup;
import de.bsvrz.dav.daf.main.config.SystemObject;
import de.bsvrz.sys.funclib.debug.Debug;
/**
* Empfangen und Versenden eines Parameterdatensatzes. Empfängt einen Datensatz
* einer Quell-ATG und kopiert ihn in einen Datensatz einer Ziel-ATG. Der
* Datensatz der Ziel-ATG wird mit
* {@link de.bsvrz.dav.daf.main.ClientDavInterface#createData(AttributeGroup)}
* erzeugt und muss die Struktur des Quelldatensatzes exakt enthalten. muss,
* aber eine unterschiedliche ATG haben Die Empfangs-Anmeldung -und Abmeldung
* erfolgt im Konstruktor.
*
* Erstellt auf Basis der SWE RDS/TMC-Verwaltung von: Dambach Werke GmbH, Stefan Sans
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: $
*/
public class ParameterEmpfaenger implements ClientReceiverInterface {
/**
* Debug-Logger für Logging-Ausgaben.
*/
private static final Debug DEBUG = Debug.getLogger();
/**
* Zeit in ms, die max. auf Sendesteuerung gewartet wird.
*/
static final long TIMEOUT = 5000;
/**
* Die Datenverteilerverbindung.
*/
private final ClientDavInterface connection;
/**
* Das DAV-Objekt, für das das Senden erfolgt.
*/
private final SystemObject davObjekt;
/**
* Datenbeschreibung der Daten, die aus der Parametrierung gelesen werden.
*/
private final DataDescription datenBeschreibungQuell;
/**
* Datenbeschreibung unter der die Daten zurückgegeben werden.
*/
private final DataDescription datenBeschreibungZiel;
/**
* Ist auf true gesetzt, solange auf update gewartet wird.
*/
private boolean warten;
/**
* Empfangene Daten.
*/
private ResultData davData;
/**
* Konstruktor.
*
* @param con {@link ClientDavInterface}
* @param obj {@link SystemObject}
* @param atgQuellPid PID der Quell-Attributgruppe
* @param datenBeschreibungZiel {@link DataDescription} für Zieldaten
*/
public ParameterEmpfaenger(final ClientDavInterface con, final SystemObject obj, final String atgQuellPid,
final DataDescription datenBeschreibungZiel) {
connection = con;
davObjekt = obj;
final AttributeGroup atg = connection.getDataModel().getAttributeGroup(atgQuellPid);
final Aspect asp = connection.getDataModel().getAspect("asp.parameterSoll");
datenBeschreibungQuell = new DataDescription(atg, asp);
this.datenBeschreibungZiel = datenBeschreibungZiel;
connection.subscribeReceiver(this, davObjekt, datenBeschreibungQuell, ReceiveOptions.normal(),
ReceiverRole.receiver());
DEBUG.finest(datenBeschreibungQuell + " zum Empfang angemeldet für " + davObjekt);
DEBUG.finer("Warte max. " + TIMEOUT + "ms auf Update Parameter-Daten von " + atg.getPid() + " für "
+ davObjekt.getPid());
synchronized (this) {
if (getData() == null) {
warten = true;
try {
wait(TIMEOUT);
} catch (final InterruptedException e) {
// tue nichts
}
warten = false;
}
}
if (getData() == null) {
DEBUG.warning("Keine Parameter-Daten empfangen von " + atg.getPid() + " für " + davObjekt.getPid());
}
connection.unsubscribeReceiver(this, davObjekt, datenBeschreibungQuell);
DEBUG.finest("Empfang abgemeldet von " + datenBeschreibungQuell + " für " + davObjekt);
}
/**
* Gibt die empfangenen Daten zur&uuml;ck.
*
* @return {@link ResultData}
*/
public ResultData getData() {
return davData;
}
@Override
public void update(final ResultData[] resultData) {
for (ResultData data : resultData) {
final Aspect asp = data.getDataDescription().getAspect();
final AttributeGroup atg = data.getDataDescription().getAttributeGroup();
if (atg.equals(datenBeschreibungQuell.getAttributeGroup())
&& asp.equals(datenBeschreibungQuell.getAspect())) {
if (data.hasData()) {
final Data datenSatz = connection.createData(datenBeschreibungZiel.getAttributeGroup());
DatenTools.tiefeKopie(data.getData(), datenSatz);
davData = new ResultData(davObjekt, datenBeschreibungZiel, data.getDataTime(), datenSatz);
DEBUG.fine(
"Bestehende Parameter-Daten empfangen von " + atg.getPid() + " für " + davObjekt.getPid());
} else {
davData = new ResultData(davObjekt, datenBeschreibungZiel, data.getDataTime(), null);
}
}
}
if (warten) {
synchronized (this) {
notify();
}
}
}
}
/*
* Segment 7 (Ste), SWE TMC-Meldungsverwaltung
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This programm is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.ste.tmcvew.parameter;
import de.bsvrz.dav.daf.main.ClientDavInterface;
import de.bsvrz.dav.daf.main.ClientSenderInterface;
import de.bsvrz.dav.daf.main.Data;
import de.bsvrz.dav.daf.main.DataDescription;
import de.bsvrz.dav.daf.main.DataNotSubscribedException;
import de.bsvrz.dav.daf.main.OneSubscriptionPerSendData;
import de.bsvrz.dav.daf.main.ResultData;
import de.bsvrz.dav.daf.main.SendSubscriptionNotConfirmed;
import de.bsvrz.dav.daf.main.SenderRole;
import de.bsvrz.dav.daf.main.config.Aspect;
import de.bsvrz.dav.daf.main.config.AttributeGroup;
import de.bsvrz.dav.daf.main.config.SystemObject;
import de.bsvrz.sys.funclib.debug.Debug;
/**
* Kopieren und Versenden eines Parameterdatensatzes. Kopiert einen Datensatz in
* einen anderen Datensatz, der die Struktur des Quelldatensatzes exakt
* enthalten muss, aber eine unterschiedliche ATG haben kann, und bietet
* Funktionalität zum Versenden der Daten.<br>
* Das Senden der Daten unter asp.parameterVorgabe erfolgt nach dem Starten des
* Threads, der eine Instanz dieser Klasse verkörpert.
*
* Erstellt auf Basis der SWE RDS/TMC-Verwaltung von: Dambach Werke GmbH, Stefan Sans
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: $
*/
public class ParameterSender extends Thread implements ClientSenderInterface {
/**
* Debug-Logger für Logging-Ausgaben.
*/
private static final Debug DEBUG = Debug.getLogger();
/**
* Zeitin ms, die max. auf Sendesteuerung gewartet wird.
*/
static final long TIMEOUT = 5000;
/**
* Die Datenverteilerverbindung.
*/
private final ClientDavInterface connection;
/**
* Das DAV-Objekt, für das das Senden erfolgt.
*/
private final SystemObject davObjekt;
/**
* Datenbeschreibung der Daten, die verarbeitet werden.
*/
private final DataDescription datenBeschreibung;
/**
* Die Daten, die gesendet werden sollen.
*/
private final ResultData daten;
/**
* Ist auf true gesetzt, solange auf Sendesteuerung gewartet wird.
*/
private boolean warten;
/**
* Konstruiert eine neue Instanz vom Typ <code>ParameterSender</code>. Die
* übergebenen Daten werden auf die angegebene Parameter-ATG kopiert und
* nach starten des Threads unter dem Aspekt asp.parameterVorgabe gesendet.
*
* @param con
* ClientDavInterface
* @param obj
* Systemobjekt
* @param data
* die Daten, die gesendet werden sollen
* @param atgPid
* die PID der Parameter-ATG, auf die die Daten kopiert werden
* sollen
*/
public ParameterSender(final ClientDavInterface con, final SystemObject obj, final ResultData data, final String atgPid) {
super();
connection = con;
davObjekt = obj;
final AttributeGroup atg = connection.getDataModel().getAttributeGroup(atgPid);
final Aspect asp = connection.getDataModel().getAspect("asp.parameterVorgabe");
datenBeschreibung = new DataDescription(atg, asp);
final Data datenSatz = connection.createData(atg);