@@ -155,6 +155,7 @@ static void PrintMethodFields(
155155
156156 if (flavor == ProtoFlavor::NANO) {
157157 p->Print (
158+ *vars,
158159 " private static final class NanoFactory<T extends com.google.protobuf.nano.MessageNano>\n "
159160 " implements io.grpc.protobuf.nano.MessageNanoFactory<T> {\n "
160161 " private final int id;\n "
@@ -163,7 +164,7 @@ static void PrintMethodFields(
163164 " this.id = id;\n "
164165 " }\n "
165166 " \n "
166- " @Override\n "
167+ " @$ Override$ \n "
167168 " public T newInstance() {\n "
168169 " Object o;\n "
169170 " switch (id) {\n " );
@@ -204,7 +205,8 @@ enum StubType {
204205 BLOCKING_SERVER_INTERFACE = 3 ,
205206 ASYNC_CLIENT_IMPL = 4 ,
206207 BLOCKING_CLIENT_IMPL = 5 ,
207- FUTURE_CLIENT_IMPL = 6
208+ FUTURE_CLIENT_IMPL = 6 ,
209+ ABSTRACT = 7 ,
208210};
209211
210212enum CallType {
@@ -219,9 +221,14 @@ static void PrintStub(
219221 map<string, string>* vars,
220222 Printer* p, StubType type, bool generate_nano) {
221223 (*vars)[" service_name" ] = service->name ();
224+ (*vars)[" abstract_name" ] = " Abstract" + service->name ();
222225 string interface_name = service->name ();
223226 string impl_name = service->name ();
227+ bool abstract = false ;
224228 switch (type) {
229+ case ABSTRACT:
230+ abstract = true ;
231+ break ;
225232 case ASYNC_INTERFACE:
226233 case ASYNC_CLIENT_IMPL:
227234 impl_name += " Stub" ;
@@ -242,9 +249,10 @@ static void PrintStub(
242249 default :
243250 GRPC_CODEGEN_FAIL << " Cannot determine class name for StubType: " << type;
244251 }
245- bool impl;
246252 CallType call_type;
253+ bool impl = false ;
247254 switch (type) {
255+ case ABSTRACT:
248256 case ASYNC_INTERFACE:
249257 call_type = ASYNC_CALL;
250258 impl = false ;
@@ -277,7 +285,12 @@ static void PrintStub(
277285 (*vars)[" impl_name" ] = impl_name;
278286
279287 // Class head
280- if (!impl) {
288+ if (abstract) {
289+ p->Print (
290+ *vars,
291+ " public static abstract class $abstract_name$ implements $service_name$, "
292+ " $BindableService$ {\n " );
293+ } else if (!impl) {
281294 p->Print (
282295 *vars,
283296 " public static interface $interface_name$ {\n " );
@@ -343,7 +356,7 @@ static void PrintStub(
343356
344357 // Method signature
345358 p->Print (" \n " );
346- if (impl) {
359+ if (impl || abstract ) {
347360 p->Print (
348361 *vars,
349362 " @$Override$\n " );
@@ -395,10 +408,34 @@ static void PrintStub(
395408 " $input_type$ request)" );
396409 break ;
397410 }
398- if (impl) {
399- // Method body for client impls
400- p->Print (" {\n " );
401- p->Indent ();
411+
412+ if (!(abstract || impl)) {
413+ // Interface method - there will be no body, close method.
414+ p->Print (" ;\n " );
415+ continue ;
416+ }
417+
418+ // Method body for abstract stub & client impls.
419+ p->Print (" {\n " );
420+ p->Indent ();
421+
422+ if (abstract) {
423+ switch (call_type) {
424+ // NB: Skipping validation of service methods. If something is wrong, we wouldn't get to
425+ // this point as compiler would return errors when generating service interface.
426+ case ASYNC_CALL:
427+ if (client_streaming) {
428+ p->Print (
429+ *vars,
430+ " return asyncUnimplementedStreamingCall($method_field_name$, responseObserver);\n " );
431+ } else {
432+ p->Print (
433+ *vars,
434+ " asyncUnimplementedUnaryCall($method_field_name$, responseObserver);\n " );
435+ }
436+ break ;
437+ }
438+ } else if (impl) {
402439 switch (call_type) {
403440 case BLOCKING_CALL:
404441 GRPC_CODEGEN_CHECK (!client_streaming)
@@ -451,12 +488,24 @@ static void PrintStub(
451488 " getChannel().newCall($method_field_name$, getCallOptions()), request);\n " );
452489 break ;
453490 }
454- p->Outdent ();
455- p->Print (" }\n " );
456- } else {
457- p->Print (" ;\n " );
458491 }
492+ p->Outdent ();
493+ p->Print (" }\n " );
459494 }
495+
496+ if (abstract) {
497+ p->Print (" \n " );
498+ p->Print (*vars,
499+ " @$Override$ public $ServerServiceDefinition$ bindService() {\n "
500+ );
501+ p->Indent ();
502+ p->Print (*vars,
503+ " return $service_class_name$.bindService(this);\n "
504+ );
505+ p->Outdent ();
506+ p->Print (" }\n " );
507+ }
508+
460509 p->Outdent ();
461510 p->Print (" }\n\n " );
462511}
@@ -642,27 +691,6 @@ static void PrintBindServiceMethod(const ServiceDescriptor* service,
642691 p->Print (" }\n " );
643692}
644693
645- static void PrintAbstractServiceClass (const ServiceDescriptor* service,
646- map<string, string>* vars,
647- Printer* p) {
648- p->Print (
649- *vars,
650- " public static abstract class Abstract$service_name$"
651- " implements $service_name$, $BindableService$ {\n " );
652- p->Indent ();
653- p->Print (*vars,
654- " @Override public $ServerServiceDefinition$ bindService() {\n "
655- );
656- p->Indent ();
657- p->Print (*vars,
658- " return $service_class_name$.bindService(this);\n "
659- );
660- p->Outdent ();
661- p->Print (" }\n " );
662- p->Outdent ();
663- p->Print (" }\n\n " );
664- }
665-
666694static void PrintService (const ServiceDescriptor* service,
667695 map<string, string>* vars,
668696 Printer* p,
@@ -720,12 +748,12 @@ static void PrintService(const ServiceDescriptor* service,
720748
721749 bool generate_nano = flavor == ProtoFlavor::NANO;
722750 PrintStub (service, vars, p, ASYNC_INTERFACE, generate_nano);
751+ PrintStub (service, vars, p, ABSTRACT, generate_nano);
723752 PrintStub (service, vars, p, BLOCKING_CLIENT_INTERFACE, generate_nano);
724753 PrintStub (service, vars, p, FUTURE_CLIENT_INTERFACE, generate_nano);
725754 PrintStub (service, vars, p, ASYNC_CLIENT_IMPL, generate_nano);
726755 PrintStub (service, vars, p, BLOCKING_CLIENT_IMPL, generate_nano);
727756 PrintStub (service, vars, p, FUTURE_CLIENT_IMPL, generate_nano);
728- PrintAbstractServiceClass (service, vars, p);
729757 PrintMethodHandlerClass (service, vars, p, generate_nano);
730758 PrintBindServiceMethod (service, vars, p, generate_nano);
731759 p->Outdent ();
@@ -757,7 +785,11 @@ void PrintImports(Printer* p, bool generate_nano) {
757785 " import static "
758786 " io.grpc.stub.ServerCalls.asyncClientStreamingCall;\n "
759787 " import static "
760- " io.grpc.stub.ServerCalls.asyncBidiStreamingCall;\n\n " );
788+ " io.grpc.stub.ServerCalls.asyncBidiStreamingCall;\n "
789+ " import static "
790+ " io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;\n "
791+ " import static "
792+ " io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;\n\n " );
761793 if (generate_nano) {
762794 p->Print (" import java.io.IOException;\n\n " );
763795 }
0 commit comments