Skip to content
Snippets Groups Projects
Commit 20b86aea authored by Johannes Mey's avatar Johannes Mey
Browse files

update queries to new format, synchronize namelookup and optimized

parent 4c08ceab
No related branches found
No related tags found
No related merge requests found
Showing
with 163 additions and 214 deletions
...@@ -24,4 +24,5 @@ aspect Helpers { ...@@ -24,4 +24,5 @@ aspect Helpers {
inh RailwayContainer RailwayElement.getRoot(); inh RailwayContainer RailwayElement.getRoot();
eq RailwayContainer.getRoute(int i).getRoot() = this; eq RailwayContainer.getRoute(int i).getRoot() = this;
eq RailwayContainer.getRegion(int i).getRoot() = this; eq RailwayContainer.getRegion(int i).getRoot() = this;
} }
aspect TrainPrinting { aspect TrainPrinting {
public String Name.getNodeTitle() {
return this.getClass().getSimpleName() + " " + getValue();
}
public String Segment.getNodeTitle() { public String Segment.getNodeTitle() {
return this.getClass().getSimpleName() + " with length " + getLength(); return this.getClass().getSimpleName() + " with length " + getLength();
} }
......
aspect Helpers { aspect Helpers {
syn boolean TrackElement.isSwitch();
eq Switch.isSwitch() = true;
eq Segment.isSwitch() = false;
syn Switch TrackElement.asSwitch();
eq Switch.asSwitch() = this;
eq Segment.asSwitch() = null;
syn boolean TrackElement.isSegment();
eq Switch.isSegment() = false;
eq Segment.isSegment() = true;
syn Segment TrackElement.asSegment();
eq Switch.asSegment() = null;
eq Segment.asSegment() = this;
inh Region TrackElement.containingRegion();
eq Region.getTrackElement(int i).containingRegion() = this;
syn int RailwayElement.id() = getId().getValue();
inh RailwayContainer RailwayElement.getRoot();
eq RailwayContainer.getRoute(int i).getRoot() = this;
eq RailwayContainer.getRegion(int i).getRoot() = this;
inh RailwayContainer Ref.getRoot(); inh RailwayContainer Ref.getRoot();
syn boolean Ref.references(RailwayElement node) { syn boolean Ref.references(RailwayElement node) {
return this.getValue() == node.getId().getValue(); return this.getValue() == node.getId();
} }
} }
aspect RefGenerator {
public SensorRef Sensor.createRef() {
return new SensorRef(this.id());
}
public SemaphoreRef Semaphore.createRef() {
return new SemaphoreRef(this.id());
}
public SwitchRef Switch.createRef() {
return new SwitchRef(this.id());
}
public SegmentRef Segment.createRef() {
return new SegmentRef(this.id());
}
}
...@@ -53,6 +53,16 @@ aspect TreeNavigation { ...@@ -53,6 +53,16 @@ aspect TreeNavigation {
return sensors; return sensors;
} }
syn TrackElement TrackElementRef.getTrackElement();
eq SwitchRef.getTrackElement() = getSwitch();
eq SegmentRef.getTrackElement() = getSegment();
syn boolean TrackElementRef.isSwitchRef() = false;
eq SwitchRef.isSwitchRef() = true;
syn boolean TrackElementRef.isSegmentRef() = false;
eq SegmentRef.isSegmentRef() = true;
// maps from ids to things // maps from ids to things
syn Map<Integer, Switch> RailwayContainer.switchMap() { syn Map<Integer, Switch> RailwayContainer.switchMap() {
...@@ -101,28 +111,19 @@ aspect TreeNavigation { ...@@ -101,28 +111,19 @@ aspect TreeNavigation {
// reference resolving // reference resolving
syn TrackElement Ref.asTrackElement() { syn Segment TrackElementRef.getSegment() {
TrackElement result = getRoot().segmentMap().get(this.getValue());
if (result == null) {
return getRoot().switchMap().get(this.getValue());
} else {
return result;
}
}
syn Segment Ref.asSegment() {
return getRoot().segmentMap().get(this.getValue()); return getRoot().segmentMap().get(this.getValue());
} }
syn Switch Ref.asSwitch() { syn Switch TrackElementRef.getSwitch() {
return getRoot().switchMap().get(this.getValue()); return getRoot().switchMap().get(this.getValue());
} }
syn Sensor Ref.asSensor() { syn Sensor SensorRef.getSensor() {
return getRoot().sensorMap().get(this.getValue()); return getRoot().sensorMap().get(this.getValue());
} }
syn Semaphore Ref.asSemaphore() { syn Semaphore SemaphoreRef.getSemaphore() {
return getRoot().semaphoreMap().get(this.getValue()); return getRoot().semaphoreMap().get(this.getValue());
} }
...@@ -131,16 +132,16 @@ aspect TreeNavigation { ...@@ -131,16 +132,16 @@ aspect TreeNavigation {
syn Collection<TrackElement> Sensor.monitoredElements() { syn Collection<TrackElement> Sensor.monitoredElements() {
java.util.List<TrackElement> trackElements = new ArrayList<>(); java.util.List<TrackElement> trackElements = new ArrayList<>();
for (Ref ref : getMonitoredElementList()) { for (TrackElementRef ref : getMonitoredElementList()) {
trackElements.add(ref.asTrackElement()); trackElements.add(ref.getTrackElement());
} }
return trackElements; return trackElements;
} }
syn Collection<Segment> Sensor.monitoredSegments() { syn Collection<Segment> Sensor.monitoredSegments() {
java.util.List<Segment> segments = new ArrayList<>(); java.util.List<Segment> segments = new ArrayList<>();
for (Ref ref : getMonitoredElementList()) { for (TrackElementRef ref : getMonitoredElementList()) {
Segment segment = ref.asSegment(); Segment segment = ref.getTrackElement().asSegment();
if (segment != null) { if (segment != null) {
segments.add(segment); segments.add(segment);
} }
...@@ -150,8 +151,8 @@ aspect TreeNavigation { ...@@ -150,8 +151,8 @@ aspect TreeNavigation {
syn Collection<Switch> Sensor.monitoredSwitches() { syn Collection<Switch> Sensor.monitoredSwitches() {
java.util.List<Switch> switches = new ArrayList<>(); java.util.List<Switch> switches = new ArrayList<>();
for (Ref ref : getMonitoredElementList()) { for (TrackElementRef ref : getMonitoredElementList()) {
Switch sw = ref.asSwitch(); Switch sw = ref.getTrackElement().asSwitch();
if (sw != null) { if (sw != null) {
switches.add(sw); switches.add(sw);
} }
...@@ -160,25 +161,25 @@ aspect TreeNavigation { ...@@ -160,25 +161,25 @@ aspect TreeNavigation {
} }
syn TrackElement Sensor.monitoredElement(int i) { syn TrackElement Sensor.monitoredElement(int i) {
return getMonitoredElement(i).asTrackElement(); return getMonitoredElement(i).getTrackElement();
} }
syn Sensor Route.requiredSensor(int i) { syn Sensor Route.requiredSensor(int i) {
return getRequiredSensor(i).asSensor(); return getRequiredSensor(i).getSensor();
} }
syn Collection<TrackElement> TrackElement.connectsTos() { syn Collection<TrackElement> TrackElement.connectsTos() {
java.util.List<TrackElement> trackElements = new ArrayList<>(); java.util.List<TrackElement> trackElements = new ArrayList<>();
for (Ref teRef : getConnectsToList()) { for (TrackElementRef teRef : getConnectedElementList()) {
trackElements.add(teRef.asTrackElement()); trackElements.add(teRef.getTrackElement());
} }
return trackElements; return trackElements;
} }
syn Collection<Segment> TrackElement.connectsToSegments() { syn Collection<Segment> TrackElement.connectsToSegments() {
java.util.List<Segment> segments = new ArrayList<>(); java.util.List<Segment> segments = new ArrayList<>();
for (Ref teRef : getConnectsToList()) { for (TrackElementRef teRef : getConnectedElementList()) {
Segment segment = teRef.asSegment(); Segment segment = teRef.getTrackElement().asSegment();
if (segment != null) { if (segment != null) {
segments.add(segment); segments.add(segment);
} }
...@@ -188,15 +189,15 @@ aspect TreeNavigation { ...@@ -188,15 +189,15 @@ aspect TreeNavigation {
syn Collection<Sensor> Route.requiredSensors() { syn Collection<Sensor> Route.requiredSensors() {
java.util.List<Sensor> sensors = new ArrayList<>(); java.util.List<Sensor> sensors = new ArrayList<>();
for (Ref sensorRef : getRequiredSensorList()) { for (SensorRef sensorRef : getRequiredSensorList()) {
sensors.add(sensorRef.asSensor()); sensors.add(sensorRef.getSensor());
} }
return sensors; return sensors;
} }
syn Semaphore Route.entry() { syn Semaphore Route.entry() {
if (hasEntry()) { if (hasEntry()) {
return getEntry().asSemaphore(); return getEntry().getSemaphore();
} else { } else {
return null; return null;
} }
...@@ -204,34 +205,34 @@ aspect TreeNavigation { ...@@ -204,34 +205,34 @@ aspect TreeNavigation {
syn Semaphore Route.exit() { syn Semaphore Route.exit() {
if (hasExit()) { if (hasExit()) {
return getExit().asSemaphore(); return getExit().getSemaphore();
} else { } else {
return null; return null;
} }
} }
syn Switch SwitchPosition.target() { syn Switch SwitchPosition.target() {
return getTarget().asSwitch(); return getTarget().getSwitch();
} }
syn Collection<Sensor> TrackElement.monitoringSensors() { syn Collection<Sensor> TrackElement.monitoredBy() {
return getRoot().monitoringSensorsMap().get(this.id()); return getRoot().monitoredByMap().get(this.id());
} }
syn Map<Integer,Set<Sensor>> RailwayContainer.monitoringSensorsMap() { syn Map<Integer,Set<Sensor>> RailwayContainer.monitoredByMap() {
Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<Integer,Set<Sensor>>(); Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<>();
// fill the keys // fill the keys
for (Region region: getRegionList()) { for (Region region: getRegionList()) {
for (TrackElement trackElement: region.getTrackElementList()) { for (TrackElement trackElement: region.getTrackElementList()) {
sensorMap.put(trackElement.id(), new java.util.HashSet()); sensorMap.put(trackElement.id(), new java.util.HashSet<>());
} }
} }
// update the values // update the values
for (Sensor sensor : sensors()) { for (Sensor sensor : sensors()) {
for (Ref teRef : sensor.getMonitoredElementList()) { for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
sensorMap.get(teRef.getValue()).add(sensor); sensorMap.get(trackElementRef.getValue()).add(sensor);
} }
} }
...@@ -243,16 +244,16 @@ aspect TreeNavigation { ...@@ -243,16 +244,16 @@ aspect TreeNavigation {
} }
syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() { syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
Map<Integer,Set<Route>> routeMap = new java.util.HashMap<Integer,Set<Route>>(); Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
// fill the keys // fill the keys
for (Sensor sensor: sensors()) { for (Sensor sensor: sensors()) {
routeMap.put(sensor.id(), new java.util.HashSet()); routeMap.put(sensor.id(), new java.util.HashSet<>());
} }
// update the values // update the values
for (Route route : getRouteList()) { for (Route route : getRouteList()) {
for (Ref sensorRef : route.getRequiredSensorList()) { for (SensorRef sensorRef : route.getRequiredSensorList()) {
routeMap.get(sensorRef.getValue()).add(route); routeMap.get(sensorRef.getValue()).add(route);
} }
} }
......
...@@ -15,8 +15,7 @@ aspect Queries { ...@@ -15,8 +15,7 @@ aspect Queries {
Collection<Sensor> requiredSensors = requiredSensors(); Collection<Sensor> requiredSensors = requiredSensors();
for (SwitchPosition sp : getSwitchPositionList()) { for (SwitchPosition sp : getSwitchPositionList()) {
Switch sw = sp.target(); Switch sw = sp.target();
java.util.Collection<Sensor> sensors = sw.monitoringSensors(); for (Sensor sensor : sw.monitoredBy()) {
for (Sensor sensor : sensors) {
boolean validSensor = false; boolean validSensor = false;
for (Sensor sensor2 : requiredSensors) { for (Sensor sensor2 : requiredSensors) {
if (sensor2 == sensor) { if (sensor2 == sensor) {
......
...@@ -21,7 +21,7 @@ aspect Queries { ...@@ -21,7 +21,7 @@ aspect Queries {
for (Sensor sensor1 : this.requiredSensors()) { for (Sensor sensor1 : this.requiredSensors()) {
for (TrackElement te1 : sensor1.monitoredElements()) { for (TrackElement te1 : sensor1.monitoredElements()) {
for (TrackElement te2 : te1.connectsTos()) { for (TrackElement te2 : te1.connectsTos()) {
for (Sensor sensor2 : te2.monitoringSensors()) { for (Sensor sensor2 : te2.monitoredBy()) {
for (Route route2 : sensor2.requiringRoutes()) { for (Route route2 : sensor2.requiringRoutes()) {
if (this != route2) { if (this != route2) {
if (!route2.hasEntry() || route2.getEntry().getValue() != exitRef.getValue()) { if (!route2.hasEntry() || route2.getEntry().getValue() != exitRef.getValue()) {
......
// root:
RailwayContainer ::= Route* Region* ; RailwayContainer ::= Route* Region* ;
abstract RailwayElement ::= Id ; abstract RailwayElement ::= <Id:int>;
Region : RailwayElement ::= TrackElement* Sensor*; Region : RailwayElement ::= TrackElement* Sensor*;
Semaphore : RailwayElement ::= <Signal:Signal>; Semaphore : RailwayElement ::= <Signal:Signal>;
Route:RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:Ref* [Entry:Ref] [Exit:Ref] ; Route : RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:SensorRef* [Entry:SemaphoreRef] [Exit:SemaphoreRef];
SwitchPosition:RailwayElement ::= <Position:Position> Target:Ref ; SwitchPosition : RailwayElement ::= <Position:Position> Target:SwitchRef;
Sensor:RailwayElement ::= MonitoredElement:Ref* ; Sensor : RailwayElement ::= MonitoredElement:TrackElementRef*;
abstract TrackElement:RailwayElement ::= ConnectsTo:Ref* ; abstract TrackElement:RailwayElement ::= ConnectedElement:TrackElementRef*;
Segment:TrackElement ::= <Length:int> Semaphore*; Segment:TrackElement ::= <Length:int> Semaphore*;
Switch:TrackElement ::= <CurrentPosition:Position>; Switch:TrackElement ::= <CurrentPosition:Position>;
abstract Name ::= <Value:int> ; abstract Ref ::= <Value:int> ;
Id:Name ; SensorRef : Ref;
Ref:Name ; SemaphoreRef : Ref;
abstract TrackElementRef : Ref;
SwitchRef : TrackElementRef;
SegmentRef : TrackElementRef;
\ No newline at end of file
...@@ -63,6 +63,7 @@ public class ASTNodeDeserializer extends StdDeserializer<ASTNode> { ...@@ -63,6 +63,7 @@ public class ASTNodeDeserializer extends StdDeserializer<ASTNode> {
// get the type we want to create // get the type we want to create
String type = node.get("t").asText(); String type = node.get("t").asText();
Class typeClass; Class typeClass;
try { try {
typeClass = Class.forName(packageName + "." + type); typeClass = Class.forName(packageName + "." + type);
......
...@@ -19,26 +19,26 @@ public class JastaddTransformationInjectConnectedSegments<TJastaddDriver extends ...@@ -19,26 +19,26 @@ public class JastaddTransformationInjectConnectedSegments<TJastaddDriver extends
public void activate(final Collection<JastaddConnectedSegmentsInjectMatch> matches) { public void activate(final Collection<JastaddConnectedSegmentsInjectMatch> matches) {
for (final JastaddConnectedSegmentsInjectMatch match : matches) { for (final JastaddConnectedSegmentsInjectMatch match : matches) {
// create segment2 // create segment2
List<Ref> connectedSegments = new List<>(); List<TrackElementRef> connectedSegments = new List<>();
connectedSegments.add(new Ref(match.getSegment3().id())); connectedSegments.add(match.getSegment3().createRef());
List<Semaphore> semaphores = new List<>(); List<Semaphore> semaphores = new List<>();
Segment segment2 = new Segment(new Id(driver.nextId()), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores); Segment segment2 = new Segment(driver.nextId(), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
match.getSegment1().containingRegion().addTrackElement(segment2); match.getSegment1().containingRegion().addTrackElement(segment2);
// have the sensor monitor the segment // have the sensor monitor the segment
match.getSensor().addMonitoredElement(new Ref(segment2.id())); match.getSensor().addMonitoredElement(segment2.createRef());
// remove the connection of segment1 to segment3 // remove the connection of segment1 to segment3
for (int i = 0; i < match.getSegment1().getConnectsToList().getNumChild(); i++) { for (int i = 0; i < match.getSegment1().getConnectedElementList().getNumChild(); i++) {
if (match.getSegment1().getConnectsTo(i).getValue() == match.getSegment3().id()) { if (match.getSegment1().getConnectedElement(i).getValue() == match.getSegment3().id()) {
match.getSegment1().getConnectsToList().removeChild(i); match.getSegment1().getConnectedElementList().removeChild(i);
break; break;
} }
} }
// connect segment1 to segment2 // connect segment1 to segment2
match.getSegment1().addConnectsTo(new Ref(segment2.id())); match.getSegment1().addConnectedElement(segment2.createRef());
} }
driver.flushCache(); driver.flushCache();
} }
......
package de.tudresden.inf.st.train.jastadd.transformations.inject; package de.tudresden.inf.st.train.jastadd.transformations.inject;
import de.tudresden.inf.st.train.jastadd.ast.Ref; import de.tudresden.inf.st.train.jastadd.ast.SensorRef;
import de.tudresden.inf.st.train.jastadd.ast.Sensor; import de.tudresden.inf.st.train.jastadd.ast.Sensor;
import de.tudresden.inf.st.train.jastadd.ast.List; import de.tudresden.inf.st.train.jastadd.ast.List;
import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver; import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
...@@ -17,32 +17,21 @@ public class JastaddTransformationInjectRouteSensor<TJastaddDriver extends Jasta ...@@ -17,32 +17,21 @@ public class JastaddTransformationInjectRouteSensor<TJastaddDriver extends Jasta
public JastaddTransformationInjectRouteSensor(final TJastaddDriver driver) { public JastaddTransformationInjectRouteSensor(final TJastaddDriver driver) {
super(driver); super(driver);
// for (int i = 0; i<10; i++) {
// try
// {
// Thread.sleep(1000);
// }
// catch(InterruptedException ex)
// {
// Thread.currentThread().interrupt();
// }
// System.out.println("waiting...");
// }
} }
@Override @Override
public void activate(final Collection<JastaddRouteSensorInjectMatch> matches) { public void activate(final Collection<JastaddRouteSensorInjectMatch> matches) {
java.util.List<Ref> refsToBeRemoved = new ArrayList<>(); java.util.List<SensorRef> refsToBeRemoved = new ArrayList<>();
for (final JastaddRouteSensorInjectMatch match : matches) { for (final JastaddRouteSensorInjectMatch match : matches) {
for (Ref ref : match.getRoute().getRequiredSensors()) { for (SensorRef ref : match.getRoute().getRequiredSensors()) {
if (ref.asSensor() == match.getSensor()) { if (ref.getSensor() == match.getSensor()) {
refsToBeRemoved.add(ref); refsToBeRemoved.add(ref);
} }
} }
} }
for(Ref ref : refsToBeRemoved) { for(SensorRef ref : refsToBeRemoved) {
ref.removeSelf(); ref.removeSelf();
} }
......
package de.tudresden.inf.st.train.jastadd.transformations.inject; package de.tudresden.inf.st.train.jastadd.transformations.inject;
import de.tudresden.inf.st.train.jastadd.ast.Sensor; import de.tudresden.inf.st.train.jastadd.ast.Sensor;
import de.tudresden.inf.st.train.jastadd.ast.Switch; import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
import de.tudresden.inf.st.train.jastadd.ast.Ref;
import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver; import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredInjectMatch; import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredInjectMatch;
import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation; import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation;
...@@ -19,19 +18,19 @@ public class JastaddTransformationInjectSwitchMonitored<TJastaddDriver extends J ...@@ -19,19 +18,19 @@ public class JastaddTransformationInjectSwitchMonitored<TJastaddDriver extends J
@Override @Override
public void activate(final Collection<JastaddSwitchMonitoredInjectMatch> matches) { public void activate(final Collection<JastaddSwitchMonitoredInjectMatch> matches) {
java.util.List<Ref> refsToBeRemoved = new ArrayList<>(); java.util.List<TrackElementRef> refsToBeRemoved = new ArrayList<>();
for (final JastaddSwitchMonitoredInjectMatch match : matches) { for (final JastaddSwitchMonitoredInjectMatch match : matches) {
for (final Sensor sensor : match.getSw().monitoringSensors()) { for (final Sensor sensor : match.getSw().monitoredBy()) {
for (Ref swRef : sensor.getMonitoredElements()) { for (TrackElementRef trackElementRef : sensor.getMonitoredElements()) {
if (swRef.asSwitch() == match.getSw()) { if (trackElementRef.getTrackElement() == match.getSw()) {
refsToBeRemoved.add(swRef); refsToBeRemoved.add(trackElementRef);
} }
} }
} }
} }
for(Ref ref : refsToBeRemoved) { for(TrackElementRef ref : refsToBeRemoved) {
ref.removeSelf(); ref.removeSelf();
} }
......
...@@ -31,9 +31,9 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends ...@@ -31,9 +31,9 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
} }
} }
for (TrackElement element : region.getTrackElementList()) { for (TrackElement element : region.getTrackElementList()) {
for (int i = element.getConnectsToList().getNumChild() - 1; i >= 0; i--) { for (int i = element.getConnectedElementList().getNumChild() - 1; i >= 0; i--) {
if (element.getConnectsTo(i).getValue() == segment2.id()) { if (element.getConnectedElement(i).getValue() == segment2.id()) {
element.getConnectsTo(i).removeSelf(); element.getConnectedElement(i).removeSelf();
} }
} }
} }
...@@ -42,7 +42,7 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends ...@@ -42,7 +42,7 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
segment2.removeSelf(); segment2.removeSelf();
// connect segment1 to segment3 // connect segment1 to segment3
match.getSegment1().addConnectsTo(new Ref(match.getSegment3().id())); match.getSegment1().addConnectedElement(match.getSegment3().createRef());
} }
driver.flushCache(); driver.flushCache();
} }
......
package de.tudresden.inf.st.train.jastadd.transformations.repair; package de.tudresden.inf.st.train.jastadd.transformations.repair;
import de.tudresden.inf.st.train.jastadd.ast.Ref; import de.tudresden.inf.st.train.jastadd.ast.SensorRef;
import de.tudresden.inf.st.train.jastadd.ast.Route; import de.tudresden.inf.st.train.jastadd.ast.Route;
import de.tudresden.inf.st.train.jastadd.ast.Sensor; import de.tudresden.inf.st.train.jastadd.ast.Sensor;
import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver; import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
...@@ -21,7 +21,7 @@ public class JastaddTransformationRepairRouteSensor<TJastaddDriver extends Jasta ...@@ -21,7 +21,7 @@ public class JastaddTransformationRepairRouteSensor<TJastaddDriver extends Jasta
for (final JastaddRouteSensorMatch rsm : matches) { for (final JastaddRouteSensorMatch rsm : matches) {
final Route route = rsm.getRoute(); final Route route = rsm.getRoute();
final Sensor sensor = rsm.getSensor(); final Sensor sensor = rsm.getSensor();
route.getRequiredSensorList().add(new Ref(sensor.id())); route.getRequiredSensorList().add(sensor.createRef());
driver.flushCache(); driver.flushCache();
} }
} }
......
package de.tudresden.inf.st.train.jastadd.transformations.repair; package de.tudresden.inf.st.train.jastadd.transformations.repair;
import de.tudresden.inf.st.train.jastadd.ast.Ref;
import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver; import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
import de.tudresden.inf.st.train.jastadd.matches.JastaddSemaphoreNeighborMatch; import de.tudresden.inf.st.train.jastadd.matches.JastaddSemaphoreNeighborMatch;
import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation; import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation;
...@@ -17,7 +16,7 @@ public class JastaddTransformationRepairSemaphoreNeighbor<TJastaddDriver extends ...@@ -17,7 +16,7 @@ public class JastaddTransformationRepairSemaphoreNeighbor<TJastaddDriver extends
@Override @Override
public void activate(final Collection<JastaddSemaphoreNeighborMatch> matches) { public void activate(final Collection<JastaddSemaphoreNeighborMatch> matches) {
for (final JastaddSemaphoreNeighborMatch match : matches) { for (final JastaddSemaphoreNeighborMatch match : matches) {
match.getRoute2().setEntry(new Ref(match.getSemaphore().id())); match.getRoute2().setEntry(match.getSemaphore().createRef());
} }
driver.flushCache(); driver.flushCache();
} }
......
package de.tudresden.inf.st.train.jastadd.transformations.repair; package de.tudresden.inf.st.train.jastadd.transformations.repair;
import de.tudresden.inf.st.train.jastadd.ast.Id;
import de.tudresden.inf.st.train.jastadd.ast.List; import de.tudresden.inf.st.train.jastadd.ast.List;
import de.tudresden.inf.st.train.jastadd.ast.Ref; import de.tudresden.inf.st.train.jastadd.ast.SwitchRef;
import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
import de.tudresden.inf.st.train.jastadd.ast.Sensor; import de.tudresden.inf.st.train.jastadd.ast.Sensor;
import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver; import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredMatch; import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredMatch;
...@@ -23,9 +22,9 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J ...@@ -23,9 +22,9 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
for (final JastaddSwitchMonitoredMatch ssnm : matches) { for (final JastaddSwitchMonitoredMatch ssnm : matches) {
// gather the stuff we need to create a sensor: // gather the stuff we need to create a sensor:
Id id = new Id(driver.nextId()); int id = driver.nextId();
List<Ref> refList = new List<>(); List<TrackElementRef> refList = new List<>();
refList.add(new Ref(ssnm.getSw().id())); refList.add(ssnm.getSw().createRef());
Sensor sensor = new Sensor(id, refList); Sensor sensor = new Sensor(id, refList);
......
aspect Helpers { aspect Helpers {
syn boolean TrackElement.isSwitch();
eq Switch.isSwitch() = true;
eq Segment.isSwitch() = false;
syn Switch TrackElement.asSwitch();
eq Switch.asSwitch() = this;
eq Segment.asSwitch() = null;
syn boolean TrackElement.isSegment();
eq Switch.isSegment() = false;
eq Segment.isSegment() = true;
syn Segment TrackElement.asSegment();
eq Switch.asSegment() = null;
eq Segment.asSegment() = this;
inh Region TrackElement.containingRegion();
eq Region.getTrackElement(int i).containingRegion() = this;
syn int RailwayElement.id() = getId().getValue();
inh RailwayContainer RailwayElement.getRoot();
eq RailwayContainer.getRoute(int i).getRoot() = this;
eq RailwayContainer.getRegion(int i).getRoot() = this;
inh RailwayContainer Ref.getRoot(); inh RailwayContainer Ref.getRoot();
syn boolean Ref.references(RailwayElement node) { syn boolean Ref.references(RailwayElement node) {
return this.getValue() == node.getId().getValue(); return this.getValue() == node.getId();
} }
} }
aspect RefGenerator {
public SensorRef Sensor.createRef() {
return new SensorRef(this.id(), this);
}
public SemaphoreRef Semaphore.createRef() {
return new SemaphoreRef(this.id(), this);
}
public SwitchRef Switch.createRef() {
return new SwitchRef(this.id(), this);
}
public SegmentRef Segment.createRef() {
return new SegmentRef(this.id(), this);
}
}
aspect TrainPrinting {
public String Name.getNodeTitle() {
return this.getClass().getSimpleName() + " " + getValue();
}
public String Segment.getNodeTitle() {
return this.getClass().getSimpleName() + " with length " + getLength();
}
public String Route.getNodeTitle() {
return this.getClass().getSimpleName() + (getActive() ? " is active" : " is inactive");
}
public String Switch.getNodeTitle() {
return this.getClass().getSimpleName() + " is in position " + getCurrentPosition().name();
}
public String Semaphore.getNodeTitle() {
return this.getClass().getSimpleName() + " is in position " + getSignal().name();
}
public String SwitchPosition.getNodeTitle() {
return this.getClass().getSimpleName() + " is " + getPosition().name();
}
}
...@@ -53,6 +53,16 @@ aspect TreeNavigation { ...@@ -53,6 +53,16 @@ aspect TreeNavigation {
return sensors; return sensors;
} }
syn TrackElement TrackElementRef.getTrackElement();
eq SwitchRef.getTrackElement() = getSwitch();
eq SegmentRef.getTrackElement() = getSegment();
syn boolean TrackElementRef.isSwitchRef() = false;
eq SwitchRef.isSwitchRef() = true;
syn boolean TrackElementRef.isSegmentRef() = false;
eq SegmentRef.isSegmentRef() = true;
// more reference resolving // more reference resolving
syn Collection<TrackElement> Sensor.monitoredElements() { syn Collection<TrackElement> Sensor.monitoredElements() {
...@@ -95,7 +105,7 @@ aspect TreeNavigation { ...@@ -95,7 +105,7 @@ aspect TreeNavigation {
syn Collection<TrackElement> TrackElement.connectsTos() { syn Collection<TrackElement> TrackElement.connectsTos() {
java.util.List<TrackElement> trackElements = new ArrayList<>(); java.util.List<TrackElement> trackElements = new ArrayList<>();
for (TrackElementRef teRef : getConnectsToList()) { for (TrackElementRef teRef : getConnectedElementList()) {
trackElements.add(teRef.getTrackElement()); trackElements.add(teRef.getTrackElement());
} }
return trackElements; return trackElements;
...@@ -103,7 +113,7 @@ aspect TreeNavigation { ...@@ -103,7 +113,7 @@ aspect TreeNavigation {
syn Collection<Segment> TrackElement.connectsToSegments() { syn Collection<Segment> TrackElement.connectsToSegments() {
java.util.List<Segment> segments = new ArrayList<>(); java.util.List<Segment> segments = new ArrayList<>();
for (TrackElementRef teRef : getConnectsToList()) { for (TrackElementRef teRef : getConnectedElementList()) {
Segment segment = teRef.getTrackElement().asSegment(); Segment segment = teRef.getTrackElement().asSegment();
if (segment != null) { if (segment != null) {
segments.add(segment); segments.add(segment);
...@@ -140,52 +150,50 @@ aspect TreeNavigation { ...@@ -140,52 +150,50 @@ aspect TreeNavigation {
return getTarget().getSwitch(); return getTarget().getSwitch();
} }
syn Collection<Route> Sensor.requiringRoutes() { syn Collection<Sensor> TrackElement.monitoredBy() {
return getRoot().requiringRoutesMap().get(this.id()); return getRoot().monitoredByMap().get(this.id());
} }
syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() { syn Map<Integer,Set<Sensor>> RailwayContainer.monitoredByMap() {
Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>(); Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<>();
// fill the keys // fill the keys
for (Sensor sensor: sensors()) { for (Region region: getRegionList()) {
routeMap.put(sensor.id(), new java.util.HashSet<>()); for (TrackElement trackElement: region.getTrackElementList()) {
sensorMap.put(trackElement.id(), new java.util.HashSet<>());
}
} }
// update the values // update the values
for (Route route : getRouteList()) { for (Sensor sensor : sensors()) {
for (SensorRef sensorRef : route.getRequiredSensorList()) { for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
routeMap.get(sensorRef.getValue()).add(route); sensorMap.get(trackElementRef.getValue()).add(sensor);
} }
} }
return routeMap; return sensorMap;
} }
syn Collection<Sensor> TrackElement.monitoredBy() { syn Collection<Route> Sensor.requiringRoutes() {
return getRoot().monitoredByMap().get(this.id()); return getRoot().requiringRoutesMap().get(this.id());
} }
syn Map<Integer, Set<Sensor>> RailwayContainer.monitoredByMap() { syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
Map<Integer, Set<Sensor>> result = new java.util.HashMap<>(); Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
// fill the keys // fill the keys
for (Region region : getRegionList()) { for (Sensor sensor: sensors()) {
for (TrackElement trackElement : region.getTrackElementList()) { routeMap.put(sensor.id(), new java.util.HashSet<>());
result.put(trackElement.id(), new java.util.HashSet<>());
}
} }
// update the values // update the values
for (Region region : getRegionList()) { for (Route route : getRouteList()) {
for (Sensor sensor : region.getSensorList()) { for (SensorRef sensorRef : route.getRequiredSensorList()) {
for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) { routeMap.get(sensorRef.getValue()).add(route);
result.get(trackElementRef.getValue()).add(sensor);
}
} }
} }
return result; return routeMap;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment