diff --git a/.gitignore b/.gitignore index add57be707d1a627fd960286263733b8f2df2dcb..39c9242eb40e21a67593d81d4887d49121dee624 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin/ obj/ /packages/ riderModule.iml -/_ReSharper.Caches/ \ No newline at end of file +/_ReSharper.Caches/ +.idea/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb237a24279961bf5df6043f2aa6888db56c2f12..9e054866b0c5f8e25b7290718d814da670014851 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,7 @@ unit-tests-development: only: - develop script: - - 'sudo dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=..\artifacts\{assembly}-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose"' + - 'dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=..\artifacts\{assembly}-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose"' artifacts: when: always paths: @@ -67,7 +67,7 @@ unit-tests-production: only: - main script: - - 'sudo dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=..\artifacts\{assembly}-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose"' + - 'dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=..\artifacts\{assembly}-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose"' artifacts: when: always paths: @@ -104,13 +104,10 @@ sonarqube-check: paths: - .sonar/cache script: - - "sudo apt-get update" - - "sudo apt-get install --yes --no-install-recommends openjdk-17-jre" - - "sudo dotnet tool install --global dotnet-sonarscanner" - - "sudo export PATH=\"$PATH:$HOME/.dotnet/tools\"" - - "sudo dotnet sonarscanner begin /k:\"kon0379DiplomaThesis\" /d:sonar.token=\"$SONAR_TOKEN\" /d:\"sonar.host.url=$SONAR_HOST_URL\" " - - "sudo dotnet build" - - "sudo dotnet sonarscanner end /d:sonar.token=\"$SONAR_TOKEN\"" + - "dotnet sonarscanner begin /k:\"kon0379DiplomaThesis\" /d:sonar.token=\"$SONAR_TOKEN\" /d:\"sonar.host.url=$SONAR_HOST_URL\" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml" + - sudo dotnet build --no-incremental + - sudo /home/fei/kon0379/.dotnet/tools/dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml" + - "dotnet sonarscanner end /d:sonar.token=\"$SONAR_TOKEN\"" allow_failure: true only: - merge_requests @@ -121,11 +118,13 @@ sonarqube-check: optional: true - job: unit-tests-development optional: true + environment: + name: qa sonarqube-vulnerability-report: stage: sonarqube-vulnerability-report script: - - 'sudo curl -u "${SONAR_TOKEN}:" "${SONAR_HOST_URL}/api/issues/gitlab_sast_export?projectKey=kon0379DiplomaThesis&branch=${CI_COMMIT_BRANCH}&pullRequest=${CI_MERGE_REQUEST_IID}" -o gl-sast-sonar-report.json' + - 'curl -u "${SONAR_TOKEN}:" "${SONAR_HOST_URL}/api/issues/gitlab_sast_export?projectKey=kon0379DiplomaThesis&branch=${CI_COMMIT_BRANCH}&pullRequest=${CI_MERGE_REQUEST_IID}" -o gl-sast-sonar-report.json' allow_failure: true only: - merge_requests @@ -137,4 +136,6 @@ sonarqube-vulnerability-report: sast: gl-sast-sonar-report.json needs: - sonarqube-check + environment: + name: qa diff --git a/.idea/.idea.CodeParser/.idea/workspace.xml b/.idea/.idea.CodeParser/.idea/workspace.xml deleted file mode 100644 index 464ebe8be28f9b403bac42c766c3ed30d9ff85fa..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeParser/.idea/workspace.xml +++ /dev/null @@ -1,126 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="AutoGeneratedRunConfigurationManager"> - <projectFile>ConsoleApp1/ConsoleApp1.csproj</projectFile> - </component> - <component name="AutoImportSettings"> - <option name="autoReloadType" value="SELECTIVE" /> - </component> - <component name="ChangeListManager"> - <list default="true" id="38df7b5a-e819-45ed-9bf5-eb7ce2106e88" name="Changes" comment="" /> - <option name="SHOW_DIALOG" value="false" /> - <option name="HIGHLIGHT_CONFLICTS" value="true" /> - <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> - <option name="LAST_RESOLUTION" value="IGNORE" /> - </component> - <component name="Git.Settings"> - <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> - </component> - <component name="MarkdownSettingsMigration"> - <option name="stateVersion" value="1" /> - </component> - <component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" /> - <component name="ProjectColorInfo"><![CDATA[{ - "associatedIndex": 4 -}]]></component> - <component name="ProjectId" id="2WL74YsffR7PLpZQhzToFOyb7sj" /> - <component name="ProjectLevelVcsManager" settingsEditedManually="true" /> - <component name="ProjectViewState"> - <option name="autoscrollFromSource" value="true" /> - <option name="hideEmptyMiddlePackages" value="true" /> - <option name="showLibraryContents" value="true" /> - </component> - <component name="PropertiesComponent"><![CDATA[{ - "keyToString": { - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "WebServerToolWindowFactoryState": "false", - "git-widget-placeholder": "main", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "preferences.pluginManager", - "vue.rearranger.settings.migration": "true" - }, - "keyToStringList": { - "rider.external.source.directories": [ - "C:\\Users\\root\\AppData\\Roaming\\JetBrains\\Rider2023.2\\resharper-host\\DecompilerCache", - "C:\\Users\\root\\AppData\\Roaming\\JetBrains\\Rider2023.2\\resharper-host\\SourcesCache", - "C:\\Users\\root\\AppData\\Local\\Symbols\\src" - ] - } -}]]></component> - <component name="RunManager"> - <configuration name="ConsoleApp1" type="DotNetProject" factoryName=".NET Project"> - <option name="EXE_PATH" value="" /> - <option name="PROGRAM_PARAMETERS" value="" /> - <option name="WORKING_DIRECTORY" value="" /> - <option name="PASS_PARENT_ENVS" value="1" /> - <option name="USE_EXTERNAL_CONSOLE" value="0" /> - <option name="USE_MONO" value="0" /> - <option name="RUNTIME_ARGUMENTS" value="" /> - <option name="PROJECT_PATH" value="$PROJECT_DIR$/ConsoleApp1/ConsoleApp1.csproj" /> - <option name="PROJECT_EXE_PATH_TRACKING" value="1" /> - <option name="PROJECT_ARGUMENTS_TRACKING" value="1" /> - <option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" /> - <option name="PROJECT_KIND" value="DotNetCore" /> - <option name="PROJECT_TFM" value="" /> - <method v="2"> - <option name="Build" /> - </method> - </configuration> - </component> - <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> - <component name="TaskManager"> - <task active="true" id="Default" summary="Default task"> - <changelist id="38df7b5a-e819-45ed-9bf5-eb7ce2106e88" name="Changes" comment="" /> - <created>1696499815256</created> - <option name="number" value="Default" /> - <option name="presentableId" value="Default" /> - <updated>1696499815256</updated> - <workItem from="1696499816476" duration="339000" /> - </task> - <task id="LOCAL-00001" summary="Add project files"> - <option name="closed" value="true" /> - <created>1696499974654</created> - <option name="number" value="00001" /> - <option name="presentableId" value="LOCAL-00001" /> - <option name="project" value="LOCAL" /> - <updated>1696499974654</updated> - </task> - <task id="LOCAL-00002" summary="Rename solution"> - <option name="closed" value="true" /> - <created>1696500005181</created> - <option name="number" value="00002" /> - <option name="presentableId" value="LOCAL-00002" /> - <option name="project" value="LOCAL" /> - <updated>1696500005181</updated> - </task> - <option name="localTasksCounter" value="3" /> - <servers /> - </component> - <component name="TypeScriptGeneratedFilesManager"> - <option name="version" value="3" /> - </component> - <component name="UnityCheckinConfiguration" checkUnsavedScenes="true" /> - <component name="Vcs.Log.Tabs.Properties"> - <option name="TAB_STATES"> - <map> - <entry key="MAIN"> - <value> - <State /> - </value> - </entry> - </map> - </option> - </component> - <component name="VcsManagerConfiguration"> - <option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" /> - <MESSAGE value="Add project files" /> - <MESSAGE value="Rename solution" /> - <option name="LAST_COMMIT_MESSAGE" value="Rename solution" /> - <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/.idea/.gitignore b/.idea/.idea.CodeToXMI/.idea/.gitignore deleted file mode 100644 index 62202acab239134ba51f8d97e89f45052377ac94..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/projectSettingsUpdater.xml -/.idea.CodeParser.iml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.CodeToXMI/.idea/.name b/.idea/.idea.CodeToXMI/.idea/.name deleted file mode 100644 index 908c041042d035cea7c8262aa7eca749aff5c982..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -CodeToXMI \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/.idea/encodings.xml b/.idea/.idea.CodeToXMI/.idea/encodings.xml deleted file mode 100644 index df87cf951fb4858ab7a76b68dd479c98b2df2404..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" /> -</project> \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/.idea/indexLayout.xml b/.idea/.idea.CodeToXMI/.idea/indexLayout.xml deleted file mode 100644 index 7b08163cebc50fb3e777eea4881b68fcebc10590..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="UserContentModel"> - <attachedFolders /> - <explicitIncludes /> - <explicitExcludes /> - </component> -</project> \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/.idea/misc.xml b/.idea/.idea.CodeToXMI/.idea/misc.xml deleted file mode 100644 index c3a6a2aaa476bfa0bf3c967f0c301a117760cf53..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/misc.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ANTLRGenerationPreferences"> - <option name="perGrammarGenerationSettings"> - <list> - <PerGrammarGenerationSettings> - <option name="fileName" value="$PROJECT_DIR$/LanguageRecogniser/Cpp/CPP14Parser.g4" /> - <option name="autoGen" value="true" /> - <option name="outputDir" value="/gen" /> - <option name="libDir" value="" /> - <option name="encoding" value="" /> - <option name="pkg" value="" /> - <option name="language" value="CSharp" /> - <option name="generateVisitor" value="true" /> - </PerGrammarGenerationSettings> - </list> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/.idea/vcs.xml b/.idea/.idea.CodeToXMI/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4cb416c083d265558da75d457237d671..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/.idea.CodeToXMI/Docker/docker-compose.development.generated.override.yml b/.idea/.idea.CodeToXMI/Docker/docker-compose.development.generated.override.yml deleted file mode 100644 index 13ca75c3e6f9c43eaf30ad290183d01a70d632d0..0000000000000000000000000000000000000000 --- a/.idea/.idea.CodeToXMI/Docker/docker-compose.development.generated.override.yml +++ /dev/null @@ -1,21 +0,0 @@ -# This is a generated file. Not intended for manual editing. -version: "3" -services: - codeToXMI_dev: - build: - context: "/Users/jakubkonvicka/RiderProjects/diplomathesis" - dockerfile: "./WebAPI/Dockerfile" - target: "base" - command: [] - entrypoint: - - "dotnet" - - "/app/bin/Debug/net7.0/WebAPI.dll" - environment: - DOTNET_USE_POLLING_FILE_WATCHER: "true" - image: "webapi:dev" - ports: [] - volumes: - - "/Users/jakubkonvicka/.nuget/packages:/root/.nuget/packages" - - "/Users/jakubkonvicka/RiderProjects/diplomathesis/WebAPI:/app:rw" - - "/Users/jakubkonvicka/RiderProjects/diplomathesis:/src:rw" - working_dir: "/app" diff --git a/DiagramBuilder/Class/Diagram/ClassBuilder.cs b/DiagramBuilder/Class/Diagram/ClassBuilder.cs index f39ae366efd382fe663f85f0468812cd4f1a3d10..20d295bd236858757f7e65f7b632dbaa273d43a2 100644 --- a/DiagramBuilder/Class/Diagram/ClassBuilder.cs +++ b/DiagramBuilder/Class/Diagram/ClassBuilder.cs @@ -25,10 +25,10 @@ public class ClassBuilder : IClassBuilder { return new OperationBuilder(_xmiClassDiagramUmlBuilder, _class, name, returnType, visibilityType); } - - public IClassBuilder AddAssociation(string? targetClassName, VisibilityType visibilityType, AssociationType associationType) + + public IClassBuilder AddAssociation(string? targetClassName, string? name, VisibilityType visibilityType, AssociationType associationType) { - _xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, visibilityType, associationType); + _xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, name, visibilityType, associationType); return this; } diff --git a/DiagramBuilder/Class/Diagram/OperationBuilder.cs b/DiagramBuilder/Class/Diagram/OperationBuilder.cs index 97866c4731d6b4604acde9b52f8775dea10fe889..f1077e48cda708f8e56d94cb65d2088734318a27 100644 --- a/DiagramBuilder/Class/Diagram/OperationBuilder.cs +++ b/DiagramBuilder/Class/Diagram/OperationBuilder.cs @@ -30,9 +30,9 @@ public class OperationBuilder : IOperationBuilder return this; } - public IClassBuilder AddAssociation(string? targetClassName, VisibilityType visibilityType, AssociationType associationType) + public IClassBuilder AddAssociation(string? targetClassName, string? name, VisibilityType visibilityType, AssociationType associationType) { - _xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, visibilityType, associationType); + _xmiClassDiagramUmlBuilder.AddAssociation(_class, targetClassName, name, visibilityType, associationType); return this; } diff --git a/DiagramBuilder/Class/Interface/IClassBuilder.cs b/DiagramBuilder/Class/Interface/IClassBuilder.cs index a67fdc47cb0aac2aecba061076eacb06ace9b08c..1f044806b3c76702aa783d694dacdd26fe2e2788 100644 --- a/DiagramBuilder/Class/Interface/IClassBuilder.cs +++ b/DiagramBuilder/Class/Interface/IClassBuilder.cs @@ -6,6 +6,6 @@ public interface IClassBuilder { IClassBuilder AddProperty(string? name, VisibilityType visibilityType, PropertyType propertyType); IOperationBuilder AddOperation(string? name, PropertyType returnType, VisibilityType visibilityType); - IClassBuilder AddAssociation(string? targetClass, VisibilityType visibilityType, AssociationType associationType); + IClassBuilder AddAssociation(string? targetClass, string? name, VisibilityType visibilityType, AssociationType associationType); IClassBuilder AddGeneralization(string? targetClass); } \ No newline at end of file diff --git a/DiagramBuilder/Class/XML/XmiClassDiagramUmlBuilder.cs b/DiagramBuilder/Class/XML/XmiClassDiagramUmlBuilder.cs index 8dace8732d6d89e6e5d3b343857fe8e1b00dbd95..e6fdadc02e25c4437b7a5c9ebdf0b00f69f3ddbf 100644 --- a/DiagramBuilder/Class/XML/XmiClassDiagramUmlBuilder.cs +++ b/DiagramBuilder/Class/XML/XmiClassDiagramUmlBuilder.cs @@ -92,15 +92,15 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder return operation; } - public void AddAssociation(XmiElement parent, string? targetClassName, VisibilityType visibilityType, AssociationType associationType) + public void AddAssociation(XmiElement parent, string? targetClassName, string? name, VisibilityType visibilityType, AssociationType associationType) { string? packageName = parent.XmlElement.GetAttribute("xmi:id").Split('-')[0]; string parentName = parent.XmlElement.GetAttribute("name"); - string associationName = $"{packageName}-Association{_nextPackageAssociationId[packageName].ToString()}"; + string associationName = $"{packageName}-Association_{{name}}_{_nextPackageAssociationId[packageName].ToString()}"; var association = new Association() { - Name = $"Association{_nextPackageAssociationId[packageName].ToString()}", + Name = $"Association_{name}_{_nextPackageAssociationId[packageName].ToString()}", Package = packageName, Source = new AssociationDetail() { @@ -264,7 +264,7 @@ public class XmiClassDiagramUmlBuilder : DiagramUmlBuilder } else { - throw new ArgumentException($"Target class {association.Target.ClassName} not found"); + Console.WriteLine($"Target class {association.Target.ClassName} not found"); } } } diff --git a/LanguageRecogniser/Cpp/CppActivityDiagramVisitor.cs b/LanguageRecogniser/Cpp/CppActivityDiagramVisitor.cs index 7a9b441d76668289b0ea4fe285a5d28e5cf02640..625048505ef2a2641202de8f4cdc08e00097cf5e 100644 --- a/LanguageRecogniser/Cpp/CppActivityDiagramVisitor.cs +++ b/LanguageRecogniser/Cpp/CppActivityDiagramVisitor.cs @@ -10,11 +10,16 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> private IDiagramBuilder _diagramBuilder { get; set; } private string functionIdentifier { get; set; } private Stack<(IDecisionBuilder, Stack<BranchType>)> _decisionBuilderStack { get; set; } = new Stack<(IDecisionBuilder, Stack<BranchType>)>(); + private long decisionUniqueueId { get; set; } = 0; + + private string actualContext { get; set; } = string.Empty; + private string contextIdentifier { get; set; } = string.Empty; - public CppActivityDiagramVisitor(IDiagramBuilder diagramBuilder, string functionIdentifier) + public CppActivityDiagramVisitor(IDiagramBuilder diagramBuilder, string contextIdentifier, string functionIdentifier) { _diagramBuilder = diagramBuilder; this.functionIdentifier = functionIdentifier; + this.contextIdentifier = contextIdentifier; } public override object VisitTranslationUnit(CPP14Parser.TranslationUnitContext context) @@ -49,16 +54,35 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> { Visit(context.namespaceDefinition()); } + else if(context.blockDeclaration().simpleDeclaration() != null) + { + VisitChildren(context.blockDeclaration().simpleDeclaration().declSpecifierSeq()); + } return null; } + public override string VisitClassSpecifier(CPP14Parser.ClassSpecifierContext context) + { + var className = Visit(context.classHead().classHeadName()); + + this.actualContext = className as string; + Visit(context.memberSpecification()); + this.actualContext = string.Empty; + return string.Empty; + } + + public override string VisitClassName(CPP14Parser.ClassNameContext context) + { + return context.Identifier()?.GetText(); + } + public override object VisitFunctionDefinition(CPP14Parser.FunctionDefinitionContext context) { var functionName = context.declarator().pointerDeclarator().noPointerDeclarator().noPointerDeclarator() .declaratorid().GetText(); - if (this.functionIdentifier == functionName) + if (this.functionIdentifier == functionName && this.contextIdentifier == this.actualContext) { Visit(context.functionBody()); } @@ -175,7 +199,8 @@ public class CppActivityDiagramVisitor : CPP14ParserBaseVisitor<object> } long count = _decisionBuilderStack.Count(); - _decisionBuilderStack.Pop().Item1.AddMerge($"merge-{count}"); + decisionUniqueueId++; + _decisionBuilderStack.Pop().Item1.AddMerge($"merge-{decisionUniqueueId}"); return null; } diff --git a/LanguageRecogniser/Cpp/CppClassDiagramVisitor.cs b/LanguageRecogniser/Cpp/CppClassDiagramVisitor.cs index e9f6f672b3385d11150a3dd58e21ce56590ff572..69148f204e76c939d20d8e8335a6bd50e764231f 100644 --- a/LanguageRecogniser/Cpp/CppClassDiagramVisitor.cs +++ b/LanguageRecogniser/Cpp/CppClassDiagramVisitor.cs @@ -112,31 +112,31 @@ public class CppClassDiagramVisitor : CPP14ParserBaseVisitor<object> else { // Regular expressions - string aggregationPattern = @"^(std::vector<(\w*)\*>|(\w*)\*|(\w*)\* (\w*|\[\]))$"; - string compositionPattern = @"^(std::vector<(\w*)>|(\w*)|(\w*) (\w*|\[\]))$"; + string aggregationPattern = @"^(?:std::)?(?:vector<)?(\w+)\*>?(?![\w*])$"; + string compositionPattern = @"^(?:std::)?(?:vector<)?(\w+)>?$"; // Check if the property type matches aggregation or composition Match aggregationMatch = Regex.Match(atribute.Type, aggregationPattern); Match compositionMatch = Regex.Match(atribute.Type, compositionPattern); - - if (aggregationMatch.Success && !string.IsNullOrEmpty(aggregationMatch.Groups[2].Value)) + int groupMatch = 1; + if (aggregationMatch.Success && !string.IsNullOrEmpty(aggregationMatch.Groups[groupMatch].Value)) { // Aggregation type - string? typeName = aggregationMatch.Groups[2].Value; // Second capturing group - _classes.Last().Value.AddAssociation(typeName, actualAccessSpecifier, + string? typeName = aggregationMatch.Groups[groupMatch].Value; // Second capturing group + _classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier, AssociationType.Aggregation); } - else if (compositionMatch.Success && !string.IsNullOrEmpty(compositionMatch.Groups[2].Value)) + else if (compositionMatch.Success && !string.IsNullOrEmpty(compositionMatch.Groups[groupMatch].Value)) { // Composition type - string? typeName = compositionMatch.Groups[2].Value; // Second capturing group - _classes.Last().Value.AddAssociation(typeName, actualAccessSpecifier, + string? typeName = compositionMatch.Groups[groupMatch].Value; // Second capturing group + _classes.Last().Value.AddAssociation(typeName, atribute.Name, actualAccessSpecifier, AssociationType.Composition); } else { // Default to regular association if no match is found - _classes.Last().Value.AddAssociation(atribute.Type, actualAccessSpecifier, + _classes.Last().Value.AddAssociation(atribute.Type, atribute.Name, actualAccessSpecifier, AssociationType.Association); } } diff --git a/UnitTest/ClassDiagramTests.cs b/UnitTest/ClassDiagramTests.cs index d22f5c9413b4ff34675da481ef04b62f9cfbceef..63d173c4f12b6e3afbdd0fe76afbb11d048fbfa6 100644 --- a/UnitTest/ClassDiagramTests.cs +++ b/UnitTest/ClassDiagramTests.cs @@ -120,7 +120,7 @@ public class ClassDiagramTests for (int i = 1; i < numberOfClasses; i++) { package.AddClass($"Class{i}", false) - .AddAssociation($"Class{i-1}", VisibilityType.Public, AssociationType.Association); + .AddAssociation($"Class{i-1}", $"name{i-1}",VisibilityType.Public, AssociationType.Association); } var xmi = ClassDiagramBuilder.BuildDiagram(); @@ -164,11 +164,11 @@ public class ClassDiagramTests { var package1 = ClassDiagramBuilder.AddPackage("Package1"); package1.AddClass("Class1", false) - .AddAssociation("Class2", VisibilityType.Public, AssociationType.Association); + .AddAssociation("Class2", "name2",VisibilityType.Public, AssociationType.Association); var package2 = ClassDiagramBuilder.AddPackage("Package2"); package2.AddClass("Class2", false) - .AddAssociation("Class1", VisibilityType.Public, AssociationType.Aggregation); + .AddAssociation("Class1", "name1",VisibilityType.Public, AssociationType.Aggregation); var xmi = ClassDiagramBuilder.BuildDiagram(); AssertCommonAssertions(xmi); @@ -202,11 +202,12 @@ public class ClassDiagramTests var class1 = package.AddClass("Class1", false); var class2 = package.AddClass("Class2", false); - class2.AddAssociation(targetAssociation, visibilityType, type); + class2.AddAssociation(targetAssociation, "association",visibilityType, type); if (!isValid) { - Assert.Throws<ArgumentException>(() => ClassDiagramBuilder.BuildDiagram()); + var xmi = ClassDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); } else { diff --git a/WebAPI/Controllers/ApiController.cs b/WebAPI/Controllers/ApiController.cs index 7b7b67e23497c10e30fc502d601d8fe1386bbddc..4ae5993d04a8d73d0fb7452b7a667bcbdf83c1d1 100644 --- a/WebAPI/Controllers/ApiController.cs +++ b/WebAPI/Controllers/ApiController.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using System.Runtime.InteropServices; using System.Text; using Antlr4.Runtime; using Antlr4.Runtime.Tree; @@ -43,6 +44,8 @@ namespace WebAPI.Controllers [Range(1, int.MaxValue, ErrorMessage = "Id must be greater than 0")] int sourceCodeId, + string? contextIdentifier, + [Required(ErrorMessage = "FunctionIdentifier is required")] string functionIdentifier) { @@ -72,7 +75,7 @@ namespace WebAPI.Controllers if (parser.NumberOfSyntaxErrors == 0) { - CppActivityDiagramVisitor activityDiagramVisitor = new CppActivityDiagramVisitor(diagramBuilder, functionIdentifier); + CppActivityDiagramVisitor activityDiagramVisitor = new CppActivityDiagramVisitor(diagramBuilder, contextIdentifier, functionIdentifier); Console.WriteLine(activityDiagramVisitor.Visit(tree)); }