From 2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 26 Dec 2017 21:16:15 +0200 Subject: MERGE --- .../Tango.MachineStudio.Synchronization/App.config | 15 ++ .../Tango.MachineStudio.Synchronization.csproj | 31 +++ .../ViewModels/DirectSynchronizationViewVM.cs | 274 ++++++++++++++++++++- .../Views/DirectSynchronizationView.xaml | 202 +++++++++++++-- .../Views/LocalSynchronizationView.xaml | 77 +++--- .../Views/RemoteSynchronizationView.xaml | 2 +- .../packages.config | 7 + 7 files changed, 539 insertions(+), 69 deletions(-) (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization') diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/App.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/App.config index 00d1c3941..158702ed3 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/App.config +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/App.config @@ -12,4 +12,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj index 19eecc2e1..bc47bbb0b 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj @@ -51,6 +51,9 @@ ..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll + + ..\..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll + ..\..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll @@ -66,6 +69,22 @@ + + ..\..\..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll + + + ..\..\..\packages\System.Reactive.Interfaces.3.1.1\lib\net45\System.Reactive.Interfaces.dll + + + ..\..\..\packages\System.Reactive.Linq.3.1.1\lib\net46\System.Reactive.Linq.dll + + + ..\..\..\packages\System.Reactive.PlatformServices.3.1.1\lib\net46\System.Reactive.PlatformServices.dll + + + ..\..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll + + ..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll @@ -150,6 +169,10 @@ ResXFileCodeGenerator Resources.Designer.cs + + Tango.db + PreserveNewest + @@ -186,6 +209,10 @@ {bc932dbd-7cdb-488c-99e4-f02cf441f55e} Tango.Logging + + {e4927038-348d-4295-aaf4-861c58cb3943} + Tango.PMR + {d8f1ad85-526a-4f50-b6dc-d437af63d8d8} Tango.Settings @@ -198,6 +225,10 @@ {7ada4e86-cad7-4968-a210-3a8a9e5153ab} Tango.Synchronization + + {74e700b0-1156-4126-be40-ee450d3c3026} + Tango.Transport + {cb0b0aa2-bb24-4bca-a720-45e397684e12} Tango.MachineStudio.Common diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs index ba3521009..f265fafe7 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs @@ -1,20 +1,286 @@ -using System; +using Google.Protobuf; +using System; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; +using Tango.Core.Commands; +using Tango.Core.Helpers; +using Tango.DAL.Observables; using Tango.Integration.Services; +using Tango.MachineStudio.Common.Notifications; +using Tango.MachineStudio.Common.StudioApplication; +using Tango.MachineStudio.Synchronization.Navigation; +using Tango.PMR.Integration; using Tango.SharedUI; +using Tango.Synchronization; +using Tango.Synchronization.Local; +using Tango.Synchronization.Remote; namespace Tango.MachineStudio.Synchronization.ViewModels { public class DirectSynchronizationViewVM : ViewModel { - public ExternalBridgeScanner Scanner { get; set; } + private SyncNavigationManager _navigation; + private String _slaveDBFile; + private String _masterDBFile; + private LocalDBComparer _comparer; + private INotificationProvider _notification; + private bool _isWorking; - public DirectSynchronizationViewVM(ExternalBridgeScanner scanner) + public IStudioApplicationManager ApplicationManager { get; set; } + + public DirectSynchronizationViewVM(IStudioApplicationManager applicationManager, SyncNavigationManager navigation, INotificationProvider notification) + { + ApplicationManager = applicationManager; + + _navigation = navigation; + _notification = notification; + + BackCommand = new RelayCommand(() => _navigation.NavigateTo(NavigationView.MenuView)); + + Differences = new ObservableCollection(); + + CompareCommand = new RelayCommand(Compare, (x) => !_isWorking && SelectedMachine != null); + CommitAllCommand = new RelayCommand(Synchronize, (x) => Differences.Count > 0 && !_isWorking && SelectedMachine != null); + } + + #region Commands + + /// + /// Gets or sets the back command. + /// + public RelayCommand BackCommand { get; set; } + + /// + /// Gets or sets the browse master database command. + /// + public RelayCommand BrowseMasterDBCommand { get; set; } + + /// + /// Gets or sets the browse slave database command. + /// + public RelayCommand BrowseSlaveDBCommand { get; set; } + + /// + /// Gets or sets the compare command. + /// + public RelayCommand CompareCommand { get; set; } + + /// + /// Gets or sets the commit command. + /// + public RelayCommand CommitCommand { get; set; } + + /// + /// Gets or sets the commit all command. + /// + public RelayCommand CommitAllCommand { get; set; } + + /// + /// Gets or sets the clean command. + /// + public RelayCommand CleanCommand { get; set; } + + #endregion + + #region Properties + + private bool _isClearMachine; + /// + /// Gets or sets a value indicating whether this instance is clear machine. + /// + public bool IsClearMachine + { + get { return _isClearMachine; } + set + { + _isClearMachine = value; + RaisePropertyChangedAuto(); + } + } + + private ObservableCollection _differences; + /// + /// Gets or sets the differences. + /// + public ObservableCollection Differences + { + get { return _differences; } + set { _differences = value; RaisePropertyChanged(nameof(Differences)); } + } + + private Diff _selectedDifference; + /// + /// Gets or sets the selected difference. + /// + public Diff SelectedDifference + { + get { return _selectedDifference; } + set { _selectedDifference = value; RaisePropertyChanged(nameof(SelectedDifference)); InvalidateRelayCommands(); } + } + + private Machine _selectedMachine; + /// + /// Gets or sets the selected machine. + /// + public Machine SelectedMachine + { + get { return _selectedMachine; } + set { _selectedMachine = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } + } + + #endregion + + private void Compare() + { + if (SelectedMachine.SerialNumber != ApplicationManager.ConnectedMachine.SerialNumber) + { + if (!_notification.ShowQuestion("The selected machine serial number does not match the connected machine. Are you sure you want to continue?")) + { + return; + } + } + + Task.Factory.StartNew(async () => + { + using (_notification.PushTaskItem("Downloading machine database...")) + { + try + { + _isWorking = true; + InvalidateRelayCommands(); + Thread.Sleep(1500); + + ApplicationManager.ConnectedMachine.RequestTimeout = TimeSpan.FromSeconds(10); + var response = await ApplicationManager.ConnectedMachine.SendRequest(new DirectSynchronizationRequest()); + + using (_notification.PushTaskItem("Generating temporary files...")) + { + String tempFolder = PathHelper.GetTempFolderPath(); + + //File path for the reflected remote data base SQLite. + _masterDBFile = Path.Combine(tempFolder, "Remote.db"); + //File path for the received machine SQLite db. + _slaveDBFile = Path.Combine(tempFolder, "Local.db"); + + //Save the machine db to file. + File.WriteAllBytes(_slaveDBFile, response.Message.LocalDB.ToByteArray()); + + //Copy the SQLite db template. + File.Copy(Path.Combine(PathHelper.GetStartupPath(), "Tango.db"), _masterDBFile); + + //Synchronize the SQL Server db with the new SQLite template. (Overwrite basically) + RemoteDBSynchronizer.Synchronize(_masterDBFile, SelectedMachine.SerialNumber, true); + + using (_notification.PushTaskItem("Comparing database...")) + { + _comparer = new LocalDBComparer(new SQLiteDataBase(_masterDBFile), new SQLiteDataBase(_slaveDBFile)); + + var diffs = _comparer.Compare(); + Differences = new ObservableCollection(diffs); + + if (diffs.Where(x => x.Action != DiffAction.ReplaceTableDataInSlave).Count() > 0) + { + ShowInfo("Found " + Differences.Where(x => x.Action != DiffAction.ReplaceTableDataInSlave).Count() + " differences."); + } + else + { + ShowInfo("The machine database is synchronized."); + } + } + } + } + catch (Exception ex) + { + ShowError(ex.Message); + } + finally + { + _isWorking = false; + SelectedDifference = null; + InvalidateRelayCommands(); + } + } + }); + } + + private void Synchronize() + { + if (IsClearMachine) + { + if (!_notification.ShowQuestion("This will erase and override the existing machine database. Do you want to proceed?")) + { + return; + } + } + + Task.Factory.StartNew(async () => + { + using (_notification.PushTaskItem("Synchronizing...")) + { + try + { + _isWorking = true; + InvalidateRelayCommands(); + Thread.Sleep(1500); + + for (int i = 0; i < Differences.Count; i++) + { + var diff = Differences[i]; + + diff.Commit(); + InvokeUINow(() => Differences.Remove(diff)); + i--; + } + + _comparer.Dispose(); + + byte[] remoteDbBytes = IsClearMachine ? File.ReadAllBytes(_masterDBFile) : File.ReadAllBytes(_slaveDBFile); + + var response = await ApplicationManager.ConnectedMachine.SendRequest(new OverrideDataBaseRequest() + { + RemoteDB = ByteString.CopyFrom(remoteDbBytes) + }); + + if (!response.Message.Successful) + { + ShowError("The remote machine has reported some error while trying to override the database."); + } + else + { + PathHelper.TryDeleteFile(_slaveDBFile); + PathHelper.TryDeleteFile(_masterDBFile); + _slaveDBFile = null; + _masterDBFile = null; + InvalidateRelayCommands(); + } + } + catch (Exception ex) + { + ShowError(ex.Message); + } + finally + { + _isWorking = false; + SelectedDifference = null; + InvalidateRelayCommands(); + } + } + }); + } + + private void ShowError(String message) + { + InvokeUINow(() => _notification.ShowError(message)); + } + + private void ShowInfo(String message) { - Scanner = scanner; + InvokeUINow(() => _notification.ShowInfo(message)); } } } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/DirectSynchronizationView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/DirectSynchronizationView.xaml index 7dc0cdacc..4c5a719b5 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/DirectSynchronizationView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/DirectSynchronizationView.xaml @@ -5,29 +5,199 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:fa="http://schemas.fontawesome.io/icons/" xmlns:synchronization="clr-namespace:Tango.Synchronization;assembly=Tango.Synchronization" + xmlns:providers="clr-namespace:Tango.MachineStudio.Synchronization.AutoComplete" + xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete" xmlns:global="clr-namespace:Tango.MachineStudio.Synchronization" + xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI" xmlns:local="clr-namespace:Tango.MachineStudio.Synchronization.Views" mc:Ignorable="d" - d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.DirectSynchronizationViewVM}"> + d:DesignHeight="720" d:DesignWidth="1280" DataContext="{x:Static global:ViewModelLocator.DirectSynchronizationViewVM}"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + Direct Database Synchronization + + + + + + + + + + + + + + + + + + + + + + + + Remote Database + + + + + + + + + + + + + + + + + + + IP Address: + + + + Serial Number: + + + + Organization: + + - - - - + + + + + + + + + + + + + + + Differences + + + + + + + + + + + + + + + + + + SQL Command + + + + + + + Clear Machine Before Synchronization + + + + + + + + + + + + + + + + + + + No Machine Connection + diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/LocalSynchronizationView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/LocalSynchronizationView.xaml index 72297e2cb..e5a4aac5a 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/LocalSynchronizationView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/LocalSynchronizationView.xaml @@ -43,18 +43,14 @@ Local Database Synchronization - - - - - + @@ -102,6 +98,10 @@ + + + + @@ -130,51 +130,32 @@ - - - - - - - - - - - - - - - - - - - - SQL Command - + SQL Command + - - - - - - + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/RemoteSynchronizationView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/RemoteSynchronizationView.xaml index 2487aab64..9bb995bd8 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/RemoteSynchronizationView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/RemoteSynchronizationView.xaml @@ -48,7 +48,7 @@ Local Database Synchronization diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/packages.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/packages.config index 8d8f972d1..1fa8e3268 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/packages.config +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/packages.config @@ -3,8 +3,15 @@ + + + + + + + \ No newline at end of file -- cgit v1.3.1