2009-08-11 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 11 Aug 2009 06:47:27 +0000 (06:47 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 11 Aug 2009 06:47:27 +0000 (06:47 -0000)
* MetadataResolver.cs : added remaining methods.
* MetadataExchangeClient.cs : a bit of required changes for above.

svn path=/trunk/mcs/; revision=139691

mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel.Description/MetadataExchangeClient.cs
mcs/class/System.ServiceModel/System.ServiceModel.Description/MetadataResolver.cs

index 591f2b69415b005b387630f3c8d546be1b76b0f0..2731e6e96128ae9d1684ed5aa04e15eccda4fd56 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-11  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * MetadataResolver.cs : added remaining methods.
+       * MetadataExchangeClient.cs : a bit of required changes for above.
+
 2009-08-11  Atsushi Enomoto  <atsushi@ximian.com>
 
        * ServiceDebugBehavior.cs, ServiceMetadataBehavior.cs :
index 519e3c4fd74145388317f4c54097324b2cd27928..3807e6b0c55d90e671237aa7d531f68a9d616291 100644 (file)
@@ -46,21 +46,18 @@ using SMMessage = System.ServiceModel.Channels.Message;
 
 namespace System.ServiceModel.Description
 {
-       [MonoTODO]
+       [MonoTODO ("MetadataExchangeClientMode is not considered")]
        public class MetadataExchangeClient
        {
                string scheme;
 
                EndpointAddress address;
                SMBinding binding;
+               MetadataExchangeClientMode mode = MetadataExchangeClientMode.MetadataExchange;
 
+               [MonoTODO ("use empty configuration")]
                public MetadataExchangeClient ()
                {
-                       //FIXME: Look for config element, implementing
-                       //      IMetadataExchange contract
-                       //      Use Channel<IMetadataExchange> .. ?
-                       
-                       throw new NotImplementedException ();
                }
 
                public MetadataExchangeClient (SMBinding mexBinding)
@@ -81,6 +78,7 @@ namespace System.ServiceModel.Description
                public MetadataExchangeClient (Uri address, MetadataExchangeClientMode mode)
                {
                        this.address = new EndpointAddress (address.AbsoluteUri);
+                       this.mode = mode;
                }
 
                public MetadataSet GetMetadata ()
@@ -91,7 +89,7 @@ namespace System.ServiceModel.Description
                public MetadataSet GetMetadata (EndpointAddress address)
                {
                        //FIXME: default mode?
-                       return GetMetadataInternal (address, MetadataExchangeClientMode.MetadataExchange);
+                       return GetMetadataInternal (address, mode);
                }
 
                public MetadataSet GetMetadata (Uri address, MetadataExchangeClientMode mode)
@@ -99,7 +97,7 @@ namespace System.ServiceModel.Description
                        return GetMetadataInternal (new EndpointAddress (address.AbsoluteUri), mode);
                }
 
-               MetadataSet GetMetadataInternal (EndpointAddress address, MetadataExchangeClientMode mode)
+               internal MetadataSet GetMetadataInternal (EndpointAddress address, MetadataExchangeClientMode mode)
                {
                        if (binding == null)
                                binding = MetadataExchangeBindings.CreateMexHttpBinding ();
index 3d4fe08b4c6d7b03361c1fc06fd77e3be80723d5..84812404c2678b7359f33ba61ea4aa124296875c 100644 (file)
@@ -47,17 +47,57 @@ namespace System.ServiceModel.Description
        [MonoTODO]
        public static class MetadataResolver
        {
-               public static ServiceEndpointCollection Resolve (
-                               Type contract,
-                               EndpointAddress address)
+               static IEnumerable<ContractDescription> ToContracts (Type contract)
                {
                        if (contract == null)
                                throw new ArgumentNullException ("contract");
+                       yield return ContractDescription.GetContract (contract);
+               }
+
+               public static IAsyncResult BeginResolve (Type contract, EndpointAddress address, AsyncCallback callback, object asyncState)
+               {
+                       return BeginResolve (ToContracts (contract), address, callback, asyncState);
+               }
+
+               public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, AsyncCallback callback, object asyncState)
+               {
+                       return BeginResolve (contracts, address, MetadataExchangeClientMode.MetadataExchange, callback, asyncState);
+               }
+
+               public static IAsyncResult BeginResolve (Type contract, Uri address, MetadataExchangeClientMode mode, AsyncCallback callback, object asyncState)
+               {
+                       return BeginResolve (ToContracts (contract), new EndpointAddress (address), mode, callback, asyncState);
+               }
+
+               public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, MetadataExchangeClientMode mode, AsyncCallback callback, object asyncState)
+               {
+                       return BeginResolve (contracts, address, mode, new MetadataExchangeClient (), callback, asyncState);
+               }
+
+               public static IAsyncResult BeginResolve (Type contract, EndpointAddress address, MetadataExchangeClient client, AsyncCallback callback, object asyncState)
+               {
+                       return resolver.BeginInvoke (ToContracts (contract), () => client.GetMetadata (address), callback, asyncState);
+               }
+
+               public static IAsyncResult BeginResolve (IEnumerable<ContractDescription> contracts, EndpointAddress address, MetadataExchangeClientMode mode, MetadataExchangeClient client, AsyncCallback callback, object asyncState)
+               {
+                       return resolver.BeginInvoke (contracts, () => client.GetMetadataInternal (address, mode), callback, asyncState);
+               }
+
+               delegate ServiceEndpointCollection Resolver (IEnumerable<ContractDescription> contracts, Func<MetadataSet> metadataGetter);
+
+               static readonly Resolver resolver = new Resolver (ResolveContracts);
 
-                       return ResolveContracts (
-                                       new ContractDescription [] {ContractDescription.GetContract (contract)},
-                                       address, 
-                                       MetadataExchangeClientMode.MetadataExchange);
+               public static ServiceEndpointCollection EndResolve (IAsyncResult result)
+               {
+                       return resolver.EndInvoke (result);
+               }
+
+               public static ServiceEndpointCollection Resolve (
+                               Type contract,
+                               EndpointAddress address)
+               {
+                       return Resolve (ToContracts (contract), address);
                }
 
                public static ServiceEndpointCollection Resolve (
@@ -65,17 +105,14 @@ namespace System.ServiceModel.Description
                                Uri address,
                                MetadataExchangeClientMode mode)
                {
-                       return ResolveContracts (
-                                       new ContractDescription [] {ContractDescription.GetContract (contract)},
-                                       address, 
-                                       mode);
+                       return Resolve (ToContracts (contract), address, mode);
                }
 
                public static ServiceEndpointCollection Resolve (
                                IEnumerable<ContractDescription> contracts,
                                EndpointAddress address)
                {
-                       return ResolveContracts (contracts, address, MetadataExchangeClientMode.MetadataExchange);
+                       return Resolve (contracts, address, new MetadataExchangeClient ());
                }
 
                public static ServiceEndpointCollection Resolve (
@@ -83,7 +120,7 @@ namespace System.ServiceModel.Description
                                Uri address,
                                MetadataExchangeClientMode mode)
                {
-                       return ResolveContracts (contracts, address, mode);
+                       return Resolve (contracts, new EndpointAddress (address), new MetadataExchangeClient (address, mode));
                }
 
                public static ServiceEndpointCollection Resolve (
@@ -94,8 +131,7 @@ namespace System.ServiceModel.Description
                        if (client == null)
                                throw new ArgumentNullException ("client");
 
-                       /* FIXME: client is used for what? */
-                       return ResolveContracts (contracts, address, MetadataExchangeClientMode.MetadataExchange);
+                       return ResolveContracts (contracts, () => client.GetMetadata (address));
                }
 
                /* FIXME: What is the mode/client used for here? 
@@ -109,24 +145,12 @@ namespace System.ServiceModel.Description
                        if (client == null)
                                throw new ArgumentNullException ("client");
 
-                       return ResolveContracts (contracts, address, mode);
+                       return ResolveContracts (contracts, () => new MetadataExchangeClient ().GetMetadata (address, mode));
                }
 
                private static ServiceEndpointCollection ResolveContracts (
                                IEnumerable<ContractDescription> contracts,
-                               Uri address,
-                               MetadataExchangeClientMode mode)
-               {
-                       if (address == null)
-                               throw new ArgumentNullException ("address");
-
-                       return ResolveContracts (contracts, new EndpointAddress (address), mode);
-               }
-
-               private static ServiceEndpointCollection ResolveContracts (
-                               IEnumerable<ContractDescription> contracts,
-                               EndpointAddress address,
-                               MetadataExchangeClientMode mode)
+                               Func<MetadataSet> metadataGetter)
                {
                        if (contracts == null)
                                throw new ArgumentNullException ("contracts");
@@ -135,11 +159,7 @@ namespace System.ServiceModel.Description
                        if (list.Count == 0)
                                throw new ArgumentException ("There must be atleast one ContractDescription", "contracts");
 
-                       if (address == null)
-                               throw new ArgumentNullException ("address");
-
-                       MetadataExchangeClient client = new MetadataExchangeClient (address);
-                       MetadataSet metadata = client.GetMetadata ();
+                       MetadataSet metadata = metadataGetter ();
                        WsdlImporter importer = new WsdlImporter (metadata);
                        ServiceEndpointCollection endpoints = importer.ImportAllEndpoints ();