implement Find operation in request-reply contract in Discovery Service, using FindRe...
authorAtsushi Eno <atsushi@ximian.com>
Tue, 31 Aug 2010 17:20:26 +0000 (02:20 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Tue, 31 Aug 2010 17:20:26 +0000 (02:20 +0900)
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryService.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/FindCriteria.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/FindRequestContext.cs

index ab3597b35195d38bb83e83023df9d82dfbcc8486..168d61d9c8671f0b7b90eeb55fefd48124b7c88e 100755 (executable)
@@ -68,15 +68,25 @@ namespace System.ServiceModel.Discovery
                #region service contract implementation
                
                // IDiscoveryProxyContract11
+               
+               FindRequestContext find_context;
+               
                IAsyncResult IDiscoveryProxyContract11.BeginFind (MessageContracts11.FindRequest message, AsyncCallback callback, object state)
                {
-                       return OnBeginFind (new DefaultFindRequestContext (message.Body.ToFindCriteria ()), callback, state);
+                       if (find_context != null)
+                               throw new InvalidOperationException ("Another async Find operation is ongoing");
+                       find_context = new DefaultFindRequestContext (message.Body.ToFindCriteria ());
+                       return OnBeginFind (find_context, callback, state);
                }
 
                MessageContracts11.FindResponse IDiscoveryProxyContract11.EndFind (IAsyncResult result)
                {
                        OnEndFind (result);
-                       throw new NotImplementedException ();
+                       var l = new MessageContracts11.FindResponse11 ();
+                       foreach (var edm in find_context.Endpoints)
+                               l.Add (new EndpointDiscoveryMetadata11 (edm));
+                       find_context = null;
+                       return new MessageContracts11.FindResponse () { Body = l };
                }
 
                IAsyncResult IDiscoveryProxyContract11.BeginResolve (MessageContracts11.ResolveRequest message, AsyncCallback callback, object state)
@@ -93,13 +103,20 @@ namespace System.ServiceModel.Discovery
                // IDiscoveryProxyContractApril2005
                IAsyncResult IDiscoveryProxyContractApril2005.BeginFind (MessageContractsApril2005.FindRequest message, AsyncCallback callback, object state)
                {
-                       return OnBeginFind (new DefaultFindRequestContext (message.Body.ToFindCriteria ()), callback, state);
+                       if (find_context != null)
+                               throw new InvalidOperationException ("Another async Find operation is ongoing");
+                       find_context = new DefaultFindRequestContext (message.Body.ToFindCriteria ());
+                       return OnBeginFind (find_context, callback, state);
                }
 
                MessageContractsApril2005.FindResponse IDiscoveryProxyContractApril2005.EndFind (IAsyncResult result)
                {
                        OnEndFind (result);
-                       throw new NotImplementedException ();
+                       var l = new MessageContractsApril2005.FindResponseApril2005 ();
+                       foreach (var edm in find_context.Endpoints)
+                               l.Add (new EndpointDiscoveryMetadataApril2005 (edm));
+                       find_context = null;
+                       return new MessageContractsApril2005.FindResponse () { Body = l };
                }
 
                IAsyncResult IDiscoveryProxyContractApril2005.BeginResolve (MessageContractsApril2005.ResolveRequest message, AsyncCallback callback, object state)
@@ -116,13 +133,20 @@ namespace System.ServiceModel.Discovery
                // IDiscoveryProxyContractCD1
                IAsyncResult IDiscoveryProxyContractCD1.BeginFind (MessageContractsCD1.FindRequest message, AsyncCallback callback, object state)
                {
-                       return OnBeginFind (new DefaultFindRequestContext (message.Body.ToFindCriteria ()), callback, state);
+                       if (find_context != null)
+                               throw new InvalidOperationException ("Another async Find operation is ongoing");
+                       find_context = new DefaultFindRequestContext (message.Body.ToFindCriteria ());
+                       return OnBeginFind (find_context, callback, state);
                }
 
                MessageContractsCD1.FindResponse IDiscoveryProxyContractCD1.EndFind (IAsyncResult result)
                {
                        OnEndFind (result);
-                       throw new NotImplementedException ();
+                       var l = new MessageContractsCD1.FindResponseCD1 ();
+                       foreach (var edm in find_context.Endpoints)
+                               l.Add (new EndpointDiscoveryMetadataCD1 (edm));
+                       find_context = null;
+                       return new MessageContractsCD1.FindResponse () { Body = l };
                }
 
                IAsyncResult IDiscoveryProxyContractCD1.BeginResolve (MessageContractsCD1.ResolveRequest message, AsyncCallback callback, object state)
index da89b474ad5b08e4c57c0f6f8664619af0d7361f..4d23634e2a09d4950cb6ca93c77d6b1763b40f35 100755 (executable)
@@ -25,6 +25,7 @@
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
+using System.Linq;
 using System.ServiceModel;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
@@ -86,10 +87,46 @@ namespace System.ServiceModel.Discovery
                public Uri ScopeMatchBy { get; set; }
                public Collection<Uri> Scopes { get; private set; }
 
-               [MonoTODO]
+               [MonoTODO ("find out conformant behavior, and implement remaining bits")]
                public bool IsMatch (EndpointDiscoveryMetadata endpointDiscoveryMetadata)
                {
-                       throw new NotImplementedException ();
+                       var edm = endpointDiscoveryMetadata;
+                       if (edm == null)
+                               throw new ArgumentNullException ("endpointDiscoveryMetadata");
+                       if (edm.ContractTypeNames.Count > 0) {
+                               bool match = false;
+                               foreach (var qn in edm.ContractTypeNames)
+                                       if (ContractTypeNames.Contains (qn))
+                                               match = true;
+                               if (!match)
+                                       return false;
+                       }
+                       if (edm.Scopes.Count > 0) {
+                               bool match = false;
+                               foreach (var scope in edm.Scopes) {
+                                       if (ScopeMatchBy == null || ScopeMatchBy.Equals (ScopeMatchByPrefix)) {
+                                               if (Scopes.Contains (scope))
+                                                       match = true;
+                                       } else if (ScopeMatchBy.Equals (ScopeMatchByExact)) {
+                                               if (Scopes.Any (s => s.AbsoluteUri == scope.AbsoluteUri))
+                                                       match = true;
+                                       }
+                                       else if (ScopeMatchBy.Equals (ScopeMatchByUuid))
+                                               throw new NotImplementedException ();
+                                       else if (ScopeMatchBy.Equals (ScopeMatchByNone))
+                                               throw new NotImplementedException ();
+                                       else if (ScopeMatchBy.Equals (ScopeMatchByLdap))
+                                               throw new NotImplementedException ();
+                                       else
+                                               throw new InvalidOperationException (String.Format ("Unexpected ScopeMatchBy value: {0}", ScopeMatchBy));
+                               }
+                               if (!match)
+                                       return false;
+                       }
+                       if (Extensions.Count > 0)
+                               throw new NotImplementedException ();
+
+                       return true;
                }
 
                internal static FindCriteria ReadXml (XmlReader reader, DiscoveryVersion version)
index 28e4624fe148787321bfe973322c343775c94c05..93da8e396b190a5e3f158a1eaeea57ee1b791dbc 100755 (executable)
@@ -39,20 +39,25 @@ namespace System.ServiceModel.Discovery
                        if (criteria == null)
                                throw new ArgumentNullException ("criteria");
                        Criteria = criteria;
+                       Endpoints = new Collection<EndpointDiscoveryMetadata> ();
                }
 
                public FindCriteria Criteria { get; private set; }
 
-               [MonoTODO]
+               internal Collection<EndpointDiscoveryMetadata> Endpoints { get; private set; }
+
                public void AddMatchingEndpoint (EndpointDiscoveryMetadata matchingEndpoint)
                {
+                       if (matchingEndpoint == null)
+                               throw new ArgumentNullException ("matchingEndpoint");
                        OnAddMatchingEndpoint (matchingEndpoint);
                }
 
-               [MonoTODO]
                protected virtual void OnAddMatchingEndpoint (EndpointDiscoveryMetadata matchingEndpoint)
                {
-                       throw new NotImplementedException ();
+                       if (matchingEndpoint == null)
+                               throw new ArgumentNullException ("matchingEndpoint");
+                       Endpoints.Add (matchingEndpoint);
                }
        }