From 01b2abd25ba0378b14afce3b2a53775235988fc8 Mon Sep 17 00:00:00 2001 From: Chrissi <christopher@hbsc-werner.de> Date: Mon, 5 Aug 2019 22:39:58 +0200 Subject: [PATCH] initial commit --- .gitignore | 26 + .scalastyle | 1 + build.sbt | 15 + lib/modeljoin.jar | Bin 0 -> 228674 bytes project/build.properties | 1 + project/plugins.sbt | 1 + .../util/query/ModelJoinCreator.java | 93 ++ src/main/scala/aml/Attribute.scala | 21 + src/main/scala/aml/CAEXObject.scala | 29 + src/main/scala/aml/HelperCAEXObject.scala | 19 + src/main/scala/aml/InstanceHierarchy.scala | 13 + ...archyInternalElementsInternalElement.scala | 46 + src/main/scala/aml/InternalElement.scala | 13 + ...ElementBaseSystemUnitSystemUnitClass.scala | 46 + src/main/scala/aml/SystemUnitClass.scala | 13 + .../SystemUnitClassAttributesAttribute.scala | 46 + ...ClassInternalElementsInternalElement.scala | 46 + src/main/scala/elib/AudioVisualItem.scala | 39 + src/main/scala/elib/Book.scala | 39 + src/main/scala/elib/BookAuthorWriter.scala | 46 + src/main/scala/elib/BookCategory.scala | 8 + src/main/scala/elib/BookOnTape.scala | 15 + .../scala/elib/BookOnTapeAuthorWriter.scala | 46 + .../scala/elib/BookOnTapeReaderPerson.scala | 46 + src/main/scala/elib/Borrower.scala | 13 + src/main/scala/elib/CirculatingItem.scala | 15 + src/main/scala/elib/Employee.scala | 13 + .../scala/elib/EmployeeManagerEmployee.scala | 46 + src/main/scala/elib/Item.scala | 23 + src/main/scala/elib/Library.scala | 21 + src/main/scala/elib/LibraryBooksBook.scala | 46 + .../scala/elib/LibraryBorrowersBorrower.scala | 46 + .../scala/elib/LibraryBranchesLibrary.scala | 46 + .../scala/elib/LibraryEmployeesEmployee.scala | 46 + .../elib/LibraryParentBranchLibrary.scala | 46 + src/main/scala/elib/LibraryStockItem.scala | 46 + .../scala/elib/LibraryWritersWriter.scala | 46 + src/main/scala/elib/Periodical.scala | 31 + src/main/scala/elib/Person.scala | 29 + src/main/scala/elib/VideoCassette.scala | 15 + .../scala/elib/VideoCassetteCastPerson.scala | 46 + src/main/scala/elib/Writer.scala | 21 + src/main/scala/imdbdatabase/Actor.scala | 13 + src/main/scala/imdbdatabase/Figure.scala | 21 + .../imdbdatabase/FigurePlayedByActor.scala | 46 + src/main/scala/imdbdatabase/Film.scala | 29 + .../imdbdatabase/FilmFiguresFigure.scala | 46 + src/main/scala/imdbdatabase/IMDB.scala | 13 + .../scala/imdbdatabase/IMDBActorsActor.scala | 46 + .../scala/imdbdatabase/IMDBFilmsFilm.scala | 46 + .../scala/imdbdatabase/IMDBUsersUser.scala | 46 + .../scala/imdbdatabase/IMDBVotesVote.scala | 46 + src/main/scala/imdbdatabase/Person.scala | 29 + src/main/scala/imdbdatabase/User.scala | 29 + src/main/scala/imdbdatabase/Vote.scala | 21 + .../scala/imdbdatabase/VoteFilmFilm.scala | 46 + .../scala/imdbdatabase/VoteUserUser.scala | 46 + src/main/scala/joins/JoinMovie.scala | 83 ++ src/main/scala/joins/JoinMovieObject.scala | 47 + src/main/scala/lib/Employee.scala | 21 + .../scala/lib/EmployeeManagerEmployee.scala | 46 + src/main/scala/lib/HelperPerson.scala | 19 + src/main/scala/lib/Library.scala | 21 + .../scala/lib/LibraryEmployeesEmployee.scala | 46 + src/main/scala/lib/Person.scala | 21 + .../org/rosi_project/example/ExampleAml.scala | 430 ++++++ .../rosi_project/example/ExampleRSUM.scala | 63 + .../example/ModelJoinExample.scala | 128 ++ .../core/ModelElementLists.scala | 159 ++ .../model_management/core/PlayerSync.scala | 30 + .../core/RsumCompartment.scala | 273 ++++ .../core/SynchronizationCompartment.scala | 462 ++++++ .../sum/IExtensionCompartment.scala | 67 + .../sum/IViewCompartment.scala | 237 +++ .../model_management/sum/IViewTypeInfo.scala | 26 + .../sum/compartments/IAggregation.scala | 11 + .../sum/compartments/IAssociation.scala | 11 + .../sum/compartments/IComposition.scala | 11 + .../sum/compartments/IDirectAggregation.scala | 10 + .../sum/compartments/IDirectAssoziation.scala | 10 + .../sum/compartments/IDirectComposition.scala | 32 + .../compartments/IRelationCompartment.scala | 49 + .../sum/join/IJoinCompartment.scala | 123 ++ .../model_management/sum/join/IJoinInfo.scala | 36 + .../sum/join/RsumJoinType.scala | 5 + .../model_management/sum/query/AQuery.scala | 102 ++ .../sum/query/CheckingOption.scala | 5 + .../sum/query/IQueryViewCompartment.scala | 138 ++ .../sum/query/ModelJoinContainer.scala | 5 + .../model_management/sum/query/Query.scala | 624 ++++++++ .../sum/query/QueryHelper.scala | 5 + .../sum/roles/IExtensionRole.scala | 6 + .../sum/roles/IRelationRole.scala | 9 + .../sum/roles/IRsumRole.scala | 6 + .../sum/roles/IViewRole.scala | 5 + .../sync/IConstructionCompartment.scala | 161 ++ .../sync/IDestructionCompartment.scala | 18 + .../sync/IExtenstionCompartment.scala | 20 + .../sync/IIntegrationCompartment.scala | 198 +++ .../sync/ISyncCompartment.scala | 101 ++ .../sync/ISynchronizationCompartment.scala | 22 + .../sync/compartments/GeneralDestructor.scala | 73 + .../ModelElementsListGCExtension.scala | 58 + .../SuppressingConstructionCompartment.scala | 30 + .../sync/helper/ConstructionContainer.scala | 29 + .../sync/helper/IntegrationContainer.scala | 29 + .../sync/roles/IConstructor.scala | 29 + .../sync/roles/IDestructor.scala | 12 + .../sync/roles/IExtension.scala | 22 + .../sync/roles/IIntegrator.scala | 30 + .../sync/roles/IRoleManager.scala | 103 ++ .../sync/roles/ISyncRole.scala | 14 + src/main/scala/query/AMLLanguageQuery.scala | 446 ++++++ .../scala/query/EclipseLibraryQuery.scala | 1274 ++++++++++++++++ src/main/scala/query/IMDBdatabaseQuery.scala | 1028 +++++++++++++ src/main/scala/query/LibraryQuery.scala | 253 ++++ src/main/scala/view/AMLLanguageView.scala | 463 ++++++ src/main/scala/view/EclipseLibraryView.scala | 1312 +++++++++++++++++ src/main/scala/view/IMDBdatabaseView.scala | 1055 +++++++++++++ src/main/scala/view/LibrarySimple0.scala | 209 +++ src/main/scala/view/LibraryView.scala | 269 ++++ src/main/scala/view/Manager0.scala | 162 ++ src/main/scala/view/Simple0.scala | 314 ++++ support/scalastyle_config.xml | 188 +++ 124 files changed, 13090 insertions(+) create mode 100644 .gitignore create mode 100644 .scalastyle create mode 100644 build.sbt create mode 100644 lib/modeljoin.jar create mode 100644 project/build.properties create mode 100644 project/plugins.sbt create mode 100644 src/main/java/org/rosi_project/model_management/util/query/ModelJoinCreator.java create mode 100644 src/main/scala/aml/Attribute.scala create mode 100644 src/main/scala/aml/CAEXObject.scala create mode 100644 src/main/scala/aml/HelperCAEXObject.scala create mode 100644 src/main/scala/aml/InstanceHierarchy.scala create mode 100644 src/main/scala/aml/InstanceHierarchyInternalElementsInternalElement.scala create mode 100644 src/main/scala/aml/InternalElement.scala create mode 100644 src/main/scala/aml/InternalElementBaseSystemUnitSystemUnitClass.scala create mode 100644 src/main/scala/aml/SystemUnitClass.scala create mode 100644 src/main/scala/aml/SystemUnitClassAttributesAttribute.scala create mode 100644 src/main/scala/aml/SystemUnitClassInternalElementsInternalElement.scala create mode 100644 src/main/scala/elib/AudioVisualItem.scala create mode 100644 src/main/scala/elib/Book.scala create mode 100644 src/main/scala/elib/BookAuthorWriter.scala create mode 100644 src/main/scala/elib/BookCategory.scala create mode 100644 src/main/scala/elib/BookOnTape.scala create mode 100644 src/main/scala/elib/BookOnTapeAuthorWriter.scala create mode 100644 src/main/scala/elib/BookOnTapeReaderPerson.scala create mode 100644 src/main/scala/elib/Borrower.scala create mode 100644 src/main/scala/elib/CirculatingItem.scala create mode 100644 src/main/scala/elib/Employee.scala create mode 100644 src/main/scala/elib/EmployeeManagerEmployee.scala create mode 100644 src/main/scala/elib/Item.scala create mode 100644 src/main/scala/elib/Library.scala create mode 100644 src/main/scala/elib/LibraryBooksBook.scala create mode 100644 src/main/scala/elib/LibraryBorrowersBorrower.scala create mode 100644 src/main/scala/elib/LibraryBranchesLibrary.scala create mode 100644 src/main/scala/elib/LibraryEmployeesEmployee.scala create mode 100644 src/main/scala/elib/LibraryParentBranchLibrary.scala create mode 100644 src/main/scala/elib/LibraryStockItem.scala create mode 100644 src/main/scala/elib/LibraryWritersWriter.scala create mode 100644 src/main/scala/elib/Periodical.scala create mode 100644 src/main/scala/elib/Person.scala create mode 100644 src/main/scala/elib/VideoCassette.scala create mode 100644 src/main/scala/elib/VideoCassetteCastPerson.scala create mode 100644 src/main/scala/elib/Writer.scala create mode 100644 src/main/scala/imdbdatabase/Actor.scala create mode 100644 src/main/scala/imdbdatabase/Figure.scala create mode 100644 src/main/scala/imdbdatabase/FigurePlayedByActor.scala create mode 100644 src/main/scala/imdbdatabase/Film.scala create mode 100644 src/main/scala/imdbdatabase/FilmFiguresFigure.scala create mode 100644 src/main/scala/imdbdatabase/IMDB.scala create mode 100644 src/main/scala/imdbdatabase/IMDBActorsActor.scala create mode 100644 src/main/scala/imdbdatabase/IMDBFilmsFilm.scala create mode 100644 src/main/scala/imdbdatabase/IMDBUsersUser.scala create mode 100644 src/main/scala/imdbdatabase/IMDBVotesVote.scala create mode 100644 src/main/scala/imdbdatabase/Person.scala create mode 100644 src/main/scala/imdbdatabase/User.scala create mode 100644 src/main/scala/imdbdatabase/Vote.scala create mode 100644 src/main/scala/imdbdatabase/VoteFilmFilm.scala create mode 100644 src/main/scala/imdbdatabase/VoteUserUser.scala create mode 100644 src/main/scala/joins/JoinMovie.scala create mode 100644 src/main/scala/joins/JoinMovieObject.scala create mode 100644 src/main/scala/lib/Employee.scala create mode 100644 src/main/scala/lib/EmployeeManagerEmployee.scala create mode 100644 src/main/scala/lib/HelperPerson.scala create mode 100644 src/main/scala/lib/Library.scala create mode 100644 src/main/scala/lib/LibraryEmployeesEmployee.scala create mode 100644 src/main/scala/lib/Person.scala create mode 100644 src/main/scala/org/rosi_project/example/ExampleAml.scala create mode 100644 src/main/scala/org/rosi_project/example/ExampleRSUM.scala create mode 100644 src/main/scala/org/rosi_project/example/ModelJoinExample.scala create mode 100644 src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala create mode 100644 src/main/scala/org/rosi_project/model_management/core/PlayerSync.scala create mode 100644 src/main/scala/org/rosi_project/model_management/core/RsumCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/IExtensionCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/IViewCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/IViewTypeInfo.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IAggregation.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IAssociation.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IComposition.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAggregation.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAssoziation.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectComposition.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/compartments/IRelationCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/join/IJoinCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/join/IJoinInfo.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/join/RsumJoinType.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/AQuery.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/CheckingOption.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/IQueryViewCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/ModelJoinContainer.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/Query.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/query/QueryHelper.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/roles/IExtensionRole.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/roles/IRelationRole.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/roles/IRsumRole.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sum/roles/IViewRole.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/IDestructionCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/IExtenstionCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/ISynchronizationCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/compartments/ModelElementsListGCExtension.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/helper/ConstructionContainer.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/helper/IntegrationContainer.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/IDestructor.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/IExtension.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala create mode 100644 src/main/scala/org/rosi_project/model_management/sync/roles/ISyncRole.scala create mode 100644 src/main/scala/query/AMLLanguageQuery.scala create mode 100644 src/main/scala/query/EclipseLibraryQuery.scala create mode 100644 src/main/scala/query/IMDBdatabaseQuery.scala create mode 100644 src/main/scala/query/LibraryQuery.scala create mode 100644 src/main/scala/view/AMLLanguageView.scala create mode 100644 src/main/scala/view/EclipseLibraryView.scala create mode 100644 src/main/scala/view/IMDBdatabaseView.scala create mode 100644 src/main/scala/view/LibrarySimple0.scala create mode 100644 src/main/scala/view/LibraryView.scala create mode 100644 src/main/scala/view/Manager0.scala create mode 100644 src/main/scala/view/Simple0.scala create mode 100644 support/scalastyle_config.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..815ba1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ + + +*.class +*.log + +# sbt +dist/* +target/ +lib_managed/ +src_managed/ +project/boot/ +project/plugins/project/ + +# Scala-IDE +.scala_dependencies + +# Eclipse +.project +.classpath +.cache +.cache-main +.settings/ + +# IntelliJ +.idea/ +/bin/ diff --git a/.scalastyle b/.scalastyle new file mode 100644 index 0000000..bed4869 --- /dev/null +++ b/.scalastyle @@ -0,0 +1 @@ +<scalastyle-project-configuration file="/ModelSyncProvider/support/scalastyle_config.xml" enabled="true"></scalastyle-project-configuration> diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..7ff0846 --- /dev/null +++ b/build.sbt @@ -0,0 +1,15 @@ +import sbt.Keys.organization + +val scrollVersion = "1.8" + +lazy val modelmanagementprovider = (project in file(".")). + settings( + name := "ModelManagementProvider", + organization := "de.tu-dresden.inf.st", + version := "0.1", + scalaVersion := "2.12.8", + sbtVersion := "1.2.8", + libraryDependencies ++= Seq( + "com.github.max-leuthaeuser" %% "scroll" % scrollVersion) + ) + diff --git a/lib/modeljoin.jar b/lib/modeljoin.jar new file mode 100644 index 0000000000000000000000000000000000000000..7dd9eed4acaada106ddb92d3b771163185721b73 GIT binary patch literal 228674 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 E01<Gd9RL6T literal 0 HcmV?d00001 diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..c0bab04 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..a4e6fcc --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.4") diff --git a/src/main/java/org/rosi_project/model_management/util/query/ModelJoinCreator.java b/src/main/java/org/rosi_project/model_management/util/query/ModelJoinCreator.java new file mode 100644 index 0000000..16881a0 --- /dev/null +++ b/src/main/java/org/rosi_project/model_management/util/query/ModelJoinCreator.java @@ -0,0 +1,93 @@ +package org.rosi_project.model_management.util.query; + +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.attributes; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.naturalJoin; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.thetaJoin; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.outerJoin; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.outgoing; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.incoming; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.subtype; +import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.supertype; + +import java.io.File; + +import org.rosi_project.model_sync.model_join.representation.core.AttributePath; +import org.rosi_project.model_sync.model_join.representation.core.ClassResource; +import org.rosi_project.model_sync.model_join.representation.grammar.CompoundKeepBuilder; +import org.rosi_project.model_sync.model_join.representation.grammar.KeepExpression; +import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression; +import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.AbstractJoinBuilder; +import org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder; +import org.rosi_project.model_sync.model_join.representation.writer.FileBasedModelJoinWriter; + +public class ModelJoinCreator { + + private AbstractJoinBuilder ajb = null; + + public AbstractJoinBuilder createNaturalJoin(String start) { + ClassResource classRessource = ClassResource.fromQualifiedName(start); + ajb = naturalJoin().join(classRessource).with(classRessource).as(classRessource); + return ajb; + } + + public AbstractJoinBuilder createThetaJoin(String start, String condition) { + ClassResource classRessource = ClassResource.fromQualifiedName(start); + ajb = thetaJoin().where(condition).join(classRessource).with(classRessource).as(classRessource); + return ajb; + } + + public AbstractJoinBuilder createOuterJoin(String start, boolean left) { + ClassResource classRessource = ClassResource.fromQualifiedName(start); + if (left) { + ajb = outerJoin().leftOuter().join(classRessource).with(classRessource).as(classRessource); + } else { + ajb = outerJoin().rightOuter().join(classRessource).with(classRessource).as(classRessource); + } + return ajb; + } + + public void createAttribute(Object o, String ressourceName, String attrName) { + ClassResource classRessource = ClassResource.fromQualifiedName(ressourceName); + AttributePath attrPath = AttributePath.from(classRessource, attrName); + KeepExpression ke = attributes(attrPath); + if (o instanceof AbstractJoinBuilder) { + ((AbstractJoinBuilder) o).keep(ke); + } + if (o instanceof CompoundKeepBuilder) { + ((CompoundKeepBuilder) o).keep(ke); + } + } + + public CompoundKeepBuilder createOutgoingReference(String ressourceName, String attrName) { + ClassResource classRessource = ClassResource.fromQualifiedName(ressourceName); + AttributePath attrPath = AttributePath.from(classRessource, attrName); + return outgoing(attrPath).as(classRessource); + } + + public CompoundKeepBuilder createIncomingReference(String ressourceName, String attrName) { + ClassResource classRessource = ClassResource.fromQualifiedName(ressourceName); + AttributePath attrPath = AttributePath.from(classRessource, attrName); + return incoming(attrPath).as(classRessource); + } + + public CompoundKeepBuilder createSubType(String ressourceName) { + ClassResource classRessource = ClassResource.fromQualifiedName(ressourceName); + return subtype(classRessource).as(classRessource); + } + + public CompoundKeepBuilder createSuperType(String ressourceName) { + ClassResource classRessource = ClassResource.fromQualifiedName(ressourceName); + return supertype(classRessource).as(classRessource); + } + + public void createFile(String fileName) { + if (ajb != null) { + ModelJoinExpression modelJoin = ModelJoinBuilder.createNewModelJoin().add(ajb.done()).build(); + + File file = new File(fileName); + + FileBasedModelJoinWriter writer = new FileBasedModelJoinWriter(file); + writer.write(modelJoin); + } + } +} diff --git a/src/main/scala/aml/Attribute.scala b/src/main/scala/aml/Attribute.scala new file mode 100644 index 0000000..dc63042 --- /dev/null +++ b/src/main/scala/aml/Attribute.scala @@ -0,0 +1,21 @@ +package aml + +class Attribute(protected var value: String, c_Name: String, c_Id: String) extends CAEXObject(c_Name, c_Id) { + + def getValue(): String = { + value + } + + def setValue(v: String): Unit = { + value = v + } + + override def toString(): String = { + "Attribute:" + " value=" + value + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/CAEXObject.scala b/src/main/scala/aml/CAEXObject.scala new file mode 100644 index 0000000..7f02fc6 --- /dev/null +++ b/src/main/scala/aml/CAEXObject.scala @@ -0,0 +1,29 @@ +package aml + +abstract class CAEXObject(protected var name: String, protected var id: String) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + def getId(): String = { + id + } + + def setId(i: String): Unit = { + id = i + } + + override def toString(): String = { + "CAEXObject:" + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/HelperCAEXObject.scala b/src/main/scala/aml/HelperCAEXObject.scala new file mode 100644 index 0000000..8243a4a --- /dev/null +++ b/src/main/scala/aml/HelperCAEXObject.scala @@ -0,0 +1,19 @@ +package aml + +import org.rosi_project.model_management.sum.query.QueryHelper + +class HelperCAEXObject(c_Name: String, c_Id: String) extends CAEXObject(c_Name, c_Id) with QueryHelper { + + override def equals(that: Any): Boolean = { + that.isInstanceOf[CAEXObject] + } + + override def toString(): String = { + "HelperCAEXObject:" + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/InstanceHierarchy.scala b/src/main/scala/aml/InstanceHierarchy.scala new file mode 100644 index 0000000..defa7a9 --- /dev/null +++ b/src/main/scala/aml/InstanceHierarchy.scala @@ -0,0 +1,13 @@ +package aml + +class InstanceHierarchy(c_Name: String, c_Id: String) extends CAEXObject(c_Name, c_Id) { + + override def toString(): String = { + "InstanceHierarchy:" + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/InstanceHierarchyInternalElementsInternalElement.scala b/src/main/scala/aml/InstanceHierarchyInternalElementsInternalElement.scala new file mode 100644 index 0000000..30e6d67 --- /dev/null +++ b/src/main/scala/aml/InstanceHierarchyInternalElementsInternalElement.scala @@ -0,0 +1,46 @@ +package aml + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class InstanceHierarchyInternalElementsInternalElement(private val sInstance: InstanceHierarchy, private val tInstance: InternalElement) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[InstanceHierarchyInternalElementsInternalElement " + source + ", " + target + "]" + } + + def getSourceIns(): InstanceHierarchy = { + return sInstance + } + + def getTargetIns(): InternalElement = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/InternalElement.scala b/src/main/scala/aml/InternalElement.scala new file mode 100644 index 0000000..a541add --- /dev/null +++ b/src/main/scala/aml/InternalElement.scala @@ -0,0 +1,13 @@ +package aml + +class InternalElement(s_Name: String, s_Id: String) extends SystemUnitClass(s_Name, s_Id) { + + override def toString(): String = { + "InternalElement:" + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/InternalElementBaseSystemUnitSystemUnitClass.scala b/src/main/scala/aml/InternalElementBaseSystemUnitSystemUnitClass.scala new file mode 100644 index 0000000..c164981 --- /dev/null +++ b/src/main/scala/aml/InternalElementBaseSystemUnitSystemUnitClass.scala @@ -0,0 +1,46 @@ +package aml + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class InternalElementBaseSystemUnitSystemUnitClass(private val sInstance: InternalElement, private val tInstance: SystemUnitClass) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[InternalElementBaseSystemUnitSystemUnitClass " + source + ", " + target + "]" + } + + def getSourceIns(): InternalElement = { + return sInstance + } + + def getTargetIns(): SystemUnitClass = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/SystemUnitClass.scala b/src/main/scala/aml/SystemUnitClass.scala new file mode 100644 index 0000000..fb8d0c9 --- /dev/null +++ b/src/main/scala/aml/SystemUnitClass.scala @@ -0,0 +1,13 @@ +package aml + +class SystemUnitClass(c_Name: String, c_Id: String) extends CAEXObject(c_Name, c_Id) { + + override def toString(): String = { + "SystemUnitClass:" + " name=" + name + " id=" + id + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/SystemUnitClassAttributesAttribute.scala b/src/main/scala/aml/SystemUnitClassAttributesAttribute.scala new file mode 100644 index 0000000..69478d9 --- /dev/null +++ b/src/main/scala/aml/SystemUnitClassAttributesAttribute.scala @@ -0,0 +1,46 @@ +package aml + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class SystemUnitClassAttributesAttribute(private val sInstance: SystemUnitClass, private val tInstance: Attribute) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[SystemUnitClassAttributesAttribute " + source + ", " + target + "]" + } + + def getSourceIns(): SystemUnitClass = { + return sInstance + } + + def getTargetIns(): Attribute = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/aml/SystemUnitClassInternalElementsInternalElement.scala b/src/main/scala/aml/SystemUnitClassInternalElementsInternalElement.scala new file mode 100644 index 0000000..a75d7c9 --- /dev/null +++ b/src/main/scala/aml/SystemUnitClassInternalElementsInternalElement.scala @@ -0,0 +1,46 @@ +package aml + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class SystemUnitClassInternalElementsInternalElement(private val sInstance: SystemUnitClass, private val tInstance: InternalElement) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[SystemUnitClassInternalElementsInternalElement " + source + ", " + target + "]" + } + + def getSourceIns(): SystemUnitClass = { + return sInstance + } + + def getTargetIns(): InternalElement = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/AudioVisualItem.scala b/src/main/scala/elib/AudioVisualItem.scala new file mode 100644 index 0000000..24bba4c --- /dev/null +++ b/src/main/scala/elib/AudioVisualItem.scala @@ -0,0 +1,39 @@ +package elib + +import java.util.Date + +class AudioVisualItem(protected var damaged: Boolean, protected var minutesLength: Int, protected var title: String, c_PublicationDate: Date) extends CirculatingItem(c_PublicationDate) { + + def getDamaged(): Boolean = { + damaged + } + + def setDamaged(d: Boolean): Unit = { + damaged = d + } + + def getMinutesLength(): Int = { + minutesLength + } + + def setMinutesLength(m: Int): Unit = { + minutesLength = m + } + + def getTitle(): String = { + title + } + + def setTitle(t: String): Unit = { + title = t + } + + override def toString(): String = { + "AudioVisualItem:" + " damaged=" + damaged + " minutesLength=" + minutesLength + " title=" + title + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Book.scala b/src/main/scala/elib/Book.scala new file mode 100644 index 0000000..a067844 --- /dev/null +++ b/src/main/scala/elib/Book.scala @@ -0,0 +1,39 @@ +package elib + +import java.util.Date + +class Book(protected var category: BookCategory.Value, protected var pages: Int, protected var title: String, c_PublicationDate: Date) extends CirculatingItem(c_PublicationDate) { + + def getCategory(): BookCategory.Value = { + category + } + + def setCategory(c: BookCategory.Value): Unit = { + category = c + } + + def getPages(): Int = { + pages + } + + def setPages(p: Int): Unit = { + pages = p + } + + def getTitle(): String = { + title + } + + def setTitle(t: String): Unit = { + title = t + } + + override def toString(): String = { + "Book:" + " category=" + category + " pages=" + pages + " title=" + title + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/BookAuthorWriter.scala b/src/main/scala/elib/BookAuthorWriter.scala new file mode 100644 index 0000000..9e73dff --- /dev/null +++ b/src/main/scala/elib/BookAuthorWriter.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IAssociation + +class BookAuthorWriter(private val sInstance: Book, private val tInstance: Writer) extends IAssociation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[BookAuthorWriter " + source + ", " + target + "]" + } + + def getSourceIns(): Book = { + return sInstance + } + + def getTargetIns(): Writer = { + return tInstance + } + + class Source extends IAssociationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IAssociationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/BookCategory.scala b/src/main/scala/elib/BookCategory.scala new file mode 100644 index 0000000..2992844 --- /dev/null +++ b/src/main/scala/elib/BookCategory.scala @@ -0,0 +1,8 @@ +package elib + +object BookCategory extends Enumeration { + + val Mystery, ScienceFiction, Biography = Value +} + + \ No newline at end of file diff --git a/src/main/scala/elib/BookOnTape.scala b/src/main/scala/elib/BookOnTape.scala new file mode 100644 index 0000000..bcd751a --- /dev/null +++ b/src/main/scala/elib/BookOnTape.scala @@ -0,0 +1,15 @@ +package elib + +import java.util.Date + +class BookOnTape(a_Damaged: Boolean, a_MinutesLength: Int, a_Title: String, a_PublicationDate: Date) extends AudioVisualItem(a_Damaged, a_MinutesLength, a_Title, a_PublicationDate) { + + override def toString(): String = { + "BookOnTape:" + " damaged=" + damaged + " minutesLength=" + minutesLength + " title=" + title + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/BookOnTapeAuthorWriter.scala b/src/main/scala/elib/BookOnTapeAuthorWriter.scala new file mode 100644 index 0000000..87c9559 --- /dev/null +++ b/src/main/scala/elib/BookOnTapeAuthorWriter.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class BookOnTapeAuthorWriter(private val sInstance: BookOnTape, private val tInstance: Writer) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[BookOnTapeAuthorWriter " + source + ", " + target + "]" + } + + def getSourceIns(): BookOnTape = { + return sInstance + } + + def getTargetIns(): Writer = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/BookOnTapeReaderPerson.scala b/src/main/scala/elib/BookOnTapeReaderPerson.scala new file mode 100644 index 0000000..68b29a2 --- /dev/null +++ b/src/main/scala/elib/BookOnTapeReaderPerson.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class BookOnTapeReaderPerson(private val sInstance: BookOnTape, private val tInstance: Person) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[BookOnTapeReaderPerson " + source + ", " + target + "]" + } + + def getSourceIns(): BookOnTape = { + return sInstance + } + + def getTargetIns(): Person = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Borrower.scala b/src/main/scala/elib/Borrower.scala new file mode 100644 index 0000000..b28d617 --- /dev/null +++ b/src/main/scala/elib/Borrower.scala @@ -0,0 +1,13 @@ +package elib + +class Borrower(p_LastName: String, p_FirstName: String) extends Person(p_LastName, p_FirstName) { + + override def toString(): String = { + "Borrower:" + " lastName=" + lastName + " firstName=" + firstName + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/CirculatingItem.scala b/src/main/scala/elib/CirculatingItem.scala new file mode 100644 index 0000000..7678b10 --- /dev/null +++ b/src/main/scala/elib/CirculatingItem.scala @@ -0,0 +1,15 @@ +package elib + +import java.util.Date + +class CirculatingItem(i_PublicationDate: Date) extends Item(i_PublicationDate) { + + override def toString(): String = { + "CirculatingItem:" + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Employee.scala b/src/main/scala/elib/Employee.scala new file mode 100644 index 0000000..204e8cf --- /dev/null +++ b/src/main/scala/elib/Employee.scala @@ -0,0 +1,13 @@ +package elib + +class Employee(p_LastName: String, p_FirstName: String) extends Person(p_LastName, p_FirstName) { + + override def toString(): String = { + "Employee:" + " lastName=" + lastName + " firstName=" + firstName + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/EmployeeManagerEmployee.scala b/src/main/scala/elib/EmployeeManagerEmployee.scala new file mode 100644 index 0000000..9294358 --- /dev/null +++ b/src/main/scala/elib/EmployeeManagerEmployee.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class EmployeeManagerEmployee(private val sInstance: Employee, private val tInstance: Employee) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[EmployeeManagerEmployee " + source + ", " + target + "]" + } + + def getSourceIns(): Employee = { + return sInstance + } + + def getTargetIns(): Employee = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Item.scala b/src/main/scala/elib/Item.scala new file mode 100644 index 0000000..cafa10b --- /dev/null +++ b/src/main/scala/elib/Item.scala @@ -0,0 +1,23 @@ +package elib + +import java.util.Date + +class Item(protected var publicationDate: Date) { + + def getPublicationDate(): Date = { + publicationDate + } + + def setPublicationDate(p: Date): Unit = { + publicationDate = p + } + + override def toString(): String = { + "Item:" + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Library.scala b/src/main/scala/elib/Library.scala new file mode 100644 index 0000000..e125115 --- /dev/null +++ b/src/main/scala/elib/Library.scala @@ -0,0 +1,21 @@ +package elib + +class Library(protected var name: String) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Library:" + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryBooksBook.scala b/src/main/scala/elib/LibraryBooksBook.scala new file mode 100644 index 0000000..4b3cdd7 --- /dev/null +++ b/src/main/scala/elib/LibraryBooksBook.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class LibraryBooksBook(private val sInstance: Library, private val tInstance: Book) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryBooksBook " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Book = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryBorrowersBorrower.scala b/src/main/scala/elib/LibraryBorrowersBorrower.scala new file mode 100644 index 0000000..fe90ec4 --- /dev/null +++ b/src/main/scala/elib/LibraryBorrowersBorrower.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryBorrowersBorrower(private val sInstance: Library, private val tInstance: Borrower) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryBorrowersBorrower " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Borrower = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryBranchesLibrary.scala b/src/main/scala/elib/LibraryBranchesLibrary.scala new file mode 100644 index 0000000..2a9ae97 --- /dev/null +++ b/src/main/scala/elib/LibraryBranchesLibrary.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryBranchesLibrary(private val sInstance: Library, private val tInstance: Library) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryBranchesLibrary " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Library = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryEmployeesEmployee.scala b/src/main/scala/elib/LibraryEmployeesEmployee.scala new file mode 100644 index 0000000..01e6d9f --- /dev/null +++ b/src/main/scala/elib/LibraryEmployeesEmployee.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryEmployeesEmployee(private val sInstance: Library, private val tInstance: Employee) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryEmployeesEmployee " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Employee = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryParentBranchLibrary.scala b/src/main/scala/elib/LibraryParentBranchLibrary.scala new file mode 100644 index 0000000..1ad536c --- /dev/null +++ b/src/main/scala/elib/LibraryParentBranchLibrary.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class LibraryParentBranchLibrary(private val sInstance: Library, private val tInstance: Library) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryParentBranchLibrary " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Library = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryStockItem.scala b/src/main/scala/elib/LibraryStockItem.scala new file mode 100644 index 0000000..148fdc0 --- /dev/null +++ b/src/main/scala/elib/LibraryStockItem.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryStockItem(private val sInstance: Library, private val tInstance: Item) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryStockItem " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Item = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/LibraryWritersWriter.scala b/src/main/scala/elib/LibraryWritersWriter.scala new file mode 100644 index 0000000..41f420e --- /dev/null +++ b/src/main/scala/elib/LibraryWritersWriter.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryWritersWriter(private val sInstance: Library, private val tInstance: Writer) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryWritersWriter " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Writer = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Periodical.scala b/src/main/scala/elib/Periodical.scala new file mode 100644 index 0000000..8f2cbbf --- /dev/null +++ b/src/main/scala/elib/Periodical.scala @@ -0,0 +1,31 @@ +package elib + +import java.util.Date + +class Periodical(protected var issuesPerYear: Int, protected var title: String, i_PublicationDate: Date) extends Item(i_PublicationDate) { + + def getIssuesPerYear(): Int = { + issuesPerYear + } + + def setIssuesPerYear(i: Int): Unit = { + issuesPerYear = i + } + + def getTitle(): String = { + title + } + + def setTitle(t: String): Unit = { + title = t + } + + override def toString(): String = { + "Periodical:" + " issuesPerYear=" + issuesPerYear + " title=" + title + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Person.scala b/src/main/scala/elib/Person.scala new file mode 100644 index 0000000..b2680a0 --- /dev/null +++ b/src/main/scala/elib/Person.scala @@ -0,0 +1,29 @@ +package elib + +class Person(protected var lastName: String, protected var firstName: String) { + + def getLastName(): String = { + lastName + } + + def setLastName(l: String): Unit = { + lastName = l + } + + def getFirstName(): String = { + firstName + } + + def setFirstName(f: String): Unit = { + firstName = f + } + + override def toString(): String = { + "Person:" + " lastName=" + lastName + " firstName=" + firstName + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/VideoCassette.scala b/src/main/scala/elib/VideoCassette.scala new file mode 100644 index 0000000..a43e3ab --- /dev/null +++ b/src/main/scala/elib/VideoCassette.scala @@ -0,0 +1,15 @@ +package elib + +import java.util.Date + +class VideoCassette(a_Damaged: Boolean, a_MinutesLength: Int, a_Title: String, a_PublicationDate: Date) extends AudioVisualItem(a_Damaged, a_MinutesLength, a_Title, a_PublicationDate) { + + override def toString(): String = { + "VideoCassette:" + " damaged=" + damaged + " minutesLength=" + minutesLength + " title=" + title + " publicationDate=" + publicationDate + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/VideoCassetteCastPerson.scala b/src/main/scala/elib/VideoCassetteCastPerson.scala new file mode 100644 index 0000000..5705c4e --- /dev/null +++ b/src/main/scala/elib/VideoCassetteCastPerson.scala @@ -0,0 +1,46 @@ +package elib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class VideoCassetteCastPerson(private val sInstance: VideoCassette, private val tInstance: Person) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[VideoCassetteCastPerson " + source + ", " + target + "]" + } + + def getSourceIns(): VideoCassette = { + return sInstance + } + + def getTargetIns(): Person = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/elib/Writer.scala b/src/main/scala/elib/Writer.scala new file mode 100644 index 0000000..c36a8bb --- /dev/null +++ b/src/main/scala/elib/Writer.scala @@ -0,0 +1,21 @@ +package elib + +class Writer(protected var name: String, p_LastName: String, p_FirstName: String) extends Person(p_LastName, p_FirstName) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Writer:" + " name=" + name + " lastName=" + lastName + " firstName=" + firstName + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/Actor.scala b/src/main/scala/imdbdatabase/Actor.scala new file mode 100644 index 0000000..e74c8f6 --- /dev/null +++ b/src/main/scala/imdbdatabase/Actor.scala @@ -0,0 +1,13 @@ +package imdbdatabase + +class Actor(p_Dob: Double, p_Name: String) extends Person(p_Dob, p_Name) { + + override def toString(): String = { + "Actor:" + " dob=" + dob + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/Figure.scala b/src/main/scala/imdbdatabase/Figure.scala new file mode 100644 index 0000000..26045a3 --- /dev/null +++ b/src/main/scala/imdbdatabase/Figure.scala @@ -0,0 +1,21 @@ +package imdbdatabase + +class Figure(protected var name: String) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Figure:" + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/FigurePlayedByActor.scala b/src/main/scala/imdbdatabase/FigurePlayedByActor.scala new file mode 100644 index 0000000..05e24d3 --- /dev/null +++ b/src/main/scala/imdbdatabase/FigurePlayedByActor.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IAssociation + +class FigurePlayedByActor(private val sInstance: Figure, private val tInstance: Actor) extends IAssociation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[FigurePlayedByActor " + source + ", " + target + "]" + } + + def getSourceIns(): Figure = { + return sInstance + } + + def getTargetIns(): Actor = { + return tInstance + } + + class Source extends IAssociationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IAssociationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/Film.scala b/src/main/scala/imdbdatabase/Film.scala new file mode 100644 index 0000000..6c46b54 --- /dev/null +++ b/src/main/scala/imdbdatabase/Film.scala @@ -0,0 +1,29 @@ +package imdbdatabase + +class Film(protected var year: Int, protected var title: String) { + + def getYear(): Int = { + year + } + + def setYear(y: Int): Unit = { + year = y + } + + def getTitle(): String = { + title + } + + def setTitle(t: String): Unit = { + title = t + } + + override def toString(): String = { + "Film:" + " year=" + year + " title=" + title + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/FilmFiguresFigure.scala b/src/main/scala/imdbdatabase/FilmFiguresFigure.scala new file mode 100644 index 0000000..c50f8ea --- /dev/null +++ b/src/main/scala/imdbdatabase/FilmFiguresFigure.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IComposition + +class FilmFiguresFigure(private val sInstance: Film, private val tInstance: Figure) extends IComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[FilmFiguresFigure " + source + ", " + target + "]" + } + + def getSourceIns(): Film = { + return sInstance + } + + def getTargetIns(): Figure = { + return tInstance + } + + class Source extends ICompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends ICompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/IMDB.scala b/src/main/scala/imdbdatabase/IMDB.scala new file mode 100644 index 0000000..0da0fd8 --- /dev/null +++ b/src/main/scala/imdbdatabase/IMDB.scala @@ -0,0 +1,13 @@ +package imdbdatabase + +class IMDB { + + override def toString(): String = { + "IMDB:" + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/IMDBActorsActor.scala b/src/main/scala/imdbdatabase/IMDBActorsActor.scala new file mode 100644 index 0000000..2dd4a61 --- /dev/null +++ b/src/main/scala/imdbdatabase/IMDBActorsActor.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IComposition + +class IMDBActorsActor(private val sInstance: IMDB, private val tInstance: Actor) extends IComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[IMDBActorsActor " + source + ", " + target + "]" + } + + def getSourceIns(): IMDB = { + return sInstance + } + + def getTargetIns(): Actor = { + return tInstance + } + + class Source extends ICompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends ICompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/IMDBFilmsFilm.scala b/src/main/scala/imdbdatabase/IMDBFilmsFilm.scala new file mode 100644 index 0000000..96162d0 --- /dev/null +++ b/src/main/scala/imdbdatabase/IMDBFilmsFilm.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IComposition + +class IMDBFilmsFilm(private val sInstance: IMDB, private val tInstance: Film) extends IComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[IMDBFilmsFilm " + source + ", " + target + "]" + } + + def getSourceIns(): IMDB = { + return sInstance + } + + def getTargetIns(): Film = { + return tInstance + } + + class Source extends ICompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends ICompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/IMDBUsersUser.scala b/src/main/scala/imdbdatabase/IMDBUsersUser.scala new file mode 100644 index 0000000..e901a63 --- /dev/null +++ b/src/main/scala/imdbdatabase/IMDBUsersUser.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IComposition + +class IMDBUsersUser(private val sInstance: IMDB, private val tInstance: User) extends IComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[IMDBUsersUser " + source + ", " + target + "]" + } + + def getSourceIns(): IMDB = { + return sInstance + } + + def getTargetIns(): User = { + return tInstance + } + + class Source extends ICompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends ICompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/IMDBVotesVote.scala b/src/main/scala/imdbdatabase/IMDBVotesVote.scala new file mode 100644 index 0000000..2154984 --- /dev/null +++ b/src/main/scala/imdbdatabase/IMDBVotesVote.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IComposition + +class IMDBVotesVote(private val sInstance: IMDB, private val tInstance: Vote) extends IComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[IMDBVotesVote " + source + ", " + target + "]" + } + + def getSourceIns(): IMDB = { + return sInstance + } + + def getTargetIns(): Vote = { + return tInstance + } + + class Source extends ICompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends ICompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/Person.scala b/src/main/scala/imdbdatabase/Person.scala new file mode 100644 index 0000000..39bc4a4 --- /dev/null +++ b/src/main/scala/imdbdatabase/Person.scala @@ -0,0 +1,29 @@ +package imdbdatabase + +class Person(protected var dob: Double, protected var name: String) { + + def getDob(): Double = { + dob + } + + def setDob(d: Double): Unit = { + dob = d + } + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Person:" + " dob=" + dob + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/User.scala b/src/main/scala/imdbdatabase/User.scala new file mode 100644 index 0000000..ff94ad9 --- /dev/null +++ b/src/main/scala/imdbdatabase/User.scala @@ -0,0 +1,29 @@ +package imdbdatabase + +class User(protected var email: String, protected var userName: String, p_Dob: Double, p_Name: String) extends Person(p_Dob, p_Name) { + + def getEmail(): String = { + email + } + + def setEmail(e: String): Unit = { + email = e + } + + def getUserName(): String = { + userName + } + + def setUserName(u: String): Unit = { + userName = u + } + + override def toString(): String = { + "User:" + " email=" + email + " userName=" + userName + " dob=" + dob + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/Vote.scala b/src/main/scala/imdbdatabase/Vote.scala new file mode 100644 index 0000000..6187ae8 --- /dev/null +++ b/src/main/scala/imdbdatabase/Vote.scala @@ -0,0 +1,21 @@ +package imdbdatabase + +class Vote(protected var score: Int) { + + def getScore(): Int = { + score + } + + def setScore(s: Int): Unit = { + score = s + } + + override def toString(): String = { + "Vote:" + " score=" + score + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/VoteFilmFilm.scala b/src/main/scala/imdbdatabase/VoteFilmFilm.scala new file mode 100644 index 0000000..4296739 --- /dev/null +++ b/src/main/scala/imdbdatabase/VoteFilmFilm.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IAssociation + +class VoteFilmFilm(private val sInstance: Vote, private val tInstance: Film) extends IAssociation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[VoteFilmFilm " + source + ", " + target + "]" + } + + def getSourceIns(): Vote = { + return sInstance + } + + def getTargetIns(): Film = { + return tInstance + } + + class Source extends IAssociationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IAssociationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/imdbdatabase/VoteUserUser.scala b/src/main/scala/imdbdatabase/VoteUserUser.scala new file mode 100644 index 0000000..dc9189f --- /dev/null +++ b/src/main/scala/imdbdatabase/VoteUserUser.scala @@ -0,0 +1,46 @@ +package imdbdatabase + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class VoteUserUser(private val sInstance: Vote, private val tInstance: User) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[VoteUserUser " + source + ", " + target + "]" + } + + def getSourceIns(): Vote = { + return sInstance + } + + def getTargetIns(): User = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/joins/JoinMovie.scala b/src/main/scala/joins/JoinMovie.scala new file mode 100644 index 0000000..5d4fde4 --- /dev/null +++ b/src/main/scala/joins/JoinMovie.scala @@ -0,0 +1,83 @@ +package joins + +import org.rosi_project.model_management.sum.join.IJoinCompartment +import imdbdatabase.Film +import elib.VideoCassette +import org.rosi_project.model_management.sum.join.IJoinInfo +import java.util.Date + +class JoinMovie(private val base: Film, private val other: VideoCassette) extends IJoinCompartment { + + initialize(base, other) + + def getJoinInfo(): IJoinInfo = { + JoinMovieObject + } + + def getTitle(): String = { + +baseRole getTitle () + } + + def setTitleView(title: String): Unit = { + +baseRole setTitle (title) + if (otherObj != null) { + +otherRole setTitle (title) + } + } + + def getYear(): Int = { + +baseRole getYear () + } + + def setYear(year: Int): Unit = { + +baseRole setYear (year) + } + + def getDamaged(): Boolean = { + if (otherObj != null) { + return +otherRole getDamaged () + } + return false + } + + def setDamagedView(damaged: Boolean): Unit = { + if (otherObj != null) { + +otherRole setDamaged (damaged) + } + } + + def getMinutesLength(): Int = { + if (otherObj != null) { + return +otherRole getMinutesLength () + } + return 0 + } + + def setMinutesLengthView(minuteslength: Int): Unit = { + if (otherObj != null) { + +otherRole setMinutesLength (minuteslength) + } + } + + def getPublicationDate(): Date = { + if (otherObj != null) { + return +otherRole getPublicationDate () + } + return null + } + + def setPublicationDateView(publicationdate: Date): Unit = { + if (otherObj != null) { + +otherRole setPublicationDate (publicationdate) + } + } + + override def toString(): String = { + "JOIN JoinMovie: " + baseObj + " " + otherObj + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/joins/JoinMovieObject.scala b/src/main/scala/joins/JoinMovieObject.scala new file mode 100644 index 0000000..38741d4 --- /dev/null +++ b/src/main/scala/joins/JoinMovieObject.scala @@ -0,0 +1,47 @@ +package joins + +import org.rosi_project.model_management.sum.join.IJoinCompartment +import org.rosi_project.model_management.sum.join.RsumJoinType +import imdbdatabase.Film +import elib.VideoCassette +import org.rosi_project.model_management.sum.join.IJoinInfo + +object JoinMovieObject extends IJoinInfo { + + def getJoinType(): RsumJoinType.Value = { + RsumJoinType.natural + } + + def isInstanceBaseModel(obj: Object): Boolean = { + obj.isInstanceOf[Film] + } + + def isInstanceOtherModel(obj: Object): Boolean = { + obj.isInstanceOf[VideoCassette] + } + + def getNewInstance(b: Object, o: Object): IJoinCompartment = { + val j = new JoinMovie(null, null) + objectInitialize(j, b, o) + j + } + + def isInstanceOf(obj: Object): Boolean = { + obj.isInstanceOf[JoinMovie] + } + + def matchTwoObjects(b: Object, o: Object): Boolean = { + val base = b.asInstanceOf[Film] + val other = o.asInstanceOf[VideoCassette] + base.getTitle() == other.getTitle() + } + + override def toString(): String = { + "JoinMovieObject" + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/Employee.scala b/src/main/scala/lib/Employee.scala new file mode 100644 index 0000000..3d85776 --- /dev/null +++ b/src/main/scala/lib/Employee.scala @@ -0,0 +1,21 @@ +package lib + +class Employee(protected var salary: Double, p_Name: String) extends Person(p_Name) { + + def getSalary(): Double = { + salary + } + + def setSalary(s: Double): Unit = { + salary = s + } + + override def toString(): String = { + "Employee:" + " salary=" + salary + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/EmployeeManagerEmployee.scala b/src/main/scala/lib/EmployeeManagerEmployee.scala new file mode 100644 index 0000000..d195cf9 --- /dev/null +++ b/src/main/scala/lib/EmployeeManagerEmployee.scala @@ -0,0 +1,46 @@ +package lib + +import org.rosi_project.model_management.sum.compartments.IDirectAssoziation + +class EmployeeManagerEmployee(private val sInstance: Employee, private val tInstance: Employee) extends IDirectAssoziation { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[EmployeeManagerEmployee " + source + ", " + target + "]" + } + + def getSourceIns(): Employee = { + return sInstance + } + + def getTargetIns(): Employee = { + return tInstance + } + + class Source extends IDirectAssoziationSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectAssoziationTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/HelperPerson.scala b/src/main/scala/lib/HelperPerson.scala new file mode 100644 index 0000000..bd3cd00 --- /dev/null +++ b/src/main/scala/lib/HelperPerson.scala @@ -0,0 +1,19 @@ +package lib + +import org.rosi_project.model_management.sum.query.QueryHelper + +class HelperPerson(p_Name: String) extends Person(p_Name) with QueryHelper { + + override def equals(that: Any): Boolean = { + that.isInstanceOf[Person] + } + + override def toString(): String = { + "HelperPerson:" + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/Library.scala b/src/main/scala/lib/Library.scala new file mode 100644 index 0000000..2b19d55 --- /dev/null +++ b/src/main/scala/lib/Library.scala @@ -0,0 +1,21 @@ +package lib + +class Library(protected var name: String) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Library:" + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/LibraryEmployeesEmployee.scala b/src/main/scala/lib/LibraryEmployeesEmployee.scala new file mode 100644 index 0000000..7c6dfd9 --- /dev/null +++ b/src/main/scala/lib/LibraryEmployeesEmployee.scala @@ -0,0 +1,46 @@ +package lib + +import org.rosi_project.model_management.sum.compartments.IDirectComposition + +class LibraryEmployeesEmployee(private val sInstance: Library, private val tInstance: Employee) extends IDirectComposition { + + override def internalInitialize(): Unit = { + this.source = new Source() + this.target = new Target() + sInstance play this.source + tInstance play this.target + } + + override def toString(): String = { + "[LibraryEmployeesEmployee " + source + ", " + target + "]" + } + + def getSourceIns(): Library = { + return sInstance + } + + def getTargetIns(): Employee = { + return tInstance + } + + class Source extends IDirectCompositionSource { + + override def toString(): String = { + "S: (" + sInstance + ")" + } + + } + + class Target extends IDirectCompositionTarget { + + override def toString(): String = { + "T: (" + tInstance + ")" + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/lib/Person.scala b/src/main/scala/lib/Person.scala new file mode 100644 index 0000000..4ea1190 --- /dev/null +++ b/src/main/scala/lib/Person.scala @@ -0,0 +1,21 @@ +package lib + +abstract class Person(protected var name: String) { + + def getName(): String = { + name + } + + def setName(n: String): Unit = { + name = n + } + + override def toString(): String = { + "Person:" + " name=" + name + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/example/ExampleAml.scala b/src/main/scala/org/rosi_project/example/ExampleAml.scala new file mode 100644 index 0000000..e56258a --- /dev/null +++ b/src/main/scala/org/rosi_project/example/ExampleAml.scala @@ -0,0 +1,430 @@ +package org.rosi_project.example + +import query.AMLLanguageQuery +import view.AMLLanguageView +import org.rosi_project.model_management.sum.query._ +import aml._ +import org.rosi_project.model_management.core.ModelElementLists + + +object ExampleAml extends App { + + val amlView = AMLLanguageView.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) + + //ModelElementLists.printAll() + + //val ieSensor2 = amlView.createInternalElement("Sensor2", "12") + //ieStack1.addInternalElements(ieSensor2) + + //runAllQueries() + //runAllViewQueries() + query_3() + + 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 AMLLanguageQuery + 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 AMLLanguageQuery + 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 AMLLanguageQuery + 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()) + println("+++++++++++ MJ ++++++++++++++++++++++") + q.getQuery().generateModelJoinFromQuery() + } + + def query_4(): Unit = { + //Query Objects + val q = new AMLLanguageQuery + 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 AMLLanguageQuery + 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 AMLLanguageQuery + 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 AMLLanguageQuery + 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 AMLLanguageQuery + 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/src/main/scala/org/rosi_project/example/ExampleRSUM.scala b/src/main/scala/org/rosi_project/example/ExampleRSUM.scala new file mode 100644 index 0000000..c536c51 --- /dev/null +++ b/src/main/scala/org/rosi_project/example/ExampleRSUM.scala @@ -0,0 +1,63 @@ +package org.rosi_project.example + +import view.LibraryView +import view.Manager0 +import view.LibrarySimple0 + +object ExampleRSUM extends App { + + println("%%%%%%%%%%%%%%%%%%%%%% Create a view with all data %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + var completeView: LibraryView = LibraryView.getNewView() + + println("%%%%%%%%%%%%%%%%%%%%%% Create elements in the view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + var libRole = completeView.createLibrary("City Library") + var empRole = completeView.createEmployee(45000, "Bill Smith") + var manRole = completeView.createEmployee(60000, "Bob Jones") + libRole.addEmployees(empRole) + empRole.setManager(manRole) + + println(libRole.getNameView()) + + completeView.printViewRoles() + + var list = completeView.getAllViewElements + + println("Test1 " + completeView.getElementsWithClassName("LibraryRole")) + println("Test2 " + completeView.getElementsWithExample(empRole)) + println("Test3 " + completeView.getMapOfElements()) + + println("%%%%%%%%%%%%%%%%%%%%%% Activate other views %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + var managerView: Manager0 = Manager0.getNewView() + var simpleView: LibrarySimple0 = LibrarySimple0.getNewView() + + completeView.printViewRoles() + managerView.printViewRoles() + simpleView.printViewRoles() + + println("%%%%%%%%%%%%%%%%%%%%%% Create a new relation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + libRole.addEmployees(manRole) + + println("%%%%%%%%%%%%%%%%%%%%%% Change the name of an employee in a view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + empRole.setNameView("Max Smith") + + completeView.printViewRoles() + managerView.printViewRoles() + simpleView.printViewRoles() + + println("%%%%%%%%%%%%%%%%%%%%%% Remove an employee %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + //libRole.deleteElement() + empRole.deleteElement() + //manRole.deleteElement() + //hasMan.deleteElement() + //hasEmp2.deleteElement() + + completeView.printViewRoles() + managerView.printViewRoles() + simpleView.printViewRoles() +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/example/ModelJoinExample.scala b/src/main/scala/org/rosi_project/example/ModelJoinExample.scala new file mode 100644 index 0000000..145f2bb --- /dev/null +++ b/src/main/scala/org/rosi_project/example/ModelJoinExample.scala @@ -0,0 +1,128 @@ +package org.rosi_project.example + +import org.rosi_project.model_management.core.RsumCompartment +import view.EclipseLibraryView +import view.IMDBdatabaseView +import java.util.Date +import view.Simple0 + +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 = Simple0.getNewView() + + eclipseView.printViewRoles() + imdbView.printViewRoles() + joinView.printViewRoles() + RsumCompartment.printStatus + + println("%%%%%%%%%%%%%%%%%%%%%% Test Println Options for variables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + joinView.getElementsWithClassName("JoinMovieRole").foreach(r => { + val movie = r.asInstanceOf[Simple0#JoinMovieRole] + println(movie.getTitleView()) + println(movie.getMinutesLengthView()) + }) + + println("%%%%%%%%%%%%%%%%%%%%%% Remove Avatar in the Join View %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + + joinView.getElementsWithClassName("JoinMovieRole").foreach(r => { + val movie = r.asInstanceOf[Simple0#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.createJoinMovie("Star Trek I", 1979, 132) + 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/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala b/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala new file mode 100644 index 0000000..c6b126c --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/core/ModelElementLists.scala @@ -0,0 +1,159 @@ +package org.rosi_project.model_management.core + +/** + * Provides convenient access to all instances of the synchronized models. + * + * New models may be registered by name to simplify retrieving their instances. + */ +object ModelElementLists { + + var elements: Map[Class[_ <: AnyRef], Set[AnyRef]] = Map() + var model2Class: Map[String, Class[_ <: AnyRef]] = Map() + + /** + * Inserts a new instance. + * + * The appropriate model will be inferred automatically + * + * @param obj the instance. May never be `null` + */ + def addElement(obj: Object): Unit = { + if (obj == null) { + return + } + + var elementsWithClass = elements.get(obj.getClass) + + if (elementsWithClass.isEmpty) { + elements += (obj.getClass -> Set(obj)) + } else { + //var seti = (elementsWithClass.get ++ Set(obj)) + elements += (obj.getClass -> (elementsWithClass.get + obj)) + } + } + + /** + * Queries for all instances of the given class. + * + * @param clazz the class + * @return all matching instances. If none were found or the class is not yet part of the + * repository, an empty list will be returned + */ + def getElementsWithClass(clazz: Class[_ <: AnyRef], excludeSubclasses: Boolean = false): Set[AnyRef] = { + var matchingElems: Set[AnyRef] = elements.getOrElse(clazz, Set()) + + /*if (!excludeSubclasses) { + matchingElems ++= elements + .filter(elem => elem._1 != clazz && clazz.isAssignableFrom(elem._1)) + .values + .fold(List[AnyRef]())((l1, l2) => l1 ++ l2) + }*/ + + matchingElems + } + + /** + * Queries for all instances of a given model + * + * @param name the name of the model + * @return if the model was found, all its instances will be wrapped in an [[Option]], otherwise + * [[None]] will be returned + */ + def getElementsForModel(name: String): Option[Set[AnyRef]] = { + + if (!model2Class.contains(name)) { + None + } else { + Some(elements.getOrElse(model2Class(name), Set())) + } + + } + + def removeElement(obj: AnyRef): Unit = { + for { elementsWithClass <- elements.get(obj.getClass) } { + val filtered = elementsWithClass.filter(_ != obj) + + elements += (obj.getClass -> filtered) + } + } + + /** + * Informs the repository about what objects belong to which model + * + * @param name the model's name + * @param elemsType the class of the corresponding instances + * @throws IllegalArgumentException if the name is already in use + */ + def registerModel(name: String, elemsType: Class[_ <: AnyRef]): Unit = { + if (model2Class.contains(name)) { + throw new IllegalArgumentException(s"Model is already present: $name") + } + + model2Class += (name -> elemsType) + } + + def printFromPackage(s: String): Unit = { + for (model <- model2Class) { + println(s"Model: ${model._1}:") + + elements.getOrElse(model._2, Set()).foreach(e => println(s"++ $e")) + + } + + for { clazz <- elements.keys if !model2Class.exists(t => t._2 == clazz) } { + if (clazz.toString().contains(s)) { + println(s"Model: $clazz:") + + elements.getOrElse(clazz, Set()).foreach(e => println(s"** $e")) + } + } + } + + def getElementFromType(s: String): AnyRef = { + for { clazz <- elements.keys if !model2Class.exists(t => t._2 == clazz) } { + if (clazz.toString().contains(s)) { + var es = elements.getOrElse(clazz, Set()) + if (es.isEmpty) { + return null + } else { + return es.head + } + } + } + return null + } + + def getElementsFromType(s: String): Set[AnyRef] = { + for { clazz <- elements.keys if !model2Class.exists(t => t._2 == clazz) } { + if (clazz.toString().contains(s)) { + return elements.getOrElse(clazz, Set()) + } + } + return Set() + } + + def getDirectElementsFromType(s: String): Set[AnyRef] = { + for { clazz <- elements.keys if !model2Class.exists(t => t._2 == clazz) } { + if (clazz.getName == s) { + return elements.getOrElse(clazz, Set()) + } + } + return Set() + } + + def printAll(): Unit = { + for (model <- model2Class) { + println(s"Model: ${model._1}:") + + elements.getOrElse(model._2, Set()).foreach(e => println(s"++ $e")) + + } + + for { clazz <- elements.keys if !model2Class.exists(t => t._2 == clazz) } { + println(s"Model: $clazz:") + + elements.getOrElse(clazz, Set()).foreach(e => println(s"** $e")) + } + } + +} diff --git a/src/main/scala/org/rosi_project/model_management/core/PlayerSync.scala b/src/main/scala/org/rosi_project/model_management/core/PlayerSync.scala new file mode 100644 index 0000000..2f0cbbe --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/core/PlayerSync.scala @@ -0,0 +1,30 @@ +package org.rosi_project.model_management.core + +import scroll.internal.MultiCompartment + +trait PlayerSync extends MultiCompartment { + + buildClass() + + var deleted: Boolean = false + + def isDeleted: Boolean = deleted + + def buildClass(): Unit = { + //println("Create New Class") + if (!SynchronizationCompartment.isUnderConstruction()) { + SynchronizationCompartment combine this + val mani = SynchronizationCompartment.createRoleManager() + this play mani + mani.manage(this) + //this play SynchronizationCompartment.createRoleManager() + //+this manage this + } + } + + def deleteObjectFromSynchro(): Unit = { + //println("Delete Object") + +this deleteManage this + deleted = true + } +} diff --git a/src/main/scala/org/rosi_project/model_management/core/RsumCompartment.scala b/src/main/scala/org/rosi_project/model_management/core/RsumCompartment.scala new file mode 100644 index 0000000..b083579 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/core/RsumCompartment.scala @@ -0,0 +1,273 @@ +package org.rosi_project.model_management.core + +import scroll.internal.MultiCompartment +import scala.collection.mutable.ListBuffer +import org.rosi_project.model_management.sum._ +import org.rosi_project.model_management.sum.roles._ +import org.rosi_project.model_management.sum.join._ +import org.rosi_project.model_management.sum.compartments.IRelationCompartment + +object RsumCompartment extends MultiCompartment { + + //all active extensions + private var activeExtensions = ListBuffer[IExtensionCompartment]() + //all active views + private var activeViews = ListBuffer[IViewCompartment]() + + //all registered views + private var viewInfos = ListBuffer[IViewTypeInfo]() + private var joinInfos = ListBuffer[IJoinInfo]() + + //elements in the RSUM + private var relations = ListBuffer[IRelationCompartment]() + private var naturals = ListBuffer[Object]() + private var joins = ListBuffer[IJoinCompartment]() + + //TODO: look if this method needs different visibility + def getNaturals(): ListBuffer[Object] = naturals + def getRelations(): ListBuffer[IRelationCompartment] = relations + def getJoins(): ListBuffer[IJoinCompartment] = joins + + private[model_management] def addJoinCompartment(joinInfo: IJoinInfo): Unit = { + if (joinInfo == null || joinInfos.contains(joinInfo)) { + return + } + joinInfos += joinInfo + + val bases = RsumCompartment.getNaturals().filter(joinInfo.isInstanceBaseModel(_)) + val others = RsumCompartment.getNaturals().filter(joinInfo.isInstanceOtherModel(_)) + //b can only match with one o TODO: uses last one if more than one matches + //TODO: also iterate over joins to allow deep joins + bases.foreach(b => { + var other: Object = null + others.foreach(o => { + if (joinInfo.matchTwoObjects(b, o)) { + other = o + } + }) + if (other != null || joinInfo.getJoinType() == RsumJoinType.outer) { + //join should be added before a view that needs it + val j = joinInfo.getNewInstance(b, other) + val rsumManager = new RsumManager + j play rsumManager + rsumManager.manageRsum(j) + } + }) + } + + def printStatus (): Unit = { + println("****************************************") + println("Naturals: " + naturals.size + " N: " + naturals) + println("Relations: " + relations.size + " R: " + relations) + println("Joins: " + joins.size + " J: " + joins) + println("****************************************") + } + + def isViewTypeInfo(info: IViewTypeInfo): Boolean = viewInfos.contains(info) + + def isActiveExtension(extension: IExtensionCompartment): Boolean = activeExtensions.contains(extension) + + def isActiveView(view: IViewCompartment): Boolean = activeViews.contains(view) + + def isActiveViewFromName(name: String): Boolean = { + activeViews.filter(_.getViewName() == name).foreach( + v => return true) + return false + } + + def getActiveViewFromName(name: String): IViewCompartment = { + activeViews.filter(_.getViewName() == name).foreach( + v => return v) + return null; + } + + def addViewTypeInfo(view: IViewTypeInfo): IViewTypeInfo = { + //look if there is a view with this name + viewInfos.filter(_.getViewName() == view.getViewName()).foreach(v => { + println("View with name " + v.getViewName() + " is already known!") + return v + }) + viewInfos = viewInfos :+ view + view.getJoinInfos().foreach(this.addJoinCompartment(_)) + return view + } + + def createActiveViewFromName(name: String): IViewCompartment = { + //look if there is a view with this name + viewInfos.filter(_.getViewName() == name).foreach( + v => return this.createView(v)) + println("View with name %s is not known!", name) + return null + } + + def createActiveView(view: IViewTypeInfo): IViewCompartment = { + return this.createView(this.addViewTypeInfo(view)) + } + + def deleteActiveView(view: IViewCompartment): Boolean = { + if (view == null || !activeViews.contains(view)) + return false + view.deleteAllRoles() + activeViews -= view + return true + } + + private def createView(view: IViewTypeInfo): IViewCompartment = { + return addActiveView(view.getViewRsumInstance()) + } + + private[model_management] def addActiveView(view: IViewCompartment): IViewCompartment = { + //look if the view is registered + if (viewInfos.filter(_.getViewName() == view.getViewName()).isEmpty) { + return null + } + //look if their exists a view with the same name + //TODO: should be possible to create 2 views with same name + activeViews.filter(_.getViewName() == view.getViewName()).foreach(v => { + println("Two views with the same name can not be created, return old view") + return v + }) + activeViews = activeViews :+ view + //combine the view with the rsum compartment + this combine view + //add the view roles + naturals.foreach(n => view.getViewRole(n)) + joins.foreach(j => view.getViewRole(j)) + relations.foreach(r => view.getViewRole(r)) + return view + } + + def addExtension(comp: IExtensionCompartment): Boolean = { + activeExtensions.foreach { e => + //extension already integrated (ignore) + if (e.getExtensionName().equals(comp.getExtensionName())) { + println("Their already exists an extension compartment with this name") + return false + } + } + activeExtensions = activeExtensions :+ comp + //combine the extension with the rsum compartment + this combine comp + //adds the extension roles + relations.foreach(r => comp.getExtensionRole(r)) + naturals.foreach(n => comp.getExtensionRole(n)) + joins.foreach(j => comp.getExtensionRole(j)) + return true + } + + def removeExtension(name: String): Boolean = { + var extension: IExtensionCompartment = null + //find extension by name + activeExtensions.filter(_.getExtensionName() == name).foreach(e => extension = e) + //remove + if (extension != null) { + extension.deleteAllRoles() + activeExtensions -= extension + return true + } + println("No extension with such a name!") + return false + } + + private def newObject(obj: Object): Unit = { + //TODO: add here implementation for deep joins + //TODO: new function to get naturals and joins in one list + //obj should not be in the join and must be a type of it + joinInfos.filter(_.canMatchWithNewJoin(obj)).foreach(joinInfo => { + var other: Object = null + var newJoin: IJoinCompartment = null + if (joinInfo.isInstanceBaseModel(obj)) { + //can be a new base instance, should not be possible that is is connect with one that is already connected + RsumCompartment.getNaturals().filter(n => joinInfo.isInstanceOtherModel(n) && joinInfo.matchTwoObjects(obj, n) && !joinInfo.containsObject(n)).foreach(other = _) + if (other != null || joinInfo.getJoinType() == RsumJoinType.outer) { + newJoin = joinInfo.getNewInstance(obj, other) + } + } else { + if (joinInfo.getJoinType() == RsumJoinType.outer) { + //search alle join instances from this join for a base model without connection that mathes to this obj + RsumCompartment.getJoins().filter(j => j.hasEmptyOther() && j.getJoinInfo().isInstanceOtherModel(obj) && j.getJoinInfo().matchTwoObjects(j.baseObj, obj)).foreach(_.addOther(obj)) + } else { + //if its no outer join search for all naturals if one match that is currently not in the join + RsumCompartment.getNaturals().filter(n => joinInfo.isInstanceBaseModel(n) && joinInfo.matchTwoObjects(n, obj) && !joinInfo.containsObject(n)).foreach(other = _) + if (other != null) { + newJoin = joinInfo.getNewInstance(other, obj) + } + } + } + if (newJoin != null) { + var rsumManager: RsumManager = new RsumManager() + newJoin play rsumManager + rsumManager.manageRsum(newJoin) + } + }) + } + + class RsumManager() extends IRsumRole { + + def manageRsum(incommingPlayer: Object): Unit = { + if (incommingPlayer == null) + return + + ModelElementLists.addElement(incommingPlayer) + + incommingPlayer match { + case r: IRelationCompartment => + r.initialize() + RsumCompartment.this combine r + //add to list with relations + relations = relations :+ r + case j: IJoinCompartment => + //TODO: implement here deep joins + //newObject(j) + //add to list with joins + joins = joins :+ j + case n: Object => + newObject(n) + //add to list with naturals + naturals = naturals :+ n + } + + //add all roles from extension compartments + activeExtensions.foreach(e => e.getExtensionRole(incommingPlayer)) + //create new elements in other views + activeViews.foreach(v => v.getViewRole(incommingPlayer)) + } + + def deleteEverything(): Unit = { + val playerObj = this.player.right.get + + ModelElementLists.removeElement(playerObj) + + val roles = playerObj.roles() + //iterate over all roles and call remove methods + //remove methods from the rule also remove the role from the graph + roles.filter(_.isInstanceOf[IRsumRole]).foreach(r => { + //println("Delete RsumRole (Extension, View, or Relation) Role: " + r) + val rsumRole = r.asInstanceOf[IRsumRole] + rsumRole.removeRole() + }) + + //remove element from internal element lists + if (playerObj.isInstanceOf[IRelationCompartment]) { + val relation = playerObj.asInstanceOf[IRelationCompartment] + relation.deleteCompartment() + relations -= relation + } else if (playerObj.isInstanceOf[IJoinCompartment]) { + val join = playerObj.asInstanceOf[IJoinCompartment] + join.deleteCompartment() + joins -= join + } else { + naturals -= playerObj + } + //println("All Count: " + plays.allPlayers.size) + } + + def changeSomething(): Unit = { + +this runExtension () + } + + private[model_management] def removeRole(): Unit = { + this.remove() + } + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala b/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala new file mode 100644 index 0000000..bd5886a --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/core/SynchronizationCompartment.scala @@ -0,0 +1,462 @@ +package org.rosi_project.model_management.core + +import scala.collection.Seq +import scala.collection.mutable.ListBuffer +import scala.collection.immutable.Set +import scala.util.control.Breaks._ + +import org.rosi_project.model_management.sync._ +import org.rosi_project.model_management.sync.roles._ +import org.rosi_project.model_management.sync.compartments._ + +object SynchronizationCompartment extends ISynchronizationCompartment { + + def createRoleManager(): IRoleManager = new RoleManager() + + private var activeConstructionCompartment: IConstructionCompartment = null //object + private var activeDestructionCompartment: IDestructionCompartment = null //object + private var activeSyncCompartmentInstances = Set.empty[ISyncCompartment] //classes + private var activeExtensionCompartments = Set.empty[IExtenstionCompartment] //objects + + private var availableExtensionCompartments: List[IExtenstionCompartment] = List[IExtenstionCompartment]() + private var availableConstructionCompartments: List[IConstructionCompartment] = List[IConstructionCompartment]() + private var availableDestructionCompartments: List[IDestructionCompartment] = List[IDestructionCompartment]() + private var availableSyncCompartments: List[ISyncCompartment] = List[ISyncCompartment]() + + changeConstructionRule(SuppressingConstructionCompartment) + changeDestructionRule(GeneralDestructor) + + def getConstructionRule(): IConstructionCompartment = activeConstructionCompartment + + def getDestructionRule(): IDestructionCompartment = activeDestructionCompartment + + def getSyncRules(): Set[ISyncCompartment] = activeSyncCompartmentInstances + + def getExtensions(): Set[IExtenstionCompartment] = activeExtensionCompartments + + def getAvailableConstructionRule(): List[IConstructionCompartment] = availableConstructionCompartments + + def getAvailableDestructionRule(): List[IDestructionCompartment] = availableDestructionCompartments + + def getAvailableSyncRules(): List[ISyncCompartment] = availableSyncCompartments + + def getAvailableExtensions(): List[IExtenstionCompartment] = availableExtensionCompartments + + /** + * Method for Debug Output. + */ + private def debugCompleteRoleGraphOutput(): Unit = { + println("") + val nodes = this.allPlayers + nodes.foreach { n => + println("Output N: " + n + " Player: " + n.player) + } + println("") + } + + /** + * Method for Debug Output. + */ + private def debugSyncRoleGraphOutput(): Unit = { + println("") + val nodes = this.allPlayers + nodes.foreach { + case n: ISyncRole => + val role: ISyncRole = n.asInstanceOf[ISyncRole] + val compart: ISyncCompartment = role.getOuterCompartment + println("Output N: " + n + " Player: " + n.player + " Comp: " + compart + " RN: " + compart.getRuleName) + case _ => + } + println("") + } + + /** + * Method for Debug Output. + */ + private def debugPlayerRolesOutput(): Unit = { + println("") + val nodes = this.allPlayers + nodes.foreach { + case player: PlayerSync => + println("Output N: " + player.roles()) + case _ => + } + println("") + } + + def registerConstructionCompartment(compartment: IConstructionCompartment): Unit = { + if (compartment == null) + return + if (!availableConstructionCompartments.contains(compartment)) { + availableConstructionCompartments = availableConstructionCompartments :+ compartment + this combine compartment + } + } + + def registerDestructionCompartment(compartment: IDestructionCompartment): Unit = { + if (compartment == null) + return + if (!availableDestructionCompartments.contains(compartment)) { + availableDestructionCompartments = availableDestructionCompartments :+ compartment + this combine compartment + } + } + + def registerSyncRule(compartment: ISyncCompartment): Unit = { + if (compartment == null) + return + if (!availableSyncCompartments.contains(compartment)) { + availableSyncCompartments = availableSyncCompartments :+ compartment + } + } + + def registerExtensionCompartment(compartment: IExtenstionCompartment): Unit = { + if (compartment == null) + return + if (!availableExtensionCompartments.contains(compartment)) { + availableExtensionCompartments = availableExtensionCompartments :+ compartment + this combine compartment + } + } + + def activateExtensionCompartment(compartment: IExtenstionCompartment): Unit = { + if (compartment == null) + return + activeExtensionCompartments += compartment + registerExtensionCompartment(compartment) + } + + def deactivateExtensionCompartment(compartment: IExtenstionCompartment): Unit = { + if (compartment == null) + return + activeExtensionCompartments -= compartment + } + + /** + * Change the actual construction role. + */ + def changeConstructionRule(construct: IConstructionCompartment): Unit = { + if (construct == null) { + return + } + activeConstructionCompartment = construct + registerConstructionCompartment(construct) + } + + /** + * Change the destruction role. + * Set the new one and remove old roles and add new ones. + */ + def changeDestructionRule(destruct: IDestructionCompartment): Unit = { + if (destruct == null) { + return + } + if (activeDestructionCompartment == null) { + activeDestructionCompartment = destruct + registerDestructionCompartment(destruct) + return + } + //debugCompleteRoleGraphOutput() + var nodes = this.allPlayers; //get all nodes + //delete all destruction roles + nodes.foreach { n => + if (n.isInstanceOf[IDestructor]) + n.remove() + } + //debugCompleteRoleGraphOutput() + //add all new ones + nodes = this.allPlayers + nodes.foreach { + case n: IRoleManager => + //add new role here + val player = n.player + if (player.isRight) { + val realPlayer = player.right.get + val newRole = destruct.getDestructorForClassName(realPlayer) + n play newRole + } + case _ => + } + //debugCompleteRoleGraphOutput() + activeDestructionCompartment = destruct + + registerDestructionCompartment(destruct) + } + + /** + * Integration of a new Model with an integration compartment. + */ + def integrateNewModel(integrationRule: IIntegrationCompartment): Unit = { + this combine integrationRule + val nodes = this.allPlayers + nodes.foreach { + case player: PlayerSync => + val role = integrationRule.getIntegratorForClassName(player) + //println("RM: " + n + " Role: " + role) + if (role != null) { + player play role + underConstruction = true; + (+player).integrate(player) + underConstruction = false; + role.remove() + } + case _ => + } + nodes.foreach { + case player: PlayerSync => + val role = integrationRule.getRelationalIntegratorsForClassName(player) + //println("RM: " + n + " Role: " + role) + if (role != null) { + player play role + underConstruction = true; + (+player).integrate(player) + underConstruction = false; + role.remove() + } + case _ => + } + integrationRule.finalEditFunction() + } + + /** + * Add a new synchronization rule to the synchronization process. + */ + def addSynchronizationRule(newRule: ISyncCompartment): Unit = { + if (newRule == null) { + return + } + //if the rule is in the list stop + activeSyncCompartmentInstances.foreach { s => + if (s.getRuleName == newRule.getRuleName) + return + } + activeSyncCompartmentInstances += newRule + + var running = true + var nodes = Seq[AnyRef]() + //debugSyncRoleGraphOutput() + while (running) { + breakable { + running = false + nodes = this.allPlayers; //get all nodes + nodes.foreach { + case n: RoleManager => + //proof if the role manager does not play this rule + var proof = true + val player = n.player + if (player.isRight) { + val realPlayer = player.right.get + val relatedRoles = n.roles() + //println(realPlayer + "-----" + relatedRoles) + relatedRoles.foreach { + case syncRole: ISyncRole => + val syncComp: ISyncCompartment = syncRole.getOuterCompartment + if (syncComp.getRuleName == newRule.getRuleName || !newRule.isFirstIntegration(realPlayer)) + proof = false + case _ => + } + + //if synchronization compartment was not integrated before then integrate now + if (proof) { + //add new role to the player + //the new compartment + val newComp: ISyncCompartment = newRule.getNewInstance + val newRole = newComp.getNextIntegrationRole(realPlayer) + //println("**" + newComp + " " + newRole + " " + n + " " + realPlayer) + if (newRole != null) + n play newRole + else + proof = false + + if (proof) { + //add roles to related role manager because on is added to this one + val related = n.getRelatedManager + related.foreach { r => + val player = r.player + if (player.isRight) { + val realPlayer = player.right.get + if (newComp.isNextIntegration(realPlayer)) { + val newRole = newComp.getNextIntegrationRole(realPlayer) + r play newRole + } + } + } + this combine newComp + running = true + break + } + } + } + case _ => + + } + } + } + + registerSyncRule(newRule) + //debugPlayerRolesOutput() + //debugSyncRoleGraphOutput() + } + + def hasSynchronizationRule(ruleName: String): Boolean = { + activeSyncCompartmentInstances.map(_.getRuleName).contains(ruleName) + } + + /** + * Delete all rules with this name. + */ + def deleteRule(ruleName: String): Unit = { + val nodes = this.allPlayers //get all nodes + nodes.foreach { + case n: ISyncRole => + val role: ISyncRole = n.asInstanceOf[ISyncRole] + val compart: ISyncCompartment = role.getOuterCompartment + //println("Destruct1: " + n.isInstanceOf[ISyncRole] + " N: " + n + " Player: " + n.player + " Comp: " + compart + " RN: " + compart.getRuleName() + " From: " + from) + if (compart.getRuleName == ruleName) { + compart.clearSyncer() + n.remove() + } + case _ => + + } + + // rule names should be unique (in theory) + // but we're better save than sorry + val ruleCompartments = activeSyncCompartmentInstances.filter(_.getRuleName == ruleName) + for (comp <- ruleCompartments) { + activeSyncCompartmentInstances -= comp + } + + //debugCompleteRoleGraphOutput() + } + + /** + * Change rule with this name to new rule. + */ + def changeRuleFromTo(from: String, to: ISyncCompartment): Unit = { + var running = true + var nodes = Seq[AnyRef]() + while (running) { + breakable { + running = false + nodes = this.allPlayers //get all nodes + nodes.foreach { + case role: ISyncRole => + val compart: ISyncCompartment = role.getOuterCompartment + //println("Destruct1: " + n.isInstanceOf[ISyncRole] + " N: " + n + " Player: " + n.player + " Comp: " + compart + " RN: " + compart.getRuleName() + " From: " + from) + if (compart.getRuleName == from) { + //exchange this with a new compartment + val newComp: ISyncCompartment = to.getNewInstance + compart.getSyncer.foreach { r => + val manager = (+r).getManager() + if (manager.isRight) { + val realManager: RoleManager = manager.right.get(0).right.get + val player = r.player + if (player.isRight) { + val realPlayer = player.right.get + val newRole = newComp.getNextIntegrationRole(realPlayer) + r.remove() + realManager play newRole + } + } + } + //role graph combination + this combine newComp + //delete compartment + compart.clearSyncer() + running = true + break + } + case _ => + + } + } + } + + // rule names should be unique (in theory) + // but we're better save than sorry + val oldRuleCompartments = activeSyncCompartmentInstances.filter(_.getRuleName == from) + for (comp <- oldRuleCompartments) { + activeSyncCompartmentInstances -= comp + } + activeSyncCompartmentInstances += to + + registerSyncRule(to) + //debugSyncRoleGraphOutput() + } + + class RoleManager() extends IRoleManager { + + def getRelatedClassFromName(name: String): PlayerSync = { + getRelatedManager.foreach(rm => { + val realPlayer = rm.player.right.get + //TODO: look on more superclasses + //println(realPlayer.getClass.getSimpleName + " " + realPlayer.getClass.getName + " " + realPlayer.getClass.getCanonicalName) + if (realPlayer.getClass.getName.contains(name) || realPlayer.getClass.getSuperclass.getName.contains(name)) { + return realPlayer.asInstanceOf[PlayerSync] + } + }) + 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 () + } + + def deletionNotification(): Unit = { + //println("Deletion Notification") + +this notifyDeletion () + } + + def updateNotification(): Unit = { + //println("Update Notification") + +this notifyUpdate () + } + + def printAllManager(): Unit = { + println("++ Ma => Pl: " + this + " | " + this.player.right.get) + getRelatedManager().foreach(m => { + 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 () + } + } + + def manage(value: PlayerSync): Unit = { + val construct = activeConstructionCompartment.getConstructorForClassName(value) + if (construct != null) { + this play construct + underConstruction = true; + 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/src/main/scala/org/rosi_project/model_management/sum/IExtensionCompartment.scala b/src/main/scala/org/rosi_project/model_management/sum/IExtensionCompartment.scala new file mode 100644 index 0000000..9919711 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/IExtensionCompartment.scala @@ -0,0 +1,67 @@ +package org.rosi_project.model_management.sum + +import scroll.internal.Compartment +import scala.collection.mutable.ListBuffer +import org.rosi_project.model_management.sum.roles.IExtensionRole +import org.rosi_project.model_management.core.RsumCompartment + +trait IExtensionCompartment extends Compartment { + + protected var roles = ListBuffer[IExtensionRole]() + + protected def getRole(classname: Object) : IExtensionRole + + private def getRoleFromList(classname: Object): IExtensionRole = { + roles.foreach { r => + if (+r == +classname) { + return r + } + } + return null + } + + protected def removeRoleFromList(role: IExtensionRole): Unit = { + if (roles.contains(role)) + roles -= role + } + + /** + * Get a new extension role for the object. Adds automatically the play relation. + */ + private[model_management] def getExtensionRole(classname: Object) : IExtensionRole = { + if (!RsumCompartment.isActiveExtension(this)) { + return null + } + + //look if a role from this elements exists in this extension + var role: IExtensionRole = getRoleFromList(classname) + //YES Return this role + if (role != null) { + return role + } + + role = this.getRole(classname) + if (role != null) { + classname play role + roles = roles :+ role + } + return role + } + + //TODO: do we need this function + def getNewInstance() : IExtensionCompartment + + def getExtensionName() : String + + def deleteAllRoles() : Unit = { + roles.foreach(_.remove()) + } + + abstract class AExtensionRole extends IExtensionRole { + + private[model_management] def removeRole(): Unit = { + this.remove() + IExtensionCompartment.this.removeRoleFromList(this) + } + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/IViewCompartment.scala b/src/main/scala/org/rosi_project/model_management/sum/IViewCompartment.scala new file mode 100644 index 0000000..84c3746 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/IViewCompartment.scala @@ -0,0 +1,237 @@ +package org.rosi_project.model_management.sum + +import scroll.internal.Compartment +import scala.collection.mutable.ListBuffer +import scala.collection.mutable.Set +import org.rosi_project.model_management.core.RsumCompartment +import org.rosi_project.model_management.core.RsumCompartment.RsumManager +import org.rosi_project.model_management.sum.compartments.IRelationCompartment +import org.rosi_project.model_management.sum.roles.IViewRole +import org.rosi_project.model_management.sum.join.IJoinCompartment + +trait IViewCompartment extends Compartment { + + private var initRelationRole: Boolean = false + private var naturalRoles = ListBuffer[AViewRole]() + private var relationalRoles = ListBuffer[AViewRole]() + + /** + * Get a map with the simple names of all elements + * and the connected elements in the view. + */ + def getMapOfElements(): Map[String, Set[AViewRole]] = { + var result: Map[String, Set[AViewRole]] = Map.empty + naturalRoles.foreach(n => { + if (result.contains(n.getClass.getSimpleName)) { + result(n.getClass.getSimpleName) += n + } else { + result = result + (n.getClass.getSimpleName -> Set(n)) + } + }) + result + } + + /** + * Get all elements with the specific simple name. + */ + def getElementsWithClassName(s: String): Set[AViewRole] = { + var result: Set[AViewRole] = Set.empty + naturalRoles.foreach(n => { + if (n.getClass.getSimpleName == s) { + result += n + } + }) + result + } + + /** + * Get all elements with the same type from the view. + */ + def getElementsWithExample[A <: IViewRole](a: A): Set[A] = { + var result: Set[A] = Set.empty + naturalRoles.foreach(n => { + if (n.getClass.getName == a.getClass.getName) { + result += n.asInstanceOf[A] + } + }) + result + } + + /** + * Get a new view role for the object. Adds automatically the play relation. + */ + private[model_management] def getViewRole(classname: Object): IViewRole = { + if (!RsumCompartment.isActiveView(this)) { + return null + } + + if (!isViewable(classname)) { + return null + } + + //look if a role from this elements exists in this view + var role: AViewRole = getRoleFromList(classname) + //YES Return this role + if (role != null) { + return role + } + + //it can not be possible that relations are created without their connection parts before + //decide if source or target need a join role than we must look if they are also connected with such a role + //NO create a new one + if (classname.isInstanceOf[IRelationCompartment]) { + //1. Handle the Relational Compartment + var comp: IRelationCompartment = classname.asInstanceOf[IRelationCompartment] + var source = comp.getSource() + var target = comp.getTarget() + var sourcePlayer = source.player.right.get + var targetPlayer = target.player.right.get + var sourceRole: AViewRole = getRoleFromList(source) //should work now with join objects + var targetRole: AViewRole = getRoleFromList(target) //should work now with join objects + //requirement that a relational compartment cannot play a role in a relational compartment + //if one source does not exists then do not create the new relation + if (sourceRole != null && targetRole != null) { + initRelationRole = true + role = getRelationalRole(classname, sourceRole, targetRole) + classname play role + initRelationRole = false + } + } else { + //2. Handle the natural and join types + initRelationRole = true + role = getNaturalRole(classname) + classname play role + initRelationRole = false + } + return role + } + + protected def isViewable(classname: Object): Boolean + protected def getNaturalRole(classname: Object): AViewRole + protected def getRelationalRole(classname: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole + + protected def getRoleFromList(classname: Object): AViewRole = { + relationalRoles.foreach(r => { + if (+r == +classname) { + return r + } + }) + naturalRoles.foreach(r => { + if (r.player.right.get.isInstanceOf[IJoinCompartment] && !classname.isInstanceOf[IJoinCompartment]) { + if (+r joinEquals(classname)) { + return r + } + } else { + if (+r == +classname) { + return r + } + } + }) + return null + } + + def printViewRoles(): Unit = { + println("-------------------------------------------------------------------") + println("View: " + this.getViewName() + " #Roles: " + naturalRoles.size) + naturalRoles.foreach { r => + var player = r.player.right.get + var playerRoles = player.roles() + println("* Player: " + player + " - Role: " + r + " - Size: " + playerRoles.size) + } + relationalRoles.foreach { r => + var player = r.player.right.get + var playerRoles = player.roles() + println("# Player: " + player + " - Role: " + r + " - Size: " + playerRoles.size) + } + println("-------------------------------------------------------------------") + } + + def getAllViewElements(): ListBuffer[AViewRole] = naturalRoles + + def containsRole(role: AViewRole): Boolean = naturalRoles.contains(role) + + def getViewName(): String + + private[model_management] def deleteAllRoles(): Unit = { + naturalRoles.foreach { r => + r.remove() + } + relationalRoles.foreach { r => + r.remove() + } + } + + protected def removeRoleFromList(role: AViewRole): Unit = { + if (naturalRoles.contains(role)) + naturalRoles -= role + if (relationalRoles.contains(role)) + relationalRoles -= role + } + + private def initElement(element: Object, relational: Boolean, role: AViewRole): Unit = { + //proof if the actual view is in + if (!RsumCompartment.isActiveView(this)) { + return + } + if (relational) + relationalRoles = relationalRoles :+ role + else + naturalRoles = naturalRoles :+ role + + //do this only if element is created in the view and not somewhere else + if (!initRelationRole) { + var rsumManager: RsumManager = new RsumManager() + element play rsumManager + element play role + rsumManager.manageRsum(element) + } + } + + private def isActive(): Boolean = RsumCompartment.isActiveView(this) + + abstract class AViewRole extends IViewRole { + + initializeElement() + + protected def isRelational(): Boolean + + protected def getCreationObject(): Object + + private def initializeElement(): Unit = { + if (isActive) { + if (isRelational) { + relationalRoles = relationalRoles :+ this + } else { + naturalRoles = naturalRoles :+ this + } + if (!initRelationRole) { + var rsumManager: RsumManager = new RsumManager() + var obj = getCreationObject + obj play rsumManager + obj play this + rsumManager.manageRsum(obj) + } + } + } + + protected def getPlayerOfType(obj: Object, t: String): Object = { + val source: Object = obj.player.right.get + if (source.isInstanceOf[IJoinCompartment]) { + val joinNats = source.asInstanceOf[IJoinCompartment].getAllJoinNaturals() + joinNats.filter(_.getClass.getSimpleName == t).foreach(n => return n) + } else { + return source + } + source + } + + protected def deleteElement(): Unit = { + +this deleteEverything () + } + + private[model_management] def removeRole(): Unit = { + this.remove() + IViewCompartment.this.removeRoleFromList(this) + } + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/IViewTypeInfo.scala b/src/main/scala/org/rosi_project/model_management/sum/IViewTypeInfo.scala new file mode 100644 index 0000000..0539b46 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/IViewTypeInfo.scala @@ -0,0 +1,26 @@ +package org.rosi_project.model_management.sum + +import org.rosi_project.model_management.sum.join.IJoinInfo +import org.rosi_project.model_management.core.RsumCompartment + +trait IViewTypeInfo { + + def getViewName(): String + + protected def getNewViewTypeInstance(): IViewCompartment = { + RsumCompartment.addViewTypeInfo(this) + var view = RsumCompartment.getActiveViewFromName(this.getViewName()) + if (view == null) { + return RsumCompartment.addActiveView(this.getNewInstance()) + } + else { + return view + } + } + + def getJoinInfos(): Set[IJoinInfo] + + private[model_management] def getViewRsumInstance(): IViewCompartment = getNewInstance + + protected def getNewInstance(): IViewCompartment +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IAggregation.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IAggregation.scala new file mode 100644 index 0000000..c5e8b39 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IAggregation.scala @@ -0,0 +1,11 @@ +package org.rosi_project.model_management.sum.compartments + +trait IAggregation extends IDirectAggregation { + + trait IAggregationSource extends IDirectAggregationSource { + } + + trait IAggregationTarget extends IDirectAggregationTarget { + def getSource (): ISource = IAggregation.this.source + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IAssociation.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IAssociation.scala new file mode 100644 index 0000000..3296872 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IAssociation.scala @@ -0,0 +1,11 @@ +package org.rosi_project.model_management.sum.compartments + +trait IAssociation extends IDirectAssoziation { + + trait IAssociationSource extends IDirectAssoziationSource { + } + + trait IAssociationTarget extends IDirectAssoziationTarget { + def getSource (): ISource = IAssociation.this.source + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IComposition.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IComposition.scala new file mode 100644 index 0000000..a85581c --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IComposition.scala @@ -0,0 +1,11 @@ +package org.rosi_project.model_management.sum.compartments + +trait IComposition extends IDirectComposition { + + trait ICompositionSource extends IDirectCompositionSource { + } + + trait ICompositionTarget extends IDirectCompositionTarget { + def getSource (): ISource = IComposition.this.source + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAggregation.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAggregation.scala new file mode 100644 index 0000000..6a8e264 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAggregation.scala @@ -0,0 +1,10 @@ +package org.rosi_project.model_management.sum.compartments + +trait IDirectAggregation extends IRelationCompartment { + + trait IDirectAggregationSource extends ISource { + } + + trait IDirectAggregationTarget extends ITarget { + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAssoziation.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAssoziation.scala new file mode 100644 index 0000000..ee8e2e8 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectAssoziation.scala @@ -0,0 +1,10 @@ +package org.rosi_project.model_management.sum.compartments + +trait IDirectAssoziation extends IRelationCompartment { + + trait IDirectAssoziationSource extends ISource { + } + + trait IDirectAssoziationTarget extends ITarget { + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectComposition.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectComposition.scala new file mode 100644 index 0000000..4084544 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IDirectComposition.scala @@ -0,0 +1,32 @@ +package org.rosi_project.model_management.sum.compartments + +trait IDirectComposition extends IRelationCompartment { + + override def deleteCompartment () : Unit = { + //println("DeleteCompartment IDirectComposition") + if (source != null) + { + source.remove() + source = null; + } + if (target != null) + { + var player = target.player + if (player.isRight) { + var realPlayer = player.right.get + target.remove() + target = null; + +realPlayer deleteEverything() + } + } + //+this deleteEverything() + } + + trait IDirectCompositionSource extends ISource { + override private[model_management] def removeRole(): Unit = +IDirectComposition.this deleteEverything() + } + + trait IDirectCompositionTarget extends ITarget { + override private[model_management] def removeRole(): Unit = +IDirectComposition.this deleteEverything() + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/compartments/IRelationCompartment.scala b/src/main/scala/org/rosi_project/model_management/sum/compartments/IRelationCompartment.scala new file mode 100644 index 0000000..4af7d9c --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/compartments/IRelationCompartment.scala @@ -0,0 +1,49 @@ +package org.rosi_project.model_management.sum.compartments + +import scroll.internal.Compartment +import org.rosi_project.model_management.sum.roles.IRelationRole +import org.rosi_project.model_management.core.PlayerSync + +trait IRelationCompartment extends PlayerSync { + + protected var source: ISource = null; + protected var target: ITarget = null; + + //TODO: change again to protected + def internalInitialize(): Unit + + def getTarget(): ITarget = target + + def getSource(): ISource = source + + def initialize(): Unit = { + if (source == null && target == null) + internalInitialize() + } + + def deleteCompartment () : Unit = { + //println("DeletCompartment IRelationCompartment") + if (source != null) + { + source.remove() + source = null; + } + if (target != null) + { + target.remove() + target = null; + } + //+this deleteEverything() + } + + trait ISource extends IRelationRole { + def getTarget (): ITarget = IRelationCompartment.this.target + private[model_management] def removeRole(): Unit = +IRelationCompartment.this deleteEverything() + override def getOuterCompartment(): IRelationCompartment = IRelationCompartment.this + } + + trait ITarget extends IRelationRole { + private[model_management] def removeRole(): Unit = +IRelationCompartment.this deleteEverything() + override def getOuterCompartment(): IRelationCompartment = IRelationCompartment.this + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/join/IJoinCompartment.scala b/src/main/scala/org/rosi_project/model_management/sum/join/IJoinCompartment.scala new file mode 100644 index 0000000..5c256dd --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/join/IJoinCompartment.scala @@ -0,0 +1,123 @@ +package org.rosi_project.model_management.sum.join + +import scroll.internal.Compartment +import org.rosi_project.model_management.sum.roles.IRsumRole +import org.rosi_project.model_management.core.RsumCompartment.RsumManager +import org.rosi_project.model_management.core.RsumCompartment + +trait IJoinCompartment extends Compartment { + var baseObj: Object = null + var otherObj: Object = null + + protected val baseRole: BaseRole = new BaseRole + protected val otherRole: OtherRole = new OtherRole + + def getJoinInfo(): IJoinInfo + + def getAllJoinNaturals(): Set[Object] = { + var bases: Set[Object] = Set(baseObj) + if (baseObj.isInstanceOf[IJoinCompartment]) { + bases = baseObj.asInstanceOf[IJoinCompartment].getAllJoinNaturals() + } + if (otherObj != null) { + var others: Set[Object] = Set(otherObj) + if (otherObj.isInstanceOf[IJoinCompartment]) { + others = otherObj.asInstanceOf[IJoinCompartment].getAllJoinNaturals() + } + return others ++ bases + } + return bases + } + + def hasEmptyOther(): Boolean = otherObj == null + + def joinEquals(obj: Object): Boolean = { + var baseEquals: Boolean = false + var otherEquals: Boolean = false + if (baseObj.isInstanceOf[IJoinCompartment]) { + baseEquals = baseObj.asInstanceOf[IJoinCompartment].joinEquals(obj) + } else { + baseEquals = +obj == +baseObj + } + if (otherObj.isInstanceOf[IJoinCompartment]) { + otherEquals = otherObj.asInstanceOf[IJoinCompartment].joinEquals(obj) + } else { + otherEquals = +obj == +otherObj + } + baseEquals || otherEquals + } + + def addOther(obj: Object): Unit = { + if (obj != null && otherObj == null) { + getJoinInfo.addObject(obj) + otherObj = obj + otherObj play otherRole + } + } + + //if deletion comes from down than is stop in roles + def deleteCompartment(): Unit = { + if (baseObj != null) { + getJoinInfo.removeObject(baseObj) + baseRole.remove() + +baseObj deleteEverything() + } + if (otherObj != null) { + getJoinInfo.removeObject(otherObj) + otherRole.remove() + +otherObj deleteEverything() + } + } + + private[join] def objectInitialization(base: Object, other: Object): Unit = { + if (base != null) { + getJoinInfo.addObject(base) + baseObj = base + base play baseRole + } + if (other != null) { + getJoinInfo.addObject(other) + otherObj = other + other play otherRole + } + } + + protected def initialize(base: Object, other: Object): Unit = { + RsumCompartment.combine(this) + var rsumManager: RsumManager = null + if (base != null) { + getJoinInfo.addObject(base) + baseObj = base + base play baseRole + rsumManager = new RsumManager() + base play rsumManager + rsumManager.manageRsum(base) + } + if (other != null) { + getJoinInfo.addObject(other) + otherObj = other + other play otherRole + rsumManager = new RsumManager() + other play rsumManager + rsumManager.manageRsum(other) + } + } + + class BaseRole extends IRsumRole { + //deletion comes from down + private[model_management] def removeRole(): Unit = { + baseRole.remove() + otherRole.remove() + +IJoinCompartment.this deleteEverything() + } + } + + class OtherRole extends IRsumRole { + private[model_management] def removeRole(): Unit = { + baseRole.remove() + otherRole.remove() + +IJoinCompartment.this deleteEverything() + } + } + +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/join/IJoinInfo.scala b/src/main/scala/org/rosi_project/model_management/sum/join/IJoinInfo.scala new file mode 100644 index 0000000..8e25239 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/join/IJoinInfo.scala @@ -0,0 +1,36 @@ +package org.rosi_project.model_management.sum.join + +trait IJoinInfo { + + private var allPlayers: Set[Object] = Set.empty + + def addObject(obj: Object): Unit = { + allPlayers = allPlayers + obj + } + + def removeObject(obj: Object): Unit = { + allPlayers = allPlayers - obj + } + + protected def objectInitialize(join: IJoinCompartment, base: Object, other: Object): Unit = { + join.objectInitialization(base, other) + } + + def containsObject(obj: Object): Boolean = allPlayers.contains(obj) + + def getJoinType(): RsumJoinType.Value + + private def canInJoin(obj: Object): Boolean = (isInstanceBaseModel(obj) || isInstanceOtherModel(obj)) && !allPlayers.contains(obj) + + def canMatchWithNewJoin(obj: Object): Boolean = canInJoin(obj) && !containsObject(obj) + + def isInstanceBaseModel(obj: Object): Boolean + + def isInstanceOtherModel(obj: Object): Boolean + + def matchTwoObjects(b: Object, o: Object): Boolean + + def getNewInstance(b: Object, o: Object): IJoinCompartment + + def isInstanceOf(obj: Object): Boolean +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/join/RsumJoinType.scala b/src/main/scala/org/rosi_project/model_management/sum/join/RsumJoinType.scala new file mode 100644 index 0000000..709ec2e --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/join/RsumJoinType.scala @@ -0,0 +1,5 @@ +package org.rosi_project.model_management.sum.join + +object RsumJoinType extends Enumeration { + val outer, natural, theta = Value +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/AQuery.scala b/src/main/scala/org/rosi_project/model_management/sum/query/AQuery.scala new file mode 100644 index 0000000..165cebc --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/AQuery.scala @@ -0,0 +1,102 @@ +package org.rosi_project.model_management.sum.query + +import scroll.internal.Compartment + +/** + * Describes the abstract query compartment with the roles that each query must implement. + */ +abstract class AQuery(val name: String) extends Compartment { + + def deleteQueryResults(): Unit + def deleteQueryObjects(): Unit + + /** + * Create ModelJoin syntax for views. + */ + def generateModelJoinFromQuery(): String + + /** + * Add a query role to the underlying object. + */ + def addQueryRole(obj: Object): AQuery#QueryObject + + /** + * Remove a query role from the query. + */ + def removeQueryRole(role: AQuery#QueryObject): Unit + + /** + * Proof if the query has a correct form. + * Not more than one connection island. + */ + def isQueryCorrect(): Boolean + + /** + * Running the query and getting a set of sets of result objects. + */ + def runQuery(): Set[Set[Object]] + + /** + * Abstract query object to create the query from example. + */ + abstract class QueryObject() { + + /** + * Label to identify a query object. + */ + var label: String = "" + + /** + * Describes is necessary to be in the results or to be not. + */ + var negated: Boolean = false + + /** + * Important to describe if a transitive closure should be created. + */ + var transitive: Boolean = false + + /** + * Describes how often a connection must exists. + */ + var multi: Int = 1 + + /** + * Describes if the elements should be returned in the results or not. + */ + var returned: Boolean = true + + private var attributeFilters: Set[AttributeFilter] = Set.empty + + /** + * Create and add an attribute filter object to a query object. + */ + def addAttributeFilter(attributeName: String, value: String, bigger: CheckingOption.Value): Boolean = { + if (attributeName == null || attributeName == "" || + bigger == null || value == null || value == "") { + return false + } + attributeFilters += new AttributeFilter(attributeName, value, bigger) + return true + } + + def getAttributeFilters(): Set[AttributeFilter] = attributeFilters + + def overallConnectionUnit(): Int + + override def toString(): String = "QO: " + label + } + + /** + * Abstract query results that each element which matches the query gets. + */ + abstract class QueryResult(val matchedQueryObject: QueryObject) { + + override def toString(): String = "QR: (" + this.player.right.get.toString() + " " + matchedQueryObject + ")" + } + + /** + * Should collect information about the attributes a query element must have + */ + class AttributeFilter(val attributeName: String, val value: String, val checking: CheckingOption.Value) {} +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/CheckingOption.scala b/src/main/scala/org/rosi_project/model_management/sum/query/CheckingOption.scala new file mode 100644 index 0000000..9d6ceff --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/CheckingOption.scala @@ -0,0 +1,5 @@ +package org.rosi_project.model_management.sum.query + +object CheckingOption extends Enumeration { + val equalsCheck, biggerThan, smallerThan = Value +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/IQueryViewCompartment.scala b/src/main/scala/org/rosi_project/model_management/sum/query/IQueryViewCompartment.scala new file mode 100644 index 0000000..462693e --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/IQueryViewCompartment.scala @@ -0,0 +1,138 @@ +package org.rosi_project.model_management.sum.query + +import scroll.internal.Compartment +import scala.collection.mutable.ListBuffer +import scala.collection.mutable.Set +import org.rosi_project.model_management.core.RsumCompartment +import org.rosi_project.model_management.sum.compartments.IRelationCompartment + +trait IQueryViewCompartment extends Compartment { + + private var name: String = "" + private var query: Query = null + + RsumCompartment.combine(this) + + protected def init(n: String): Unit = { + name = n + query = new Query(n) + } + + private var naturalRoles = Set[AQueryViewRole]() + private var relationalRoles = Set[AQueryViewRole]() + + def getName(): String = name + + def getQuery(): Query = query + + /** + * Get a map with the simple names of all elements + * and the connected elements in the view. + */ + def getMapOfElements(): Map[String, Set[AQueryViewRole]] = { + var result: Map[String, Set[AQueryViewRole]] = Map.empty + naturalRoles.foreach(n => { + if (result.contains(n.getClass.getSimpleName)) { + result(n.getClass.getSimpleName) += n + } else { + result = result + (n.getClass.getSimpleName -> Set(n)) + } + }) + result + } + + /** + * Get all elements with the specific simple name. + */ + def getElementsWithClassName(s: String): Set[AQueryViewRole] = { + var result: Set[AQueryViewRole] = Set.empty + naturalRoles.foreach(n => { + if (n.getClass.getSimpleName == s) { + result += n + } + }) + result + } + + /** + * Get all elements with the same type from the view. + */ + def getElementsWithExample[A <: AQueryViewRole](a: A): Set[A] = { + var result: Set[A] = Set.empty + naturalRoles.foreach(n => { + if (n.getClass.getName == a.getClass.getName) { + result += n.asInstanceOf[A] + } + }) + result + } + + protected def getRoleFromList(classname: Object): AQueryViewRole = { + relationalRoles.foreach { r => + if (+r == +classname) { + return r + } + } + naturalRoles.foreach { r => + if (+r == +classname) { + return r + } + } + return null + } + + def printViewRoles(): Unit = { + println("-------------------------------------------------------------------") + println("QueryView: " + name + " #Roles: " + naturalRoles.size) + naturalRoles.foreach { r => + var player = r.player.right.get + var playerRoles = player.roles() + println("* Player: " + player + " - Role: " + r + " - Size: " + playerRoles.size) + } + relationalRoles.foreach { r => + var player = r.player.right.get + var playerRoles = player.roles() + println("# Player: " + player + " - Role: " + r + " - Size: " + playerRoles.size) + } + println("-------------------------------------------------------------------") + } + + def getAllViewElements(): Set[AQueryViewRole] = naturalRoles + + def containsRole(role: AQueryViewRole): Boolean = naturalRoles.contains(role) + + abstract class AQueryViewRole { + + protected var connected: AQuery#QueryObject = null + + initializeElement() + + protected def isRelational(): Boolean + + protected def getCreationObject(): Object + + def getQueryObject: AQuery#QueryObject = connected + + private def initializeElement(): Unit = { + val obj = getCreationObject + if (isRelational) { + relationalRoles += this + val rel = obj.asInstanceOf[IRelationCompartment] + RsumCompartment.combine(rel) + rel.internalInitialize() + } else { + naturalRoles += this + } + connected = query.addQueryRole(obj) + obj play this + } + + protected def deleteElement(): Unit = { + if (isRelational) { + +this deleteCompartment() + } + this.remove() + query.removeQueryRole(connected) + } + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/ModelJoinContainer.scala b/src/main/scala/org/rosi_project/model_management/sum/query/ModelJoinContainer.scala new file mode 100644 index 0000000..a53ad57 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/ModelJoinContainer.scala @@ -0,0 +1,5 @@ +package org.rosi_project.model_management.sum.query + +class ModelJoinContainer(val name: String, val source: String, val target: String) { + +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/Query.scala b/src/main/scala/org/rosi_project/model_management/sum/query/Query.scala new file mode 100644 index 0000000..dbb13df --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/Query.scala @@ -0,0 +1,624 @@ +package org.rosi_project.model_management.sum.query + +import scroll.internal.Compartment +import org.rosi_project.model_management.core.RsumCompartment +import org.rosi_project.model_management.sum.compartments.IRelationCompartment +import org.rosi_project.model_management.sum.roles.IRelationRole +import org.rosi_project.model_management.util.query.ModelJoinCreator +import org.rosi_project.model_sync.model_join.representation.grammar.CompoundKeepBuilder + +/** + * Special query implementation for the query interface that works on the RSUM. + */ +class Query(_name: String) extends AQuery(_name) { + + RsumCompartment.combine(this) + + private var queryRelRoles: Set[QueryRelObject] = Set.empty + private var queryNatRoles: Set[QueryNatObject] = Set.empty + + private var queryRelResults: Set[QueryRelResult] = Set.empty + private var queryNatResults: Set[QueryNatResult] = Set.empty + + private def getQueryNatRole(obj: Object): QueryNatObject = { + //queryNatRoles.filter(+_ == +obj).foreach(return _) + queryNatRoles.foreach(q => { + if (+obj == +q) { + return q + } + }) + return null + } + + private def getQueryRelRole(obj: Object): QueryRelObject = { + //queryRelRoles.filter(+_ == +obj).foreach(return _) + queryRelRoles.foreach(q => { + if (+obj == +q) { + return q + } + }) + return null + } + + private def getNatResultRole(player: Object, queryObject: QueryNatObject): QueryNatResult = { + //queryNatResults.filter(r => r.connectedQueryObject == queryObject && +player == +r).foreach(return _) + queryNatResults.foreach(r => { + if (r.connectedQueryObject == queryObject && +player == +r) { + return r + } + }) + return null + } + + def generateModelJoinFromQuery(): String = { + val creator = new ModelJoinCreator + /*val start = queryNatRoles.head + val playerStart: Object = start.player.right.get + playerStart.getClass.getPackage.getName + playerStart.getClass.getSimpleName*/ + var relHelper: Set[ModelJoinContainer] = Set.empty + var relNames: Set[String] = Set.empty + var sources: Set[String] = Set.empty + var targets: Set[String] = Set.empty + + var names: Set[String] = Set.empty + var connected: Map[String, Object] = Map() + + queryNatRoles.foreach(q => { + val playerStart: Object = q.player.right.get + println(playerStart.getClass.getName) + names += playerStart.getClass.getName + }) + queryRelRoles.foreach(q => { + val playerStart: Object = q.player.right.get + val playerSource: Object = q.source.player.right.get + val playerTarget: Object = q.target.player.right.get + println("+" + playerStart.getClass.getName) + println(playerSource.getClass.getName) + println(playerTarget.getClass.getName) + if (!relNames.contains(playerStart.getClass.getName)) { + relNames += playerStart.getClass.getName + sources += playerSource.getClass.getName + targets += playerTarget.getClass.getName + relHelper += new ModelJoinContainer(playerStart.getClass.getName, playerSource.getClass.getName, playerTarget.getClass.getName) + if (!connected.contains(playerSource.getClass.getName)) { + connected += (playerSource.getClass.getName -> creator.createNaturalJoin(playerSource.getClass.getName)) + } + connected += (playerTarget.getClass.getName -> creator.createOutgoingReference(playerTarget.getClass.getName, playerStart.getClass.getSimpleName).asInstanceOf[Object]) + } + }) + + val start = sources.filter(!targets.contains(_)).head + val builder = creator.createNaturalJoin(start) + relHelper.filter(_.source == start).foreach(r => { + + }) + "" + } + + def deleteQueryResults(): Unit = { + queryRelResults.foreach(_.remove()) + queryRelResults = Set.empty + queryNatResults.foreach(_.remove()) + queryNatResults = Set.empty + } + + def deleteQueryObjects(): Unit = { + queryRelRoles.foreach(_.remove()) + queryRelRoles = Set.empty + queryNatRoles.foreach(_.remove()) + queryNatRoles = Set.empty + } + + def isQueryCorrect(): Boolean = { + //check if the query is correct and does not contain more close islands + queryRelRoles.foreach(qo => { + return qo.overallConnectionUnit() == (queryRelRoles.size + queryNatRoles.size) + }) + queryNatRoles.foreach(qo => { + return qo.overallConnectionUnit() == (queryRelRoles.size + queryNatRoles.size) + }) + return true + } + + def removeQueryRole(role: AQuery#QueryObject): Unit = { + if (role.isInstanceOf[QueryNatObject]) { + queryNatRoles -= role.asInstanceOf[QueryNatObject] + } + if (role.isInstanceOf[QueryRelObject]) { + queryRelRoles -= role.asInstanceOf[QueryRelObject] + } + } + + def addQueryRole(obj: Object): AQuery#QueryObject = { + val relResult = getQueryRelRole(obj) + if (relResult != null) return relResult + val natResult = getQueryNatRole(obj) + if (natResult != null) return natResult + //get player + val playerObj = obj.player.getOrElse(obj) + //difference between relation and natural + if (playerObj.isInstanceOf[IRelationCompartment]) { + val refComp = playerObj.asInstanceOf[IRelationCompartment] + this.combine(refComp) + val sourceRole: QueryNatObject = getQueryNatRole(refComp.getSource()) + val targetRole: QueryNatObject = getQueryNatRole(refComp.getTarget()) + if (sourceRole == null || targetRole == null) { + println("--- Error: Relational compartment can only be added if source and target are added before") + return null + } + val newRole = new QueryRelObject(sourceRole, targetRole) + queryRelRoles += newRole + playerObj play newRole + return newRole + } else { + val newRole = new QueryNatObject() + queryNatRoles += newRole + playerObj play newRole + return newRole + } + } + + def runQuery(): Set[Set[Object]] = { + //delete at the end + var forDeletionQueryResults: Set[QueryNatResult] = Set.empty + //immediate values + var deleteNatResults: Set[QueryNatResult] = Set.empty + var doSomething = true + //output value + var result: Set[Set[Object]] = Set.empty + + //###add query results to all elements that can be results because of connection properties + //...iterate over non negated query relations and add result roles if necessary + queryRelRoles.filter(!_.isNegated()).foreach(queryRel => { + val playerQueryRel: IRelationCompartment = queryRel.player.right.get.asInstanceOf[IRelationCompartment] + RsumCompartment.getRelations().foreach(rsumRel => { + if (playerQueryRel.getClass.isInstance(rsumRel)) { + //search if their are existing results if not create new ones + val rsumNatSource: Object = rsumRel.getSource().player.right.get + val rsumNatTarget: Object = rsumRel.getTarget().player.right.get + var queryNatResultSource: QueryNatResult = getNatResultRole(rsumNatSource, queryRel.source) + if (queryNatResultSource == null) { + queryNatResultSource = new QueryNatResult(queryRel.source) + rsumNatSource play queryNatResultSource + queryNatResults += queryNatResultSource + } + var queryNatResultTarget: QueryNatResult = getNatResultRole(rsumNatTarget, queryRel.target) + if (queryNatResultTarget == null) { + queryNatResultTarget = new QueryNatResult(queryRel.target) + rsumNatTarget play queryNatResultTarget + queryNatResults += queryNatResultTarget + } + //connect them in a new relation result + val queryRelResult: QueryRelResult = new QueryRelResult(queryRel, queryNatResultSource, queryNatResultTarget, false) + rsumRel play queryRelResult + queryRelResults += queryRelResult + + //if transitive add new relation to separate list to add them at the end + if (queryRel.isTransitive) { + //set only source new because target must be old one, transitive query means always target same + queryNatResultSource = getNatResultRole(rsumNatSource, queryRel.target) + if (queryNatResultSource == null) { + queryNatResultSource = new QueryNatResult(queryRel.target) + rsumNatSource play queryNatResultSource + queryNatResults += queryNatResultSource + } + val transitiveQueryRelResult: QueryRelResult = new QueryRelResult(queryRel, queryNatResultSource, queryNatResultTarget, true) + rsumRel play transitiveQueryRelResult + queryRelResults += transitiveQueryRelResult + } + } + }) + }) + + //...iterate over negated related roles and search all opposite naturals that do not implement this rel + queryRelRoles.filter(_.isNegated()).foreach(queryRel => { + val playerQueryRel: IRelationCompartment = queryRel.player.right.get.asInstanceOf[IRelationCompartment] + var playerQueryNat: Object = null + if (queryRel.source.negated) { + playerQueryNat = playerQueryRel.getSource.player.right.get + } else { + playerQueryNat = playerQueryRel.getTarget.player.right.get + } + //source or target negated, search for negated class + RsumCompartment.getNaturals().foreach(rsumNat => { + if (playerQueryNat.getClass.isInstance(rsumNat)) + { + var goodElement: Boolean = true; + //filtered roles of the natural type + var roles: Set[IRelationRole] = Set.empty + if (queryRel.source.negated) { + roles = rsumNat.roles().filter(_.isInstanceOf[IRelationCompartment#ITarget]).toSet.asInstanceOf[Set[IRelationRole]] + } else { + roles = rsumNat.roles().filter(_.isInstanceOf[IRelationCompartment#ISource]).toSet.asInstanceOf[Set[IRelationRole]] + } + //if we find a role that works than we can not add this natural to the results + roles.foreach(r => { + val outerRelComp = r.getOuterCompartment() + //println("COMP: " + outerRelComp + " " + playerQueryRel + " " + playerQueryRel.getClass.isInstance(outerRelComp)) + if (playerQueryRel.getClass.isInstance(outerRelComp)) { + //we can not use this element + goodElement = false + } + }) + //if we do not find a compatible element in this natural role we can add it + if (goodElement) { + var queryNatRole: QueryNatObject = null + if (queryRel.source.negated) { + queryNatRole = queryRel.target + } else { + queryNatRole = queryRel.source + } + var queryNatResult: QueryNatResult = getNatResultRole(rsumNat, queryNatRole) + if (queryNatResult == null) { + queryNatResult = new QueryNatResult(queryNatRole) + rsumNat play queryNatResult + queryNatResults += queryNatResult + } + if (queryRel.source.negated) { + queryNatResult.increaseTargetNegated() + } else { + queryNatResult.increaseSourceNegated() + } + } + } + }) + }) + + //...iterate over all query naturals without a connection and add result roles if necessary + queryNatRoles.filter(_.connectionSize == 0).foreach(queryNat => { + //connected one are visited in the part before + val playerQueryNat: Object = queryNat.player.right.get + RsumCompartment.getNaturals().foreach(rsumNat => { + if (playerQueryNat.isInstanceOf[QueryHelper]) { + if (playerQueryNat.equals(rsumNat)) { + var queryNatResult: QueryNatResult = getNatResultRole(rsumNat, queryNat) + if (queryNatResult == null) { + queryNatResult = new QueryNatResult(queryNat) + rsumNat play queryNatResult + queryNatResults += queryNatResult + } + } + } else { + if (playerQueryNat.getClass.isInstance(rsumNat)) { + var queryNatResult: QueryNatResult = getNatResultRole(rsumNat, queryNat) + if (queryNatResult == null) { + queryNatResult = new QueryNatResult(queryNat) + rsumNat play queryNatResult + queryNatResults += queryNatResult + } + } + } + }) + }) + + //###proof correctness of results + //...proof attribute correctness once + queryNatResults.filter(!_.proofAttributes).foreach(deleteNatResults += _) + //delete them + deleteNatResults.foreach(queryResultNat => { + queryNatResults -= queryResultNat + forDeletionQueryResults += queryResultNat + queryResultNat.removeConnections() + }) + + //...proof the correctness of the query results and delete non correct ones + while (doSomething) { + deleteNatResults = Set.empty + //proof the connection correctness + queryNatResults.filter(!_.proofConnections).foreach(deleteNatResults += _) + + //do as long as everything is correct + doSomething = !deleteNatResults.isEmpty + //delete them + deleteNatResults.foreach(queryResultNat => { + queryNatResults -= queryResultNat + forDeletionQueryResults += queryResultNat + queryResultNat.removeConnections() + }) + } + + //###make good outputs from the current query results + //...only correct elements should now play result roles and are in the list + var combinedResult: Set[QueryCombinedResult] = queryRelResults.filter(!_.transitive).map(_.createCombinedResult()) + + //...combine the result elements to good output units + doSomething = true + while (doSomething) { + doSomething = false + combinedResult.foreach(combined => { + queryRelResults.foreach(rel => { + if (rel.source == combined.target && !combined.contains(rel.target)) { + //add in the back + combined.addBack(rel.target) + doSomething = true + } else { + if (rel.target == combined.source && !combined.contains(rel.source)) { + //add in the front + combined.addFront(rel.source) + doSomething = true + } + } + }) + }) + //delete duplicated elements + combinedResult = combinedResult.groupBy(_.getBetween).map(_._2.head).toSet + //combinedResult.distinct + } + + //create only results with tuples + /*queryRelResults.foreach(rel => { + var rSet: Set[Object] = Set.empty + if (rel.source.connectedQueryObject.returned) { + rSet += rel.source.player.right.get + } + if (rel.target.connectedQueryObject.returned) { + rSet += rel.target.player.right.get + } + result += rSet + })*/ + + //...bring the output format to the reals one + combinedResult.foreach(combined => { + var rSet: Set[Object] = Set.empty + combined.getBetween.foreach(queryNat => { + if (queryNat.connectedQueryObject.returned) { + rSet += queryNat.player.right.get + } + }) + result += rSet + }) + + //...add also single results + queryNatResults.foreach(queryResultNat => { + if (!queryResultNat.isConnected() && queryResultNat.connectedQueryObject.returned) { + result += Set(queryResultNat.player.right.get) + } + }) + + //...delete now really all not needed result roles + forDeletionQueryResults.foreach(_.remove()) + + return result + } + + override def toString(): String = name + ": " + isQueryCorrect + " Rs: " + queryNatRoles + " " + queryRelRoles + + /** + * Query object specialized for naturals in the RSUM. + */ + class QueryNatObject() extends QueryObject() { + private var sourceRelations: Set[QueryRelObject] = Set.empty + private var targetRelations: Set[QueryRelObject] = Set.empty + + def addSourceRelation(rel: QueryRelObject): Unit = { + sourceRelations += rel + } + + def removeSourceRelation(rel: QueryRelObject): Unit = { + sourceRelations -= rel + } + + def getSourceRelationsSize(): Int = sourceRelations.filter(!_.isNegated()).map(_.multiTarget).sum //sum up multi value not use size + def getNegatedSourceRelationsSize(): Int = sourceRelations.filter(_.isNegated()).size + + def addTargetRelation(rel: QueryRelObject): Unit = { + targetRelations += rel + } + + def removeTargetRelation(rel: QueryRelObject): Unit = { + targetRelations -= rel + } + + def getTargetRelationsSize(): Int = targetRelations.filter(!_.isNegated()).map(_.multiSource).sum + def getNegatedTargetRelationsSize(): Int = targetRelations.filter(_.isNegated()).size + + def connectionSize(): Int = targetRelations.size + sourceRelations.size + + def overallConnectionUnit(): Int = { + var visitedRel: Set[QueryRelObject] = Set.empty + var visitedNat: Set[QueryNatObject] = Set(this) + var unVisitedRel: Set[QueryRelObject] = targetRelations ++ sourceRelations + var unVisitedNat: Set[QueryNatObject] = Set.empty + while (!unVisitedRel.isEmpty || !unVisitedNat.isEmpty) { + //run over all unvisited relations + unVisitedRel.foreach(rel => { + if (!visitedNat.contains(rel.source)) + unVisitedNat += rel.source + if (!visitedNat.contains(rel.target)) + unVisitedNat += rel.target + }) + visitedRel ++= unVisitedRel + unVisitedRel = Set.empty + //run over all unvisited naturals + unVisitedNat.foreach(nat => { + nat.sourceRelations.filter(!visitedRel.contains(_)).foreach(unVisitedRel += _) + nat.targetRelations.filter(!visitedRel.contains(_)).foreach(unVisitedRel += _) + }) + visitedNat ++= unVisitedNat + unVisitedNat = Set.empty + } + return visitedRel.size + visitedNat.size + } + + override def toString: String = "QON: " + label + " C: " + connectionSize + } + + /** + * Query object specialized for relational compartments in the RSUM. + */ + class QueryRelObject(val source: QueryNatObject, val target: QueryNatObject) extends QueryObject() { + + def isNegated(): Boolean = source.negated || target.negated + def isTransitive(): Boolean = target.transitive + def multiTarget(): Int = target.multi + def multiSource(): Int = source.multi + + source.addSourceRelation(this) + target.addTargetRelation(this) + + def overallConnectionUnit(): Int = source.overallConnectionUnit() + + override def toString: String = "QOR: " + source.label + "-" + target.label + } + + /** + * Query result roles for natural query roles. + */ + class QueryNatResult(val connectedQueryObject: QueryNatObject) extends QueryResult(connectedQueryObject) { + private var sourceRelations: Set[QueryRelResult] = Set.empty + private var targetRelations: Set[QueryRelResult] = Set.empty + + private var negatedSources: Int = 0 + private var negatedTargets: Int = 0 + + def increaseSourceNegated(): Unit = { negatedSources += 1 } + def decreaseSourceNegated(): Unit = { negatedSources -= 1 } + + def increaseTargetNegated(): Unit = { negatedTargets += 1 } + def decreaseTargetNegated(): Unit = { negatedTargets -= 1 } + + /** + * Proof if the player has all the necessary attributes with its values. + */ + def proofAttributes(): Boolean = { + val player: Object = this.player.right.get + var returnValue = true + connectedQueryObject.getAttributeFilters.foreach(a => { + try { + //player.getClass.getMethods.foreach(f => println(f.toString)) + //println(player.getClass.getMethod("name").getReturnType) //getName + val met = player.getClass.getMethod(a.attributeName) + val result: String = met.invoke(player).asInstanceOf[String] + a.checking match { + case CheckingOption.equalsCheck => if (result != a.value) returnValue = false + case CheckingOption.biggerThan => if (result <= a.value) returnValue = false + case CheckingOption.smallerThan => if (result >= a.value) returnValue = false + case _ => + } + } catch { + case _: Throwable => { + println("!!! No attribute with this name!!!") + return false + } + } + }) + return returnValue + } + + /** + * Proof if the number of connections is equals to the related query object. + */ + def proofConnections(): Boolean = { + //TODO: proof also the number of types and not only the numbers + //println("S: " + _connectedQueryObject.getSourceRelationsSize() + " T: " + _connectedQueryObject.getTargetRelationsSize() + " NS: " + _connectedQueryObject.getNegatedSourceRelationsSize() + " NT: " + _connectedQueryObject.getNegatedTargetRelationsSize() + " Con: " + _connectedQueryObject) + //println("S: " + getSourceRelationsSize() + " T: " + getTargetRelationsSize() + " NS: " + negatedSources + " NT: " + negatedTargets + " This: " + this) + if (getSourceRelationsSize >= connectedQueryObject.getSourceRelationsSize() + && getTargetRelationsSize >= connectedQueryObject.getTargetRelationsSize() + && negatedSources >= connectedQueryObject.getNegatedSourceRelationsSize() + && negatedTargets >= connectedQueryObject.getNegatedTargetRelationsSize()) { + return true + } + return false + } + + def addSourceRelation(rel: QueryRelResult): Unit = { + sourceRelations += rel + } + + def removeSourceRelation(rel: QueryRelResult): Unit = { + sourceRelations -= rel + } + + def getSourceRelationsSize(): Int = sourceRelations.size + + def addTargetRelation(rel: QueryRelResult): Unit = { + targetRelations += rel + } + + def removeTargetRelation(rel: QueryRelResult): Unit = { + targetRelations -= rel + } + + def getTargetRelationsSize(): Int = targetRelations.size + + def isConnected(): Boolean = (targetRelations.size + sourceRelations.size) > 0 + + def removeConnections(): Unit = { + sourceRelations.foreach(rel => { + rel.target.removeTargetRelation(rel) + queryRelResults -= rel + rel.remove() + }) + targetRelations.foreach(rel => { + rel.source.removeSourceRelation(rel) + queryRelResults -= rel + rel.remove() + }) + sourceRelations = Set.empty + targetRelations = Set.empty + negatedSources = 0 + negatedTargets = 0 + } + } + + /** + * Query result roles for relation query roles. + */ + class QueryRelResult(val connectedQueryObject: QueryRelObject, val source: QueryNatResult, val target: QueryNatResult, val transitive: Boolean) extends QueryResult(connectedQueryObject) { + //only add this relation to the connect results if it is not transitive + if (!transitive) { + source.addSourceRelation(this) + target.addTargetRelation(this) + } + + /** + * Create a new combined result which is a copy of this one. + */ + def createCombinedResult(): QueryCombinedResult = new QueryCombinedResult(source, target) + } + + /** + * Helper class to connect the results to a chain. + */ + class QueryCombinedResult(var source: QueryNatResult, var target: QueryNatResult) { + + //list of all query results that are connected + private var between: Seq[QueryNatResult] = Seq(source, target) + + def getBetween(): Seq[QueryNatResult] = between + + def addFront(newIn: QueryNatResult): Unit = { + between = newIn +: between + source = newIn + } + + def addBack(newIn: QueryNatResult): Unit = { + between = between :+ newIn + target = newIn + } + + def contains(result: QueryNatResult): Boolean = ( between.contains(result) ) + + private def getSize(): Int = between.size + + protected def canEqual(other: Any): Boolean = other.isInstanceOf[QueryCombinedResult] + + override def equals(other: Any): Boolean = other match { + case that: QueryCombinedResult => { + if (that canEqual this) { + between.foreach(b => { + if (!that.contains(b)) + return false + }) + return that.getSize == this.getSize() + } else { + return false + } + } + case _ => return false + } + + override def toString(): String = "QCR: (" + between + ")" + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/query/QueryHelper.scala b/src/main/scala/org/rosi_project/model_management/sum/query/QueryHelper.scala new file mode 100644 index 0000000..496be48 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/query/QueryHelper.scala @@ -0,0 +1,5 @@ +package org.rosi_project.model_management.sum.query + +trait QueryHelper { + +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/roles/IExtensionRole.scala b/src/main/scala/org/rosi_project/model_management/sum/roles/IExtensionRole.scala new file mode 100644 index 0000000..ed7738f --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/roles/IExtensionRole.scala @@ -0,0 +1,6 @@ +package org.rosi_project.model_management.sum.roles + +trait IExtensionRole extends IRsumRole { + + def runExtension() : Unit +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/roles/IRelationRole.scala b/src/main/scala/org/rosi_project/model_management/sum/roles/IRelationRole.scala new file mode 100644 index 0000000..20e4c62 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/roles/IRelationRole.scala @@ -0,0 +1,9 @@ +package org.rosi_project.model_management.sum.roles + +import org.rosi_project.model_management.sum.compartments.IRelationCompartment + +trait IRelationRole extends IRsumRole { + + //TODO: look if this method needs different visibility + def getOuterCompartment() : IRelationCompartment +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/roles/IRsumRole.scala b/src/main/scala/org/rosi_project/model_management/sum/roles/IRsumRole.scala new file mode 100644 index 0000000..e0a13d0 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/roles/IRsumRole.scala @@ -0,0 +1,6 @@ +package org.rosi_project.model_management.sum.roles + +trait IRsumRole { + + private[model_management] def removeRole(): Unit +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sum/roles/IViewRole.scala b/src/main/scala/org/rosi_project/model_management/sum/roles/IViewRole.scala new file mode 100644 index 0000000..73093fc --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sum/roles/IViewRole.scala @@ -0,0 +1,5 @@ +package org.rosi_project.model_management.sum.roles + +trait IViewRole extends IRsumRole { + +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala new file mode 100644 index 0000000..9fd3371 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/IConstructionCompartment.scala @@ -0,0 +1,161 @@ +package org.rosi_project.model_management.sync + +import scroll.internal.Compartment + +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. + */ +trait IConstructionCompartment extends Compartment { + + /** + * Return a role instance that handles the construction process for the object. + */ + def getConstructorForClassName(classname: Object): IConstructor + + def getRuleName: String + + private def addExtensionRoles(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + if (cc.isConstructed) { + SynchronizationCompartment.getExtensions().foreach { e => + var role = e.getExtensionForClassName(cc.getPlayerInstance()) + if (role != null) { + cc.getManagerInstance() play role + } + } + } + } + } + + private def notifyExtensionRoles(containers: Set[ConstructionContainer]): Unit = { + if (!SynchronizationCompartment.getExtensions().isEmpty) { + containers.foreach { cc => + if (cc.isConstructed) { + var playerInstance = cc.getPlayerInstance() + +playerInstance insertNotification () + } + } + } + } + + /** + * Add the RoleManager roles from the synchronization compartment if necessary + */ + protected def addManagerRoles(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + if (cc.isConstructed && !cc.isStartElement) { + cc.getPlayerInstance play cc.getManagerInstance + } + } + } + + /** + * Add the delete roles for the elements in the ConstructionContainers. + */ + protected def addDeleteRoles(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + if (cc.isConstructed) { + cc.getManagerInstance() play SynchronizationCompartment.getDestructionRule().getDestructorForClassName(cc.getPlayerInstance()) + } + } + } + + /** + * Add the related RoleManagers for the elements in the ConstructionContainers. + */ + protected def addRelatedRoleManager(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + containers.foreach { inner => + cc.getManagerInstance.addRelatedManager(inner.getManagerInstance) + } + } + } + + /** + * Combine the SynchronizationCompartment with all Players from the ConstructionContainers. + */ + protected def synchronizeCompartments(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + if (cc.isConstructed() && !cc.isStartElement()) { + SynchronizationCompartment combine cc.getPlayerInstance + } + } + } + + /** + * Create the Synchronization mechanisms for the elements in the ConstructionContainers. + */ + protected def bindSynchronizationRules(containers: Set[ConstructionContainer]): Unit = { + SynchronizationCompartment.getSyncRules().foreach { s => + var sync: ISyncCompartment = null + //Proof all container for integration + containers.foreach { cc => + if (s.isNextIntegration(cc.getPlayerInstance)) { + if (cc.isConstructed && sync == null) { + sync = s.getNewInstance + } + if (sync != null) { + cc.getManagerInstance() play sync.getNextIntegrationRole(cc.getPlayerInstance()) + } + } + } + if (sync != null) + SynchronizationCompartment combine sync + } + } + + /** + * Fill the test lists with all Players from the ConstructionContainers. + */ + protected def fillTestLists(containers: Set[ConstructionContainer]): Unit = { + containers.foreach { cc => + ModelElementLists.addElement(cc.getPlayerInstance) + } + } + + 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) + //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() + println("1: " + (t2 - t1)) + println("2: " + (t3 - t2)) + println("3: " + (t4 - t3)) + println("4: " + (t5 - t4)) + println("5: " + (t6 - t5)) + println("6: " + (t7 - t6)) + println("7: " + (t8 - t7))*/ + + /*println("Construction ++++++++++++++++++++++++++++++++++++++++++++------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++") + containers.foreach { cc => + println((cc.getPlayerInstance).roles()) + } + println("Construction ++++++++++++++++++++++++++++++++++++++++++++------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++")*/ + } + +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/IDestructionCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/IDestructionCompartment.scala new file mode 100644 index 0000000..4034957 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/IDestructionCompartment.scala @@ -0,0 +1,18 @@ +package org.rosi_project.model_management.sync + +import org.rosi_project.model_management.sync.roles.IDestructor +import scroll.internal.Compartment + +/** + * Interface for each destruction rule. + */ +trait IDestructionCompartment extends Compartment { + + /** + * Return a role instance that handles the destruction process for the object. + */ + def getDestructorForClassName(classname: Object) : IDestructor + + def getRuleName: String + +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/IExtenstionCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/IExtenstionCompartment.scala new file mode 100644 index 0000000..ffa94fa --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/IExtenstionCompartment.scala @@ -0,0 +1,20 @@ +package org.rosi_project.model_management.sync + +import org.rosi_project.model_management.sync.roles.IExtension +import scroll.internal.Compartment + +/** + * Interface for each extension rule. + */ +trait IExtenstionCompartment extends Compartment { + + /** + * Return a role instance that handles the extension process for the object. + */ + def getExtensionForClassName(classname: Object) : IExtension + + /** + * Return a unique name that describes this extension. + */ + def getExtensionName() : String +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala new file mode 100644 index 0000000..6ab5927 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/IIntegrationCompartment.scala @@ -0,0 +1,198 @@ +package org.rosi_project.model_management.sync + +import scroll.internal.Compartment +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 +import org.rosi_project.model_management.core._ +import org.rosi_project.model_management.sync.roles.IRoleManager + +/** + * Interface for each integration rule. + */ +trait IIntegrationCompartment extends Compartment { + + /** + * Return a role instance that handles the integration process for a new model to this instance. + */ + def getIntegratorForClassName(classname: Object): IIntegrator + + /** + * Return a role instance that handles the integration process for a new relational compartment. + */ + def getRelationalIntegratorsForClassName(classname: Object): IIntegrator + + def finalEditFunction(): Unit + + protected def connectTargetElementWithSourceElementes(target: PlayerSync, sourceList: Set[PlayerSync]): Unit = { + var containers: Set[IntegrationContainer] = Set.empty + //Create Containers + sourceList.foreach(e => { + containers += new IntegrationContainer(target, e) + }) + //Finish Creation + makeCompleteIntegrationProcess(containers) + } + + protected def connectTargetElementWithSourceElemente(target: PlayerSync, source: PlayerSync): Unit = { + var containers: Set[IntegrationContainer] = Set.empty + //Create Container + containers += new IntegrationContainer(target, source) + //Finish Creation + makeCompleteIntegrationProcess(containers) + } + + private def addExtensionRoles(containers: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + SynchronizationCompartment.getExtensions().foreach { e => + var role = e.getExtensionForClassName(cc.getNewPlayerInstance()) + if (role != null) { + cc.getNewManagerInstance() play role + } + } + } + } + + 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: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + cc.getNewPlayerInstance() play cc.getNewManagerInstance() + } + } + + /** + * Add the delete roles for the elements in the IntegrationContainer. + */ + private def addDeleteRoles(containers: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + cc.getNewManagerInstance() play SynchronizationCompartment.getDestructionRule().getDestructorForClassName(cc.getNewPlayerInstance()) + } + } + + /** + * Add the related RoleManagers for the elements in the IntegrationContainer. + */ + private def addRelatedRoleManager(containers: Set[IntegrationContainer]): Unit = { + containers.foreach { cc => + val oldPlayer = cc.getOldPlayerInstance() + if (cc.simpleRelatedManagerConnection) { + val manager: IRoleManager = +oldPlayer getManager () + if (manager != null) { + manager.makeRelated(cc.getNewManagerInstance()) + } + } else { + val allManager: Set[IRoleManager] = +oldPlayer getAllManager () + if (allManager != null) { + allManager.foreach { r => + r.makeRelated(cc.getNewManagerInstance()) + } + } + } + } + } + + /** + * Combine the SynchronizationCompartment with all Players from the IntegrationContainer. + */ + private def synchronizeCompartments(containers: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + SynchronizationCompartment combine cc.getNewPlayerInstance() + } + } + + /** + * Create the Synchronization mechanisms for the elements in the IntegrationContainer. + */ + private def bindSynchronizationRules(containers: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + val oldPlayer = cc.getOldPlayerInstance() + val allManager: Set[IRoleManager] = +oldPlayer getAllManager () + if (allManager != null) { + allManager.foreach { rm => + val roles = rm.roles() + //println("Player: " + rm.player + "Roles: " + roles) + roles.foreach { r => + if (r.isInstanceOf[ISyncRole]) { + val syncRole: ISyncRole = r.asInstanceOf[ISyncRole] + val syncComp: ISyncCompartment = syncRole.getOuterCompartment + //println("+~~~Sync: " + syncRole + " " + syncComp) + if (!syncComp.containsSyncer(cc.getNewPlayerInstance()) && syncComp.isFirstIntegration(r.player.right.get)) { + val newRole = syncComp.getNextIntegrationRole(cc.getNewPlayerInstance()) + //println("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~New Role: " + newRole) + if (newRole != null) { + cc.getNewManagerInstance() play newRole + allManager.foreach { internalSync => + val playerSync = internalSync.player.right.get + if (syncComp.isNextIntegration(playerSync)) { + if (!syncComp.containsSyncer(playerSync)) { + internalSync play syncComp.getNextIntegrationRole(playerSync) + } + } + } + } + } + } + } + } + } + } + } + + /** + * Fill the test lists with all Players from the IntegrationContainer. + */ + private def fillTestLists(containers: Set[IntegrationContainer]): Unit = { + containers.filter(_.newManagerConnection).foreach { cc => + ModelElementLists.addElement(cc.getNewPlayerInstance()) + } + } + + /** + * Do the integration process automatically. + */ + protected def makeCompleteIntegrationProcess(containers: Set[IntegrationContainer]): Unit = { + containers.foreach(cc => { + if (cc.getNewManagerInstance() == null) { + val newPlayer = cc.getNewPlayerInstance() + val manager = +newPlayer getManager () + if (manager.isRight && manager.right.get != null) { + cc.newManagerConnection = false + cc.newManagerInstance = manager.right.get + } else { + cc.newManagerConnection = true + cc.newManagerInstance = SynchronizationCompartment.createRoleManager() + } + } + }) + + //add new role managers to the new players + this.addManagerRoles(containers) + //this.addDeleteRoles(containers) + this.addRelatedRoleManager(containers) + //combines the new compartments with the existing ones + this.synchronizeCompartments(containers) + this.bindSynchronizationRules(containers) + //add extension roles and notify them because of creation + this.addExtensionRoles(containers) + this.notifyExtensionRoles(containers) + //add the new model element to the elements list + this.fillTestLists(containers) + /*println("Integrate +++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++") + containers.foreach { cc => + println((cc.getNewPlayerInstance()).roles()) + println((cc.getOldPlayerInstance()).roles()) + } + println("Integrate ++++++++++++++++++++++++++++++++++++++++++++------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++")*/ + } +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala new file mode 100644 index 0000000..4b50e08 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/ISyncCompartment.scala @@ -0,0 +1,101 @@ +package org.rosi_project.model_management.sync + +import org.rosi_project.model_management.sync.roles.ISyncRole +import scroll.internal.Compartment + +import scala.collection.immutable.Set + +/** + * Interface for each synchronization rule. + */ +trait ISyncCompartment extends Compartment { + + /** + * Variable to proof if he is actual in a sync process. + */ + protected var doSync = false + /** + * All sync roles of this synchronization rule. + */ + private var syncer: Set[ISyncRole] = Set.empty + + /** + * Get roles for all integration classes. + */ + protected def getNextRole(classname: Object) : ISyncRole = { + getFirstRole(classname) + } + + /** + * Get roles for integration classes. Should give less roles than getNextRole. + */ + protected def getFirstRole(classname: Object) : ISyncRole + + def containsSyncer(value: Object): Boolean = { + syncer.foreach { s => + if (+s == +value) { + //if (s.player.equals(value.player)) { + return true; + } + } + return false + } + + def addSyncer(sync: ISyncRole): Unit = { + syncer += sync + } + + /** + * Get the list of all sync roles. + */ + def getSyncer(): Set[ISyncRole] = syncer + + /** + * Clear the list of all sync roles. + */ + def clearSyncer(): Unit = { + syncer = Set.empty + } + + /** + * Get roles for integration classes. Should give less roles than getNextRole. + */ + def getFirstIntegrationRole(classname: Object) : ISyncRole = { + val role: ISyncRole = this.getFirstRole(classname) + if (role != null) + this.addSyncer(role) + role + } + + /** + * Get all roles for integration classes. + */ + def getNextIntegrationRole(classname: Object) : ISyncRole = { + val role: ISyncRole = this.getNextRole(classname) + if (role != null) + this.addSyncer(role) + role + } + + /** + * Get roles for all integration classes. + */ + def isFirstIntegration(classname: Object): Boolean + + /** + * Get boolean if next integration + */ + def isNextIntegration(classname: Object): Boolean = { + isFirstIntegration(classname) + } + + /** + * Create a new instance of this class. + */ + def getNewInstance: ISyncCompartment + + /** + * Get the name of this rule. + */ + def getRuleName: String +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/ISynchronizationCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/ISynchronizationCompartment.scala new file mode 100644 index 0000000..367abac --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/ISynchronizationCompartment.scala @@ -0,0 +1,22 @@ +package org.rosi_project.model_management.sync + +import org.rosi_project.model_management.sync.roles.IRoleManager +import scroll.internal.MultiCompartment + +/** + * Interface for the synchronization management compartment. + */ +trait ISynchronizationCompartment extends MultiCompartment { + + protected var underConstruction: Boolean = false + + /** + * Is currently in a process where new elements could be created. + */ + def isUnderConstruction(): Boolean = underConstruction + + /** + * Get a new RoleManager instance. + */ + def createRoleManager(): IRoleManager +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala b/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala new file mode 100644 index 0000000..b9a0db9 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/compartments/GeneralDestructor.scala @@ -0,0 +1,73 @@ +package org.rosi_project.model_management.sync.compartments + +import org.rosi_project.model_management.core.PlayerSync +import org.rosi_project.model_management.sync.IDestructionCompartment +import org.rosi_project.model_management.sync.roles.{ IDestructor, IRoleManager } + +import scala.collection.mutable.ListBuffer +import org.rosi_project.model_management.core.ModelElementLists + +/** + * Calls the destruction method from all related RoleManagers and then deletes all roles from this player. + */ +object GeneralDestructor extends IDestructionCompartment { + + override def getDestructorForClassName(classname: Object): IDestructor = new DeleteRole + + override def getRuleName: String = "GeneralDestructor" + + class DeleteRole() extends IDestructor { + + def deleteRoleFunction(): Unit = { + //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 + (+this).clearRelatedManager() + //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() + } + } + } + } +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/compartments/ModelElementsListGCExtension.scala b/src/main/scala/org/rosi_project/model_management/sync/compartments/ModelElementsListGCExtension.scala new file mode 100644 index 0000000..1bba7d4 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/compartments/ModelElementsListGCExtension.scala @@ -0,0 +1,58 @@ +package org.rosi_project.model_management.sync.compartments + +import org.rosi_project.model_management.core.ModelElementLists +import org.rosi_project.model_management.sync.IExtenstionCompartment +import org.rosi_project.model_management.sync.roles.IExtension +import scroll.internal.errors.SCROLLErrors.TypeError + +/** Extension to delete instances which are removed from the synchronization context from the + * [[ModelElementLists]]. This extension therefore functions as some kind of garbage collector, + * hence the name. + * + * @author Rico Bergmann + */ +object ModelElementsListGCExtension extends IExtenstionCompartment { + + /** + * Return a role instance that handles the extension process for the object. + */ + override def getExtensionForClassName(classname: Object): IExtension = new GarbageCollector + + /** + * Return a unique name that describes this extension. + */ + override def getExtensionName(): String = "ModelElementsList GarbageCollector" + + /** The actual extension. + */ + class GarbageCollector extends IExtension { + + /** + * Function to react on insertion behavior. + */ + override def notifyInsertion(): Unit = { + ; + } + + /** + * Function to react on deletion behavior. + */ + override def notifyDeletion(): Unit = { + val player: Either[TypeError, AnyRef] = this.player + + player.right.foreach { obj => + println(s"Removing $obj") + ModelElementLists.removeElement(obj) + } + + } + + /** + * Function to react on update behavior. + */ + override def notifyUpdate(): Unit = { + ; + } + } + +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala b/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala new file mode 100644 index 0000000..987002f --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/compartments/SuppressingConstructionCompartment.scala @@ -0,0 +1,30 @@ +package org.rosi_project.model_management.sync.compartments + +import org.rosi_project.model_management.core.{PlayerSync, SynchronizationCompartment} +import org.rosi_project.model_management.sync.IConstructionCompartment +import org.rosi_project.model_management.sync.roles.{IConstructor, IRoleManager} + +/** An [[IConstructionCompartment]] which will not create any related instances in other models + * + * @author Rico Bergmann + */ +object SuppressingConstructionCompartment extends IConstructionCompartment { + + override def getConstructorForClassName(classname: Object): IConstructor = new Suppressor + + override def getRuleName: String = "SuppressingConstructionCompartment" + + /** The constructor will only create the necessary `plays` relationships with the synchronization + * services + */ + 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) + } + + } + +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/helper/ConstructionContainer.scala b/src/main/scala/org/rosi_project/model_management/sync/helper/ConstructionContainer.scala new file mode 100644 index 0000000..55ebd19 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/helper/ConstructionContainer.scala @@ -0,0 +1,29 @@ +package org.rosi_project.model_management.sync.helper + +import org.rosi_project.model_management.sync.roles.IRoleManager +import org.rosi_project.model_management.core.PlayerSync + +/** + * Helper class for all construction processes to manage standard work loads. + */ +class ConstructionContainer(val startElement: Boolean, val constructed: Boolean, val player: PlayerSync, val manager: IRoleManager) { + /** + * Returns true if it is the start construction element. + */ + def isStartElement(): Boolean = startElement + + /** + * Return true if it is new constructed. + */ + def isConstructed(): Boolean = constructed + + /** + * Get the PlayerSync instance of this element. + */ + def getPlayerInstance(): PlayerSync = player + + /** + * Get the RoleManager instance of this element + */ + def getManagerInstance(): IRoleManager = manager +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/helper/IntegrationContainer.scala b/src/main/scala/org/rosi_project/model_management/sync/helper/IntegrationContainer.scala new file mode 100644 index 0000000..3237c18 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/helper/IntegrationContainer.scala @@ -0,0 +1,29 @@ +package org.rosi_project.model_management.sync.helper + +import org.rosi_project.model_management.sync.roles.IRoleManager +import org.rosi_project.model_management.core.PlayerSync + +/** + * Helper class for all integration processes to manage standard work loads. + */ +class IntegrationContainer (val newPlayerInstance: PlayerSync, val oldPlayerInstance: PlayerSync) { + + var simpleRelatedManagerConnection: Boolean = true + var newManagerConnection: Boolean = true + var newManagerInstance: IRoleManager = null + + /** + * Get the new PlayerSync instance of this element. + */ + def getNewPlayerInstance(): PlayerSync = newPlayerInstance + + /** + * Get the new RoleManager instance of this element + */ + def getNewManagerInstance(): IRoleManager = newManagerInstance + + /** + * Get the old PlayerSync instance of this element. + */ + def getOldPlayerInstance(): PlayerSync = oldPlayerInstance +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala new file mode 100644 index 0000000..dcfacf1 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/IConstructor.scala @@ -0,0 +1,29 @@ +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 + +/** + * Interface for the constructor roles. + */ +trait IConstructor { + + /** + * Container list for the construction process. + */ + protected var containers: Set[ConstructionContainer] = Set.empty + + /** + * Create a container element with the incoming configuration. + */ + protected def createContainerElement(start: Boolean, con: Boolean, play: PlayerSync, man: IRoleManager): Unit = { + if (play == null) + return + containers += new ConstructionContainer(start, con, play, man) + } + + /** + * General construction function for external call. + */ + def construct(comp: PlayerSync, man: IRoleManager): Unit +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/IDestructor.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/IDestructor.scala new file mode 100644 index 0000000..dd979c8 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/IDestructor.scala @@ -0,0 +1,12 @@ +package org.rosi_project.model_management.sync.roles + +/** + * Interface for the destructor roles. + */ +trait IDestructor { + + /** + * General destruction function for external call. + */ + def deleteRoleFunction(): Unit +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/IExtension.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/IExtension.scala new file mode 100644 index 0000000..95363b5 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/IExtension.scala @@ -0,0 +1,22 @@ +package org.rosi_project.model_management.sync.roles + +/** + * Interface for the extension roles. + */ +trait IExtension { + + /** + * Function to react on insertion behavior. + */ + def notifyInsertion(): Unit + + /** + * Function to react on deletion behavior. + */ + def notifyDeletion(): Unit + + /** + * Function to react on update behavior. + */ + def notifyUpdate(): Unit +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala new file mode 100644 index 0000000..33336c0 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/IIntegrator.scala @@ -0,0 +1,30 @@ +package org.rosi_project.model_management.sync.roles + +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 + +/** + * Interface for the integration roles. + */ +trait IIntegrator { + + /** + * Container list for the integration process. + */ + protected var containers: Set[IntegrationContainer] = Set.empty + + /** + * Create a container element with the incoming configuration. + */ + protected def createContainerElement(newPlayer: PlayerSync, oldPlayer: PlayerSync): Unit = { + if (newPlayer == null || oldPlayer == null) + return + containers += new IntegrationContainer(newPlayer, oldPlayer) + } + + /** + * General integration function for external call. + */ + def integrate(comp: PlayerSync) : PlayerSync +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala new file mode 100644 index 0000000..fa466ee --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/IRoleManager.scala @@ -0,0 +1,103 @@ +package org.rosi_project.model_management.sync.roles + +import org.rosi_project.model_management.core.PlayerSync + +import scala.collection.mutable.ListBuffer + +/** + * Interface for the manager roles. + */ +trait IRoleManager { + + private var relatedManager: Set[IRoleManager] = Set.empty + + /** + * Add a related manager to the list. + */ + def addRelatedManager(related: IRoleManager): Unit = { + if (related == null || related.equals(this)) + return + relatedManager += related + } + + /** + * Get the list of related managers. + */ + def getRelatedManager(): Set[IRoleManager] = relatedManager + + /** + * Get this manager. + */ + def getManager(): IRoleManager = this + + /** + * Get this manager plus related manager. + */ + def getAllManager(): Set[IRoleManager] = relatedManager + this + + /** + * 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. + */ + def removeThisManager(): Unit = { + relatedManager.foreach { m => + m.removeRelatedManager(this) + } + } + + /** + * Clear the lists of all related managers, + */ + def clearListsOfRelatedManager(): Unit = { + relatedManager.foreach { m => + m.clearRelatedManager() + } + } + + /** + * Clear the list of this role manager. + */ + def clearRelatedManager(): Unit = { + relatedManager = Set.empty + } + + /** + * 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 + + /** + * Create a relation between two IRoleManager and RoleManager of other PlayerSync instances. + */ + def makePlayerSyncRelated(playerSync: PlayerSync): Unit + + /** + * Print all Manager only for debug. + */ + def printAllManager(): Unit +} diff --git a/src/main/scala/org/rosi_project/model_management/sync/roles/ISyncRole.scala b/src/main/scala/org/rosi_project/model_management/sync/roles/ISyncRole.scala new file mode 100644 index 0000000..7682043 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_management/sync/roles/ISyncRole.scala @@ -0,0 +1,14 @@ +package org.rosi_project.model_management.sync.roles + +import org.rosi_project.model_management.sync.ISyncCompartment + +/** + * Interface for the synchronization roles. + */ +trait ISyncRole { + + /** + * Function to get the synchronization compartment from a role instance. + */ + def getOuterCompartment: ISyncCompartment +} diff --git a/src/main/scala/query/AMLLanguageQuery.scala b/src/main/scala/query/AMLLanguageQuery.scala new file mode 100644 index 0000000..a13b9fb --- /dev/null +++ b/src/main/scala/query/AMLLanguageQuery.scala @@ -0,0 +1,446 @@ +package query + +import aml.SystemUnitClassInternalElementsInternalElement +import aml.InternalElement +import aml.SystemUnitClassAttributesAttribute +import aml.CAEXObject +import aml.Attribute +import org.rosi_project.model_management.sum.query.IQueryViewCompartment +import aml.InstanceHierarchyInternalElementsInternalElement +import aml.InternalElementBaseSystemUnitSystemUnitClass +import aml.HelperCAEXObject +import aml.InstanceHierarchy +import org.rosi_project.model_management.sum.query.CheckingOption +import aml.SystemUnitClass + +class AMLLanguageQuery extends IQueryViewCompartment { + + init("AMLLanguageQuery") + + def createSystemUnitClass(): AMLLanguageQuery#SystemUnitClassRole = { + return new SystemUnitClassRole() + } + + def createInternalElement(): AMLLanguageQuery#InternalElementRole = { + return new InternalElementRole() + } + + def createCAEXObject(): AMLLanguageQuery#CAEXObjectRole = { + return new CAEXObjectRole() + } + + def createAttribute(): AMLLanguageQuery#AttributeRole = { + return new AttributeRole() + } + + def createInstanceHierarchy(): AMLLanguageQuery#InstanceHierarchyRole = { + return new InstanceHierarchyRole() + } + + override def toString(): String = { + "AMLLanguageQuery:" + } + + class SystemUnitClassRole extends CAEXObjectRole() { + + private var internalElements: Set[AMLLanguageQuery#SystemUnitClassInternalElementsInternalElementRole] = Set.empty + private var attributes: Set[AMLLanguageQuery#SystemUnitClassAttributesAttributeRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new SystemUnitClass(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + internalElements.foreach(_.deleteElement()) + attributes.foreach(_.deleteElement()) + } + + private[AMLLanguageQuery] def removeInternalElementsIntern(v: AMLLanguageQuery#SystemUnitClassInternalElementsInternalElementRole): Unit = { + internalElements -= v + } + + private[AMLLanguageQuery] def setInternalElementsIntern(v: AMLLanguageQuery#SystemUnitClassInternalElementsInternalElementRole): Unit = { + internalElements += v + } + + def getInternalElements(): Set[AMLLanguageQuery#InternalElementRole] = { + var vs: Set[AMLLanguageQuery#InternalElementRole] = Set.empty + internalElements.foreach { v => vs += v.getTarget() } + return vs + } + + def hasInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + return getInternalElements.contains(v) + } + + def addInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + if (hasInternalElements(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new SystemUnitClassInternalElementsInternalElementRole(this, v) + return true + } + + def removeInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + if (!hasInternalElements(v)) return false + internalElements.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[AMLLanguageQuery] def removeAttributesIntern(v: AMLLanguageQuery#SystemUnitClassAttributesAttributeRole): Unit = { + attributes -= v + } + + private[AMLLanguageQuery] def setAttributesIntern(v: AMLLanguageQuery#SystemUnitClassAttributesAttributeRole): Unit = { + attributes += v + } + + def getAttributes(): Set[AMLLanguageQuery#AttributeRole] = { + var vs: Set[AMLLanguageQuery#AttributeRole] = Set.empty + attributes.foreach { v => vs += v.getTarget() } + return vs + } + + def hasAttributes(v: AMLLanguageQuery#AttributeRole): Boolean = { + return getAttributes.contains(v) + } + + def addAttributes(v: AMLLanguageQuery#AttributeRole): Boolean = { + if (hasAttributes(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new SystemUnitClassAttributesAttributeRole(this, v) + return true + } + + def removeAttributes(v: AMLLanguageQuery#AttributeRole): Boolean = { + if (!hasAttributes(v)) return false + attributes.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "SystemUnitClassRole:" + } + + } + + class AttributeRole extends CAEXObjectRole() { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Attribute(null, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getValueView(): String = { + +this getValue () + } + + def setValueView(value: String, check: CheckingOption.Value): Unit = { + +this setValue (value) + connected.addAttributeFilter("value", value.toString(), check) + } + + override def toString(): String = { + "AttributeRole:" + } + + } + + class InstanceHierarchyRole extends CAEXObjectRole() { + + private var internalElements: Set[AMLLanguageQuery#InstanceHierarchyInternalElementsInternalElementRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new InstanceHierarchy(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + internalElements.foreach(_.deleteElement()) + } + + private[AMLLanguageQuery] def removeInternalElementsIntern(v: AMLLanguageQuery#InstanceHierarchyInternalElementsInternalElementRole): Unit = { + internalElements -= v + } + + private[AMLLanguageQuery] def setInternalElementsIntern(v: AMLLanguageQuery#InstanceHierarchyInternalElementsInternalElementRole): Unit = { + internalElements += v + } + + def getInternalElements(): Set[AMLLanguageQuery#InternalElementRole] = { + var vs: Set[AMLLanguageQuery#InternalElementRole] = Set.empty + internalElements.foreach { v => vs += v.getTarget() } + return vs + } + + def hasInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + return getInternalElements.contains(v) + } + + def addInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + if (hasInternalElements(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new InstanceHierarchyInternalElementsInternalElementRole(this, v) + return true + } + + def removeInternalElements(v: AMLLanguageQuery#InternalElementRole): Boolean = { + if (!hasInternalElements(v)) return false + internalElements.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "InstanceHierarchyRole:" + } + + } + + class CAEXObjectRole extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new HelperCAEXObject(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + def getIdView(): String = { + +this getId () + } + + def setIdView(id: String, check: CheckingOption.Value): Unit = { + +this setId (id) + connected.addAttributeFilter("id", id.toString(), check) + } + + override def toString(): String = { + "CAEXObjectRole:" + } + + } + + class InternalElementRole extends SystemUnitClassRole() { + + private var baseSystemUnit: AMLLanguageQuery#InternalElementBaseSystemUnitSystemUnitClassRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new InternalElement(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (baseSystemUnit != null) baseSystemUnit.deleteElement() + } + + private[AMLLanguageQuery] def removeBaseSystemUnitIntern(v: AMLLanguageQuery#InternalElementBaseSystemUnitSystemUnitClassRole): Unit = { + baseSystemUnit = null + } + + private[AMLLanguageQuery] def setBaseSystemUnitIntern(v: AMLLanguageQuery#InternalElementBaseSystemUnitSystemUnitClassRole): Unit = { + baseSystemUnit = v + } + + def getBaseSystemUnit(): AMLLanguageQuery#SystemUnitClassRole = { + return baseSystemUnit.getTarget() + } + + def setBaseSystemUnit(v: AMLLanguageQuery#SystemUnitClassRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (baseSystemUnit != null) { + if (baseSystemUnit.getTarget() == v) return false + baseSystemUnit.deleteElement() + } + new InternalElementBaseSystemUnitSystemUnitClassRole(this, v) + return true + } + + override def toString(): String = { + "InternalElementRole:" + } + + } + + class SystemUnitClassInternalElementsInternalElementRole(private val source: AMLLanguageQuery#SystemUnitClassRole, private val target: AMLLanguageQuery#InternalElementRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setInternalElementsIntern(this) + val sp: SystemUnitClass = source.player.right.get.asInstanceOf[SystemUnitClass] + val tp: InternalElement = target.player.right.get.asInstanceOf[InternalElement] + val v: SystemUnitClassInternalElementsInternalElement = new SystemUnitClassInternalElementsInternalElement(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeInternalElementsIntern(this) + super.deleteElement() + } + + def getSource(): AMLLanguageQuery#SystemUnitClassRole = { + source + } + + def getTarget(): AMLLanguageQuery#InternalElementRole = { + target + } + + override def toString(): String = { + "SystemUnitClassInternalElementsInternalElementRole:" + " source=" + source + " target=" + target + } + + } + + class SystemUnitClassAttributesAttributeRole(private val source: AMLLanguageQuery#SystemUnitClassRole, private val target: AMLLanguageQuery#AttributeRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setAttributesIntern(this) + val sp: SystemUnitClass = source.player.right.get.asInstanceOf[SystemUnitClass] + val tp: Attribute = target.player.right.get.asInstanceOf[Attribute] + val v: SystemUnitClassAttributesAttribute = new SystemUnitClassAttributesAttribute(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAttributesIntern(this) + super.deleteElement() + } + + def getSource(): AMLLanguageQuery#SystemUnitClassRole = { + source + } + + def getTarget(): AMLLanguageQuery#AttributeRole = { + target + } + + override def toString(): String = { + "SystemUnitClassAttributesAttributeRole:" + " source=" + source + " target=" + target + } + + } + + class InstanceHierarchyInternalElementsInternalElementRole(private val source: AMLLanguageQuery#InstanceHierarchyRole, private val target: AMLLanguageQuery#InternalElementRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setInternalElementsIntern(this) + val sp: InstanceHierarchy = source.player.right.get.asInstanceOf[InstanceHierarchy] + val tp: InternalElement = target.player.right.get.asInstanceOf[InternalElement] + val v: InstanceHierarchyInternalElementsInternalElement = new InstanceHierarchyInternalElementsInternalElement(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeInternalElementsIntern(this) + super.deleteElement() + } + + def getSource(): AMLLanguageQuery#InstanceHierarchyRole = { + source + } + + def getTarget(): AMLLanguageQuery#InternalElementRole = { + target + } + + override def toString(): String = { + "InstanceHierarchyInternalElementsInternalElementRole:" + " source=" + source + " target=" + target + } + + } + + class InternalElementBaseSystemUnitSystemUnitClassRole(private val source: AMLLanguageQuery#InternalElementRole, private val target: AMLLanguageQuery#SystemUnitClassRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBaseSystemUnitIntern(this) + val sp: InternalElement = source.player.right.get.asInstanceOf[InternalElement] + val tp: SystemUnitClass = target.player.right.get.asInstanceOf[SystemUnitClass] + val v: InternalElementBaseSystemUnitSystemUnitClass = new InternalElementBaseSystemUnitSystemUnitClass(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBaseSystemUnitIntern(this) + super.deleteElement() + } + + def getSource(): AMLLanguageQuery#InternalElementRole = { + source + } + + def getTarget(): AMLLanguageQuery#SystemUnitClassRole = { + target + } + + override def toString(): String = { + "InternalElementBaseSystemUnitSystemUnitClassRole:" + " source=" + source + " target=" + target + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/query/EclipseLibraryQuery.scala b/src/main/scala/query/EclipseLibraryQuery.scala new file mode 100644 index 0000000..344278b --- /dev/null +++ b/src/main/scala/query/EclipseLibraryQuery.scala @@ -0,0 +1,1274 @@ +package query + +import elib.BookAuthorWriter +import elib.BookCategory +import elib.BookOnTapeReaderPerson +import elib.Employee +import elib.LibraryBranchesLibrary +import elib.VideoCassette +import elib.BookOnTapeAuthorWriter +import elib.LibraryBooksBook +import elib.LibraryBorrowersBorrower +import elib.Borrower +import elib.LibraryParentBranchLibrary +import elib.Periodical +import elib.Writer +import elib.AudioVisualItem +import org.rosi_project.model_management.sum.query.IQueryViewCompartment +import elib.EmployeeManagerEmployee +import elib.Person +import java.util.Date +import elib.BookOnTape +import elib.VideoCassetteCastPerson +import org.rosi_project.model_management.sum.query.CheckingOption +import elib.Library +import elib.Book +import elib.LibraryWritersWriter +import elib.LibraryEmployeesEmployee +import elib.CirculatingItem +import elib.Item +import elib.LibraryStockItem + +class EclipseLibraryQuery extends IQueryViewCompartment { + + init("EclipseLibraryQuery") + + def createLibrary(): EclipseLibraryQuery#LibraryRole = { + return new LibraryRole() + } + + def createPeriodical(): EclipseLibraryQuery#PeriodicalRole = { + return new PeriodicalRole() + } + + def createPerson(): EclipseLibraryQuery#PersonRole = { + return new PersonRole() + } + + def createBorrower(): EclipseLibraryQuery#BorrowerRole = { + return new BorrowerRole() + } + + def createItem(): EclipseLibraryQuery#ItemRole = { + return new ItemRole() + } + + def createAudioVisualItem(): EclipseLibraryQuery#AudioVisualItemRole = { + return new AudioVisualItemRole() + } + + def createCirculatingItem(): EclipseLibraryQuery#CirculatingItemRole = { + return new CirculatingItemRole() + } + + def createBookOnTape(): EclipseLibraryQuery#BookOnTapeRole = { + return new BookOnTapeRole() + } + + def createVideoCassette(): EclipseLibraryQuery#VideoCassetteRole = { + return new VideoCassetteRole() + } + + def createBook(): EclipseLibraryQuery#BookRole = { + return new BookRole() + } + + def createWriter(): EclipseLibraryQuery#WriterRole = { + return new WriterRole() + } + + def createEmployee(): EclipseLibraryQuery#EmployeeRole = { + return new EmployeeRole() + } + + override def toString(): String = { + "EclipseLibraryQuery:" + } + + class ItemRole extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Item(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getPublicationDateView(): Date = { + +this getPublicationDate () + } + + def setPublicationDateView(publicationdate: Date, check: CheckingOption.Value): Unit = { + +this setPublicationDate (publicationdate) + connected.addAttributeFilter("publicationDate", publicationdate.toString(), check) + } + + override def toString(): String = { + "ItemRole:" + } + + } + + class EmployeeRole extends PersonRole() { + + private var manager: EclipseLibraryQuery#EmployeeManagerEmployeeRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (manager != null) manager.deleteElement() + } + + private[EclipseLibraryQuery] def removeManagerIntern(v: EclipseLibraryQuery#EmployeeManagerEmployeeRole): Unit = { + manager = null + } + + private[EclipseLibraryQuery] def setManagerIntern(v: EclipseLibraryQuery#EmployeeManagerEmployeeRole): Unit = { + manager = v + } + + def getManager(): EclipseLibraryQuery#EmployeeRole = { + return manager.getTarget() + } + + def setManager(v: EclipseLibraryQuery#EmployeeRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (manager != null) { + if (manager.getTarget() == v) return false + manager.deleteElement() + } + new EmployeeManagerEmployeeRole(this, v) + return true + } + + override def toString(): String = { + "EmployeeRole:" + } + + } + + class PeriodicalRole extends ItemRole() { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Periodical(0, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getIssuesPerYearView(): Int = { + +this getIssuesPerYear () + } + + def setIssuesPerYearView(issuesperyear: Int, check: CheckingOption.Value): Unit = { + +this setIssuesPerYear (issuesperyear) + connected.addAttributeFilter("issuesPerYear", issuesperyear.toString(), check) + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String, check: CheckingOption.Value): Unit = { + +this setTitle (title) + connected.addAttributeFilter("title", title.toString(), check) + } + + override def toString(): String = { + "PeriodicalRole:" + } + + } + + class VideoCassetteRole extends AudioVisualItemRole() { + + private var cast: Set[EclipseLibraryQuery#VideoCassetteCastPersonRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new VideoCassette(false, 0, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + cast.foreach(_.deleteElement()) + } + + private[EclipseLibraryQuery] def removeCastIntern(v: EclipseLibraryQuery#VideoCassetteCastPersonRole): Unit = { + cast -= v + } + + private[EclipseLibraryQuery] def setCastIntern(v: EclipseLibraryQuery#VideoCassetteCastPersonRole): Unit = { + cast += v + } + + def getCast(): Set[EclipseLibraryQuery#PersonRole] = { + var vs: Set[EclipseLibraryQuery#PersonRole] = Set.empty + cast.foreach { v => vs += v.getTarget() } + return vs + } + + def hasCast(v: EclipseLibraryQuery#PersonRole): Boolean = { + return getCast.contains(v) + } + + def addCast(v: EclipseLibraryQuery#PersonRole): Boolean = { + if (hasCast(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new VideoCassetteCastPersonRole(this, v) + return true + } + + def removeCast(v: EclipseLibraryQuery#PersonRole): Boolean = { + if (!hasCast(v)) return false + cast.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "VideoCassetteRole:" + } + + } + + class AudioVisualItemRole extends CirculatingItemRole() { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new AudioVisualItem(false, 0, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getDamagedView(): Boolean = { + +this getDamaged () + } + + def setDamagedView(damaged: Boolean, check: CheckingOption.Value): Unit = { + +this setDamaged (damaged) + connected.addAttributeFilter("damaged", damaged.toString(), check) + } + + def getMinutesLengthView(): Int = { + +this getMinutesLength () + } + + def setMinutesLengthView(minuteslength: Int, check: CheckingOption.Value): Unit = { + +this setMinutesLength (minuteslength) + connected.addAttributeFilter("minutesLength", minuteslength.toString(), check) + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String, check: CheckingOption.Value): Unit = { + +this setTitle (title) + connected.addAttributeFilter("title", title.toString(), check) + } + + override def toString(): String = { + "AudioVisualItemRole:" + } + + } + + class WriterRole extends PersonRole() { + + private var books: Set[EclipseLibraryQuery#BookAuthorWriterRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Writer(null, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + books.foreach(_.deleteElement()) + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + private[EclipseLibraryQuery] def removeBooksIntern(v: EclipseLibraryQuery#BookAuthorWriterRole): Unit = { + books -= v + } + + private[EclipseLibraryQuery] def setBooksIntern(v: EclipseLibraryQuery#BookAuthorWriterRole): Unit = { + books += v + } + + def getBooks(): Set[EclipseLibraryQuery#BookRole] = { + var vs: Set[EclipseLibraryQuery#BookRole] = Set.empty + books.foreach { v => vs += v.getSource() } + return vs + } + + def hasBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + return getBooks.contains(v) + } + + def addBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + if (hasBooks(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new BookAuthorWriterRole(v, this) + return true + } + + def removeBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + if (!hasBooks(v)) return false + books.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "WriterRole:" + } + + } + + class BookRole extends CirculatingItemRole() { + + private var author: EclipseLibraryQuery#BookAuthorWriterRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Book(null, 0, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (author != null) author.deleteElement() + } + + def getCategoryView(): BookCategory.Value = { + +this getCategory () + } + + def setCategoryView(category: BookCategory.Value, check: CheckingOption.Value): Unit = { + +this setCategory (category) + connected.addAttributeFilter("category", category.toString(), check) + } + + def getPagesView(): Int = { + +this getPages () + } + + def setPagesView(pages: Int, check: CheckingOption.Value): Unit = { + +this setPages (pages) + connected.addAttributeFilter("pages", pages.toString(), check) + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String, check: CheckingOption.Value): Unit = { + +this setTitle (title) + connected.addAttributeFilter("title", title.toString(), check) + } + + private[EclipseLibraryQuery] def removeAuthorIntern(v: EclipseLibraryQuery#BookAuthorWriterRole): Unit = { + author = null + } + + private[EclipseLibraryQuery] def setAuthorIntern(v: EclipseLibraryQuery#BookAuthorWriterRole): Unit = { + author = v + } + + def getAuthor(): EclipseLibraryQuery#WriterRole = { + return author.getTarget() + } + + def setAuthor(v: EclipseLibraryQuery#WriterRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (author != null) { + if (author.getTarget() == v) return false + author.deleteElement() + } + new BookAuthorWriterRole(this, v) + return true + } + + override def toString(): String = { + "BookRole:" + } + + } + + class LibraryRole extends AQueryViewRole { + + private var employees: Set[EclipseLibraryQuery#LibraryEmployeesEmployeeRole] = Set.empty + private var parentBranch: EclipseLibraryQuery#LibraryParentBranchLibraryRole = null + private var writers: Set[EclipseLibraryQuery#LibraryWritersWriterRole] = Set.empty + private var borrowers: Set[EclipseLibraryQuery#LibraryBorrowersBorrowerRole] = Set.empty + private var stock: Set[EclipseLibraryQuery#LibraryStockItemRole] = Set.empty + private var branches: Set[EclipseLibraryQuery#LibraryBranchesLibraryRole] = Set.empty + private var books: Set[EclipseLibraryQuery#LibraryBooksBookRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Library(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + employees.foreach(_.deleteElement()) + if (parentBranch != null) parentBranch.deleteElement() + writers.foreach(_.deleteElement()) + borrowers.foreach(_.deleteElement()) + stock.foreach(_.deleteElement()) + branches.foreach(_.deleteElement()) + books.foreach(_.deleteElement()) + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + private[EclipseLibraryQuery] def removeEmployeesIntern(v: EclipseLibraryQuery#LibraryEmployeesEmployeeRole): Unit = { + employees -= v + } + + private[EclipseLibraryQuery] def setEmployeesIntern(v: EclipseLibraryQuery#LibraryEmployeesEmployeeRole): Unit = { + employees += v + } + + def getEmployees(): Set[EclipseLibraryQuery#EmployeeRole] = { + var vs: Set[EclipseLibraryQuery#EmployeeRole] = Set.empty + employees.foreach { v => vs += v.getTarget() } + return vs + } + + def hasEmployees(v: EclipseLibraryQuery#EmployeeRole): Boolean = { + return getEmployees.contains(v) + } + + def addEmployees(v: EclipseLibraryQuery#EmployeeRole): Boolean = { + if (hasEmployees(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryEmployeesEmployeeRole(this, v) + return true + } + + def removeEmployees(v: EclipseLibraryQuery#EmployeeRole): Boolean = { + if (!hasEmployees(v)) return false + employees.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryQuery] def removeParentBranchIntern(v: EclipseLibraryQuery#LibraryParentBranchLibraryRole): Unit = { + parentBranch = null + } + + private[EclipseLibraryQuery] def setParentBranchIntern(v: EclipseLibraryQuery#LibraryParentBranchLibraryRole): Unit = { + parentBranch = v + } + + def getParentBranch(): EclipseLibraryQuery#LibraryRole = { + return parentBranch.getTarget() + } + + def setParentBranch(v: EclipseLibraryQuery#LibraryRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (parentBranch != null) { + if (parentBranch.getTarget() == v) return false + parentBranch.deleteElement() + } + new LibraryParentBranchLibraryRole(this, v) + return true + } + + private[EclipseLibraryQuery] def removeWritersIntern(v: EclipseLibraryQuery#LibraryWritersWriterRole): Unit = { + writers -= v + } + + private[EclipseLibraryQuery] def setWritersIntern(v: EclipseLibraryQuery#LibraryWritersWriterRole): Unit = { + writers += v + } + + def getWriters(): Set[EclipseLibraryQuery#WriterRole] = { + var vs: Set[EclipseLibraryQuery#WriterRole] = Set.empty + writers.foreach { v => vs += v.getTarget() } + return vs + } + + def hasWriters(v: EclipseLibraryQuery#WriterRole): Boolean = { + return getWriters.contains(v) + } + + def addWriters(v: EclipseLibraryQuery#WriterRole): Boolean = { + if (hasWriters(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryWritersWriterRole(this, v) + return true + } + + def removeWriters(v: EclipseLibraryQuery#WriterRole): Boolean = { + if (!hasWriters(v)) return false + writers.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryQuery] def removeBorrowersIntern(v: EclipseLibraryQuery#LibraryBorrowersBorrowerRole): Unit = { + borrowers -= v + } + + private[EclipseLibraryQuery] def setBorrowersIntern(v: EclipseLibraryQuery#LibraryBorrowersBorrowerRole): Unit = { + borrowers += v + } + + def getBorrowers(): Set[EclipseLibraryQuery#BorrowerRole] = { + var vs: Set[EclipseLibraryQuery#BorrowerRole] = Set.empty + borrowers.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBorrowers(v: EclipseLibraryQuery#BorrowerRole): Boolean = { + return getBorrowers.contains(v) + } + + def addBorrowers(v: EclipseLibraryQuery#BorrowerRole): Boolean = { + if (hasBorrowers(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryBorrowersBorrowerRole(this, v) + return true + } + + def removeBorrowers(v: EclipseLibraryQuery#BorrowerRole): Boolean = { + if (!hasBorrowers(v)) return false + borrowers.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryQuery] def removeStockIntern(v: EclipseLibraryQuery#LibraryStockItemRole): Unit = { + stock -= v + } + + private[EclipseLibraryQuery] def setStockIntern(v: EclipseLibraryQuery#LibraryStockItemRole): Unit = { + stock += v + } + + def getStock(): Set[EclipseLibraryQuery#ItemRole] = { + var vs: Set[EclipseLibraryQuery#ItemRole] = Set.empty + stock.foreach { v => vs += v.getTarget() } + return vs + } + + def hasStock(v: EclipseLibraryQuery#ItemRole): Boolean = { + return getStock.contains(v) + } + + def addStock(v: EclipseLibraryQuery#ItemRole): Boolean = { + if (hasStock(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryStockItemRole(this, v) + return true + } + + def removeStock(v: EclipseLibraryQuery#ItemRole): Boolean = { + if (!hasStock(v)) return false + stock.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryQuery] def removeBranchesIntern(v: EclipseLibraryQuery#LibraryBranchesLibraryRole): Unit = { + branches -= v + } + + private[EclipseLibraryQuery] def setBranchesIntern(v: EclipseLibraryQuery#LibraryBranchesLibraryRole): Unit = { + branches += v + } + + def getBranches(): Set[EclipseLibraryQuery#LibraryRole] = { + var vs: Set[EclipseLibraryQuery#LibraryRole] = Set.empty + branches.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBranches(v: EclipseLibraryQuery#LibraryRole): Boolean = { + return getBranches.contains(v) + } + + def addBranches(v: EclipseLibraryQuery#LibraryRole): Boolean = { + if (hasBranches(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryBranchesLibraryRole(this, v) + return true + } + + def removeBranches(v: EclipseLibraryQuery#LibraryRole): Boolean = { + if (!hasBranches(v)) return false + branches.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryQuery] def removeBooksIntern(v: EclipseLibraryQuery#LibraryBooksBookRole): Unit = { + books -= v + } + + private[EclipseLibraryQuery] def setBooksIntern(v: EclipseLibraryQuery#LibraryBooksBookRole): Unit = { + books += v + } + + def getBooks(): Set[EclipseLibraryQuery#BookRole] = { + var vs: Set[EclipseLibraryQuery#BookRole] = Set.empty + books.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + return getBooks.contains(v) + } + + def addBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + if (hasBooks(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryBooksBookRole(this, v) + return true + } + + def removeBooks(v: EclipseLibraryQuery#BookRole): Boolean = { + if (!hasBooks(v)) return false + books.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "LibraryRole:" + } + + } + + class BookOnTapeRole extends AudioVisualItemRole() { + + private var author: EclipseLibraryQuery#BookOnTapeAuthorWriterRole = null + private var reader: EclipseLibraryQuery#BookOnTapeReaderPersonRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new BookOnTape(false, 0, null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (author != null) author.deleteElement() + if (reader != null) reader.deleteElement() + } + + private[EclipseLibraryQuery] def removeAuthorIntern(v: EclipseLibraryQuery#BookOnTapeAuthorWriterRole): Unit = { + author = null + } + + private[EclipseLibraryQuery] def setAuthorIntern(v: EclipseLibraryQuery#BookOnTapeAuthorWriterRole): Unit = { + author = v + } + + def getAuthor(): EclipseLibraryQuery#WriterRole = { + return author.getTarget() + } + + def setAuthor(v: EclipseLibraryQuery#WriterRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (author != null) { + if (author.getTarget() == v) return false + author.deleteElement() + } + new BookOnTapeAuthorWriterRole(this, v) + return true + } + + private[EclipseLibraryQuery] def removeReaderIntern(v: EclipseLibraryQuery#BookOnTapeReaderPersonRole): Unit = { + reader = null + } + + private[EclipseLibraryQuery] def setReaderIntern(v: EclipseLibraryQuery#BookOnTapeReaderPersonRole): Unit = { + reader = v + } + + def getReader(): EclipseLibraryQuery#PersonRole = { + return reader.getTarget() + } + + def setReader(v: EclipseLibraryQuery#PersonRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (reader != null) { + if (reader.getTarget() == v) return false + reader.deleteElement() + } + new BookOnTapeReaderPersonRole(this, v) + return true + } + + override def toString(): String = { + "BookOnTapeRole:" + } + + } + + class CirculatingItemRole extends ItemRole() { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new CirculatingItem(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + override def toString(): String = { + "CirculatingItemRole:" + } + + } + + class BorrowerRole extends PersonRole() { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Borrower(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + override def toString(): String = { + "BorrowerRole:" + } + + } + + class PersonRole extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Person(null, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getLastNameView(): String = { + +this getLastName () + } + + def setLastNameView(lastname: String, check: CheckingOption.Value): Unit = { + +this setLastName (lastname) + connected.addAttributeFilter("lastName", lastname.toString(), check) + } + + def getFirstNameView(): String = { + +this getFirstName () + } + + def setFirstNameView(firstname: String, check: CheckingOption.Value): Unit = { + +this setFirstName (firstname) + connected.addAttributeFilter("firstName", firstname.toString(), check) + } + + override def toString(): String = { + "PersonRole:" + } + + } + + class LibraryEmployeesEmployeeRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#EmployeeRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setEmployeesIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Employee = target.player.right.get.asInstanceOf[Employee] + val v: LibraryEmployeesEmployee = new LibraryEmployeesEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeEmployeesIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#EmployeeRole = { + target + } + + override def toString(): String = { + "LibraryEmployeesEmployeeRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryParentBranchLibraryRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#LibraryRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setParentBranchIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Library = target.player.right.get.asInstanceOf[Library] + val v: LibraryParentBranchLibrary = new LibraryParentBranchLibrary(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeParentBranchIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#LibraryRole = { + target + } + + override def toString(): String = { + "LibraryParentBranchLibraryRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryWritersWriterRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#WriterRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setWritersIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Writer = target.player.right.get.asInstanceOf[Writer] + val v: LibraryWritersWriter = new LibraryWritersWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeWritersIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#WriterRole = { + target + } + + override def toString(): String = { + "LibraryWritersWriterRole:" + " source=" + source + " target=" + target + } + + } + + class BookOnTapeAuthorWriterRole(private val source: EclipseLibraryQuery#BookOnTapeRole, private val target: EclipseLibraryQuery#WriterRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setAuthorIntern(this) + val sp: BookOnTape = source.player.right.get.asInstanceOf[BookOnTape] + val tp: Writer = target.player.right.get.asInstanceOf[Writer] + val v: BookOnTapeAuthorWriter = new BookOnTapeAuthorWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAuthorIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#BookOnTapeRole = { + source + } + + def getTarget(): EclipseLibraryQuery#WriterRole = { + target + } + + override def toString(): String = { + "BookOnTapeAuthorWriterRole:" + " source=" + source + " target=" + target + } + + } + + class BookOnTapeReaderPersonRole(private val source: EclipseLibraryQuery#BookOnTapeRole, private val target: EclipseLibraryQuery#PersonRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setReaderIntern(this) + val sp: BookOnTape = source.player.right.get.asInstanceOf[BookOnTape] + val tp: Person = target.player.right.get.asInstanceOf[Person] + val v: BookOnTapeReaderPerson = new BookOnTapeReaderPerson(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeReaderIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#BookOnTapeRole = { + source + } + + def getTarget(): EclipseLibraryQuery#PersonRole = { + target + } + + override def toString(): String = { + "BookOnTapeReaderPersonRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryBorrowersBorrowerRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#BorrowerRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBorrowersIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Borrower = target.player.right.get.asInstanceOf[Borrower] + val v: LibraryBorrowersBorrower = new LibraryBorrowersBorrower(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBorrowersIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#BorrowerRole = { + target + } + + override def toString(): String = { + "LibraryBorrowersBorrowerRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryStockItemRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#ItemRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setStockIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Item = target.player.right.get.asInstanceOf[Item] + val v: LibraryStockItem = new LibraryStockItem(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeStockIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#ItemRole = { + target + } + + override def toString(): String = { + "LibraryStockItemRole:" + " source=" + source + " target=" + target + } + + } + + class BookAuthorWriterRole(private val source: EclipseLibraryQuery#BookRole, private val target: EclipseLibraryQuery#WriterRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setBooksIntern(this) + source.setAuthorIntern(this) + val sp: Book = source.player.right.get.asInstanceOf[Book] + val tp: Writer = target.player.right.get.asInstanceOf[Writer] + val v: BookAuthorWriter = new BookAuthorWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAuthorIntern(this) + target.removeBooksIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#BookRole = { + source + } + + def getTarget(): EclipseLibraryQuery#WriterRole = { + target + } + + override def toString(): String = { + "BookAuthorWriterRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryBranchesLibraryRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#LibraryRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBranchesIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Library = target.player.right.get.asInstanceOf[Library] + val v: LibraryBranchesLibrary = new LibraryBranchesLibrary(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBranchesIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#LibraryRole = { + target + } + + override def toString(): String = { + "LibraryBranchesLibraryRole:" + " source=" + source + " target=" + target + } + + } + + class VideoCassetteCastPersonRole(private val source: EclipseLibraryQuery#VideoCassetteRole, private val target: EclipseLibraryQuery#PersonRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setCastIntern(this) + val sp: VideoCassette = source.player.right.get.asInstanceOf[VideoCassette] + val tp: Person = target.player.right.get.asInstanceOf[Person] + val v: VideoCassetteCastPerson = new VideoCassetteCastPerson(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeCastIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#VideoCassetteRole = { + source + } + + def getTarget(): EclipseLibraryQuery#PersonRole = { + target + } + + override def toString(): String = { + "VideoCassetteCastPersonRole:" + " source=" + source + " target=" + target + } + + } + + class EmployeeManagerEmployeeRole(private val source: EclipseLibraryQuery#EmployeeRole, private val target: EclipseLibraryQuery#EmployeeRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setManagerIntern(this) + val sp: Employee = source.player.right.get.asInstanceOf[Employee] + val tp: Employee = target.player.right.get.asInstanceOf[Employee] + val v: EmployeeManagerEmployee = new EmployeeManagerEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeManagerIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#EmployeeRole = { + source + } + + def getTarget(): EclipseLibraryQuery#EmployeeRole = { + target + } + + override def toString(): String = { + "EmployeeManagerEmployeeRole:" + " source=" + source + " target=" + target + } + + } + + class LibraryBooksBookRole(private val source: EclipseLibraryQuery#LibraryRole, private val target: EclipseLibraryQuery#BookRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBooksIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Book = target.player.right.get.asInstanceOf[Book] + val v: LibraryBooksBook = new LibraryBooksBook(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBooksIntern(this) + super.deleteElement() + } + + def getSource(): EclipseLibraryQuery#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryQuery#BookRole = { + target + } + + override def toString(): String = { + "LibraryBooksBookRole:" + " source=" + source + " target=" + target + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/query/IMDBdatabaseQuery.scala b/src/main/scala/query/IMDBdatabaseQuery.scala new file mode 100644 index 0000000..12c15ee --- /dev/null +++ b/src/main/scala/query/IMDBdatabaseQuery.scala @@ -0,0 +1,1028 @@ +package query + +import imdbdatabase.User +import imdbdatabase.IMDBFilmsFilm +import imdbdatabase.FilmFiguresFigure +import imdbdatabase.VoteFilmFilm +import imdbdatabase.Film +import imdbdatabase.IMDBVotesVote +import imdbdatabase.VoteUserUser +import imdbdatabase.FigurePlayedByActor +import imdbdatabase.Person +import org.rosi_project.model_management.sum.query.IQueryViewCompartment +import imdbdatabase.IMDB +import imdbdatabase.Figure +import imdbdatabase.Actor +import org.rosi_project.model_management.sum.query.CheckingOption +import imdbdatabase.Vote +import imdbdatabase.IMDBUsersUser +import imdbdatabase.IMDBActorsActor + +class IMDBdatabaseQuery extends IQueryViewCompartment { + + init("IMDBdatabaseQuery") + + def createFigure(): IMDBdatabaseQuery#FigureRole = { + return new FigureRole() + } + + def createActor(): IMDBdatabaseQuery#ActorRole = { + return new ActorRole() + } + + def createPerson(): IMDBdatabaseQuery#PersonRole = { + return new PersonRole() + } + + def createUser(): IMDBdatabaseQuery#UserRole = { + return new UserRole() + } + + def createVote(): IMDBdatabaseQuery#VoteRole = { + return new VoteRole() + } + + def createIMDB(): IMDBdatabaseQuery#IMDBRole = { + return new IMDBRole() + } + + def createFilm(): IMDBdatabaseQuery#FilmRole = { + return new FilmRole() + } + + override def toString(): String = { + "IMDBdatabaseQuery:" + } + + class IMDBRole extends AQueryViewRole { + + private var users: Set[IMDBdatabaseQuery#IMDBUsersUserRole] = Set.empty + private var votes: Set[IMDBdatabaseQuery#IMDBVotesVoteRole] = Set.empty + private var actors: Set[IMDBdatabaseQuery#IMDBActorsActorRole] = Set.empty + private var films: Set[IMDBdatabaseQuery#IMDBFilmsFilmRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new IMDB() + } + + override def deleteElement(): Unit = { + super.deleteElement() + users.foreach(_.deleteElement()) + votes.foreach(_.deleteElement()) + actors.foreach(_.deleteElement()) + films.foreach(_.deleteElement()) + } + + private[IMDBdatabaseQuery] def removeUsersIntern(v: IMDBdatabaseQuery#IMDBUsersUserRole): Unit = { + users -= v + } + + private[IMDBdatabaseQuery] def setUsersIntern(v: IMDBdatabaseQuery#IMDBUsersUserRole): Unit = { + users += v + } + + def getUsers(): Set[IMDBdatabaseQuery#UserRole] = { + var vs: Set[IMDBdatabaseQuery#UserRole] = Set.empty + users.foreach { v => vs += v.getTarget() } + return vs + } + + def hasUsers(v: IMDBdatabaseQuery#UserRole): Boolean = { + return getUsers.contains(v) + } + + def addUsers(v: IMDBdatabaseQuery#UserRole): Boolean = { + if (hasUsers(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new IMDBUsersUserRole(this, v) + return true + } + + def removeUsers(v: IMDBdatabaseQuery#UserRole): Boolean = { + if (!hasUsers(v)) return false + users.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeVotesIntern(v: IMDBdatabaseQuery#IMDBVotesVoteRole): Unit = { + votes -= v + } + + private[IMDBdatabaseQuery] def setVotesIntern(v: IMDBdatabaseQuery#IMDBVotesVoteRole): Unit = { + votes += v + } + + def getVotes(): Set[IMDBdatabaseQuery#VoteRole] = { + var vs: Set[IMDBdatabaseQuery#VoteRole] = Set.empty + votes.foreach { v => vs += v.getTarget() } + return vs + } + + def hasVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + return getVotes.contains(v) + } + + def addVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + if (hasVotes(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new IMDBVotesVoteRole(this, v) + return true + } + + def removeVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + if (!hasVotes(v)) return false + votes.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeActorsIntern(v: IMDBdatabaseQuery#IMDBActorsActorRole): Unit = { + actors -= v + } + + private[IMDBdatabaseQuery] def setActorsIntern(v: IMDBdatabaseQuery#IMDBActorsActorRole): Unit = { + actors += v + } + + def getActors(): Set[IMDBdatabaseQuery#ActorRole] = { + var vs: Set[IMDBdatabaseQuery#ActorRole] = Set.empty + actors.foreach { v => vs += v.getTarget() } + return vs + } + + def hasActors(v: IMDBdatabaseQuery#ActorRole): Boolean = { + return getActors.contains(v) + } + + def addActors(v: IMDBdatabaseQuery#ActorRole): Boolean = { + if (hasActors(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new IMDBActorsActorRole(this, v) + return true + } + + def removeActors(v: IMDBdatabaseQuery#ActorRole): Boolean = { + if (!hasActors(v)) return false + actors.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeFilmsIntern(v: IMDBdatabaseQuery#IMDBFilmsFilmRole): Unit = { + films -= v + } + + private[IMDBdatabaseQuery] def setFilmsIntern(v: IMDBdatabaseQuery#IMDBFilmsFilmRole): Unit = { + films += v + } + + def getFilms(): Set[IMDBdatabaseQuery#FilmRole] = { + var vs: Set[IMDBdatabaseQuery#FilmRole] = Set.empty + films.foreach { v => vs += v.getTarget() } + return vs + } + + def hasFilms(v: IMDBdatabaseQuery#FilmRole): Boolean = { + return getFilms.contains(v) + } + + def addFilms(v: IMDBdatabaseQuery#FilmRole): Boolean = { + if (hasFilms(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new IMDBFilmsFilmRole(this, v) + return true + } + + def removeFilms(v: IMDBdatabaseQuery#FilmRole): Boolean = { + if (!hasFilms(v)) return false + films.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "IMDBRole:" + } + + } + + class FilmRole extends AQueryViewRole { + + private var library: IMDBdatabaseQuery#IMDBFilmsFilmRole = null + private var votes: Set[IMDBdatabaseQuery#VoteFilmFilmRole] = Set.empty + private var figures: Set[IMDBdatabaseQuery#FilmFiguresFigureRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Film(0, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (library != null) library.deleteElement() + votes.foreach(_.deleteElement()) + figures.foreach(_.deleteElement()) + } + + def getYearView(): Int = { + +this getYear () + } + + def setYearView(year: Int, check: CheckingOption.Value): Unit = { + +this setYear (year) + connected.addAttributeFilter("year", year.toString(), check) + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String, check: CheckingOption.Value): Unit = { + +this setTitle (title) + connected.addAttributeFilter("title", title.toString(), check) + } + + private[IMDBdatabaseQuery] def removeLibraryIntern(v: IMDBdatabaseQuery#IMDBFilmsFilmRole): Unit = { + library = null + } + + private[IMDBdatabaseQuery] def setLibraryIntern(v: IMDBdatabaseQuery#IMDBFilmsFilmRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseQuery#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseQuery#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBFilmsFilmRole(v, this) + return true + } + + private[IMDBdatabaseQuery] def removeVotesIntern(v: IMDBdatabaseQuery#VoteFilmFilmRole): Unit = { + votes -= v + } + + private[IMDBdatabaseQuery] def setVotesIntern(v: IMDBdatabaseQuery#VoteFilmFilmRole): Unit = { + votes += v + } + + def getVotes(): Set[IMDBdatabaseQuery#VoteRole] = { + var vs: Set[IMDBdatabaseQuery#VoteRole] = Set.empty + votes.foreach { v => vs += v.getSource() } + return vs + } + + def hasVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + return getVotes.contains(v) + } + + def addVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + if (hasVotes(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new VoteFilmFilmRole(v, this) + return true + } + + def removeVotes(v: IMDBdatabaseQuery#VoteRole): Boolean = { + if (!hasVotes(v)) return false + votes.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeFiguresIntern(v: IMDBdatabaseQuery#FilmFiguresFigureRole): Unit = { + figures -= v + } + + private[IMDBdatabaseQuery] def setFiguresIntern(v: IMDBdatabaseQuery#FilmFiguresFigureRole): Unit = { + figures += v + } + + def getFigures(): Set[IMDBdatabaseQuery#FigureRole] = { + var vs: Set[IMDBdatabaseQuery#FigureRole] = Set.empty + figures.foreach { v => vs += v.getTarget() } + return vs + } + + def hasFigures(v: IMDBdatabaseQuery#FigureRole): Boolean = { + return getFigures.contains(v) + } + + def addFigures(v: IMDBdatabaseQuery#FigureRole): Boolean = { + if (hasFigures(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new FilmFiguresFigureRole(this, v) + return true + } + + def removeFigures(v: IMDBdatabaseQuery#FigureRole): Boolean = { + if (!hasFigures(v)) return false + figures.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "FilmRole:" + } + + } + + class VoteRole extends AQueryViewRole { + + private var user: IMDBdatabaseQuery#VoteUserUserRole = null + private var library: IMDBdatabaseQuery#IMDBVotesVoteRole = null + private var film: IMDBdatabaseQuery#VoteFilmFilmRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Vote(0) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (user != null) user.deleteElement() + if (library != null) library.deleteElement() + if (film != null) film.deleteElement() + } + + def getScoreView(): Int = { + +this getScore () + } + + def setScoreView(score: Int, check: CheckingOption.Value): Unit = { + +this setScore (score) + connected.addAttributeFilter("score", score.toString(), check) + } + + private[IMDBdatabaseQuery] def removeUserIntern(v: IMDBdatabaseQuery#VoteUserUserRole): Unit = { + user = null + } + + private[IMDBdatabaseQuery] def setUserIntern(v: IMDBdatabaseQuery#VoteUserUserRole): Unit = { + user = v + } + + def getUser(): IMDBdatabaseQuery#UserRole = { + return user.getTarget() + } + + def setUser(v: IMDBdatabaseQuery#UserRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (user != null) { + if (user.getTarget() == v) return false + user.deleteElement() + } + new VoteUserUserRole(this, v) + return true + } + + private[IMDBdatabaseQuery] def removeLibraryIntern(v: IMDBdatabaseQuery#IMDBVotesVoteRole): Unit = { + library = null + } + + private[IMDBdatabaseQuery] def setLibraryIntern(v: IMDBdatabaseQuery#IMDBVotesVoteRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseQuery#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseQuery#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBVotesVoteRole(v, this) + return true + } + + private[IMDBdatabaseQuery] def removeFilmIntern(v: IMDBdatabaseQuery#VoteFilmFilmRole): Unit = { + film = null + } + + private[IMDBdatabaseQuery] def setFilmIntern(v: IMDBdatabaseQuery#VoteFilmFilmRole): Unit = { + film = v + } + + def getFilm(): IMDBdatabaseQuery#FilmRole = { + return film.getTarget() + } + + def setFilm(v: IMDBdatabaseQuery#FilmRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (film != null) { + if (film.getTarget() == v) return false + film.deleteElement() + } + new VoteFilmFilmRole(this, v) + return true + } + + override def toString(): String = { + "VoteRole:" + } + + } + + class ActorRole extends PersonRole() { + + private var plays: Set[IMDBdatabaseQuery#FigurePlayedByActorRole] = Set.empty + private var library: IMDBdatabaseQuery#IMDBActorsActorRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Actor(0, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + plays.foreach(_.deleteElement()) + if (library != null) library.deleteElement() + } + + private[IMDBdatabaseQuery] def removePlaysIntern(v: IMDBdatabaseQuery#FigurePlayedByActorRole): Unit = { + plays -= v + } + + private[IMDBdatabaseQuery] def setPlaysIntern(v: IMDBdatabaseQuery#FigurePlayedByActorRole): Unit = { + plays += v + } + + def getPlays(): Set[IMDBdatabaseQuery#FigureRole] = { + var vs: Set[IMDBdatabaseQuery#FigureRole] = Set.empty + plays.foreach { v => vs += v.getSource() } + return vs + } + + def hasPlays(v: IMDBdatabaseQuery#FigureRole): Boolean = { + return getPlays.contains(v) + } + + def addPlays(v: IMDBdatabaseQuery#FigureRole): Boolean = { + if (hasPlays(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new FigurePlayedByActorRole(v, this) + return true + } + + def removePlays(v: IMDBdatabaseQuery#FigureRole): Boolean = { + if (!hasPlays(v)) return false + plays.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeLibraryIntern(v: IMDBdatabaseQuery#IMDBActorsActorRole): Unit = { + library = null + } + + private[IMDBdatabaseQuery] def setLibraryIntern(v: IMDBdatabaseQuery#IMDBActorsActorRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseQuery#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseQuery#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBActorsActorRole(v, this) + return true + } + + override def toString(): String = { + "ActorRole:" + } + + } + + class PersonRole extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Person(0, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getDobView(): Double = { + +this getDob () + } + + def setDobView(dob: Double, check: CheckingOption.Value): Unit = { + +this setDob (dob) + connected.addAttributeFilter("dob", dob.toString(), check) + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + override def toString(): String = { + "PersonRole:" + } + + } + + class FigureRole extends AQueryViewRole { + + private var playedBy: Set[IMDBdatabaseQuery#FigurePlayedByActorRole] = Set.empty + private var film: IMDBdatabaseQuery#FilmFiguresFigureRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Figure(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + playedBy.foreach(_.deleteElement()) + if (film != null) film.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + private[IMDBdatabaseQuery] def removePlayedByIntern(v: IMDBdatabaseQuery#FigurePlayedByActorRole): Unit = { + playedBy -= v + } + + private[IMDBdatabaseQuery] def setPlayedByIntern(v: IMDBdatabaseQuery#FigurePlayedByActorRole): Unit = { + playedBy += v + } + + def getPlayedBy(): Set[IMDBdatabaseQuery#ActorRole] = { + var vs: Set[IMDBdatabaseQuery#ActorRole] = Set.empty + playedBy.foreach { v => vs += v.getTarget() } + return vs + } + + def hasPlayedBy(v: IMDBdatabaseQuery#ActorRole): Boolean = { + return getPlayedBy.contains(v) + } + + def addPlayedBy(v: IMDBdatabaseQuery#ActorRole): Boolean = { + if (hasPlayedBy(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new FigurePlayedByActorRole(this, v) + return true + } + + def removePlayedBy(v: IMDBdatabaseQuery#ActorRole): Boolean = { + if (!hasPlayedBy(v)) return false + playedBy.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseQuery] def removeFilmIntern(v: IMDBdatabaseQuery#FilmFiguresFigureRole): Unit = { + film = null + } + + private[IMDBdatabaseQuery] def setFilmIntern(v: IMDBdatabaseQuery#FilmFiguresFigureRole): Unit = { + film = v + } + + def getFilm(): IMDBdatabaseQuery#FilmRole = { + return film.getSource() + } + + def setFilm(v: IMDBdatabaseQuery#FilmRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (film != null) { + if (film.getSource() == v) return false + film.deleteElement() + } + new FilmFiguresFigureRole(v, this) + return true + } + + override def toString(): String = { + "FigureRole:" + } + + } + + class UserRole extends PersonRole() { + + private var library: IMDBdatabaseQuery#IMDBUsersUserRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new User(null, null, 0, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (library != null) library.deleteElement() + } + + def getEmailView(): String = { + +this getEmail () + } + + def setEmailView(email: String, check: CheckingOption.Value): Unit = { + +this setEmail (email) + connected.addAttributeFilter("email", email.toString(), check) + } + + def getUserNameView(): String = { + +this getUserName () + } + + def setUserNameView(username: String, check: CheckingOption.Value): Unit = { + +this setUserName (username) + connected.addAttributeFilter("userName", username.toString(), check) + } + + private[IMDBdatabaseQuery] def removeLibraryIntern(v: IMDBdatabaseQuery#IMDBUsersUserRole): Unit = { + library = null + } + + private[IMDBdatabaseQuery] def setLibraryIntern(v: IMDBdatabaseQuery#IMDBUsersUserRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseQuery#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseQuery#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBUsersUserRole(v, this) + return true + } + + override def toString(): String = { + "UserRole:" + } + + } + + class FigurePlayedByActorRole(private val source: IMDBdatabaseQuery#FigureRole, private val target: IMDBdatabaseQuery#ActorRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setPlaysIntern(this) + source.setPlayedByIntern(this) + val sp: Figure = source.player.right.get.asInstanceOf[Figure] + val tp: Actor = target.player.right.get.asInstanceOf[Actor] + val v: FigurePlayedByActor = new FigurePlayedByActor(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removePlayedByIntern(this) + target.removePlaysIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#FigureRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#ActorRole = { + target + } + + override def toString(): String = { + "FigurePlayedByActorRole:" + " source=" + source + " target=" + target + } + + } + + class VoteUserUserRole(private val source: IMDBdatabaseQuery#VoteRole, private val target: IMDBdatabaseQuery#UserRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setUserIntern(this) + val sp: Vote = source.player.right.get.asInstanceOf[Vote] + val tp: User = target.player.right.get.asInstanceOf[User] + val v: VoteUserUser = new VoteUserUser(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeUserIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#VoteRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#UserRole = { + target + } + + override def toString(): String = { + "VoteUserUserRole:" + " source=" + source + " target=" + target + } + + } + + class IMDBUsersUserRole(private val source: IMDBdatabaseQuery#IMDBRole, private val target: IMDBdatabaseQuery#UserRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setUsersIntern(this) + val sp: IMDB = source.player.right.get.asInstanceOf[IMDB] + val tp: User = target.player.right.get.asInstanceOf[User] + val v: IMDBUsersUser = new IMDBUsersUser(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeUsersIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#UserRole = { + target + } + + override def toString(): String = { + "IMDBUsersUserRole:" + " source=" + source + " target=" + target + } + + } + + class IMDBVotesVoteRole(private val source: IMDBdatabaseQuery#IMDBRole, private val target: IMDBdatabaseQuery#VoteRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setVotesIntern(this) + val sp: IMDB = source.player.right.get.asInstanceOf[IMDB] + val tp: Vote = target.player.right.get.asInstanceOf[Vote] + val v: IMDBVotesVote = new IMDBVotesVote(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeVotesIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#VoteRole = { + target + } + + override def toString(): String = { + "IMDBVotesVoteRole:" + " source=" + source + " target=" + target + } + + } + + class IMDBActorsActorRole(private val source: IMDBdatabaseQuery#IMDBRole, private val target: IMDBdatabaseQuery#ActorRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setActorsIntern(this) + val sp: IMDB = source.player.right.get.asInstanceOf[IMDB] + val tp: Actor = target.player.right.get.asInstanceOf[Actor] + val v: IMDBActorsActor = new IMDBActorsActor(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeActorsIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#ActorRole = { + target + } + + override def toString(): String = { + "IMDBActorsActorRole:" + " source=" + source + " target=" + target + } + + } + + class IMDBFilmsFilmRole(private val source: IMDBdatabaseQuery#IMDBRole, private val target: IMDBdatabaseQuery#FilmRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setFilmsIntern(this) + val sp: IMDB = source.player.right.get.asInstanceOf[IMDB] + val tp: Film = target.player.right.get.asInstanceOf[Film] + val v: IMDBFilmsFilm = new IMDBFilmsFilm(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFilmsIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#FilmRole = { + target + } + + override def toString(): String = { + "IMDBFilmsFilmRole:" + " source=" + source + " target=" + target + } + + } + + class VoteFilmFilmRole(private val source: IMDBdatabaseQuery#VoteRole, private val target: IMDBdatabaseQuery#FilmRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setVotesIntern(this) + source.setFilmIntern(this) + val sp: Vote = source.player.right.get.asInstanceOf[Vote] + val tp: Film = target.player.right.get.asInstanceOf[Film] + val v: VoteFilmFilm = new VoteFilmFilm(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFilmIntern(this) + target.removeVotesIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#VoteRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#FilmRole = { + target + } + + override def toString(): String = { + "VoteFilmFilmRole:" + " source=" + source + " target=" + target + } + + } + + class FilmFiguresFigureRole(private val source: IMDBdatabaseQuery#FilmRole, private val target: IMDBdatabaseQuery#FigureRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setFilmIntern(this) + source.setFiguresIntern(this) + val sp: Film = source.player.right.get.asInstanceOf[Film] + val tp: Figure = target.player.right.get.asInstanceOf[Figure] + val v: FilmFiguresFigure = new FilmFiguresFigure(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFiguresIntern(this) + target.removeFilmIntern(this) + super.deleteElement() + } + + def getSource(): IMDBdatabaseQuery#FilmRole = { + source + } + + def getTarget(): IMDBdatabaseQuery#FigureRole = { + target + } + + override def toString(): String = { + "FilmFiguresFigureRole:" + " source=" + source + " target=" + target + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/query/LibraryQuery.scala b/src/main/scala/query/LibraryQuery.scala new file mode 100644 index 0000000..809b0f1 --- /dev/null +++ b/src/main/scala/query/LibraryQuery.scala @@ -0,0 +1,253 @@ +package query + +import lib.EmployeeManagerEmployee +import lib.Library +import lib.HelperPerson +import lib.Person +import lib.LibraryEmployeesEmployee +import org.rosi_project.model_management.sum.query.IQueryViewCompartment +import lib.Employee +import org.rosi_project.model_management.sum.query.CheckingOption + +class LibraryQuery extends IQueryViewCompartment { + + init("LibraryQuery") + + def createLibrary(): LibraryQuery#LibraryRole = { + return new LibraryRole() + } + + def createEmployee(): LibraryQuery#EmployeeRole = { + return new EmployeeRole() + } + + def createPerson(): LibraryQuery#PersonRole = { + return new PersonRole() + } + + override def toString(): String = { + "LibraryQuery:" + } + + class LibraryRole extends AQueryViewRole { + + private var employees: Set[LibraryQuery#LibraryEmployeesEmployeeRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Library(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + employees.foreach(_.deleteElement()) + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + private[LibraryQuery] def removeEmployeesIntern(v: LibraryQuery#LibraryEmployeesEmployeeRole): Unit = { + employees -= v + } + + private[LibraryQuery] def setEmployeesIntern(v: LibraryQuery#LibraryEmployeesEmployeeRole): Unit = { + employees += v + } + + def getEmployees(): Set[LibraryQuery#EmployeeRole] = { + var vs: Set[LibraryQuery#EmployeeRole] = Set.empty + employees.foreach { v => vs += v.getTarget() } + return vs + } + + def hasEmployees(v: LibraryQuery#EmployeeRole): Boolean = { + return getEmployees.contains(v) + } + + def addEmployees(v: LibraryQuery#EmployeeRole): Boolean = { + if (hasEmployees(v) || !containsRole(v.asInstanceOf[AQueryViewRole])) return false + new LibraryEmployeesEmployeeRole(this, v) + return true + } + + def removeEmployees(v: LibraryQuery#EmployeeRole): Boolean = { + if (!hasEmployees(v)) return false + employees.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override def toString(): String = { + "LibraryRole:" + } + + } + + class EmployeeRole extends PersonRole() { + + private var manager: LibraryQuery#EmployeeManagerEmployeeRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(0, null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + if (manager != null) manager.deleteElement() + } + + def getSalaryView(): Double = { + +this getSalary () + } + + def setSalaryView(salary: Double, check: CheckingOption.Value): Unit = { + +this setSalary (salary) + connected.addAttributeFilter("salary", salary.toString(), check) + } + + private[LibraryQuery] def removeManagerIntern(v: LibraryQuery#EmployeeManagerEmployeeRole): Unit = { + manager = null + } + + private[LibraryQuery] def setManagerIntern(v: LibraryQuery#EmployeeManagerEmployeeRole): Unit = { + manager = v + } + + def getManager(): LibraryQuery#EmployeeRole = { + return manager.getTarget() + } + + def setManager(v: LibraryQuery#EmployeeRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AQueryViewRole])) return false + if (manager != null) { + if (manager.getTarget() == v) return false + manager.deleteElement() + } + new EmployeeManagerEmployeeRole(this, v) + return true + } + + override def toString(): String = { + "EmployeeRole:" + } + + } + + class PersonRole extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new HelperPerson(null) + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String, check: CheckingOption.Value): Unit = { + +this setName (name) + connected.addAttributeFilter("name", name.toString(), check) + } + + override def toString(): String = { + "PersonRole:" + } + + } + + class LibraryEmployeesEmployeeRole(private val source: LibraryQuery#LibraryRole, private val target: LibraryQuery#EmployeeRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setEmployeesIntern(this) + val sp: Library = source.player.right.get.asInstanceOf[Library] + val tp: Employee = target.player.right.get.asInstanceOf[Employee] + val v: LibraryEmployeesEmployee = new LibraryEmployeesEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeEmployeesIntern(this) + super.deleteElement() + } + + def getSource(): LibraryQuery#LibraryRole = { + source + } + + def getTarget(): LibraryQuery#EmployeeRole = { + target + } + + override def toString(): String = { + "LibraryEmployeesEmployeeRole:" + " source=" + source + " target=" + target + } + + } + + class EmployeeManagerEmployeeRole(private val source: LibraryQuery#EmployeeRole, private val target: LibraryQuery#EmployeeRole) extends AQueryViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setManagerIntern(this) + val sp: Employee = source.player.right.get.asInstanceOf[Employee] + val tp: Employee = target.player.right.get.asInstanceOf[Employee] + val v: EmployeeManagerEmployee = new EmployeeManagerEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeManagerIntern(this) + super.deleteElement() + } + + def getSource(): LibraryQuery#EmployeeRole = { + source + } + + def getTarget(): LibraryQuery#EmployeeRole = { + target + } + + override def toString(): String = { + "EmployeeManagerEmployeeRole:" + " source=" + source + " target=" + target + } + + } + +} + + + + \ No newline at end of file diff --git a/src/main/scala/view/AMLLanguageView.scala b/src/main/scala/view/AMLLanguageView.scala new file mode 100644 index 0000000..0f923fb --- /dev/null +++ b/src/main/scala/view/AMLLanguageView.scala @@ -0,0 +1,463 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import aml.SystemUnitClassInternalElementsInternalElement +import aml.InternalElement +import aml.SystemUnitClassAttributesAttribute +import aml.CAEXObject +import aml.Attribute +import aml.InstanceHierarchyInternalElementsInternalElement +import aml.InternalElementBaseSystemUnitSystemUnitClass +import aml.InstanceHierarchy +import aml.SystemUnitClass +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class AMLLanguageView private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[SystemUnitClassInternalElementsInternalElement] || className.isInstanceOf[InternalElementBaseSystemUnitSystemUnitClass] || className.isInstanceOf[InstanceHierarchyInternalElementsInternalElement] || className.isInstanceOf[SystemUnitClass] || className.isInstanceOf[SystemUnitClassAttributesAttribute] || className.isInstanceOf[InstanceHierarchy] || className.isInstanceOf[Attribute] || className.isInstanceOf[InternalElement]) return true + return false + } + + def getViewName(): String = { + AMLLanguageView.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[SystemUnitClass]) return new SystemUnitClassRole(null, null) + if (className.isInstanceOf[InternalElement]) return new InternalElementRole(null, null) + if (className.isInstanceOf[Attribute]) return new AttributeRole(null, null, null) + if (className.isInstanceOf[InstanceHierarchy]) return new InstanceHierarchyRole(null, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[SystemUnitClassInternalElementsInternalElement]) return new SystemUnitClassInternalElementsInternalElementRole(sourceRole.asInstanceOf[SystemUnitClassRole], targetRole.asInstanceOf[InternalElementRole]) + if (className.isInstanceOf[SystemUnitClassAttributesAttribute]) return new SystemUnitClassAttributesAttributeRole(sourceRole.asInstanceOf[SystemUnitClassRole], targetRole.asInstanceOf[AttributeRole]) + if (className.isInstanceOf[InstanceHierarchyInternalElementsInternalElement]) return new InstanceHierarchyInternalElementsInternalElementRole(sourceRole.asInstanceOf[InstanceHierarchyRole], targetRole.asInstanceOf[InternalElementRole]) + if (className.isInstanceOf[InternalElementBaseSystemUnitSystemUnitClass]) return new InternalElementBaseSystemUnitSystemUnitClassRole(sourceRole.asInstanceOf[InternalElementRole], targetRole.asInstanceOf[SystemUnitClassRole]) + return null + } + + override def toString(): String = { + "VC: AMLLanguageView" + } + + def createSystemUnitClass(name: String, id: String): AMLLanguageView#SystemUnitClassRole = { + return new SystemUnitClassRole(name, id) + } + + def createInternalElement(name: String, id: String): AMLLanguageView#InternalElementRole = { + return new InternalElementRole(name, id) + } + + def createAttribute(value: String, name: String, id: String): AMLLanguageView#AttributeRole = { + return new AttributeRole(value, name, id) + } + + def createInstanceHierarchy(name: String, id: String): AMLLanguageView#InstanceHierarchyRole = { + return new InstanceHierarchyRole(name, id) + } + + class SystemUnitClassRole(c_Name: String, c_Id: String) extends CAEXObjectRole(c_Name, c_Id) { + + private var internalElements: Set[AMLLanguageView#SystemUnitClassInternalElementsInternalElementRole] = Set.empty + private var attributes: Set[AMLLanguageView#SystemUnitClassAttributesAttributeRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new SystemUnitClass(name, id) + } + + override def toString(): String = { + "VNR: SystemUnitClassRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[AMLLanguageView] def removeInternalElementsIntern(v: AMLLanguageView#SystemUnitClassInternalElementsInternalElementRole): Unit = { + internalElements -= v + } + + private[AMLLanguageView] def setInternalElementsIntern(v: AMLLanguageView#SystemUnitClassInternalElementsInternalElementRole): Unit = { + internalElements += v + } + + def getInternalElements(): Set[AMLLanguageView#InternalElementRole] = { + var vs: Set[AMLLanguageView#InternalElementRole] = Set.empty + internalElements.foreach { v => vs += v.getTarget() } + return vs + } + + def hasInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + return getInternalElements.contains(v) + } + + def addInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + if (hasInternalElements(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new SystemUnitClassInternalElementsInternalElementRole(this, v) + return true + } + + def removeInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + if (!hasInternalElements(v)) return false + internalElements.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[AMLLanguageView] def removeAttributesIntern(v: AMLLanguageView#SystemUnitClassAttributesAttributeRole): Unit = { + attributes -= v + } + + private[AMLLanguageView] def setAttributesIntern(v: AMLLanguageView#SystemUnitClassAttributesAttributeRole): Unit = { + attributes += v + } + + def getAttributes(): Set[AMLLanguageView#AttributeRole] = { + var vs: Set[AMLLanguageView#AttributeRole] = Set.empty + attributes.foreach { v => vs += v.getTarget() } + return vs + } + + def hasAttributes(v: AMLLanguageView#AttributeRole): Boolean = { + return getAttributes.contains(v) + } + + def addAttributes(v: AMLLanguageView#AttributeRole): Boolean = { + if (hasAttributes(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new SystemUnitClassAttributesAttributeRole(this, v) + return true + } + + def removeAttributes(v: AMLLanguageView#AttributeRole): Boolean = { + if (!hasAttributes(v)) return false + attributes.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class AttributeRole(protected val value: String, c_Name: String, c_Id: String) extends CAEXObjectRole(c_Name, c_Id) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Attribute(value, name, id) + } + + override def toString(): String = { + "VNR: AttributeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getValueView(): String = { + +this getValue () + } + + def setValueView(value: String): Unit = { + +this setValue (value) + +this changeSomething () + } + + } + + class InstanceHierarchyRole(c_Name: String, c_Id: String) extends CAEXObjectRole(c_Name, c_Id) { + + private var internalElements: Set[AMLLanguageView#InstanceHierarchyInternalElementsInternalElementRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new InstanceHierarchy(name, id) + } + + override def toString(): String = { + "VNR: InstanceHierarchyRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[AMLLanguageView] def removeInternalElementsIntern(v: AMLLanguageView#InstanceHierarchyInternalElementsInternalElementRole): Unit = { + internalElements -= v + } + + private[AMLLanguageView] def setInternalElementsIntern(v: AMLLanguageView#InstanceHierarchyInternalElementsInternalElementRole): Unit = { + internalElements += v + } + + def getInternalElements(): Set[AMLLanguageView#InternalElementRole] = { + var vs: Set[AMLLanguageView#InternalElementRole] = Set.empty + internalElements.foreach { v => vs += v.getTarget() } + return vs + } + + def hasInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + return getInternalElements.contains(v) + } + + def addInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + if (hasInternalElements(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new InstanceHierarchyInternalElementsInternalElementRole(this, v) + return true + } + + def removeInternalElements(v: AMLLanguageView#InternalElementRole): Boolean = { + if (!hasInternalElements(v)) return false + internalElements.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + abstract class CAEXObjectRole(protected val name: String, protected val id: String) extends AViewRole { + + override def toString(): String = { + "VNR: CAEXObjectRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + def getIdView(): String = { + +this getId () + } + + def setIdView(id: String): Unit = { + +this setId (id) + +this changeSomething () + } + + } + + class InternalElementRole(s_Name: String, s_Id: String) extends SystemUnitClassRole(s_Name, s_Id) { + + private var baseSystemUnit: AMLLanguageView#InternalElementBaseSystemUnitSystemUnitClassRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new InternalElement(name, id) + } + + override def toString(): String = { + "VNR: InternalElementRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[AMLLanguageView] def removeBaseSystemUnitIntern(v: AMLLanguageView#InternalElementBaseSystemUnitSystemUnitClassRole): Unit = { + baseSystemUnit = null + } + + private[AMLLanguageView] def setBaseSystemUnitIntern(v: AMLLanguageView#InternalElementBaseSystemUnitSystemUnitClassRole): Unit = { + baseSystemUnit = v + } + + def getBaseSystemUnit(): AMLLanguageView#SystemUnitClassRole = { + return baseSystemUnit.getTarget() + } + + def setBaseSystemUnit(v: AMLLanguageView#SystemUnitClassRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (baseSystemUnit != null) { + if (baseSystemUnit.getTarget() == v) return false + baseSystemUnit.deleteElement() + } + new InternalElementBaseSystemUnitSystemUnitClassRole(this, v) + return true + } + + } + + class SystemUnitClassInternalElementsInternalElementRole(private val source: AMLLanguageView#SystemUnitClassRole, private val target: AMLLanguageView#InternalElementRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setInternalElementsIntern(this) + val sp: SystemUnitClass = getPlayerOfType(source, "SystemUnitClass").asInstanceOf[SystemUnitClass] + val tp: InternalElement = getPlayerOfType(target, "InternalElement").asInstanceOf[InternalElement] + val v: SystemUnitClassInternalElementsInternalElement = new SystemUnitClassInternalElementsInternalElement(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeInternalElementsIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: SystemUnitClassInternalElementsInternalElementRole" + } + + def getSource(): AMLLanguageView#SystemUnitClassRole = { + source + } + + def getTarget(): AMLLanguageView#InternalElementRole = { + target + } + + } + + class SystemUnitClassAttributesAttributeRole(private val source: AMLLanguageView#SystemUnitClassRole, private val target: AMLLanguageView#AttributeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setAttributesIntern(this) + val sp: SystemUnitClass = getPlayerOfType(source, "SystemUnitClass").asInstanceOf[SystemUnitClass] + val tp: Attribute = getPlayerOfType(target, "Attribute").asInstanceOf[Attribute] + val v: SystemUnitClassAttributesAttribute = new SystemUnitClassAttributesAttribute(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAttributesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: SystemUnitClassAttributesAttributeRole" + } + + def getSource(): AMLLanguageView#SystemUnitClassRole = { + source + } + + def getTarget(): AMLLanguageView#AttributeRole = { + target + } + + } + + class InstanceHierarchyInternalElementsInternalElementRole(private val source: AMLLanguageView#InstanceHierarchyRole, private val target: AMLLanguageView#InternalElementRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setInternalElementsIntern(this) + val sp: InstanceHierarchy = getPlayerOfType(source, "InstanceHierarchy").asInstanceOf[InstanceHierarchy] + val tp: InternalElement = getPlayerOfType(target, "InternalElement").asInstanceOf[InternalElement] + val v: InstanceHierarchyInternalElementsInternalElement = new InstanceHierarchyInternalElementsInternalElement(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeInternalElementsIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: InstanceHierarchyInternalElementsInternalElementRole" + } + + def getSource(): AMLLanguageView#InstanceHierarchyRole = { + source + } + + def getTarget(): AMLLanguageView#InternalElementRole = { + target + } + + } + + class InternalElementBaseSystemUnitSystemUnitClassRole(private val source: AMLLanguageView#InternalElementRole, private val target: AMLLanguageView#SystemUnitClassRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBaseSystemUnitIntern(this) + val sp: InternalElement = getPlayerOfType(source, "InternalElement").asInstanceOf[InternalElement] + val tp: SystemUnitClass = getPlayerOfType(target, "SystemUnitClass").asInstanceOf[SystemUnitClass] + val v: InternalElementBaseSystemUnitSystemUnitClass = new InternalElementBaseSystemUnitSystemUnitClass(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBaseSystemUnitIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: InternalElementBaseSystemUnitSystemUnitClassRole" + } + + def getSource(): AMLLanguageView#InternalElementRole = { + source + } + + def getTarget(): AMLLanguageView#SystemUnitClassRole = { + target + } + + } + +} + +object AMLLanguageView extends IViewTypeInfo { + + override def getViewName(): String = "AMLLanguageView" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new AMLLanguageView() + + def getNewView(): AMLLanguageView = getNewViewTypeInstance().asInstanceOf[AMLLanguageView] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/EclipseLibraryView.scala b/src/main/scala/view/EclipseLibraryView.scala new file mode 100644 index 0000000..4c6e617 --- /dev/null +++ b/src/main/scala/view/EclipseLibraryView.scala @@ -0,0 +1,1312 @@ +package view + +import elib.BookAuthorWriter +import org.rosi_project.model_management.sum.IViewCompartment +import elib.BookCategory +import elib.BookOnTapeReaderPerson +import elib.Employee +import elib.LibraryBranchesLibrary +import elib.VideoCassette +import elib.BookOnTapeAuthorWriter +import elib.LibraryBooksBook +import elib.LibraryBorrowersBorrower +import elib.Borrower +import elib.LibraryParentBranchLibrary +import elib.Periodical +import elib.Writer +import elib.AudioVisualItem +import elib.EmployeeManagerEmployee +import elib.Person +import java.util.Date +import elib.BookOnTape +import elib.VideoCassetteCastPerson +import elib.Library +import elib.Book +import elib.LibraryWritersWriter +import elib.LibraryEmployeesEmployee +import elib.CirculatingItem +import elib.Item +import elib.LibraryStockItem + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class EclipseLibraryView private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[LibraryStockItem] || className.isInstanceOf[EmployeeManagerEmployee] || className.isInstanceOf[Writer] || className.isInstanceOf[LibraryWritersWriter] || className.isInstanceOf[BookAuthorWriter] || className.isInstanceOf[BookOnTapeAuthorWriter] || className.isInstanceOf[Person] || className.isInstanceOf[LibraryEmployeesEmployee] || className.isInstanceOf[Borrower] || className.isInstanceOf[BookOnTape] || className.isInstanceOf[CirculatingItem] || className.isInstanceOf[Library] || className.isInstanceOf[LibraryBranchesLibrary] || className.isInstanceOf[BookOnTapeReaderPerson] || className.isInstanceOf[Periodical] || className.isInstanceOf[LibraryBooksBook] || className.isInstanceOf[VideoCassette] || className.isInstanceOf[AudioVisualItem] || className.isInstanceOf[Book] || className.isInstanceOf[LibraryParentBranchLibrary] || className.isInstanceOf[Employee] || className.isInstanceOf[LibraryBorrowersBorrower] || className.isInstanceOf[VideoCassetteCastPerson] || className.isInstanceOf[Item]) return true + return false + } + + def getViewName(): String = { + EclipseLibraryView.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[Library]) return new LibraryRole(null) + if (className.isInstanceOf[Periodical]) return new PeriodicalRole(0, null, null) + if (className.isInstanceOf[Person]) return new PersonRole(null, null) + if (className.isInstanceOf[Borrower]) return new BorrowerRole(null, null) + if (className.isInstanceOf[Item]) return new ItemRole(null) + if (className.isInstanceOf[AudioVisualItem]) return new AudioVisualItemRole(false, 0, null, null) + if (className.isInstanceOf[CirculatingItem]) return new CirculatingItemRole(null) + if (className.isInstanceOf[BookOnTape]) return new BookOnTapeRole(false, 0, null, null) + if (className.isInstanceOf[VideoCassette]) return new VideoCassetteRole(false, 0, null, null) + if (className.isInstanceOf[Book]) return new BookRole(null, 0, null, null) + if (className.isInstanceOf[Writer]) return new WriterRole(null, null, null) + if (className.isInstanceOf[Employee]) return new EmployeeRole(null, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[EmployeeManagerEmployee]) return new EmployeeManagerEmployeeRole(sourceRole.asInstanceOf[EmployeeRole], targetRole.asInstanceOf[EmployeeRole]) + if (className.isInstanceOf[LibraryStockItem]) return new LibraryStockItemRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[ItemRole]) + if (className.isInstanceOf[LibraryWritersWriter]) return new LibraryWritersWriterRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[WriterRole]) + if (className.isInstanceOf[LibraryBooksBook]) return new LibraryBooksBookRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[BookRole]) + if (className.isInstanceOf[LibraryParentBranchLibrary]) return new LibraryParentBranchLibraryRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[LibraryRole]) + if (className.isInstanceOf[LibraryBranchesLibrary]) return new LibraryBranchesLibraryRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[LibraryRole]) + if (className.isInstanceOf[LibraryEmployeesEmployee]) return new LibraryEmployeesEmployeeRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[EmployeeRole]) + if (className.isInstanceOf[BookAuthorWriter]) return new BookAuthorWriterRole(sourceRole.asInstanceOf[BookRole], targetRole.asInstanceOf[WriterRole]) + if (className.isInstanceOf[VideoCassetteCastPerson]) return new VideoCassetteCastPersonRole(sourceRole.asInstanceOf[VideoCassetteRole], targetRole.asInstanceOf[PersonRole]) + if (className.isInstanceOf[BookOnTapeAuthorWriter]) return new BookOnTapeAuthorWriterRole(sourceRole.asInstanceOf[BookOnTapeRole], targetRole.asInstanceOf[WriterRole]) + if (className.isInstanceOf[BookOnTapeReaderPerson]) return new BookOnTapeReaderPersonRole(sourceRole.asInstanceOf[BookOnTapeRole], targetRole.asInstanceOf[PersonRole]) + if (className.isInstanceOf[LibraryBorrowersBorrower]) return new LibraryBorrowersBorrowerRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[BorrowerRole]) + return null + } + + override def toString(): String = { + "VC: EclipseLibraryView" + } + + def createLibrary(name: String): EclipseLibraryView#LibraryRole = { + return new LibraryRole(name) + } + + def createPeriodical(issuesPerYear: Int, title: String, publicationDate: Date): EclipseLibraryView#PeriodicalRole = { + return new PeriodicalRole(issuesPerYear, title, publicationDate) + } + + def createPerson(lastName: String, firstName: String): EclipseLibraryView#PersonRole = { + return new PersonRole(lastName, firstName) + } + + def createBorrower(lastName: String, firstName: String): EclipseLibraryView#BorrowerRole = { + return new BorrowerRole(lastName, firstName) + } + + def createItem(publicationDate: Date): EclipseLibraryView#ItemRole = { + return new ItemRole(publicationDate) + } + + def createAudioVisualItem(damaged: Boolean, minutesLength: Int, title: String, publicationDate: Date): EclipseLibraryView#AudioVisualItemRole = { + return new AudioVisualItemRole(damaged, minutesLength, title, publicationDate) + } + + def createCirculatingItem(publicationDate: Date): EclipseLibraryView#CirculatingItemRole = { + return new CirculatingItemRole(publicationDate) + } + + def createBookOnTape(damaged: Boolean, minutesLength: Int, title: String, publicationDate: Date): EclipseLibraryView#BookOnTapeRole = { + return new BookOnTapeRole(damaged, minutesLength, title, publicationDate) + } + + def createVideoCassette(damaged: Boolean, minutesLength: Int, title: String, publicationDate: Date): EclipseLibraryView#VideoCassetteRole = { + return new VideoCassetteRole(damaged, minutesLength, title, publicationDate) + } + + def createBook(category: BookCategory.Value, pages: Int, title: String, publicationDate: Date): EclipseLibraryView#BookRole = { + return new BookRole(category, pages, title, publicationDate) + } + + def createWriter(name: String, lastName: String, firstName: String): EclipseLibraryView#WriterRole = { + return new WriterRole(name, lastName, firstName) + } + + def createEmployee(lastName: String, firstName: String): EclipseLibraryView#EmployeeRole = { + return new EmployeeRole(lastName, firstName) + } + + class ItemRole(protected val publicationDate: Date) extends AViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Item(publicationDate) + } + + override def toString(): String = { + "VNR: ItemRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getPublicationDateView(): Date = { + +this getPublicationDate () + } + + def setPublicationDateView(publicationdate: Date): Unit = { + +this setPublicationDate (publicationdate) + +this changeSomething () + } + + } + + class EmployeeRole(p_LastName: String, p_FirstName: String) extends PersonRole(p_LastName, p_FirstName) { + + private var manager: EclipseLibraryView#EmployeeManagerEmployeeRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(lastName, firstName) + } + + override def toString(): String = { + "VNR: EmployeeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[EclipseLibraryView] def removeManagerIntern(v: EclipseLibraryView#EmployeeManagerEmployeeRole): Unit = { + manager = null + } + + private[EclipseLibraryView] def setManagerIntern(v: EclipseLibraryView#EmployeeManagerEmployeeRole): Unit = { + manager = v + } + + def getManager(): EclipseLibraryView#EmployeeRole = { + return manager.getTarget() + } + + def setManager(v: EclipseLibraryView#EmployeeRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (manager != null) { + if (manager.getTarget() == v) return false + manager.deleteElement() + } + new EmployeeManagerEmployeeRole(this, v) + return true + } + + } + + class PeriodicalRole(protected val issuesPerYear: Int, protected val title: String, i_PublicationDate: Date) extends ItemRole(i_PublicationDate) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Periodical(issuesPerYear, title, publicationDate) + } + + override def toString(): String = { + "VNR: PeriodicalRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getIssuesPerYearView(): Int = { + +this getIssuesPerYear () + } + + def setIssuesPerYearView(issuesperyear: Int): Unit = { + +this setIssuesPerYear (issuesperyear) + +this changeSomething () + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String): Unit = { + +this setTitle (title) + +this changeSomething () + } + + } + + class VideoCassetteRole(a_Damaged: Boolean, a_MinutesLength: Int, a_Title: String, a_PublicationDate: Date) extends AudioVisualItemRole(a_Damaged, a_MinutesLength, a_Title, a_PublicationDate) { + + private var cast: Set[EclipseLibraryView#VideoCassetteCastPersonRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new VideoCassette(damaged, minutesLength, title, null) + } + + override def toString(): String = { + "VNR: VideoCassetteRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[EclipseLibraryView] def removeCastIntern(v: EclipseLibraryView#VideoCassetteCastPersonRole): Unit = { + cast -= v + } + + private[EclipseLibraryView] def setCastIntern(v: EclipseLibraryView#VideoCassetteCastPersonRole): Unit = { + cast += v + } + + def getCast(): Set[EclipseLibraryView#PersonRole] = { + var vs: Set[EclipseLibraryView#PersonRole] = Set.empty + cast.foreach { v => vs += v.getTarget() } + return vs + } + + def hasCast(v: EclipseLibraryView#PersonRole): Boolean = { + return getCast.contains(v) + } + + def addCast(v: EclipseLibraryView#PersonRole): Boolean = { + if (hasCast(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new VideoCassetteCastPersonRole(this, v) + return true + } + + def removeCast(v: EclipseLibraryView#PersonRole): Boolean = { + if (!hasCast(v)) return false + cast.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class AudioVisualItemRole(protected val damaged: Boolean, protected val minutesLength: Int, protected val title: String, c_PublicationDate: Date) extends CirculatingItemRole(c_PublicationDate) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new AudioVisualItem(damaged, minutesLength, title, null) + } + + override def toString(): String = { + "VNR: AudioVisualItemRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getDamagedView(): Boolean = { + +this getDamaged () + } + + def setDamagedView(damaged: Boolean): Unit = { + +this setDamaged (damaged) + +this changeSomething () + } + + def getMinutesLengthView(): Int = { + +this getMinutesLength () + } + + def setMinutesLengthView(minuteslength: Int): Unit = { + +this setMinutesLength (minuteslength) + +this changeSomething () + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String): Unit = { + +this setTitle (title) + +this changeSomething () + } + + } + + class WriterRole(protected val name: String, p_LastName: String, p_FirstName: String) extends PersonRole(p_LastName, p_FirstName) { + + private var books: Set[EclipseLibraryView#BookAuthorWriterRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Writer(name, lastName, firstName) + } + + override def toString(): String = { + "VNR: WriterRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + private[EclipseLibraryView] def removeBooksIntern(v: EclipseLibraryView#BookAuthorWriterRole): Unit = { + books -= v + } + + private[EclipseLibraryView] def setBooksIntern(v: EclipseLibraryView#BookAuthorWriterRole): Unit = { + books += v + } + + def getBooks(): Set[EclipseLibraryView#BookRole] = { + var vs: Set[EclipseLibraryView#BookRole] = Set.empty + books.foreach { v => vs += v.getSource() } + return vs + } + + def hasBooks(v: EclipseLibraryView#BookRole): Boolean = { + return getBooks.contains(v) + } + + def addBooks(v: EclipseLibraryView#BookRole): Boolean = { + if (hasBooks(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new BookAuthorWriterRole(v, this) + return true + } + + def removeBooks(v: EclipseLibraryView#BookRole): Boolean = { + if (!hasBooks(v)) return false + books.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class BookRole(protected val category: BookCategory.Value, protected val pages: Int, protected val title: String, c_PublicationDate: Date) extends CirculatingItemRole(c_PublicationDate) { + + private var author: EclipseLibraryView#BookAuthorWriterRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Book(category, pages, title, null) + } + + override def toString(): String = { + "VNR: BookRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getCategoryView(): BookCategory.Value = { + +this getCategory () + } + + def setCategoryView(category: BookCategory.Value): Unit = { + +this setCategory (category) + +this changeSomething () + } + + def getPagesView(): Int = { + +this getPages () + } + + def setPagesView(pages: Int): Unit = { + +this setPages (pages) + +this changeSomething () + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String): Unit = { + +this setTitle (title) + +this changeSomething () + } + + private[EclipseLibraryView] def removeAuthorIntern(v: EclipseLibraryView#BookAuthorWriterRole): Unit = { + author = null + } + + private[EclipseLibraryView] def setAuthorIntern(v: EclipseLibraryView#BookAuthorWriterRole): Unit = { + author = v + } + + def getAuthor(): EclipseLibraryView#WriterRole = { + return author.getTarget() + } + + def setAuthor(v: EclipseLibraryView#WriterRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (author != null) { + if (author.getTarget() == v) return false + author.deleteElement() + } + new BookAuthorWriterRole(this, v) + return true + } + + } + + class LibraryRole(protected val name: String) extends AViewRole { + + private var employees: Set[EclipseLibraryView#LibraryEmployeesEmployeeRole] = Set.empty + private var parentBranch: EclipseLibraryView#LibraryParentBranchLibraryRole = null + private var writers: Set[EclipseLibraryView#LibraryWritersWriterRole] = Set.empty + private var borrowers: Set[EclipseLibraryView#LibraryBorrowersBorrowerRole] = Set.empty + private var stock: Set[EclipseLibraryView#LibraryStockItemRole] = Set.empty + private var branches: Set[EclipseLibraryView#LibraryBranchesLibraryRole] = Set.empty + private var books: Set[EclipseLibraryView#LibraryBooksBookRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Library(name) + } + + override def toString(): String = { + "VNR: LibraryRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + private[EclipseLibraryView] def removeEmployeesIntern(v: EclipseLibraryView#LibraryEmployeesEmployeeRole): Unit = { + employees -= v + } + + private[EclipseLibraryView] def setEmployeesIntern(v: EclipseLibraryView#LibraryEmployeesEmployeeRole): Unit = { + employees += v + } + + def getEmployees(): Set[EclipseLibraryView#EmployeeRole] = { + var vs: Set[EclipseLibraryView#EmployeeRole] = Set.empty + employees.foreach { v => vs += v.getTarget() } + return vs + } + + def hasEmployees(v: EclipseLibraryView#EmployeeRole): Boolean = { + return getEmployees.contains(v) + } + + def addEmployees(v: EclipseLibraryView#EmployeeRole): Boolean = { + if (hasEmployees(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryEmployeesEmployeeRole(this, v) + return true + } + + def removeEmployees(v: EclipseLibraryView#EmployeeRole): Boolean = { + if (!hasEmployees(v)) return false + employees.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryView] def removeParentBranchIntern(v: EclipseLibraryView#LibraryParentBranchLibraryRole): Unit = { + parentBranch = null + } + + private[EclipseLibraryView] def setParentBranchIntern(v: EclipseLibraryView#LibraryParentBranchLibraryRole): Unit = { + parentBranch = v + } + + def getParentBranch(): EclipseLibraryView#LibraryRole = { + return parentBranch.getTarget() + } + + def setParentBranch(v: EclipseLibraryView#LibraryRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (parentBranch != null) { + if (parentBranch.getTarget() == v) return false + parentBranch.deleteElement() + } + new LibraryParentBranchLibraryRole(this, v) + return true + } + + private[EclipseLibraryView] def removeWritersIntern(v: EclipseLibraryView#LibraryWritersWriterRole): Unit = { + writers -= v + } + + private[EclipseLibraryView] def setWritersIntern(v: EclipseLibraryView#LibraryWritersWriterRole): Unit = { + writers += v + } + + def getWriters(): Set[EclipseLibraryView#WriterRole] = { + var vs: Set[EclipseLibraryView#WriterRole] = Set.empty + writers.foreach { v => vs += v.getTarget() } + return vs + } + + def hasWriters(v: EclipseLibraryView#WriterRole): Boolean = { + return getWriters.contains(v) + } + + def addWriters(v: EclipseLibraryView#WriterRole): Boolean = { + if (hasWriters(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryWritersWriterRole(this, v) + return true + } + + def removeWriters(v: EclipseLibraryView#WriterRole): Boolean = { + if (!hasWriters(v)) return false + writers.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryView] def removeBorrowersIntern(v: EclipseLibraryView#LibraryBorrowersBorrowerRole): Unit = { + borrowers -= v + } + + private[EclipseLibraryView] def setBorrowersIntern(v: EclipseLibraryView#LibraryBorrowersBorrowerRole): Unit = { + borrowers += v + } + + def getBorrowers(): Set[EclipseLibraryView#BorrowerRole] = { + var vs: Set[EclipseLibraryView#BorrowerRole] = Set.empty + borrowers.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBorrowers(v: EclipseLibraryView#BorrowerRole): Boolean = { + return getBorrowers.contains(v) + } + + def addBorrowers(v: EclipseLibraryView#BorrowerRole): Boolean = { + if (hasBorrowers(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryBorrowersBorrowerRole(this, v) + return true + } + + def removeBorrowers(v: EclipseLibraryView#BorrowerRole): Boolean = { + if (!hasBorrowers(v)) return false + borrowers.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryView] def removeStockIntern(v: EclipseLibraryView#LibraryStockItemRole): Unit = { + stock -= v + } + + private[EclipseLibraryView] def setStockIntern(v: EclipseLibraryView#LibraryStockItemRole): Unit = { + stock += v + } + + def getStock(): Set[EclipseLibraryView#ItemRole] = { + var vs: Set[EclipseLibraryView#ItemRole] = Set.empty + stock.foreach { v => vs += v.getTarget() } + return vs + } + + def hasStock(v: EclipseLibraryView#ItemRole): Boolean = { + return getStock.contains(v) + } + + def addStock(v: EclipseLibraryView#ItemRole): Boolean = { + if (hasStock(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryStockItemRole(this, v) + return true + } + + def removeStock(v: EclipseLibraryView#ItemRole): Boolean = { + if (!hasStock(v)) return false + stock.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryView] def removeBranchesIntern(v: EclipseLibraryView#LibraryBranchesLibraryRole): Unit = { + branches -= v + } + + private[EclipseLibraryView] def setBranchesIntern(v: EclipseLibraryView#LibraryBranchesLibraryRole): Unit = { + branches += v + } + + def getBranches(): Set[EclipseLibraryView#LibraryRole] = { + var vs: Set[EclipseLibraryView#LibraryRole] = Set.empty + branches.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBranches(v: EclipseLibraryView#LibraryRole): Boolean = { + return getBranches.contains(v) + } + + def addBranches(v: EclipseLibraryView#LibraryRole): Boolean = { + if (hasBranches(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryBranchesLibraryRole(this, v) + return true + } + + def removeBranches(v: EclipseLibraryView#LibraryRole): Boolean = { + if (!hasBranches(v)) return false + branches.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[EclipseLibraryView] def removeBooksIntern(v: EclipseLibraryView#LibraryBooksBookRole): Unit = { + books -= v + } + + private[EclipseLibraryView] def setBooksIntern(v: EclipseLibraryView#LibraryBooksBookRole): Unit = { + books += v + } + + def getBooks(): Set[EclipseLibraryView#BookRole] = { + var vs: Set[EclipseLibraryView#BookRole] = Set.empty + books.foreach { v => vs += v.getTarget() } + return vs + } + + def hasBooks(v: EclipseLibraryView#BookRole): Boolean = { + return getBooks.contains(v) + } + + def addBooks(v: EclipseLibraryView#BookRole): Boolean = { + if (hasBooks(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryBooksBookRole(this, v) + return true + } + + def removeBooks(v: EclipseLibraryView#BookRole): Boolean = { + if (!hasBooks(v)) return false + books.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class BookOnTapeRole(a_Damaged: Boolean, a_MinutesLength: Int, a_Title: String, a_PublicationDate: Date) extends AudioVisualItemRole(a_Damaged, a_MinutesLength, a_Title, a_PublicationDate) { + + private var author: EclipseLibraryView#BookOnTapeAuthorWriterRole = null + private var reader: EclipseLibraryView#BookOnTapeReaderPersonRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new BookOnTape(damaged, minutesLength, title, null) + } + + override def toString(): String = { + "VNR: BookOnTapeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[EclipseLibraryView] def removeAuthorIntern(v: EclipseLibraryView#BookOnTapeAuthorWriterRole): Unit = { + author = null + } + + private[EclipseLibraryView] def setAuthorIntern(v: EclipseLibraryView#BookOnTapeAuthorWriterRole): Unit = { + author = v + } + + def getAuthor(): EclipseLibraryView#WriterRole = { + return author.getTarget() + } + + def setAuthor(v: EclipseLibraryView#WriterRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (author != null) { + if (author.getTarget() == v) return false + author.deleteElement() + } + new BookOnTapeAuthorWriterRole(this, v) + return true + } + + private[EclipseLibraryView] def removeReaderIntern(v: EclipseLibraryView#BookOnTapeReaderPersonRole): Unit = { + reader = null + } + + private[EclipseLibraryView] def setReaderIntern(v: EclipseLibraryView#BookOnTapeReaderPersonRole): Unit = { + reader = v + } + + def getReader(): EclipseLibraryView#PersonRole = { + return reader.getTarget() + } + + def setReader(v: EclipseLibraryView#PersonRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (reader != null) { + if (reader.getTarget() == v) return false + reader.deleteElement() + } + new BookOnTapeReaderPersonRole(this, v) + return true + } + + } + + class CirculatingItemRole(i_PublicationDate: Date) extends ItemRole(i_PublicationDate) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new CirculatingItem(publicationDate) + } + + override def toString(): String = { + "VNR: CirculatingItemRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + } + + class BorrowerRole(p_LastName: String, p_FirstName: String) extends PersonRole(p_LastName, p_FirstName) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Borrower(lastName, firstName) + } + + override def toString(): String = { + "VNR: BorrowerRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + } + + class PersonRole(protected val lastName: String, protected val firstName: String) extends AViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Person(lastName, firstName) + } + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getLastNameView(): String = { + +this getLastName () + } + + def setLastNameView(lastname: String): Unit = { + +this setLastName (lastname) + +this changeSomething () + } + + def getFirstNameView(): String = { + +this getFirstName () + } + + def setFirstNameView(firstname: String): Unit = { + +this setFirstName (firstname) + +this changeSomething () + } + + } + + class LibraryEmployeesEmployeeRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setEmployeesIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: LibraryEmployeesEmployee = new LibraryEmployeesEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeEmployeesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryEmployeesEmployeeRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#EmployeeRole = { + target + } + + } + + class LibraryParentBranchLibraryRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#LibraryRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setParentBranchIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Library = getPlayerOfType(target, "Library").asInstanceOf[Library] + val v: LibraryParentBranchLibrary = new LibraryParentBranchLibrary(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeParentBranchIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryParentBranchLibraryRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#LibraryRole = { + target + } + + } + + class LibraryWritersWriterRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#WriterRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setWritersIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Writer = getPlayerOfType(target, "Writer").asInstanceOf[Writer] + val v: LibraryWritersWriter = new LibraryWritersWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeWritersIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryWritersWriterRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#WriterRole = { + target + } + + } + + class BookOnTapeAuthorWriterRole(private val source: EclipseLibraryView#BookOnTapeRole, private val target: EclipseLibraryView#WriterRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setAuthorIntern(this) + val sp: BookOnTape = getPlayerOfType(source, "BookOnTape").asInstanceOf[BookOnTape] + val tp: Writer = getPlayerOfType(target, "Writer").asInstanceOf[Writer] + val v: BookOnTapeAuthorWriter = new BookOnTapeAuthorWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAuthorIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: BookOnTapeAuthorWriterRole" + } + + def getSource(): EclipseLibraryView#BookOnTapeRole = { + source + } + + def getTarget(): EclipseLibraryView#WriterRole = { + target + } + + } + + class BookOnTapeReaderPersonRole(private val source: EclipseLibraryView#BookOnTapeRole, private val target: EclipseLibraryView#PersonRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setReaderIntern(this) + val sp: BookOnTape = getPlayerOfType(source, "BookOnTape").asInstanceOf[BookOnTape] + val tp: Person = getPlayerOfType(target, "Person").asInstanceOf[Person] + val v: BookOnTapeReaderPerson = new BookOnTapeReaderPerson(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeReaderIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: BookOnTapeReaderPersonRole" + } + + def getSource(): EclipseLibraryView#BookOnTapeRole = { + source + } + + def getTarget(): EclipseLibraryView#PersonRole = { + target + } + + } + + class LibraryBorrowersBorrowerRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#BorrowerRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBorrowersIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Borrower = getPlayerOfType(target, "Borrower").asInstanceOf[Borrower] + val v: LibraryBorrowersBorrower = new LibraryBorrowersBorrower(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBorrowersIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryBorrowersBorrowerRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#BorrowerRole = { + target + } + + } + + class LibraryStockItemRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#ItemRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setStockIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Item = getPlayerOfType(target, "Item").asInstanceOf[Item] + val v: LibraryStockItem = new LibraryStockItem(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeStockIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryStockItemRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#ItemRole = { + target + } + + } + + class BookAuthorWriterRole(private val source: EclipseLibraryView#BookRole, private val target: EclipseLibraryView#WriterRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setBooksIntern(this) + source.setAuthorIntern(this) + val sp: Book = getPlayerOfType(source, "Book").asInstanceOf[Book] + val tp: Writer = getPlayerOfType(target, "Writer").asInstanceOf[Writer] + val v: BookAuthorWriter = new BookAuthorWriter(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeAuthorIntern(this) + target.removeBooksIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: BookAuthorWriterRole" + } + + def getSource(): EclipseLibraryView#BookRole = { + source + } + + def getTarget(): EclipseLibraryView#WriterRole = { + target + } + + } + + class LibraryBranchesLibraryRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#LibraryRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBranchesIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Library = getPlayerOfType(target, "Library").asInstanceOf[Library] + val v: LibraryBranchesLibrary = new LibraryBranchesLibrary(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBranchesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryBranchesLibraryRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#LibraryRole = { + target + } + + } + + class VideoCassetteCastPersonRole(private val source: EclipseLibraryView#VideoCassetteRole, private val target: EclipseLibraryView#PersonRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setCastIntern(this) + val sp: VideoCassette = getPlayerOfType(source, "VideoCassette").asInstanceOf[VideoCassette] + val tp: Person = getPlayerOfType(target, "Person").asInstanceOf[Person] + val v: VideoCassetteCastPerson = new VideoCassetteCastPerson(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeCastIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: VideoCassetteCastPersonRole" + } + + def getSource(): EclipseLibraryView#VideoCassetteRole = { + source + } + + def getTarget(): EclipseLibraryView#PersonRole = { + target + } + + } + + class EmployeeManagerEmployeeRole(private val source: EclipseLibraryView#EmployeeRole, private val target: EclipseLibraryView#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setManagerIntern(this) + val sp: Employee = getPlayerOfType(source, "Employee").asInstanceOf[Employee] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: EmployeeManagerEmployee = new EmployeeManagerEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeManagerIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: EmployeeManagerEmployeeRole" + } + + def getSource(): EclipseLibraryView#EmployeeRole = { + source + } + + def getTarget(): EclipseLibraryView#EmployeeRole = { + target + } + + } + + class LibraryBooksBookRole(private val source: EclipseLibraryView#LibraryRole, private val target: EclipseLibraryView#BookRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setBooksIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Book = getPlayerOfType(target, "Book").asInstanceOf[Book] + val v: LibraryBooksBook = new LibraryBooksBook(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeBooksIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryBooksBookRole" + } + + def getSource(): EclipseLibraryView#LibraryRole = { + source + } + + def getTarget(): EclipseLibraryView#BookRole = { + target + } + + } + +} + +object EclipseLibraryView extends IViewTypeInfo { + + override def getViewName(): String = "EclipseLibraryView" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new EclipseLibraryView() + + def getNewView(): EclipseLibraryView = getNewViewTypeInstance().asInstanceOf[EclipseLibraryView] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/IMDBdatabaseView.scala b/src/main/scala/view/IMDBdatabaseView.scala new file mode 100644 index 0000000..816ccc5 --- /dev/null +++ b/src/main/scala/view/IMDBdatabaseView.scala @@ -0,0 +1,1055 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import imdbdatabase.User +import imdbdatabase.IMDBFilmsFilm +import imdbdatabase.FilmFiguresFigure +import imdbdatabase.VoteFilmFilm +import imdbdatabase.Film +import imdbdatabase.IMDBVotesVote +import imdbdatabase.VoteUserUser +import imdbdatabase.FigurePlayedByActor +import imdbdatabase.Person +import imdbdatabase.IMDB +import imdbdatabase.Figure +import imdbdatabase.Actor +import imdbdatabase.Vote +import imdbdatabase.IMDBUsersUser +import imdbdatabase.IMDBActorsActor + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class IMDBdatabaseView private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[IMDBFilmsFilm] || className.isInstanceOf[IMDBVotesVote] || className.isInstanceOf[IMDBActorsActor] || className.isInstanceOf[FilmFiguresFigure] || className.isInstanceOf[Person] || className.isInstanceOf[IMDB] || className.isInstanceOf[Vote] || className.isInstanceOf[VoteUserUser] || className.isInstanceOf[FigurePlayedByActor] || className.isInstanceOf[User] || className.isInstanceOf[VoteFilmFilm] || className.isInstanceOf[IMDBUsersUser] || className.isInstanceOf[Actor] || className.isInstanceOf[Film] || className.isInstanceOf[Figure]) return true + return false + } + + def getViewName(): String = { + IMDBdatabaseView.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[Figure]) return new FigureRole(null) + if (className.isInstanceOf[Actor]) return new ActorRole(0, null) + if (className.isInstanceOf[Person]) return new PersonRole(0, null) + if (className.isInstanceOf[User]) return new UserRole(null, null, 0, null) + if (className.isInstanceOf[Vote]) return new VoteRole(0) + if (className.isInstanceOf[IMDB]) return new IMDBRole() + if (className.isInstanceOf[Film]) return new FilmRole(0, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[FilmFiguresFigure]) return new FilmFiguresFigureRole(sourceRole.asInstanceOf[FilmRole], targetRole.asInstanceOf[FigureRole]) + if (className.isInstanceOf[IMDBVotesVote]) return new IMDBVotesVoteRole(sourceRole.asInstanceOf[IMDBRole], targetRole.asInstanceOf[VoteRole]) + if (className.isInstanceOf[IMDBActorsActor]) return new IMDBActorsActorRole(sourceRole.asInstanceOf[IMDBRole], targetRole.asInstanceOf[ActorRole]) + if (className.isInstanceOf[IMDBUsersUser]) return new IMDBUsersUserRole(sourceRole.asInstanceOf[IMDBRole], targetRole.asInstanceOf[UserRole]) + if (className.isInstanceOf[VoteUserUser]) return new VoteUserUserRole(sourceRole.asInstanceOf[VoteRole], targetRole.asInstanceOf[UserRole]) + if (className.isInstanceOf[VoteFilmFilm]) return new VoteFilmFilmRole(sourceRole.asInstanceOf[VoteRole], targetRole.asInstanceOf[FilmRole]) + if (className.isInstanceOf[FigurePlayedByActor]) return new FigurePlayedByActorRole(sourceRole.asInstanceOf[FigureRole], targetRole.asInstanceOf[ActorRole]) + if (className.isInstanceOf[IMDBFilmsFilm]) return new IMDBFilmsFilmRole(sourceRole.asInstanceOf[IMDBRole], targetRole.asInstanceOf[FilmRole]) + return null + } + + override def toString(): String = { + "VC: IMDBdatabaseView" + } + + def createFigure(name: String): IMDBdatabaseView#FigureRole = { + return new FigureRole(name) + } + + def createActor(dob: Double, name: String): IMDBdatabaseView#ActorRole = { + return new ActorRole(dob, name) + } + + def createPerson(dob: Double, name: String): IMDBdatabaseView#PersonRole = { + return new PersonRole(dob, name) + } + + def createUser(email: String, userName: String, dob: Double, name: String): IMDBdatabaseView#UserRole = { + return new UserRole(email, userName, dob, name) + } + + def createVote(score: Int): IMDBdatabaseView#VoteRole = { + return new VoteRole(score) + } + + def createIMDB(): IMDBdatabaseView#IMDBRole = { + return new IMDBRole() + } + + def createFilm(year: Int, title: String): IMDBdatabaseView#FilmRole = { + return new FilmRole(year, title) + } + + class IMDBRole extends AViewRole { + + private var users: Set[IMDBdatabaseView#IMDBUsersUserRole] = Set.empty + private var votes: Set[IMDBdatabaseView#IMDBVotesVoteRole] = Set.empty + private var actors: Set[IMDBdatabaseView#IMDBActorsActorRole] = Set.empty + private var films: Set[IMDBdatabaseView#IMDBFilmsFilmRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new IMDB() + } + + override def toString(): String = { + "VNR: IMDBRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[IMDBdatabaseView] def removeUsersIntern(v: IMDBdatabaseView#IMDBUsersUserRole): Unit = { + users -= v + } + + private[IMDBdatabaseView] def setUsersIntern(v: IMDBdatabaseView#IMDBUsersUserRole): Unit = { + users += v + } + + def getUsers(): Set[IMDBdatabaseView#UserRole] = { + var vs: Set[IMDBdatabaseView#UserRole] = Set.empty + users.foreach { v => vs += v.getTarget() } + return vs + } + + def hasUsers(v: IMDBdatabaseView#UserRole): Boolean = { + return getUsers.contains(v) + } + + def addUsers(v: IMDBdatabaseView#UserRole): Boolean = { + if (hasUsers(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new IMDBUsersUserRole(this, v) + return true + } + + def removeUsers(v: IMDBdatabaseView#UserRole): Boolean = { + if (!hasUsers(v)) return false + users.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeVotesIntern(v: IMDBdatabaseView#IMDBVotesVoteRole): Unit = { + votes -= v + } + + private[IMDBdatabaseView] def setVotesIntern(v: IMDBdatabaseView#IMDBVotesVoteRole): Unit = { + votes += v + } + + def getVotes(): Set[IMDBdatabaseView#VoteRole] = { + var vs: Set[IMDBdatabaseView#VoteRole] = Set.empty + votes.foreach { v => vs += v.getTarget() } + return vs + } + + def hasVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + return getVotes.contains(v) + } + + def addVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + if (hasVotes(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new IMDBVotesVoteRole(this, v) + return true + } + + def removeVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + if (!hasVotes(v)) return false + votes.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeActorsIntern(v: IMDBdatabaseView#IMDBActorsActorRole): Unit = { + actors -= v + } + + private[IMDBdatabaseView] def setActorsIntern(v: IMDBdatabaseView#IMDBActorsActorRole): Unit = { + actors += v + } + + def getActors(): Set[IMDBdatabaseView#ActorRole] = { + var vs: Set[IMDBdatabaseView#ActorRole] = Set.empty + actors.foreach { v => vs += v.getTarget() } + return vs + } + + def hasActors(v: IMDBdatabaseView#ActorRole): Boolean = { + return getActors.contains(v) + } + + def addActors(v: IMDBdatabaseView#ActorRole): Boolean = { + if (hasActors(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new IMDBActorsActorRole(this, v) + return true + } + + def removeActors(v: IMDBdatabaseView#ActorRole): Boolean = { + if (!hasActors(v)) return false + actors.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeFilmsIntern(v: IMDBdatabaseView#IMDBFilmsFilmRole): Unit = { + films -= v + } + + private[IMDBdatabaseView] def setFilmsIntern(v: IMDBdatabaseView#IMDBFilmsFilmRole): Unit = { + films += v + } + + def getFilms(): Set[IMDBdatabaseView#FilmRole] = { + var vs: Set[IMDBdatabaseView#FilmRole] = Set.empty + films.foreach { v => vs += v.getTarget() } + return vs + } + + def hasFilms(v: IMDBdatabaseView#FilmRole): Boolean = { + return getFilms.contains(v) + } + + def addFilms(v: IMDBdatabaseView#FilmRole): Boolean = { + if (hasFilms(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new IMDBFilmsFilmRole(this, v) + return true + } + + def removeFilms(v: IMDBdatabaseView#FilmRole): Boolean = { + if (!hasFilms(v)) return false + films.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class FilmRole(protected val year: Int, protected val title: String) extends AViewRole { + + private var library: IMDBdatabaseView#IMDBFilmsFilmRole = null + private var votes: Set[IMDBdatabaseView#VoteFilmFilmRole] = Set.empty + private var figures: Set[IMDBdatabaseView#FilmFiguresFigureRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Film(year, title) + } + + override def toString(): String = { + "VNR: FilmRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getYearView(): Int = { + +this getYear () + } + + def setYearView(year: Int): Unit = { + +this setYear (year) + +this changeSomething () + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String): Unit = { + +this setTitle (title) + +this changeSomething () + } + + private[IMDBdatabaseView] def removeLibraryIntern(v: IMDBdatabaseView#IMDBFilmsFilmRole): Unit = { + library = null + } + + private[IMDBdatabaseView] def setLibraryIntern(v: IMDBdatabaseView#IMDBFilmsFilmRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseView#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseView#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBFilmsFilmRole(v, this) + return true + } + + private[IMDBdatabaseView] def removeVotesIntern(v: IMDBdatabaseView#VoteFilmFilmRole): Unit = { + votes -= v + } + + private[IMDBdatabaseView] def setVotesIntern(v: IMDBdatabaseView#VoteFilmFilmRole): Unit = { + votes += v + } + + def getVotes(): Set[IMDBdatabaseView#VoteRole] = { + var vs: Set[IMDBdatabaseView#VoteRole] = Set.empty + votes.foreach { v => vs += v.getSource() } + return vs + } + + def hasVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + return getVotes.contains(v) + } + + def addVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + if (hasVotes(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new VoteFilmFilmRole(v, this) + return true + } + + def removeVotes(v: IMDBdatabaseView#VoteRole): Boolean = { + if (!hasVotes(v)) return false + votes.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeFiguresIntern(v: IMDBdatabaseView#FilmFiguresFigureRole): Unit = { + figures -= v + } + + private[IMDBdatabaseView] def setFiguresIntern(v: IMDBdatabaseView#FilmFiguresFigureRole): Unit = { + figures += v + } + + def getFigures(): Set[IMDBdatabaseView#FigureRole] = { + var vs: Set[IMDBdatabaseView#FigureRole] = Set.empty + figures.foreach { v => vs += v.getTarget() } + return vs + } + + def hasFigures(v: IMDBdatabaseView#FigureRole): Boolean = { + return getFigures.contains(v) + } + + def addFigures(v: IMDBdatabaseView#FigureRole): Boolean = { + if (hasFigures(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new FilmFiguresFigureRole(this, v) + return true + } + + def removeFigures(v: IMDBdatabaseView#FigureRole): Boolean = { + if (!hasFigures(v)) return false + figures.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class VoteRole(protected val score: Int) extends AViewRole { + + private var user: IMDBdatabaseView#VoteUserUserRole = null + private var library: IMDBdatabaseView#IMDBVotesVoteRole = null + private var film: IMDBdatabaseView#VoteFilmFilmRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Vote(score) + } + + override def toString(): String = { + "VNR: VoteRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getScoreView(): Int = { + +this getScore () + } + + def setScoreView(score: Int): Unit = { + +this setScore (score) + +this changeSomething () + } + + private[IMDBdatabaseView] def removeUserIntern(v: IMDBdatabaseView#VoteUserUserRole): Unit = { + user = null + } + + private[IMDBdatabaseView] def setUserIntern(v: IMDBdatabaseView#VoteUserUserRole): Unit = { + user = v + } + + def getUser(): IMDBdatabaseView#UserRole = { + return user.getTarget() + } + + def setUser(v: IMDBdatabaseView#UserRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (user != null) { + if (user.getTarget() == v) return false + user.deleteElement() + } + new VoteUserUserRole(this, v) + return true + } + + private[IMDBdatabaseView] def removeLibraryIntern(v: IMDBdatabaseView#IMDBVotesVoteRole): Unit = { + library = null + } + + private[IMDBdatabaseView] def setLibraryIntern(v: IMDBdatabaseView#IMDBVotesVoteRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseView#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseView#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBVotesVoteRole(v, this) + return true + } + + private[IMDBdatabaseView] def removeFilmIntern(v: IMDBdatabaseView#VoteFilmFilmRole): Unit = { + film = null + } + + private[IMDBdatabaseView] def setFilmIntern(v: IMDBdatabaseView#VoteFilmFilmRole): Unit = { + film = v + } + + def getFilm(): IMDBdatabaseView#FilmRole = { + return film.getTarget() + } + + def setFilm(v: IMDBdatabaseView#FilmRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (film != null) { + if (film.getTarget() == v) return false + film.deleteElement() + } + new VoteFilmFilmRole(this, v) + return true + } + + } + + class ActorRole(p_Dob: Double, p_Name: String) extends PersonRole(p_Dob, p_Name) { + + private var plays: Set[IMDBdatabaseView#FigurePlayedByActorRole] = Set.empty + private var library: IMDBdatabaseView#IMDBActorsActorRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Actor(dob, name) + } + + override def toString(): String = { + "VNR: ActorRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + private[IMDBdatabaseView] def removePlaysIntern(v: IMDBdatabaseView#FigurePlayedByActorRole): Unit = { + plays -= v + } + + private[IMDBdatabaseView] def setPlaysIntern(v: IMDBdatabaseView#FigurePlayedByActorRole): Unit = { + plays += v + } + + def getPlays(): Set[IMDBdatabaseView#FigureRole] = { + var vs: Set[IMDBdatabaseView#FigureRole] = Set.empty + plays.foreach { v => vs += v.getSource() } + return vs + } + + def hasPlays(v: IMDBdatabaseView#FigureRole): Boolean = { + return getPlays.contains(v) + } + + def addPlays(v: IMDBdatabaseView#FigureRole): Boolean = { + if (hasPlays(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new FigurePlayedByActorRole(v, this) + return true + } + + def removePlays(v: IMDBdatabaseView#FigureRole): Boolean = { + if (!hasPlays(v)) return false + plays.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeLibraryIntern(v: IMDBdatabaseView#IMDBActorsActorRole): Unit = { + library = null + } + + private[IMDBdatabaseView] def setLibraryIntern(v: IMDBdatabaseView#IMDBActorsActorRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseView#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseView#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBActorsActorRole(v, this) + return true + } + + } + + class PersonRole(protected val dob: Double, protected val name: String) extends AViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Person(dob, name) + } + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getDobView(): Double = { + +this getDob () + } + + def setDobView(dob: Double): Unit = { + +this setDob (dob) + +this changeSomething () + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + } + + class FigureRole(protected val name: String) extends AViewRole { + + private var playedBy: Set[IMDBdatabaseView#FigurePlayedByActorRole] = Set.empty + private var film: IMDBdatabaseView#FilmFiguresFigureRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Figure(name) + } + + override def toString(): String = { + "VNR: FigureRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + private[IMDBdatabaseView] def removePlayedByIntern(v: IMDBdatabaseView#FigurePlayedByActorRole): Unit = { + playedBy -= v + } + + private[IMDBdatabaseView] def setPlayedByIntern(v: IMDBdatabaseView#FigurePlayedByActorRole): Unit = { + playedBy += v + } + + def getPlayedBy(): Set[IMDBdatabaseView#ActorRole] = { + var vs: Set[IMDBdatabaseView#ActorRole] = Set.empty + playedBy.foreach { v => vs += v.getTarget() } + return vs + } + + def hasPlayedBy(v: IMDBdatabaseView#ActorRole): Boolean = { + return getPlayedBy.contains(v) + } + + def addPlayedBy(v: IMDBdatabaseView#ActorRole): Boolean = { + if (hasPlayedBy(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new FigurePlayedByActorRole(this, v) + return true + } + + def removePlayedBy(v: IMDBdatabaseView#ActorRole): Boolean = { + if (!hasPlayedBy(v)) return false + playedBy.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[IMDBdatabaseView] def removeFilmIntern(v: IMDBdatabaseView#FilmFiguresFigureRole): Unit = { + film = null + } + + private[IMDBdatabaseView] def setFilmIntern(v: IMDBdatabaseView#FilmFiguresFigureRole): Unit = { + film = v + } + + def getFilm(): IMDBdatabaseView#FilmRole = { + return film.getSource() + } + + def setFilm(v: IMDBdatabaseView#FilmRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (film != null) { + if (film.getSource() == v) return false + film.deleteElement() + } + new FilmFiguresFigureRole(v, this) + return true + } + + } + + class UserRole(protected val email: String, protected val userName: String, p_Dob: Double, p_Name: String) extends PersonRole(p_Dob, p_Name) { + + private var library: IMDBdatabaseView#IMDBUsersUserRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new User(email, userName, dob, name) + } + + override def toString(): String = { + "VNR: UserRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getEmailView(): String = { + +this getEmail () + } + + def setEmailView(email: String): Unit = { + +this setEmail (email) + +this changeSomething () + } + + def getUserNameView(): String = { + +this getUserName () + } + + def setUserNameView(username: String): Unit = { + +this setUserName (username) + +this changeSomething () + } + + private[IMDBdatabaseView] def removeLibraryIntern(v: IMDBdatabaseView#IMDBUsersUserRole): Unit = { + library = null + } + + private[IMDBdatabaseView] def setLibraryIntern(v: IMDBdatabaseView#IMDBUsersUserRole): Unit = { + library = v + } + + def getLibrary(): IMDBdatabaseView#IMDBRole = { + return library.getSource() + } + + def setLibrary(v: IMDBdatabaseView#IMDBRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (library != null) { + if (library.getSource() == v) return false + library.deleteElement() + } + new IMDBUsersUserRole(v, this) + return true + } + + } + + class FigurePlayedByActorRole(private val source: IMDBdatabaseView#FigureRole, private val target: IMDBdatabaseView#ActorRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setPlaysIntern(this) + source.setPlayedByIntern(this) + val sp: Figure = getPlayerOfType(source, "Figure").asInstanceOf[Figure] + val tp: Actor = getPlayerOfType(target, "Actor").asInstanceOf[Actor] + val v: FigurePlayedByActor = new FigurePlayedByActor(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removePlayedByIntern(this) + target.removePlaysIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: FigurePlayedByActorRole" + } + + def getSource(): IMDBdatabaseView#FigureRole = { + source + } + + def getTarget(): IMDBdatabaseView#ActorRole = { + target + } + + } + + class VoteUserUserRole(private val source: IMDBdatabaseView#VoteRole, private val target: IMDBdatabaseView#UserRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setUserIntern(this) + val sp: Vote = getPlayerOfType(source, "Vote").asInstanceOf[Vote] + val tp: User = getPlayerOfType(target, "User").asInstanceOf[User] + val v: VoteUserUser = new VoteUserUser(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeUserIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: VoteUserUserRole" + } + + def getSource(): IMDBdatabaseView#VoteRole = { + source + } + + def getTarget(): IMDBdatabaseView#UserRole = { + target + } + + } + + class IMDBUsersUserRole(private val source: IMDBdatabaseView#IMDBRole, private val target: IMDBdatabaseView#UserRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setUsersIntern(this) + val sp: IMDB = getPlayerOfType(source, "IMDB").asInstanceOf[IMDB] + val tp: User = getPlayerOfType(target, "User").asInstanceOf[User] + val v: IMDBUsersUser = new IMDBUsersUser(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeUsersIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: IMDBUsersUserRole" + } + + def getSource(): IMDBdatabaseView#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseView#UserRole = { + target + } + + } + + class IMDBVotesVoteRole(private val source: IMDBdatabaseView#IMDBRole, private val target: IMDBdatabaseView#VoteRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setVotesIntern(this) + val sp: IMDB = getPlayerOfType(source, "IMDB").asInstanceOf[IMDB] + val tp: Vote = getPlayerOfType(target, "Vote").asInstanceOf[Vote] + val v: IMDBVotesVote = new IMDBVotesVote(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeVotesIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: IMDBVotesVoteRole" + } + + def getSource(): IMDBdatabaseView#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseView#VoteRole = { + target + } + + } + + class IMDBActorsActorRole(private val source: IMDBdatabaseView#IMDBRole, private val target: IMDBdatabaseView#ActorRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setActorsIntern(this) + val sp: IMDB = getPlayerOfType(source, "IMDB").asInstanceOf[IMDB] + val tp: Actor = getPlayerOfType(target, "Actor").asInstanceOf[Actor] + val v: IMDBActorsActor = new IMDBActorsActor(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeActorsIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: IMDBActorsActorRole" + } + + def getSource(): IMDBdatabaseView#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseView#ActorRole = { + target + } + + } + + class IMDBFilmsFilmRole(private val source: IMDBdatabaseView#IMDBRole, private val target: IMDBdatabaseView#FilmRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setLibraryIntern(this) + source.setFilmsIntern(this) + val sp: IMDB = getPlayerOfType(source, "IMDB").asInstanceOf[IMDB] + val tp: Film = getPlayerOfType(target, "Film").asInstanceOf[Film] + val v: IMDBFilmsFilm = new IMDBFilmsFilm(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFilmsIntern(this) + target.removeLibraryIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: IMDBFilmsFilmRole" + } + + def getSource(): IMDBdatabaseView#IMDBRole = { + source + } + + def getTarget(): IMDBdatabaseView#FilmRole = { + target + } + + } + + class VoteFilmFilmRole(private val source: IMDBdatabaseView#VoteRole, private val target: IMDBdatabaseView#FilmRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setVotesIntern(this) + source.setFilmIntern(this) + val sp: Vote = getPlayerOfType(source, "Vote").asInstanceOf[Vote] + val tp: Film = getPlayerOfType(target, "Film").asInstanceOf[Film] + val v: VoteFilmFilm = new VoteFilmFilm(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFilmIntern(this) + target.removeVotesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: VoteFilmFilmRole" + } + + def getSource(): IMDBdatabaseView#VoteRole = { + source + } + + def getTarget(): IMDBdatabaseView#FilmRole = { + target + } + + } + + class FilmFiguresFigureRole(private val source: IMDBdatabaseView#FilmRole, private val target: IMDBdatabaseView#FigureRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setFilmIntern(this) + source.setFiguresIntern(this) + val sp: Film = getPlayerOfType(source, "Film").asInstanceOf[Film] + val tp: Figure = getPlayerOfType(target, "Figure").asInstanceOf[Figure] + val v: FilmFiguresFigure = new FilmFiguresFigure(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeFiguresIntern(this) + target.removeFilmIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: FilmFiguresFigureRole" + } + + def getSource(): IMDBdatabaseView#FilmRole = { + source + } + + def getTarget(): IMDBdatabaseView#FigureRole = { + target + } + + } + +} + +object IMDBdatabaseView extends IViewTypeInfo { + + override def getViewName(): String = "IMDBdatabaseView" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new IMDBdatabaseView() + + def getNewView(): IMDBdatabaseView = getNewViewTypeInstance().asInstanceOf[IMDBdatabaseView] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/LibrarySimple0.scala b/src/main/scala/view/LibrarySimple0.scala new file mode 100644 index 0000000..424aeda --- /dev/null +++ b/src/main/scala/view/LibrarySimple0.scala @@ -0,0 +1,209 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import lib.Library +import lib.Person +import lib.LibraryEmployeesEmployee +import lib.Employee + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class LibrarySimple0 private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[Library] || className.isInstanceOf[Employee] || className.isInstanceOf[LibraryEmployeesEmployee]) return true + return false + } + + def getViewName(): String = { + LibrarySimple0.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[Library]) return new LibraryRole(null) + if (className.isInstanceOf[Employee]) return new EmployeeRole(0, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[LibraryEmployeesEmployee]) return new LibraryEmployeesEmployeeRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[EmployeeRole]) + return null + } + + override def toString(): String = { + "VC: LibrarySimple0" + } + + def createLibrary(name: String): LibrarySimple0#LibraryRole = { + return new LibraryRole(name) + } + + def createEmployee(salary: Double, name: String): LibrarySimple0#EmployeeRole = { + return new EmployeeRole(salary, name) + } + + class LibraryRole(protected val name: String) extends AViewRole { + + private var employees: Set[LibrarySimple0#LibraryEmployeesEmployeeRole] = Set.empty + + private[LibrarySimple0] def removeEmployeesIntern(v: LibrarySimple0#LibraryEmployeesEmployeeRole): Unit = { + employees -= v + } + + private[LibrarySimple0] def setEmployeesIntern(v: LibrarySimple0#LibraryEmployeesEmployeeRole): Unit = { + employees += v + } + + def getEmployees(): Set[LibrarySimple0#EmployeeRole] = { + var vs: Set[LibrarySimple0#EmployeeRole] = Set.empty + employees.foreach { v => vs += v.getTarget() } + return vs + } + + def hasEmployees(v: LibrarySimple0#EmployeeRole): Boolean = { + return getEmployees.contains(v) + } + + def addEmployees(v: LibrarySimple0#EmployeeRole): Boolean = { + if (hasEmployees(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryEmployeesEmployeeRole(this, v) + return true + } + + def removeEmployees(v: LibrarySimple0#EmployeeRole): Boolean = { + if (!hasEmployees(v)) return false + employees.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Library(name) + } + + override def toString(): String = { + "VNR: LibraryRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + } + + class EmployeeRole(protected val salary: Double, p_Name: String) extends PersonRole(p_Name) { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(salary, name) + } + + override def toString(): String = { + "VNR: EmployeeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getSalaryView(): Double = { + +this getSalary () + } + + def setSalaryView(salary: Double): Unit = { + +this setSalary (salary) + +this changeSomething () + } + + } + + abstract class PersonRole(protected val name: String) extends AViewRole { + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + } + + class LibraryEmployeesEmployeeRole(private val source: LibrarySimple0#LibraryRole, private val target: LibrarySimple0#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setEmployeesIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: LibraryEmployeesEmployee = new LibraryEmployeesEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeEmployeesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryEmployeesEmployeeRole" + } + + def getSource(): LibrarySimple0#LibraryRole = { + source + } + + def getTarget(): LibrarySimple0#EmployeeRole = { + target + } + + } + +} + +object LibrarySimple0 extends IViewTypeInfo { + + override def getViewName(): String = "LibrarySimple0" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new LibrarySimple0() + + def getNewView(): LibrarySimple0 = getNewViewTypeInstance().asInstanceOf[LibrarySimple0] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/LibraryView.scala b/src/main/scala/view/LibraryView.scala new file mode 100644 index 0000000..eb968be --- /dev/null +++ b/src/main/scala/view/LibraryView.scala @@ -0,0 +1,269 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import lib.EmployeeManagerEmployee +import lib.Library +import lib.Person +import lib.LibraryEmployeesEmployee +import lib.Employee + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class LibraryView private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[EmployeeManagerEmployee] || className.isInstanceOf[LibraryEmployeesEmployee] || className.isInstanceOf[Library] || className.isInstanceOf[Employee]) return true + return false + } + + def getViewName(): String = { + LibraryView.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[Library]) return new LibraryRole(null) + if (className.isInstanceOf[Employee]) return new EmployeeRole(0, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[LibraryEmployeesEmployee]) return new LibraryEmployeesEmployeeRole(sourceRole.asInstanceOf[LibraryRole], targetRole.asInstanceOf[EmployeeRole]) + if (className.isInstanceOf[EmployeeManagerEmployee]) return new EmployeeManagerEmployeeRole(sourceRole.asInstanceOf[EmployeeRole], targetRole.asInstanceOf[EmployeeRole]) + return null + } + + override def toString(): String = { + "VC: LibraryView" + } + + def createLibrary(name: String): LibraryView#LibraryRole = { + return new LibraryRole(name) + } + + def createEmployee(salary: Double, name: String): LibraryView#EmployeeRole = { + return new EmployeeRole(salary, name) + } + + class LibraryRole(protected val name: String) extends AViewRole { + + private var employees: Set[LibraryView#LibraryEmployeesEmployeeRole] = Set.empty + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Library(name) + } + + override def toString(): String = { + "VNR: LibraryRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + private[LibraryView] def removeEmployeesIntern(v: LibraryView#LibraryEmployeesEmployeeRole): Unit = { + employees -= v + } + + private[LibraryView] def setEmployeesIntern(v: LibraryView#LibraryEmployeesEmployeeRole): Unit = { + employees += v + } + + def getEmployees(): Set[LibraryView#EmployeeRole] = { + var vs: Set[LibraryView#EmployeeRole] = Set.empty + employees.foreach { v => vs += v.getTarget() } + return vs + } + + def hasEmployees(v: LibraryView#EmployeeRole): Boolean = { + return getEmployees.contains(v) + } + + def addEmployees(v: LibraryView#EmployeeRole): Boolean = { + if (hasEmployees(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new LibraryEmployeesEmployeeRole(this, v) + return true + } + + def removeEmployees(v: LibraryView#EmployeeRole): Boolean = { + if (!hasEmployees(v)) return false + employees.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + } + + class EmployeeRole(protected val salary: Double, p_Name: String) extends PersonRole(p_Name) { + + private var manager: LibraryView#EmployeeManagerEmployeeRole = null + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(salary, name) + } + + override def toString(): String = { + "VNR: EmployeeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getSalaryView(): Double = { + +this getSalary () + } + + def setSalaryView(salary: Double): Unit = { + +this setSalary (salary) + +this changeSomething () + } + + private[LibraryView] def removeManagerIntern(v: LibraryView#EmployeeManagerEmployeeRole): Unit = { + manager = null + } + + private[LibraryView] def setManagerIntern(v: LibraryView#EmployeeManagerEmployeeRole): Unit = { + manager = v + } + + def getManager(): LibraryView#EmployeeRole = { + return manager.getTarget() + } + + def setManager(v: LibraryView#EmployeeRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (manager != null) { + if (manager.getTarget() == v) return false + manager.deleteElement() + } + new EmployeeManagerEmployeeRole(this, v) + return true + } + + } + + abstract class PersonRole(protected val name: String) extends AViewRole { + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + } + + class LibraryEmployeesEmployeeRole(private val source: LibraryView#LibraryRole, private val target: LibraryView#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setEmployeesIntern(this) + val sp: Library = getPlayerOfType(source, "Library").asInstanceOf[Library] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: LibraryEmployeesEmployee = new LibraryEmployeesEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeEmployeesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: LibraryEmployeesEmployeeRole" + } + + def getSource(): LibraryView#LibraryRole = { + source + } + + def getTarget(): LibraryView#EmployeeRole = { + target + } + + } + + class EmployeeManagerEmployeeRole(private val source: LibraryView#EmployeeRole, private val target: LibraryView#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setManagerIntern(this) + val sp: Employee = getPlayerOfType(source, "Employee").asInstanceOf[Employee] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: EmployeeManagerEmployee = new EmployeeManagerEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeManagerIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: EmployeeManagerEmployeeRole" + } + + def getSource(): LibraryView#EmployeeRole = { + source + } + + def getTarget(): LibraryView#EmployeeRole = { + target + } + + } + +} + +object LibraryView extends IViewTypeInfo { + + override def getViewName(): String = "LibraryView" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new LibraryView() + + def getNewView(): LibraryView = getNewViewTypeInstance().asInstanceOf[LibraryView] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/Manager0.scala b/src/main/scala/view/Manager0.scala new file mode 100644 index 0000000..8aa7d13 --- /dev/null +++ b/src/main/scala/view/Manager0.scala @@ -0,0 +1,162 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import lib.Employee +import lib.EmployeeManagerEmployee +import lib.Person + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo + +class Manager0 private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[Employee] || className.isInstanceOf[EmployeeManagerEmployee]) return true + return false + } + + def getViewName(): String = { + Manager0.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[Employee]) return new EmployeeRole(0, null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[EmployeeManagerEmployee]) return new EmployeeManagerEmployeeRole(sourceRole.asInstanceOf[EmployeeRole], targetRole.asInstanceOf[EmployeeRole]) + return null + } + + override def toString(): String = { + "VC: Manager0" + } + + def createEmployee(salary: Double, name: String): Manager0#EmployeeRole = { + return new EmployeeRole(salary, name) + } + + class EmployeeRole(protected val salary: Double, p_Name: String) extends PersonRole(p_Name) { + + private var manager: Manager0#EmployeeManagerEmployeeRole = null + + private[Manager0] def removeManagerIntern(v: Manager0#EmployeeManagerEmployeeRole): Unit = { + manager = null + } + + private[Manager0] def setManagerIntern(v: Manager0#EmployeeManagerEmployeeRole): Unit = { + manager = v + } + + def getManager(): Manager0#EmployeeRole = { + return manager.getTarget() + } + + def setManager(v: Manager0#EmployeeRole): Boolean = { + if (v == null) return false + if (!containsRole(v.asInstanceOf[AViewRole])) return false + if (manager != null) { + if (manager.getTarget() == v) return false + manager.deleteElement() + } + new EmployeeManagerEmployeeRole(this, v) + return true + } + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Employee(salary, name) + } + + override def toString(): String = { + "VNR: EmployeeRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getSalaryView(): Double = { + +this getSalary () + } + + def setSalaryView(salary: Double): Unit = { + +this setSalary (salary) + +this changeSomething () + } + + } + + abstract class PersonRole(protected val name: String) extends AViewRole { + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getNameView(): String = { + +this getName () + } + + def setNameView(name: String): Unit = { + +this setName (name) + +this changeSomething () + } + + } + + class EmployeeManagerEmployeeRole(private val source: Manager0#EmployeeRole, private val target: Manager0#EmployeeRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setManagerIntern(this) + val sp: Employee = getPlayerOfType(source, "Employee").asInstanceOf[Employee] + val tp: Employee = getPlayerOfType(target, "Employee").asInstanceOf[Employee] + val v: EmployeeManagerEmployee = new EmployeeManagerEmployee(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeManagerIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: EmployeeManagerEmployeeRole" + } + + def getSource(): Manager0#EmployeeRole = { + source + } + + def getTarget(): Manager0#EmployeeRole = { + target + } + + } + +} + +object Manager0 extends IViewTypeInfo { + + override def getViewName(): String = "Manager0" + + def getJoinInfos(): Set[IJoinInfo] = Set.empty + + protected def getNewInstance(): IViewCompartment = new Manager0() + + def getNewView(): Manager0 = getNewViewTypeInstance().asInstanceOf[Manager0] +} + + + \ No newline at end of file diff --git a/src/main/scala/view/Simple0.scala b/src/main/scala/view/Simple0.scala new file mode 100644 index 0000000..abce951 --- /dev/null +++ b/src/main/scala/view/Simple0.scala @@ -0,0 +1,314 @@ +package view + +import org.rosi_project.model_management.sum.IViewCompartment +import imdbdatabase.VoteFilmFilm +import imdbdatabase.Film +import elib.VideoCassette +import joins.JoinMovie +import elib.Person +import elib.VideoCassetteCastPerson +import imdbdatabase.Vote + +import org.rosi_project.model_management.sum.IViewTypeInfo +import org.rosi_project.model_management.sum.join.IJoinInfo +import joins.JoinMovieObject + +class Simple0 private extends IViewCompartment { + + protected def isViewable(className: Object): Boolean = { + if (className.isInstanceOf[Person] || className.isInstanceOf[Vote] || className.isInstanceOf[JoinMovie] || className.isInstanceOf[VoteFilmFilm] || className.isInstanceOf[VideoCassetteCastPerson]) return true + return false + } + + def getViewName(): String = { + Simple0.getViewName() + } + + protected def getNaturalRole(className: Object): AViewRole = { + if (className.isInstanceOf[JoinMovie]) return new JoinMovieRole(null, 0, 0) + if (className.isInstanceOf[Vote]) return new VoteRole(0) + if (className.isInstanceOf[Person]) return new PersonRole(null) + return null + } + + protected def getRelationalRole(className: Object, sourceRole: AViewRole, targetRole: AViewRole): AViewRole = { + if (className.isInstanceOf[VoteFilmFilm]) return new VoteFilmFilmRole(sourceRole.asInstanceOf[VoteRole], targetRole.asInstanceOf[JoinMovieRole]) + if (className.isInstanceOf[VideoCassetteCastPerson]) return new VideoCassetteCastPersonRole(sourceRole.asInstanceOf[JoinMovieRole], targetRole.asInstanceOf[PersonRole]) + return null + } + + override def toString(): String = { + "VC: Simple0" + } + + def createJoinMovie(title: String, year: Int, minutesLength: Int): Simple0#JoinMovieRole = { + return new JoinMovieRole(title, year, minutesLength) + } + + def createVote(score: Int): Simple0#VoteRole = { + return new VoteRole(score) + } + + def createPerson(lastName: String): Simple0#PersonRole = { + return new PersonRole(lastName) + } + + class JoinMovieRole(protected val title: String, protected val year: Int, protected val minutesLength: Int) extends AViewRole { + + private var votes: Set[Simple0#VoteFilmFilmRole] = Set.empty + private var cast: Set[Simple0#VideoCassetteCastPersonRole] = Set.empty + + private[Simple0] def removeVotesIntern(v: Simple0#VoteFilmFilmRole): Unit = { + votes -= v + } + + private[Simple0] def setVotesIntern(v: Simple0#VoteFilmFilmRole): Unit = { + votes += v + } + + def getVotes(): Set[Simple0#VoteRole] = { + var vs: Set[Simple0#VoteRole] = Set.empty + votes.foreach { v => vs += v.getSource() } + return vs + } + + def hasVotes(v: Simple0#VoteRole): Boolean = { + return getVotes.contains(v) + } + + def addVotes(v: Simple0#VoteRole): Boolean = { + if (hasVotes(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new VoteFilmFilmRole(v, this) + return true + } + + def removeVotes(v: Simple0#VoteRole): Boolean = { + if (!hasVotes(v)) return false + votes.foreach { h => + if (h.getSource() == v) { + h.deleteElement() + return true + } + } + return true + } + + private[Simple0] def removeCastIntern(v: Simple0#VideoCassetteCastPersonRole): Unit = { + cast -= v + } + + private[Simple0] def setCastIntern(v: Simple0#VideoCassetteCastPersonRole): Unit = { + cast += v + } + + def getCast(): Set[Simple0#PersonRole] = { + var vs: Set[Simple0#PersonRole] = Set.empty + cast.foreach { v => vs += v.getTarget() } + return vs + } + + def hasCast(v: Simple0#PersonRole): Boolean = { + return getCast.contains(v) + } + + def addCast(v: Simple0#PersonRole): Boolean = { + if (hasCast(v) || !containsRole(v.asInstanceOf[AViewRole])) return false + new VideoCassetteCastPersonRole(this, v) + return true + } + + def removeCast(v: Simple0#PersonRole): Boolean = { + if (!hasCast(v)) return false + cast.foreach { h => + if (h.getTarget() == v) { + h.deleteElement() + return true + } + } + return true + } + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new JoinMovie(new Film(year, title), new VideoCassette(false, minutesLength, title, null)) + } + + override def toString(): String = { + "VNR: JoinMovieRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getTitleView(): String = { + +this getTitle () + } + + def setTitleView(title: String): Unit = { + +this setTitle (title) + +this changeSomething () + } + + def getYearView(): Int = { + +this getYear () + } + + def setYearView(year: Int): Unit = { + +this setYear (year) + +this changeSomething () + } + + def getMinutesLengthView(): Int = { + +this getMinutesLength () + } + + def setMinutesLengthView(minuteslength: Int): Unit = { + +this setMinutesLength (minuteslength) + +this changeSomething () + } + + } + + class VoteRole(protected val score: Int) extends AViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Vote(score) + } + + override def toString(): String = { + "VNR: VoteRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getScoreView(): Int = { + +this getScore () + } + + def setScoreView(score: Int): Unit = { + +this setScore (score) + +this changeSomething () + } + + } + + class VoteFilmFilmRole(private val source: Simple0#VoteRole, private val target: Simple0#JoinMovieRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + target.setVotesIntern(this) + val sp: Vote = getPlayerOfType(source, "Vote").asInstanceOf[Vote] + val tp: Film = getPlayerOfType(target, "Film").asInstanceOf[Film] + val v: VoteFilmFilm = new VoteFilmFilm(sp, tp) + return v + } + + override def deleteElement(): Unit = { + target.removeVotesIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: VoteFilmFilmRole" + } + + def getSource(): Simple0#VoteRole = { + source + } + + def getTarget(): Simple0#JoinMovieRole = { + target + } + + } + + class PersonRole(protected val lastName: String) extends AViewRole { + + override protected def isRelational(): Boolean = { + return false + } + + override protected def getCreationObject(): Object = { + return new Person(lastName, null) + } + + override def toString(): String = { + "VNR: PersonRole" + } + + override def deleteElement(): Unit = { + super.deleteElement() + } + + def getLastNameView(): String = { + +this getLastName () + } + + def setLastNameView(lastname: String): Unit = { + +this setLastName (lastname) + +this changeSomething () + } + + } + + class VideoCassetteCastPersonRole(private val source: Simple0#JoinMovieRole, private val target: Simple0#PersonRole) extends AViewRole { + + override protected def isRelational(): Boolean = { + return true + } + + override protected def getCreationObject(): Object = { + source.setCastIntern(this) + val sp: VideoCassette = getPlayerOfType(source, "VideoCassette").asInstanceOf[VideoCassette] + val tp: Person = getPlayerOfType(target, "Person").asInstanceOf[Person] + val v: VideoCassetteCastPerson = new VideoCassetteCastPerson(sp, tp) + return v + } + + override def deleteElement(): Unit = { + source.removeCastIntern(this) + super.deleteElement() + } + + override def toString(): String = { + "VRR: VideoCassetteCastPersonRole" + } + + def getSource(): Simple0#JoinMovieRole = { + source + } + + def getTarget(): Simple0#PersonRole = { + target + } + + } + +} + +object Simple0 extends IViewTypeInfo { + + override def getViewName(): String = "Simple0" + + def getJoinInfos(): Set[IJoinInfo] = Set(JoinMovieObject) + + protected def getNewInstance(): IViewCompartment = new Simple0() + + def getNewView(): Simple0 = getNewViewTypeInstance().asInstanceOf[Simple0] +} + + + \ No newline at end of file diff --git a/support/scalastyle_config.xml b/support/scalastyle_config.xml new file mode 100644 index 0000000..a34869a --- /dev/null +++ b/support/scalastyle_config.xml @@ -0,0 +1,188 @@ +<scalastyle commentFilter="enabled"> + <name>Scalastyle standard configuration</name> + <check class="org.scalastyle.file.FileTabChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.file.FileLengthChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxFileLength"><![CDATA[800]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.file.HeaderMatchesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="header"><![CDATA[// Copyright (C) 2011-2012 the original author or authors. +// See the LICENCE.txt file distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.SpacesAfterPlusChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.file.WhitespaceEndOfLineChecker" level="warning" enabled="true"> + <parameters> + <parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.SpacesBeforePlusChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.file.FileLineLengthChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxLineLength"><![CDATA[160]]></parameter> + <parameter name="tabSize"><![CDATA[4]]></parameter> + <parameter name="ignoreImports"><![CDATA[false]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.ClassNamesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[A-Z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.ObjectNamesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[A-Z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.PackageObjectNamesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.EqualsHashCodeChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.IllegalImportsChecker" level="warning" enabled="true"> + <parameters> + <parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.ParameterNumberChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxParameters"><![CDATA[8]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.MagicNumberChecker" level="warning" enabled="true"> + <parameters> + <parameter name="ignore"><![CDATA[-1,0,1,2,3]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.ReturnChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.NullChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.NoCloneChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.NoFinalizeChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.CovariantEqualsChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.StructuralTypeChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.file.RegexChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[println]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.NumberOfTypesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxTypes"><![CDATA[30]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.CyclomaticComplexityChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maximum"><![CDATA[10]]></parameter> + <parameter name="countCases"><![CDATA[true]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.UppercaseLChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.IfBraceChecker" level="warning" enabled="true"> + <parameters> + <parameter name="singleLineAllowed"><![CDATA[true]]></parameter> + <parameter name="doubleLineAllowed"><![CDATA[false]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.MethodLengthChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxLength"><![CDATA[50]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.MethodNamesChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*(_=)?$]]></parameter> + <parameter name="ignoreRegex"><![CDATA[^$]]></parameter> + <parameter name="ignoreOverride"><![CDATA[false]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" level="warning" enabled="true"> + <parameters> + <parameter name="maxMethods"><![CDATA[30]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" level="warning" enabled="true"> + <parameters> + <parameter name="ignoreOverride"><![CDATA[false]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.file.NewLineAtEofChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.file.NoNewLineAtEofChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.WhileChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.VarFieldChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.VarLocalChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.RedundantIfChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.TokenChecker" level="warning" enabled="false"> + <parameters> + <parameter name="regex"><![CDATA[println]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.DeprecatedJavaChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.OverrideJavaChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.EmptyClassChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.ClassTypeParameterChecker" level="warning" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[A-Z_]$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.UnderscoreImportChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.LowercasePatternMatchChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.EmptyInterpolatedStringChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.MultipleStringLiteralsChecker" level="warning" enabled="true"> + <parameters> + <parameter name="allowed"><![CDATA[2]]></parameter> + <parameter name="ignoreRegex"><![CDATA[^""$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.ImportGroupingChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.NotImplementedErrorUsage" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.BlockImportChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.ProcedureDeclarationChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.ForBraceChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.ForLoopChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" level="warning" enabled="true"></check> + <check class="org.scalastyle.scalariform.ScalaDocChecker" level="warning" enabled="false"> + <parameters> + <parameter name="ignoreRegex"><![CDATA[^$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.DisallowSpaceAfterTokenChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.DisallowSpaceBeforeTokenChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.EnsureSingleSpaceAfterTokenChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.EnsureSingleSpaceBeforeTokenChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.scalariform.NonASCIICharacterChecker" level="warning" enabled="false"></check> + <check class="org.scalastyle.file.IndentationChecker" level="warning" enabled="false"> + <parameters> + <parameter name="tabSize"><![CDATA[2]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.FieldNamesChecker" level="warning" enabled="false"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> + <parameter name="objectFieldRegex"><![CDATA[^[A-Z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check class="org.scalastyle.scalariform.TodoCommentChecker" level="warning" enabled="true"> + <parameters> + <parameter name="words"><![CDATA[TODO|FIXME]]></parameter> + </parameters> + </check> +</scalastyle> -- GitLab