diff --git a/build.gradle b/build.gradle index ae22d051ebfedf9a99740f119d21ae32b995f224..b496f6f6f2cfbe5c90442dc8c77dc3eb2c1a2df6 100644 --- a/build.gradle +++ b/build.gradle @@ -18,17 +18,9 @@ mainClassName = 'de.tudresden.inf.st.mrc.MinimalMain' repositories { jcenter() -// maven { -// name "gitlab-maven" -// url "https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven" -// } maven { - name "gitlab-maven-ragconnect" - url "https://git-st.inf.tu-dresden.de/api/v4/projects/708/packages/maven" - } - maven { - name "gitlab-maven-relast2uml" - url "https://git-st.inf.tu-dresden.de/api/v4/projects/679/packages/maven" + name "gitlab-maven" + url "https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven" } } @@ -56,6 +48,7 @@ dependencies { implementation group: 'de.tudresden.inf.st', name: 'dumpAstWithPlantuml', version: '0.3.5' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.1' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.1' + implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: '0.3.5' grammar2umlClasspath group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.1.1' // ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4' diff --git a/src/main/jastadd/MinimalModel.jrag b/src/main/jastadd/MinimalModel.jrag index 41315d6c159c63b7ee136693ec4afec62345e2ed..c2ec7bfe085b719077e6c895b6adda29db820758 100644 --- a/src/main/jastadd/MinimalModel.jrag +++ b/src/main/jastadd/MinimalModel.jrag @@ -17,14 +17,14 @@ aspect Computation { result.addFoxtrot(new Foxtrot().setID(i)); result.addGolf(new Golf().setID(i)); } - // rel Alfa.MyBravo -> Bravo ; - result.setMyBravo(getBravo(getInput())); - // rel Alfa.MultiBravo* -> Bravo ; - result.addMultiBravo(getBravo(getInput())); - result.addMultiBravo(getBravo((getInput() + 1))); +// // rel Alfa.MyBravo -> Bravo ; +// result.setMyBravo(getBravo(getInput())); +// // rel Alfa.MultiBravo* -> Bravo ; +// result.addMultiBravo(getBravo(getInput())); +// result.addMultiBravo(getBravo((getInput() + 1))); - // rel Alfa.MidiDelta <-> Delta.MidiAlfa? ; - result.setMidiDelta(getDelta(getInput())); +// // rel Alfa.MidiDelta <-> Delta.MidiAlfa? ; +// result.setMidiDelta(getDelta(getInput())); // rel Alfa.MyEcho -> Echo ; result.setMyEcho(result.getEcho(getInput())); @@ -38,13 +38,24 @@ aspect Computation { // rel Alfa.MidiGolf <-> Golf.MidiAlfa? ; result.setMidiGolf(result.getGolf(getInput())); - // rel Alfa.MyHotel -> Hotel ; - result.setMyHotel(getSenderSubTree().getHotel(getInput())); - // rel Alfa.MultiHotel* -> Hotel ; - result.addMultiHotel(getSenderSubTree().getHotel(getInput())); - result.addMultiHotel(getSenderSubTree().getHotel((getInput() + 1))); +// // rel Alfa.MyHotel -> Hotel ; +// result.setMyHotel(getSenderSubTree().getHotel(getInput())); +// // rel Alfa.MultiHotel* -> Hotel ; +// result.addMultiHotel(getSenderSubTree().getHotel(getInput())); +// result.addMultiHotel(getSenderSubTree().getHotel((getInput() + 1))); + + // rel Alfa.Myself -> Alfa ; + result.setMyself(result); + // rel Echo.MyFoxtrot -> Foxtrot ; + result.getEcho(getInput()).setMyFoxtrot(result.getFoxtrot(getInput())); +// // rel Foxtrot.MyHotel -> Hotel ; +// result.getFoxtrot(getInput()).setMyHotel(getSenderSubTree().getHotel(getInput())); + return result; } + + syn boolean ASTNode.isNameable() = false; + eq Nameable.isNameable() = true; } aspect NameResolution { diff --git a/src/main/jastadd/MinimalModel.relast b/src/main/jastadd/MinimalModel.relast index f5852950d9a9d0d99c84070ae4cfd429760510cd..b7288d4820b477f8bcc3d34e04dd07bdf8d2aca1 100644 --- a/src/main/jastadd/MinimalModel.relast +++ b/src/main/jastadd/MinimalModel.relast @@ -22,15 +22,19 @@ Foxtrot : Nameable ; Golf : Nameable ; Hotel : Nameable ; -rel Alfa.MyBravo -> Bravo ; +rel Alfa.MyBravo? -> Bravo ; rel Alfa.MultiBravo* -> Bravo ; // # relation into NTA not possible //rel Charlie.MyAlfa -> Alfa ; // # bidi relation from/into NTA probably not a good idea -rel Alfa.MidiDelta <-> Delta.MidiAlfa? ; +rel Alfa.MidiDelta? <-> Delta.MidiAlfa? ; rel Alfa.MyEcho -> Echo ; rel Alfa.MultiEcho* -> Echo ; rel Foxtrot.MyAlfa? -> Alfa ; rel Alfa.MidiGolf <-> Golf.MidiAlfa? ; -rel Alfa.MyHotel -> Hotel ; +rel Alfa.MyHotel? -> Hotel ; rel Alfa.MultiHotel* -> Hotel ; + +rel Alfa.Myself -> Alfa ; +rel Echo.MyFoxtrot? -> Foxtrot ; +rel Foxtrot.MyHotel? -> Hotel ; diff --git a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java index d29074e58a857b2c0463eb1915a005239eaaffcc..e966c30a3dfad4a20ea19e8f1a68e9908898116c 100644 --- a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java +++ b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java @@ -9,7 +9,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Paths; import java.time.Instant; +import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; import static java.util.concurrent.TimeUnit.SECONDS; @@ -237,24 +239,27 @@ public class MinimalMain { ReceiverRoot receiverRoot = createReceiverRoot(); root2ForReceiver.addReceiverRoot(receiverRoot); receiverRoot.connectAlfa(mqttUriString); - + + Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("00-initial-sender.png")); + Dumper.read(receiverRoot).dumpAsPNG(Paths.get("00-initial-receiver.png")); + senderRoot.setInput(1); describedWait(1, "after setting input to 1"); - printSender(senderRoot); - printReceiver(receiverRoot); + printAlfa(true, senderRoot, receiverRoot); + printAlfa(false, senderRoot, receiverRoot); + Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("01-after-1-sender.png")); + Dumper.read(receiverRoot).dumpAsPNG(Paths.get("01-after-1-receiver.png")); + printAlfa(true, senderRoot, receiverRoot); + printAlfa(false, senderRoot, receiverRoot); senderRoot.setInput(2); describedWait(1, "after setting input to 2"); - printSender(senderRoot); - printReceiver(receiverRoot); - } - - private static void printSender(SenderRoot senderRoot) { - printAlfa("sender", senderRoot.getAlfa(), senderRoot::getDeltaList); - } - - private static void printReceiver(ReceiverRoot receiverRoot) { - printAlfa("receiver", receiverRoot.getAlfa(), receiverRoot::getDeltaList); + printAlfa(true, senderRoot, receiverRoot); + printAlfa(false, senderRoot, receiverRoot); + Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("02-after-2-sender.png")); + Dumper.read(receiverRoot).dumpAsPNG(Paths.get("02-after-2-receiver.png")); + printAlfa(true, senderRoot, receiverRoot); + printAlfa(false, senderRoot, receiverRoot); } private static SenderRoot createSenderRoot() { @@ -285,58 +290,107 @@ public class MinimalMain { interface AddBravo { void accept(Bravo b); } interface AddCharlie { void accept(Charlie b); } interface AddDelta { void accept(Delta b); } - interface GetDeltaList { Iterable<Delta> get(); } interface AddHotel { void accept(Hotel b); } - private static void printAlfa(String name, Alfa alfa, GetDeltaList getDeltaList) { - StringBuilder sbDelta = new StringBuilder(); - for (Delta delta : getDeltaList.get()) { - sbDelta.append(delta.getID()) - .append("->") - .append(delta.hasMidiAlfa() ? delta.getMidiAlfa().getID() : "/") - .append(", "); - } - String deltaList = sbDelta.toString(); - StringBuilder sbFoxtrot = new StringBuilder(); - for (Foxtrot foxtrot : alfa.getFoxtrotList()) { - sbFoxtrot.append(foxtrot.getID()) - .append("->") - .append(foxtrot.hasMyAlfa() ? foxtrot.getMyAlfa().getID() : "/") - .append(", "); + private static void printAlfa(boolean isSender, SenderRoot senderRoot, ReceiverRoot receiverRoot) { + final String name; + final String tick; + final Alfa alfa; + final Iterable<Delta> deltaList; + final Iterable<Hotel> hotelList; + if (isSender) { + name = "sender"; + tick = " >-"; + alfa = senderRoot.getAlfa(); + deltaList = senderRoot.getDeltaList(); + hotelList = senderRoot.getSenderSubTree().getHotelList(); + } else { + name = "receiver"; + tick = " <-"; + alfa = receiverRoot.getAlfa(); + deltaList = receiverRoot.getDeltaList(); + hotelList = receiverRoot.getReceiverSubTree().getHotelList(); } - String foxtrotList = sbFoxtrot.toString(); + // also dump AST + StringBuilder sb = new StringBuilder(); + printNode(alfa.getParent(), "", sb); + logger.info("\n{}", sb.toString()); + logger.info("Checking Alfa\n" + "{}: {} in {}\n" + - " |- MyBravo: {}\n" + - " |- MultiBravoList: {}\n" + - " |- MidiDelta: {} (MidiDelta.getMidiAlfa(): {})\n" + - " |- DeltaList: {}\n" + - " |- MyEcho: {}\n" + - " |- MultiEchoList: {}\n" + - " |- FoxtrotList (id -> alfa.id): {}\n" + - " |- MidiGolf: {} (MidiGolf.getMidiAlfa(): {})\n" + - " |- MyHotel: {}\n" + - " |- MultiHotelList: {}" + + tick + " Myself: {}\n" + +// tick + " MyBravo: {}\n" + +// tick + " MultiBravoList: {}\n" + +// tick + " MidiDelta: {} (MidiDelta.getMidiAlfa(): {})\n" + +// tick + " DeltaList: {}\n" + + tick + " MyEcho: {}\n" + + tick + " EchoList.MyFoxtrot: {}\n" + + tick + " MultiEchoList: {}\n" + + tick + " FoxtrotList.MyAlfa: {}\n" + + tick + " FoxtrotList.MyHotel: {}\n" + + tick + " MidiGolf: {} (MidiGolf.getMidiAlfa(): {})\n" + + tick + " GolfList (id -> alfa.id): {}\n" + +// tick + " MyHotel: {}\n" + +// tick + " MultiHotelList: {}\n" + +// tick + " HotelList: {}" + "{}", // just to make swapping of params easier (all have a comma at the end) name, alfa, alfa.getParent(), - alfa.getMyBravo().getID(), - printNameableList(alfa.getMultiBravoList()), - alfa.getMidiDelta().getID(), alfa.getMidiDelta().getMidiAlfa(), - deltaList, - alfa.getMyEcho().getID(), + nameAndHash(alfa.getMyself()), +// nameAndHash(alfa.getMyBravo()), +// printNameableList(alfa.getMultiBravoList()), +// nameAndHash(alfa.getMidiDelta()), alfa.getMidiDelta().getMidiAlfa(), +// printOptionalList(deltaList, Delta::hasMidiAlfa, Delta::getMidiAlfa), + nameAndHash(alfa.getMyEcho()), + printOptionalList(alfa.getEchoList(), Echo::hasMyFoxtrot, Echo::getMyFoxtrot), printNameableList(alfa.getMultiEchoList()), - foxtrotList, - alfa.getMidiGolf().getID(), alfa.getMidiGolf().getMidiAlfa(), - alfa.getMyHotel().getID(), - printNameableList(alfa.getMultiHotelList()), + printOptionalList(alfa.getFoxtrotList(), Foxtrot::hasMyAlfa, Foxtrot::getMyAlfa), + printOptionalList(alfa.getFoxtrotList(), Foxtrot::hasMyHotel, Foxtrot::getMyHotel), + nameAndHash(alfa.getMidiGolf()), nameAndHash(alfa.getMidiGolf().getMidiAlfa()), + printOptionalList(alfa.getGolfList(), Golf::hasMidiAlfa, Golf::getMidiAlfa), +// nameAndHash(alfa.getMyHotel()), +// printNameableList(alfa.getMultiHotelList()), +// printNameableList(toList(hotelList)), "" ); } - + + private static List<? extends Nameable> toList(Iterable<Hotel> hotelList) { + List<Hotel> result = new ArrayList<>(); + hotelList.forEach(result::add); + return result; + } + private static String printNameableList(List<? extends Nameable> nameableList) { - return nameableList.stream().map(nameable -> Integer.toString(nameable.getID())).collect(Collectors.joining(",", "[", "]")); + return nameableList.stream().map(MinimalMain::nameAndHash).collect(Collectors.joining(",", "[", "]")); + } + + private static <T extends Nameable> String printOptionalList(Iterable<T> tIterable, Function<T, Boolean> hasChild, Function<T, Nameable> getChild) { + StringBuilder sb = new StringBuilder(); + for (T t : tIterable) { + sb.append(nameAndHash(t)) + .append(" -> ") + .append(hasChild.apply(t) ? nameAndHash(getChild.apply(t)) : "/") + .append(", "); + } + return sb.toString(); + } + + private static String nameAndHash(Nameable nameable) { + return nameable.getID() + " (@" + Integer.toHexString(nameable.hashCode()) + ")"; } + private static void printNode(ASTNode<?> node, String indent, StringBuilder sb) { + if (node.isNameable()) { + sb.append(indent) + .append("- ") + .append(node.getClass().getSimpleName()) + .append(nameAndHash((Nameable) node)) + .append("\n"); + } + for (ASTNode<?> child : node.astChildren()) { + printNode(child, node instanceof JastAddList ? indent : indent + " |", sb); + } + } // private static void enableTracing(ASTNode<?> node) { // if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) {