Commit 2738455c authored by Uwe Peuker's avatar Uwe Peuker

Merge branch 'release/1.9.0'

parents 65fa19a2 8b763cd3
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>de.bsvrz.sys.funclib.bitctrl.dua</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>de.bsvrz.sys.funclib.bitctrl.dua</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
</natures>
</projectDescription>
......@@ -17,6 +17,14 @@ genutzt werden oder potentiell genutzt werden können.
Versionsgeschichte
==================
1.9.0
=====
Statische Intialisierung des DuAVerkehrNetz entfernt
- Statische Methoden als deprecated markiert
- Kompatibiltätsmechanismus implementiert
1.8.0
=====
......
......@@ -5,7 +5,7 @@
<groupId>de.bsvrz.sys</groupId>
<artifactId>de.bsvrz.sys.funclib.bitctrl.dua</artifactId>
<version>1.8.0</version>
<version>1.9.0</version>
<name>Datenverteilerfunktionsbibliothek BitCtrl</name>
......
......@@ -3,4 +3,7 @@
<Match>
<Bug pattern="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE"/>
</Match>
<Match>
<Bug pattern=" ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
</Match>
</FindBugsFilter>
\ No newline at end of file
......@@ -26,8 +26,6 @@
package de.bsvrz.sys.funclib.bitctrl.dua;
import java.nio.channels.UnsupportedAddressTypeException;
import com.bitctrl.Constants;
import de.bsvrz.sys.funclib.bitctrl.daf.AbstractDavZustand;
......
......@@ -27,10 +27,15 @@
package de.bsvrz.sys.funclib.bitctrl.dua.lve;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import de.bsvrz.dav.daf.main.ClientDavInterface;
import de.bsvrz.dav.daf.main.config.ConfigurationArea;
import de.bsvrz.dav.daf.main.config.SystemObject;
import de.bsvrz.sys.funclib.bitctrl.dua.DUAInitialisierungsException;
import de.bsvrz.sys.funclib.debug.Debug;
......@@ -41,16 +46,47 @@ import de.bsvrz.sys.funclib.debug.Debug;
*/
public class DuaVerkehrsNetz {
@Deprecated
private static DuaVerkehrsNetz defaultInstance;
/**
* Flag: Wurde das statische DUA-Verkehrsnetz bereits initialisiert?
* die Datenverteilerverbindung mit dem das Netz initialisiert wurde. Es
* wird nur eine Datenverteilerverbindung unterstützt.
*/
private static boolean initialisiert;
private ClientDavInterface usedDav;
private final Map<SystemObject, FahrStreifen> fahrStreifen = new LinkedHashMap<>();
private final Map<SystemObject, MessQuerschnitt> messQuerSchnitte = new LinkedHashMap<>();
private final Map<SystemObject, MessQuerschnittVirtuell> messQuerSchnitteVirtuell = new LinkedHashMap<>();
private final Map<SystemObject, MessStelle> messStellen = new LinkedHashMap<>();
private final Map<SystemObject, MessStellenGruppe> messStellenGruppen = new LinkedHashMap<>();
/**
* Standardkonstruktor.
* erzeugt ein {@link DuaVerkehrsNetz} auf Basis der übergebenen
* Datenverteilerverbindung.
*
* Das verwendete Modell kann durch die Übergabe einer Menge von
* Konfigurationsbereichen eingeschränkt werden. Ist das übergebene Feld
* leer oder wird <code>null</code> übergeben, erfolgt keine Beschränkung.
*
* @param dav
* die verwendete Datenverteilerverbindung
* @param kbs
* die optionale Liste der KB auf die das Netz beschränkt werden
* soll
*
* @throws DUAInitialisierungsException die Initialisierung des Netzes ist fehlgeschlagen.
*/
protected DuaVerkehrsNetz() {
public DuaVerkehrsNetz(ClientDavInterface dav, final ConfigurationArea[] kbs) throws DUAInitialisierungsException {
defaultInstance = this;
usedDav = dav;
fahrStreifen.putAll(FahrStreifen.einlesen(this, dav, kbs));
messQuerSchnitte.putAll(MessQuerschnitt.einlesen(this, dav, kbs));
messQuerSchnitteVirtuell.putAll(MessQuerschnittVirtuell.einlesen(this, dav, kbs));
messStellen.putAll(MessStelle.einlesen(this, dav, kbs));
ermittleErsatzUndNachbarFS();
messStellenGruppen.putAll(MessStellenGruppe.einlesen(this, dav, kbs));
}
/**
......@@ -63,18 +99,18 @@ public class DuaVerkehrsNetz {
* @throws DUAInitialisierungsException
* wenn es Probleme geben sollte, die die Initialisierung des
* Netzes (im Sinne der DUA) nicht möglich machen
*
* @deprecated eine Applikation sollte eine Instanz des
* {@link DuaVerkehrsNetz} halten. Damit wäre die Relation von
* Datenverteilerverbindung (DatenModell) und implizit
* zwischengespeicherten Modellobjekten eindeutig.
*/
@Deprecated
public static synchronized void initialisiere(final ClientDavInterface dav) throws DUAInitialisierungsException {
if (DuaVerkehrsNetz.initialisiert) {
if ((defaultInstance != null) && (dav == defaultInstance.usedDav)) {
Debug.getLogger().warning("Das DUA-Verkehrsnetz wurde bereits initialisiert");
} else {
DuaVerkehrsNetz.initialisiert = true;
FahrStreifen.initialisiere(dav);
MessQuerschnitt.initialisiere(dav);
MessQuerschnittVirtuell.initialisiere(dav);
MessStelle.initialisiere(dav);
DuaVerkehrsNetz.ermittleErsatzUndNachbarFS();
MessStellenGruppe.initialisiere(dav);
defaultInstance = new DuaVerkehrsNetz(dav, null);
}
}
......@@ -90,30 +126,35 @@ public class DuaVerkehrsNetz {
* @throws DUAInitialisierungsException
* wenn es Probleme geben sollte, die die Initialisierung des
* Netzes (im Sinne der DUA) nicht möglich machen
*
* @deprecated eine Applikation sollte eine Instanz des
* {@link DuaVerkehrsNetz} halten. Damit wäre die Relation von
* Datenverteilerverbindung (DatenModell) und implizit
* zwischengespeicherten Modellobjekten eindeutig.
*/
@Deprecated
public static synchronized void initialisiere(final ClientDavInterface dav, final ConfigurationArea[] kbs)
throws DUAInitialisierungsException {
if (DuaVerkehrsNetz.initialisiert) {
if ((defaultInstance != null) && (dav == defaultInstance.usedDav)) {
Debug.getLogger().warning("Das DUA-Verkehrsnetz wurde bereits initialisiert");
} else {
DuaVerkehrsNetz.initialisiert = true;
FahrStreifen.initialisiere(dav, kbs);
MessQuerschnitt.initialisiere(dav, kbs);
MessQuerschnittVirtuell.initialisiere(dav, kbs);
MessStelle.initialisiere(dav, kbs);
DuaVerkehrsNetz.ermittleErsatzUndNachbarFS();
MessStellenGruppe.initialisiere(dav, kbs);
defaultInstance = new DuaVerkehrsNetz(dav, kbs);
}
}
@Deprecated
static DuaVerkehrsNetz getDefaultInstance() {
return defaultInstance;
}
/**
* Ermittelt für alle Fahrstreifen die Nachbar- bzw. Ersatzfahrstreifen, so
* diese nicht explizit versorgt sind und trägt sie an den entsprechenden
* Fahrtreifen ein
*/
private static void ermittleErsatzUndNachbarFS() {
private void ermittleErsatzUndNachbarFS() {
for (final MessQuerschnitt mq : MessQuerschnitt.getInstanzen()) {
for (final MessQuerschnitt mq : getAlleMessQuerSchnitte()) {
for (final FahrStreifen fs : mq.getFahrStreifen()) {
if (fs.getNachbarFahrStreifen() == null) {
......@@ -125,7 +166,7 @@ public class DuaVerkehrsNetz {
if (fs.getNachbarFahrStreifen() == null) {
Debug.getLogger()
.warning("Für Fahrstreifen " + fs + " kann " + "kein Nachbarfahrstreifen ermittelt werden");
.warning("Für Fahrstreifen " + fs + " kann " + "kein Nachbarfahrstreifen ermittelt werden");
}
if (fs.getErsatzFahrStreifen() == null) {
......@@ -154,10 +195,60 @@ public class DuaVerkehrsNetz {
if (fs.getErsatzFahrStreifen() == null) {
Debug.getLogger()
.warning("Für Fahrstreifen " + fs + " kann " + "kein Ersatzfahrstreifen ermittelt werden");
.warning("Für Fahrstreifen " + fs + " kann " + "kein Ersatzfahrstreifen ermittelt werden");
}
}
}
}
public Collection<FahrStreifen> getAlleFahrStreifen() {
return Collections.unmodifiableCollection(fahrStreifen.values());
}
public FahrStreifen getFahrStreifen(SystemObject systemObject) {
return fahrStreifen.get(systemObject);
}
public Collection<MessQuerschnitt> getAlleMessQuerSchnitte() {
return Collections.unmodifiableCollection(messQuerSchnitte.values());
}
public MessQuerschnitt getMessQuerSchnitt(SystemObject systemObject) {
return messQuerSchnitte.get(systemObject);
}
public Collection<MessQuerschnittVirtuell> getAlleMessQuerSchnitteVirtuell() {
return Collections.unmodifiableCollection(messQuerSchnitteVirtuell.values());
}
public MessQuerschnittVirtuell getMessQuerSchnittVirtuell(SystemObject systemObject) {
return messQuerSchnitteVirtuell.get(systemObject);
}
public MessQuerschnittAllgemein getMessQuerSchnittAllgemein(SystemObject mqaObjekt) {
MessQuerschnittAllgemein result = getMessQuerSchnitt(mqaObjekt);
if( result != null) {
return result;
}
return getMessQuerSchnittVirtuell(mqaObjekt);
}
public Collection<MessStelle> getAlleMessStellen() {
return Collections.unmodifiableCollection(messStellen.values());
}
public MessStelle getMessStelle(SystemObject systemObject) {
return messStellen.get(systemObject);
}
public Collection<MessStellenGruppe> getAlleMessStellenGruppen() {
return Collections.unmodifiableCollection(messStellenGruppen.values());
}
public MessStellenGruppe getMessStellenGruppe(SystemObject systemObject) {
return messStellenGruppen.get(systemObject);
}
}
......@@ -27,7 +27,7 @@
package de.bsvrz.sys.funclib.bitctrl.dua.lve;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import de.bsvrz.dav.daf.main.ClientDavInterface;
......@@ -51,17 +51,6 @@ import de.bsvrz.sys.funclib.debug.Debug;
*/
public class FahrStreifen extends AbstractSystemObjekt {
/**
* Mapt alle Fahrstreifen-Systemobjekte auf Objekte der Klasse
* <code>FahrStreifen</code>.
*/
private static Map<SystemObject, FahrStreifen> sysObjFsObjMap = new HashMap<>();
/**
* Datenverteiler-Verbindung.
*/
private static ClientDavInterface sDav;
/**
* die Lage dieses Fahrtreifens.
*/
......@@ -92,7 +81,7 @@ public class FahrStreifen extends AbstractSystemObjekt {
throw new NullPointerException("Übergebenes Fahrstreifenobjekt ist <<null>>");
}
final AttributeGroup atgEigenschaften = FahrStreifen.sDav.getDataModel()
final AttributeGroup atgEigenschaften = fsObjekt.getDataModel()
.getAttributeGroup(DUAKonstanten.ATG_FAHRSTREIFEN);
final Data eigenschaften = fsObjekt.getConfigurationData(atgEigenschaften);
......@@ -107,75 +96,38 @@ public class FahrStreifen extends AbstractSystemObjekt {
}
}
/**
* Initialisiert diese Klasse, indem für alle Systemobjekte vom Typ
* <code>typ.fahrStreifen</code> statische Instanzen dieser Klasse angelegt
* werden.
*
* @param dav1
* Datenverteiler-Verbindung
* @throws DUAInitialisierungsException
* wenn eines der Objekte nicht initialisiert werden konnte
*/
protected static final void initialisiere(final ClientDavInterface dav1) throws DUAInitialisierungsException {
if (dav1 == null) {
throw new NullPointerException("Datenverteiler-Verbindung ist <<null>>");
}
if (FahrStreifen.sDav != null) {
throw new RuntimeException("Objekt darf nur einmal initialisiert werden");
}
FahrStreifen.sDav = dav1;
for (final SystemObject fsObjekt : FahrStreifen.sDav.getDataModel().getType(DUAKonstanten.TYP_FAHRSTREIFEN)
.getElements()) {
if (fsObjekt.isValid()) {
FahrStreifen.sysObjFsObjMap.put(fsObjekt, new FahrStreifen(fsObjekt));
}
}
}
static final Map<SystemObject, FahrStreifen> einlesen(DuaVerkehrsNetz netz, final ClientDavInterface dav1,
final ConfigurationArea[] kbs) throws DUAInitialisierungsException {
/**
* Initialisiert diese Klasse, indem für alle Systemobjekte vom Typ
* <code>typ.fahrStreifen</code> statische Instanzen dieser Klasse angelegt
* werden.
*
* @param dav1
* Datenverteiler-Verbindung
* @param kbs
* Menge der zu betrachtenden Konfigurationsbereiche
* @throws DUAInitialisierungsException
* wenn eines der Objekte nicht initialisiert werden konnte
*/
protected static final void initialisiere(final ClientDavInterface dav1, final ConfigurationArea[] kbs)
throws DUAInitialisierungsException {
if (dav1 == null) {
throw new NullPointerException("Datenverteiler-Verbindung ist <<null>>");
}
if (FahrStreifen.sDav != null) {
throw new RuntimeException("Objekt darf nur einmal initialisiert werden");
}
FahrStreifen.sDav = dav1;
for (final SystemObject fsObjekt : FahrStreifen.sDav.getDataModel().getType(DUAKonstanten.TYP_FAHRSTREIFEN)
.getElements()) {
Map<SystemObject, FahrStreifen> result = new LinkedHashMap<>();
for (final SystemObject fsObjekt : dav1.getDataModel().getType(DUAKonstanten.TYP_FAHRSTREIFEN).getElements()) {
if (fsObjekt.isValid() && DUAUtensilien.isObjektInKBsEnthalten(fsObjekt, kbs)) {
FahrStreifen.sysObjFsObjMap.put(fsObjekt, new FahrStreifen(fsObjekt));
result.put(fsObjekt, new FahrStreifen(fsObjekt));
}
}
return result;
}
/**
* Erfragt alle statischen Instanzen dieser Klasse.
*
* @return alle statischen Instanzen dieser Klasse
*
* @deprecated der Zugriff auf ein Fahrstreifen-Objekt sollte über
* {@link DuaVerkehrsNetz#getAlleFahrStreifen()} erfolgen.
*/
@Deprecated
public static Collection<FahrStreifen> getInstanzen() {
if (FahrStreifen.sDav == null) {
DuaVerkehrsNetz verkehrsNetz = DuaVerkehrsNetz.getDefaultInstance();
if (verkehrsNetz == null) {
throw new RuntimeException("FahrStreifen-Klasse wurde noch nicht initialisiert");
}
return FahrStreifen.sysObjFsObjMap.values();
return verkehrsNetz.getAlleFahrStreifen();
}
/**
......@@ -187,18 +139,17 @@ public class FahrStreifen extends AbstractSystemObjekt {
* @return eine mit dem übergebenen Systemobjekt assoziierte statische
* Instanz dieser Klasse oder <code>null</code>, wenn diese Instanz
* nicht ermittelt werden konnte
*
* @deprecated der Zugriff auf ein Fahrstreifen-Objekt sollte über das
* {@link DuaVerkehrsNetz#getFahrStreifen(SystemObject)} erfolgen.
*/
@Deprecated
public static final FahrStreifen getInstanz(final SystemObject fsObjekt) {
if (FahrStreifen.sDav == null) {
throw new RuntimeException("Fahrstreifen-Klasse wurde noch nicht initialisiert");
}
FahrStreifen ergebnis = null;
if (fsObjekt != null) {
ergebnis = FahrStreifen.sysObjFsObjMap.get(fsObjekt);
DuaVerkehrsNetz verkehrsNetz = DuaVerkehrsNetz.getDefaultInstance();
if (verkehrsNetz == null) {
throw new RuntimeException("FahrStreifen-Klasse wurde noch nicht initialisiert");
}
return ergebnis;
return verkehrsNetz.getFahrStreifen(fsObjekt);
}
/**
......
......@@ -28,7 +28,7 @@ package de.bsvrz.sys.funclib.bitctrl.dua.lve;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
......@@ -51,29 +51,21 @@ import de.bsvrz.sys.funclib.debug.Debug;
*/
public class MessQuerschnitt extends MessQuerschnittAllgemein {
/**
* Mapt alle Messquerschnitt-Systemobjekte auf Objekte dieser Klasse.
*/
private static Map<SystemObject, MessQuerschnitt> sysObjMqObjMap = new HashMap<>();
/**
* Datenverteiler-Verbindung.
*/
private static ClientDavInterface sDav;
/**
* Menge der an diesem Messquerschnitt definierten Fahstreifen.
*/
private final List<FahrStreifen> fahrStreifen = new ArrayList<>();
/**
* Standardkontruktor.
*
* Konstruktor.
*
* @param netz
* das verwendete Verkehrsnetz
* @param mqObjekt
* ein Systemobjekt vom Typ <code>typ.messQuerschnitt</code>
*/
protected MessQuerschnitt(final SystemObject mqObjekt) {
super(MessQuerschnitt.sDav, mqObjekt);
private MessQuerschnitt(DuaVerkehrsNetz netz, final SystemObject mqObjekt) {
super(mqObjekt);
if (mqObjekt == null) {
throw new NullPointerException("Übergebenes Messquerschnitt-Systemobjekt ist <<null>>");
......@@ -83,7 +75,7 @@ public class MessQuerschnitt extends MessQuerschnittAllgemein {
final ObjectSet fsMenge = konfigObjekt.getNonMutableSet("FahrStreifen");
for (final SystemObject fsObj : fsMenge.getElements()) {
if (fsObj.isValid()) {
final FahrStreifen fs = FahrStreifen.getInstanz(fsObj);
final FahrStreifen fs = netz.getFahrStreifen(fsObj);
if (fs != null) {
fahrStreifen.add(fs);
} else {
......@@ -94,70 +86,38 @@ public class MessQuerschnitt extends MessQuerschnittAllgemein {
}
}
/**
* Initialisiert diese Klasse, indem für alle Systemobjekte vom Typ
* <code>typ.messQuerschnitt</code> statische Instanzen dieser Klasse
* angelegt werden.
*
* @param dav1
* Datenverteiler-Verbindung
*/
protected static void initialisiere(final ClientDavInterface dav1) {
if (dav1 == null) {
throw new NullPointerException("Datenverteiler-Verbindung ist <<null>>");
}
if (MessQuerschnitt.sDav != null) {
throw new RuntimeException("Objekt darf nur einmal initialisiert werden");
}
MessQuerschnitt.sDav = dav1;
for (final SystemObject mqObjekt : MessQuerschnitt.sDav.getDataModel().getType(DUAKonstanten.TYP_MQ)
.getElements()) {
if (mqObjekt.isValid()) {
MessQuerschnitt.sysObjMqObjMap.put(mqObjekt, new MessQuerschnitt(mqObjekt));
}
}
}
/**
* Initialisiert diese Klasse, indem für alle Systemobjekte vom Typ
* <code>typ.messQuerschnitt</code> statische Instanzen dieser Klasse
* angelegt werden.
*
* @param dav1
* Datenverteiler-Verbindung
* @param kbs
* Menge der zu betrachtenden Konfigurationsbereiche
*/
protected static void initialisiere(final ClientDavInterface dav1, final ConfigurationArea[] kbs) {
static Map<SystemObject, MessQuerschnitt> einlesen(DuaVerkehrsNetz netz, final ClientDavInterface dav1,
final ConfigurationArea[] kbs) {
if (dav1 == null) {
throw new NullPointerException("Datenverteiler-Verbindung ist <<null>>");
}
if (MessQuerschnitt.sDav != null) {
throw new RuntimeException("Objekt darf nur einmal initialisiert werden");
}
MessQuerschnitt.sDav = dav1;
Map<SystemObject, MessQuerschnitt> result = new LinkedHashMap<>();
for (final SystemObject mqObjekt : MessQuerschnitt.sDav.getDataModel().getType(DUAKonstanten.TYP_MQ)
.getElements()) {
for (final SystemObject mqObjekt : dav1.getDataModel().getType(DUAKonstanten.TYP_MQ).getElements()) {
if (mqObjekt.isValid() && DUAUtensilien.isObjektInKBsEnthalten(mqObjekt, kbs)) {
MessQuerschnitt.sysObjMqObjMap.put(mqObjekt, new MessQuerschnitt(mqObjekt));
result.put(mqObjekt, new MessQuerschnitt(netz, mqObjekt));
}
}
return result;
}
/**
* Erfragt alle statischen Instanzen dieser Klasse.
*
* @return alle statischen Instanzen dieser Klasse
*
* @deprecated die verwendeten Messquerschnitte sollten aus
* {@link DuaVerkehrsNetz} ermittelt werden.
*/
@Deprecated
public static Collection<MessQuerschnitt> getInstanzen() {
if (MessQuerschnitt.sDav == null) {
throw new RuntimeException("Messquerschnitt-Klasse wurde noch nicht initialisiert");
DuaVerkehrsNetz verkehrsNetz = DuaVerkehrsNetz.getDefaultInstance();
if (verkehrsNetz == null) {
throw new RuntimeException("MessQuerschnitt-Klasse wurde noch nicht initialisiert");
}
return MessQuerschnitt.sysObjMqObjMap.values();
ret