de.bsvrz.puk.config.main.consistencycheck
Class ConsistencyCheck

java.lang.Object
  extended by de.bsvrz.puk.config.main.consistencycheck.ConsistencyCheck

public class ConsistencyCheck
extends Object

Die Klasse übernimmt die Konsistenzprüfung, wie sie in TPuK1-138,139,140,141 gefordert wird.

Author:
Kappich Systemberatung

Field Summary
private  Map<ConfigurationArea,Set<ConfigurationAreaDependency>> _areasDependencies
          Speichert zu einem Konfigurationsbereich die Abhängigkeiten zu anderen Konfigurationsbereichen.
private  Map<ConfigurationArea,Short> _areaVersionMap
          Speichert zu einem Konfigurationsbereich die Version, mit der der Bereich aktiviert werden soll.
private  long _configurationAuthorityId
          Objekt-ID des lokalen Konfigurationsverantwortlichen oder 0, falls der lokale Konfigurationsverantwortliche nicht bestimmt werden kann
private  ConfigAreaAndVersion[] _consistencyCheckDefinition
           
private  ConfigDataModel _dataModel
          Datenmodell für die übergebene Bereiche
private static Debug _debug
          DebugLogger für Debug-Ausgaben
private  boolean _storeDependencies
          Flag, das festlegt, ob die Abhängigkeiten zwischen Bereichen geschrieben und geprüft werden sollen.
private  VersionedView _versionedView
          Hilfsobjekt, das bei Zugriffen auf Konfigurationsdaten die Konfigurationsbereiche in vorgegebenen Versionen betrachtet
 
Constructor Summary
ConsistencyCheck(ConfigAreaAndVersion[] consistencyCheckDefinition, ConfigDataModel dataModel)
          Erstellt ein Objekt, das vorgegebene Konfigurationsbereiche einer Konsistenzprüfung unterzieht.
 
Method Summary
private  boolean checkDataSetReferences(Data data, Data parentData, ConfigurationArea configArea, DataModel dataModel, ConsistencyCheckResult errorObject, SystemObject systemObject, Map<SystemObject,List<SystemObject>> usedComponents)
          Durchläuft rekursiv einen Datensatz und prüft ob alle referenzierten Objekte im entsprechenden Konfigurationsbereich vorhanden und gültig sind.
private  void checkDependency(SystemObject systemObject, SystemObject dependencyObject, ConfigurationAreaDependencyKind dependencyKind)
          Prüft, ob ein Objekt vom anderen Abhängig ist und trägt beim Konfigurationsbereich, falls nötig, die Abhängigkeit ein.
private  boolean checkDoubleComponentUsage(SystemObject component, SystemObject componentUser, Map<SystemObject,List<SystemObject>> componentsOfAnArea, ConsistencyCheckResult result)
          Prüft, ob eine Komponente bereits von einem anderen übergeordneten Objekt benutzt wird.
private  void checkDoubleIdsInDifferentAreas(SystemObject systemObject, Map<Long,List<SystemObject>> idsFromAllAreas, ConsistencyCheckResult result)
          Diese Methode prüft, ob eine Id bereits vergeben wurde.
private  void checkDoublePidsInDifferntAreas(SystemObject systemObject, Map<String,SystemObject> pidsFromAllAreas, ConsistencyCheckResult result)
          Diese Methode prüft, ob die Pid des übergebenen Objekts bereits in einem anderen Konfigurationsbereich vergeben wurde.
private  void checkParameterTypeHierarchyDefinition(ConsistencyCheckResult result, Collection<ConfigurationObject> hierarchyObjects)
           
private  boolean configurationObjectAvailability(ConfigurationObject configurationObject)
          Prüft ob ein Objekt in der angegebenen Version gültig ist (das Objekt kann auch über die Version hinaus gültig sein).
private  void createDependency(short verifyingVersion, ConfigurationArea verifyingArea, short neededVersion, ConfigurationArea dependencyArea, ConfigurationAreaDependencyKind dependencyKind)
          Speichert eine Abhängigkeit für den Bereich verifyingArea in Map _areasDependencies.
private  StringBuffer createLocalErrorMessagePartOne(ConfigurationArea configArea, String errorType)
          Erzeugt den ersten Teil einer Fehlermeldung, die zu einem lokalen Fehler gehört.
private  short getActiveVersion(SystemObject systemObject)
          Diese Methode sucht für ein Objekt die aktive Version.
private  String getAttributeDescription(Data parentData, Data data)
           
(package private)  List<SystemObject> getAttributeGroups(SystemObjectType systemObjectType)
          Alle Attributgruppen suchen (auch supertypen)
private  short getDependenceVersion(SystemObject systemObject)
          Diese Methode gibt die Version zurück, in der eine Abhängigkeit zu dem übergebenen Objekt besteht.
(package private)  List<ObjectSetUse> getObjectSetUses(SystemObjectType systemObjectType)
          Diese Methode ermittelt anhand eines Objekt-Typen seine sämtlichen Mengenverwendungen.
private  boolean ignoreAttributeValueError(SystemObject configArea, AttributeGroup attributeGroup, Aspect aspect, Data data)
          Beim anlegen eines Konfigurationsobjekts, das einen Konfigurationsbereich darstellt, werden in einem Datensatz drei Zeitstempel gespeichert.
private  boolean isObjectTransient(SystemObject systemObject)
          Prüft, ob ein Objekt transient ist.
private  boolean isParameter(AttributeGroup checkATG)
          Prüft, ob eine ATG in der aktiven/zu aktivierenden Version parametrierend ist.
private  void saveDependencies()
          Speichert alle Abhängigkeiten zwischen Bereichen, die durch die Konsistenzprüfung gefunden wurden, in entsprechenden Datensätzen im Bereich.
 ConsistencyCheckResultInterface startConsistencyCheck(KindOfConsistencyCheck kindOfConsistencyCheck)
          Diese Methode führt eine Konsistenzprüfung für alle(aktive, im Konstruktor übergebene, nur in den Verwaltungsinformationen) Konfigurationsbereiche durch.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_debug

private static final Debug _debug
DebugLogger für Debug-Ausgaben


_consistencyCheckDefinition

private final ConfigAreaAndVersion[] _consistencyCheckDefinition

_dataModel

private final ConfigDataModel _dataModel
Datenmodell für die übergebene Bereiche


_versionedView

private final VersionedView _versionedView
Hilfsobjekt, das bei Zugriffen auf Konfigurationsdaten die Konfigurationsbereiche in vorgegebenen Versionen betrachtet


_areaVersionMap

private final Map<ConfigurationArea,Short> _areaVersionMap
Speichert zu einem Konfigurationsbereich die Version, mit der der Bereich aktiviert werden soll. Kann der Bereich in der Map nicht gefunden werden, wird der Bereich in der Version, in der er derzeit läuft, weiter laufen. Als Schlüssel dient der Konfigurationsbereich, als Ergebnis wird die Version, mit der der Konfigurationsbereich in der Zukunft laufen soll, zurückgegeben.

Anmerkung: Es werden nur die Bereiche eingetragen, die auch im Konstruktor übergeben wurden.


_areasDependencies

private final Map<ConfigurationArea,Set<ConfigurationAreaDependency>> _areasDependencies
Speichert zu einem Konfigurationsbereich die Abhängigkeiten zu anderen Konfigurationsbereichen.

Key = Bereich, für den Abhängigkeiten gefunden wurden.

Value = Menge mit allen gefundenen Abhängigkeiten


_configurationAuthorityId

private long _configurationAuthorityId
Objekt-ID des lokalen Konfigurationsverantwortlichen oder 0, falls der lokale Konfigurationsverantwortliche nicht bestimmt werden kann


_storeDependencies

private boolean _storeDependencies
Flag, das festlegt, ob die Abhängigkeiten zwischen Bereichen geschrieben und geprüft werden sollen. Es gesetzt wird, wenn das Metamodell in Version 9 oder höher vorliegt.

Constructor Detail

ConsistencyCheck

public ConsistencyCheck(ConfigAreaAndVersion[] consistencyCheckDefinition,
                        ConfigDataModel dataModel)
Erstellt ein Objekt, das vorgegebene Konfigurationsbereiche einer Konsistenzprüfung unterzieht.

Parameters:
consistencyCheckDefinition - Pid´s aller Konfigurationsbereiche, die in einer neuen Version geprüft werden sollen. Zu jedem Konfigurationsbereich ist ausserdem die Version gespeichert, die aktiviert werden soll. Ist die Version 0, so wird die größte zu verwendene Version gesucht. Die ModifiableVersion darf nur dann berücksichtigt werden, wenn es auch Elemente gibt die in der ModifiableVersion geändert werden würden. Die anderen Bereiche, die nicht übergeben wurden, werden in der aktuellen Version geprüft.
dataModel - Datenmodell, mit dem die übergebenen Bereich geprüft werden sollen
Method Detail

startConsistencyCheck

public ConsistencyCheckResultInterface startConsistencyCheck(KindOfConsistencyCheck kindOfConsistencyCheck)
Diese Methode führt eine Konsistenzprüfung für alle(aktive, im Konstruktor übergebene, nur in den Verwaltungsinformationen) Konfigurationsbereiche durch.

Die Version mit der der Bereich geprüft wird, wurde entweder im Konstruktor übergeben oder ist die aktuelle Version des Bereichs.

Die Methode blockiert, bis ein Ergebnis vorliegt.

Parameters:
kindOfConsistencyCheck - Bestimmt wie mit Abhängigkeiten zwischen Konfigurationsbereichen umgegangen wird. Bei einer einfachen Konsistenzprüfung werden die Abhängigkeiten zwischen den Bereichen zwar erkannt, aber nicht mittels Dätensätzen am Bereich gespeichert. Bei einer Freigabe zur Übernahme (die auch Interferenzfehler verzeiht) werden wiedrum Abhängigkeiten gespeichert, die bei einer lokalen Aktivierung nicht gespeichert werden würden.
Returns:
Objekt, das das Ergebnis der Konsistenzprüfung enthält und im Fehlerfall die unterschiedlichen Fehlermeldungen zurückgibt.

checkDependency

private void checkDependency(SystemObject systemObject,
                             SystemObject dependencyObject,
                             ConfigurationAreaDependencyKind dependencyKind)
Prüft, ob ein Objekt vom anderen Abhängig ist und trägt beim Konfigurationsbereich, falls nötig, die Abhängigkeit ein.

Der Konfigurationsverantwortliche des Parameters systemObject muss der Verantwortliche der Konfiguration sein, da nur dieser Abhängigkeiten in den Bereichen eintragen darf.

Wenn die beiden Objekte im selben Bereich sind, kommt es zu keiner Abhängigkeit.

Parameters:
systemObject - Objekt, das vielleicht von einem anderen Objekt abhängig ist und somit dazu führt, dass der Bereich des Objekts eine Abhängigkeit zu einem anderen Bereich erhält.
dependencyObject - Objekt von dem der Parameter systemObject abhängig ist.
dependencyKind - Art der Abhängigkeit, wenn eine Abhängigkeit gefunden wird. Als Versionen werden die eingetragen, in der die Aktion ausgeführt wird, dies muss nicht unbedingt die aktuelle sein.

isObjectTransient

private boolean isObjectTransient(SystemObject systemObject)
Prüft, ob ein Objekt transient ist. Konfigurationsobjekt sind niemals transient, dort wird immer false zurückgegeben. Bei dynamischen Objekten muss dies geprüft werden.

Parameters:
systemObject - Objekt, das geprüft werden soll, ob es transient ist.
Returns:
false, wenn ein dynamisches Objekt nicht transient ist und false, wenn ein Konfigurationsobjekt übergeben wird; true, wenn ein dynamisches Objekt transient ist.

createDependency

private void createDependency(short verifyingVersion,
                              ConfigurationArea verifyingArea,
                              short neededVersion,
                              ConfigurationArea dependencyArea,
                              ConfigurationAreaDependencyKind dependencyKind)
Speichert eine Abhängigkeit für den Bereich verifyingArea in Map _areasDependencies.

Damit die Daten endgültig als Datensatz gespeichert werden, muss die Methode saveDependencies() aufgerufen werden.

Parameters:
verifyingVersion - Version, in der die Abhängigkeit entstanden ist.
verifyingArea - Bereich, der ab verifyingVersion vom Bereich dependencyArea abhängig ist.
neededVersion - Version, in der der Bereich dependencyArea vorliegen muss, damit die Abhängigkeit aufgelöst werden kann.
dependencyArea - Bereich, von dem verifyingArea abhängig ist.
dependencyKind - Art der Abhängigkeit

saveDependencies

private void saveDependencies()
                       throws ConfigurationChangeException
Speichert alle Abhängigkeiten zwischen Bereichen, die durch die Konsistenzprüfung gefunden wurden, in entsprechenden Datensätzen im Bereich.

Die Methode sperrt die _areasDependencies bis alle Operationen abgeschlossen sind.

Throws:
ConfigurationChangeException - Wird geworfen, wenn der Datensatz, der die Abhängigkeiten enthält, nicht geschrieben werden kann.

checkParameterTypeHierarchyDefinition

private void checkParameterTypeHierarchyDefinition(ConsistencyCheckResult result,
                                                   Collection<ConfigurationObject> hierarchyObjects)

isParameter

private boolean isParameter(AttributeGroup checkATG)
Prüft, ob eine ATG in der aktiven/zu aktivierenden Version parametrierend ist.

Parameters:
checkATG - ATG, die geprüft werden soll
Returns:
true, wenn die übergeben ATG in der übergebenen Version gültig ist; false, wenn nicht.

ignoreAttributeValueError

private boolean ignoreAttributeValueError(SystemObject configArea,
                                          AttributeGroup attributeGroup,
                                          Aspect aspect,
                                          Data data)
Beim anlegen eines Konfigurationsobjekts, das einen Konfigurationsbereich darstellt, werden in einem Datensatz drei Zeitstempel gespeichert.

Bei der ersten Version wurden diese drei Zeitstempel mit 0 deklariert. Die Zahl 0 im Zusammenhang mit abseluten Zeitangaben wurden aber zur Erkennung des "undefiniert" Werts benutzt. Damit waren diese Datensätze immer "nicht definiert", dies wurde in der Konsistenzprüfung als Fehler erkannt (Der Datensatz war nicht definiert).

Dieser Fehler wird im Rahmen des Imports behoben, neue Objekte bekommen als Zeitstempel die aktuelle Zeit.

Damit trotzdem mit alten Daten weiter gearbeitet werden kann, wird dieser Fehler absichtlich von der Konsistenzprüfung ignoriert.

Es müssen folgende Bediengungen erfüllt sein, damit diese Methode true zurück gibt: 1) Das übergebene Objekt muss ein Konfigurationsbereich sein 2) Es muss sich um die Attributgruppe "atg.konfigurationsBereichÄnderungsZeiten" handeln 3) Es muss der Aspekt "asp.eigenschaften" Eigenschaften benutzt werden 4) Einer der folgenden Attribute muss 0 sein: LetzteÄnderungszeitDynamischesObjekt, LetzteÄnderungszeitKonfigurationsObjekt, LetzteÄnderungszeitDatensatz 5) Falls ein Attribut nicht 0 ist, so muss der Wert des Attributs definiert sein.

Parameters:
configArea - Es muss sich um einen Konfigurationsbereich handeln (das wird mit instanceOf geprüft)
attributeGroup - ATG, die zu einem Fehler führte
aspect - Aspekt, der zu einem Fehler führte
data - Datensatz, der Daten enthält, die nicht definiert sind.
Returns:
true, wenn die übergenen Parameter zwar einen lokalen Fehler enthalten, dieser aber ignoriert werden kann. false, wenn es sich um einen lokalen Fehler handelt, der gemeldet werden muss.

checkDoubleComponentUsage

private boolean checkDoubleComponentUsage(SystemObject component,
                                          SystemObject componentUser,
                                          Map<SystemObject,List<SystemObject>> componentsOfAnArea,
                                          ConsistencyCheckResult result)
Prüft, ob eine Komponente bereits von einem anderen übergeordneten Objekt benutzt wird. Die übergebene Komponente wird in der übergebenen Map gespeichert.

Wird die Komponente bereits benutzt, so wird ein lokaler Fehler erzeugt und am übergebenen Objekt result gespeichert.

Parameters:
component - Komponente, die geprüft werden soll. Diese wird als Key in der übergebenen Map gespeichert.
componentUser - Übergeordnetes Objekt, dass die Komponente nutzt. Dieser Wert wird als Value in der Map gespeichert.
componentsOfAnArea - Map, die alle bisher benutzten Komponenten und deren Benutzer enthält.
result - Objekt, an dem lokale Fehler gespeichert werden.

Returns:
true, wenn es zu keinem Fehler gekommen ist. false, wenn eine Komponente von zwei übergeordneten Objekten benutzt wurde.

checkDoubleIdsInDifferentAreas

private void checkDoubleIdsInDifferentAreas(SystemObject systemObject,
                                            Map<Long,List<SystemObject>> idsFromAllAreas,
                                            ConsistencyCheckResult result)
Diese Methode prüft, ob eine Id bereits vergeben wurde. Dazu werden alle Ids aller betrachteten Objekte gespeichert. Wurde eine Id bereits vergeben, so wird ein lokaler Fehler gemeldet.

Parameters:
systemObject - Objekt, das überprüft werden soll
idsFromAllAreas - Map, die alle Ids speichert. In dieser Map wir das übergebene Objekt systemObject ebenfalls gespeichert.
result - Wird eine doppelte Id gefunden, so wird ein lokaler Fehler erzeugt und an diesem Objekt gespeichert.

checkDoublePidsInDifferntAreas

private void checkDoublePidsInDifferntAreas(SystemObject systemObject,
                                            Map<String,SystemObject> pidsFromAllAreas,
                                            ConsistencyCheckResult result)
Diese Methode prüft, ob die Pid des übergebenen Objekts bereits in einem anderen Konfigurationsbereich vergeben wurde. Ist dies der Fall, so wird eine Warnung erzeugt und an das übergebene Objekt result übergeben.

Eine Ausnahme bilden Objekte mit der Pid "" (es wurde keine Pid angegeben), diese werden nicht gespeichert und nicht Berücksichtigt.

Die Warnung darf nur eingetragen werden, wenn die beiden Objekte in unterschiedlichen Konfigurationsbereichen zu finden sind. Sind beide Objekte im gleichen Bereich, wurde ein lokaler Fehler gefunden. Dieser muss durch einen anderen Test gefunden und gemeldet werden.

Wurde die Pid bisher nicht vergeben, so wird sie in der übergebenen Map gespeichert.

Parameters:
systemObject - Objekt, dessen Pid geprüft werden soll.
pidsFromAllAreas - Alle Pids, die bisher in die Map eingetragen wurden. Wurde eine doppelte Pid gefunden, so wird das neue Objekt nicht in die Map eingetragen.
result - Objekt, in dem eine Warnung eingetragen wird, wenn die Pid des übergebenen Objekts systemObject bereits in der Map vorhanden war.

checkDataSetReferences

private boolean checkDataSetReferences(Data data,
                                       Data parentData,
                                       ConfigurationArea configArea,
                                       DataModel dataModel,
                                       ConsistencyCheckResult errorObject,
                                       SystemObject systemObject,
                                       Map<SystemObject,List<SystemObject>> usedComponents)
Durchläuft rekursiv einen Datensatz und prüft ob alle referenzierten Objekte im entsprechenden Konfigurationsbereich vorhanden und gültig sind.

Ist ein referenziertes Objekt als Komposition gekennzeichnet, so muss das referenzierte Objekt im übergebenen Konfigurationsbereich zu finden sein.

Ist ein referenziertes Objekt als Aggregation bzw. Assoziation gekennzeichnet, muss das referenzierte Objekt im übergebenen Datenmodell zu finden sein.

In allen Fällen muss das referenzierte Objekt in der angegebenen Version gültig sein.

Parameters:
data - Datensatz, der geprüft werden soll
parentData - Übergeordnetes Data-Objekt oder null, falls data einen ganzen Datensatz darstellt.
configArea - Konfigurationsbereich, in dem sich ein referenziertes Objekt befinden muss, wenn die Referenz als Komposition definiert ist
dataModel - Datenmodell, in dem sich ein referenziertes Objekt befinden muss, wenn die Referenz nicht als Komposition definiert ist
errorObject - Objekt, in dem ein Fehler eingetragen werden kann
systemObject - Objekt, an dem der Datensatz gespeichert ist. Diese Information wird benötigt, um eine entsprechende Fehlermeldung zu generieren
usedComponents - Speichert alle Komponenten und deren übergordnete Objekte.
Returns:
true = Alle Objekte, die referenziert werden, sind im Konfigurationsbereich vorhanden, falls nicht wird false zurückgegeben.

getAttributeDescription

private String getAttributeDescription(Data parentData,
                                       Data data)

configurationObjectAvailability

private boolean configurationObjectAvailability(ConfigurationObject configurationObject)
Prüft ob ein Objekt in der angegebenen Version gültig ist (das Objekt kann auch über die Version hinaus gültig sein).

Parameters:
configurationObject - Objekt, das geprüft werden soll
Returns:
true = Das Objekt ist in der angegebenen Version gültig, oder darüber hinaus; false = Das Objekt ist nicht gültig

createLocalErrorMessagePartOne

private StringBuffer createLocalErrorMessagePartOne(ConfigurationArea configArea,
                                                    String errorType)
Erzeugt den ersten Teil einer Fehlermeldung, die zu einem lokalen Fehler gehört. Der erste Teil ist bei jedem lokalen Fehler identisch. Der Fehlertext hat folgende Form.

"Text " "pid des Konfigurationsbereichs" " Text " "errorType" ". "

Parameters:
configArea - Konfigurationsbereich, in dem der lokale Fehler aufgetreten ist
errorType - Art des Fehlers, der aufgetreten ist
Returns:
StringBuffer, in dem weitere Informationen eingetragen werden können

getObjectSetUses

List<ObjectSetUse> getObjectSetUses(SystemObjectType systemObjectType)
Diese Methode ermittelt anhand eines Objekt-Typen seine sämtlichen Mengenverwendungen.

Parameters:
systemObjectType - der Objekt-Typ
Returns:
Alle Mengenverwendungen dieses Objekt-Typs.

getAttributeGroups

List<SystemObject> getAttributeGroups(SystemObjectType systemObjectType)
Alle Attributgruppen suchen (auch supertypen)

Parameters:
systemObjectType -
Returns:
ATG und Supertypen

getActiveVersion

private short getActiveVersion(SystemObject systemObject)
Diese Methode sucht für ein Objekt die aktive Version. Befindet sich das Objekt in einem Bereich, der aktiviert werden soll, ist die aktive Version die Version in der der Bereich aktiviert werden soll. Wird der Bereich nicht mit einer neuen Version aktiviert, so wird die derzeit aktive Version zurückgegeben.

Parameters:
systemObject - Objekt, zu dem die aktive Version des Bereich ermittelt werden soll
Returns:
Version, in der der Bereich nach (angenommener) erfolgreicher Konsistenzprüfung laufen wird

getDependenceVersion

private short getDependenceVersion(SystemObject systemObject)
Diese Methode gibt die Version zurück, in der eine Abhängigkeit zu dem übergebenen Objekt besteht. Wird ein Konfigurationsobjekt übergeben, so wird die Version zurückgegeben, in der das Objekt erzeugt wurde.

Wird ein dynamisches Objekt übergeben, so wird die Version gesucht, in der das dynamische Objekt erzeugt wurde und diese zurückgegeben. (Ein dynamisches Objekt entsteht zu einem Zeitpunkt, zu diesem Zeitpunkt muss eine Version aktiv gewesen sein, diese wird zurückgegeben.)

Parameters:
systemObject - Objekt, dessen Version gefunden werden soll
Returns:
Version, in der das Objekt benötigt wird um eine Abhängigkeit aufzulösen.