From f06449a0fdbea147f44c556ee2814f89598860be Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 22 Dec 2011 16:54:23 +0000 Subject: [PATCH 01/11] Generate WCF proxy file from Add Service Reference dialog. --- .../Project/ICSharpCode.SharpDevelop.csproj | 16 +++ .../AddServiceReferenceViewModel.cs | 28 ++-- .../ServiceReference/ICodeDomProvider.cs | 15 ++ .../ServiceReference/IFileSystem.cs | 12 ++ .../IProjectWithServiceReferences.cs | 17 +++ .../IServiceReferenceCodeDomBuilder.cs | 15 ++ .../IServiceReferenceProxyGenerator.cs | 15 ++ .../ProjectWithServiceReferences.cs | 80 +++++++++++ .../ServiceReferenceCodeDomBuilder.cs | 25 ++++ .../ServiceReferenceCodeDomProvider.cs | 42 ++++++ .../ServiceReferenceFileSystem.cs | 18 +++ .../ServiceReferenceGenerator.cs | 66 +++++++++ .../ServiceReferenceProxyGenerator.cs | 42 ++++++ .../ServiceReference/WebServiceMetadataSet.cs | 50 +++++++ .../Commands/ReferenceFolderNodeCommands.cs | 16 +-- .../ICSharpCode.SharpDevelop.Tests.csproj | 7 + .../ProjectWithServiceReferencesTests.cs | 131 ++++++++++++++++++ .../ServiceReferenceGeneratorTests.cs | 88 ++++++++++++ .../ServiceReferenceProxyGeneratorTests.cs | 52 +++++++ .../WebServiceMetadataSetTests.cs | 97 +++++++++++++ 20 files changed, 811 insertions(+), 21 deletions(-) create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ICodeDomProvider.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IFileSystem.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomProvider.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileSystem.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/WebServiceMetadataSet.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/WebServiceMetadataSetTests.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index b01e8bbd10..9f6f5e3623 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -28,6 +28,7 @@ v4.0 + ICSharpCode.SharpDevelop Full @@ -60,6 +61,9 @@ + + 3.0 + @@ -265,6 +269,18 @@ Code + + + + + + + + + + + + ToolNotFoundDialog.cs diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs index 3abcca6c60..c8730795da 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs @@ -1,11 +1,6 @@ -/* - * Created by SharpDevelop. - * User: Peter Forstmeier - * Date: 12.10.2011 - * Time: 20:05 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ +// 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; using System.Collections.Generic; @@ -23,21 +18,18 @@ using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media.Imaging; - using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; using ICSharpCode.SharpDevelop.Widgets; using ICSharpCode.SharpDevelop.Widgets.Resources; using Microsoft.Win32; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { - /// - /// Description of AddServiceReferenceViewModel. - /// - public class AddServiceReferenceViewModel:ViewModelBase + public class AddServiceReferenceViewModel : ViewModelBase { 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."; @@ -61,6 +53,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ServiceDescriptionCollection serviceDescriptionCollection = new ServiceDescriptionCollection(); CredentialCache credentialCache = new CredentialCache(); WebServiceDiscoveryClientProtocol discoveryClientProtocol; + WebServiceMetadataSet serviceMetadata; delegate DiscoveryDocument DiscoverAnyAsync(string url); delegate void DiscoveredWebServicesHandler(DiscoveryClientProtocol protocol); @@ -248,6 +241,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { if (protocol != null) { serviceDescriptionCollection = ServiceReferenceHelper.GetServiceDescriptions(protocol); + serviceMetadata = new WebServiceMetadataSet(protocol); ServiceDescriptionMessage = String.Format("{0} service(s) found at address {1}", serviceDescriptionCollection.Count, @@ -402,6 +396,14 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } ServiceItems = items; } + + public void AddServiceReference() + { + var serviceGenerator = new ServiceReferenceGenerator(project); + serviceGenerator.Namespace = defaultNameSpace; + serviceGenerator.AddServiceReference(serviceMetadata); + new RefreshProjectBrowser().Run(); + } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ICodeDomProvider.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ICodeDomProvider.cs new file mode 100644 index 0000000000..4400ed3f46 --- /dev/null +++ b/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); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IFileSystem.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IFileSystem.cs new file mode 100644 index 0000000000..1614e97327 --- /dev/null +++ b/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); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs new file mode 100644 index 0000000000..4b3831a6a5 --- /dev/null +++ b/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(); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs new file mode 100644 index 0000000000..e62d7e24de --- /dev/null +++ b/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); + + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs new file mode 100644 index 0000000000..9c3d2c31d0 --- /dev/null +++ b/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); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs new file mode 100644 index 0000000000..8e62a6aaa3 --- /dev/null +++ b/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(); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs new file mode 100644 index 0000000000..db3b3f727d --- /dev/null +++ b/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; + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomProvider.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomProvider.cs new file mode 100644 index 0000000000..953cff83b6 --- /dev/null +++ b/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); + } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileSystem.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileSystem.cs new file mode 100644 index 0000000000..1455e129c1 --- /dev/null +++ b/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); + } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs new file mode 100644 index 0000000000..0f0fb6aac8 --- /dev/null +++ b/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); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs new file mode 100644 index 0000000000..9b07bdf0bd --- /dev/null +++ b/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); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/WebServiceMetadataSet.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/WebServiceMetadataSet.cs new file mode 100644 index 0000000000..8ecedfc9a1 --- /dev/null +++ b/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); + } + } + } +} \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs index a8ccf83426..ea770cddbe 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs +++ b/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() { - AbstractProjectBrowserTreeNode node = Owner as AbstractProjectBrowserTreeNode; + var node = Owner as AbstractProjectBrowserTreeNode; IProject project = (node != null) ? node.Project : ProjectService.CurrentProject; if (project == null) { return; } var vm = new AddServiceReferenceViewModel(project); - AddServiceReferenceDialog o = new AddServiceReferenceDialog(); - o.DataContext = vm; - o.Owner = WorkbenchSingleton.MainWindow; - var b = o.ShowDialog(); + var dialog = new AddServiceReferenceDialog(); + dialog.DataContext = vm; + dialog.Owner = WorkbenchSingleton.MainWindow; + if (dialog.ShowDialog() ?? true) { + vm.AddServiceReference(); + } } } diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 5fa06efc2b..1f7bb1f89d 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -47,6 +47,9 @@ + + 3.0 + @@ -95,9 +98,13 @@ + + + + diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs new file mode 100644 index 0000000000..ad7a2496d7 --- /dev/null +++ b/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 projectItemsAddedToProject; + MSBuildBasedProject msbuildProject; + + void CreateProject() + { + projectItemsAddedToProject = new List(); + fakeProject = MockRepository.GenerateStub(); + 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); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs new file mode 100644 index 0000000000..b4b44cc173 --- /dev/null +++ b/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(); + fakeProxyGenerator = MockRepository.GenerateStub(); + fakeFileSystem = MockRepository.GenerateStub(); + 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()); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs new file mode 100644 index 0000000000..de26d1ae1d --- /dev/null +++ b/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(); + fakeProject = MockRepository.GenerateStub(); + fakeCodeDomProvider = MockRepository.GenerateStub(); + 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)); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/WebServiceMetadataSetTests.cs b/src/Main/Base/Test/ServiceReferences/WebServiceMetadataSetTests.cs new file mode 100644 index 0000000000..ab8695de2e --- /dev/null +++ b/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); + } + + } +} From 6a2c375c8e2849a30f8038310f38e89dfefa5841 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 22 Dec 2011 17:38:38 +0000 Subject: [PATCH 02/11] Reformat code and fix typos. --- .../AddServiceReferenceDialog.xaml | 2 +- .../AddServiceReferenceDialog.xaml.cs | 29 +-- .../AddServiceReferenceViewModel.cs | 171 ++++++++---------- .../AdvancedServiceDialog.xaml | 4 +- .../AdvancedServiceDialog.xaml.cs | 14 +- .../AdvancedServiceViewModel.cs | 169 ++++++++--------- .../ReferenceDialog/WebServicesView.cs | 11 +- 7 files changed, 165 insertions(+), 235 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml index 48a15d911f..a63233bf08 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml @@ -129,7 +129,7 @@ - + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml.cs index db89ad8e2e..d41c560b5a 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceDialog.xaml.cs @@ -1,28 +1,12 @@ -/* - * Created by SharpDevelop. - * User: Peter Forstmeier - * Date: 12.10.2011 - * Time: 19:24 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ +// 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.Text; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; - -using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { - /// - /// Interaction logic for AddServiceReferenceDialog.xaml - /// public partial class AddServiceReferenceDialog : Window { public AddServiceReferenceDialog() @@ -30,7 +14,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference InitializeComponent(); } - void okButtonClick(object sender, RoutedEventArgs e) { this.DialogResult = true; @@ -43,17 +26,15 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference Close(); } - void Cbo_LostFocus(object sender, RoutedEventArgs e) { - var comboBox = (ComboBox) sender; - if(comboBox.SelectedItem != null) + var comboBox = (ComboBox)sender; + if (comboBox.SelectedItem != null) return; var newItem = comboBox.Text; comboBox.SelectedItem = newItem; } - void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { if (e.NewValue != null) { diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs index c8730795da..a9d9e1cc1d 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs @@ -40,11 +40,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference string serviceDescriptionMessage; string namespacePrefix = String.Empty; - private ObservableCollection twoValues; + ObservableCollection twoValues; - private List mruServices = new List(); - private string selectedService; - private IProject project; + List mruServices = new List(); + string selectedService; + IProject project; List items = new List (); ServiceItem myItem; @@ -57,74 +57,70 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference delegate DiscoveryDocument DiscoverAnyAsync(string url); delegate void DiscoveredWebServicesHandler(DiscoveryClientProtocol protocol); - delegate void AuthenticationHandler(Uri uri, string authenticationType); - + delegate void AuthenticationHandler(Uri uri, string authenticationType); public AddServiceReferenceViewModel(IProject project) { this.project = project; - discoverButtonContend = "Disvover"; + discoverButtonContent = "Discover"; HeadLine = header1 + header2; MruServices = ServiceReferenceHelper.AddMruList(); SelectedService = MruServices[0]; - GoCommand = new RelayCommand(ExecuteGo,CanExecuteGo); - DiscoverCommand = new RelayCommand(ExecuteDiscover,CanExecuteDiscover); - AdvancedDialogCommand = new RelayCommand(ExecuteAdvancedDialogCommand,CanExecuteAdvancedDialogCommand); + GoCommand = new RelayCommand(ExecuteGo, CanExecuteGo); + DiscoverCommand = new RelayCommand(ExecuteDiscover, CanExecuteDiscover); + AdvancedDialogCommand = new RelayCommand(ExecuteAdvancedDialogCommand, CanExecuteAdvancedDialogCommand); TwoValues = new ObservableCollection(); } - #region Go Command - public System.Windows.Input.ICommand GoCommand {get; private set;} + public System.Windows.Input.ICommand GoCommand { get; private set; } - private void ExecuteGo () + void ExecuteGo() { if (String.IsNullOrEmpty(SelectedService)) { - MessageBox.Show (noUrl); + MessageBox.Show(noUrl); } ServiceDescriptionMessage = waitMessage; Uri uri = new Uri(SelectedService); StartDiscovery(uri, new DiscoveryNetworkCredential(CredentialCache.DefaultNetworkCredentials, DiscoveryNetworkCredential.DefaultAuthenticationType)); } - - private bool CanExecuteGo() + bool CanExecuteGo() { return true; } #endregion - #region Discover Command - public System.Windows.Input.ICommand DiscoverCommand {get;private set;} + public System.Windows.Input.ICommand DiscoverCommand { get; private set; } - private bool CanExecuteDiscover () + bool CanExecuteDiscover() { return true; } - private void ExecuteDiscover () + void ExecuteDiscover() { - MessageBox.Show (" is not implemented at the Moment"); + MessageBox.Show(" is not implemented at the Moment"); } #endregion #region AdvancedDialogCommand - public System.Windows.Input.ICommand AdvancedDialogCommand {get;private set;} + public System.Windows.Input.ICommand AdvancedDialogCommand { get; private set; } - private bool CanExecuteAdvancedDialogCommand () + bool CanExecuteAdvancedDialogCommand() { return true; } - private void ExecuteAdvancedDialogCommand () + void ExecuteAdvancedDialogCommand() { var vm = new AdvancedServiceViewModel(); var view = new AdvancedServiceDialog(); @@ -134,7 +130,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference #endregion - #region discover service Code from Matt void StartDiscovery(Uri uri, DiscoveryNetworkCredential credential) @@ -155,7 +150,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference /// completed. /// /// - void DiscoveryCompleted(IAsyncResult result) { AsyncDiscoveryState state = (AsyncDiscoveryState)result.AsyncState; @@ -189,7 +183,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - /// /// Stops any outstanding asynchronous discovery requests. /// @@ -211,7 +204,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - void AuthenticateUser(Uri uri, string authenticationType) { DiscoveryNetworkCredential credential = (DiscoveryNetworkCredential)credentialCache.GetCredential(uri, authenticationType); @@ -226,7 +218,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - void AddCredential(Uri uri, DiscoveryNetworkCredential credential) { NetworkCredential matchedCredential = credentialCache.GetCredential(uri, credential.AuthenticationType); @@ -236,7 +227,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference credentialCache.Add(uri, credential.AuthenticationType, credential); } - void DiscoveredWebServices(DiscoveryClientProtocol protocol) { if (protocol != null) { @@ -246,9 +236,9 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ServiceDescriptionMessage = String.Format("{0} service(s) found at address {1}", serviceDescriptionCollection.Count, discoveryUri); - DefaultNameSpace = GetDefaultNamespace(); - FillItems (serviceDescriptionCollection); - var referenceName = ServiceReferenceHelper.GetReferenceName(discoveryUri); + DefaultNameSpace = GetDefaultNamespace(); + FillItems(serviceDescriptionCollection); + string referenceName = ServiceReferenceHelper.GetReferenceName(discoveryUri); } } @@ -269,84 +259,85 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public string Title { - get {return title;} - set {title = value; - base.RaisePropertyChanged(() =>Title); + get { return title; } + set { + title = value; + base.RaisePropertyChanged(() => Title); } } - - public string HeadLine {get; set;} + public string HeadLine { get; set; } - private string discoverButtonContend; + string discoverButtonContent; - public string DiscoverButtonContend { - get { return discoverButtonContend; } - set { discoverButtonContend = value; - base.RaisePropertyChanged(() =>DiscoverButtonContend);} + public string DiscoverButtonContent { + get { return discoverButtonContent; } + set { + discoverButtonContent = value; + base.RaisePropertyChanged(() => DiscoverButtonContent); + } } - public List MruServices { - get { - return mruServices; } - set { mruServices = value; - base.RaisePropertyChanged(() =>MruServices); + get { return mruServices; } + set { + mruServices = value; + base.RaisePropertyChanged(() => MruServices); } } - public string SelectedService { get { return selectedService; } - set { selectedService = value; - base.RaisePropertyChanged(() =>SelectedService);} + set { + selectedService = value; + base.RaisePropertyChanged(() => SelectedService); + } } - public List ServiceItems { - get {return items; } + get { return items; } set { items = value; - base.RaisePropertyChanged(() =>ServiceItems); + base.RaisePropertyChanged(() => ServiceItems); } } - public ServiceItem ServiceItem { get { return myItem; } - set { myItem = value; + set { + myItem = value; UpdateListView(); - base.RaisePropertyChanged(() =>ServiceItem); + base.RaisePropertyChanged(() => ServiceItem); } } - public string ServiceDescriptionMessage { get { return serviceDescriptionMessage; } - set { serviceDescriptionMessage = value; - base.RaisePropertyChanged(() =>ServiceDescriptionMessage); + set { + serviceDescriptionMessage = value; + base.RaisePropertyChanged(() => ServiceDescriptionMessage); } } - public string DefaultNameSpace { get { return defaultNameSpace; } - set { defaultNameSpace = value; - base.RaisePropertyChanged(() =>DefaultNameSpace);} + set { + defaultNameSpace = value; + base.RaisePropertyChanged(() => DefaultNameSpace); + } } - public ObservableCollection TwoValues { get { return twoValues; } set { twoValues = value; - base.RaisePropertyChanged(() =>TwoValues); + base.RaisePropertyChanged(() => TwoValues); } } //http://mikehadlow.blogspot.com/2006/06/simple-wsdl-object.html - void UpdateListView () + void UpdateListView() { ServiceDescription desc = null; TwoValues.Clear(); @@ -355,41 +346,35 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference var tv = new ImageAndDescription(PresentationResourceService.GetBitmapSource("Icons.16x16.Interface"), desc.RetrievalUrl); TwoValues.Add(tv); - } - else if(ServiceItem.Tag is PortType) - { + } else if(ServiceItem.Tag is PortType) { PortType portType = (PortType)ServiceItem.Tag; - foreach (Operation op in portType.Operations) - { + foreach (Operation op in portType.Operations) { TwoValues.Add(new ImageAndDescription(PresentationResourceService.GetBitmapSource("Icons.16x16.Method"), op.Name)); } } } - - void FillItems (ServiceDescriptionCollection descriptions) + void FillItems(ServiceDescriptionCollection descriptions) { - foreach (ServiceDescription element in descriptions) - { - Add (element); + foreach(ServiceDescription element in descriptions) { + Add(element); } } - void Add(ServiceDescription description) { List items = new List(); var name = ServiceReferenceHelper.GetServiceName(description); - var rootNode = new ServiceItem(null,name); + var rootNode = new ServiceItem(null, name); rootNode.Tag = description; foreach(Service service in description.Services) { - var serviceNode = new ServiceItem(null,service.Name); + var serviceNode = new ServiceItem(null, service.Name); serviceNode.Tag = service; items.Add(serviceNode); foreach (PortType portType in description.PortTypes) { - var portNode = new ServiceItem(PresentationResourceService.GetBitmapSource("Icons.16x16.Interface"),portType.Name); + var portNode = new ServiceItem(PresentationResourceService.GetBitmapSource("Icons.16x16.Interface"), portType.Name); portNode.Tag = portType; serviceNode.SubItems.Add(portNode); } @@ -406,43 +391,39 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - public class ImageAndDescription { - public ImageAndDescription(BitmapSource bitmapSource,string description) + public ImageAndDescription(BitmapSource bitmapSource, string description) { Image = bitmapSource; Description = description; } - public BitmapSource Image {get;set;} - public string Description {get;set;} + public BitmapSource Image { get; set; } + public string Description { get; set; } } - - - public class ServiceItem:ImageAndDescription + public class ServiceItem : ImageAndDescription { - public ServiceItem (BitmapSource bitmapSource,string description):base(bitmapSource,description) + public ServiceItem(BitmapSource bitmapSource, string description) : base(bitmapSource, description) { SubItems = new List(); } - public object Tag {get;set;} - public List SubItems {get;set;} + public object Tag { get; set; } + public List SubItems { get; set; } } - public class CheckableImageAndDescription :ImageAndDescription + public class CheckableImageAndDescription : ImageAndDescription { - public CheckableImageAndDescription(BitmapSource bitmapSource,string description):base(bitmapSource,description) + public CheckableImageAndDescription(BitmapSource bitmapSource, string description) : base(bitmapSource, description) { - } - private bool itemChecked; + bool itemChecked; public bool ItemChecked { get { return itemChecked; } - set { itemChecked = value;} + set { itemChecked = value; } // base.RaisePropertyChanged(() =>IsChecked);} } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceDialog.xaml b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceDialog.xaml index 40370ec3e1..dc8189f110 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceDialog.xaml +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceDialog.xaml @@ -43,7 +43,7 @@ Text="{Binding AccessLevel}"> + gui:EnumBinding.EnumType="{x:Type local:Modifiers}" SelectedValue="{Binding SelectedModifier}"> + Content="Always generate message contracts"> - /// Interaction logic for AdvancedServiceDialog.xaml - /// public partial class AdvancedServiceDialog : Window { public AdvancedServiceDialog() diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs index 7ac121602d..7230ec09da 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs @@ -1,25 +1,17 @@ -/* - * Created by SharpDevelop. - * User: Peter Forstmeier - * Date: 02.11.2011 - * Time: 19:50 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ +// 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.ObjectModel; using System.ComponentModel; +using System.Windows.Media.Imaging; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Widgets; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { - /// - /// Description of AdvancedServiceViewModel. - /// - /// - public enum Modifyers + public enum Modifiers { //[Description("${res:Dialog.ProjectOptions.RunPostBuildEvent.Always}")] Public, @@ -56,147 +48,134 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference HybridDictionary, ListDictionary, OrderedDictionary - } - + } - internal class AdvancedServiceViewModel:ViewModelBase + internal class AdvancedServiceViewModel : ViewModelBase { - private string compatibilityText ="Add a web Reference instead of a Service Reference. "; - private string c_2 ="thios will generate code base on .NET Framework 2.0 Web services technology"; - private string accesslevel = "Access level for generated classes:"; + string compatibilityText = "Add a Web Reference instead of a Service Reference. "; + string c_2 = "This will generate code based on .NET Framework 2.0 Web Services technology."; + string accesslevel = "Access level for generated classes:"; + public AdvancedServiceViewModel() { Title ="Service Reference Settings"; UseReferencedAssemblies = true; - var image = PresentationResourceService.GetBitmapSource("Icons.16x16.Reference"); - AssembliesToReference = new ObservableCollection (); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"Microsoft.CSharp")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"mscorlib")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Core")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Data")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Data.DataSetExtensions")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Runtime.Serialization")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.ServiceModel")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Xml")); - AssembliesToReference.Add(new CheckableImageAndDescription(image,"System.Xml.Linq")); + BitmapSource image = PresentationResourceService.GetBitmapSource("Icons.16x16.Reference"); + AssembliesToReference = new ObservableCollection(); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "Microsoft.CSharp")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "mscorlib")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Core")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Data")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Data.DataSetExtensions")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Runtime.Serialization")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.ServiceModel")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Xml")); + AssembliesToReference.Add(new CheckableImageAndDescription(image, "System.Xml.Linq")); } - public string Title {get;set;} + public string Title { get; set; } public string AccessLevel { - get {return accesslevel;} + get { return accesslevel; } } - private Modifyers selectedModifyer; + Modifiers selectedModifier; - public Modifyers SelectedModifyer { - get { return selectedModifyer; } - set { selectedModifyer = value; - base.RaisePropertyChanged(() =>SelectedModifyer); } + public Modifiers SelectedModifier { + get { return selectedModifier; } + set { + selectedModifier = value; + base.RaisePropertyChanged(() => SelectedModifier); + } } bool generateAsyncOperations; public bool GenerateAsyncOperations { get { return generateAsyncOperations; } - set { generateAsyncOperations = value; - base.RaisePropertyChanged(() =>GenerateAsyncOperations);} + set { + generateAsyncOperations = value; + base.RaisePropertyChanged(() => GenerateAsyncOperations); + } } - bool generateMessageContract; public bool GenerateMessageContract { get { return generateMessageContract; } - set { generateMessageContract = value; - base.RaisePropertyChanged(() =>GenerateMessageContract);} + set { + generateMessageContract = value; + base.RaisePropertyChanged(() => GenerateMessageContract); + } } - - private CollectionTypes collectionType; + CollectionTypes collectionType; public CollectionTypes CollectionType { get { return collectionType; } - set { collectionType = value; - base.RaisePropertyChanged(() =>CollectionType);} + set { + collectionType = value; + base.RaisePropertyChanged(() => CollectionType); + } } - private DictionaryCollectionTypes dictionaryCollectionType; + DictionaryCollectionTypes dictionaryCollectionType; public DictionaryCollectionTypes DictionaryCollectionType { get { return dictionaryCollectionType; } - set { dictionaryCollectionType = value; - base.RaisePropertyChanged(() =>DictionaryCollectionType);} + set { + dictionaryCollectionType = value; + base.RaisePropertyChanged(() => DictionaryCollectionType); + } } - - private bool useReferencedAssemblies; + bool useReferencedAssemblies; public bool UseReferencedAssemblies { get { return useReferencedAssemblies; } - set { useReferencedAssemblies = value; - if (useReferencedAssemblies) { - ReuseTypes = true; - } - else { - ReuseTypes = false; - } - base.RaisePropertyChanged(() =>UseReferencedAssemblies);} + set { + useReferencedAssemblies = value; + ReuseTypes = useReferencedAssemblies; + base.RaisePropertyChanged(() => UseReferencedAssemblies); + } } - - private bool reuseTypes; + bool reuseTypes; public bool ReuseTypes { get { return reuseTypes; } - set { reuseTypes = value; - if (reuseTypes) { - - } - else - { - - } - base.RaisePropertyChanged(() =>ReuseTypes);} + set { + reuseTypes = value; + base.RaisePropertyChanged(() => ReuseTypes); + } } - - private bool reuseReferencedTypes; + bool reuseReferencedTypes; public bool ReuseReferencedTypes { get { return reuseReferencedTypes; } - set { reuseReferencedTypes = value; - if (reuseReferencedTypes) - { - ListViewEnable = true; - - } else - { - ListViewEnable = false; - } - - base.RaisePropertyChanged(() => ReuseReferencedTypes);} + set { + reuseReferencedTypes = value; + ListViewEnable = value; + base.RaisePropertyChanged(() => ReuseReferencedTypes); + } } - - private bool listViewEnable; + bool listViewEnable; public bool ListViewEnable { get { return listViewEnable; } - set { listViewEnable = value; - base.RaisePropertyChanged(() => ListViewEnable);} + set { + listViewEnable = value; + base.RaisePropertyChanged(() => ListViewEnable); + } } - - public ObservableCollection AssembliesToReference {get;private set;} - + public ObservableCollection AssembliesToReference { get; private set; } public string CompatibilityText { - get { - return compatibilityText + c_2; - } - } - + get { return compatibilityText + c_2; } + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebServicesView.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebServicesView.cs index 5b938de7d6..93fe88cc69 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebServicesView.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebServicesView.cs @@ -139,21 +139,19 @@ namespace ICSharpCode.SharpDevelop.Gui ListViewItem item; webServicesListView.Items.Clear(); - if(e.Node.Tag is ServiceDescription) { + if (e.Node.Tag is ServiceDescription) { ServiceDescription desc = (ServiceDescription)e.Node.Tag; item = new ListViewItem(); item.Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.AddWebReferenceDialog.RetrievalUriProperty}"); item.SubItems.Add(desc.RetrievalUrl); webServicesListView.Items.Add(item); - } - else if(e.Node.Tag is Service) { + } else if(e.Node.Tag is Service) { Service service = (Service)e.Node.Tag; item = new ListViewItem(); item.Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.AddWebReferenceDialog.DocumentationProperty}"); item.SubItems.Add(service.Documentation); webServicesListView.Items.Add(item); - } - else if(e.Node.Tag is Port) { + } else if(e.Node.Tag is Port) { Port port = (Port)e.Node.Tag; item = new ListViewItem(); @@ -170,8 +168,7 @@ namespace ICSharpCode.SharpDevelop.Gui item.Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.AddWebReferenceDialog.ServiceNameProperty}"); item.SubItems.Add(port.Service.Name); webServicesListView.Items.Add(item); - } - else if(e.Node.Tag is Operation) { + } else if(e.Node.Tag is Operation) { Operation operation = (Operation)e.Node.Tag; item = new ListViewItem(); From c44ab66b1c505aa065350a6136c68d333ddec5ab Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 22 Dec 2011 17:50:08 +0000 Subject: [PATCH 03/11] Make Add Service Reference menu item available when References and Service References selected in Projects browser. --- .../Project/ICSharpCode.SharpDevelop.addin | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index 379eac8f27..bbd1bd8c3a 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -305,21 +305,15 @@ + - - - - - - - - + @@ -384,6 +378,9 @@ + @@ -710,6 +707,9 @@ + - - From a0801f53f9b8f5337e4c4f270dfe6185741f74e4 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 23 Dec 2011 14:32:54 +0000 Subject: [PATCH 04/11] Add WCFMetadataStorage item to project when a WCF service reference is added. --- .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../ProjectWithServiceReferences.cs | 10 ++++++++++ .../Project/Src/Project/Items/ItemType.cs | 1 + .../Items/ServiceReferenceProjectItem.cs | 20 +++++++++++++++++++ .../Src/Project/MSBuildBasedProject.cs | 3 +++ .../MSBuildBasedProjectTests.cs | 14 ++++++++++++- .../ProjectWithServiceReferencesTests.cs | 18 +++++++++++++++++ 7 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/Main/Base/Project/Src/Project/Items/ServiceReferenceProjectItem.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 9f6f5e3623..94ef77584b 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -338,6 +338,7 @@ + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index 8e62a6aaa3..837cb31016 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -51,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { AddServiceReferenceFileToProject(fileName); AddServiceReferencesItemToProject(); + AddServiceReferenceItemToProject(fileName); } void AddServiceReferenceFileToProject(string fileName) @@ -72,6 +73,15 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference AddProjectItemToProject(projectItem); } + void AddServiceReferenceItemToProject(string fileName) + { + var projectItem = new ServiceReferenceProjectItem(project); + string directory = Path.GetDirectoryName(fileName); + string serviceName = Path.GetFileName(directory); + projectItem.Include = serviceName; + AddProjectItemToProject(projectItem); + } + public void Save() { project.Save(); diff --git a/src/Main/Base/Project/Src/Project/Items/ItemType.cs b/src/Main/Base/Project/Src/Project/Items/ItemType.cs index a9410418ed..9e8d1b3dad 100644 --- a/src/Main/Base/Project/Src/Project/Items/ItemType.cs +++ b/src/Main/Base/Project/Src/Project/Items/ItemType.cs @@ -52,6 +52,7 @@ namespace ICSharpCode.SharpDevelop.Project public static readonly ItemType Folder = new ItemType("Folder"); public static readonly ItemType WebReferences = new ItemType("WebReferences"); public static readonly ItemType ServiceReferences = new ItemType("WCFMetadata"); + public static readonly ItemType ServiceReference = new ItemType("WCFMetadataStorage"); /// /// Gets a collection of item types that are known not to be used for files. diff --git a/src/Main/Base/Project/Src/Project/Items/ServiceReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ServiceReferenceProjectItem.cs new file mode 100644 index 0000000000..62fbef0aff --- /dev/null +++ b/src/Main/Base/Project/Src/Project/Items/ServiceReferenceProjectItem.cs @@ -0,0 +1,20 @@ +// 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.Project +{ + public class ServiceReferenceProjectItem : ProjectItem + { + public ServiceReferenceProjectItem(IProject project) + : base(project, ItemType.ServiceReference) + { + } + + internal ServiceReferenceProjectItem(IProject project, IProjectItemBackendStore buildItem) + : base(project, buildItem) + { + } + } +} diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 83612ac927..74ab7c382a 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -181,6 +181,9 @@ namespace ICSharpCode.SharpDevelop.Project case "WCFMetadata": return new ServiceReferencesProjectItem(this, item); + case "WCFMetadataStorage": + return new ServiceReferenceProjectItem(this, item); + default: if (this.AvailableFileItemTypes.Contains(item.ItemType) || SafeFileExists(this.Directory, item.EvaluatedInclude)) diff --git a/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs index f1fabc9810..bca1d2b922 100644 --- a/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs +++ b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences } [Test] - public void Create_ItemTypeIsWCFMetadata_ReturnsServiceReferenceProjectItem() + public void CreateProjectItem_ItemTypeIsWCFMetadata_ReturnsServiceReferencesProjectItem() { CreateProject(); CreateProjectItemBackendStore(); @@ -36,5 +36,17 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.IsNotNull(projectItem); } + + [Test] + public void CreateProjectItem_ItemTypeIsWCFMetadataStorage_ReturnsServiceReferenceProjectItem() + { + CreateProject(); + CreateProjectItemBackendStore(); + backendStore.ItemType = new ItemType("WCFMetadataStorage"); + + var projectItem = project.CreateProjectItem(backendStore) as ServiceReferenceProjectItem; + + Assert.IsNotNull(projectItem); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index ad7a2496d7..7545affb6f 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -56,6 +56,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return msbuildProject.GetItemsOfType(ItemType.ServiceReferences).SingleOrDefault() as ServiceReferencesProjectItem; } + ServiceReferenceProjectItem GetFirstWCFMetadataStorageItemInMSBuildProject() + { + return msbuildProject.GetItemsOfType(ItemType.ServiceReference).SingleOrDefault() as ServiceReferenceProjectItem; + } + [Test] public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() { @@ -127,5 +132,18 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.AreEqual("Service References", item.Include); } + + [Test] + public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_WCFMetadataStorageItemAddedToProjectForServiceReferencesFolder() + { + CreateProjectWithMSBuildProject(); + + string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; + project.AddServiceReferenceProxyFile(proxyFileName); + + ProjectItem item = GetFirstWCFMetadataStorageItemInMSBuildProject(); + + Assert.AreEqual("Service1", item.Include); + } } } From 8a968a390ec2d1df0fa3e8132ad5661f0e0adc7b Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 23 Dec 2011 15:32:02 +0000 Subject: [PATCH 05/11] Move code to determine service reference folder into separate ServiceReferenceFileName class. --- .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../IProjectWithServiceReferences.cs | 4 +- .../ProjectWithServiceReferences.cs | 16 +++--- .../ServiceReferenceFileName.cs | 52 +++++++++++++++++++ .../ServiceReferenceGenerator.cs | 6 +-- .../ICSharpCode.SharpDevelop.Tests.csproj | 1 + .../ProjectWithServiceReferencesTests.cs | 17 +++--- .../ServiceReferenceFileNameTests.cs | 42 +++++++++++++++ .../ServiceReferenceGeneratorTests.cs | 33 +++++++++--- 9 files changed, 144 insertions(+), 28 deletions(-) create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileName.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceFileNameTests.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 94ef77584b..7b02d6607b 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -277,6 +277,7 @@ + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs index 4b3831a6a5..4f80de835e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs @@ -10,8 +10,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference string ServiceReferencesFolder { get; } ICodeDomProvider CodeDomProvider { get; } - string GetServiceReferenceFileName(string serviceReferenceName); - void AddServiceReferenceProxyFile(string fileName); + ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName); + void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName); void Save(); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index 837cb31016..88e89cf6d7 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -42,22 +42,22 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public ICodeDomProvider CodeDomProvider { get; private set; } - public string GetServiceReferenceFileName(string serviceReferenceName) + public ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName) { - return Path.Combine(ServiceReferencesFolder, serviceReferenceName, "Reference.cs"); + return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName); } - public void AddServiceReferenceProxyFile(string fileName) + public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName) { AddServiceReferenceFileToProject(fileName); AddServiceReferencesItemToProject(); AddServiceReferenceItemToProject(fileName); } - void AddServiceReferenceFileToProject(string fileName) + void AddServiceReferenceFileToProject(ServiceReferenceFileName fileName) { var projectItem = new FileProjectItem(project, ItemType.Compile); - projectItem.FileName = fileName; + projectItem.FileName = fileName.Path; AddProjectItemToProject(projectItem); } @@ -73,12 +73,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference AddProjectItemToProject(projectItem); } - void AddServiceReferenceItemToProject(string fileName) + void AddServiceReferenceItemToProject(ServiceReferenceFileName fileName) { var projectItem = new ServiceReferenceProjectItem(project); - string directory = Path.GetDirectoryName(fileName); - string serviceName = Path.GetFileName(directory); - projectItem.Include = serviceName; + projectItem.Include = fileName.ServiceName; AddProjectItemToProject(projectItem); } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileName.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileName.cs new file mode 100644 index 0000000000..fa55834bfa --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileName.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 IO = System.IO; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class ServiceReferenceFileName + { + string serviceReferencesFolder; + string serviceName; + string path; + + public ServiceReferenceFileName() + : this(String.Empty, String.Empty) + { + } + + public ServiceReferenceFileName( + string serviceReferencesFolder, + string serviceName) + { + this.serviceReferencesFolder = serviceReferencesFolder; + this.serviceName = serviceName; + } + + public string Path { + get { + if (path == null) { + GetPath(); + } + return path; + } + } + + void GetPath() + { + path = IO.Path.Combine(serviceReferencesFolder, serviceName, "Reference.cs"); + } + + public string ServiceName { + get { return serviceName; } + set { serviceName = value; } + } + + public string ServiceReferencesFolder { + get { return serviceReferencesFolder; } + set { serviceReferencesFolder = value; } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs index 0f0fb6aac8..9a134285cf 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs @@ -47,10 +47,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void GenerateServiceReferenceProxy(MetadataSet metadata) { - string fileName = project.GetServiceReferenceFileName(Namespace); - CreateFolderForFileIfFolderMissing(fileName); + ServiceReferenceFileName fileName = project.GetServiceReferenceFileName(Namespace); + CreateFolderForFileIfFolderMissing(fileName.Path); - proxyGenerator.GenerateProxy(metadata, fileName); + proxyGenerator.GenerateProxy(metadata, fileName.Path); project.AddServiceReferenceProxyFile(fileName); diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 1f7bb1f89d..6ff0ebca7b 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -99,6 +99,7 @@ + diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index 7545affb6f..20a11fbd81 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -46,9 +46,9 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences fakeProject.Stub(p => p.LanguageProperties).Return(languageProperties); } - ProjectItem GetFirstServiceReferenceFileInMSBuildProject(string fileName) + ProjectItem GetFirstServiceReferenceFileInMSBuildProject(ServiceReferenceFileName fileName) { - return msbuildProject.Items.SingleOrDefault(item => item.FileName == fileName); + return msbuildProject.Items.SingleOrDefault(item => item.FileName == fileName.Path); } ServiceReferencesProjectItem GetFirstWCFMetadataItemInMSBuildProject() @@ -91,10 +91,10 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateProject(); SetProjectDirectory(@"d:\projects\MyProject"); - string fileName = project.GetServiceReferenceFileName("Service1"); + ServiceReferenceFileName fileName = project.GetServiceReferenceFileName("Service1"); string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; - Assert.AreEqual(expectedFileName, fileName); + Assert.AreEqual(expectedFileName, fileName.Path); } [Test] @@ -102,7 +102,10 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateProjectWithMSBuildProject(); - string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; + var proxyFileName = new ServiceReferenceFileName() { + ServiceReferencesFolder = @"d:\projects\MyProject\Service References", + ServiceName = "Service1" + }; project.AddServiceReferenceProxyFile(proxyFileName); ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); @@ -125,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateProjectWithMSBuildProject(); - string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; + var proxyFileName = new ServiceReferenceFileName() { ServiceName = "Service1" }; project.AddServiceReferenceProxyFile(proxyFileName); ServiceReferencesProjectItem item = GetFirstWCFMetadataItemInMSBuildProject(); @@ -138,7 +141,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateProjectWithMSBuildProject(); - string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; + var proxyFileName = new ServiceReferenceFileName() { ServiceName = "Service1" }; project.AddServiceReferenceProxyFile(proxyFileName); ProjectItem item = GetFirstWCFMetadataStorageItemInMSBuildProject(); diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceFileNameTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceFileNameTests.cs new file mode 100644 index 0000000000..693fd6479b --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceFileNameTests.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 ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferenceFileNameTests + { + ServiceReferenceFileName fileName; + + void CreateServiceReferenceFileName(string serviceReferencesFolder, string serviceName) + { + fileName = new ServiceReferenceFileName(serviceReferencesFolder, serviceName); + } + + [Test] + public void Path_NewInstanceCreated_ReturnsFullPathToFile() + { + CreateServiceReferenceFileName(@"d:\projects\MyProject\Service References", "MyService"); + + string path = fileName.Path; + + string expectedPath = @"d:\projects\MyProject\Service References\MyService\Reference.cs"; + + Assert.AreEqual(expectedPath, path); + } + + [Test] + public void ServiceName_NewInstanceCreated_ReturnsFullPathToFile() + { + CreateServiceReferenceFileName(@"d:\projects\MyProject\Service References", "MyService"); + + string serviceName = fileName.ServiceName; + + Assert.AreEqual("MyService", serviceName); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index b4b44cc173..a6e34da6cc 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -29,20 +29,38 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem); } - void SetServiceReferenceFileName(string serviceReferenceName, string fileName) + void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName) { fakeProject.Stub(p => p.GetServiceReferenceFileName(serviceReferenceName)).Return(fileName); } + ServiceReferenceFileName CreateProxyFileName(string serviceReferencesFolder, string serviceName) + { + return new ServiceReferenceFileName(serviceReferencesFolder, serviceName); + } + + ServiceReferenceFileName AddProxyFileNameForServiceName(string serviceName) + { + return AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", serviceName); + } + + ServiceReferenceFileName AddProxyFileNameForServiceName(string serviceReferencesFolder, string serviceName) + { + ServiceReferenceFileName proxyFileName = CreateProxyFileName(serviceReferencesFolder, serviceName); + SetServiceReferenceFileName(serviceName, proxyFileName); + return proxyFileName; + } + [Test] public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator() { CreateGenerator(); - string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; - SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName); + ServiceReferenceFileName proxyFileName = + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); + string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxy(metadata, expectedProxyFileName)); } @@ -51,8 +69,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences public void AddServiceReference_ServiceReferenceDoesNotExist_ServiceReferenceFolderCreated() { CreateGenerator(); - string proxyFileName = @"d:\projects\MyProject\Service References\MyService1\Reference.cs"; - SetServiceReferenceFileName("MyService1", proxyFileName); + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); generator.Namespace = "MyService1"; generator.AddServiceReference(metadata); @@ -66,8 +83,8 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences public void AddServiceReference_GeneratesServiceReference_ServiceReferenceProxyFileAddedToProject() { CreateGenerator(); - string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; - SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName); + ServiceReferenceFileName expectedProxyFileName = + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); @@ -79,6 +96,8 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences public void AddServiceReference_GeneratesServiceReference_ProjectIsSaved() { CreateGenerator(); + AddProxyFileNameForServiceName("MyServiceRef"); + generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); From 00adbade6b7d51a32b10ed3a14b92e4153346687 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 24 Dec 2011 16:09:46 +0000 Subject: [PATCH 06/11] Generate service reference map file (Reference.svcmap) when adding service references. --- .../Project/ICSharpCode.SharpDevelop.csproj | 10 +++ .../ServiceReference/ClientOptions.cs | 29 ++++++++ .../IProjectWithServiceReferences.cs | 2 + .../IServiceReferenceFileGenerator.cs | 11 +++ .../IServiceReferenceMapGenerator.cs | 12 ++++ .../IServiceReferenceProxyGenerator.cs | 2 +- .../ServiceReference/MetadataFile.cs | 14 ++++ .../ServiceReference/MetadataSource.cs | 30 ++++++++ .../ProjectWithServiceReferences.cs | 12 ++++ .../ServiceReferenceFileGenerator.cs | 44 ++++++++++++ .../ServiceReferenceGenerator.cs | 21 +++--- .../ServiceReferenceMapFile.cs | 71 +++++++++++++++++++ .../ServiceReferenceMapFileName.cs | 22 ++++++ .../ServiceReferenceMapFileProjectItem.cs | 26 +++++++ .../ServiceReferenceMapGenerator.cs | 24 +++++++ .../ServiceReferenceProxyGenerator.cs | 2 +- .../ICSharpCode.SharpDevelop.Tests.csproj | 2 + .../ProjectWithServiceReferencesTests.cs | 40 +++++++++++ .../ServiceReferenceGeneratorTests.cs | 64 +++++++++++++++-- .../ServiceReferenceMapFileGeneratorTests.cs | 69 ++++++++++++++++++ .../ServiceReferenceMapFileTests.cs | 57 +++++++++++++++ .../ServiceReferenceProxyGeneratorTests.cs | 4 +- 22 files changed, 552 insertions(+), 16 deletions(-) create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs create mode 100644 src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 7b02d6607b..8df38e7d67 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -269,17 +269,27 @@ Code + + + + + + + + + + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs new file mode 100644 index 0000000000..dd51f825d8 --- /dev/null +++ b/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; } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs index 4f80de835e..58f0bbc739 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs +++ b/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; } ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName); + ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName); void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName); + void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName); void Save(); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs new file mode 100644 index 0000000000..95f876fdbf --- /dev/null +++ b/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 + { + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs new file mode 100644 index 0000000000..144b224674 --- /dev/null +++ b/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); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs index 9c3d2c31d0..9b117b442e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs +++ b/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; } - void GenerateProxy(MetadataSet metadata, string proxyFileName); + void GenerateProxyFile(MetadataSet metadata, string proxyFileName); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs new file mode 100644 index 0000000000..82205976d4 --- /dev/null +++ b/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() + { + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs new file mode 100644 index 0000000000..918f8ec9c3 --- /dev/null +++ b/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; } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index 88e89cf6d7..24519e9a72 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/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); } + public ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName) + { + return new ServiceReferenceMapFileName(ServiceReferencesFolder, serviceReferenceName); + } + public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName) { AddServiceReferenceFileToProject(fileName); @@ -58,6 +63,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { var projectItem = new FileProjectItem(project, ItemType.Compile); projectItem.FileName = fileName.Path; + projectItem.DependentUpon = "Reference.svcmap"; AddProjectItemToProject(projectItem); } @@ -84,5 +90,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { project.Save(); } + + public void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName) + { + var projectItem = new ServiceReferenceMapFileProjectItem(project, fileName.Path); + AddProjectItemToProject(projectItem); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs new file mode 100644 index 0000000000..93654abfdf --- /dev/null +++ b/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); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs index 9a134285cf..7180fd116c 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs +++ b/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 { IProjectWithServiceReferences project; - IServiceReferenceProxyGenerator proxyGenerator; + IServiceReferenceFileGenerator fileGenerator; IFileSystem fileSystem; public ServiceReferenceGenerator(IProject project) @@ -23,18 +23,18 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public ServiceReferenceGenerator(IProjectWithServiceReferences project) : this( project, - new ServiceReferenceProxyGenerator(project.CodeDomProvider), + new ServiceReferenceFileGenerator(project.CodeDomProvider), new ServiceReferenceFileSystem()) { } public ServiceReferenceGenerator( IProjectWithServiceReferences project, - IServiceReferenceProxyGenerator proxyGenerator, + IServiceReferenceFileGenerator fileGenerator, IFileSystem fileSystem) { this.project = project; - this.proxyGenerator = proxyGenerator; + this.fileGenerator = fileGenerator; this.fileSystem = fileSystem; } @@ -47,12 +47,17 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void GenerateServiceReferenceProxy(MetadataSet metadata) { - ServiceReferenceFileName fileName = project.GetServiceReferenceFileName(Namespace); - CreateFolderForFileIfFolderMissing(fileName.Path); + ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(Namespace); + 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(); } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs new file mode 100644 index 0000000000..7877589728 --- /dev/null +++ b/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 metadataSources = new List(); + List metadata = new List(); + + 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 MetadataSources { + get { return metadataSources; } + } + + public List Metadata { + get { return metadata; } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs new file mode 100644 index 0000000000..700fba010d --- /dev/null +++ b/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; } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs new file mode 100644 index 0000000000..86e5458e6d --- /dev/null +++ b/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"); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs new file mode 100644 index 0000000000..5be219b9ab --- /dev/null +++ b/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); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs index 9b07bdf0bd..bc1e405b51 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs +++ b/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 void GenerateProxy(MetadataSet metadata, string proxyFileName) + public void GenerateProxyFile(MetadataSet metadata, string proxyFileName) { CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata); GenerateProxy(compileUnit, proxyFileName); diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 6ff0ebca7b..c8b842d0eb 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -101,6 +101,8 @@ + + diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index 20a11fbd81..c2f5aa721f 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -4,6 +4,7 @@ using System; using System.CodeDom.Compiler; using System.Collections.Generic; +using System.IO; using System.Linq; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; @@ -61,6 +62,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return msbuildProject.GetItemsOfType(ItemType.ServiceReference).SingleOrDefault() as ServiceReferenceProjectItem; } + FileProjectItem GetFileFromMSBuildProject(string fileName) + { + return msbuildProject.Items.Single(item => item.FileName == fileName) as FileProjectItem; + } + [Test] public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() { @@ -110,7 +116,10 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); + string dependentUpon = item.GetMetadata("DependentUpon"); + Assert.AreEqual(ItemType.Compile, item.ItemType); + Assert.AreEqual("Reference.svcmap", dependentUpon); } [Test] @@ -148,5 +157,36 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences 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); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index a6e34da6cc..7b0fe50ab0 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -15,7 +15,9 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { IProjectWithServiceReferences fakeProject; IServiceReferenceProxyGenerator fakeProxyGenerator; + IServiceReferenceMapGenerator fakeReferenceMapGenerator; ServiceReferenceGenerator generator; + ServiceReferenceFileGenerator fileGenerator; IFileSystem fakeFileSystem; MetadataSet metadata; @@ -25,8 +27,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences fakeProject = MockRepository.GenerateStub(); fakeProxyGenerator = MockRepository.GenerateStub(); + fakeReferenceMapGenerator = MockRepository.GenerateStub(); + fileGenerator = new ServiceReferenceFileGenerator(fakeProxyGenerator, fakeReferenceMapGenerator); fakeFileSystem = MockRepository.GenerateStub(); - generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem); + + generator = new ServiceReferenceGenerator(fakeProject, fileGenerator, fakeFileSystem); } void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName) @@ -51,18 +56,35 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences 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] public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator() { CreateGenerator(); - ServiceReferenceFileName proxyFileName = - AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); 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] @@ -70,6 +92,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); + AddMapFileNameForServiceName("MyService1"); generator.Namespace = "MyService1"; generator.AddServiceReference(metadata); @@ -85,6 +108,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); ServiceReferenceFileName expectedProxyFileName = AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); @@ -97,11 +121,43 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateGenerator(); AddProxyFileNameForServiceName("MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); 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)); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs new file mode 100644 index 0000000000..89fed0bd40 --- /dev/null +++ b/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 = +@" + + + false + true + false + false + false + true + Auto + true + true + + + + + +"; + + Assert.AreEqual(expectedOutput, output); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs new file mode 100644 index 0000000000..48b915f67a --- /dev/null +++ b/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(); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs index de26d1ae1d..c44305f56e 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs @@ -37,14 +37,14 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences } [Test] - public void GenerateProxy_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder() + public void GenerateProxyFile_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); + proxyGenerator.GenerateProxyFile(metadata, expectedProxyFileName); fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName)); } From 53d7b69a09c570c0df94f611ac8a31d71545e76c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 24 Dec 2011 16:26:18 +0000 Subject: [PATCH 07/11] Fix service reference node appearing in wrong place in Visual Studio's Solution Explorer. --- .../ServiceReference/ProjectWithServiceReferences.cs | 2 +- .../Test/ServiceReferences/ProjectWithServiceReferencesTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index 24519e9a72..eb5ffe4abe 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -82,7 +82,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void AddServiceReferenceItemToProject(ServiceReferenceFileName fileName) { var projectItem = new ServiceReferenceProjectItem(project); - projectItem.Include = fileName.ServiceName; + projectItem.Include = @"Service References\" + fileName.ServiceName; AddProjectItemToProject(projectItem); } diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index c2f5aa721f..4719d3d2e2 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -155,7 +155,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences ProjectItem item = GetFirstWCFMetadataStorageItemInMSBuildProject(); - Assert.AreEqual("Service1", item.Include); + Assert.AreEqual(@"Service References\Service1", item.Include); } [Test] From b26a6fb63541b99fc5ccb3826e20b0b552d38e7e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 24 Dec 2011 16:51:26 +0000 Subject: [PATCH 08/11] Move Manage Packages menu item after Add Service Reference menu item when right clicking on a project. --- .../Misc/PackageManagement/Project/PackageManagement.addin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin index 3d2c759218..68e0029246 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin @@ -22,7 +22,7 @@ id="ManagePackages" label="Manage Packages..." insertafter="AddWebReference" - insertbefore="AddSeparator" + insertbefore="ShowServiceInBrowser" class="ICSharpCode.PackageManagement.ManagePackagesCommand"/> From f9c3d8002a4ca8e64213bac24e885bdacc5ad2b6 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 26 Dec 2011 23:02:26 +0000 Subject: [PATCH 09/11] Fix xml form resources not being found in assembly. --- src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 8df38e7d67..462e6715b0 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -28,7 +28,6 @@ v4.0 - ICSharpCode.SharpDevelop Full From 69c7dde1e3b98224684486f5c868e5639d3455f3 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 27 Dec 2011 15:14:08 +0000 Subject: [PATCH 10/11] Fix SD-1874 - Attribute code completion not working for assemblies that reference assemblies using a different .NET framework version to those referenced by the project. --- .../ParserService/ParseProjectContent.cs | 4 +-- .../ReflectionProjectContent.cs | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index 0408e9b9ee..6f37e81609 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -104,7 +104,7 @@ namespace ICSharpCode.SharpDevelop } foreach (IProjectContent referencedContent in referencedContents) { if (referencedContent is ReflectionProjectContent) { - ((ReflectionProjectContent)referencedContent).InitializeReferences(); + ((ReflectionProjectContent)referencedContent).InitializeReferences(referencedContents); } } } @@ -262,7 +262,7 @@ namespace ICSharpCode.SharpDevelop foreach (IProjectContent referencedContent in referencedContents) { if (referencedContent is ReflectionProjectContent) { - ((ReflectionProjectContent)referencedContent).InitializeReferences(); + ((ReflectionProjectContent)referencedContent).InitializeReferences(referencedContents); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs index 8de31d3e1c..4896723b54 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; - using ICSharpCode.SharpDevelop.Dom.ReflectionLayer; namespace ICSharpCode.SharpDevelop.Dom @@ -162,12 +162,17 @@ namespace ICSharpCode.SharpDevelop.Dom List missingNames; public void InitializeReferences() + { + InitializeReferences(new IProjectContent[0]); + } + + public void InitializeReferences(IProjectContent[] existingContents) { bool changed = false; if (initialized) { if (missingNames != null) { for (int i = 0; i < missingNames.Count; i++) { - IProjectContent content = registry.GetExistingProjectContent(missingNames[i]); + IProjectContent content = GetExistingProjectContent(existingContents, missingNames[i]); if (content != null) { changed = true; lock (ReferencedContents) { @@ -200,6 +205,22 @@ namespace ICSharpCode.SharpDevelop.Dom OnReferencedContentsChanged(EventArgs.Empty); } + IProjectContent GetExistingProjectContent(IProjectContent[] existingProjectContents, DomAssemblyName fullAssemblyName) + { + IProjectContent content = registry.GetExistingProjectContent(fullAssemblyName); + if (content != null) { + return content; + } else if (existingProjectContents.Any()) { + return GetExistingProjectContentForShortName(existingProjectContents, fullAssemblyName.ShortName); + } + return null; + } + + IProjectContent GetExistingProjectContentForShortName(IProjectContent[] existingProjectContents, string shortName) + { + return existingProjectContents.FirstOrDefault(pc => pc.AssemblyName == shortName); + } + public override string ToString() { return string.Format("[{0}: {1}]", GetType().Name, assemblyFullName); From 745640729a3c2bc879e9d2979ca0eee5cc8a275e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 27 Dec 2011 16:19:21 +0000 Subject: [PATCH 11/11] Ignore case when comparing project type guids to check if a project is a web or Silverlight project. --- src/Main/Base/Project/Src/Project/CompilableProject.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index da001ca6a5..8f3e803a0d 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -359,7 +359,7 @@ namespace ICSharpCode.SharpDevelop.Project public bool IsSilverlightProject { get { string guids = GetEvaluatedProperty("ProjectTypeGuids") ?? ""; - return guids.Contains("A1591282-1198-4647-A2B1-27E5FF5F6F3B"); + return guids.ToUpperInvariant().Contains("A1591282-1198-4647-A2B1-27E5FF5F6F3B"); } } @@ -367,7 +367,7 @@ namespace ICSharpCode.SharpDevelop.Project public override bool IsWebProject { get { string guids = GetEvaluatedProperty("ProjectTypeGuids") ?? ""; - return guids.Contains("349c5851-65df-11da-9384-00065b846f21"); + return guids.ToUpperInvariant().Contains("349C5851-65DF-11DA-9384-00065B846F21"); } }