Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_java_generator.py

Issue 605653003: Generate a single srcjar as output in of the Java mojom generator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Generate the java files in a temporary directory if --java_srcjar is set. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Generates java source files from a mojom.Module.""" 5 """Generates java source files from a mojom.Module."""
6 6
7 import argparse 7 import argparse
8 import ast 8 import ast
9 import contextlib
9 import os 10 import os
10 import re 11 import re
11 12
12 from jinja2 import contextfilter 13 from jinja2 import contextfilter
13 14
14 import mojom.generate.generator as generator 15 import mojom.generate.generator as generator
15 import mojom.generate.module as mojom 16 import mojom.generate.module as mojom
16 from mojom.generate.template_expander import UseJinja 17 from mojom.generate.template_expander import UseJinja
17 18
18 19
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 if method.response_parameters: 344 if method.response_parameters:
344 return True 345 return True
345 return False 346 return False
346 347
347 def HasMethodWithoutResponse(interface): 348 def HasMethodWithoutResponse(interface):
348 for method in interface.methods: 349 for method in interface.methods:
349 if not method.response_parameters: 350 if not method.response_parameters:
350 return True 351 return True
351 return False 352 return False
352 353
354 @contextlib.contextmanager
355 def TempDir():
ppi 2014/09/25 18:16:49 Do you think these two should be extracted to, say
356 import tempfile
357 import shutil
358 dirname = tempfile.mkdtemp()
359 try:
360 yield dirname
361 finally:
362 shutil.rmtree(dirname)
363
364 def ZipContentInto(directory, root, zip_filename):
365 import zipfile
366 with zipfile.ZipFile(zip_filename, 'w') as zip_file:
367 for dirname, subdirs, files in os.walk(directory):
368 for filename in files:
369 path = os.path.join(dirname, filename)
370 arcname = os.path.relpath(path, root)
371 zip_file.write(path, arcname)
372 print "%s -> %s" % (path, arcname,)
373
353 class Generator(generator.Generator): 374 class Generator(generator.Generator):
354 375
355 java_filters = { 376 java_filters = {
356 'interface_response_name': GetInterfaceResponseName, 377 'interface_response_name': GetInterfaceResponseName,
357 'constant_value': ConstantValue, 378 'constant_value': ConstantValue,
358 'default_value': DefaultValue, 379 'default_value': DefaultValue,
359 'decode_method': DecodeMethod, 380 'decode_method': DecodeMethod,
360 'expression_to_text': ExpressionToText, 381 'expression_to_text': ExpressionToText,
361 'encode_method': EncodeMethod, 382 'encode_method': EncodeMethod,
362 'has_method_with_response': HasMethodWithResponse, 383 'has_method_with_response': HasMethodWithResponse,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 def GenerateInterfaceInternalSource(self, interface): 431 def GenerateInterfaceInternalSource(self, interface):
411 return self.GetJinjaExportsForInterface(interface) 432 return self.GetJinjaExportsForInterface(interface)
412 433
413 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters) 434 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters)
414 def GenerateConstantsSource(self, module): 435 def GenerateConstantsSource(self, module):
415 exports = self.GetJinjaExports() 436 exports = self.GetJinjaExports()
416 exports.update({'main_entity': GetConstantsMainEntityName(module), 437 exports.update({'main_entity': GetConstantsMainEntityName(module),
417 'constants': module.constants}) 438 'constants': module.constants})
418 return exports 439 return exports
419 440
420 def GenerateFiles(self, unparsed_args): 441 def DoGenerateFiles(self):
421 parser = argparse.ArgumentParser() 442 if not os.path.exists(self.output_dir):
422 parser.add_argument('--java_output_directory', dest='java_output_directory') 443 try:
423 args = parser.parse_args(unparsed_args) 444 os.makedirs(self.output_dir)
424 if self.output_dir and args.java_output_directory: 445 except:
425 self.output_dir = os.path.join(args.java_output_directory, 446 # Ignore errors on directory creation.
426 GetPackage(self.module).replace('.', '/')) 447 pass
427 if not os.path.exists(self.output_dir):
428 try:
429 os.makedirs(self.output_dir)
430 except:
431 # Ignore errors on directory creation.
432 pass
433 448
434 # Keep this above the others as .GetStructs() changes the state of the 449 # Keep this above the others as .GetStructs() changes the state of the
435 # module, annotating structs with required information. 450 # module, annotating structs with required information.
436 for struct in self.GetStructs(): 451 for struct in self.GetStructs():
437 self.Write(self.GenerateStructSource(struct), 452 self.Write(self.GenerateStructSource(struct),
438 '%s.java' % GetNameForElement(struct)) 453 '%s.java' % GetNameForElement(struct))
439 454
440 for enum in self.module.enums: 455 for enum in self.module.enums:
441 self.Write(self.GenerateEnumSource(enum), 456 self.Write(self.GenerateEnumSource(enum),
442 '%s.java' % GetNameForElement(enum)) 457 '%s.java' % GetNameForElement(enum))
443 458
444 for interface in self.module.interfaces: 459 for interface in self.module.interfaces:
445 self.Write(self.GenerateInterfaceSource(interface), 460 self.Write(self.GenerateInterfaceSource(interface),
446 '%s.java' % GetNameForElement(interface)) 461 '%s.java' % GetNameForElement(interface))
447 self.Write(self.GenerateInterfaceInternalSource(interface), 462 self.Write(self.GenerateInterfaceInternalSource(interface),
448 '%s_Internal.java' % GetNameForElement(interface)) 463 '%s_Internal.java' % GetNameForElement(interface))
449 464
450 if self.module.constants: 465 if self.module.constants:
451 self.Write(self.GenerateConstantsSource(self.module), 466 self.Write(self.GenerateConstantsSource(self.module),
452 '%s.java' % GetConstantsMainEntityName(self.module)) 467 '%s.java' % GetConstantsMainEntityName(self.module))
453 468
469 def GenerateFiles(self, unparsed_args):
470 parser = argparse.ArgumentParser()
471 parser.add_argument('--java_output_directory', dest='java_output_directory')
472 parser.add_argument('--java_srcjar', dest='java_srcjar',
473 action='store_true',
474 help='output a single srcjar in the regular output '
475 'directory (overrides --java_output_directory)')
476 args = parser.parse_args(unparsed_args)
477 package_path = GetPackage(self.module).replace('.', '/')
478 if args.java_srcjar:
479 # Place the output srcjar in the regular output directory.
480 zip_filename = os.path.join(self.output_dir,
481 "%s.srcjar" % self.module.name)
482 # Generate the files in a temporary directory.
483 with TempDir() as temp_java_root:
484 self.output_dir = os.path.join(temp_java_root, package_path)
485 self.DoGenerateFiles();
486 ZipContentInto(self.output_dir, temp_java_root, zip_filename)
487 else:
488 if self.output_dir and args.java_output_directory:
489 self.output_dir = os.path.join(args.java_output_directory, package_path)
490 self.DoGenerateFiles();
491
454 def GetJinjaParameters(self): 492 def GetJinjaParameters(self):
455 return { 493 return {
456 'lstrip_blocks': True, 494 'lstrip_blocks': True,
457 'trim_blocks': True, 495 'trim_blocks': True,
458 } 496 }
459 497
460 def GetGlobals(self): 498 def GetGlobals(self):
461 return { 499 return {
462 'namespace': self.module.namespace, 500 'namespace': self.module.namespace,
463 'module': self.module, 501 'module': self.module,
464 } 502 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698