blob: ac08c04bf6ad9b66341bf9127da0950f771ad36c [file] [log] [blame]
Jan Tattermuscha7fff862015-02-13 11:08:08 -08001#region Copyright notice and license
2
Jan Tattermuschaf77b3d2015-02-13 11:22:21 -08003// Copyright 2015, Google Inc.
Jan Tattermuscha7fff862015-02-13 11:08:08 -08004// All rights reserved.
Craig Tiller190d3602015-02-18 09:23:38 -08005//
Jan Tattermuscha7fff862015-02-13 11:08:08 -08006// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
Craig Tiller190d3602015-02-18 09:23:38 -08009//
Jan Tattermuscha7fff862015-02-13 11:08:08 -080010// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
Craig Tiller190d3602015-02-18 09:23:38 -080019//
Jan Tattermuscha7fff862015-02-13 11:08:08 -080020// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32#endregion
33
Jan Tattermusch15111f52015-02-05 18:15:14 -080034using System;
35using System.Collections.Generic;
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070036using System.Collections.ObjectModel;
Jan Tattermusch286975f2015-03-12 14:04:36 -070037using Grpc.Core.Internal;
Jan Tattermusch15111f52015-02-05 18:15:14 -080038
Jan Tattermusch30868622015-02-19 09:22:33 -080039namespace Grpc.Core
Jan Tattermusch15111f52015-02-05 18:15:14 -080040{
Jan Tattermusch286975f2015-03-12 14:04:36 -070041 /// <summary>
42 /// Mapping of method names to server call handlers.
Jan Tattermusch12855fc2015-08-24 16:43:23 -070043 /// Normally, the <c>ServerServiceDefinition</c> objects will be created by the <c>BindService</c> factory method
44 /// that is part of the autogenerated code for a protocol buffers service definition.
Jan Tattermusch286975f2015-03-12 14:04:36 -070045 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080046 public class ServerServiceDefinition
47 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070048 readonly ReadOnlyDictionary<string, IServerCallHandler> callHandlers;
Jan Tattermusch15111f52015-02-05 18:15:14 -080049
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070050 private ServerServiceDefinition(Dictionary<string, IServerCallHandler> callHandlers)
Jan Tattermusch15111f52015-02-05 18:15:14 -080051 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070052 this.callHandlers = new ReadOnlyDictionary<string, IServerCallHandler>(callHandlers);
Jan Tattermusch15111f52015-02-05 18:15:14 -080053 }
54
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070055 internal IDictionary<string, IServerCallHandler> CallHandlers
Jan Tattermusch15111f52015-02-05 18:15:14 -080056 {
57 get
58 {
59 return this.callHandlers;
60 }
61 }
62
Jan Tattermusch12855fc2015-08-24 16:43:23 -070063 /// <summary>
64 /// Creates a new builder object for <c>ServerServiceDefinition</c>.
65 /// </summary>
Jan Tattermusch12855fc2015-08-24 16:43:23 -070066 /// <returns>The builder object.</returns>
Jan Tattermusch781720f2016-06-03 17:40:28 -070067 public static Builder CreateBuilder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080068 {
Jan Tattermusch781720f2016-06-03 17:40:28 -070069 return new Builder();
Jan Tattermusch15111f52015-02-05 18:15:14 -080070 }
71
Jan Tattermusch12855fc2015-08-24 16:43:23 -070072 /// <summary>
73 /// Builder class for <see cref="ServerServiceDefinition"/>.
74 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080075 public class Builder
76 {
Jan Tattermusch075dde42015-03-11 18:21:00 -070077 readonly Dictionary<string, IServerCallHandler> callHandlers = new Dictionary<string, IServerCallHandler>();
Jan Tattermusch15111f52015-02-05 18:15:14 -080078
Jan Tattermusch12855fc2015-08-24 16:43:23 -070079 /// <summary>
80 /// Creates a new instance of builder.
81 /// </summary>
Jan Tattermusch781720f2016-06-03 17:40:28 -070082 public Builder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080083 {
Jan Tattermusch15111f52015-02-05 18:15:14 -080084 }
85
Jan Tattermusch12855fc2015-08-24 16:43:23 -070086 /// <summary>
87 /// Adds a definitions for a single request - single response method.
88 /// </summary>
89 /// <typeparam name="TRequest">The request message class.</typeparam>
90 /// <typeparam name="TResponse">The response message class.</typeparam>
91 /// <param name="method">The method.</param>
92 /// <param name="handler">The method handler.</param>
93 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -080094 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -080095 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -070096 UnaryServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -070097 where TRequest : class
98 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -080099 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700100 callHandlers.Add(method.FullName, ServerCalls.UnaryCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -0800101 return this;
102 }
103
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700104 /// <summary>
105 /// Adds a definitions for a client streaming method.
106 /// </summary>
107 /// <typeparam name="TRequest">The request message class.</typeparam>
108 /// <typeparam name="TResponse">The response message class.</typeparam>
109 /// <param name="method">The method.</param>
110 /// <param name="handler">The method handler.</param>
111 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -0800112 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -0800113 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700114 ClientStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700115 where TRequest : class
116 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -0800117 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700118 callHandlers.Add(method.FullName, ServerCalls.ClientStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700119 return this;
120 }
121
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700122 /// <summary>
123 /// Adds a definitions for a server streaming method.
124 /// </summary>
125 /// <typeparam name="TRequest">The request message class.</typeparam>
126 /// <typeparam name="TResponse">The response message class.</typeparam>
127 /// <param name="method">The method.</param>
128 /// <param name="handler">The method handler.</param>
129 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700130 public Builder AddMethod<TRequest, TResponse>(
131 Method<TRequest, TResponse> method,
132 ServerStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700133 where TRequest : class
134 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700135 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700136 callHandlers.Add(method.FullName, ServerCalls.ServerStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700137 return this;
138 }
139
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700140 /// <summary>
141 /// Adds a definitions for a bidirectional streaming method.
142 /// </summary>
143 /// <typeparam name="TRequest">The request message class.</typeparam>
144 /// <typeparam name="TResponse">The response message class.</typeparam>
145 /// <param name="method">The method.</param>
146 /// <param name="handler">The method handler.</param>
147 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700148 public Builder AddMethod<TRequest, TResponse>(
149 Method<TRequest, TResponse> method,
150 DuplexStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700151 where TRequest : class
152 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700153 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700154 callHandlers.Add(method.FullName, ServerCalls.DuplexStreamingCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -0800155 return this;
156 }
157
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700158 /// <summary>
159 /// Creates an immutable <c>ServerServiceDefinition</c> from this builder.
160 /// </summary>
161 /// <returns>The <c>ServerServiceDefinition</c> object.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -0800162 public ServerServiceDefinition Build()
163 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -0700164 return new ServerServiceDefinition(callHandlers);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700165 }
Jan Tattermusch15111f52015-02-05 18:15:14 -0800166 }
167 }
168}