Browse Source

Generate service reference map file (Reference.svcmap) when adding service references.

pull/22/merge
Matt Ward 14 years ago
parent
commit
00adbade6b
  1. 10
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 29
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs
  3. 2
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs
  4. 11
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs
  5. 12
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs
  6. 2
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs
  7. 14
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs
  8. 30
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs
  9. 12
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs
  10. 44
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs
  11. 21
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs
  12. 71
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs
  13. 22
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs
  14. 26
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs
  15. 24
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs
  16. 2
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs
  17. 2
      src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
  18. 40
      src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs
  19. 64
      src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs
  20. 69
      src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs
  21. 57
      src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs
  22. 4
      src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs

10
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -269,17 +269,27 @@
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AdvancedServiceViewModel.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AdvancedServiceViewModel.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ClientOptions.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ICodeDomProvider.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ICodeDomProvider.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IFileSystem.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IFileSystem.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IProjectWithServiceReferences.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IProjectWithServiceReferences.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceCodeDomBuilder.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceCodeDomBuilder.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceFileGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceMapGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceProxyGenerator.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceProxyGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\MetadataFile.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\MetadataSource.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ProjectWithServiceReferences.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ProjectWithServiceReferences.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceCodeDomBuilder.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceCodeDomBuilder.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceCodeDomProvider.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceCodeDomProvider.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceFileGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceFileName.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceFileName.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceFileSystem.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceFileSystem.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceGenerator.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceMapFile.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceMapFileName.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceMapFileProjectItem.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceMapGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceProxyGenerator.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceProxyGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\WebServiceMetadataSet.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\WebServiceMetadataSet.cs" />
<Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.cs" /> <Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.cs" />

29
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs

@ -0,0 +1,29 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ClientOptions
{
public ClientOptions()
{
EnableDataBinding = true;
GenerateSerializableTypes = true;
Serializer = "Auto";
UseSerializerForFaults = true;
ReferenceAllAssemblies = true;
}
public bool GenerateAsynchronousMethods { get; set; }
public bool EnableDataBinding { get; set; }
public bool ImportXmlTypes { get; set; }
public bool GenerateInternalTypes { get; set; }
public bool GenerateMessageContracts { get; set; }
public bool GenerateSerializableTypes { get; set; }
public string Serializer { get; set; }
public bool UseSerializerForFaults { get; set; }
public bool ReferenceAllAssemblies { get; set; }
}
}

2
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs

@ -11,7 +11,9 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
ICodeDomProvider CodeDomProvider { get; } ICodeDomProvider CodeDomProvider { get; }
ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName); ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName);
ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName);
void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName); void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName);
void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName);
void Save(); void Save();
} }
} }

11
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs

@ -0,0 +1,11 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public interface IServiceReferenceFileGenerator : IServiceReferenceProxyGenerator, IServiceReferenceMapGenerator
{
}
}

12
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs

@ -0,0 +1,12 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public interface IServiceReferenceMapGenerator
{
void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile);
}
}

2
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs

@ -10,6 +10,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{ {
string ServiceReferenceNamespace { get; set; } string ServiceReferenceNamespace { get; set; }
void GenerateProxy(MetadataSet metadata, string proxyFileName); void GenerateProxyFile(MetadataSet metadata, string proxyFileName);
} }
} }

14
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs

@ -0,0 +1,14 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class MetadataFile
{
public MetadataFile()
{
}
}
}

30
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs

@ -0,0 +1,30 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Xml.Serialization;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class MetadataSource
{
public MetadataSource()
{
}
public MetadataSource(string url)
{
Address = url;
Protocol = "http";
}
[XmlAttribute]
public string Address { get; set; }
[XmlAttribute]
public string Protocol { get; set; }
[XmlAttribute]
public string SourceId { get; set; }
}
}

12
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs

@ -47,6 +47,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName); return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName);
} }
public ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName)
{
return new ServiceReferenceMapFileName(ServiceReferencesFolder, serviceReferenceName);
}
public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName) public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName)
{ {
AddServiceReferenceFileToProject(fileName); AddServiceReferenceFileToProject(fileName);
@ -58,6 +63,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{ {
var projectItem = new FileProjectItem(project, ItemType.Compile); var projectItem = new FileProjectItem(project, ItemType.Compile);
projectItem.FileName = fileName.Path; projectItem.FileName = fileName.Path;
projectItem.DependentUpon = "Reference.svcmap";
AddProjectItemToProject(projectItem); AddProjectItemToProject(projectItem);
} }
@ -84,5 +90,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{ {
project.Save(); project.Save();
} }
public void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName)
{
var projectItem = new ServiceReferenceMapFileProjectItem(project, fileName.Path);
AddProjectItemToProject(projectItem);
}
} }
} }

44
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs

@ -0,0 +1,44 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ServiceModel.Description;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceFileGenerator : IServiceReferenceFileGenerator
{
IServiceReferenceProxyGenerator proxyGenerator;
IServiceReferenceMapGenerator mapGenerator;
public ServiceReferenceFileGenerator(ICodeDomProvider codeDomProvider)
: this(
new ServiceReferenceProxyGenerator(codeDomProvider),
new ServiceReferenceMapGenerator())
{
}
public ServiceReferenceFileGenerator(
IServiceReferenceProxyGenerator proxyGenerator,
IServiceReferenceMapGenerator mapGenerator)
{
this.proxyGenerator = proxyGenerator;
this.mapGenerator = mapGenerator;
}
public string ServiceReferenceNamespace {
get { return proxyGenerator.ServiceReferenceNamespace; }
set { proxyGenerator.ServiceReferenceNamespace = value; }
}
public void GenerateProxyFile(MetadataSet metadata, string proxyFileName)
{
proxyGenerator.GenerateProxyFile(metadata, proxyFileName);
}
public void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile)
{
mapGenerator.GenerateServiceReferenceMapFile(mapFile);
}
}
}

21
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs

@ -12,7 +12,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
public class ServiceReferenceGenerator public class ServiceReferenceGenerator
{ {
IProjectWithServiceReferences project; IProjectWithServiceReferences project;
IServiceReferenceProxyGenerator proxyGenerator; IServiceReferenceFileGenerator fileGenerator;
IFileSystem fileSystem; IFileSystem fileSystem;
public ServiceReferenceGenerator(IProject project) public ServiceReferenceGenerator(IProject project)
@ -23,18 +23,18 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
public ServiceReferenceGenerator(IProjectWithServiceReferences project) public ServiceReferenceGenerator(IProjectWithServiceReferences project)
: this( : this(
project, project,
new ServiceReferenceProxyGenerator(project.CodeDomProvider), new ServiceReferenceFileGenerator(project.CodeDomProvider),
new ServiceReferenceFileSystem()) new ServiceReferenceFileSystem())
{ {
} }
public ServiceReferenceGenerator( public ServiceReferenceGenerator(
IProjectWithServiceReferences project, IProjectWithServiceReferences project,
IServiceReferenceProxyGenerator proxyGenerator, IServiceReferenceFileGenerator fileGenerator,
IFileSystem fileSystem) IFileSystem fileSystem)
{ {
this.project = project; this.project = project;
this.proxyGenerator = proxyGenerator; this.fileGenerator = fileGenerator;
this.fileSystem = fileSystem; this.fileSystem = fileSystem;
} }
@ -47,12 +47,17 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
void GenerateServiceReferenceProxy(MetadataSet metadata) void GenerateServiceReferenceProxy(MetadataSet metadata)
{ {
ServiceReferenceFileName fileName = project.GetServiceReferenceFileName(Namespace); ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(Namespace);
CreateFolderForFileIfFolderMissing(fileName.Path); CreateFolderForFileIfFolderMissing(referenceFileName.Path);
proxyGenerator.GenerateProxy(metadata, fileName.Path); fileGenerator.GenerateProxyFile(metadata, referenceFileName.Path);
project.AddServiceReferenceProxyFile(fileName); ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(Namespace);
var mapFile = new ServiceReferenceMapFile(mapFileName);
fileGenerator.GenerateServiceReferenceMapFile(mapFile);
project.AddServiceReferenceProxyFile(referenceFileName);
project.AddServiceReferenceMapFile(mapFileName);
project.Save(); project.Save();
} }

71
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs

@ -0,0 +1,71 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
[XmlRoot(ElementName = "ReferenceGroup", Namespace = "urn:schemas-microsoft-com:xml-wcfservicemap")]
public class ServiceReferenceMapFile
{
ClientOptions clientOptions = new ClientOptions();
List<MetadataSource> metadataSources = new List<MetadataSource>();
List<MetadataFile> metadata = new List<MetadataFile>();
public ServiceReferenceMapFile()
{
ID = Guid.NewGuid().ToString();
}
public ServiceReferenceMapFile(ServiceReferenceMapFileName fileName)
: this()
{
FileName = fileName.Path;
}
public override bool Equals(object obj)
{
var rhs = obj as ServiceReferenceMapFile;
return FileName == rhs.FileName;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public static ServiceReferenceMapFile CreateMapFileWithUrl(string url)
{
var mapFile = new ServiceReferenceMapFile();
mapFile.AddMetadataSourceForUrl(url);
return mapFile;
}
public void AddMetadataSourceForUrl(string url)
{
var metadataSource = new MetadataSource(url) { SourceId = "1" };
metadataSources.Add(metadataSource);
}
[XmlIgnoreAttribute]
public string FileName { get; set; }
[XmlAttribute]
public string ID { get; set; }
public ClientOptions ClientOptions {
get { return clientOptions; }
set { clientOptions = value; }
}
public List<MetadataSource> MetadataSources {
get { return metadataSources; }
}
public List<MetadataFile> Metadata {
get { return metadata; }
}
}
}

22
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs

@ -0,0 +1,22 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using IO = System.IO;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceMapFileName
{
string path;
public ServiceReferenceMapFileName(string serviceReferencesFolder, string serviceName)
{
path = IO.Path.Combine(serviceReferencesFolder, serviceName, "Reference.svcmap");
}
public string Path {
get { return path; }
}
}
}

26
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs

@ -0,0 +1,26 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceMapFileProjectItem : FileProjectItem
{
public ServiceReferenceMapFileProjectItem(
IProject project,
string fileName)
: base(project, ItemType.None)
{
this.FileName = fileName;
AddMetadata();
}
void AddMetadata()
{
SetMetadata("LastGenOutput", "Reference.cs");
SetMetadata("Generator", "WCF Proxy Generator");
}
}
}

24
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs

@ -0,0 +1,24 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Xml.Serialization;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceMapGenerator : IServiceReferenceMapGenerator
{
public void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile)
{
var writer = new StreamWriter(mapFile.FileName);
GenerateServiceReferenceMapFile(writer, mapFile);
}
public void GenerateServiceReferenceMapFile(TextWriter textWriter, ServiceReferenceMapFile mapFile)
{
var serializer = new XmlSerializer(typeof(ServiceReferenceMapFile));
serializer.Serialize(textWriter, mapFile);
}
}
}

2
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
public string ServiceReferenceNamespace { get; set; } public string ServiceReferenceNamespace { get; set; }
public void GenerateProxy(MetadataSet metadata, string proxyFileName) public void GenerateProxyFile(MetadataSet metadata, string proxyFileName)
{ {
CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata); CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata);
GenerateProxy(compileUnit, proxyFileName); GenerateProxy(compileUnit, proxyFileName);

2
src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj

@ -101,6 +101,8 @@
<Compile Include="ServiceReferences\ProjectWithServiceReferencesTests.cs" /> <Compile Include="ServiceReferences\ProjectWithServiceReferencesTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceFileNameTests.cs" /> <Compile Include="ServiceReferences\ServiceReferenceFileNameTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceGeneratorTests.cs" /> <Compile Include="ServiceReferences\ServiceReferenceGeneratorTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceMapFileTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceMapFileGeneratorTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceNodeTests.cs" /> <Compile Include="ServiceReferences\ServiceReferenceNodeTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceProxyGeneratorTests.cs" /> <Compile Include="ServiceReferences\ServiceReferenceProxyGeneratorTests.cs" />
<Compile Include="ServiceReferences\ServiceReferencesFolderNodeTests.cs" /> <Compile Include="ServiceReferences\ServiceReferencesFolderNodeTests.cs" />

40
src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs

@ -4,6 +4,7 @@
using System; using System;
using System.CodeDom.Compiler; using System.CodeDom.Compiler;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
@ -61,6 +62,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
return msbuildProject.GetItemsOfType(ItemType.ServiceReference).SingleOrDefault() as ServiceReferenceProjectItem; return msbuildProject.GetItemsOfType(ItemType.ServiceReference).SingleOrDefault() as ServiceReferenceProjectItem;
} }
FileProjectItem GetFileFromMSBuildProject(string fileName)
{
return msbuildProject.Items.Single(item => item.FileName == fileName) as FileProjectItem;
}
[Test] [Test]
public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder()
{ {
@ -110,7 +116,10 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName);
string dependentUpon = item.GetMetadata("DependentUpon");
Assert.AreEqual(ItemType.Compile, item.ItemType); Assert.AreEqual(ItemType.Compile, item.ItemType);
Assert.AreEqual("Reference.svcmap", dependentUpon);
} }
[Test] [Test]
@ -148,5 +157,36 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
Assert.AreEqual("Service1", item.Include); Assert.AreEqual("Service1", item.Include);
} }
[Test]
public void GetServiceReferenceMapFileName_ProjectHasNoServiceReferences_ReturnsMapFileNameInServiceReferencesFolderWithSubFolderNamedAfterServiceReference()
{
CreateProject();
SetProjectDirectory(@"d:\projects\MyProject");
ServiceReferenceMapFileName fileName = project.GetServiceReferenceMapFileName("Service1");
string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.svcmap";
Assert.AreEqual(expectedFileName, fileName.Path);
}
[Test]
public void AddServiceReferenceMapFile_ProjectHasNoServiceReferences_ServiceReferenceMapAddedToProject()
{
CreateProjectWithMSBuildProject();
var mapFileName = new ServiceReferenceMapFileName(@"d:\projects\MyProject\Service References", "Service1");
project.AddServiceReferenceMapFile(mapFileName);
string fileName = @"d:\projects\MyProject\Service References\Service1\Reference.svcmap";
FileProjectItem item = GetFileFromMSBuildProject(fileName);
string lastGenOutput = item.GetMetadata("LastGenOutput");
string generator = item.GetMetadata("Generator");
Assert.AreEqual(ItemType.None, item.ItemType);
Assert.AreEqual("Reference.cs", lastGenOutput);
Assert.AreEqual("WCF Proxy Generator", generator);
}
} }
} }

64
src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs

@ -15,7 +15,9 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{ {
IProjectWithServiceReferences fakeProject; IProjectWithServiceReferences fakeProject;
IServiceReferenceProxyGenerator fakeProxyGenerator; IServiceReferenceProxyGenerator fakeProxyGenerator;
IServiceReferenceMapGenerator fakeReferenceMapGenerator;
ServiceReferenceGenerator generator; ServiceReferenceGenerator generator;
ServiceReferenceFileGenerator fileGenerator;
IFileSystem fakeFileSystem; IFileSystem fakeFileSystem;
MetadataSet metadata; MetadataSet metadata;
@ -25,8 +27,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>(); fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>();
fakeProxyGenerator = MockRepository.GenerateStub<IServiceReferenceProxyGenerator>(); fakeProxyGenerator = MockRepository.GenerateStub<IServiceReferenceProxyGenerator>();
fakeReferenceMapGenerator = MockRepository.GenerateStub<IServiceReferenceMapGenerator>();
fileGenerator = new ServiceReferenceFileGenerator(fakeProxyGenerator, fakeReferenceMapGenerator);
fakeFileSystem = MockRepository.GenerateStub<IFileSystem>(); fakeFileSystem = MockRepository.GenerateStub<IFileSystem>();
generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem);
generator = new ServiceReferenceGenerator(fakeProject, fileGenerator, fakeFileSystem);
} }
void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName) void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName)
@ -51,18 +56,35 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
return proxyFileName; return proxyFileName;
} }
ServiceReferenceMapFileName AddMapFileNameForServiceName(string serviceName)
{
return AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", serviceName);
}
ServiceReferenceMapFileName AddMapFileNameForServiceName(string serviceReferencesFolder, string serviceName)
{
var fileName = new ServiceReferenceMapFileName(serviceReferencesFolder, serviceName);
SetServiceReferenceMapFileName(serviceName, fileName);
return fileName;
}
void SetServiceReferenceMapFileName(string serviceName, ServiceReferenceMapFileName fileName)
{
fakeProject.Stub(p => p.GetServiceReferenceMapFileName(serviceName)).Return(fileName);
}
[Test] [Test]
public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator() public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator()
{ {
CreateGenerator(); CreateGenerator();
ServiceReferenceFileName proxyFileName = AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef");
AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddMapFileNameForServiceName("MyServiceRef");
generator.Namespace = "MyServiceRef"; generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata); generator.AddServiceReference(metadata);
string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs";
fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxy(metadata, expectedProxyFileName)); fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxyFile(metadata, expectedProxyFileName));
} }
[Test] [Test]
@ -70,6 +92,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{ {
CreateGenerator(); CreateGenerator();
AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1");
AddMapFileNameForServiceName("MyService1");
generator.Namespace = "MyService1"; generator.Namespace = "MyService1";
generator.AddServiceReference(metadata); generator.AddServiceReference(metadata);
@ -85,6 +108,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
CreateGenerator(); CreateGenerator();
ServiceReferenceFileName expectedProxyFileName = ServiceReferenceFileName expectedProxyFileName =
AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef");
AddMapFileNameForServiceName("MyServiceRef");
generator.Namespace = "MyServiceRef"; generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata); generator.AddServiceReference(metadata);
@ -97,11 +121,43 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{ {
CreateGenerator(); CreateGenerator();
AddProxyFileNameForServiceName("MyServiceRef"); AddProxyFileNameForServiceName("MyServiceRef");
AddMapFileNameForServiceName("MyServiceRef");
generator.Namespace = "MyServiceRef"; generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata); generator.AddServiceReference(metadata);
fakeProject.AssertWasCalled(p => p.Save()); fakeProject.AssertWasCalled(p => p.Save());
} }
[Test]
public void AddServiceReference_GeneratesServiceReference_ReferenceServiceMapFileIsCreated()
{
CreateGenerator();
AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef");
AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef");
generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata);
var expectedMapFile = new ServiceReferenceMapFile() {
FileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.svcmap"
};
fakeReferenceMapGenerator.AssertWasCalled(gen => gen.GenerateServiceReferenceMapFile(expectedMapFile));
}
[Test]
public void AddServiceReference_GeneratesServiceReference_ReferenceServiceMapFileIsAddedToProject()
{
CreateGenerator();
AddProxyFileNameForServiceName("MyServiceRef");
ServiceReferenceMapFileName expectedMapFileName =
AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef");
generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata);
fakeProject.AssertWasCalled(p => p.AddServiceReferenceMapFile(expectedMapFileName));
}
} }
} }

69
src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs

@ -0,0 +1,69 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Text;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using NUnit.Framework;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class ServiceReferenceMapFileGeneratorTests
{
ServiceReferenceMapGenerator generator;
void CreateFileGenerator()
{
generator = new ServiceReferenceMapGenerator();
}
string GenerateMapFile(ServiceReferenceMapFile mapFile)
{
var output = new StringBuilder();
var writer = new StringWriter(output);
generator.GenerateServiceReferenceMapFile(writer, mapFile);
return output.ToString();
}
ServiceReferenceMapFile CreateServiceReferenceMapFileWithUrl(string url)
{
return ServiceReferenceMapFile.CreateMapFileWithUrl(url);
}
[Test]
public void GenerateServiceReferenceMapFile_MapFileWrittenToStringWriter_SerialisesReferenceGroup()
{
CreateFileGenerator();
ServiceReferenceMapFile mapFile = CreateServiceReferenceMapFileWithUrl("http://localhost/MyService1.svc");
mapFile.ID = "a606bbd6-26e5-4025-a25e-b8c262422f2a";
string output = GenerateMapFile(mapFile);
string expectedOutput =
@"<?xml version=""1.0"" encoding=""utf-16""?>
<ReferenceGroup xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" ID=""a606bbd6-26e5-4025-a25e-b8c262422f2a"" xmlns=""urn:schemas-microsoft-com:xml-wcfservicemap"">
<ClientOptions>
<GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
<EnableDataBinding>true</EnableDataBinding>
<ImportXmlTypes>false</ImportXmlTypes>
<GenerateInternalTypes>false</GenerateInternalTypes>
<GenerateMessageContracts>false</GenerateMessageContracts>
<GenerateSerializableTypes>true</GenerateSerializableTypes>
<Serializer>Auto</Serializer>
<UseSerializerForFaults>true</UseSerializerForFaults>
<ReferenceAllAssemblies>true</ReferenceAllAssemblies>
</ClientOptions>
<MetadataSources>
<MetadataSource Address=""http://localhost/MyService1.svc"" Protocol=""http"" SourceId=""1"" />
</MetadataSources>
<Metadata />
</ReferenceGroup>";
Assert.AreEqual(expectedOutput, output);
}
}
}

57
src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs

@ -0,0 +1,57 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using NUnit.Framework;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class ServiceReferenceMapFileTests
{
ServiceReferenceMapFile lhs;
ServiceReferenceMapFile rhs;
void CreateMapFilesToCompare()
{
lhs = new ServiceReferenceMapFile();
rhs = new ServiceReferenceMapFile();
}
void AssertFilesAreEqual()
{
bool result = AreFilesEqual();
Assert.IsTrue(result);
}
bool AreFilesEqual()
{
return lhs.Equals(rhs);
}
void AssertFilesAreNotEqual()
{
bool result = AreFilesEqual();
Assert.IsFalse(result);
}
[Test]
public void Equals_FilesAreSame_ReturnsTrue()
{
CreateMapFilesToCompare();
AssertFilesAreEqual();
}
[Test]
public void Equals_FilesHaveDifferentFileNames_ReturnsFalse()
{
CreateMapFilesToCompare();
lhs.FileName = "a";
rhs.FileName = "b";
AssertFilesAreNotEqual();
}
}
}

4
src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs

@ -37,14 +37,14 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
} }
[Test] [Test]
public void GenerateProxy_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder() public void GenerateProxyFile_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder()
{ {
CreateProxyGenerator(); CreateProxyGenerator();
CodeCompileUnit compileUnit = CreateCompileUnitToReturnFromCodeDomBuilder(metadata); CodeCompileUnit compileUnit = CreateCompileUnitToReturnFromCodeDomBuilder(metadata);
proxyGenerator.ServiceReferenceNamespace = "Test"; proxyGenerator.ServiceReferenceNamespace = "Test";
string expectedProxyFileName = @"d:\projects\MyProject\Service References\Test\Service1\Reference.cs"; string expectedProxyFileName = @"d:\projects\MyProject\Service References\Test\Service1\Reference.cs";
proxyGenerator.GenerateProxy(metadata, expectedProxyFileName); proxyGenerator.GenerateProxyFile(metadata, expectedProxyFileName);
fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName)); fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName));
} }

Loading…
Cancel
Save