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"/> 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 @@ + - - diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index b01e8bbd10..462e6715b0 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -60,6 +60,9 @@ + + 3.0 + @@ -265,6 +268,29 @@ Code + + + + + + + + + + + + + + + + + + + + + + + ToolNotFoundDialog.cs @@ -322,6 +348,7 @@ + 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 3abcca6c60..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 @@ -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."; @@ -48,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; @@ -61,77 +53,74 @@ 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); - 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(); @@ -141,7 +130,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference #endregion - #region discover service Code from Matt void StartDiscovery(Uri uri, DiscoveryNetworkCredential credential) @@ -162,7 +150,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference /// completed. /// /// - void DiscoveryCompleted(IAsyncResult result) { AsyncDiscoveryState state = (AsyncDiscoveryState)result.AsyncState; @@ -196,7 +183,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - /// /// Stops any outstanding asynchronous discovery requests. /// @@ -218,7 +204,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - void AuthenticateUser(Uri uri, string authenticationType) { DiscoveryNetworkCredential credential = (DiscoveryNetworkCredential)credentialCache.GetCredential(uri, authenticationType); @@ -233,7 +218,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } - void AddCredential(Uri uri, DiscoveryNetworkCredential credential) { NetworkCredential matchedCredential = credentialCache.GetCredential(uri, credential.AuthenticationType); @@ -243,18 +227,18 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference credentialCache.Add(uri, credential.AuthenticationType, credential); } - void DiscoveredWebServices(DiscoveryClientProtocol protocol) { if (protocol != null) { serviceDescriptionCollection = ServiceReferenceHelper.GetServiceDescriptions(protocol); + serviceMetadata = new WebServiceMetadataSet(protocol); 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); } } @@ -275,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(); @@ -361,86 +346,84 @@ 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); } } ServiceItems = items; } + + public void AddServiceReference() + { + var serviceGenerator = new ServiceReferenceGenerator(project); + serviceGenerator.Namespace = defaultNameSpace; + serviceGenerator.AddServiceReference(serviceMetadata); + new RefreshProjectBrowser().Run(); + } } - 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/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/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..58f0bbc739 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs @@ -0,0 +1,19 @@ +// 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; } + + 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/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/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 new file mode 100644 index 0000000000..9b117b442e --- /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 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 new file mode 100644 index 0000000000..eb5ffe4abe --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -0,0 +1,100 @@ +// 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 ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName) + { + return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName); + } + + public ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName) + { + return new ServiceReferenceMapFileName(ServiceReferencesFolder, serviceReferenceName); + } + + public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName) + { + AddServiceReferenceFileToProject(fileName); + AddServiceReferencesItemToProject(); + AddServiceReferenceItemToProject(fileName); + } + + void AddServiceReferenceFileToProject(ServiceReferenceFileName fileName) + { + var projectItem = new FileProjectItem(project, ItemType.Compile); + projectItem.FileName = fileName.Path; + projectItem.DependentUpon = "Reference.svcmap"; + AddProjectItemToProject(projectItem); + } + + void AddProjectItemToProject(ProjectItem item) + { + ProjectService.AddProjectItem(project, item); + } + + void AddServiceReferencesItemToProject() + { + var projectItem = new ServiceReferencesProjectItem(project); + projectItem.Include = "Service References"; + AddProjectItemToProject(projectItem); + } + + void AddServiceReferenceItemToProject(ServiceReferenceFileName fileName) + { + var projectItem = new ServiceReferenceProjectItem(project); + projectItem.Include = @"Service References\" + fileName.ServiceName; + AddProjectItemToProject(projectItem); + } + + public void Save() + { + 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/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/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/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/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..7180fd116c --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.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.IO; +using System.ServiceModel.Description; + +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class ServiceReferenceGenerator + { + IProjectWithServiceReferences project; + IServiceReferenceFileGenerator fileGenerator; + IFileSystem fileSystem; + + public ServiceReferenceGenerator(IProject project) + : this(new ProjectWithServiceReferences(project)) + { + } + + public ServiceReferenceGenerator(IProjectWithServiceReferences project) + : this( + project, + new ServiceReferenceFileGenerator(project.CodeDomProvider), + new ServiceReferenceFileSystem()) + { + } + + public ServiceReferenceGenerator( + IProjectWithServiceReferences project, + IServiceReferenceFileGenerator fileGenerator, + IFileSystem fileSystem) + { + this.project = project; + this.fileGenerator = fileGenerator; + this.fileSystem = fileSystem; + } + + public string Namespace { get; set; } + + public void AddServiceReference(MetadataSet metadata) + { + GenerateServiceReferenceProxy(metadata); + } + + void GenerateServiceReferenceProxy(MetadataSet metadata) + { + ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(Namespace); + CreateFolderForFileIfFolderMissing(referenceFileName.Path); + + fileGenerator.GenerateProxyFile(metadata, referenceFileName.Path); + + ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(Namespace); + var mapFile = new ServiceReferenceMapFile(mapFileName); + fileGenerator.GenerateServiceReferenceMapFile(mapFile); + + project.AddServiceReferenceProxyFile(referenceFileName); + project.AddServiceReferenceMapFile(mapFileName); + + 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/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 new file mode 100644 index 0000000000..bc1e405b51 --- /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 GenerateProxyFile(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/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(); 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/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"); } } 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/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/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 5fa06efc2b..c8b842d0eb 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,16 @@ + + + + + + + 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 new file mode 100644 index 0000000000..4719d3d2e2 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -0,0 +1,192 @@ +// 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.IO; +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(ServiceReferenceFileName fileName) + { + return msbuildProject.Items.SingleOrDefault(item => item.FileName == fileName.Path); + } + + ServiceReferencesProjectItem GetFirstWCFMetadataItemInMSBuildProject() + { + return msbuildProject.GetItemsOfType(ItemType.ServiceReferences).SingleOrDefault() as ServiceReferencesProjectItem; + } + + ServiceReferenceProjectItem GetFirstWCFMetadataStorageItemInMSBuildProject() + { + 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() + { + 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"); + + ServiceReferenceFileName fileName = project.GetServiceReferenceFileName("Service1"); + string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; + + Assert.AreEqual(expectedFileName, fileName.Path); + } + + [Test] + public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_ProxyFileAddedToProjectAsFileToCompile() + { + CreateProjectWithMSBuildProject(); + + var proxyFileName = new ServiceReferenceFileName() { + ServiceReferencesFolder = @"d:\projects\MyProject\Service References", + ServiceName = "Service1" + }; + project.AddServiceReferenceProxyFile(proxyFileName); + + ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); + + string dependentUpon = item.GetMetadata("DependentUpon"); + + Assert.AreEqual(ItemType.Compile, item.ItemType); + Assert.AreEqual("Reference.svcmap", dependentUpon); + } + + [Test] + public void Save_SaveProjectChanges_UnderlyingProjectIsSaved() + { + CreateProject(); + + project.Save(); + + fakeProject.AssertWasCalled(p => p.Save()); + } + + [Test] + public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_WCFMetadataItemAddedToProjectForServiceReferencesFolder() + { + CreateProjectWithMSBuildProject(); + + var proxyFileName = new ServiceReferenceFileName() { ServiceName = "Service1" }; + project.AddServiceReferenceProxyFile(proxyFileName); + + ServiceReferencesProjectItem item = GetFirstWCFMetadataItemInMSBuildProject(); + + Assert.AreEqual("Service References", item.Include); + } + + [Test] + public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_WCFMetadataStorageItemAddedToProjectForServiceReferencesFolder() + { + CreateProjectWithMSBuildProject(); + + var proxyFileName = new ServiceReferenceFileName() { ServiceName = "Service1" }; + project.AddServiceReferenceProxyFile(proxyFileName); + + ProjectItem item = GetFirstWCFMetadataStorageItemInMSBuildProject(); + + Assert.AreEqual(@"Service References\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/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 new file mode 100644 index 0000000000..7b0fe50ab0 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -0,0 +1,163 @@ +// 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; + IServiceReferenceMapGenerator fakeReferenceMapGenerator; + ServiceReferenceGenerator generator; + ServiceReferenceFileGenerator fileGenerator; + IFileSystem fakeFileSystem; + MetadataSet metadata; + + void CreateGenerator() + { + metadata = new MetadataSet(); + + fakeProject = MockRepository.GenerateStub(); + fakeProxyGenerator = MockRepository.GenerateStub(); + fakeReferenceMapGenerator = MockRepository.GenerateStub(); + fileGenerator = new ServiceReferenceFileGenerator(fakeProxyGenerator, fakeReferenceMapGenerator); + fakeFileSystem = MockRepository.GenerateStub(); + + generator = new ServiceReferenceGenerator(fakeProject, fileGenerator, fakeFileSystem); + } + + 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; + } + + 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(); + 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.GenerateProxyFile(metadata, expectedProxyFileName)); + } + + [Test] + public void AddServiceReference_ServiceReferenceDoesNotExist_ServiceReferenceFolderCreated() + { + CreateGenerator(); + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); + AddMapFileNameForServiceName("MyService1"); + 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(); + ServiceReferenceFileName expectedProxyFileName = + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); + generator.Namespace = "MyServiceRef"; + + generator.AddServiceReference(metadata); + + fakeProject.AssertWasCalled(p => p.AddServiceReferenceProxyFile(expectedProxyFileName)); + } + + [Test] + public void AddServiceReference_GeneratesServiceReference_ProjectIsSaved() + { + 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 new file mode 100644 index 0000000000..c44305f56e --- /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 GenerateProxyFile_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder() + { + CreateProxyGenerator(); + CodeCompileUnit compileUnit = CreateCompileUnitToReturnFromCodeDomBuilder(metadata); + proxyGenerator.ServiceReferenceNamespace = "Test"; + string expectedProxyFileName = @"d:\projects\MyProject\Service References\Test\Service1\Reference.cs"; + + proxyGenerator.GenerateProxyFile(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); + } + + } +} 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);