@@ -621,6 +621,8 @@ def __lt__(self, other):
621621 'exist.' )
622622_CMDLINE_PARSER .add_argument ('--unused-classes-to-generate' , default = None , help = 'Specify types ' +
623623 'that we want to generate regardless of whether they are used.' )
624+ _CMDLINE_PARSER .add_argument ('--generate-request' , action = "store_true" , default = False ,
625+ help = 'Generate additional *Request methods that return DbxRequest<T>.' )
624626
625627
626628class JavaCodeGenerator (CodeBackend ):
@@ -729,6 +731,8 @@ def add_imports_for_namespace(self, namespace):
729731 'java.util.HashMap' ,
730732 'java.util.Map' ,
731733 )
734+ if self ._j ._args .generate_request :
735+ self .add_imports ('com.dropbox.core.DbxRequest' )
732736 for route in namespace .routes :
733737 self .add_imports_for_route (route )
734738
@@ -795,6 +799,9 @@ def add_imports_for_route_builder(self, route):
795799 elif j .request_style (route ) == 'upload' :
796800 self .add_imports ('com.dropbox.core.v2.DbxUploadStyleBuilder' )
797801
802+ if self ._j ._args .generate_request :
803+ self .add_imports ('com.dropbox.core.DbxRequest' )
804+
798805 def add_imports_for_route_uploader (self , route ):
799806 self .add_imports (
800807 'com.dropbox.core.DbxWrappedException' ,
@@ -2800,6 +2807,12 @@ def generate_route_base(self, route, force_public=False):
28002807 else :
28012808 assert False , "unrecognized route request style: %s" % j .request_style (route )
28022809
2810+ if is_public and self .g .args .generate_request :
2811+ request_args = w .fmt ('%s arg' , j .java_class (route .arg_data_type )) if j .has_arg (route ) else ''
2812+ request_arg_names = 'arg' if j .has_arg (route ) else ''
2813+ self ._emit_request_method_body (route , request_args , request_arg_names , return_class ,
2814+ params = params )
2815+
28032816 def generate_route (self , route , required_only = True ):
28042817 assert isinstance (route , ApiRoute ), repr (route )
28052818
@@ -2914,6 +2927,15 @@ def generate_route(self, route, required_only=True):
29142927 else :
29152928 w .out ('%s(_arg);' , j .route_method (route ))
29162929
2930+ if self .g .args .generate_request :
2931+ request_args = ', ' .join (
2932+ w .fmt ('%s %s' , j .java_class (f ), j .param_name (f )) for f in fields
2933+ )
2934+ request_arg_names = ', ' .join (j .param_name (f ) for f in fields )
2935+ request_params = w ._javadoc_fields (fields , route , allow_defaults = False )
2936+ self ._emit_request_method_body (route , request_args , request_arg_names , return_class ,
2937+ params = request_params )
2938+
29172939 def generate_route_builder_method (self , route ):
29182940 assert isinstance (route , ApiRoute ), repr (route )
29192941
@@ -2953,6 +2975,40 @@ def generate_route_builder_method(self, route):
29532975 else :
29542976 w .out ('return new %s(this, %s);' , return_class , builder_args )
29552977
2978+ def _emit_request_method_body (self , route , args , arg_names , return_class ,
2979+ fields = (), params = (), method_name = None , delegate = None ):
2980+ """Emit the request method signature and body."""
2981+ w = self .w
2982+ j = self .j
2983+
2984+ if return_class == JavaClass ('void' ):
2985+ boxed_return = JavaClass ('java.lang.Void' )
2986+ else :
2987+ boxed_return = return_class
2988+
2989+ request_class = JavaClass ('com.dropbox.core.DbxRequest' , generics = (boxed_return ,))
2990+ if method_name is None :
2991+ method_name = j .route_method (route ) + 'Request'
2992+ if delegate is None :
2993+ delegate = '%s(%s)' % (j .route_method (route ), arg_names )
2994+
2995+ w .out ('' )
2996+ dbx_request_ref = w .javadoc_ref (JavaClass ('com.dropbox.core.DbxRequest' ))
2997+ if return_class == JavaClass ('void' ):
2998+ returns_doc = "A %s that can be executed later." % dbx_request_ref
2999+ else :
3000+ result_type = w .resolved_class (boxed_return , generics = True )
3001+ returns_doc = "A %s that can be executed later to obtain the {@code %s}." % (
3002+ dbx_request_ref , result_type ,
3003+ )
3004+ doc = "See %s." % w .javadoc_ref (route )
3005+ w .javadoc (doc , params = params , returns = returns_doc )
3006+ with w .block ('public %s %s(%s)' , request_class , method_name , args ):
3007+ if return_class == JavaClass ('void' ):
3008+ w .out ('return () -> { %s; return null; };' , delegate )
3009+ else :
3010+ w .out ('return () -> %s;' , delegate )
3011+
29563012 def translate_error_wrapper (self , route , error_wrapper_var ):
29573013 assert isinstance (route , ApiRoute ), repr (route )
29583014 assert isinstance (error_wrapper_var , str ), repr (error_wrapper_var )
@@ -3848,6 +3904,10 @@ def generate_route_builder(self, route):
38483904 else :
38493905 w .out ('_client.%s(%s);' , j .route_method (route ), ', ' .join (args ))
38503906
3907+ if self .g .args .generate_request :
3908+ self ._emit_request_method_body (route , '' , '' , return_class ,
3909+ method_name = 'startRequest' , delegate = 'start()' )
3910+
38513911 def generate_field_assignment (self , field , lhs = None , rhs = None , allow_default = True ):
38523912 assert isinstance (field , Field ), repr (field )
38533913
0 commit comments