Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@ package org.eclipse.set.feature.plazmodel.check
import java.util.List
import java.util.Map
import java.util.Set
import org.eclipse.set.model.plazmodel.PlazError
import org.eclipse.set.model.plazmodel.PlazFactory
import org.eclipse.set.model.validationreport.ValidationSeverity
import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGroup
import org.eclipse.set.basis.constants.Events
import org.eclipse.set.model.planpro.Ansteuerung_Element.Aussenelementansteuerung
import org.eclipse.set.model.planpro.Bahnsteig.Bahnsteig_Anlage
import org.eclipse.set.model.planpro.Bahnsteig.Bahnsteig_Kante
import org.eclipse.set.model.planpro.BasisTypen.Zeiger_TypeClass
import org.eclipse.set.model.planpro.Basisobjekte.Ur_Objekt
import org.eclipse.set.model.planpro.Geodaten.GEO_Kante
import org.eclipse.set.model.planpro.Geodaten.TOP_Kante
Expand All @@ -27,19 +25,27 @@ import org.eclipse.set.model.planpro.Signale.Signal_Rahmen
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.W_Kr_Anlage
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.W_Kr_Gsp_Element
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.W_Kr_Gsp_Komponente
import org.eclipse.set.model.plazmodel.PlazError
import org.eclipse.set.model.plazmodel.PlazFactory
import org.eclipse.set.model.validationreport.ValidationSeverity
import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGroup
import org.osgi.service.component.annotations.Component
import org.osgi.service.event.Event
import org.osgi.service.event.EventConstants
import org.osgi.service.event.EventHandler

import static extension org.eclipse.set.ppmodel.extensions.PlanProSchnittstelleExtensions.*

/**
* Validates that Object isn't planning- und consideration- region same time
* Validates that Object and the referenced objects are in same region planing/consideration
*
* @author Truong
*/
@Component(immediate=true)
class PlanungsBereichValid extends AbstractPlazContainerCheck implements PlazCheck {
Set<Ur_Objekt> planningsObjects = newHashSet

@Component(immediate=true, property=#[EventConstants.EVENT_TOPIC + "=" +
Events.CLOSE_SESSION,
EventConstants.EVENT_TOPIC + "=" + Events.MODEL_CHANGED])
class PlanungsBereichValid extends AbstractPlazContainerCheck implements PlazCheck, EventHandler {
Set<String> planningsObjectGuids = newHashSet
static val relevantTypeObjects = #[
Signal,
Signal_Rahmen,
Expand All @@ -57,32 +63,40 @@ class PlanungsBereichValid extends AbstractPlazContainerCheck implements PlazChe
override List<PlazError> run(MultiContainer_AttributeGroup container) {
modelSession.planProSchnittstelle.LSTPlanungGruppe.orElse(null)?.forEach [
val objects = LSTPlanungEinzel?.LSTObjektePlanungsbereich?.
IDLSTObjektPlanungsbereich?.filterNull?.map[value]
IDLSTObjektPlanungsbereich?.filterNull?.map[wert]
if (objects.nullOrEmpty) {
return
}
planningsObjects.addAll(objects)
planningsObjectGuids.addAll(objects)
]
if (planningsObjects.nullOrEmpty) {

val objectWithReferences = container.urObjekt.filter [ obj |
relevantTypeObjects.exists[isInstance(obj)]
].toMap([it], [eAllContents.filter(Zeiger_TypeClass).toSet]).filter [ obj, references |
!references.nullOrEmpty
]

if (planningsObjectGuids.nullOrEmpty) {
return #[]
}
return container.urObjekt.filter(
obj |
relevantTypeObjects.exists[isInstance(obj)]
).flatMap[checkObject].toList
return container.urObjekt.filter [ obj |
relevantTypeObjects.exists[isInstance(obj)]
].flatMap[checkObject(objectWithReferences)].toList
}

private def Iterable<PlazError> checkObject(Ur_Objekt object) {
val guid = object.identitaet?.wert
private def Iterable<PlazError> checkObject(Ur_Objekt source,
Map<Ur_Objekt, Set<Zeiger_TypeClass>> objectWithReferencesMap) {
val guid = source.identitaet?.wert
if (guid === null) {
return #[]
}

val isPlanning = isPlanningObject(object)
val mismatchedObjects = object.referencedObjects.filter [
isPlanningObject(it) !== isPlanning
].filterNull
val isPlanning = isPlanningObject(source)

val mismatchedObjects = objectWithReferencesMap.filter [ obj, references |
obj !== source && isPlanningObject(obj) !== isPlanning &&
references.exists[wert == source.identitaet.wert]
].keySet.filterNull
return mismatchedObjects.map [
val err = PlazFactory.eINSTANCE.createPlazError
err.message = transformErrorMsg(
Expand All @@ -91,21 +105,15 @@ class PlanungsBereichValid extends AbstractPlazContainerCheck implements PlazChe
"REF_GUID", identitaet?.wert)
)
err.type = "Planungs-/Betrachtungsbereich"
err.object = object
err.object = source
err.severity = ValidationSeverity.WARNING
return err
]

}

private def Set<Ur_Objekt> getReferencedObjects(Ur_Objekt source) {
return source.eCrossReferences.filter(Ur_Objekt).filter [ obj |
relevantTypeObjects.exists[isInstance(obj) && obj != source]
].filterNull.toSet
}

private def boolean isPlanningObject(Ur_Objekt parent) {
return planningsObjects.contains(parent)
return planningsObjectGuids.exists[it == parent.identitaet.wert]
}

override checkType() {
Expand All @@ -119,4 +127,12 @@ class PlanungsBereichValid extends AbstractPlazContainerCheck implements PlazChe
override getGeneralErrMsg() {
return "Das Objekt {GUID} verweist auf das zugehörige Objekt {TYP} {REF_GUID}, die Objekte liegen aber uneinheitlich in Planungs- und Betrachtungsbereich."
}

override handleEvent(Event event) {
if (event.topic == Events.CLOSE_SESSION ||
event.topic === Events.MODEL_CHANGED) {
planningsObjectGuids.clear
}
}

}
Loading
Loading