From 7fe5e76904a058daa3935bef5819632823cf6025 Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Wed, 24 May 2023 19:00:34 +0200 Subject: [PATCH 1/4] fixes some issues with AxoDataFragments - adds cyclic run method to handle remote calls - adds integration tests for AxoDataFragments --- src/core/ctrl/src/AxoTask/AxoTask.st | 1 + src/data/ctrl/src/AxoDataFragmentExchange.st | 27 ++- src/data/ctrl/src/IAxoDataExchange.st | 15 +- .../AxoDataFragmentExchange.cs | 19 +- .../Mongo/MongoDbRepositorySettings.cs | 3 +- .../AxoDataFragmentExchange.cs | 24 +-- .../data/AxoDataFragmentExchange.st | 203 ++++++++++++++++++ .../src/IntegrationTests/integrationtests.st | 2 + .../AxoData/AxoDataFragmentsRemote.razor | 28 +++ .../src/AXOpen.Integrations.Blazor/Program.cs | 11 + .../Shared/NavMenu.razor | 6 + .../axopen_integration_tests.csproj | 2 +- .../data/DataExchangeTestBase.cs | 2 +- .../data/DataFramentExchangeTestBase.cs | 201 +++++++++++++++++ src/templates.simple/axosimple.app/Program.cs | 4 +- 15 files changed, 524 insertions(+), 24 deletions(-) create mode 100644 src/integrations/ctrl/src/IntegrationTests/data/AxoDataFragmentExchange.st create mode 100644 src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoData/AxoDataFragmentsRemote.razor create mode 100644 src/integrations/tests/AXOpen.Integration.Tests/data/DataFramentExchangeTestBase.cs diff --git a/src/core/ctrl/src/AxoTask/AxoTask.st b/src/core/ctrl/src/AxoTask/AxoTask.st index a5e63e564..60ec3e041 100644 --- a/src/core/ctrl/src/AxoTask/AxoTask.st +++ b/src/core/ctrl/src/AxoTask/AxoTask.st @@ -189,6 +189,7 @@ NAMESPACE AXOpen.Core IF _isNullContext THEN Status := eAxoTaskState#Error; + ErrorDetails := 'NULL CONTEXT'; END_IF; THIS.UpdateState(); diff --git a/src/data/ctrl/src/AxoDataFragmentExchange.st b/src/data/ctrl/src/AxoDataFragmentExchange.st index bde5e8bca..6a7ac9208 100644 --- a/src/data/ctrl/src/AxoDataFragmentExchange.st +++ b/src/data/ctrl/src/AxoDataFragmentExchange.st @@ -1,4 +1,6 @@ USING AXOpen.Core; +USING AXOpen.Core; +USING AXOpen.Core; NAMESPACE AXOpen.Data CLASS PUBLIC AxoDataFragmentExchange EXTENDS AxoDataExchangeBase IMPLEMENTS IAxoDataExchange @@ -24,18 +26,37 @@ NAMESPACE AXOpen.Data VAR_INPUT Identifier : STRING[254]; END_VAR - Update := Operation.Invoke(Identifier, eCrudOperation#Read); + Update := Operation.Invoke(Identifier, eCrudOperation#Update); END_METHOD METHOD PUBLIC Delete : IAxoTaskState VAR_INPUT Identifier : STRING[254]; END_VAR - Delete := Operation.Invoke(Identifier, eCrudOperation#Read); + Delete := Operation.Invoke(Identifier, eCrudOperation#Delete); END_METHOD METHOD PUBLIC Restore Operation.Restore(); - END_METHOD + END_METHOD + + METHOD PUBLIC Run + VAR_INPUT + context : IAxoContext; + END_VAR + THIS.Initialize(context); + Operation.Initialize(THIS); + Operation.Execute(); + END_METHOD + + METHOD PUBLIC Run + VAR_INPUT + parent : IAxoObject; + END_VAR + THIS.Initialize(parent); + Operation.Initialize(THIS); + Operation.Execute(); + END_METHOD + END_CLASS END_NAMESPACE diff --git a/src/data/ctrl/src/IAxoDataExchange.st b/src/data/ctrl/src/IAxoDataExchange.st index 09f839fc3..65da35510 100644 --- a/src/data/ctrl/src/IAxoDataExchange.st +++ b/src/data/ctrl/src/IAxoDataExchange.st @@ -27,6 +27,19 @@ NAMESPACE AXOpen.Data END_METHOD METHOD Restore - END_METHOD + END_METHOD + + METHOD Run + VAR_INPUT + context : IAxoContext; + END_VAR + + END_METHOD + + METHOD Run + VAR_INPUT + parent : IAxoObject; + END_VAR + END_METHOD END_INTERFACE END_NAMESPACE \ No newline at end of file diff --git a/src/data/src/AXOpen.Data/DataFragmentExchange/AxoDataFragmentExchange.cs b/src/data/src/AXOpen.Data/DataFragmentExchange/AxoDataFragmentExchange.cs index d57bfb3a1..8663a11f9 100644 --- a/src/data/src/AXOpen.Data/DataFragmentExchange/AxoDataFragmentExchange.cs +++ b/src/data/src/AXOpen.Data/DataFragmentExchange/AxoDataFragmentExchange.cs @@ -16,16 +16,29 @@ public partial class AxoDataFragmentExchange { protected IAxoDataExchange[] DataFragments { get; private set; } - public T? Builder() where T : AxoDataFragmentExchange + public T? CreateBuilder() where T : AxoDataFragmentExchange { DataFragments = GetDataSetProperty().ToArray(); - Operation.InitializeExclusively(Handle); - Operation.WriteAsync().Wait(); RefUIData = new AxoFragmentedDataCompound(this, DataFragments.Select(p => p.RefUIData).Cast().ToList()); Repository = new AxoCompoundRepository(DataFragments); return this as T; } + /// + /// Initializes data exchange between remote controller and this + /// + public void InitializeRemoteDataExchange() + { + Operation.InitializeExclusively(Handle); + this.WriteAsync().Wait(); + } + + public void DeInitializeRemoteDataExchange() + { + Operation.DeInitialize(); + this.WriteAsync().Wait(); + } + private void Handle() { Operation.ReadAsync().Wait(); diff --git a/src/data/src/repositories/MongoDb/Mongo/MongoDbRepositorySettings.cs b/src/data/src/repositories/MongoDb/Mongo/MongoDbRepositorySettings.cs index ee692d53a..b780398d1 100644 --- a/src/data/src/repositories/MongoDb/Mongo/MongoDbRepositorySettings.cs +++ b/src/data/src/repositories/MongoDb/Mongo/MongoDbRepositorySettings.cs @@ -48,7 +48,8 @@ public MongoDbRepositorySettings(string connectionString, string databaseName, s public MongoDbRepositorySettings(string connectionString, string databaseName, string collectionName, MongoDbCredentials credentials) { SetupSerialisationAndMapping(); - Client = GetClient(connectionString, credentials); + //Client = GetClient(connectionString, credentials); + Client = GetClient(connectionString); Database = GetDatabase(databaseName); Collection = GetCollection(collectionName); } diff --git a/src/data/tests/AXOpen.Data.Tests/DataExchangeFragments/AxoDataFragmentExchange.cs b/src/data/tests/AXOpen.Data.Tests/DataExchangeFragments/AxoDataFragmentExchange.cs index c9a8648b4..d628ccfeb 100644 --- a/src/data/tests/AXOpen.Data.Tests/DataExchangeFragments/AxoDataFragmentExchange.cs +++ b/src/data/tests/AXOpen.Data.Tests/DataExchangeFragments/AxoDataFragmentExchange.cs @@ -46,7 +46,7 @@ public async void RemoteCreate_ShouldCreateRecordsInEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -69,7 +69,7 @@ public async void RemoteRead_ShouldReadRecordsFromEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); var sharedRepo = new InMemoryRepository(); var manipRepo = new InMemoryRepository(); s.Set.SetRepository(sharedRepo); @@ -94,7 +94,7 @@ public async void RemoteUpdate_ShouldUpdateRecordsInEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -124,7 +124,7 @@ public async void RemoteDelete_ShouldDeleteRecordsFromEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -150,7 +150,7 @@ public async void FromRepositoryToShadows_ShouldSetDataInShadowsFromPlainPocoObj var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); var sharedRepo = new InMemoryRepository(); var manipRepo = new InMemoryRepository(); s.Set.SetRepository(sharedRepo); @@ -176,7 +176,7 @@ public async void FromRepositoryToController_ShouldSetDataFromShadowsToControlle var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); var sharedRepo = new InMemoryRepository(); var manipRepo = new InMemoryRepository(); s.Set.SetRepository(sharedRepo); @@ -202,7 +202,7 @@ public async void GetRecords_Filtered_ShouldReturnRecordsFromRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -222,7 +222,7 @@ public async void GetRecords_ShouldReturnRecordsFromRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -242,7 +242,7 @@ public async void Delete_ShouldDeleteRecordsFromEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -268,7 +268,7 @@ public async void UpdateFromShadows_ShouldUpdateRecordsInEachRepository() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -300,7 +300,7 @@ public async void LoadFromController_ShouldLoadExistingDataSetToEachShadow() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); @@ -327,7 +327,7 @@ public async void CreateCopy_ShouldCreateInAllRepositoriesFromExisting() var parent = NSubstitute.Substitute.For(); parent.GetConnector().Returns(AXSharp.Connector.ConnectorAdapterBuilder.Build().CreateDummy().GetConnector(null)); var sut = new ProcessData(parent, "a", "b"); - var s = sut.Builder(); + var s = sut.CreateBuilder(); s.Set.SetRepository(new InMemoryRepository()); s.Manip.SetRepository(new InMemoryRepository()); diff --git a/src/integrations/ctrl/src/IntegrationTests/data/AxoDataFragmentExchange.st b/src/integrations/ctrl/src/IntegrationTests/data/AxoDataFragmentExchange.st new file mode 100644 index 000000000..ef8b5e3a0 --- /dev/null +++ b/src/integrations/ctrl/src/IntegrationTests/data/AxoDataFragmentExchange.st @@ -0,0 +1,203 @@ +USING AXOpen.Core; +USING AXOpen.Data; +USING AXOpen.Probers; + +NAMESPACE IntegrationAxoDataFramentsExchange + + CLASS AxoDataFragmentExchangeContext EXTENDS AXOpen.Core.AxoContext + VAR PUBLIC + PD : ProcessData; + CreateTest : DataCreateTest; + ReadTest : DataReadTest; + UpdateTest : DataUpdateTest; + DeleteTest : DataDeleteTest; + END_VAR + + + METHOD PROTECTED OVERRIDE Main + + PD.Run(THIS); + + CreateTest.InjectManger(PD); + CreateTest.Run(THIS); + + ReadTest.InjectManger(PD); + ReadTest.Run(THIS); + + DeleteTest.InjectManger(PD); + DeleteTest.Run(THIS); + + UpdateTest.InjectManger(PD); + UpdateTest.Run(THIS); + END_METHOD + + END_CLASS + + CLASS ProcessData EXTENDS AXOpen.Data.AxoDataFragmentExchange + VAR PUBLIC + {#ix-attr:[AXOpen.Data.AxoDataFragmentAttribute]} + Set : SharedProductionDataManager; + {#ix-attr:[AXOpen.Data.AxoDataFragmentAttribute]} + Manip : FragmentProcessDataManger; + END_VAR + END_CLASS + + CLASS SharedProductionData EXTENDS AXOpen.Data.AxoDataEntity + VAR PUBLIC + ComesFrom : INT; + GoesTo : INT; + END_VAR + END_CLASS + + CLASS SharedProductionDataManager EXTENDS AXOpen.Data.AxoDataExchange + VAR PUBLIC + {#ix-generic:TOnline} + {#ix-generic:TPlain as POCO} + {#ix-attr:[AXOpen.Data.AxoDataEntityAttribute]} + {#ix-attr:[Container(Layout.Stack)]} + Set : SharedProductionData; + END_VAR + END_CLASS + + CLASS FragmentProcessDataManger + EXTENDS AXOpen.Data.AxoDataExchange + VAR PUBLIC + {#ix-generic:TOnline} + {#ix-generic:TPlain as POCO} + {#ix-attr:[AXOpen.Data.AxoDataEntityAttribute]} + {#ix-attr:[Container(Layout.Stack)]} + Set : FragmentProcessData; + END_VAR + END_CLASS + + CLASS FragmentProcessData + EXTENDS AXOpen.Data.AxoDataEntity + VAR PUBLIC + CounterDelay : ULINT; + END_VAR + END_CLASS + + CLASS DataCreateTest EXTENDS AxoProberWithCompletedCondition + VAR PUBLIC + Manager : IAxoDataExchange; + Identifier : STRING[254]; + END_VAR + METHOD PROTECTED OVERRIDE Test : BOOL + VAR + _taskState : IAxoTaskState; + END_VAR + IF(Manager <> NULL) THEN + _taskState := Manager.Create(Identifier); + THIS.ThrowWhen(_taskState.HasError(), _taskState.GetErrorDetails()); + Test := _taskState.IsDone(); + END_IF; + END_METHOD + + METHOD OVERRIDE OnRestore + SUPER.OnRestore(); + IF(Manager <> NULL) THEN + Manager.Restore(); + END_IF; + END_METHOD + + METHOD PUBLIC InjectManger + VAR_INPUT + Injectee : IAxoDataExchange; + END_VAR + Manager := Injectee; + END_METHOD + END_CLASS + + CLASS DataReadTest EXTENDS AxoProberWithCompletedCondition + VAR PUBLIC + Manager : IAxoDataExchange; + Identifier : STRING[254]; + END_VAR + METHOD PROTECTED OVERRIDE Test : BOOL + VAR + _taskState : IAxoTaskState; + END_VAR + IF(Manager <> NULL) THEN + _taskState := Manager.Read(Identifier); + THIS.ThrowWhen(_taskState.HasError(), _taskState.GetErrorDetails()); + Test := _taskState.IsDone(); + END_IF; + END_METHOD + + METHOD OVERRIDE OnRestore + SUPER.OnRestore(); + IF(Manager <> NULL) THEN + Manager.Restore(); + END_IF; + END_METHOD + + METHOD PUBLIC InjectManger + VAR_INPUT + Injectee : IAxoDataExchange; + END_VAR + Manager := Injectee; + END_METHOD + END_CLASS + + CLASS DataUpdateTest EXTENDS AxoProberWithCompletedCondition + VAR PUBLIC + Manager : IAxoDataExchange; + Identifier : STRING[254]; + END_VAR + METHOD PROTECTED OVERRIDE Test : BOOL + VAR + _taskState : IAxoTaskState; + END_VAR + IF(Manager <> NULL) THEN + _taskState := Manager.Update(Identifier); + THIS.ThrowWhen(_taskState.HasError(), _taskState.GetErrorDetails()); + Test := _taskState.IsDone(); + END_IF; + END_METHOD + + METHOD OVERRIDE OnRestore + SUPER.OnRestore(); + IF(Manager <> NULL) THEN + Manager.Restore(); + END_IF; + END_METHOD + + METHOD PUBLIC InjectManger + VAR_INPUT + Injectee : IAxoDataExchange; + END_VAR + Manager := Injectee; + END_METHOD + END_CLASS + + CLASS DataDeleteTest EXTENDS AxoProberWithCompletedCondition + VAR PUBLIC + Manager : IAxoDataExchange; + Identifier : STRING[254]; + END_VAR + METHOD PROTECTED OVERRIDE Test : BOOL + VAR + _taskState : IAxoTaskState; + END_VAR + IF(Manager <> NULL) THEN + _taskState := Manager.Delete(Identifier); + THIS.ThrowWhen(_taskState.HasError(), _taskState.GetErrorDetails()); + Test := _taskState.IsDone(); + END_IF; + END_METHOD + + METHOD OVERRIDE OnRestore + SUPER.OnRestore(); + IF(Manager <> NULL) THEN + Manager.Restore(); + END_IF; + END_METHOD + + METHOD PUBLIC InjectManger + VAR_INPUT + Injectee : IAxoDataExchange; + END_VAR + Manager := Injectee; + END_METHOD + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/integrations/ctrl/src/IntegrationTests/integrationtests.st b/src/integrations/ctrl/src/IntegrationTests/integrationtests.st index 27eee9f0d..36d7b6351 100644 --- a/src/integrations/ctrl/src/IntegrationTests/integrationtests.st +++ b/src/integrations/ctrl/src/IntegrationTests/integrationtests.st @@ -3,6 +3,7 @@ NAMESPACE IntegrationTests VAR PUBLIC Probers : ProbersTestContext; DataExchangeLightTestsContext : IntegrationLightDirect.DataExchangeLightTestsContext; + DataFragmentContext : IntegrationAxoDataFramentsExchange.AxoDataFragmentExchangeContext; DM : IntegrationLightDirect.DataManager; END_VAR @@ -11,6 +12,7 @@ NAMESPACE IntegrationTests DM.Run(DataExchangeLightTestsContext); DataExchangeLightTestsContext.InjectDM(DM); DataExchangeLightTestsContext.Run(); + DataFragmentContext.Run(); END_METHOD END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoData/AxoDataFragmentsRemote.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoData/AxoDataFragmentsRemote.razor new file mode 100644 index 000000000..3ae12730a --- /dev/null +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoData/AxoDataFragmentsRemote.razor @@ -0,0 +1,28 @@ +@page "/AxoDataFragmentsRemote" +@using AXOpen.Data +

AxoDataRemote

+ +@**@ + + + +@code { + private DataExchangeViewModel _vm = new DataExchangeViewModel { Model = Entry.Plc.Integrations.DataFragmentContext.PD }; +} diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs index 959d75e53..81dd228da 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs @@ -2,9 +2,11 @@ using axopen_integrations; using AXSharp.Connector; using AXOpen.Core.blazor.Toaster; +using AXOpen.Data.Json; using AXSharp.Presentation.Blazor.Services; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; +using Pocos.IntegrationAxoDataFramentsExchange; using static System.Formats.Asn1.AsnWriter; namespace axopen_integrations_blazor @@ -48,6 +50,15 @@ public static void Main(string[] args) Repository.Factory (new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "data", "processdata1")))); + var pdfBuilder = + Entry.Plc.Integrations.DataFragmentContext.PD.CreateBuilder(); + + pdfBuilder.Set.SetRepository(new JsonRepository( + new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "data-framents", "set")))); + pdfBuilder.Manip.SetRepository( + new JsonRepository( new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "data-framents", "fm")))); + + // var exampleRepositorySettings = new AXOpen.Data.Json.JsonRepositorySettings( diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor index 89ee2b396..bc8f94335 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor @@ -73,6 +73,12 @@ AxoDataRemote + + + diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs index 81dd228da..cf2ffc5bb 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs @@ -54,9 +54,9 @@ public static void Main(string[] args) Entry.Plc.Integrations.DataFragmentContext.PD.CreateBuilder(); pdfBuilder.Set.SetRepository(new JsonRepository( - new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "data-framents", "set")))); + new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "bin", "data-framents", "set")))); pdfBuilder.Manip.SetRepository( - new JsonRepository( new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "data-framents", "fm")))); + new JsonRepository( new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "bin", "data-framents", "fm")))); // @@ -70,6 +70,20 @@ public static void Main(string[] args) Entry.Plc.AxoDataExamplesDocu.DataManager.InitializeRemoteDataExchange(exampleRepository); // + + // + + var scatteredDataBuilder = + Entry.Plc.AxoDataFragmentExchangeContext.ProcessData.CreateBuilder(); + + // Setting up repositories + scatteredDataBuilder.SharedHeader.SetRepository(new JsonRepository( + new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "bin", "data-framents-docu", "set")))); + scatteredDataBuilder.Station_1.SetRepository( + new JsonRepository( + new AXOpen.Data.Json.JsonRepositorySettings(Path.Combine(Environment.CurrentDirectory, "bin", "data-framents", "fm")))); + // + var app = builder.Build(); // Configure the HTTP request pipeline. From 3c31bf0859f488c163b9446efbd585c1c066db23 Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 25 May 2023 10:35:27 +0200 Subject: [PATCH 3/4] fix an run override issue in template --- .../ctrl/src/Examples/PneumaticManipulator.st | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st index 79bfb8291..23e5e3ddb 100644 --- a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st +++ b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st @@ -58,18 +58,7 @@ NAMESPACE examples.PneumaticManipulator Shared : SharedProductionDataManager; {#ix-attr:[AXOpen.Data.AxoDataFragmentAttribute]} DataManger : FragmentProcessDataManger; - END_VAR - - METHOD PUBLIC Run - VAR_INPUT - Parent : IAxoObject; - END_VAR - THIS.Initialize(Parent); - Operation.Initialize(THIS); - Shared.Run(Parent); - DataManger.Run(Parent); - Operation.Execute(); - END_METHOD + END_VAR END_CLASS /// From 032b9ff87f6bfbd6e4c8afd7d8ef8a6e6c094650 Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 25 May 2023 12:00:48 +0200 Subject: [PATCH 4/4] add in-code documenation --- docfx/articles/data/AxoDataExchange.md | 4 +- src/data/ctrl/src/AxoDataCrudTask.st | 13 +++++ src/data/ctrl/src/AxoDataEntity.st | 6 ++ src/data/ctrl/src/AxoDataExchange.st | 59 +++++++++++++++----- src/data/ctrl/src/AxoDataExchangeBase.st | 7 ++- src/data/ctrl/src/AxoDataExchangeTask.st | 4 +- src/data/ctrl/src/AxoDataFragmentExchange.st | 32 ++++++++++- src/data/ctrl/src/IAxoDataEntity.st | 3 +- src/data/ctrl/src/IAxoDataExchange.st | 7 ++- 9 files changed, 110 insertions(+), 25 deletions(-) diff --git a/docfx/articles/data/AxoDataExchange.md b/docfx/articles/data/AxoDataExchange.md index 030a3f23a..bc1a40906 100644 --- a/docfx/articles/data/AxoDataExchange.md +++ b/docfx/articles/data/AxoDataExchange.md @@ -100,7 +100,7 @@ When adding data view manually, you will need to create ViewModel: ![Custom columns](~/images/CustomColumns.png) -### Export/Import + ### Modal detail view diff --git a/src/data/ctrl/src/AxoDataCrudTask.st b/src/data/ctrl/src/AxoDataCrudTask.st index e90b8c794..911ec1f0b 100644 --- a/src/data/ctrl/src/AxoDataCrudTask.st +++ b/src/data/ctrl/src/AxoDataCrudTask.st @@ -2,12 +2,25 @@ USING AXOpen.Core; NAMESPACE AXOpen.Data + /// + /// Provides remote execution for CRUD operations. + /// > [!NOTE] + /// > This is an extension of task see the documentatio for details about implementation in .NET. + /// CLASS AxoDataCrudTask EXTENDS AxoDataExchangeTask VAR PUBLIC + /// + /// Gets or sets the type of CRUD operation to be perfomed. + /// CrudOperation : eCrudOperation; END_VAR + /// + /// Invokes this task. + /// + /// Data entity identifier + /// Operation to perfom. METHOD PUBLIC Invoke : IAxoTaskState VAR_INPUT identifier : STRING[254]; diff --git a/src/data/ctrl/src/AxoDataEntity.st b/src/data/ctrl/src/AxoDataEntity.st index 616df8daf..7b5f4dca5 100644 --- a/src/data/ctrl/src/AxoDataEntity.st +++ b/src/data/ctrl/src/AxoDataEntity.st @@ -1,6 +1,12 @@ NAMESPACE AXOpen.Data + /// + /// Base class for any exchangable data in . + /// CLASS AxoDataEntity IMPLEMENTS IAxoDataEntity VAR PUBLIC + /// + /// Gets or sets data entity identifier. + /// {#ix-attr:[RenderIgnore()]} DataEntityId : STRING[254]; END_VAR diff --git a/src/data/ctrl/src/AxoDataExchange.st b/src/data/ctrl/src/AxoDataExchange.st index e713b452e..30121d088 100644 --- a/src/data/ctrl/src/AxoDataExchange.st +++ b/src/data/ctrl/src/AxoDataExchange.st @@ -1,6 +1,10 @@ USING AXOpen.Core; -NAMESPACE AXOpen.Data +NAMESPACE AXOpen.Data + /// + /// Provides base class for any data exchange with an arbitrary remote repository. + /// **For configuration and set up see [here](~/articles/data/AxoDataExchange.md)** + /// {#ix-generic:} CLASS AxoDataExchange EXTENDS AxoDataExchangeBase IMPLEMENTS IAxoDataExchange VAR PUBLIC @@ -26,50 +30,77 @@ NAMESPACE AXOpen.Data DeleteTask.Execute(); END_METHOD + /// + /// Runs intialization and cyclical handling of this AxoDataExchange. + /// + /// Parent of this object METHOD PUBLIC Run VAR_INPUT - Parent : IAxoObject; + parent : IAxoObject; END_VAR - THIS.Initialize(Parent); + THIS.Initialize(parent); THIS.Run(); END_METHOD + /// + /// Runs intialization and cyclical handling of this AxoDataExchange. + /// + /// Root context of this object METHOD PUBLIC Run - VAR_INPUT - Context : IAxoContext; + VAR_INPUT + context : IAxoContext; END_VAR - THIS.Initialize(Context); + THIS.Initialize(context); THIS.Run(); END_METHOD + /// + /// Creates new entry into the remote repository from data entity of this AxoDataExchange. + /// + /// Data identifier. METHOD PUBLIC Create : IAxoTaskState VAR_INPUT - Identifier : STRING[254]; + identifier : STRING[254]; END_VAR - Create := CreateTask.Invoke(Identifier); + Create := CreateTask.Invoke(identifier); END_METHOD + /// + /// Reads data from remote repository and copies them into data entity of this AxoDataExchange. + /// + /// Data identifier. METHOD PUBLIC Read : IAxoTaskState VAR_INPUT - Identifier : STRING[254]; + identifier : STRING[254]; END_VAR - Read := ReadTask.Invoke(Identifier); + Read := ReadTask.Invoke(identifier); END_METHOD + /// + /// Updates data in remote repository from data entiry of this AxoDataExchange. + /// + /// Data identifier. METHOD PUBLIC Update : IAxoTaskState VAR_INPUT - Identifier : STRING[254]; + identifier : STRING[254]; END_VAR - Update := UpdateTask.Invoke(Identifier); + Update := UpdateTask.Invoke(identifier); END_METHOD + /// + /// Deletes data entry with given ID from remote repository. + /// + /// Data identifier. METHOD PUBLIC Delete : IAxoTaskState VAR_INPUT - Identifier : STRING[254]; + identifier : STRING[254]; END_VAR - Delete := DeleteTask.Invoke(Identifier); + Delete := DeleteTask.Invoke(identifier); END_METHOD + /// + /// Restores all tasks associated with this object. + /// METHOD PUBLIC Restore CreateTask.Restore(); ReadTask.Restore(); diff --git a/src/data/ctrl/src/AxoDataExchangeBase.st b/src/data/ctrl/src/AxoDataExchangeBase.st index b4d271118..cb8fbabed 100644 --- a/src/data/ctrl/src/AxoDataExchangeBase.st +++ b/src/data/ctrl/src/AxoDataExchangeBase.st @@ -1,7 +1,10 @@ USING AXOpen.Core; NAMESPACE AXOpen.Data - CLASS AxoDataExchangeBase EXTENDS AXOpen.Core.AxoObject - + /// + /// Represents base class of data exchange. + /// This class is used to provide abstract information about the type that can be used in rcc. + /// + CLASS PUBLIC AxoDataExchangeBase EXTENDS AXOpen.Core.AxoObject END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/data/ctrl/src/AxoDataExchangeTask.st b/src/data/ctrl/src/AxoDataExchangeTask.st index 88f26a306..9be8bf0fd 100644 --- a/src/data/ctrl/src/AxoDataExchangeTask.st +++ b/src/data/ctrl/src/AxoDataExchangeTask.st @@ -1,7 +1,9 @@ USING AXOpen.Core; NAMESPACE AXOpen.Data - + /// + /// Extends AxoRemoteTask for data operation within AxoData + /// CLASS AxoDataExchangeTask EXTENDS AXOpen.Core.AxoRemoteTask VAR PUBLIC diff --git a/src/data/ctrl/src/AxoDataFragmentExchange.st b/src/data/ctrl/src/AxoDataFragmentExchange.st index 6a7ac9208..0fc7531a2 100644 --- a/src/data/ctrl/src/AxoDataFragmentExchange.st +++ b/src/data/ctrl/src/AxoDataFragmentExchange.st @@ -2,12 +2,20 @@ USING AXOpen.Core; USING AXOpen.Core; USING AXOpen.Core; -NAMESPACE AXOpen.Data +NAMESPACE AXOpen.Data + /// + /// Provides base class for any composite/fragmetes data exchange combining one or more AxoDataExchange object. + /// **For configuration and set up see [here](~/articles/data/AxoDataFragmentExchange.md)** + /// CLASS PUBLIC AxoDataFragmentExchange EXTENDS AxoDataExchangeBase IMPLEMENTS IAxoDataExchange VAR PUBLIC Operation : AxoDataCrudTask; END_VAR - + + /// + /// Creates new entry into each associated remote repository from respective data entity. + /// + /// Data identifier. METHOD PUBLIC Create : IAxoTaskState VAR_INPUT Identifier : STRING[254]; @@ -15,6 +23,10 @@ NAMESPACE AXOpen.Data Create := Operation.Invoke(Identifier, eCrudOperation#Create); END_METHOD + /// + /// Reads data from each associated remote repository and copies it into respective data entities. + /// + /// Data identifier. METHOD PUBLIC Read : IAxoTaskState VAR_INPUT Identifier : STRING[254]; @@ -22,6 +34,10 @@ NAMESPACE AXOpen.Data Read := Operation.Invoke(Identifier, eCrudOperation#Read); END_METHOD + /// + /// Updates data in each associated remote repository from respective data entities. + /// + /// Data identifier. METHOD PUBLIC Update : IAxoTaskState VAR_INPUT Identifier : STRING[254]; @@ -29,6 +45,10 @@ NAMESPACE AXOpen.Data Update := Operation.Invoke(Identifier, eCrudOperation#Update); END_METHOD + /// + /// Deletes data entry from each associated remote repository with given ID. + /// + /// Data identifier. METHOD PUBLIC Delete : IAxoTaskState VAR_INPUT Identifier : STRING[254]; @@ -40,6 +60,10 @@ NAMESPACE AXOpen.Data Operation.Restore(); END_METHOD + /// + /// Runs intialization and cyclical handling of this AxoDataExchange. + /// + /// Root context of this object METHOD PUBLIC Run VAR_INPUT context : IAxoContext; @@ -49,6 +73,10 @@ NAMESPACE AXOpen.Data Operation.Execute(); END_METHOD + /// + /// Runs intialization and cyclical handling of this AxoDataExchange. + /// + /// Parent of this object METHOD PUBLIC Run VAR_INPUT parent : IAxoObject; diff --git a/src/data/ctrl/src/IAxoDataEntity.st b/src/data/ctrl/src/IAxoDataEntity.st index 3ed226259..0c4b3e9d2 100644 --- a/src/data/ctrl/src/IAxoDataEntity.st +++ b/src/data/ctrl/src/IAxoDataEntity.st @@ -1,5 +1,4 @@ NAMESPACE AXOpen.Data - INTERFACE IAxoDataEntity - + INTERFACE IAxoDataEntity END_INTERFACE END_NAMESPACE \ No newline at end of file diff --git a/src/data/ctrl/src/IAxoDataExchange.st b/src/data/ctrl/src/IAxoDataExchange.st index 65da35510..380d98c6d 100644 --- a/src/data/ctrl/src/IAxoDataExchange.st +++ b/src/data/ctrl/src/IAxoDataExchange.st @@ -1,7 +1,10 @@ USING AXOpen.Core; -NAMESPACE AXOpen.Data - INTERFACE IAxoDataExchange +NAMESPACE AXOpen.Data + /// + /// Provides abastaction for data exchange. + /// + INTERFACE IAxoDataExchange METHOD Create : IAxoTaskState VAR_INPUT Identifier : STRING[254];