Skip to content

Commit 959130d

Browse files
authored
Extension data to home workspace (#11553)
* workspacemodel thumbnail api + test * add graphDocumentationURL + serialise and deserialise Author * Update WorkspaceModel.cs * handle empty URIs * Update 2080_JSONTESTCRASH undo_redo.dyn * move thumbnail and help link to HomeWorkspaceMode * move extension data to HomeWorkspaceModel
1 parent b49c661 commit 959130d

File tree

6 files changed

+84
-67
lines changed

6 files changed

+84
-67
lines changed

src/DynamoCore/Graph/Workspaces/HomeWorkspaceModel.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Xml;
88
using Dynamo.Core;
99
using Dynamo.Engine;
10+
using Dynamo.Extensions;
1011
using Dynamo.Graph.Annotations;
1112
using Dynamo.Graph.Nodes;
1213
using Dynamo.Graph.Nodes.NodeLoaders;
@@ -131,6 +132,14 @@ public string Thumbnail
131132
}
132133
}
133134

135+
/// <summary>
136+
/// List of user defined data from extensions and view extensions stored in the graph
137+
/// </summary>
138+
internal ICollection<ExtensionData> ExtensionData
139+
{
140+
get; set;
141+
}
142+
134143
/// <summary>
135144
/// In near future, the file loading mechanism will be completely moved
136145
/// into WorkspaceModel, that's the time we removed this property setter below.
@@ -320,6 +329,7 @@ public HomeWorkspaceModel(EngineController engine,
320329
this.verboseLogging = verboseLogging;
321330
IsTestMode = isTestMode;
322331
EngineController = engine;
332+
this.ExtensionData = new List<ExtensionData>();
323333

324334
// The first time the preloaded trace data is set, we cache
325335
// the data as historical. This will be used after the initial
@@ -811,6 +821,40 @@ internal IList<ISerializable> GetOrphanedSerializablesAndClearHistoricalTraceDat
811821
historicalTraceData = null;
812822

813823
return orphans;
814-
}
824+
}
825+
826+
internal bool TryGetMatchingWorkspaceData(string uniqueId, out Dictionary<string, string> data)
827+
{
828+
data = new Dictionary<string, string>();
829+
if (!ExtensionData.Any())
830+
return false;
831+
832+
var extensionData = ExtensionData.Where(x => x.ExtensionGuid == uniqueId)
833+
.FirstOrDefault();
834+
835+
if (extensionData is null)
836+
return false;
837+
838+
data = extensionData.Data;
839+
return true;
840+
}
841+
842+
internal void UpdateExtensionData(string uniqueId, Dictionary<string, string> data)
843+
{
844+
var extensionData = ExtensionData.Where(x => x.ExtensionGuid == uniqueId)
845+
.FirstOrDefault();
846+
847+
if (extensionData is null)
848+
return;
849+
850+
extensionData.Data = data;
851+
}
852+
853+
internal void CreateNewExtensionData(string uniqueId, string name, string version, Dictionary<string, string> data)
854+
{
855+
// TODO: Figure out how to add extension version when creating new ExtensionData
856+
var extensionData = new ExtensionData(uniqueId, name, version, data);
857+
ExtensionData.Add(extensionData);
858+
}
815859
}
816860
}

src/DynamoCore/Graph/Workspaces/SerializationConverters.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -646,25 +646,28 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
646646
Enumerable.Empty<PresetModel>(), elementResolver,
647647
info, verboseLogging, isTestMode);
648648

649+
// Thumbnail
649650
if (obj.TryGetValue(nameof(HomeWorkspaceModel.Thumbnail), StringComparison.OrdinalIgnoreCase, out JToken thumbnail))
650651
homeWorkspace.Thumbnail = thumbnail.ToString();
651652

653+
// GraphDocumentaionLink
652654
if (obj.TryGetValue(nameof(HomeWorkspaceModel.GraphDocumentationURL), StringComparison.OrdinalIgnoreCase, out JToken helpLink))
653655
{
654656
if (Uri.TryCreate(helpLink.ToString(), UriKind.Absolute, out Uri uri))
655657
homeWorkspace.GraphDocumentationURL = uri;
656658
}
657659

660+
// ExtensionData
661+
homeWorkspace.ExtensionData = GetExtensionData(serializer, obj);
662+
658663
ws = homeWorkspace;
659664
}
660665

661666
ws.NodeLibraryDependencies = nodeLibraryDependencies.ToList();
662-
ws.ExtensionData = GetExtensionData(serializer, obj);
663667

664668
if (obj.TryGetValue(nameof(WorkspaceModel.Author), StringComparison.OrdinalIgnoreCase, out JToken author))
665669
ws.Author = author.ToString();
666670

667-
668671
return ws;
669672
}
670673

@@ -781,11 +784,6 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
781784
// NodeLibraryDependencies
782785
writer.WritePropertyName(WorkspaceReadConverter.NodeLibraryDependenciesPropString);
783786
serializer.Serialize(writer, ws.NodeLibraryDependencies);
784-
785-
// ExtensionData
786-
writer.WritePropertyName(WorkspaceReadConverter.EXTENSION_WORKSPACE_DATA);
787-
serializer.Serialize(writer, ws.ExtensionData);
788-
789787

790788
if (!isCustomNode && ws is HomeWorkspaceModel hws)
791789
{
@@ -796,6 +794,10 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
796794
// GraphDocumentaionLink
797795
writer.WritePropertyName(nameof(HomeWorkspaceModel.GraphDocumentationURL));
798796
writer.WriteValue(hws.GraphDocumentationURL);
797+
798+
// ExtensionData
799+
writer.WritePropertyName(WorkspaceReadConverter.EXTENSION_WORKSPACE_DATA);
800+
serializer.Serialize(writer, hws.ExtensionData);
799801
}
800802

801803
// Graph Author

src/DynamoCore/Graph/Workspaces/WorkspaceModel.cs

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -724,14 +724,6 @@ public string Description
724724
}
725725
}
726726

727-
/// <summary>
728-
/// List of user defined data from extensions and view extensions stored in the graph
729-
/// </summary>
730-
internal ICollection<ExtensionData> ExtensionData
731-
{
732-
get; set;
733-
}
734-
735727
/// <summary>
736728
/// Are there unsaved changes in the workspace?
737729
/// </summary>
@@ -1045,7 +1037,6 @@ protected WorkspaceModel(
10451037
this.annotations = new List<AnnotationModel>(annotations);
10461038

10471039
this.NodeLibraryDependencies = new List<INodeLibraryDependencyInfo>();
1048-
this.ExtensionData = new List<ExtensionData>();
10491040

10501041
// Set workspace info from WorkspaceInfo object
10511042
Name = info.Name;
@@ -2158,40 +2149,6 @@ private Guid IdToGuidConverter(string id)
21582149

21592150
return deterministicGuid;
21602151
}
2161-
2162-
internal bool TryGetMatchingWorkspaceData(string uniqueId, out Dictionary<string, string> data)
2163-
{
2164-
data = new Dictionary<string, string>();
2165-
if (!ExtensionData.Any())
2166-
return false;
2167-
2168-
var extensionData = ExtensionData.Where(x => x.ExtensionGuid == uniqueId)
2169-
.FirstOrDefault();
2170-
2171-
if (extensionData is null)
2172-
return false;
2173-
2174-
data = extensionData.Data;
2175-
return true;
2176-
}
2177-
2178-
internal void UpdateExtensionData(string uniqueId, Dictionary<string, string> data)
2179-
{
2180-
var extensionData = ExtensionData.Where(x => x.ExtensionGuid == uniqueId)
2181-
.FirstOrDefault();
2182-
2183-
if (extensionData is null)
2184-
return;
2185-
2186-
extensionData.Data = data;
2187-
}
2188-
2189-
internal void CreateNewExtensionData(string uniqueId, string name, string version, Dictionary<string, string> data)
2190-
{
2191-
// TODO: Figure out how to add extension version when creating new ExtensionData
2192-
var extensionData = new ExtensionData(uniqueId, name, version, data);
2193-
ExtensionData.Add(extensionData);
2194-
}
21952152

21962153
/// <summary>
21972154
/// Returns a DelayedGraphExecution object.

src/DynamoCore/Models/DynamoModel.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ internal void OnWorkspaceSaving(WorkspaceModel workspace, SaveContext saveContex
156156
if (WorkspaceSaving != null)
157157
{
158158
WorkspaceSaving(workspace, saveContext);
159-
HandleStorageExtensionsOnWorkspaceSaving(workspace, saveContext);
159+
if (workspace is HomeWorkspaceModel hws)
160+
HandleStorageExtensionsOnWorkspaceSaving(hws, saveContext);
160161
}
161162
}
162163

@@ -194,7 +195,8 @@ internal void OnWorkspaceOpened(WorkspaceModel workspace)
194195
if(WorkspaceOpened != null)
195196
{
196197
WorkspaceOpened.Invoke(workspace);
197-
HandleStorageExtensionsOnWorkspaceOpened(workspace);
198+
if (workspace is HomeWorkspaceModel hws)
199+
HandleStorageExtensionsOnWorkspaceOpened(hws);
198200
}
199201
}
200202

@@ -972,23 +974,23 @@ private void RemoveExtension(IExtension ext)
972974
}
973975

974976

975-
private void HandleStorageExtensionsOnWorkspaceOpened(WorkspaceModel workspace)
977+
private void HandleStorageExtensionsOnWorkspaceOpened(HomeWorkspaceModel workspace)
976978
{
977979
foreach (var extension in extensionManager.StorageAccessExtensions)
978980
{
979981
RaiseIExtensionStorageAccessWorkspaceOpened(workspace, extension, this.Logger);
980982
}
981983
}
982984

983-
private void HandleStorageExtensionsOnWorkspaceSaving(WorkspaceModel workspace, SaveContext saveContext)
985+
private void HandleStorageExtensionsOnWorkspaceSaving(HomeWorkspaceModel workspace, SaveContext saveContext)
984986
{
985987
foreach (var extension in extensionManager.StorageAccessExtensions)
986988
{
987989
RaiseIExtensionStorageAccessWorkspaceSaving(workspace, extension, saveContext, this.Logger);
988990
}
989991
}
990992

991-
internal static void RaiseIExtensionStorageAccessWorkspaceOpened(WorkspaceModel workspace, IExtensionStorageAccess extension, ILogger logger)
993+
internal static void RaiseIExtensionStorageAccessWorkspaceOpened(HomeWorkspaceModel workspace, IExtensionStorageAccess extension, ILogger logger)
992994
{
993995
workspace.TryGetMatchingWorkspaceData(extension.UniqueId, out Dictionary<string, string> data);
994996
var extensionDataCopy = new Dictionary<string, string>(data);
@@ -1004,7 +1006,7 @@ internal static void RaiseIExtensionStorageAccessWorkspaceOpened(WorkspaceModel
10041006
}
10051007
}
10061008

1007-
internal static void RaiseIExtensionStorageAccessWorkspaceSaving(WorkspaceModel workspace, IExtensionStorageAccess extension, SaveContext saveContext, ILogger logger)
1009+
internal static void RaiseIExtensionStorageAccessWorkspaceSaving(HomeWorkspaceModel workspace, IExtensionStorageAccess extension, SaveContext saveContext, ILogger logger)
10081010
{
10091011
var assemblyName = Assembly.GetAssembly(extension.GetType()).GetName();
10101012
var version = $"{assemblyName.Version.Major}.{assemblyName.Version.Minor}";

src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,17 +227,23 @@ public DynamoView(DynamoViewModel dynamoViewModel)
227227

228228
private void OnWorkspaceOpened(WorkspaceModel workspace)
229229
{
230+
if (!(workspace is HomeWorkspaceModel hws))
231+
return;
232+
230233
foreach (var extension in viewExtensionManager.StorageAccessViewExtensions)
231234
{
232-
DynamoModel.RaiseIExtensionStorageAccessWorkspaceOpened(workspace, extension, dynamoViewModel.Model.Logger);
235+
DynamoModel.RaiseIExtensionStorageAccessWorkspaceOpened(hws, extension, dynamoViewModel.Model.Logger);
233236
}
234237
}
235238

236239
private void OnWorkspaceSaving(WorkspaceModel workspace, Graph.SaveContext saveContext)
237240
{
241+
if (!(workspace is HomeWorkspaceModel hws))
242+
return;
243+
238244
foreach (var extension in viewExtensionManager.StorageAccessViewExtensions)
239245
{
240-
DynamoModel.RaiseIExtensionStorageAccessWorkspaceSaving(workspace, extension, saveContext, dynamoViewModel.Model.Logger);
246+
DynamoModel.RaiseIExtensionStorageAccessWorkspaceSaving(hws, extension, saveContext, dynamoViewModel.Model.Logger);
241247
}
242248
}
243249

test/DynamoCoreTests/StorageExtensionTests.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
using System.Text;
55
using System.Threading.Tasks;
66
using Dynamo.Extensions;
7+
using Dynamo.Graph.Workspaces;
78
using Dynamo.Models;
89
using Dynamo.Scheduler;
910
using Moq;
1011
using NUnit.Framework;
1112

1213
namespace Dynamo.Tests
1314
{
15+
[TestFixture]
1416
public class StorageExtensionTests
1517
{
1618
private const string MOCK_EXTENSION_GUID = "7de691ac-b1ea-4353-9b9b-1f57b2967895";
@@ -124,7 +126,8 @@ public void OnWorkspaceOpenIsCalledWhenWorkspaceIsOpened()
124126
public void OnWorkspaceOpenDoesNotAddToWorkspaceExtensionData()
125127
{
126128
// Arrange
127-
var extensionDataBeforeWorkspaceOpen = model.CurrentWorkspace.ExtensionData.Count;
129+
var homeworkspace = model.CurrentWorkspace as HomeWorkspaceModel;
130+
var extensionDataBeforeWorkspaceOpen = homeworkspace.ExtensionData.Count;
128131

129132
var dataDictionary = new Dictionary<string, string>
130133
{
@@ -135,7 +138,7 @@ public void OnWorkspaceOpenDoesNotAddToWorkspaceExtensionData()
135138

136139
// Act
137140
model.OnWorkspaceOpened(model.CurrentWorkspace);
138-
var extensionDataAfterWorkspaceOpen = model.CurrentWorkspace.ExtensionData.Count;
141+
var extensionDataAfterWorkspaceOpen = homeworkspace.ExtensionData.Count;
139142

140143
// Assert
141144
Assert.AreEqual(extensionDataBeforeWorkspaceOpen, extensionDataAfterWorkspaceOpen);
@@ -145,6 +148,7 @@ public void OnWorkspaceOpenDoesNotAddToWorkspaceExtensionData()
145148
public void OnWorkspaceOpenDoesNotModifyExistingExtensionDataDictionary()
146149
{
147150
// Arrange
151+
var homeworkspace = model.CurrentWorkspace as HomeWorkspaceModel;
148152
var initialDict = new Dictionary<string, string>
149153
{
150154
{"A","a"},
@@ -161,11 +165,11 @@ public void OnWorkspaceOpenDoesNotModifyExistingExtensionDataDictionary()
161165

162166
// Act
163167
model.OnWorkspaceSaving(model.CurrentWorkspace, Graph.SaveContext.Save);
164-
var extensionDataDictionaryBeforeOpen = model.CurrentWorkspace.ExtensionData
168+
var extensionDataDictionaryBeforeOpen = homeworkspace.ExtensionData
165169
.Where(x=>x.ExtensionGuid == MOCK_EXTENSION_GUID).FirstOrDefault();
166170

167171
model.OnWorkspaceOpened(model.CurrentWorkspace);
168-
var extensionDataDictionaryAfterOpen = model.CurrentWorkspace.ExtensionData
172+
var extensionDataDictionaryAfterOpen = homeworkspace.ExtensionData
169173
.Where(x => x.ExtensionGuid == MOCK_EXTENSION_GUID).FirstOrDefault();
170174

171175
// Assert
@@ -178,7 +182,8 @@ public void OnWorkspaceOpenDoesNotModifyExistingExtensionDataDictionary()
178182
public void OnWorkspaceSavingAddsToStoredExtensionData()
179183
{
180184
// Arrange
181-
var initialDataDictionary = model.CurrentWorkspace.ExtensionData
185+
var homeworkspace = model.CurrentWorkspace as HomeWorkspaceModel;
186+
var initialDataDictionary = homeworkspace.ExtensionData
182187
.Where(x => x.ExtensionGuid == MOCK_EXTENSION_GUID)
183188
.FirstOrDefault();
184189

@@ -193,7 +198,7 @@ public void OnWorkspaceSavingAddsToStoredExtensionData()
193198

194199
// Act
195200
model.OnWorkspaceSaving(model.CurrentWorkspace, Graph.SaveContext.Save);
196-
var extensionDataDictionaryAfterSave = model.CurrentWorkspace.ExtensionData
201+
var extensionDataDictionaryAfterSave = homeworkspace.ExtensionData
197202
.Where(x => x.ExtensionGuid == MOCK_EXTENSION_GUID).FirstOrDefault();
198203

199204
// Assert
@@ -207,13 +212,14 @@ public void OnWorkspaceSavingAddsToStoredExtensionData()
207212
public void OnWorkspaceSavingModifiesExistingExtensionDataDictionary()
208213
{
209214
// Arrange
215+
var homeworkspace = model.CurrentWorkspace as HomeWorkspaceModel;
210216
var initialDataDictionary = new Dictionary<string, string>
211217
{
212218
{"A","a" },
213219
{"B","b" }
214220
};
215221
var extensionData = new ExtensionData(MOCK_EXTENSION_GUID, MOCK_EXTENSION_NAME, "0.0", initialDataDictionary);
216-
model.CurrentWorkspace.ExtensionData.Add(extensionData);
222+
homeworkspace.ExtensionData.Add(extensionData);
217223

218224
var dictionaryToAddOnSaving = new Dictionary<string, string>
219225
{
@@ -230,7 +236,7 @@ public void OnWorkspaceSavingModifiesExistingExtensionDataDictionary()
230236

231237
// Act
232238
model.OnWorkspaceSaving(model.CurrentWorkspace, Graph.SaveContext.Save);
233-
var extensionDataAfterSave = model.CurrentWorkspace.ExtensionData
239+
var extensionDataAfterSave = homeworkspace.ExtensionData
234240
.Where(x => x.ExtensionGuid == MOCK_EXTENSION_GUID).FirstOrDefault();
235241

236242
// Assert

0 commit comments

Comments
 (0)