Index: Core/Common/src/Core.Common.Base/Core.Common.Base.csproj
===================================================================
diff -u -rc6dd26c14af11a7e13f783f578466e46b463165a -rdcd6469f6000957bc1604da8e92bd5ea09e43769
--- Core/Common/src/Core.Common.Base/Core.Common.Base.csproj (.../Core.Common.Base.csproj) (revision c6dd26c14af11a7e13f783f578466e46b463165a)
+++ Core/Common/src/Core.Common.Base/Core.Common.Base.csproj (.../Core.Common.Base.csproj) (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -89,6 +89,7 @@
+
Index: Core/Common/src/Core.Common.Base/IO/FileImporterBase.cs
===================================================================
diff -u
--- Core/Common/src/Core.Common.Base/IO/FileImporterBase.cs (revision 0)
+++ Core/Common/src/Core.Common.Base/IO/FileImporterBase.cs (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace Core.Common.Base.IO
+{
+ ///
+ /// Abstract class for file importers, providing an implementation of sending object
+ /// change notifications for objects that have been affected
+ /// during the import.
+ ///
+ ///
+ public abstract class FileImporterBase : IFileImporter
+ {
+ public abstract string Name { get; }
+ public abstract string Category { get; }
+ public abstract Bitmap Image { get; }
+ public abstract Type SupportedItemType { get; }
+ public abstract string FileFilter { get; }
+ public abstract ProgressChangedDelegate ProgressChanged { protected get; set; }
+
+ public abstract bool Import(object targetItem, string filePath);
+
+ public abstract void Cancel();
+
+ public void DoPostImportUpdates(object targetItem)
+ {
+ var observableTarget = targetItem as IObservable;
+ if (observableTarget != null)
+ {
+ observableTarget.NotifyObservers();
+ }
+
+ foreach (var changedObservableObject in GetAffectedNonTargetObservableInstances())
+ {
+ changedObservableObject.NotifyObservers();
+ }
+ }
+
+ ///
+ /// Returns all objects that have been affected during the call
+ /// that implement and which are were not the targeted object
+ /// to import the data to.
+ ///
+ /// If no changes were made to the data model (for example during a cancel),
+ /// no elements should be returned by the implementer.
+ protected virtual IEnumerable GetAffectedNonTargetObservableInstances()
+ {
+ return Enumerable.Empty();
+ }
+ }
+}
\ No newline at end of file
Index: Core/Common/src/Core.Common.Base/IO/IFileImporter.cs
===================================================================
diff -u -r4512af7782ee31b36941bb280b54d9da2953dd71 -rdcd6469f6000957bc1604da8e92bd5ea09e43769
--- Core/Common/src/Core.Common.Base/IO/IFileImporter.cs (.../IFileImporter.cs) (revision 4512af7782ee31b36941bb280b54d9da2953dd71)
+++ Core/Common/src/Core.Common.Base/IO/IFileImporter.cs (.../IFileImporter.cs) (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -77,5 +77,14 @@
/// This method cancels an import.
///
void Cancel();
+
+ ///
+ /// Notifies all observers of instances that have been
+ /// changed during the import.
+ ///
+ /// The item on which the import has been performed upon.
+ /// This method should be called by caller who calls
+ /// on this importer.
+ void DoPostImportUpdates(object targetItem);
}
}
\ No newline at end of file
Index: Core/Common/src/Core.Common.Base/Service/FileImportActivity.cs
===================================================================
diff -u -r4512af7782ee31b36941bb280b54d9da2953dd71 -rdcd6469f6000957bc1604da8e92bd5ea09e43769
--- Core/Common/src/Core.Common.Base/Service/FileImportActivity.cs (.../FileImportActivity.cs) (revision 4512af7782ee31b36941bb280b54d9da2953dd71)
+++ Core/Common/src/Core.Common.Base/Service/FileImportActivity.cs (.../FileImportActivity.cs) (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -89,11 +89,7 @@
protected override void OnFinish()
{
- var observableTarget = target as IObservable;
- if (observableTarget != null)
- {
- observableTarget.NotifyObservers();
- }
+ fileImporter.DoPostImportUpdates(target);
}
}
}
\ No newline at end of file
Index: Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj
===================================================================
diff -u -r985570095b487598c6c2ae93b92e2bce65bf7e90 -rdcd6469f6000957bc1604da8e92bd5ea09e43769
--- Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj (.../Core.Common.Base.Test.csproj) (revision 985570095b487598c6c2ae93b92e2bce65bf7e90)
+++ Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj (.../Core.Common.Base.Test.csproj) (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -77,6 +77,7 @@
+
Index: Core/Common/test/Core.Common.Base.Test/IO/FileImporterBaseTest.cs
===================================================================
diff -u
--- Core/Common/test/Core.Common.Base.Test/IO/FileImporterBaseTest.cs (revision 0)
+++ Core/Common/test/Core.Common.Base.Test/IO/FileImporterBaseTest.cs (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -0,0 +1,129 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+using Core.Common.Base.IO;
+
+using NUnit.Framework;
+
+using Rhino.Mocks;
+
+namespace Core.Common.Base.Test.IO
+{
+ [TestFixture]
+ public class FileImporterBaseTest
+ {
+ [Test]
+ public void Constructor_ExpectedValues()
+ {
+ // Setup
+
+ // Call
+ var simpleImporter = new SimpleFileImporter();
+
+ // Assert
+ Assert.IsInstanceOf(simpleImporter);
+ }
+
+ [Test]
+ public void DoPostImportUpdates_TargetIsObservable_NotifyObservers()
+ {
+ // Setup
+ var mocks = new MockRepository();
+ var observableInstance = mocks.Stub();
+ observableInstance.Expect(o => o.NotifyObservers());
+ mocks.ReplayAll();
+
+ var simpleImporter = new SimpleFileImporter();
+
+ // Call
+ simpleImporter.DoPostImportUpdates(observableInstance);
+
+ // Assert
+ mocks.VerifyAll(); // Assert NotifyObservers is called
+ }
+
+ [Test]
+ public void DoPostImportUpdates_HasAffectedOtherObjects_NotifyObservers()
+ {
+ // Setup
+ var mocks = new MockRepository();
+ var observableInstance = mocks.Stub();
+ observableInstance.Expect(o => o.NotifyObservers());
+ mocks.ReplayAll();
+
+ var simpleImporter = new SimpleFileImporter();
+ simpleImporter.GetAffectedNonTargetObservableInstancesOverride = new[]
+ {
+ observableInstance
+ };
+
+ // Call
+ simpleImporter.DoPostImportUpdates(new object());
+
+ // Assert
+ mocks.VerifyAll(); // Assert NotifyObservers is called
+ }
+
+ private class SimpleFileImporter : FileImporterBase
+ {
+ public override string Name
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override string Category
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override Bitmap Image
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override Type SupportedItemType
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override string FileFilter
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override ProgressChangedDelegate ProgressChanged { protected get; set; }
+ public IObservable[] GetAffectedNonTargetObservableInstancesOverride { get; set; }
+
+ protected override IEnumerable GetAffectedNonTargetObservableInstances()
+ {
+ return GetAffectedNonTargetObservableInstancesOverride ?? base.GetAffectedNonTargetObservableInstances();
+ }
+
+ public override bool Import(object targetItem, string filePath)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Cancel()
+ {
+ throw new NotImplementedException();
+ }
+ }
+ }
+}
\ No newline at end of file
Index: Core/Common/test/Core.Common.Base.Test/Service/FileImportActivityTest.cs
===================================================================
diff -u -rb6d165f6edddc4271e94c5f6d70c12d4ba0c60eb -rdcd6469f6000957bc1604da8e92bd5ea09e43769
--- Core/Common/test/Core.Common.Base.Test/Service/FileImportActivityTest.cs (.../FileImportActivityTest.cs) (revision b6d165f6edddc4271e94c5f6d70c12d4ba0c60eb)
+++ Core/Common/test/Core.Common.Base.Test/Service/FileImportActivityTest.cs (.../FileImportActivityTest.cs) (revision dcd6469f6000957bc1604da8e92bd5ea09e43769)
@@ -142,7 +142,6 @@
{
// Setup
var mocks = new MockRepository();
- var fileImporter = mocks.Stub();
var observer = mocks.StrictMock();
observer.Expect(o => o.UpdateObserver());
@@ -151,7 +150,7 @@
var target = new ObservableList