diff --git a/libs/RoleRag-0.2.0.jar b/libs/RoleRag-0.2.0.jar index 9b3d8ed209be404da82b804f00ffb27608f02d54..17844fcd2eaa13c43797d2b703e63b4702ddd94f 100644 Binary files a/libs/RoleRag-0.2.0.jar and b/libs/RoleRag-0.2.0.jar differ diff --git a/statemachine.solution/build.gradle b/statemachine.solution/build.gradle index 4fb46120bd6bdc2271d6b377df225f6797e98a4c..09083c152829d2ca1d539a4d76cfa8d7ac34dce4 100644 --- a/statemachine.solution/build.gradle +++ b/statemachine.solution/build.gradle @@ -24,7 +24,7 @@ sourceSets.main.java.srcDir genSrc jar { from { sourceSets.main.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - manifest.attributes('Main-Class': 'de.tudresden.inf.st.statemachine.BankMain') + manifest.attributes('Main-Class': 'de.tudresden.inf.st.bank.BankMain') } dependencies { @@ -38,7 +38,7 @@ dependencies { // Default run configuration run { - mainClassName = 'de.tudresden.inf.st.statemachine.BankMain' + mainClassName = 'de.tudresden.inf.st.bank.BankMain' } // Generated files @@ -144,7 +144,7 @@ jastadd { module = "bank" - astPackage = 'de.tudresden.inf.st.statemachine.jastadd.model' + astPackage = 'de.tudresden.inf.st.bank.jastadd.model' parser.name = 'BankParser' @@ -152,8 +152,8 @@ jastadd { buildInfoDir = 'src/gen-res' - scanner.genDir = "src/gen/java/de/tudresden/inf/st/statemachine/jastadd/scanner" - parser.genDir = "src/gen/java/de/tudresden/inf/st/statemachine/jastadd/parser" + scanner.genDir = "src/gen/java/de/tudresden/inf/st/bank/jastadd/scanner" + parser.genDir = "src/gen/java/de/tudresden/inf/st/bank/jastadd/parser" // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false' extraJastAddOptions = ['--List=JastAddList', '--incremental=param'] diff --git a/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd b/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd new file mode 100644 index 0000000000000000000000000000000000000000..d9a2b7c0aa19dce7429fde9aeb2c9412a14558fe --- /dev/null +++ b/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd @@ -0,0 +1,85 @@ +aspect AttributeTransfer { + + public NaturalType NaturalType.plays(RoleType rt) { + // check for fulfillment + + // add roletype to roles + this.getRolesList().insertChild(rt, 0); + + // transfer attributes + boolean attributeExists; + int attributeIndex; + for (Attribute rtAttribute : rt.getAttributeList()) { + attributeExists = false; + attributeIndex = 0; + for (Attribute ntAttribute : this.getAttributeList()) { + if (ntAttribute.getName() == rtAttribute.getName()) { + attributeExists = true; + this.getAttributeList().removeChild(attributeIndex); + this.getAttributeList().insertChild(rtAttribute, 0); + break; + } + attributeIndex++; + } + if (!attributeExists) this.getAttributeList().insertChild(rtAttribute, 0); + } + + return this; + } + + public NaturalType NaturalType.unplays(String rtString) { + // find removeRt and rtIndex + RoleType removeRt = new RoleType(); + int removeRtIndex = -1; + int rtCounter = 0; + for (RoleType r : this.getRolesList()) { + if (r.getName() == rtString) { + removeRtIndex = rtCounter; + removeRt = r; + } + rtCounter++; + } + if (removeRtIndex == -1) return null; //rt not found + + // remove rt + this.getRolesList().removeChild(removeRtIndex); + + // roll back attributes + Attribute newestAttribute; + int attrIndex = 0; + for (Attribute attrRemoveRt : removeRt.getAttributeList()) { + // find newest attribute + newestAttribute = null; + for (RoleType r : this.getRolesList()) { + for (Attribute a : r.getAttributeList()) { + if (a.getName() == attrRemoveRt.getName()) { + newestAttribute = a; + } + } + } + // look for NaturalTypes original Attributes + if (newestAttribute == null) { + for (Attribute originalAttr : this.getOriginalAttributesList()) { + if (originalAttr.getName() == attrRemoveRt.getName()) { + newestAttribute = originalAttr; + } + } + } + // insert newestAttribute into AttributeList + for (Attribute attr : getAttributeList()) { + if (attr.getName() == attrRemoveRt.getName()) { + this.getAttributeList().removeChild(attrIndex); + attrIndex++; + if (newestAttribute != null) { + this.getAttributeList().insertChild(newestAttribute, 0); + } + } + } + } + + + + return this; + } + +} \ No newline at end of file diff --git a/statemachine.solution/src/main/jastadd/BankParser.parser b/statemachine.solution/src/main/jastadd/BankParser.parser index ae992c62d8e948ef539224905df5a2ca9bdd3baf..3184682261f3749a5193329cacf637ff9750d308 100644 --- a/statemachine.solution/src/main/jastadd/BankParser.parser +++ b/statemachine.solution/src/main/jastadd/BankParser.parser @@ -1,7 +1,7 @@ %header {: // this code is inlined before the generated parser -package de.tudresden.inf.st.statemachine.jastadd.parser; -import de.tudresden.inf.st.statemachine.jastadd.model.*; +package de.tudresden.inf.st.bank.jastadd.parser; +import de.tudresden.inf.st.bank.jastadd.model.*; import java.util.*; :}; // Documentation links: http://beaver.sourceforge.net/spec.html and https://bitbucket.org/jastadd/jastaddparser @@ -16,11 +16,39 @@ import java.util.*; // Productions with semantic actions building the JastAdd AST -bank goal = - NAME.name +rolerag goal = + naturaltype_list //roletype_list fulfillment_list {: - Bank result = new Bank(); + //RoleRag result = new RoleRag(naturaltype_list, roletype_list, fulfillment_list); + RoleRag result = new RoleRag(); + result.treeResolveAll(); + return result; + :} + ; + +JastAddList naturaltype_list = + naturaltype {: return new JastAddList().add(naturaltype); :} + | naturaltype_list naturaltype {: return naturaltype_list.add(naturaltype); :} + ; + +//JastAddList roletype_list = +// roletype {: return new JastAddList().add(roletype); :} +// | roletype_list roletype {: return roletype_list.add(roletype); :} +// ; + +//JastAddList fulfillment_list = +// fulfillment {: return new JastAddList().add(fulfillment); :} +// | fulfillment_list fulfillment {: return fulfillment_list.add(fulfillment); :} +// ; + +NaturalType naturaltype = + NATURALTYPE NAME.name //ASSIGN attribute_list.a + {: + NaturalType result = new NaturalType(); result.setName(name); + //result.setAttributeList(a); + //result.setOriginalAttributesList(a); + //result.setRolesList(new JastAddList()); return result; :} ; diff --git a/statemachine.solution/src/main/jastadd/BankScanner.flex b/statemachine.solution/src/main/jastadd/BankScanner.flex index dcf37d2e0bf7be11f047e87b722c31e6fe3a0e25..953f8bfe47526147c84a8238c9002c5e04579c60 100644 --- a/statemachine.solution/src/main/jastadd/BankScanner.flex +++ b/statemachine.solution/src/main/jastadd/BankScanner.flex @@ -1,6 +1,6 @@ -package de.tudresden.inf.st.statemachine.jastadd.scanner; +package de.tudresden.inf.st.bank.jastadd.scanner; -import de.tudresden.inf.st.statemachine.jastadd.parser.BankParser.Terminals; // The terminals are implicitly defined in the parser +import de.tudresden.inf.st.bank.jastadd.parser.BankParser.Terminals; // The terminals are implicitly defined in the parser %% // Documentation links: https://www.jflex.de/manual.html and http://beaver.sourceforge.net/scanners.html @@ -35,5 +35,9 @@ Identifier = [:jletter:][:jletterdigit:]* {WhiteSpace} { } // token definitions +"naturaltype" { return sym(Terminals.NATURALTYPE); } +//"roletype" { return sym(Terminals.ROLETYPE); } +//"fulfillment" { return sym(Terminals.FULFILLMENT); } {Identifier} { return sym(Terminals.NAME); } +//"::=" { return sym(Terminals.ASSIGN); } <<EOF>> { return sym(Terminals.EOF); } diff --git a/statemachine.solution/src/main/jastadd/DumpTree.jrag b/statemachine.solution/src/main/jastadd/DumpTree.jrag new file mode 100644 index 0000000000000000000000000000000000000000..4dd3985dc725e1f901499589ed1d471ca7ffa0ac --- /dev/null +++ b/statemachine.solution/src/main/jastadd/DumpTree.jrag @@ -0,0 +1,53 @@ +aspect DumpTree { + private static final String ASTNode.DUMP_TREE_INDENT = " "; + + public String ASTNode.dumpTree() { + java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream(); + dumpTree(new java.io.PrintStream(bytes)); + return bytes.toString(); + } + + public void ASTNode.dumpTree(java.io.PrintStream out) { + dumpTree(out, ""); + out.flush(); + } + + public void ASTNode.dumpTree(java.io.PrintStream out, String indent) { + out.print(indent + getClass().getSimpleName()); + out.print(getTokens()); + String extra = extraDumpInfo(); + if (!extra.isEmpty()) { + out.print(" " + extra); + } + out.println(); + String childIndent = indent + DUMP_TREE_INDENT; + for (ASTNode<?> child : astChildren()) { + if (child == null) { + out.println(childIndent + "null"); + } else { + child.dumpTree(out, childIndent); + } + } + } + + public String ASTNode.extraDumpInfo() { return ""; } + + public String ASTNode.getTokens() { + java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(java.util.Comparator.comparing(java.lang.reflect.Method::getName)); + + methods.addAll(java.util.Arrays.asList(getClass().getMethods())); + + StringBuilder result = new StringBuilder(); + for (java.lang.reflect.Method method : methods) { + ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class); + if (token != null) { + try { + result.append(String.format(" %s=\"%s\"", token.name(), method.invoke(this))); + } catch (IllegalAccessException ignored) { + } catch (java.lang.reflect.InvocationTargetException ignored) { + } + } + } + return result.toString(); + } +} diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java new file mode 100644 index 0000000000000000000000000000000000000000..163537e8ad5bd9240e9042d7164f6c18d5de301a --- /dev/null +++ b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java @@ -0,0 +1,83 @@ +package de.tudresden.inf.st.bank; + +import beaver.Parser; +//import de.tudresden.inf.st.statemachine.jastadd.model.State; +//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; +//import de.tudresden.inf.st.statemachine.jastadd.model.Transition; +import de.tudresden.inf.st.bank.jastadd.model.Attribute; +import de.tudresden.inf.st.bank.jastadd.model.Customer; +import de.tudresden.inf.st.bank.jastadd.model.Person; +import de.tudresden.inf.st.bank.jastadd.model.Consultant; + +import java.io.IOException; +import java.nio.file.Paths; + +public class BankMain { + + @SuppressWarnings("WeakerAccess") + public static Object DrAST_root_node; + + public static void main(String[] args) throws IOException, Parser.Exception { + //Bank bank; + if (args.length == 0) { + //bank = createExample(); + createExample(); + } else { + // load the file given as first argument + //bank = ParserUtils.load(Paths.get(args[0])); + } + + //System.out.println("Bankname: " + bank.getName() + " " + bank.getName2()); + } + + private static void createExample() { + Person Peter = new Person(); + Peter.setName("Peter"); + Consultant Con = new Consultant(); + Con.setName("Con"); + Customer Cu = new Customer(); + Cu.setName("Cu"); + + Attribute phoneNumber1 = new Attribute(); + phoneNumber1.setName("PhoneNumber"); + phoneNumber1.setValue("123"); + Attribute phoneNumber2 = new Attribute(); + phoneNumber2.setName("PhoneNumber"); + phoneNumber2.setValue("234"); + Attribute phoneNumber3 = new Attribute(); + phoneNumber3.setName("PhoneNumber"); + phoneNumber3.setValue("345"); + + Attribute addresse2 = new Attribute(); + addresse2.setName("addresse"); + addresse2.setValue("bcd"); + + Peter.addAttribute(phoneNumber1); + Peter.addOriginalAttributes(phoneNumber1); + Con.addAttribute(phoneNumber2); + Cu.addAttribute(phoneNumber3); + Con.addAttribute(addresse2); + + //output + //System.out.println(Peter.getChild(0).getChild(0).dumpTree()); + System.out.println(Peter.dumpTree()); + + Peter.plays(Con); + System.out.println("Peter plays Con \n"); + System.out.println(Peter.dumpTree()); + + Peter.plays(Cu); + System.out.println("Peter plays Cu \n"); + System.out.println(Peter.dumpTree()); + + Peter.unplays("Con"); + System.out.println("Peter unplays Con \n"); + System.out.println(Peter.dumpTree()); + + Peter.unplays("Cu"); + System.out.println("Peter unplays Cu \n"); + System.out.println(Peter.dumpTree()); + + } + +} diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java similarity index 53% rename from statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java rename to statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java index f06cf1feb0aeed7fb8d857f55713bd17e1a67845..d3a42d35b55ad3449a06bf56a9c9c625c30674d8 100644 --- a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java +++ b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java @@ -1,9 +1,10 @@ -package de.tudresden.inf.st.statemachine; +package de.tudresden.inf.st.bank; import beaver.Parser; -import de.tudresden.inf.st.statemachine.jastadd.model.Bank; -import de.tudresden.inf.st.statemachine.jastadd.parser.BankParser; -import de.tudresden.inf.st.statemachine.jastadd.scanner.BankScanner; +//import de.tudresden.inf.st.bank.jastadd.model.Bank; +import de.tudresden.inf.st.bank.jastadd.model.RoleRag; +import de.tudresden.inf.st.bank.jastadd.parser.BankParser; +import de.tudresden.inf.st.bank.jastadd.scanner.BankScanner; import java.io.IOException; import java.io.Reader; @@ -16,11 +17,11 @@ import java.nio.file.Path; * @author rschoene - Initial contribution */ public class ParserUtils { - static Bank load(Path path) throws IOException, Parser.Exception { + static RoleRag load(Path path) throws IOException, Parser.Exception { Reader reader = Files.newBufferedReader(path); BankScanner scanner = new BankScanner(reader); BankParser parser = new BankParser(); - Bank result = (Bank) parser.parse(scanner); + RoleRag result = (RoleRag) parser.parse(scanner); reader.close(); return result; } diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java deleted file mode 100644 index d6e16f8202012549f8544e5fd3d9b20ee1a13fe0..0000000000000000000000000000000000000000 --- a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.tudresden.inf.st.statemachine; - -import beaver.Parser; -import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; -//import de.tudresden.inf.st.statemachine.jastadd.model.State; -//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; -//import de.tudresden.inf.st.statemachine.jastadd.model.Transition; -import de.tudresden.inf.st.statemachine.jastadd.model.Bank; - -import java.io.IOException; -import java.nio.file.Paths; -import java.util.Set; - -public class BankMain { - - @SuppressWarnings("WeakerAccess") - public static Object DrAST_root_node; - - public static void main(String[] args) throws IOException, Parser.Exception { - Bank bank; - if (args.length == 0) { - bank = createExample(); - } else { - // load the file given as first argument - bank = ParserUtils.load(Paths.get(args[0])); - } - - System.out.println("Bankname: " + bank.getName()); - } - - private static Bank createExample() { - // manual construction of a simple statemachine - // (S) -- e --> (B) -- 1 --> (E) - // ^ | - // \ / - // `---- 2 ----* - Bank b = new Bank(); - b.setName("Peters Bank"); - - return b; - } - -} diff --git a/statemachine.solution/src/main/resources/Bank.relast b/statemachine.solution/src/main/resources/Bank.relast index 7446e71dcdada607ed03681bcb8e803755a54e2b..c96b21fd79058a29a17ef2a6f82cdd22892232b8 100644 --- a/statemachine.solution/src/main/resources/Bank.relast +++ b/statemachine.solution/src/main/resources/Bank.relast @@ -1 +1,16 @@ -Bank ::= <Name>; +RoleRag ::= NaturalType* RoleType* Fulfillment*; +Attribute ::= <Name> <Value>; +RoleType ::= <Name> Attribute*; +NaturalType ::= <Name> Attribute* OriginalAttributes:Attribute* Roles:RoleType*; +Fulfillment; + +Person : NaturalType; +Consultant : RoleType; +Customer : RoleType; + +PersonFillsConsultant : Fulfillment ::= Filler:Person Filled:Consultant; +//PersonFillsConsultant; +//rel PersonFillsConsultant.Filler -> Person; +//rel PersonFillsConsultant.Filled -> Consultant; + +PersonFillsCustomer : Fulfillment ::= Filler:Person Filled:Customer; diff --git a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java index 28969a58d1e39f2864510089ac6d86928f394ee1..8d8b782c345ec823a6f75d87d6f9536d60978d8d 100644 --- a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java +++ b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java @@ -1,9 +1,10 @@ package de.tudresden.inf.st.statemachine; import beaver.Parser; -import de.tudresden.inf.st.statemachine.jastadd.model.State; -import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; -import de.tudresden.inf.st.statemachine.jastadd.model.Transition; +import de.tudresden.inf.st.bank.ParserUtils; +//import de.tudresden.inf.st.statemachine.jastadd.model.State; +//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; +//import de.tudresden.inf.st.statemachine.jastadd.model.Transition; import org.junit.Test; import java.io.IOException; @@ -18,7 +19,7 @@ import static org.junit.Assert.assertEquals; * @author rschoene - Initial contribution */ public class AnalysisTest { - +/* @Test public void test1() throws IOException, Parser.Exception { StateMachine stateMachine = ParserUtils.load(Paths.get("src", "test", "resources", "machine_one.sm")); @@ -112,5 +113,5 @@ public class AnalysisTest { System.out.println("initial state "+ stateMachine.getInitial() + " to " + finalState + " in " + stateMachine.getInitial().minDistTo(finalState) + " step(s)"); } - } + }*/ } diff --git a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java index 16a6344661f21f81096f4223186bd6bf51877663..cac0cc6ba5d0e48e88037683c7ffcdaa8370b68d 100644 --- a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java +++ b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java @@ -1,9 +1,10 @@ package de.tudresden.inf.st.statemachine; import beaver.Parser; -import de.tudresden.inf.st.statemachine.jastadd.model.State; -import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; -import de.tudresden.inf.st.statemachine.jastadd.model.Transition; +import de.tudresden.inf.st.bank.ParserUtils; +//import de.tudresden.inf.st.statemachine.jastadd.model.State; +//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; +//import de.tudresden.inf.st.statemachine.jastadd.model.Transition; import org.junit.Test; import java.io.IOException; @@ -21,7 +22,7 @@ import static org.junit.Assert.*; * @author rschoene - Initial contribution */ public class ParserTest { - +/* @Test public void test1() throws IOException, Parser.Exception { StateMachine stateMachine = ParserUtils.load(Paths.get("src", "test", "resources", "machine_one.sm")); @@ -81,5 +82,5 @@ public class ParserTest { private List<State> outgoingConnectedStates(State s) { return s.getOutgoingList().stream().map(Transition::getTo).collect(Collectors.toList()); } - +*/ }