Browse Source

Generate WCF proxy file from Add Service Reference dialog.

pull/22/merge
Matt Ward 14 years ago
parent
commit
f06449a0fd
  1. 16
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 28
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs
  3. 15
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ICodeDomProvider.cs
  4. 12
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IFileSystem.cs
  5. 17
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs
  6. 15
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs
  7. 15
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs
  8. 80
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs
  9. 25
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs
  10. 42
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomProvider.cs
  11. 18
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileSystem.cs
  12. 66
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs
  13. 42
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs
  14. 50
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/WebServiceMetadataSet.cs
  15. 16
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs
  16. 7
      src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
  17. 131
      src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs
  18. 88
      src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs
  19. 52
      src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs
  20. 97
      src/Main/Base/Test/ServiceReferences/WebServiceMetadataSetTests.cs

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

@ -28,6 +28,7 @@
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile> </TargetFrameworkProfile>
<RootNamespace>ICSharpCode.SharpDevelop</RootNamespace>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugType>Full</DebugType> <DebugType>Full</DebugType>
@ -60,6 +61,9 @@
<Reference Include="System.Design" /> <Reference Include="System.Design" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.EnterpriseServices" /> <Reference Include="System.EnterpriseServices" />
<Reference Include="System.ServiceModel">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Web.Services" /> <Reference Include="System.Web.Services" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
@ -265,6 +269,18 @@
<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\ICodeDomProvider.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\IServiceReferenceCodeDomBuilder.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\IServiceReferenceProxyGenerator.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\ServiceReferenceCodeDomProvider.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\ServiceReferenceProxyGenerator.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\WebServiceMetadataSet.cs" />
<Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.cs" /> <Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.cs" />
<Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.Designer.cs"> <Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.Designer.cs">
<DependentUpon>ToolNotFoundDialog.cs</DependentUpon> <DependentUpon>ToolNotFoundDialog.cs</DependentUpon>

28
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs

@ -1,11 +1,6 @@
/* // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
* Created by SharpDevelop. // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
* User: Peter Forstmeier
* Date: 12.10.2011
* Time: 20:05
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@ -23,21 +18,18 @@ using System.Windows.Controls;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
using ICSharpCode.SharpDevelop.Widgets; using ICSharpCode.SharpDevelop.Widgets;
using ICSharpCode.SharpDevelop.Widgets.Resources; using ICSharpCode.SharpDevelop.Widgets.Resources;
using Microsoft.Win32; using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{ {
/// <summary> public class AddServiceReferenceViewModel : ViewModelBase
/// Description of AddServiceReferenceViewModel.
/// </summary>
public class AddServiceReferenceViewModel:ViewModelBase
{ {
string header1 = "To see a list of available services on a specific server, "; string header1 = "To see a list of available services on a specific server, ";
string header2 = "enter a service URL and click Go. To browse for available services click Discover."; string header2 = "enter a service URL and click Go. To browse for available services click Discover.";
@ -61,6 +53,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
ServiceDescriptionCollection serviceDescriptionCollection = new ServiceDescriptionCollection(); ServiceDescriptionCollection serviceDescriptionCollection = new ServiceDescriptionCollection();
CredentialCache credentialCache = new CredentialCache(); CredentialCache credentialCache = new CredentialCache();
WebServiceDiscoveryClientProtocol discoveryClientProtocol; WebServiceDiscoveryClientProtocol discoveryClientProtocol;
WebServiceMetadataSet serviceMetadata;
delegate DiscoveryDocument DiscoverAnyAsync(string url); delegate DiscoveryDocument DiscoverAnyAsync(string url);
delegate void DiscoveredWebServicesHandler(DiscoveryClientProtocol protocol); delegate void DiscoveredWebServicesHandler(DiscoveryClientProtocol protocol);
@ -248,6 +241,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{ {
if (protocol != null) { if (protocol != null) {
serviceDescriptionCollection = ServiceReferenceHelper.GetServiceDescriptions(protocol); serviceDescriptionCollection = ServiceReferenceHelper.GetServiceDescriptions(protocol);
serviceMetadata = new WebServiceMetadataSet(protocol);
ServiceDescriptionMessage = String.Format("{0} service(s) found at address {1}", ServiceDescriptionMessage = String.Format("{0} service(s) found at address {1}",
serviceDescriptionCollection.Count, serviceDescriptionCollection.Count,
@ -402,6 +396,14 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
} }
ServiceItems = items; ServiceItems = items;
} }
public void AddServiceReference()
{
var serviceGenerator = new ServiceReferenceGenerator(project);
serviceGenerator.Namespace = defaultNameSpace;
serviceGenerator.AddServiceReference(serviceMetadata);
new RefreshProjectBrowser().Run();
}
} }

15
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ICodeDomProvider.cs

@ -0,0 +1,15 @@
// 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.CodeDom;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public interface ICodeDomProvider
{
string FileExtension { get; }
void GenerateCodeFromCompileUnit(CodeCompileUnit compileUnit, string fileName);
}
}

12
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IFileSystem.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 IFileSystem
{
void CreateDirectoryIfMissing(string path);
}
}

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

@ -0,0 +1,17 @@
// 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 IProjectWithServiceReferences
{
string ServiceReferencesFolder { get; }
ICodeDomProvider CodeDomProvider { get; }
string GetServiceReferenceFileName(string serviceReferenceName);
void AddServiceReferenceProxyFile(string fileName);
void Save();
}
}

15
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs

@ -0,0 +1,15 @@
// 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.CodeDom;
using System.ServiceModel.Description;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public interface IServiceReferenceCodeDomBuilder
{
CodeCompileUnit GenerateCompileUnit(MetadataSet metadata);
}
}

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

@ -0,0 +1,15 @@
// 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 interface IServiceReferenceProxyGenerator
{
string ServiceReferenceNamespace { get; set; }
void GenerateProxy(MetadataSet metadata, string proxyFileName);
}
}

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

@ -0,0 +1,80 @@
// 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.CodeDom.Compiler;
using System.IO;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ProjectWithServiceReferences : IProjectWithServiceReferences
{
IProject project;
string serviceReferencesFolder;
public static readonly string DefaultServiceReferencesFolderName = "Service References";
public ProjectWithServiceReferences(IProject project)
: this(project, new ServiceReferenceCodeDomProvider(project))
{
}
public ProjectWithServiceReferences(IProject project, ICodeDomProvider codeDomProvider)
{
this.project = project;
this.CodeDomProvider = codeDomProvider;
}
public string ServiceReferencesFolder {
get {
if (serviceReferencesFolder == null) {
GetServiceReferencesFolder();
}
return serviceReferencesFolder;
}
}
void GetServiceReferencesFolder()
{
serviceReferencesFolder = Path.Combine(project.Directory, DefaultServiceReferencesFolderName);
}
public ICodeDomProvider CodeDomProvider { get; private set; }
public string GetServiceReferenceFileName(string serviceReferenceName)
{
return Path.Combine(ServiceReferencesFolder, serviceReferenceName, "Reference.cs");
}
public void AddServiceReferenceProxyFile(string fileName)
{
AddServiceReferenceFileToProject(fileName);
AddServiceReferencesItemToProject();
}
void AddServiceReferenceFileToProject(string fileName)
{
var projectItem = new FileProjectItem(project, ItemType.Compile);
projectItem.FileName = fileName;
AddProjectItemToProject(projectItem);
}
void AddProjectItemToProject(ProjectItem item)
{
ProjectService.AddProjectItem(project, item);
}
void AddServiceReferencesItemToProject()
{
var projectItem = new ServiceReferencesProjectItem(project);
projectItem.Include = "Service References";
AddProjectItemToProject(projectItem);
}
public void Save()
{
project.Save();
}
}
}

25
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs

@ -0,0 +1,25 @@
// 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.CodeDom;
using System.ServiceModel.Description;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceCodeDomBuilder : IServiceReferenceCodeDomBuilder
{
public CodeCompileUnit GenerateCompileUnit(MetadataSet metadata)
{
var importer = new WsdlImporter(metadata);
var contractGenerator = new ServiceContractGenerator();
contractGenerator.Options = ServiceContractGenerationOptions.ClientClass;
foreach (ContractDescription contract in importer.ImportAllContracts()) {
contractGenerator.GenerateServiceContractType(contract);
}
return contractGenerator.TargetCompileUnit;
}
}
}

42
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomProvider.cs

@ -0,0 +1,42 @@
// 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.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceCodeDomProvider : ICodeDomProvider
{
IProject project;
CodeDomProvider codeDomProvider;
public ServiceReferenceCodeDomProvider(IProject project)
{
this.project = project;
}
public string FileExtension {
get { return CodeDomProvider.FileExtension; }
}
CodeDomProvider CodeDomProvider {
get {
if (codeDomProvider == null) {
codeDomProvider = project.LanguageProperties.CodeDomProvider;
}
return codeDomProvider;
}
}
public void GenerateCodeFromCompileUnit(CodeCompileUnit compileUnit, string fileName)
{
using (var writer = new StreamWriter(fileName)) {
CodeDomProvider.GenerateCodeFromCompileUnit(compileUnit, writer, null);
}
}
}
}

18
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileSystem.cs

@ -0,0 +1,18 @@
// 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;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceFileSystem : IFileSystem
{
public void CreateDirectoryIfMissing(string path)
{
if (!Directory.Exists(path)) {
Directory.CreateDirectory(path);
}
}
}
}

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

@ -0,0 +1,66 @@
// 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.ServiceModel.Description;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceGenerator
{
IProjectWithServiceReferences project;
IServiceReferenceProxyGenerator proxyGenerator;
IFileSystem fileSystem;
public ServiceReferenceGenerator(IProject project)
: this(new ProjectWithServiceReferences(project))
{
}
public ServiceReferenceGenerator(IProjectWithServiceReferences project)
: this(
project,
new ServiceReferenceProxyGenerator(project.CodeDomProvider),
new ServiceReferenceFileSystem())
{
}
public ServiceReferenceGenerator(
IProjectWithServiceReferences project,
IServiceReferenceProxyGenerator proxyGenerator,
IFileSystem fileSystem)
{
this.project = project;
this.proxyGenerator = proxyGenerator;
this.fileSystem = fileSystem;
}
public string Namespace { get; set; }
public void AddServiceReference(MetadataSet metadata)
{
GenerateServiceReferenceProxy(metadata);
}
void GenerateServiceReferenceProxy(MetadataSet metadata)
{
string fileName = project.GetServiceReferenceFileName(Namespace);
CreateFolderForFileIfFolderMissing(fileName);
proxyGenerator.GenerateProxy(metadata, fileName);
project.AddServiceReferenceProxyFile(fileName);
project.Save();
}
void CreateFolderForFileIfFolderMissing(string fileName)
{
string folder = Path.GetDirectoryName(fileName);
fileSystem.CreateDirectoryIfMissing(folder);
}
}
}

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

@ -0,0 +1,42 @@
// 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.CodeDom;
using System.IO;
using System.ServiceModel.Description;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class ServiceReferenceProxyGenerator : IServiceReferenceProxyGenerator
{
IServiceReferenceCodeDomBuilder codeDomBuilder;
ICodeDomProvider codeDomProvider;
public ServiceReferenceProxyGenerator(ICodeDomProvider codeDomProvider)
: this(codeDomProvider, new ServiceReferenceCodeDomBuilder())
{
}
public ServiceReferenceProxyGenerator(
ICodeDomProvider codeDomProvider,
IServiceReferenceCodeDomBuilder codeDomBuilder)
{
this.codeDomProvider = codeDomProvider;
this.codeDomBuilder = codeDomBuilder;
}
public string ServiceReferenceNamespace { get; set; }
public void GenerateProxy(MetadataSet metadata, string proxyFileName)
{
CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata);
GenerateProxy(compileUnit, proxyFileName);
}
void GenerateProxy(CodeCompileUnit compileUnit, string fileName)
{
codeDomProvider.GenerateCodeFromCompileUnit(compileUnit, fileName);
}
}
}

50
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/WebServiceMetadataSet.cs

@ -0,0 +1,50 @@
// 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;
using System.Xml.Schema;
using WSDescription = System.Web.Services.Description;
using WSDiscovery = System.Web.Services.Discovery;
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
{
public class WebServiceMetadataSet : MetadataSet
{
public static readonly string EmptyMetadataIdentifier = String.Empty;
public WebServiceMetadataSet(WSDiscovery.DiscoveryClientProtocol discoveryClient)
{
AddToMetadata(discoveryClient.Documents);
}
void AddToMetadata(WSDiscovery.DiscoveryClientDocumentCollection documents)
{
foreach (object document in documents.Values) {
AddToMetadataIfNotNull(document as WSDescription.ServiceDescription);
AddToMetadataIfNotNull(document as XmlSchema);
}
}
void AddToMetadataIfNotNull(WSDescription.ServiceDescription serviceDescription)
{
if (serviceDescription != null) {
AddMetadataSection(MetadataSection.ServiceDescriptionDialect, serviceDescription);
}
}
void AddMetadataSection(string dialect, object metadata)
{
var metadataSection = new MetadataSection(dialect, EmptyMetadataIdentifier, metadata);
MetadataSections.Add(metadataSection);
}
void AddToMetadataIfNotNull(XmlSchema schema)
{
if (schema != null) {
AddMetadataSection(MetadataSection.XmlSchemaDialect, schema);
}
}
}
}

16
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs

@ -227,23 +227,23 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
} }
public class AddServiceReferenceToProject: AbstractMenuCommand public class AddServiceReferenceToProject : AbstractMenuCommand
{ {
// private static string NodePath = "//system.serviceModel//client//endpoint";
public override void Run() public override void Run()
{ {
AbstractProjectBrowserTreeNode node = Owner as AbstractProjectBrowserTreeNode; var node = Owner as AbstractProjectBrowserTreeNode;
IProject project = (node != null) ? node.Project : ProjectService.CurrentProject; IProject project = (node != null) ? node.Project : ProjectService.CurrentProject;
if (project == null) { if (project == null) {
return; return;
} }
var vm = new AddServiceReferenceViewModel(project); var vm = new AddServiceReferenceViewModel(project);
AddServiceReferenceDialog o = new AddServiceReferenceDialog(); var dialog = new AddServiceReferenceDialog();
o.DataContext = vm; dialog.DataContext = vm;
o.Owner = WorkbenchSingleton.MainWindow; dialog.Owner = WorkbenchSingleton.MainWindow;
var b = o.ShowDialog(); if (dialog.ShowDialog() ?? true) {
vm.AddServiceReference();
}
} }
} }

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

@ -47,6 +47,9 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.ServiceModel">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Web.Services" /> <Reference Include="System.Web.Services" />
@ -95,9 +98,13 @@
<Compile Include="ServiceReferences\DirectoryNodeFactoryTests.cs" /> <Compile Include="ServiceReferences\DirectoryNodeFactoryTests.cs" />
<Compile Include="ServiceReferences\ItemTypeTests.cs" /> <Compile Include="ServiceReferences\ItemTypeTests.cs" />
<Compile Include="ServiceReferences\MSBuildBasedProjectTests.cs" /> <Compile Include="ServiceReferences\MSBuildBasedProjectTests.cs" />
<Compile Include="ServiceReferences\ProjectWithServiceReferencesTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceGeneratorTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceNodeTests.cs" /> <Compile Include="ServiceReferences\ServiceReferenceNodeTests.cs" />
<Compile Include="ServiceReferences\ServiceReferenceProxyGeneratorTests.cs" />
<Compile Include="ServiceReferences\ServiceReferencesFolderNodeTests.cs" /> <Compile Include="ServiceReferences\ServiceReferencesFolderNodeTests.cs" />
<Compile Include="ServiceReferences\ServiceReferencesProjectItemTests.cs" /> <Compile Include="ServiceReferences\ServiceReferencesProjectItemTests.cs" />
<Compile Include="ServiceReferences\WebServiceMetadataSetTests.cs" />
<Compile Include="StringTagProvider\MockProjectForTagProvider.cs" /> <Compile Include="StringTagProvider\MockProjectForTagProvider.cs" />
<Compile Include="StringTagProvider\NullProjectStringTagProviderTestFixture.cs" /> <Compile Include="StringTagProvider\NullProjectStringTagProviderTestFixture.cs" />
<Compile Include="StringTagProvider\ProjectTagsTestFixture.cs" /> <Compile Include="StringTagProvider\ProjectTagsTestFixture.cs" />

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

@ -0,0 +1,131 @@
// 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.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
using Microsoft.CSharp;
using NUnit.Framework;
using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class ProjectWithServiceReferencesTests
{
IProject fakeProject;
ProjectWithServiceReferences project;
List<ProjectItem> projectItemsAddedToProject;
MSBuildBasedProject msbuildProject;
void CreateProject()
{
projectItemsAddedToProject = new List<ProjectItem>();
fakeProject = MockRepository.GenerateStub<IProject>();
project = new ProjectWithServiceReferences(fakeProject);
}
void CreateProjectWithMSBuildProject()
{
msbuildProject = WebReferenceTestHelper.CreateTestProject("C#");
project = new ProjectWithServiceReferences(msbuildProject);
}
void SetProjectDirectory(string directory)
{
fakeProject.Stub(p => p.Directory).Return(directory);
}
void SetProjectCodeDomProvider(LanguageProperties languageProperties)
{
fakeProject.Stub(p => p.LanguageProperties).Return(languageProperties);
}
ProjectItem GetFirstServiceReferenceFileInMSBuildProject(string fileName)
{
return msbuildProject.Items.SingleOrDefault(item => item.FileName == fileName);
}
ServiceReferencesProjectItem GetFirstWCFMetadataItemInMSBuildProject()
{
return msbuildProject.GetItemsOfType(ItemType.ServiceReferences).SingleOrDefault() as ServiceReferencesProjectItem;
}
[Test]
public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder()
{
CreateProject();
SetProjectDirectory(@"d:\projects\MyProject");
string folder = project.ServiceReferencesFolder;
string expectedFolder = @"d:\projects\MyProject\Service References";
Assert.AreEqual(expectedFolder, folder);
}
[Test]
public void CodeDomProvider_UnderlyingProjectUsesCSharpCodeDomProvider_ProjectUsesCSharpCodeDomProvider()
{
CreateProject();
SetProjectCodeDomProvider(LanguageProperties.CSharp);
ICodeDomProvider codeDomProvider = project.CodeDomProvider;
string fileExtension = codeDomProvider.FileExtension;
Assert.AreEqual("cs", fileExtension);
}
[Test]
public void GetServiceReferenceProxyFileName_ProjectHasNoServiceReferences_ReturnsFileNameInServiceReferencesFolderWithSubFolderNamedAfterServiceReference()
{
CreateProject();
SetProjectDirectory(@"d:\projects\MyProject");
string fileName = project.GetServiceReferenceFileName("Service1");
string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_ProxyFileAddedToProjectAsFileToCompile()
{
CreateProjectWithMSBuildProject();
string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs";
project.AddServiceReferenceProxyFile(proxyFileName);
ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName);
Assert.AreEqual(ItemType.Compile, item.ItemType);
}
[Test]
public void Save_SaveProjectChanges_UnderlyingProjectIsSaved()
{
CreateProject();
project.Save();
fakeProject.AssertWasCalled(p => p.Save());
}
[Test]
public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_WCFMetadataItemAddedToProjectForServiceReferencesFolder()
{
CreateProjectWithMSBuildProject();
string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs";
project.AddServiceReferenceProxyFile(proxyFileName);
ServiceReferencesProjectItem item = GetFirstWCFMetadataItemInMSBuildProject();
Assert.AreEqual("Service References", item.Include);
}
}
}

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

@ -0,0 +1,88 @@
// 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;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class ServiceReferenceGeneratorTests
{
IProjectWithServiceReferences fakeProject;
IServiceReferenceProxyGenerator fakeProxyGenerator;
ServiceReferenceGenerator generator;
IFileSystem fakeFileSystem;
MetadataSet metadata;
void CreateGenerator()
{
metadata = new MetadataSet();
fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>();
fakeProxyGenerator = MockRepository.GenerateStub<IServiceReferenceProxyGenerator>();
fakeFileSystem = MockRepository.GenerateStub<IFileSystem>();
generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem);
}
void SetServiceReferenceFileName(string serviceReferenceName, string fileName)
{
fakeProject.Stub(p => p.GetServiceReferenceFileName(serviceReferenceName)).Return(fileName);
}
[Test]
public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator()
{
CreateGenerator();
string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs";
SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName);
generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata);
fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxy(metadata, expectedProxyFileName));
}
[Test]
public void AddServiceReference_ServiceReferenceDoesNotExist_ServiceReferenceFolderCreated()
{
CreateGenerator();
string proxyFileName = @"d:\projects\MyProject\Service References\MyService1\Reference.cs";
SetServiceReferenceFileName("MyService1", proxyFileName);
generator.Namespace = "MyService1";
generator.AddServiceReference(metadata);
string expectedDirectory = @"d:\projects\MyProject\Service References\MyService1";
fakeFileSystem.AssertWasCalled(f => f.CreateDirectoryIfMissing(expectedDirectory));
}
[Test]
public void AddServiceReference_GeneratesServiceReference_ServiceReferenceProxyFileAddedToProject()
{
CreateGenerator();
string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs";
SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName);
generator.Namespace = "MyServiceRef";
generator.AddServiceReference(metadata);
fakeProject.AssertWasCalled(p => p.AddServiceReferenceProxyFile(expectedProxyFileName));
}
[Test]
public void AddServiceReference_GeneratesServiceReference_ProjectIsSaved()
{
CreateGenerator();
generator.AddServiceReference(metadata);
fakeProject.AssertWasCalled(p => p.Save());
}
}
}

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

@ -0,0 +1,52 @@
// 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.CodeDom;
using System.ServiceModel.Description;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using NUnit.Framework;
using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class ServiceReferenceProxyGeneratorTests
{
ServiceReferenceProxyGenerator proxyGenerator;
IProjectWithServiceReferences fakeProject;
IServiceReferenceCodeDomBuilder fakeCodeDomBuilder;
ICodeDomProvider fakeCodeDomProvider;
MetadataSet metadata;
void CreateProxyGenerator()
{
metadata = new MetadataSet();
fakeCodeDomBuilder = MockRepository.GenerateStub<IServiceReferenceCodeDomBuilder>();
fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>();
fakeCodeDomProvider = MockRepository.GenerateStub<ICodeDomProvider>();
proxyGenerator = new ServiceReferenceProxyGenerator(fakeCodeDomProvider, fakeCodeDomBuilder);
}
CodeCompileUnit CreateCompileUnitToReturnFromCodeDomBuilder(MetadataSet metadata)
{
var compileUnit = new CodeCompileUnit();
fakeCodeDomBuilder.Stub(c => c.GenerateCompileUnit(metadata)).Return(compileUnit);
return compileUnit;
}
[Test]
public void GenerateProxy_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder()
{
CreateProxyGenerator();
CodeCompileUnit compileUnit = CreateCompileUnitToReturnFromCodeDomBuilder(metadata);
proxyGenerator.ServiceReferenceNamespace = "Test";
string expectedProxyFileName = @"d:\projects\MyProject\Service References\Test\Service1\Reference.cs";
proxyGenerator.GenerateProxy(metadata, expectedProxyFileName);
fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName));
}
}
}

97
src/Main/Base/Test/ServiceReferences/WebServiceMetadataSetTests.cs

@ -0,0 +1,97 @@
// 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.Linq;
using System.ServiceModel.Description;
using System.Web.Services.Discovery;
using System.Xml.Schema;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using NUnit.Framework;
using WSDescription = System.Web.Services.Description;
using WSDiscovery = System.Web.Services.Discovery;
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
{
[TestFixture]
public class WebServiceMetadataSetTests
{
DiscoveryClientProtocol discoveryProtocol;
WebServiceMetadataSet metadata;
void CreateDiscoveryProtocol()
{
discoveryProtocol = new DiscoveryClientProtocol();
}
WSDescription.ServiceDescription AddServiceDescriptionToDiscoveryProtocol()
{
var serviceDescription = new WSDescription.ServiceDescription();
discoveryProtocol.Documents.Add("http://ServiceDescription", serviceDescription);
return serviceDescription;
}
void CreateMetadata()
{
metadata = new WebServiceMetadataSet(discoveryProtocol);
}
XmlSchema AddXmlSchemaToDiscoveryProtocol()
{
var schema = new XmlSchema();
discoveryProtocol.Documents.Add("http://XmlSchema", schema);
return schema;
}
[Test]
public void Constructor_DiscoveryProtocolHasOneServiceDescription_ServiceDescriptionAddedToMetadata()
{
CreateDiscoveryProtocol();
WSDescription.ServiceDescription serviceDescription =
AddServiceDescriptionToDiscoveryProtocol();
CreateMetadata();
MetadataSection section = metadata.MetadataSections.First();
Assert.AreEqual(serviceDescription, section.Metadata);
}
[Test]
public void Constructor_DiscoveryProtocolHasOneServiceDescription_ServiceDescriptionMetadataHasServiceDescriptionDialect()
{
CreateDiscoveryProtocol();
WSDescription.ServiceDescription serviceDescription =
AddServiceDescriptionToDiscoveryProtocol();
CreateMetadata();
MetadataSection section = metadata.MetadataSections.First();
Assert.AreEqual(MetadataSection.ServiceDescriptionDialect, section.Dialect);
}
[Test]
public void Constructor_DiscoveryProtocolHasOneXmlSchema_XmlSchemaAddedToMetadata()
{
CreateDiscoveryProtocol();
XmlSchema schema = AddXmlSchemaToDiscoveryProtocol();
CreateMetadata();
MetadataSection section = metadata.MetadataSections.First();
Assert.AreEqual(schema, section.Metadata);
}
[Test]
public void Constructor_DiscoveryProtocolHasOneXmlSchema_XmlSchemaAddedToMetadataHasXmlSchemaDialect()
{
CreateDiscoveryProtocol();
XmlSchema schema = AddXmlSchemaToDiscoveryProtocol();
CreateMetadata();
MetadataSection section = metadata.MetadataSections.First();
Assert.AreEqual(MetadataSection.XmlSchemaDialect, section.Dialect);
}
}
}
Loading…
Cancel
Save