diff --git a/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleAml.scala b/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleAml.scala deleted file mode 100644 index e8918e397022392b726fa06c9c2b20eacfe6e4b0..0000000000000000000000000000000000000000 --- a/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleAml.scala +++ /dev/null @@ -1,421 +0,0 @@ -package org.rosi_project.example - - -object ExampleAml extends App { - - /*val amlView = AmlanguageView.getNewView() - - //Prototypes - val sucStack = amlView.createSystemUnitClass("Stack", "9") - val sucCrane = amlView.createSystemUnitClass("Crane", "10") - val sucRamp = amlView.createSystemUnitClass("Rampe", "11") - - //System model - val ihPpu = amlView.createInstanceHierarchy("PPU", "1") - val ieStack1 = amlView.createInternalElement("Stack1", "2") - val ieCrane2 = amlView.createInternalElement("Crane2", "7") - val ieRamp3 = amlView.createInternalElement("Ramp3", "8") - val ieConveyor1 = amlView.createInternalElement("Conveyor1", "4") - val ieStore1 = amlView.createInternalElement("Store1", "5") - val ieSensor1 = amlView.createInternalElement("Sensor1", "6") - val attWeigth = amlView.createAttribute("50", "weigth", "3") - - ihPpu.addInternalElements(ieStack1) - ihPpu.addInternalElements(ieCrane2) - ihPpu.addInternalElements(ieRamp3) - ieStack1.addInternalElements(ieConveyor1) - ieStack1.addInternalElements(ieStore1) - ieStack1.addAttributes(attWeigth) - ieStore1.addInternalElements(ieSensor1) - - //connect prototyp and system model - ieStack1.setBaseSystemUnit(sucStack) - ieCrane2.setBaseSystemUnit(sucCrane) - ieRamp3.setBaseSystemUnit(sucRamp) - - //amlView.printViewRoles() - - //val ieSensor2 = amlView.createInternalElement("Sensor2", "12") - //ieStack1.addInternalElements(ieSensor2) - - //runAllQueries() - runAllViewQueries() - - def runAllViewQueries() { - //Query testing - query_1() - query_2() - query_3() - query_4() - query_5() - query_6() - query_7() - query_8() - } - - def runAllQueries() { - //Query testing - query1() - query2() - query3() - query4() - query5() - query6() - query7() - query8() - } - - /** - * Search for all objects that inherit from the CAEXObject. - */ - def query1(): Unit = { - //Query Objects - val q1 = new Query("Q1") - val co = new HelperCAEXObject("", "") //laufe über alle naturals im RSUM und suche, die die davon instanzen sind - - //Query Roles & Settings - val r0 = q1.addQueryRole(co) - r0.label = "CO" - - println(q1) - println(q1.runQuery()) - } - - def query1Dot1(): Unit = { - //Query Objects - val q11 = new Query("Q1.1") - val suc = new SystemUnitClass("SUC", "13") - - //Query Roles & Settings - val r0 = q11.addQueryRole(suc) - r0.label = "SUC" - - println(q11) - println(q11.runQuery()) - } - - /** - * Search for internal elements with special attribute properties. - */ - def query2(): Unit = { - //Query Objects - val q2 = new Query("Q2") - val ie = new InternalElement("", "") - val att = new Attribute("50", "weigth", "") - val ieRatt = new SystemUnitClassAttributesAttribute(ie, att) - ieRatt.internalInitialize() - - //Query Roles & Settings - val r0 = q2.addQueryRole(ie) - r0.label = "IE" - val r1 = q2.addQueryRole(att) - r1.addAttributeFilter("name", "weigth", CheckingOption.equalsCheck) - r1.addAttributeFilter("value", "49", CheckingOption.biggerThan) - r1.label = "ATT" - val r2 = q2.addQueryRole(ieRatt) - - println(q2) - println(q2.runQuery()) - } - - /** - * Searches for all childs of the "PPU" element - */ - def query3(): Unit = { - //Query Objects - val q3 = new Query("Q3") - val ih = new InstanceHierarchy("PPU","") - val ie = new InternalElement("", "") - val ihRie = new InstanceHierarchyInternalElementsInternalElement(ih, ie) - ihRie.internalInitialize() - - //Query Roles & Settings - val r0 = q3.addQueryRole(ie) - r0.label = "IE" - val r1 = q3.addQueryRole(ih) - r1.addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - r1.label = "IH" - r1.returned = false - val r2 = q3.addQueryRole(ihRie) - - println(q3) - println(q3.runQuery()) - } - - /** - * Searches all "PPU" elements with 2 deep childs. - */ - def query4(): Unit = { - //Query Objects - val q4 = new Query("Q4") - val ih = new InstanceHierarchy("PPU","") //wie kann ich auf die eigenschaften und werte prüfen - val ie1 = new InternalElement("", "") - val ie2 = new InternalElement("", "") - val ihRie = new InstanceHierarchyInternalElementsInternalElement(ih, ie1) - val ieRie = new SystemUnitClassInternalElementsInternalElement(ie1, ie2) - ihRie.internalInitialize() - ieRie.internalInitialize() - - //Query Roles & Settings - val r0 = q4.addQueryRole(ie1) - r0.label = "IE1" - val r1 = q4.addQueryRole(ie2) - r1.label = "IE2" - val r2 = q4.addQueryRole(ih) - r2.addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - r2.label = "IH" - r2.returned = false - val r3 = q4.addQueryRole(ihRie) - val r4 = q4.addQueryRole(ieRie) - - println(q4) - println(q4.runQuery()) - } - - /** - * Searches for all internal elements of the - * PPU instance hierarchy. Make transitive closure. - */ - def query5(): Unit = { - //Query Objects - val q5 = new Query("Q5") - val ih = new InstanceHierarchy("PPU","") //wie kann ich auf die eigenschaften und werte prüfen - val ie1 = new InternalElement("", "") - val ie2 = new InternalElement("", "") - val ihRie = new InstanceHierarchyInternalElementsInternalElement(ih, ie1) - val ieRie = new SystemUnitClassInternalElementsInternalElement(ie1, ie2) - ihRie.internalInitialize() - ieRie.internalInitialize() - - //Query Roles & Settings - val r0 = q5.addQueryRole(ie1) - r0.label = "IE1" - val r1 = q5.addQueryRole(ie2) - r1.label = "IE2" - r1.transitive = true - val r2 = q5.addQueryRole(ih) - r2.addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - r2.label = "IH" - r2.returned = false - val r3 = q5.addQueryRole(ihRie) - val r4 = q5.addQueryRole(ieRie) - - println(q5) - println(q5.runQuery()) - } - - /** - * Get all leave nodes. - */ - def query6(): Unit = { - //Query Objects - val q6 = new Query("Q6") - val ie1 = new InternalElement("", "") - val ie2 = new InternalElement("", "") - val ieRie = new SystemUnitClassInternalElementsInternalElement(ie1, ie2) - ieRie.internalInitialize() - - //Query Roles & Settings - val r0 = q6.addQueryRole(ie1) - r0.label = "IE1" - val r1 = q6.addQueryRole(ie2) - r1.label = "IE2" - r1.negated = true - val r2 = q6.addQueryRole(ieRie) - - println(q6) - println(q6.runQuery()) - } - - /** - * Selects all internal elements that refer - * to a system unit class (SUC) named “Stack”. - */ - def query7(): Unit = { - //Query Objects - val q7 = new Query("Q7") - val suc = new SystemUnitClass("Stack", "") - val ie = new InternalElement("", "") - val ieRsuc = new InternalElementBaseSystemUnitSystemUnitClass(ie, suc) - ieRsuc.internalInitialize() - - //Query Roles & Settings - val r0 = q7.addQueryRole(ie) - r0.label = "IE" - val r1 = q7.addQueryRole(suc) - r1.addAttributeFilter("name", "Stack", CheckingOption.equalsCheck) - r1.label = "SUC" - r1.returned = false - val r2 = q7.addQueryRole(ieRsuc) - - println(q7) - println(q7.runQuery()) - } - - /** - * Searches for all internal elements, - * which have more than two internal element as direct child - */ - def query8(): Unit = { - //Query Objects - val q8 = new Query("Q8") - val ie1 = new InternalElement("", "") - val ie2 = new InternalElement("", "") - val ieRie = new SystemUnitClassInternalElementsInternalElement(ie1, ie2) - ieRie.internalInitialize() - - //Query Roles & Settings - val r0 = q8.addQueryRole(ie1) - r0.label = "IE1" - val r1 = q8.addQueryRole(ie2) - r1.label = "IE2" - r1.multi = 3 //means >= 3 - val r2 = q8.addQueryRole(ieRie) - - println(q8) - println(q8.runQuery()) - } - - def query_1(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val co = q.createCAEXObject() - - //Settings - co.getQueryObject.label = "CO" - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_2(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ie = q.createInternalElement() - val att = q.createAttribute() - ie.addAttributes(att) - - //Settings - ie.getQueryObject.label = "IE" - att.getQueryObject.label = "ATT" - att.setValueView("49", CheckingOption.biggerThan) - att.setNameView("weigth", CheckingOption.equalsCheck) - //att.getQueryObject().addAttributeFilter("name", "weigth", CheckingOption.equalsCheck) - //att.getQueryObject().addAttributeFilter("value", "49", CheckingOption.biggerThan) - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_3(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ih = q.createInstanceHierarchy() - val ie = q.createInternalElement() - ih.addInternalElements(ie) - - //Settings - ie.getQueryObject.label = "IE" - ih.getQueryObject.label = "IH" - ih.setNameView("PPU", CheckingOption.equalsCheck) - //ih.getQueryObject().addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - ih.getQueryObject.returned = false - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_4(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ih = q.createInstanceHierarchy() - val ie1 = q.createInternalElement() - val ie2 = q.createInternalElement() - ih.addInternalElements(ie1) - ie1.addInternalElements(ie2) - - //Settings - ie1.getQueryObject.label = "IE1" - ie2.getQueryObject.label = "IE2" - ih.getQueryObject.label = "IH" - ih.setNameView("PPU", CheckingOption.equalsCheck) - //ih.getQueryObject().addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - ih.getQueryObject.returned = false - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_5(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ih = q.createInstanceHierarchy() - val ie1 = q.createInternalElement() - val ie2 = q.createInternalElement() - ih.addInternalElements(ie1) - ie1.addInternalElements(ie2) - - //Settings - ie1.getQueryObject.label = "IE1" - ie2.getQueryObject.label = "IE2" - ie2.getQueryObject.transitive = true - ih.getQueryObject.label = "IH" - ih.setNameView("PPU", CheckingOption.equalsCheck) - //ih.getQueryObject().addAttributeFilter("name", "PPU", CheckingOption.equalsCheck) - ih.getQueryObject.returned = false - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_6(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ie1 = q.createInternalElement() - val ie2 = q.createInternalElement() - ie1.addInternalElements(ie2) - - //Settings - ie1.getQueryObject.label = "IE1" - ie2.getQueryObject.label = "IE2" - ie2.getQueryObject.negated = true - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_7(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val suc = q.createSystemUnitClass() - val ie = q.createInternalElement() - ie.setBaseSystemUnit(suc) - - //Settings - ie.getQueryObject.label = "IE" - suc.getQueryObject.label = "SUC" - suc.setNameView("Stack", CheckingOption.equalsCheck) - //suc.getQueryObject().addAttributeFilter("name", "Stack", CheckingOption.equalsCheck) - suc.getQueryObject.returned = false - - println(q.getQuery()) - println(q.getQuery().runQuery()) - } - - def query_8(): Unit = { - //Query Objects - val q = new AmlanguageQuery - val ie1 = q.createInternalElement() - val ie2 = q.createInternalElement() - ie1.addInternalElements(ie2) - - //Settings - ie1.getQueryObject.label = "IE1" - ie2.getQueryObject.label = "IE2" - ie2.getQueryObject.multi = 3 //means >= 3 - - println(q.getQuery()) - println(q.getQuery().runQuery()) - }*/ - -} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleRSUM.scala b/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleRSUM.scala deleted file mode 100644 index 1eb865f5dcfd315a496ccb7cac81242c1b0ecd29..0000000000000000000000000000000000000000 --- a/solutions/RSync/src/main/scala/org/rosi_project/example/ExampleRSUM.scala +++ /dev/null @@ -1,78 +0,0 @@ -package org.rosi_project.example - -object ExampleRSUM extends App { - - /*var generatedView: LibraryView = LibraryView.getNewView() - var libi = generatedView.createLibrary("City Library") - generatedView.printViewRoles() - println(libi.getNameView()) - - println("%%%%%%%%%%%%%%%%%%%%%% Add views to lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - //RsumCompartment.addViewTypeInfo(CompleteView) - //RsumCompartment.addViewTypeInfo(EmployeesManagerView) - //RsumCompartment.addViewTypeInfo(LibrariesEmployeesView) - - println("%%%%%%%%%%%%%%%%%%%%%% Create a view with all data %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var view: CompleteView = CompleteView.getNewView() - - println("%%%%%%%%%%%%%%%%%%%%%% Create elements in the view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var libRole = view.createLibrary("City Library") - var empRole = view.createEmployee("Bill", "Smith", 45000) - var manRole = view.createEmployee("Bob", "Jones", 60000) - libRole.addEmployee(empRole) - empRole.setManager(manRole) - - println(libRole.getNameView()) - - view.printViewRoles() - - var list = view.getAllViewElements - - println("Test1 " + view.getElementsWithClassName("LibraryRole")) - println("Test2 " + view.getElementsWithExample(empRole)) - println("Test3 " + view.getMapOfElements()) - - //view.printViewRoles() - - println("%%%%%%%%%%%%%%%%%%%%%% Activate other views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var view2: EmployeesManagerView = EmployeesManagerView.getNewView() - var view3: LibrariesEmployeesView = LibrariesEmployeesView.getNewView() - - view.printViewRoles() - view2.printViewRoles() - view3.printViewRoles() - - println("%%%%%%%%%%%%%%%%%%%%%% Create a new relation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - libRole.addEmployee(manRole) - - println("%%%%%%%%%%%%%%%%%%%%%% Change the name of an employee in a view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - empRole.setFirstNameView("Max") - - view.printViewRoles() - view2.printViewRoles() - view3.printViewRoles() - - //println("%%%%%%%%%%%%%%%%%%%%%% Print status %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - //RsumCompartment.printStatus() - - println("%%%%%%%%%%%%%%%%%%%%%% Remove an employee %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - //libRole.deleteElement() - empRole.deleteElement() - //manRole.deleteElement() - //hasMan.deleteElement() - //hasEmp2.deleteElement() - - //println("%%%%%%%%%%%%%%%%%%%%%% Print status %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - //RsumCompartment.printStatus() - - view.printViewRoles() - view2.printViewRoles() - view3.printViewRoles()*/ -} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/org/rosi_project/example/ModelJoinExample.scala b/solutions/RSync/src/main/scala/org/rosi_project/example/ModelJoinExample.scala deleted file mode 100644 index ddfca7f6488e233a7ab8f58af85b5d3309748c7c..0000000000000000000000000000000000000000 --- a/solutions/RSync/src/main/scala/org/rosi_project/example/ModelJoinExample.scala +++ /dev/null @@ -1,124 +0,0 @@ -package org.rosi_project.example - -object ModelJoinExample extends App { - - /*println("%%%%%%%%%%%%%%%%%%%%%% Create new views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var eclipseView = EclipselibraryView.getNewView() - var imdbView = ImdbdatabaseView.getNewView() - - println("%%%%%%%%%%%%%%%%%%%%%% Add joinable filmes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var avaFilmRole = imdbView.createFilm(2013, "Avatar Aufbruch nach Pandory") - var avaVideoRole = eclipseView.createVideoCassette(false, 230, "Avatar Aufbruch nach Pandory", new Date()) - var dwFilmRole = imdbView.createFilm(2018, "Death Wish") - var asterViedeoRole = eclipseView.createVideoCassette(false, 90, "Asterix erobert Rom", new Date()) - - println(avaVideoRole.getTitleView()) - - eclipseView.printViewRoles() - imdbView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Add the join view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var joinView = JoinEclipseImdbView.getNewView() - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Test Println Options for variables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - joinView.getElementsWithClassName("JoinMovieRole").foreach(r => { - val movie = r.asInstanceOf[JoinEclipseImdbView#JoinMovieRole] - println(movie.getTitleView()) - println(movie.getDamagedView()) - println(movie.getMinutesLengthView()) - }) - - println("%%%%%%%%%%%%%%%%%%%%%% Remove Avatar in the Join View %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - joinView.getElementsWithClassName("JoinMovieRole").foreach(r => { - val movie = r.asInstanceOf[JoinEclipseImdbView#JoinMovieRole] - if (movie.getTitleView() == "Avatar Aufbruch nach Pandory") { - movie.deleteElement() - } - }) - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Add Death Wish in video view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var dwVideoRole = eclipseView.createVideoCassette(true, 98, "Death Wish", new Date()) - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Create elements in the view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var movieRole = joinView.createMovie(1979, "Star Trek I", false, 132, new Date()) - //var movie2Role = joinView.createMovie(1996, "Star Trek VIII", false, 111, new Date()) - var filmRole = imdbView.createFilm(1994, "Star Trek VII") - - println("Year: " + movieRole.getYearView()) - println("Minutes: " + movieRole.getMinutesLengthView()) - println("Title: " + movieRole.getTitleView()) - - var list = joinView.getAllViewElements - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Add also video cassette from Star Trek VII %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var videoRole = eclipseView.createVideoCassette(false, 130, "Star Trek VII", new Date()) - - eclipseView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Add Relations in Film view and show results in other views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var imdbRole = imdbView.createIMDB() - imdbRole.addFilms(filmRole) - - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Add Relations in join view and show results in other views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - var voteRole = joinView.createVote(6) - movieRole.addVotes(voteRole) - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Change the name of Star Trek I in a view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - movieRole.setTitleView("Star Trek I The Beginning") - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus - - println("%%%%%%%%%%%%%%%%%%%%%% Remove the movie Start Trek I %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - - movieRole.deleteElement() - - eclipseView.printViewRoles() - imdbView.printViewRoles() - joinView.printViewRoles() - RsumCompartment.printStatus*/ -} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala index 790b4f1bee16ada9d1a5d9f9a03bd69e70b78a5b..3d73de3d39ea1765cd7ad0d8304d2ecfd3647273 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala @@ -27,7 +27,8 @@ object ModelElementLists { if (elementsWithClass.isEmpty) { elements += (obj.getClass -> Set(obj)) } else { - elements += (obj.getClass -> (elementsWithClass.get ++ Set(obj))) + //var seti = (elementsWithClass.get ++ Set(obj)) + elements += (obj.getClass -> (elementsWithClass.get + obj)) } } diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala index f5df559b9672dcccca4d8e8b195b4456aaa8d6fa..bd5886a849df8b2eb41a3a3e1842b13ac7d024b3 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala @@ -256,7 +256,7 @@ object SynchronizationCompartment extends ISynchronizationCompartment { case _ => } - //if role manager was not integrated before then integrate now + //if synchronization compartment was not integrated before then integrate now if (proof) { //add new role to the player //the new compartment @@ -275,8 +275,10 @@ object SynchronizationCompartment extends ISynchronizationCompartment { val player = r.player if (player.isRight) { val realPlayer = player.right.get - val newRole = newComp.getNextIntegrationRole(realPlayer) - r play newRole + if (newComp.isNextIntegration(realPlayer)) { + val newRole = newComp.getNextIntegrationRole(realPlayer) + r play newRole + } } } this combine newComp @@ -397,6 +399,17 @@ object SynchronizationCompartment extends ISynchronizationCompartment { null } + def getSetRelatedClassesFromName(name: String): Set[PlayerSync] = { + var resultSet: Set[PlayerSync] = Set.empty + getRelatedManager.foreach(rm => { + val realPlayer = rm.player.right.get + if (realPlayer.getClass.getName.contains(name) || realPlayer.getClass.getSuperclass.getName.contains(name)) { + resultSet += realPlayer.asInstanceOf[PlayerSync] + } + }) + resultSet + } + def insertNotification(): Unit = { //println("Insert Notification") +this notifyInsertion () @@ -418,12 +431,12 @@ object SynchronizationCompartment extends ISynchronizationCompartment { println("-- Ma => Pl: " + m + " | " + m.player.right.get) }) } - + def deleteManage(value: PlayerSync): Unit = { val delete = activeDestructionCompartment.getDestructorForClassName(value) if (delete != null) { this play delete - +this deleteRoleFunction() + +this deleteRoleFunction () } } @@ -432,11 +445,18 @@ object SynchronizationCompartment extends ISynchronizationCompartment { if (construct != null) { this play construct underConstruction = true; - var list = +this construct (value, this) + val _ = +this construct (value, this) underConstruction = false; construct.remove() } } + + /** + * Create a relation between two IRoleManager and RoleManager of other PlayerSync instances. + */ + def makePlayerSyncRelated(playerSync: PlayerSync): Unit = { + +playerSync makeRelated (this) + } } } diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala index 9c51ea7175373c7e94dce7485b45ba91357b4d1a..9fd3371b4dd9d92a12b6bf21bd05a8131488757f 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala @@ -2,25 +2,23 @@ package org.rosi_project.model_management.sync import scroll.internal.Compartment -import scala.collection.mutable.ListBuffer import org.rosi_project.model_management.core._ import org.rosi_project.model_management.sync.helper.ConstructionContainer import org.rosi_project.model_management.sync.roles.IConstructor - /** - * Interface for each construction rule. - */ + * Interface for each construction rule. + */ trait IConstructionCompartment extends Compartment { /** - * Return a role instance that handles the construction process for the object. - */ + * Return a role instance that handles the construction process for the object. + */ def getConstructorForClassName(classname: Object): IConstructor def getRuleName: String - private def addExtensionRoles(containers: ListBuffer[ConstructionContainer]): Unit = { + private def addExtensionRoles(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => if (cc.isConstructed) { SynchronizationCompartment.getExtensions().foreach { e => @@ -33,11 +31,13 @@ trait IConstructionCompartment extends Compartment { } } - private def notifyExtensionRoles(containers: ListBuffer[ConstructionContainer]): Unit = { - containers.foreach { cc => - if (cc.isConstructed) { - var playerInstance = cc.getPlayerInstance() - +playerInstance insertNotification() + private def notifyExtensionRoles(containers: Set[ConstructionContainer]): Unit = { + if (!SynchronizationCompartment.getExtensions().isEmpty) { + containers.foreach { cc => + if (cc.isConstructed) { + var playerInstance = cc.getPlayerInstance() + +playerInstance insertNotification () + } } } } @@ -45,7 +45,7 @@ trait IConstructionCompartment extends Compartment { /** * Add the RoleManager roles from the synchronization compartment if necessary */ - protected def addManagerRoles(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def addManagerRoles(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => if (cc.isConstructed && !cc.isStartElement) { cc.getPlayerInstance play cc.getManagerInstance @@ -56,7 +56,7 @@ trait IConstructionCompartment extends Compartment { /** * Add the delete roles for the elements in the ConstructionContainers. */ - protected def addDeleteRoles(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def addDeleteRoles(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => if (cc.isConstructed) { cc.getManagerInstance() play SynchronizationCompartment.getDestructionRule().getDestructorForClassName(cc.getPlayerInstance()) @@ -67,7 +67,7 @@ trait IConstructionCompartment extends Compartment { /** * Add the related RoleManagers for the elements in the ConstructionContainers. */ - protected def addRelatedRoleManager(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def addRelatedRoleManager(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => containers.foreach { inner => cc.getManagerInstance.addRelatedManager(inner.getManagerInstance) @@ -78,9 +78,9 @@ trait IConstructionCompartment extends Compartment { /** * Combine the SynchronizationCompartment with all Players from the ConstructionContainers. */ - protected def synchronizeCompartments(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def synchronizeCompartments(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => - if (cc.isConstructed() && !cc.isStartElement()) { + if (cc.isConstructed() && !cc.isStartElement()) { SynchronizationCompartment combine cc.getPlayerInstance } } @@ -89,7 +89,7 @@ trait IConstructionCompartment extends Compartment { /** * Create the Synchronization mechanisms for the elements in the ConstructionContainers. */ - protected def bindSynchronizationRules(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def bindSynchronizationRules(containers: Set[ConstructionContainer]): Unit = { SynchronizationCompartment.getSyncRules().foreach { s => var sync: ISyncCompartment = null //Proof all container for integration @@ -111,35 +111,35 @@ trait IConstructionCompartment extends Compartment { /** * Fill the test lists with all Players from the ConstructionContainers. */ - protected def fillTestLists(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def fillTestLists(containers: Set[ConstructionContainer]): Unit = { containers.foreach { cc => ModelElementLists.addElement(cc.getPlayerInstance) } } - protected def makeCompleteConstructionProcess(containers: ListBuffer[ConstructionContainer]): Unit = { + protected def makeCompleteConstructionProcess(containers: Set[ConstructionContainer]): Unit = { //first synchronize new compartments //var t1 = System.nanoTime() this.synchronizeCompartments(containers) //var t2 = System.nanoTime() - + //add role manager and relations this.addManagerRoles(containers) //var t3 = System.nanoTime() - this.addRelatedRoleManager(containers) + this.addRelatedRoleManager(containers) //var t4 = System.nanoTime() - + //binding of roles //this.addDeleteRoles(containers) this.bindSynchronizationRules(containers) //var t5 = System.nanoTime() this.addExtensionRoles(containers) //var t6 = System.nanoTime() - + //notify extensions this.notifyExtensionRoles(containers) //var t7 = System.nanoTime() - + //fill test list this.fillTestLists(containers) /*var t8 = System.nanoTime() @@ -150,7 +150,7 @@ trait IConstructionCompartment extends Compartment { println("5: " + (t6 - t5)) println("6: " + (t7 - t6)) println("7: " + (t8 - t7))*/ - + /*println("Construction ++++++++++++++++++++++++++++++++++++++++++++------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++") containers.foreach { cc => println((cc.getPlayerInstance).roles()) diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala index 60af2c560c3459aeda870bc864827cf1d3910e3e..6ab5927310221b277d402980651b563829795b52 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala @@ -1,7 +1,6 @@ package org.rosi_project.model_management.sync import scroll.internal.Compartment -import scala.collection.mutable.ListBuffer import org.rosi_project.model_management.sync.roles.ISyncRole import org.rosi_project.model_management.sync.roles.IIntegrator import org.rosi_project.model_management.sync.helper.IntegrationContainer @@ -24,9 +23,9 @@ trait IIntegrationCompartment extends Compartment { def getRelationalIntegratorsForClassName(classname: Object): IIntegrator def finalEditFunction(): Unit - + protected def connectTargetElementWithSourceElementes(target: PlayerSync, sourceList: Set[PlayerSync]): Unit = { - var containers: ListBuffer[IntegrationContainer] = ListBuffer.empty + var containers: Set[IntegrationContainer] = Set.empty //Create Containers sourceList.foreach(e => { containers += new IntegrationContainer(target, e) @@ -34,16 +33,16 @@ trait IIntegrationCompartment extends Compartment { //Finish Creation makeCompleteIntegrationProcess(containers) } - + protected def connectTargetElementWithSourceElemente(target: PlayerSync, source: PlayerSync): Unit = { - var containers: ListBuffer[IntegrationContainer] = ListBuffer.empty + var containers: Set[IntegrationContainer] = Set.empty //Create Container - containers += new IntegrationContainer(target, source) + containers += new IntegrationContainer(target, source) //Finish Creation makeCompleteIntegrationProcess(containers) } - private def addExtensionRoles(containers: ListBuffer[IntegrationContainer]): Unit = { + private def addExtensionRoles(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => SynchronizationCompartment.getExtensions().foreach { e => var role = e.getExtensionForClassName(cc.getNewPlayerInstance()) @@ -54,17 +53,19 @@ trait IIntegrationCompartment extends Compartment { } } - private def notifyExtensionRoles(containers: ListBuffer[IntegrationContainer]): Unit = { - containers.filter(_.newManagerConnection).foreach { cc => - var playerInstance = cc.getNewPlayerInstance() - +playerInstance insertNotification () + private def notifyExtensionRoles(containers: Set[IntegrationContainer]): Unit = { + if (!SynchronizationCompartment.getExtensions().isEmpty) { + containers.filter(_.newManagerConnection).foreach { cc => + var playerInstance = cc.getNewPlayerInstance() + +playerInstance insertNotification () + } } } /** * Add Manager roles to all constructed elements. */ - private def addManagerRoles(containers: ListBuffer[IntegrationContainer]): Unit = { + private def addManagerRoles(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => cc.getNewPlayerInstance() play cc.getNewManagerInstance() } @@ -73,7 +74,7 @@ trait IIntegrationCompartment extends Compartment { /** * Add the delete roles for the elements in the IntegrationContainer. */ - private def addDeleteRoles(containers: ListBuffer[IntegrationContainer]): Unit = { + private def addDeleteRoles(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => cc.getNewManagerInstance() play SynchronizationCompartment.getDestructionRule().getDestructorForClassName(cc.getNewPlayerInstance()) } @@ -82,22 +83,19 @@ trait IIntegrationCompartment extends Compartment { /** * Add the related RoleManagers for the elements in the IntegrationContainer. */ - private def addRelatedRoleManager(containers: ListBuffer[IntegrationContainer]): Unit = { + private def addRelatedRoleManager(containers: Set[IntegrationContainer]): Unit = { containers.foreach { cc => + val oldPlayer = cc.getOldPlayerInstance() if (cc.simpleRelatedManagerConnection) { - val oldPlayer = cc.getOldPlayerInstance() val manager: IRoleManager = +oldPlayer getManager () if (manager != null) { - manager.addRelatedManager(cc.getNewManagerInstance()) - cc.getNewManagerInstance().addRelatedManager(manager) + manager.makeRelated(cc.getNewManagerInstance()) } } else { - val oldPlayer = cc.getOldPlayerInstance() val allManager: Set[IRoleManager] = +oldPlayer getAllManager () if (allManager != null) { allManager.foreach { r => - r.addRelatedManager(cc.getNewManagerInstance()) - cc.getNewManagerInstance().addRelatedManager(r) + r.makeRelated(cc.getNewManagerInstance()) } } } @@ -107,7 +105,7 @@ trait IIntegrationCompartment extends Compartment { /** * Combine the SynchronizationCompartment with all Players from the IntegrationContainer. */ - private def synchronizeCompartments(containers: ListBuffer[IntegrationContainer]): Unit = { + private def synchronizeCompartments(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => SynchronizationCompartment combine cc.getNewPlayerInstance() } @@ -116,7 +114,7 @@ trait IIntegrationCompartment extends Compartment { /** * Create the Synchronization mechanisms for the elements in the IntegrationContainer. */ - private def bindSynchronizationRules(containers: ListBuffer[IntegrationContainer]): Unit = { + private def bindSynchronizationRules(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => val oldPlayer = cc.getOldPlayerInstance() val allManager: Set[IRoleManager] = +oldPlayer getAllManager () @@ -154,7 +152,7 @@ trait IIntegrationCompartment extends Compartment { /** * Fill the test lists with all Players from the IntegrationContainer. */ - private def fillTestLists(containers: ListBuffer[IntegrationContainer]): Unit = { + private def fillTestLists(containers: Set[IntegrationContainer]): Unit = { containers.filter(_.newManagerConnection).foreach { cc => ModelElementLists.addElement(cc.getNewPlayerInstance()) } @@ -163,7 +161,7 @@ trait IIntegrationCompartment extends Compartment { /** * Do the integration process automatically. */ - protected def makeCompleteIntegrationProcess(containers: ListBuffer[IntegrationContainer]): Unit = { + protected def makeCompleteIntegrationProcess(containers: Set[IntegrationContainer]): Unit = { containers.foreach(cc => { if (cc.getNewManagerInstance() == null) { val newPlayer = cc.getNewPlayerInstance() @@ -180,7 +178,7 @@ trait IIntegrationCompartment extends Compartment { //add new role managers to the new players this.addManagerRoles(containers) - this.addDeleteRoles(containers) + //this.addDeleteRoles(containers) this.addRelatedRoleManager(containers) //combines the new compartments with the existing ones this.synchronizeCompartments(containers) diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala index eb50d0772ddb30a5d6cc13af4d2c37936f5dad62..4b50e08618dcc668fb9c5f44e45c05ef1e7a02c4 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala @@ -17,12 +17,15 @@ trait ISyncCompartment extends Compartment { /** * All sync roles of this synchronization rule. */ - protected var syncer = Set.empty[ISyncRole] + private var syncer: Set[ISyncRole] = Set.empty /** * Get roles for all integration classes. */ - protected def getNextRole(classname: Object) : ISyncRole + protected def getNextRole(classname: Object) : ISyncRole = { + getFirstRole(classname) + } + /** * Get roles for integration classes. Should give less roles than getNextRole. */ @@ -30,13 +33,10 @@ trait ISyncCompartment extends Compartment { def containsSyncer(value: Object): Boolean = { syncer.foreach { s => - //println("Equals: " + s.player + " " + value.player) - //TODO: das hier muss cleaner werden - if (s.player.equals(value.player)) { - //println("++Equals true") + if (+s == +value) { + //if (s.player.equals(value.player)) { return true; } - //println("++Equals false") } return false } @@ -54,7 +54,7 @@ trait ISyncCompartment extends Compartment { * Clear the list of all sync roles. */ def clearSyncer(): Unit = { - syncer = Set.empty[ISyncRole] + syncer = Set.empty } /** @@ -85,7 +85,9 @@ trait ISyncCompartment extends Compartment { /** * Get boolean if next integration */ - def isNextIntegration(classname: Object): Boolean + def isNextIntegration(classname: Object): Boolean = { + isFirstIntegration(classname) + } /** * Create a new instance of this class. diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala index 68e051af58a24827a55e381624326d5cd8b9fea4..b9a0db9ee0ea770967801e613c4cdf0afd018d15 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala @@ -15,19 +15,45 @@ object GeneralDestructor extends IDestructionCompartment { override def getDestructorForClassName(classname: Object): IDestructor = new DeleteRole override def getRuleName: String = "GeneralDestructor" - + class DeleteRole() extends IDestructor { def deleteRoleFunction(): Unit = { - //println("##Delete roles and related from Player: " + this.player) + //remove this manager from all related ones + +this removeThisManager() + //clear list of related manager + +this clearRelatedManager() + //send notification about deletion + +this deletionNotification() + + //delete all roles this element has + val player = this.player + if (player.isRight) { + val test: PlayerSync = player.right.get.asInstanceOf[PlayerSync] + ModelElementLists.removeElement(test) + val roles = test.roles() + roles.foreach { r => + r.remove() + } + } + } + } + class DeleteRoleAndConnections() extends IDestructor { + + def deleteRoleFunction(): Unit = { + //get the list of related manager var relatedManagers: Set[IRoleManager] = (+this).getRelatedManager() + + //clear all lists from the related managers (+this).clearListsOfRelatedManager() + //delete also all related elements relatedManagers.foreach { m => (+m).deleteObjectFromSynchro() } + //send notification about deletion (+this).deletionNotification() //clear now the related manager list diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala index caa0df04652e27b4bce8530d1f40f7036817fc20..987002f50668715d97792f84bc04a3a80b65d562 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala @@ -22,7 +22,7 @@ object SuppressingConstructionCompartment extends IConstructionCompartment { override def construct(comp: PlayerSync, man: IRoleManager): Unit = { // just set up the player createContainerElement(start=true, con=true, comp, man) - SuppressingConstructionCompartment.this.makeCompleteConstructionProcess(containers) + makeCompleteConstructionProcess(containers) } } diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala index 9f3725007b57b2d47c1ba79b1722fefd13c7667f..dcfacf14b08c5ab1ef88f8fea30729b9f2a0c615 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala @@ -2,7 +2,6 @@ package org.rosi_project.model_management.sync.roles import org.rosi_project.model_management.core.PlayerSync import org.rosi_project.model_management.sync.helper.ConstructionContainer -import scala.collection.mutable.ListBuffer /** * Interface for the constructor roles. @@ -12,7 +11,7 @@ trait IConstructor { /** * Container list for the construction process. */ - protected var containers: ListBuffer[ConstructionContainer] = ListBuffer[ConstructionContainer]() + protected var containers: Set[ConstructionContainer] = Set.empty /** * Create a container element with the incoming configuration. @@ -20,8 +19,7 @@ trait IConstructor { protected def createContainerElement(start: Boolean, con: Boolean, play: PlayerSync, man: IRoleManager): Unit = { if (play == null) return - var cc = new ConstructionContainer(start, con, play, man) - containers += cc + containers += new ConstructionContainer(start, con, play, man) } /** diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala index 4431f99e9c3fdf5aae998338640e596830fa72a9..33336c02a0847116fa16386734b58c23364ff44e 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala @@ -1,6 +1,5 @@ package org.rosi_project.model_management.sync.roles -import scala.collection.mutable.ListBuffer import org.rosi_project.model_management.sync.helper.IntegrationContainer import org.rosi_project.model_management.core.PlayerSync import org.rosi_project.model_management.core.SynchronizationCompartment @@ -13,16 +12,15 @@ trait IIntegrator { /** * Container list for the integration process. */ - protected var containers = ListBuffer[IntegrationContainer]() + protected var containers: Set[IntegrationContainer] = Set.empty /** * Create a container element with the incoming configuration. */ protected def createContainerElement(newPlayer: PlayerSync, oldPlayer: PlayerSync): Unit = { - if (oldPlayer == null || oldPlayer == null) + if (newPlayer == null || oldPlayer == null) return - var cc = new IntegrationContainer(newPlayer, oldPlayer) - containers += cc + containers += new IntegrationContainer(newPlayer, oldPlayer) } /** diff --git a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala index eb173748eebf6b31c854c7f93a9ff432da94ecfb..fa466ee7c73b030fbd9dbfaea7e58b53c49518d6 100644 --- a/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala +++ b/solutions/RSync/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala @@ -5,47 +5,47 @@ import org.rosi_project.model_management.core.PlayerSync import scala.collection.mutable.ListBuffer /** - * Interface for the manager roles. - */ + * Interface for the manager roles. + */ trait IRoleManager { - + private var relatedManager: Set[IRoleManager] = Set.empty - /** - * Add a related manager to the list. - */ + /** + * Add a related manager to the list. + */ def addRelatedManager(related: IRoleManager): Unit = { - if (related == null || related.equals(this) || relatedManager.contains(related)) + if (related == null || related.equals(this)) return relatedManager += related } /** - * Get the list of related managers. - */ + * Get the list of related managers. + */ def getRelatedManager(): Set[IRoleManager] = relatedManager - + /** - * Get this manager. - */ + * Get this manager. + */ def getManager(): IRoleManager = this - + /** - * Get this manager plus related manager. - */ + * Get this manager plus related manager. + */ def getAllManager(): Set[IRoleManager] = relatedManager + this /** - * Remove a related manager from the list. - */ + * Remove a related manager from the list. + */ def removeRelatedManager(related: IRoleManager): Unit = { if (related != null) relatedManager -= related } /** - * Remove this manager from the lists of all related managers. - */ + * Remove this manager from the lists of all related managers. + */ def removeThisManager(): Unit = { relatedManager.foreach { m => m.removeRelatedManager(this) @@ -53,8 +53,8 @@ trait IRoleManager { } /** - * Clear the lists of all related managers, - */ + * Clear the lists of all related managers, + */ def clearListsOfRelatedManager(): Unit = { relatedManager.foreach { m => m.clearRelatedManager() @@ -62,34 +62,42 @@ trait IRoleManager { } /** - * Clear the list of this role manager. - */ + * Clear the list of this role manager. + */ def clearRelatedManager(): Unit = { relatedManager = Set.empty - } + } /** - * General manage function for external call. - */ + * Create a relation between two IRoleManager instances. + */ + def makeRelated(relate: IRoleManager): Unit = { + this.addRelatedManager(relate) + relate.addRelatedManager(this) + } + + /** + * General manage function for external call. + */ def manage(value: PlayerSync): Unit - + /** * Function to manage the deletion. */ def deleteManage(value: PlayerSync): Unit - + /** * Get related PlayerSync with the specific name. */ def getRelatedClassFromName(name: String): PlayerSync - - def printAllManager(): Unit - + /** - * Create a relation between two IRoleManager instances. + * Create a relation between two IRoleManager and RoleManager of other PlayerSync instances. */ - def makeRelated(relate: IRoleManager): Unit = { - this.addRelatedManager(relate) - relate.addRelatedManager(this) - } + def makePlayerSyncRelated(playerSync: PlayerSync): Unit + + /** + * Print all Manager only for debug. + */ + def printAllManager(): Unit } diff --git a/solutions/RSync/src/main/scala/sync/bdd/Assignment.scala b/solutions/RSync/src/main/scala/sync/bdd/Assignment.scala index b08405c8b10eb2cc413c904afa75388b38181d09..ea9259639ef977b936f3d010cf2c16a2dc3f40e3 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/Assignment.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/Assignment.scala @@ -18,6 +18,7 @@ class Assignment(protected var value: Boolean, protected var owner: Leaf, protec } def setOwner(o: Leaf): Unit = { + require(o != null) owner = o +this syncSetOwner () } @@ -27,6 +28,7 @@ class Assignment(protected var value: Boolean, protected var owner: Leaf, protec } def setPort(p: OutputPort): Unit = { + require(p != null) port = p +this syncSetPort () } diff --git a/solutions/RSync/src/main/scala/sync/bdd/BDD.scala b/solutions/RSync/src/main/scala/sync/bdd/BDD.scala index 671c46fd7c9adc2d20f04e34558107ed491aae68..5a41712bcc13f9c0ace1e9b0689a733972b3caa3 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/BDD.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/BDD.scala @@ -9,6 +9,7 @@ class BDD(protected var name: String, protected var tree: Tree, protected var po } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -18,6 +19,7 @@ class BDD(protected var name: String, protected var tree: Tree, protected var po } def setTree(t: Tree): Unit = { + require(t != null) tree = t +this syncSetTree () } @@ -27,11 +29,15 @@ class BDD(protected var name: String, protected var tree: Tree, protected var po } def addPorts(p: Port): Unit = { + require(p != null) + require(!ports.contains(p)) ports += p +this syncAddPorts (p) } def removePorts(p: Port): Unit = { + require(p != null) + require(ports.contains(p)) ports -= p +this syncRemovePorts (p) } diff --git a/solutions/RSync/src/main/scala/sync/bdd/InputPort.scala b/solutions/RSync/src/main/scala/sync/bdd/InputPort.scala index 30412c321b2a5bc4be1d45cb057f717005f732a4..62e1b2c07bdf44215f9db0dda230687cb104d1c0 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/InputPort.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/InputPort.scala @@ -7,11 +7,15 @@ class InputPort(protected var subtrees: Set[Subtree], p_Name: String, p_Owner: B } def addSubtrees(s: Subtree): Unit = { + require(s != null) + require(!subtrees.contains(s)) subtrees += s +this syncAddSubtrees (s) } def removeSubtrees(s: Subtree): Unit = { + require(s != null) + require(subtrees.contains(s)) subtrees -= s +this syncRemoveSubtrees (s) } diff --git a/solutions/RSync/src/main/scala/sync/bdd/Leaf.scala b/solutions/RSync/src/main/scala/sync/bdd/Leaf.scala index 4098c87025e9ebe99ab60ff938154db311532962..41ab5e4102c0692a5dd57a417d84beb99fc67fe7 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/Leaf.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/Leaf.scala @@ -7,11 +7,15 @@ class Leaf(protected var assignments: Set[Assignment], t_OwnerSubtreeForOne: Sub } def addAssignments(a: Assignment): Unit = { + require(a != null) + require(!assignments.contains(a)) assignments += a +this syncAddAssignments (a) } def removeAssignments(a: Assignment): Unit = { + require(a != null) + require(assignments.contains(a)) assignments -= a +this syncRemoveAssignments (a) } diff --git a/solutions/RSync/src/main/scala/sync/bdd/OutputPort.scala b/solutions/RSync/src/main/scala/sync/bdd/OutputPort.scala index 2ac3801ad3df2f9bc2249b5ecaeda866ce17f27b..83e2315b160608238c0ed28626e5ff7e45ee1806 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/OutputPort.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/OutputPort.scala @@ -7,11 +7,15 @@ class OutputPort(protected var assignments: Set[Assignment], p_Name: String, p_O } def addAssignments(a: Assignment): Unit = { + require(a != null) + require(!assignments.contains(a)) assignments += a +this syncAddAssignments (a) } def removeAssignments(a: Assignment): Unit = { + require(a != null) + require(assignments.contains(a)) assignments -= a +this syncRemoveAssignments (a) } diff --git a/solutions/RSync/src/main/scala/sync/bdd/Port.scala b/solutions/RSync/src/main/scala/sync/bdd/Port.scala index 9c812081fb672e13d1054c4738d055acebeb5595..9ac8cfc7cad9a942329ac097fceb85bb5bafc9e1 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/Port.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/Port.scala @@ -9,6 +9,7 @@ abstract class Port(protected var name: String, protected var owner: BDD) extend } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -18,6 +19,7 @@ abstract class Port(protected var name: String, protected var owner: BDD) extend } def setOwner(o: BDD): Unit = { + require(o != null) owner = o +this syncSetOwner () } diff --git a/solutions/RSync/src/main/scala/sync/bdd/Subtree.scala b/solutions/RSync/src/main/scala/sync/bdd/Subtree.scala index d5e69347be8a1b7d55c9ae4ec0ae439e554d7aa2..af904736a2c93bafd6e54c6214aba9d49fc23c39 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/Subtree.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/Subtree.scala @@ -7,6 +7,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setTreeForOne(t: Tree): Unit = { + require(t != null) treeForOne = t +this syncSetTreeForOne () } @@ -16,6 +17,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setTreeForZero(t: Tree): Unit = { + require(t != null) treeForZero = t +this syncSetTreeForZero () } @@ -25,6 +27,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setPort(p: InputPort): Unit = { + require(p != null) port = p +this syncSetPort () } @@ -32,7 +35,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p override def toString(): String = { "Subtree:" } - + override def getAvgPath(): Double = { return 0.5 * (treeForOne.getAvgPath() + treeForZero.getAvgPath()) + 1 } diff --git a/solutions/RSync/src/main/scala/sync/bdd/Tree.scala b/solutions/RSync/src/main/scala/sync/bdd/Tree.scala index 9a6faeaae3dd21cfd833ff5f93fa3c292d3fe267..0e6128b70b8780235aeca8cf6504114019fde413 100644 --- a/solutions/RSync/src/main/scala/sync/bdd/Tree.scala +++ b/solutions/RSync/src/main/scala/sync/bdd/Tree.scala @@ -9,6 +9,7 @@ abstract class Tree(protected var ownerSubtreeForOne: Subtree, protected var own } def setOwnerSubtreeForOne(o: Subtree): Unit = { + require(o != null) ownerSubtreeForOne = o +this syncSetOwnerSubtreeForOne () } @@ -18,6 +19,7 @@ abstract class Tree(protected var ownerSubtreeForOne: Subtree, protected var own } def setOwnerSubtreeForZero(o: Subtree): Unit = { + require(o != null) ownerSubtreeForZero = o +this syncSetOwnerSubtreeForZero () } @@ -27,6 +29,7 @@ abstract class Tree(protected var ownerSubtreeForOne: Subtree, protected var own } def setOwnerBDD(o: BDD): Unit = { + require(o != null) ownerBDD = o +this syncSetOwnerBDD () } diff --git a/solutions/RSync/src/main/scala/sync/bddg/Assignment.scala b/solutions/RSync/src/main/scala/sync/bddg/Assignment.scala index 4008da2917d153283b8c0fe1e104592f57eef359..1aae664876c206def13ee3645d9b8aa0d4b8e01d 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/Assignment.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/Assignment.scala @@ -18,6 +18,7 @@ class Assignment(protected var value: Boolean, protected var owner: Leaf, protec } def setOwner(o: Leaf): Unit = { + require(o != null) owner = o +this syncSetOwner () } @@ -27,6 +28,7 @@ class Assignment(protected var value: Boolean, protected var owner: Leaf, protec } def setPort(p: OutputPort): Unit = { + require(p != null) port = p +this syncSetPort () } diff --git a/solutions/RSync/src/main/scala/sync/bddg/BDD.scala b/solutions/RSync/src/main/scala/sync/bddg/BDD.scala index db65c99d9617e77f5bc8900ba6406cb7de306775..6f7277dfe05444b258e99c1f0e733cb2766ce40a 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/BDD.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/BDD.scala @@ -9,6 +9,7 @@ class BDD(protected var name: String, protected var trees: Set[Tree], protected } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -18,11 +19,15 @@ class BDD(protected var name: String, protected var trees: Set[Tree], protected } def addTrees(t: Tree): Unit = { + require(t != null) + require(!trees.contains(t)) trees += t +this syncAddTrees (t) } def removeTrees(t: Tree): Unit = { + require(t != null) + require(trees.contains(t)) trees -= t +this syncRemoveTrees (t) } @@ -32,6 +37,7 @@ class BDD(protected var name: String, protected var trees: Set[Tree], protected } def setRoot(r: Tree): Unit = { + require(r != null) root = r +this syncSetRoot () } @@ -41,11 +47,15 @@ class BDD(protected var name: String, protected var trees: Set[Tree], protected } def addPorts(p: Port): Unit = { + require(p != null) + require(!ports.contains(p)) ports += p +this syncAddPorts (p) } def removePorts(p: Port): Unit = { + require(p != null) + require(ports.contains(p)) ports -= p +this syncRemovePorts (p) } diff --git a/solutions/RSync/src/main/scala/sync/bddg/InputPort.scala b/solutions/RSync/src/main/scala/sync/bddg/InputPort.scala index 26772fe2ee5ed0578e86417b683e59d3ec146cb4..33173ab20fe4d5de663403386cc57c74e782277c 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/InputPort.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/InputPort.scala @@ -7,11 +7,15 @@ class InputPort(protected var subtrees: Set[Subtree], p_Name: String, p_Owner: B } def addSubtrees(s: Subtree): Unit = { + require(s != null) + require(!subtrees.contains(s)) subtrees += s +this syncAddSubtrees (s) } def removeSubtrees(s: Subtree): Unit = { + require(s != null) + require(subtrees.contains(s)) subtrees -= s +this syncRemoveSubtrees (s) } diff --git a/solutions/RSync/src/main/scala/sync/bddg/Leaf.scala b/solutions/RSync/src/main/scala/sync/bddg/Leaf.scala index 4295556d6ca60c46ead25cfe7ed53cd53d97d4c7..0a1426b9e65484aec6b1a22b5f37b75afa2d15f6 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/Leaf.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/Leaf.scala @@ -7,11 +7,15 @@ class Leaf(protected var assignments: Set[Assignment], t_OwnerSubtreeForOne: Set } def addAssignments(a: Assignment): Unit = { + require(a != null) + require(!assignments.contains(a)) assignments += a +this syncAddAssignments (a) } def removeAssignments(a: Assignment): Unit = { + require(a != null) + require(assignments.contains(a)) assignments -= a +this syncRemoveAssignments (a) } diff --git a/solutions/RSync/src/main/scala/sync/bddg/OutputPort.scala b/solutions/RSync/src/main/scala/sync/bddg/OutputPort.scala index 3b12cc76e9beefada508fe4e8cf70bdfcfc3270f..2b5f75ba3b2894c152e7203f09a0189f02d76414 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/OutputPort.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/OutputPort.scala @@ -7,11 +7,15 @@ class OutputPort(protected var assignments: Set[Assignment], p_Name: String, p_O } def addAssignments(a: Assignment): Unit = { + require(a != null) + require(!assignments.contains(a)) assignments += a +this syncAddAssignments (a) } def removeAssignments(a: Assignment): Unit = { + require(a != null) + require(assignments.contains(a)) assignments -= a +this syncRemoveAssignments (a) } diff --git a/solutions/RSync/src/main/scala/sync/bddg/Port.scala b/solutions/RSync/src/main/scala/sync/bddg/Port.scala index 70a5205580b967e468ffb7e4e3684b683095fce5..87d9283c84e07c34f79c60c1669eae09e29ce787 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/Port.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/Port.scala @@ -9,6 +9,7 @@ abstract class Port(protected var name: String, protected var owner: BDD) extend } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -18,6 +19,7 @@ abstract class Port(protected var name: String, protected var owner: BDD) extend } def setOwner(o: BDD): Unit = { + require(o != null) owner = o +this syncSetOwner () } diff --git a/solutions/RSync/src/main/scala/sync/bddg/Subtree.scala b/solutions/RSync/src/main/scala/sync/bddg/Subtree.scala index c83d3ed7179aaf9298c0d3f2920069e1bc059925..d98218a4bd7fddd2a6cd0cb332c472c6103ae616 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/Subtree.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/Subtree.scala @@ -7,6 +7,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setTreeForOne(t: Tree): Unit = { + require(t != null) treeForOne = t +this syncSetTreeForOne () } @@ -16,6 +17,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setTreeForZero(t: Tree): Unit = { + require(t != null) treeForZero = t +this syncSetTreeForZero () } @@ -25,6 +27,7 @@ class Subtree(protected var treeForOne: Tree, protected var treeForZero: Tree, p } def setPort(p: InputPort): Unit = { + require(p != null) port = p +this syncSetPort () } diff --git a/solutions/RSync/src/main/scala/sync/bddg/Tree.scala b/solutions/RSync/src/main/scala/sync/bddg/Tree.scala index a022da7a9420c63e010df2502d603c12da737757..83496443ed1d5ae6c6c43b8a49c04b81b2666abd 100644 --- a/solutions/RSync/src/main/scala/sync/bddg/Tree.scala +++ b/solutions/RSync/src/main/scala/sync/bddg/Tree.scala @@ -9,11 +9,15 @@ abstract class Tree(protected var ownerSubtreeForOne: Set[Subtree], protected va } def addOwnerSubtreeForOne(o: Subtree): Unit = { + require(o != null) + require(!ownerSubtreeForOne.contains(o)) ownerSubtreeForOne += o +this syncAddOwnerSubtreeForOne (o) } def removeOwnerSubtreeForOne(o: Subtree): Unit = { + require(o != null) + require(ownerSubtreeForOne.contains(o)) ownerSubtreeForOne -= o +this syncRemoveOwnerSubtreeForOne (o) } @@ -23,11 +27,15 @@ abstract class Tree(protected var ownerSubtreeForOne: Set[Subtree], protected va } def addOwnerSubtreeForZero(o: Subtree): Unit = { + require(o != null) + require(!ownerSubtreeForZero.contains(o)) ownerSubtreeForZero += o +this syncAddOwnerSubtreeForZero (o) } def removeOwnerSubtreeForZero(o: Subtree): Unit = { + require(o != null) + require(ownerSubtreeForZero.contains(o)) ownerSubtreeForZero -= o +this syncRemoveOwnerSubtreeForZero (o) } @@ -37,6 +45,7 @@ abstract class Tree(protected var ownerSubtreeForOne: Set[Subtree], protected va } def setOwnerBDD(o: BDD): Unit = { + require(o != null) ownerBDD = o +this syncSetOwnerBDD () } @@ -44,7 +53,7 @@ abstract class Tree(protected var ownerSubtreeForOne: Set[Subtree], protected va override def toString(): String = { "Tree:" } - + def getAvgPath(): Double = 0.0 def getMinPath(): Int = 0 diff --git a/solutions/RSync/src/main/scala/sync/tt/Cell.scala b/solutions/RSync/src/main/scala/sync/tt/Cell.scala index 2898978d962c5ebb3d04d0cd2e3955d6fa093c77..ae132ebdfff23540a7c4ab5dbc6687c23a077269 100644 --- a/solutions/RSync/src/main/scala/sync/tt/Cell.scala +++ b/solutions/RSync/src/main/scala/sync/tt/Cell.scala @@ -16,6 +16,7 @@ class Cell(protected var value: Boolean, protected var port: Port, protected var } def setPort(p: Port): Unit = { + require(p != null) port = p +this syncSetPort () } @@ -25,6 +26,7 @@ class Cell(protected var value: Boolean, protected var port: Port, protected var } def setOwner(o: Row): Unit = { + require(o != null) owner = o +this syncSetOwner () } diff --git a/solutions/RSync/src/main/scala/sync/tt/LocatedElement.scala b/solutions/RSync/src/main/scala/sync/tt/LocatedElement.scala index ab22829d0b5e3eb69e53991c0ffdca668ec712c1..2abcdbede2adaaf327abeb4ac895d921ad08fbf3 100644 --- a/solutions/RSync/src/main/scala/sync/tt/LocatedElement.scala +++ b/solutions/RSync/src/main/scala/sync/tt/LocatedElement.scala @@ -9,6 +9,7 @@ class LocatedElement(protected var location: String) extends PlayerSync { } def setLocation(l: String): Unit = { + require(l != null) location = l +this syncSetLocation () } diff --git a/solutions/RSync/src/main/scala/sync/tt/Port.scala b/solutions/RSync/src/main/scala/sync/tt/Port.scala index 89522cf07b961e0fdd2745670b00be7b0f2efbe0..b53e6088b25577c282c835b453f269ae98a71758 100644 --- a/solutions/RSync/src/main/scala/sync/tt/Port.scala +++ b/solutions/RSync/src/main/scala/sync/tt/Port.scala @@ -7,6 +7,7 @@ abstract class Port(protected var name: String, protected var cells: Set[Cell], } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -16,11 +17,15 @@ abstract class Port(protected var name: String, protected var cells: Set[Cell], } def addCells(c: Cell): Unit = { + require(c != null) + require(!cells.contains(c)) cells += c +this syncAddCells (c) } def removeCells(c: Cell): Unit = { + require(c != null) + require(cells.contains(c)) cells -= c +this syncRemoveCells (c) } @@ -30,6 +35,7 @@ abstract class Port(protected var name: String, protected var cells: Set[Cell], } def setOwner(o: TruthTable): Unit = { + require(o != null) owner = o +this syncSetOwner () } diff --git a/solutions/RSync/src/main/scala/sync/tt/Row.scala b/solutions/RSync/src/main/scala/sync/tt/Row.scala index 517b5a0324fffc9514278d1f315bebd220093887..c63aa16ff881d78836af3b5588abac15754e383d 100644 --- a/solutions/RSync/src/main/scala/sync/tt/Row.scala +++ b/solutions/RSync/src/main/scala/sync/tt/Row.scala @@ -7,11 +7,15 @@ class Row(protected var cells: Set[Cell], protected var owner: TruthTable, l_Loc } def addCells(c: Cell): Unit = { + require(c != null) + require(!cells.contains(c)) cells += c +this syncAddCells (c) } def removeCells(c: Cell): Unit = { + require(c != null) + require(cells.contains(c)) cells -= c +this syncRemoveCells (c) } @@ -21,6 +25,7 @@ class Row(protected var cells: Set[Cell], protected var owner: TruthTable, l_Loc } def setOwner(o: TruthTable): Unit = { + require(o != null) owner = o +this syncSetOwner () } diff --git a/solutions/RSync/src/main/scala/sync/tt/TruthTable.scala b/solutions/RSync/src/main/scala/sync/tt/TruthTable.scala index 4ebdec512e45a21b9f04d2a3b15aa7688d1394bb..237160739d9715b0e5978417828a5ea26c210430 100644 --- a/solutions/RSync/src/main/scala/sync/tt/TruthTable.scala +++ b/solutions/RSync/src/main/scala/sync/tt/TruthTable.scala @@ -7,6 +7,7 @@ class TruthTable(protected var name: String, protected var rows: Set[Row], prote } def setName(n: String): Unit = { + require(n != null) name = n +this syncSetName () } @@ -16,11 +17,15 @@ class TruthTable(protected var name: String, protected var rows: Set[Row], prote } def addRows(r: Row): Unit = { + require(r != null) + require(!rows.contains(r)) rows += r +this syncAddRows (r) } def removeRows(r: Row): Unit = { + require(r != null) + require(rows.contains(r)) rows -= r +this syncRemoveRows (r) } @@ -30,11 +35,15 @@ class TruthTable(protected var name: String, protected var rows: Set[Row], prote } def addPorts(p: Port): Unit = { + require(p != null) + require(!ports.contains(p)) ports += p +this syncAddPorts (p) } def removePorts(p: Port): Unit = { + require(p != null) + require(ports.contains(p)) ports -= p +this syncRemovePorts (p) } diff --git a/solutions/RSync/src/main/scala/ttc2019/CreateTruthTableSync.scala b/solutions/RSync/src/main/scala/ttc2019/CreateTruthTableSync.scala index a4cfd2d66ce77a40799b1d7fac43f75f2ac6aea5..73c11cef68aab86a88dc256d7917fad7201c519c 100644 --- a/solutions/RSync/src/main/scala/ttc2019/CreateTruthTableSync.scala +++ b/solutions/RSync/src/main/scala/ttc2019/CreateTruthTableSync.scala @@ -1,13 +1,8 @@ package ttc2019 -import sync.tt._ +import _root_.sync.tt._ import org.eclipse.emf.ecore.EObject -/** - * Create the instances of the truth table in Scala. - * - * @author Christopher Werner - */ class CreateTruthTableSync extends ICreateTruthTable { var mapping: Map[EObject, Object] = Map.empty @@ -33,6 +28,7 @@ class CreateTruthTableSync extends ICreateTruthTable { } def createTruthTableRowsRow(tt: EObject, row: EObject): Unit = { + //println("addRow") val t = mapping.get(tt).get.asInstanceOf[TruthTable] val r = mapping.get(row).get.asInstanceOf[Row] t.addRows(r) @@ -40,6 +36,7 @@ class CreateTruthTableSync extends ICreateTruthTable { } def createTruthTablePortsPort(tt: EObject, port: EObject): Unit = { + //println("addPort") val t = mapping.get(tt).get.asInstanceOf[TruthTable] val p = mapping.get(port).get.asInstanceOf[Port] t.addPorts(p) @@ -47,6 +44,7 @@ class CreateTruthTableSync extends ICreateTruthTable { } def createRowCellsCell(row: EObject, cell: EObject): Unit = { + //println("addCellInRow") val c = mapping.get(cell).get.asInstanceOf[Cell] val r = mapping.get(row).get.asInstanceOf[Row] c.setOwner(r) @@ -54,6 +52,7 @@ class CreateTruthTableSync extends ICreateTruthTable { } def createCellPortPort(cell: EObject, port: EObject): Unit = { + //println("addCellInPort") val c = mapping.get(cell).get.asInstanceOf[Cell] val p = mapping.get(port).get.asInstanceOf[Port] c.setPort(p) diff --git a/solutions/RSync/src/main/scala/ttc2019/TTCLoader.scala b/solutions/RSync/src/main/scala/ttc2019/TTCLoader.scala index 1126ef9c2952a9e5592260155fcc155f8bbbfb23..b9c67a894887c2edb382c789abfa4ece35a66a33 100644 --- a/solutions/RSync/src/main/scala/ttc2019/TTCLoader.scala +++ b/solutions/RSync/src/main/scala/ttc2019/TTCLoader.scala @@ -21,10 +21,10 @@ import ttc2019.metamodels.tt._ class TTCLoader { /** - * Fetches an ecore model from XMI directly converted into a truth table. + * Fetches an ecore model from XML. * - * @param path where to find the (meta-)model - * @return the truth table instance from the model + * @param path where to find the model + * @return the model described by the XML */ def javaOptimizedTTJavaEcore(pathMeta: String, pathInstance: String): TruthTable = { require(null != pathMeta && pathMeta.nonEmpty && null != pathInstance && pathInstance.nonEmpty) @@ -32,36 +32,18 @@ class TTCLoader { return loader.loadOptimizedTruthTable(pathMeta, pathInstance) } - /** - * Fetches an ecore model from XMI as EObject. - * - * @param path where to find the (meta-)model - * @return the EObject instance from the model - */ def loadOptimizedJavaEcore(pathMeta: String, pathInstance: String): EObject = { require(null != pathMeta && pathMeta.nonEmpty && null != pathInstance && pathInstance.nonEmpty) val loader = new LoadEObject return loader.loadOptimized(pathMeta, pathInstance) } - /** - * Fetches an ecore model from XMI as EObject. - * - * @param path where to find the (meta-)model - * @return the EObject instance from the model - */ def loadSimpleJavaEcore(pathMeta: String, pathInstance: String): EObject = { require(null != pathMeta && pathMeta.nonEmpty && null != pathInstance && pathInstance.nonEmpty) val loader = new LoadEObject return loader.loadSimple(pathMeta, pathInstance) } - /** - * Fetches an ecore model from XMI as EObject. - * - * @param path where to find the (meta-)model - * @return the EObject instance from the model - */ def loadScalaEcore(pathMeta: String, pathInstance: String): EObject = { require(null != pathMeta && pathMeta.nonEmpty && null != pathInstance && pathInstance.nonEmpty) @@ -81,9 +63,6 @@ class TTCLoader { return ressourceModel.getContents().get(0) } - /** - * Create a new object from the incoming element. - */ private def createObj(obj: EObject, ctts: ICreateTruthTable): Unit = { var objName = obj.eClass.getName @@ -98,9 +77,6 @@ class TTCLoader { } } - /** - * Create references between the created objects. - */ private def createReferences(o1: EObject, ctts: ICreateTruthTable): Unit = { o1.eClass().getEAllReferences.forEach(sf => { if (sf.getName == "port" || sf.getName == "owner") { @@ -135,10 +111,7 @@ class TTCLoader { }) } - /** - * Create the input TruthTable instance from the *.ttmodel file. - */ - def createTruthTableRSYNCInstance(tt: TruthTable, ctts: ICreateTruthTable): Unit = { + def createTruthTableRSYNCInstance(tt: TruthTable, ctts: ICreateTruthTable): Unit = { ctts.createTruthTable(tt.getName, tt) tt.getPorts.forEach(p => { @@ -152,12 +125,14 @@ class TTCLoader { tt.getRows.forEach(r => { ctts.createRow(r) - ctts.createTruthTableRowsRow(tt, r) r.getCells.forEach(c => { + //print("(" + c.getPort.getName + "|" + (if (c.isValue()) "1" else "0") + ") ") ctts.createCell(c.isValue(), c) - ctts.createRowCellsCell(r, c) ctts.createCellPortPort(c, c.getPort) + ctts.createRowCellsCell(r, c) }) + ctts.createTruthTableRowsRow(tt, r) + //println("") }) } diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/BddSyncIntegration.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/BddSyncIntegration.scala index c53602aeb17bc4791e141ed0270ebf2dcedea671..dcd8bfe349954d2f5ebd39a0b88b9dee7cb9f0eb 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/BddSyncIntegration.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/BddSyncIntegration.scala @@ -15,11 +15,11 @@ object BddSyncIntegration extends IIntegrationCompartment { private var leafNodes: Map[Set[String], sync.bddg.Leaf] = Map.empty private var createdBdds: Set[sync.bddg.BDD] = Set.empty - /*def printManager(): Unit = { + def printManager(): Unit = { ModelElementLists.getElementsFromType("sync.bddg.Leaf").asInstanceOf[List[sync.bddg.Leaf]].foreach(obj => { +obj printAllManager () }) - }*/ + } def getRelationalIntegratorsForClassName(classname: Object): IIntegrator = { return null @@ -67,6 +67,7 @@ object BddSyncIntegration extends IIntegrationCompartment { //find next inputport for subtree truthTable.getPorts().filter(p => p.isInstanceOf[sync.tt.InputPort] && !finishPorts.contains(p)).foreach(ttip => { val newCells = ttip.getCells().filter(c => rows.contains(c.getOwner())) + //println("Looking Port: " + ttip.getName() + " S: " + newCells.size) if (newCells.size >= max) { var setTrue: Set[Set[String]] = Set.empty var setFalse: Set[Set[String]] = Set.empty @@ -94,6 +95,7 @@ object BddSyncIntegration extends IIntegrationCompartment { portTT = ttip max = newCells.size } + //println("############################## " + newCells.size + " || T: " + p1 + " F: " + p2) } }) @@ -140,6 +142,69 @@ object BddSyncIntegration extends IIntegrationCompartment { subtree } + + def createInputLookSubtree(bdd: sync.bddg.BDD, truthTable: sync.tt.TruthTable, rows: Set[sync.tt.Row], finishPorts: Set[sync.tt.Port]): sync.bddg.Tree = { + var max = 0 + var portTT: sync.tt.Port = null + var cellis: Set[sync.tt.Cell] = Set.empty + + truthTable.getPorts().filter(p => p.isInstanceOf[sync.tt.InputPort] && !finishPorts.contains(p)).foreach(ttip => { + val newCells = ttip.getCells().filter(c => rows.contains(c.getOwner())) + if (newCells.size > max) { + max = newCells.size + portTT = ttip + cellis = newCells + } else if (newCells.size == max) { + val p1 = newCells.count(_.getValue()) + val p2 = newCells.count(!_.getValue()) + if (Math.abs(max / 2 - p1) > Math.abs(max / 2 - p2)) { + portTT = ttip + cellis = newCells + } + } + }) + var portBDD: sync.bddg.InputPort = null + val oppo: PlayerSync = +portTT getRelatedClassFromName ("InputPort") + if (oppo != null) { + portBDD = oppo.asInstanceOf[sync.bddg.InputPort] + } + + val newPorts = finishPorts + portTT + val subtree = new sync.bddg.Subtree(null, null, portBDD, Set.empty, Set.empty, bdd) + bdd.addTrees(subtree) + portBDD.addSubtrees(subtree) + + val rowsOne = cellis.filter(_.getValue()).map(_.getOwner()) + val rowsZero = cellis.filter(!_.getValue()).map(_.getOwner()) + + var treeZero: sync.bddg.Tree = null + var treeOne: sync.bddg.Tree = null + if (rowsZero.size == 1) { + //create leaf from rows + treeZero = createLeafFromRows(bdd, rowsZero) + } else { + treeZero = createInputLookSubtree(bdd, truthTable, rowsZero, newPorts) + } + if (rowsOne.size == 1) { + //create leaf from rows + treeOne = createLeafFromRows(bdd, rowsOne) + } else { + treeOne = createInputLookSubtree(bdd, truthTable, rowsOne, newPorts) + } + //TODO: Assignment what to do for more than one output cell + + treeOne.addOwnerSubtreeForOne(subtree) + subtree.setTreeForOne(treeOne) + //connect to rows + connectTargetElementWithSourceElementes(treeOne, rowsOne.asInstanceOf[Set[PlayerSync]]) + + treeZero.addOwnerSubtreeForZero(subtree) + subtree.setTreeForZero(treeZero) + //connect to rows + connectTargetElementWithSourceElementes(treeZero, rowsZero.asInstanceOf[Set[PlayerSync]]) + + subtree + } def createLeafFromRows(bdd: sync.bddg.BDD, rows: Set[sync.tt.Row]): sync.bddg.Leaf = { val mapping = rows.head.getCells().filter(c => c.getPort().isInstanceOf[sync.tt.OutputPort]).map(c => s"${c.getPort().getName()} ${c.getValue()}") diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/BdtAndBddSyncIntegration.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/BdtAndBddSyncIntegration.scala index 692771e1572bfb889ad5e84ca94a005b0d8fc424..a49943b099eabc7925b8fc37961cfa31b594dfad 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/BdtAndBddSyncIntegration.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/BdtAndBddSyncIntegration.scala @@ -72,6 +72,7 @@ object BdtAndBddSyncIntegration extends IIntegrationCompartment { //find next inputport for subtree truthTable.getPorts().filter(p => p.isInstanceOf[sync.tt.InputPort] && !finishPorts.contains(p)).foreach(ttip => { val newCells = ttip.getCells().filter(c => rows.contains(c.getOwner())) + //println("Looking Port: " + ttip.getName() + " S: " + newCells.size) if (newCells.size >= max) { var setTrue: Set[Set[String]] = Set.empty var setFalse: Set[Set[String]] = Set.empty @@ -99,9 +100,11 @@ object BdtAndBddSyncIntegration extends IIntegrationCompartment { portTT = ttip max = newCells.size } + //println("############################## " + newCells.size + " || T: " + p1 + " F: " + p2) } }) + //println("Used Port: " + portTT) var portBDD: sync.bddg.InputPort = null val oppo: PlayerSync = +portTT getRelatedClassFromName ("InputPort") if (oppo != null) { diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/BdtSyncIntegration.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/BdtSyncIntegration.scala index 058d6dd89b7094d2aae296ddff7721ec7adebbc9..1f7ad2b6c5e289c8cb236cb39d6151be9e103f0a 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/BdtSyncIntegration.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/BdtSyncIntegration.scala @@ -58,6 +58,7 @@ object BdtSyncIntegration extends IIntegrationCompartment { truthTable.getPorts().filter(p => p.isInstanceOf[sync.tt.InputPort] && !finishPorts.contains(p)).foreach(ttip => { val newCells = ttip.getCells().filter(c => rows.contains(c.getOwner())) + //println("Looking Port: " + ttip.getName() + " S: " + newCells.size) if (newCells.size >= max) { var setTrue: Set[Set[String]] = Set.empty var setFalse: Set[Set[String]] = Set.empty @@ -85,6 +86,7 @@ object BdtSyncIntegration extends IIntegrationCompartment { portTT = ttip max = newCells.size } + //println("############################## " + newCells.size + " || T: " + p1 + " F: " + p2) } }) diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesCellSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesCellSync.scala new file mode 100644 index 0000000000000000000000000000000000000000..7ccfc1b82c3db63ef958e2bd7119c88c33712488 --- /dev/null +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesCellSync.scala @@ -0,0 +1,78 @@ +package ttc2019.worksync + +import org.rosi_project.model_management.sync.ISyncCompartment +import org.rosi_project.model_management.sync.roles.ISyncRole +import org.rosi_project.model_management.core.PlayerSync + +class SyncChangesCellSync() extends ISyncCompartment { + + def getFirstRole(classname: Object): ISyncRole = { + if (classname.isInstanceOf[sync.tt.Cell]) + return new Sync() + return null + } + + def isFirstIntegration(classname: Object): Boolean = { + if (classname.isInstanceOf[sync.tt.Cell]) + return true + return false + } + + def getNewInstance(): ISyncCompartment = new SyncChangesCellSync + + def getRuleName(): String = "SyncChangesCellSync" + + class Sync() extends ISyncRole { + + def getOuterCompartment(): ISyncCompartment = SyncChangesCellSync.this + + /** + * Rule which add ports to its root in each model. + */ + def syncSetPort(): Unit = { + val port: sync.tt.Port = +this getPort () + if (port.isInstanceOf[sync.tt.OutputPort] && !doSync) { + doSync = true; + //get value from cell + val value: Boolean = +this getValue () + //get needed ports + val opTreePort: PlayerSync = +port getRelatedClassFromName ("sync.bdd.Port") + //val opDiaPort: PlayerSync = +port getRelatedClassFromName ("sync.bddg.Port") + //create assignments + if (opTreePort != null) { + val o_port = opTreePort.asInstanceOf[sync.bdd.OutputPort] + val assignment = new sync.bdd.Assignment(value, null, null) + + o_port.addAssignments(assignment) + assignment.setPort(o_port) + //trace link + +this makePlayerSyncRelated (assignment) + } + /*if (opDiaPort != null) { + val o_port = opDiaPort.asInstanceOf[sync.bddg.OutputPort] + val assignment = new sync.bddg.Assignment(value, null, null) + + o_port.addAssignments(assignment) + assignment.setPort(o_port) + //trace link + +this makePlayerSyncRelated (assignment) + }*/ + doSync = false; + } + } + + /*def syncSetValue(): Unit = { + if (!doSync) { + doSync = true; + var value: Boolean = +this getValue (); + syncer.foreach { a => + if (!a.equals(this)) { + (+a).setValue(value); + } + } + doSync = false; + } + }*/ + } + +} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesTruthTableSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesTruthTableSync.scala new file mode 100644 index 0000000000000000000000000000000000000000..c0e1c986ba46bb405610668d07c725be73c49751 --- /dev/null +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncChangesTruthTableSync.scala @@ -0,0 +1,490 @@ +package ttc2019.worksync + +import org.rosi_project.model_management.sync.ISyncCompartment +import org.rosi_project.model_management.sync.roles.ISyncRole +import org.rosi_project.model_management.core.PlayerSync +import org.rosi_project.model_management.sync.roles.IRoleManager + +/** + * Synchronization compartment between truth table and BDD to react on changing (adding or removing) a row. + */ +class SyncChangesTruthTableSync() extends ISyncCompartment { + + private var leafNodes: Map[Set[String], sync.bddg.Leaf] = Map.empty + + def getFirstRole(classname: Object): ISyncRole = { + if (classname.isInstanceOf[sync.tt.TruthTable]) + return new Sync() + return null + } + + def isFirstIntegration(classname: Object): Boolean = { + if (classname.isInstanceOf[sync.tt.TruthTable]) + return true + return false + } + + def getNewInstance(): ISyncCompartment = new SyncChangesTruthTableSync + + def getRuleName(): String = "SyncChangesTruthTableSync" + + class Sync() extends ISyncRole { + + def getOuterCompartment(): ISyncCompartment = SyncChangesTruthTableSync.this + + /** + * Rule which add ports to its root in each model. + */ + def syncAddPorts(port: PlayerSync): Unit = { + if (!doSync) { + doSync = true; + //get connected bdds & tt & ports + //add the ports to the bdds or tts + val opTreeBDD: PlayerSync = +this getRelatedClassFromName ("sync.bdd.BDD") + val opTreePort: PlayerSync = +port getRelatedClassFromName ("sync.bdd.Port") + if (opTreeBDD != null && opTreePort != null) { + val reTreeBdd = opTreeBDD.asInstanceOf[sync.bdd.BDD] + val reTreePort = opTreePort.asInstanceOf[sync.bdd.Port] + reTreeBdd.addPorts(reTreePort) + reTreePort.setOwner(reTreeBdd) + } + + val opDiaBDD: PlayerSync = +this getRelatedClassFromName ("sync.bddg.BDD") + val opDiaPort: PlayerSync = +port getRelatedClassFromName ("sync.bddg.Port") + if (opDiaBDD != null && opDiaPort != null) { + val reDiaBdd = opDiaBDD.asInstanceOf[sync.bddg.BDD] + val reDiaPort = opDiaPort.asInstanceOf[sync.bddg.Port] + reDiaBdd.addPorts(reDiaPort) + reDiaPort.setOwner(reDiaBdd) + } + + val opTtBDD: PlayerSync = +this getRelatedClassFromName ("sync.tt.TruthTable") + val opTtPort: PlayerSync = +port getRelatedClassFromName ("sync.tt.Port") + if (opTtBDD != null && opTtPort != null) { + val reTtBdd = opTtBDD.asInstanceOf[sync.tt.TruthTable] + val reTtPort = opTtPort.asInstanceOf[sync.tt.Port] + reTtBdd.addPorts(reTtPort) + reTtPort.setOwner(reTtBdd) + } + + doSync = false; + } + } + + /** + * Removes a row from the truth table and from the other the leafs and subtrees. + */ + def syncRemoveRows(rowPS: PlayerSync): Unit = { + val row = rowPS.asInstanceOf[sync.tt.Row] + if (!doSync) { + doSync = true + val opTreLeaf: PlayerSync = +row getRelatedClassFromName ("sync.bdd.Leaf") + val opDiaLeaf: PlayerSync = +row getRelatedClassFromName ("sync.bddg.Leaf") + + if (opTreLeaf != null) { + //exists connected BDT + val reTreLeaf = opTreLeaf.asInstanceOf[sync.bdd.Leaf] + var relManagerLeaf: Set[IRoleManager] = +reTreLeaf getRelatedManager () + //println(relManagerLeaf) + + //do something if there is only one related manager than minimize the tree + if (relManagerLeaf.size == 1) { + if (reTreLeaf.getOwnerBDD() != null) { + reTreLeaf.getOwnerBDD().setTree(null) + } else { + var parent: sync.bdd.Subtree = null + var otherChild: sync.bdd.Tree = null + if (reTreLeaf.getOwnerSubtreeForOne() == null) { + parent = reTreLeaf.getOwnerSubtreeForZero() + otherChild = parent.getTreeForOne() + } else { + parent = reTreLeaf.getOwnerSubtreeForOne() + otherChild = parent.getTreeForZero() + } + if (parent.getOwnerBDD() != null) { + parent.getOwnerBDD().setTree(otherChild) + otherChild.setOwnerBDD(parent.getOwnerBDD()) + otherChild.setOwnerSubtreeForOne(null) + otherChild.setOwnerSubtreeForZero(null) + } else { + if (parent.getOwnerSubtreeForOne() != null) { + parent.getOwnerSubtreeForOne().setTreeForOne(otherChild) + otherChild.setOwnerSubtreeForOne(parent.getOwnerSubtreeForOne()) + otherChild.setOwnerSubtreeForZero(null) + } else { + parent.getOwnerSubtreeForZero().setTreeForZero(otherChild) + otherChild.setOwnerSubtreeForZero(parent.getOwnerSubtreeForZero()) + otherChild.setOwnerSubtreeForOne(null) + } + } + //delete parent from synchro + parent.deleteObjectFromSynchro() + } + + //delete leaf + reTreLeaf.deleteObjectFromSynchro() + reTreLeaf.getAssignments().foreach(a => { + a.deleteObjectFromSynchro() + }) + + } + row.deleteObjectFromSynchro() + row.setOwner(null) + row.getCells().foreach(c => { + c.getPort().removeCells(c) + c.setPort(null) + c.setOwner(null) + c.deleteObjectFromSynchro() + }) + //TODO: row remove all cells + } + doSync = false; + } + } + + /** + * Rule which add rows to the truth table and create subtrees and leafs in other models. + */ + def syncAddRows(rowPS: PlayerSync): Unit = { + //println("In Sync Add Row") + val row = rowPS.asInstanceOf[sync.tt.Row] + if (!doSync) { + doSync = true; + val opTreeBDD: PlayerSync = +this getRelatedClassFromName ("sync.bdd.BDD") + val opDiaBDD: PlayerSync = +this getRelatedClassFromName ("sync.bddg.BDD") + if (opTreeBDD != null) { + val reBdd = opTreeBDD.asInstanceOf[sync.bdd.BDD] + addNewRowCompleteTree(reBdd, row) + //addNewRow(reTreeBdd.getTree(), Set.empty, row) + } + if (opDiaBDD != null) { + val reBdd = opDiaBDD.asInstanceOf[sync.bddg.BDD] + addNewRowCompleteTree(reBdd, row) + } + doSync = false; + } + } + + /** + * Function to add a new row for the sync.bddg model. + */ + private def addNewRowCompleteTree(bdd: sync.bddg.BDD, row: sync.tt.Row): Unit = { + var portList: Set[sync.tt.Port] = Set.empty + var oldValue = false + var lastSubtree: sync.bddg.Subtree = null + var newTree: sync.bddg.Tree = bdd.getRoot() + + //iterate over tree to find next empty subtree + while (newTree != null) { + if (newTree.isInstanceOf[sync.bddg.Subtree]) { + lastSubtree = newTree.asInstanceOf[sync.bddg.Subtree] + row.getCells().foreach(c => { + if (c.getPort().getName() == lastSubtree.getPort().getName()) { + //goto next subtree + if (c.getValue()) { + newTree = lastSubtree.getTreeForOne() + } else { + newTree = lastSubtree.getTreeForZero() + } + portList += c.getPort() + oldValue = c.getValue() + //trace link + +row makePlayerSyncRelated (lastSubtree) + } + }) + } + } + + //add subtrees for all missing cells with input ports + row.getCells().filter(c => !portList.contains(c.getPort()) && c.getPort().isInstanceOf[sync.tt.InputPort]).foreach(c => { + val opTreePort: PlayerSync = +(c.getPort()) getRelatedClassFromName ("sync.bddg.InputPort") + if (opTreePort != null) { + val inputPort = opTreePort.asInstanceOf[sync.bddg.InputPort] + var subtree = new sync.bddg.Subtree(null, null, inputPort, Set.empty, Set.empty, null) + bdd.addTrees(subtree) + subtree.setOwnerBDD(bdd) + if (lastSubtree == null) { + bdd.setRoot(subtree) + } else { + if (oldValue) { + lastSubtree.setTreeForOne(subtree) + subtree.addOwnerSubtreeForOne(lastSubtree) + } else { + lastSubtree.setTreeForZero(subtree) + subtree.addOwnerSubtreeForZero(lastSubtree) + } + } + oldValue = c.getValue() + lastSubtree = subtree + //trace link + +row makePlayerSyncRelated (lastSubtree) + } + }) + + //Create new assignment and search all cells for it + val mapping = row.getCells().filter(c => c.getPort().isInstanceOf[sync.tt.OutputPort]).map(c => s"${c.getPort().getName()} ${c.getValue()}") + + val mapped = leafNodes.get(mapping) + var leaf: sync.bddg.Leaf = null + + if (!mapped.isEmpty) { + leaf = mapped.get + } else { + leaf = new sync.bddg.Leaf(Set.empty, Set.empty, Set.empty, bdd) + bdd.addTrees(leaf) + leafNodes += (mapping -> leaf) + + row.getCells().filter(c => c.getPort().isInstanceOf[sync.tt.OutputPort]).foreach(cellout => { + //Create new assignment and search all cells for it + val assignment = new sync.bddg.Assignment(cellout.getValue(), null, null) + assignment.setOwner(leaf) + leaf.addAssignments(assignment) + + val ttport: PlayerSync = +(cellout.getPort()) getRelatedClassFromName ("OutputPort") + if (ttport != null) { + val o_port = ttport.asInstanceOf[sync.bddg.OutputPort] + o_port.addAssignments(assignment) + assignment.setPort(o_port) + } + }) + } + + //connect assignments to cells + leaf.getAssignments().foreach(a => { + val cell = row.getCells().filter(_.getPort().getName() == a.getPort().getName()).head + + //trace link + +cell makePlayerSyncRelated (a) + }) + + if (oldValue) { + lastSubtree.setTreeForOne(leaf) + leaf.addOwnerSubtreeForOne(lastSubtree) + } else { + lastSubtree.setTreeForZero(leaf) + leaf.addOwnerSubtreeForZero(lastSubtree) + } + //trace link + +row makePlayerSyncRelated (leaf) + + //+row printAllManager () + } + + /** + * Function to add a new row for the sync.bdd model. + */ + private def addNewRowCompleteTree(bdd: sync.bdd.BDD, row: sync.tt.Row): Unit = { + var portList: Set[sync.tt.Port] = Set.empty + var oldValue = false + var lastSubtree: sync.bdd.Subtree = null + var newTree: sync.bdd.Tree = bdd.getTree() + + //iterate over tree to find next empty subtree + while (newTree != null) { + if (newTree.isInstanceOf[sync.bdd.Subtree]) { + lastSubtree = newTree.asInstanceOf[sync.bdd.Subtree] + row.getCells().foreach(c => { + if (c.getPort().getName() == lastSubtree.getPort().getName()) { + //goto next subtree + if (c.getValue()) { + newTree = lastSubtree.getTreeForOne() + } else { + newTree = lastSubtree.getTreeForZero() + } + portList += c.getPort() + oldValue = c.getValue() + //trace link + +row makePlayerSyncRelated (lastSubtree) + } + }) + } + } + + //add subtrees for all missing cells with input ports + row.getCells().filter(c => !portList.contains(c.getPort()) && c.getPort().isInstanceOf[sync.tt.InputPort]).foreach(c => { + val opTreePort: PlayerSync = +(c.getPort()) getRelatedClassFromName ("sync.bdd.InputPort") + if (opTreePort != null) { + val inputPort = opTreePort.asInstanceOf[sync.bdd.InputPort] + var subtree = new sync.bdd.Subtree(null, null, inputPort, null, null, null) + if (lastSubtree == null) { + bdd.setTree(subtree) + subtree.setOwnerBDD(bdd) + } else { + if (oldValue) { + lastSubtree.setTreeForOne(subtree) + subtree.setOwnerSubtreeForOne(lastSubtree) + } else { + lastSubtree.setTreeForZero(subtree) + subtree.setOwnerSubtreeForZero(lastSubtree) + } + } + oldValue = c.getValue() + lastSubtree = subtree + //trace link + +row makePlayerSyncRelated (lastSubtree) + } + }) + + //add leaf for each row with cells with output ports + val leaf = new sync.bdd.Leaf(Set.empty, null, null, null) + row.getCells().filter(c => c.getPort().isInstanceOf[sync.tt.OutputPort]).foreach(cellout => { + //Search connected assignement from cell + val oppAssign: PlayerSync = +cellout getRelatedClassFromName ("sync.bdd.Assignment") + if (oppAssign != null) { + val assignment = oppAssign.asInstanceOf[sync.bdd.Assignment] + assignment.setOwner(leaf) + leaf.addAssignments(assignment) + } + + /*//Create new assignment and search all cells for it + val assignment = new sync.bdd.Assignment(cellout.getValue(), null, null) + assignment.setOwner(leaf) + leaf.addAssignments(assignment) + + val ttport: PlayerSync = +(cellout.getPort()) getRelatedClassFromName ("sync.bdd.OutputPort") + if (ttport != null) { + val o_port = ttport.asInstanceOf[sync.bdd.OutputPort] + o_port.addAssignments(assignment) + assignment.setPort(o_port) + } + //trace link + +cellout makePlayerSyncRelated(assignment) + + +cellout printAllManager()*/ + }) + + if (oldValue) { + lastSubtree.setTreeForOne(leaf) + leaf.setOwnerSubtreeForOne(lastSubtree) + } else { + lastSubtree.setTreeForZero(leaf) + leaf.setOwnerSubtreeForZero(lastSubtree) + } + //trace link + +row makePlayerSyncRelated (leaf) + } + + /** + * Old Method to complex because of special tree structure. + */ + private def addNewRow(tree: sync.bdd.Tree, portList: Set[sync.tt.Port], row: sync.tt.Row): Unit = { + if (tree.isInstanceOf[sync.bdd.Leaf]) { + val oldLeaf = tree.asInstanceOf[sync.bdd.Leaf] + var cellValue: Set[String] = Set.empty + //proof if assignments are correct to the ones of the new row + row.getCells().filter(_.getPort().isInstanceOf[sync.tt.OutputPort]).foreach(c => { + cellValue += s"${c.getPort().getName()} ${c.getValue()}" + }) + val firstCount = cellValue.size + oldLeaf.getAssignments().foreach(a => { + cellValue += s"${a.getPort().getName()} ${a.getValue()}" + }) + if (firstCount < cellValue.size) { + //you must split and add new stuff + //TODO problem with more than one connected row + val opRowTT: PlayerSync = +this getRelatedClassFromName ("sync.tt.Row") + if (opRowTT != null) { + val reRowTT = opRowTT.asInstanceOf[sync.tt.Row] + //compare opponent row with this row + reRowTT.getCells().filter(c => !portList.contains(c.getPort())).foreach(cO => { + row.getCells().filter(_.getPort() == cO.getPort()).foreach(cN => { + if (cN.getValue() != cO.getValue()) { + //use this port for new one and create now all stuff + val newLeaf = new sync.bdd.Leaf(Set.empty, null, null, null) + + row.getCells().filter(cl => cl.getPort().isInstanceOf[sync.tt.OutputPort]).foreach(cellout => { + //Create new assignment and search all cells for it + val assignment = new sync.bdd.Assignment(cellout.getValue(), null, null) + assignment.setOwner(newLeaf) + newLeaf.addAssignments(assignment) + + val ttport: PlayerSync = +(cellout.getPort()) getRelatedClassFromName ("OutputPort") + if (ttport != null) { + val o_port = ttport.asInstanceOf[sync.bdd.OutputPort] + o_port.addAssignments(assignment) + assignment.setPort(o_port) + } + + //trace link + +cellout makePlayerSyncRelated (assignment) + }) + + val bdtInputPort: PlayerSync = +(cO.getPort()) getRelatedClassFromName ("InputPort") + if (bdtInputPort != null) { + val i_port = bdtInputPort.asInstanceOf[sync.bdd.InputPort] + var subtree: sync.bdd.Subtree = null + if (oldLeaf.getOwnerSubtreeForOne() != null) { + subtree = new sync.bdd.Subtree(null, null, i_port, oldLeaf.getOwnerSubtreeForOne(), null, null) + oldLeaf.getOwnerSubtreeForOne().setTreeForOne(subtree) + } else { + subtree = new sync.bdd.Subtree(null, null, i_port, null, oldLeaf.getOwnerSubtreeForZero(), null) + oldLeaf.getOwnerSubtreeForZero().setTreeForZero(subtree) + } + i_port.addSubtrees(subtree) + if (cN.getValue()) { + subtree.setTreeForOne(newLeaf) + newLeaf.setOwnerSubtreeForOne(subtree) + subtree.setTreeForZero(oldLeaf) + oldLeaf.setOwnerSubtreeForOne(null) + oldLeaf.setOwnerSubtreeForZero(subtree) + } else { + subtree.setTreeForOne(oldLeaf) + oldLeaf.setOwnerSubtreeForOne(subtree) + oldLeaf.setOwnerSubtreeForZero(null) + subtree.setTreeForZero(newLeaf) + newLeaf.setOwnerSubtreeForZero(subtree) + } + } + } + }) + }) + } + } else { + val rmSubtree: IRoleManager = +oldLeaf getManager () + val rmRow: IRoleManager = +row getManager () + if (rmSubtree != null && rmRow != null) { + rmSubtree.makeRelated(rmRow) + } + } + } else { + //is instance of subtree + val subtree = tree.asInstanceOf[sync.bdd.Subtree] + var port: sync.tt.Port = null + var value = false + row.getCells().foreach(c => { + if (c.getPort().getName() == subtree.getPort().getName()) { + port = c.getPort() + value = c.getValue() + } + }) + val rmSubtree: IRoleManager = +subtree getManager () + val rmRow: IRoleManager = +row getManager () + if (rmSubtree != null && rmRow != null) { + rmSubtree.makeRelated(rmRow) + } + if (value) { + addNewRow(subtree.getTreeForOne(), portList + port, row) + } else { + addNewRow(subtree.getTreeForZero(), portList + port, row) + } + } + } + + /** + * Change the names of TruthTable and BDDs. + */ + def changeName(): Unit = { + if (!doSync) { + doSync = true; + var name: String = +this getName (); + getSyncer().foreach { a => + if (!a.equals(this)) { + (+a).setName(name); + } + } + doSync = false; + } + } + } + +} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncHeadNamesSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncHeadNamesSync.scala index ad02e8d5606680ad70dc72356c62aa39cc3e3f7c..c3f5e7afd340aebd259d2a082986aa64f17d1912 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncHeadNamesSync.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncHeadNamesSync.scala @@ -8,26 +8,26 @@ import org.rosi_project.model_management.sync.roles.ISyncRole */ class SyncHeadNamesSync() extends ISyncCompartment { - def getNextRole(classname: Object): ISyncRole = { + override def getNextRole(classname: Object): ISyncRole = { if (classname.isInstanceOf[sync.bdd.BDD] || classname.isInstanceOf[sync.bddg.BDD] || classname.isInstanceOf[sync.tt.TruthTable]) return new Sync() return null } def getFirstRole(classname: Object): ISyncRole = { - if (classname.isInstanceOf[sync.bdd.BDD] || classname.isInstanceOf[sync.bddg.BDD] || classname.isInstanceOf[sync.tt.TruthTable]) + if (classname.isInstanceOf[sync.tt.TruthTable]) return new Sync() return null } - def isNextIntegration(classname: Object): Boolean = { + override def isNextIntegration(classname: Object): Boolean = { if (classname.isInstanceOf[sync.bdd.BDD] || classname.isInstanceOf[sync.bddg.BDD] || classname.isInstanceOf[sync.tt.TruthTable]) return true return false } def isFirstIntegration(classname: Object): Boolean = { - if (classname.isInstanceOf[sync.bdd.BDD] || classname.isInstanceOf[sync.bddg.BDD] || classname.isInstanceOf[sync.tt.TruthTable]) + if (classname.isInstanceOf[sync.tt.TruthTable]) return true return false } @@ -44,7 +44,7 @@ class SyncHeadNamesSync() extends ISyncCompartment { if (!doSync) { doSync = true; var name: String = +this getName(); - syncer.foreach { a => + getSyncer().foreach { a => if (!a.equals(this)) { (+a).setName(name); } diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncInputPortNamesSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncInputPortNamesSync.scala index a7b3e34b7663b98e0d60eab1b3c80d3154ef672d..677e47b80df07153204acbebfcfb8ada62f584d5 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncInputPortNamesSync.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncInputPortNamesSync.scala @@ -4,30 +4,30 @@ import org.rosi_project.model_management.sync.ISyncCompartment import org.rosi_project.model_management.sync.roles.ISyncRole /** - * Synchronization compartment for full name split with space. + * Synchronization compartment for input port names. */ class SyncInputPortNamesSync() extends ISyncCompartment { - def getNextRole(classname: Object): ISyncRole = { + override def getNextRole(classname: Object): ISyncRole = { if (classname.isInstanceOf[sync.bdd.InputPort] || classname.isInstanceOf[sync.bddg.InputPort] || classname.isInstanceOf[sync.tt.InputPort]) return new Sync() return null } def getFirstRole(classname: Object): ISyncRole = { - if (classname.isInstanceOf[sync.bdd.InputPort] || classname.isInstanceOf[sync.bddg.InputPort] || classname.isInstanceOf[sync.tt.InputPort]) + if (classname.isInstanceOf[sync.tt.InputPort]) return new Sync() return null } - def isNextIntegration(classname: Object): Boolean = { + override def isNextIntegration(classname: Object): Boolean = { if (classname.isInstanceOf[sync.bdd.InputPort] || classname.isInstanceOf[sync.bddg.InputPort] || classname.isInstanceOf[sync.tt.InputPort]) return true return false } def isFirstIntegration(classname: Object): Boolean = { - if (classname.isInstanceOf[sync.bdd.InputPort] || classname.isInstanceOf[sync.bddg.InputPort] || classname.isInstanceOf[sync.tt.InputPort]) + if (classname.isInstanceOf[sync.tt.InputPort]) return true return false } @@ -44,7 +44,7 @@ class SyncInputPortNamesSync() extends ISyncCompartment { if (!doSync) { doSync = true; var name: String = +this getName(); - syncer.foreach { a => + getSyncer().foreach { a => if (!a.equals(this)) { (+a).setName(name); } diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncOutputPortNamesSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncOutputPortNamesSync.scala index 75fb40a844be12adde208c821092007964c8dc29..3a67d3dd7dbc33b28bcbfc909cc705f17a916f67 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncOutputPortNamesSync.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncOutputPortNamesSync.scala @@ -4,30 +4,30 @@ import org.rosi_project.model_management.sync.ISyncCompartment import org.rosi_project.model_management.sync.roles.ISyncRole /** - * Synchronization compartment for full name split with space. + * Synchronization compartment for output port names. */ class SyncOutputPortNamesSync() extends ISyncCompartment { - def getNextRole(classname: Object): ISyncRole = { + override def getNextRole(classname: Object): ISyncRole = { if (classname.isInstanceOf[sync.bdd.OutputPort] || classname.isInstanceOf[sync.bddg.OutputPort] || classname.isInstanceOf[sync.tt.OutputPort]) return new Sync() return null } def getFirstRole(classname: Object): ISyncRole = { - if (classname.isInstanceOf[sync.bdd.OutputPort] || classname.isInstanceOf[sync.bddg.OutputPort] || classname.isInstanceOf[sync.tt.OutputPort]) + if (classname.isInstanceOf[sync.tt.OutputPort]) return new Sync() return null } - def isNextIntegration(classname: Object): Boolean = { + override def isNextIntegration(classname: Object): Boolean = { if (classname.isInstanceOf[sync.bdd.OutputPort] || classname.isInstanceOf[sync.bddg.OutputPort] || classname.isInstanceOf[sync.tt.OutputPort]) return true return false } def isFirstIntegration(classname: Object): Boolean = { - if (classname.isInstanceOf[sync.bdd.OutputPort] || classname.isInstanceOf[sync.bddg.OutputPort] || classname.isInstanceOf[sync.tt.OutputPort]) + if (classname.isInstanceOf[sync.tt.OutputPort]) return true return false } @@ -44,7 +44,7 @@ class SyncOutputPortNamesSync() extends ISyncCompartment { if (!doSync) { doSync = true; var name: String = +this getName(); - syncer.foreach { a => + getSyncer().foreach { a => if (!a.equals(this)) { (+a).setName(name); } diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/SyncPortNamesSync.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncPortNamesSync.scala new file mode 100644 index 0000000000000000000000000000000000000000..ff789f84c1db664ea9c0ad1bba63fb34ea9de310 --- /dev/null +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/SyncPortNamesSync.scala @@ -0,0 +1,57 @@ +package ttc2019.worksync + +import org.rosi_project.model_management.sync.ISyncCompartment +import org.rosi_project.model_management.sync.roles.ISyncRole + +/** + * Synchronization compartment for port names. + */ +class SyncPortNamesSync extends ISyncCompartment { + + override def getNextRole(classname: Object): ISyncRole = { + if (classname.isInstanceOf[sync.bdd.Port] || classname.isInstanceOf[sync.bddg.Port] || classname.isInstanceOf[sync.tt.Port]) + return new Sync() + return null + } + + def getFirstRole(classname: Object): ISyncRole = { + if (classname.isInstanceOf[sync.tt.Port]) + return new Sync() + return null + } + + override def isNextIntegration(classname: Object): Boolean = { + if (classname.isInstanceOf[sync.bdd.Port] || classname.isInstanceOf[sync.bddg.Port] || classname.isInstanceOf[sync.tt.Port]) + return true + return false + } + + def isFirstIntegration(classname: Object): Boolean = { + if (classname.isInstanceOf[sync.tt.Port]) + return true + return false + } + + def getNewInstance(): ISyncCompartment = new SyncPortNamesSync + + def getRuleName(): String = "SyncPortNamesSync" + + class Sync() extends ISyncRole { + + def getOuterCompartment(): ISyncCompartment = SyncPortNamesSync.this + + def changeName(): Unit = { + if (!doSync) { + doSync = true; + var name: String = +this getName(); + getSyncer().foreach { a => + if (!a.equals(this)) { + (+a).setName(name); + } + } + doSync = false; + } + } + } + +} \ No newline at end of file diff --git a/solutions/RSync/src/main/scala/ttc2019/worksync/TTandBDTandBDDSyncConstruction.scala b/solutions/RSync/src/main/scala/ttc2019/worksync/TTandBDTandBDDSyncConstruction.scala index 93fca644cadd4dd2d4c576615a9c7dcb829ea9bf..c1d40e911f6213a99337890dc2065e85cda0357a 100644 --- a/solutions/RSync/src/main/scala/ttc2019/worksync/TTandBDTandBDDSyncConstruction.scala +++ b/solutions/RSync/src/main/scala/ttc2019/worksync/TTandBDTandBDDSyncConstruction.scala @@ -30,7 +30,9 @@ object TTandBDTandBDDSyncConstruction extends IConstructionCompartment { return new BDDOutputPortConstruct() if (classname.isInstanceOf[sync.bdd.OutputPort]) return new BDTOutputPortConstruct() - return null + //if (classname.isInstanceOf[sync.tt.Cell]) + // return new CellConstruct() + return new Suppressor } def getRuleName: String = "TTandBDTandBDDSyncConstruction" @@ -215,11 +217,36 @@ object TTandBDTandBDDSyncConstruction extends IConstructionCompartment { } } - class TTRowConstruct() extends IConstructor { + /*class CellConstruct extends IConstructor { + //TODO: should only be for output cells + override def construct(comp: PlayerSync, man: IRoleManager): Unit = { + //Step 1: Get construction values + val value: Boolean = +this getValue() - def construct(comp: PlayerSync, man: IRoleManager): Unit = { - //TODO: modify the whole tree - //TODO: Cell construct does not make sense directly + //Step 2: Create the object in the other models + val dAll = new sync.bddg.Assignment(value, null, null) + val tAll = new sync.bdd.Assignment(value, null, null) + + //Step 3: Create Containers + createContainerElement(true, true, comp, man) + createContainerElement(false, true, dAll, SynchronizationCompartment.createRoleManager()) + createContainerElement(false, true, tAll, SynchronizationCompartment.createRoleManager()) + + //Step 4: Finish Creation + makeCompleteConstructionProcess(containers) + + /*// just set up the player + createContainerElement(start=true, con=true, comp, man) + makeCompleteConstructionProcess(containers)*/ + } + }*/ + + class Suppressor extends IConstructor { + + override def construct(comp: PlayerSync, man: IRoleManager): Unit = { + // just set up the player + createContainerElement(start=true, con=true, comp, man) + makeCompleteConstructionProcess(containers) } }