Chromium Code Reviews| Index: mojo/public/tools/bindings/generators/mojom_java_generator.py |
| diff --git a/mojo/public/tools/bindings/generators/mojom_java_generator.py b/mojo/public/tools/bindings/generators/mojom_java_generator.py |
| index 8b4fd25e0ce51a31782e485179dcc264ca5ff801..3abfa3755f6286d98b639d5fdeb51eb3d2bd61fe 100644 |
| --- a/mojo/public/tools/bindings/generators/mojom_java_generator.py |
| +++ b/mojo/public/tools/bindings/generators/mojom_java_generator.py |
| @@ -6,6 +6,7 @@ |
| import argparse |
| import ast |
| +import contextlib |
| import os |
| import re |
| @@ -350,6 +351,25 @@ def HasMethodWithoutResponse(interface): |
| return True |
| return False |
| +@contextlib.contextmanager |
| +def TempDir(): |
| + import tempfile |
| + import shutil |
|
qsr
2014/09/26 15:57:12
import should not be local.
ppi
2014/09/26 16:12:16
Done.
|
| + dirname = tempfile.mkdtemp() |
| + try: |
| + yield dirname |
| + finally: |
| + shutil.rmtree(dirname) |
| + |
| +def ZipContentInto(directory, root, zip_filename): |
|
qsr
2014/09/26 15:57:12
You can only pass root here, and do a traversal fr
ppi
2014/09/26 16:12:16
Done.
ppi
2014/09/26 16:12:16
Done.
|
| + import zipfile |
|
qsr
2014/09/26 15:57:12
Same
ppi
2014/09/26 16:12:16
Done.
|
| + with zipfile.ZipFile(zip_filename, 'w') as zip_file: |
| + for dirname, subdirs, files in os.walk(directory): |
|
qsr
2014/09/26 15:57:12
If you do not use a variable, use _.
ppi
2014/09/26 16:12:16
Done.
|
| + for filename in files: |
| + path = os.path.join(dirname, filename) |
| + arcname = os.path.relpath(path, root) |
|
qsr
2014/09/26 15:57:12
What does arcname mean? something more descriptive
ppi
2014/09/26 16:12:16
Done.
|
| + zip_file.write(path, arcname) |
| + |
| class Generator(generator.Generator): |
| java_filters = { |
| @@ -417,19 +437,13 @@ class Generator(generator.Generator): |
| 'constants': module.constants}) |
| return exports |
| - def GenerateFiles(self, unparsed_args): |
| - parser = argparse.ArgumentParser() |
| - parser.add_argument('--java_output_directory', dest='java_output_directory') |
| - args = parser.parse_args(unparsed_args) |
| - if self.output_dir and args.java_output_directory: |
| - self.output_dir = os.path.join(args.java_output_directory, |
| - GetPackage(self.module).replace('.', '/')) |
| - if not os.path.exists(self.output_dir): |
| - try: |
| - os.makedirs(self.output_dir) |
| - except: |
| - # Ignore errors on directory creation. |
| - pass |
| + def DoGenerateFiles(self): |
| + if not os.path.exists(self.output_dir): |
| + try: |
| + os.makedirs(self.output_dir) |
| + except: |
| + # Ignore errors on directory creation. |
| + pass |
| # Keep this above the others as .GetStructs() changes the state of the |
| # module, annotating structs with required information. |
| @@ -451,6 +465,26 @@ class Generator(generator.Generator): |
| self.Write(self.GenerateConstantsSource(self.module), |
| '%s.java' % GetConstantsMainEntityName(self.module)) |
| + def GenerateFiles(self, unparsed_args): |
| + parser = argparse.ArgumentParser() |
| + parser.add_argument('--java_output_directory', dest='java_output_directory') |
| + args = parser.parse_args(unparsed_args) |
| + package_path = GetPackage(self.module).replace('.', '/') |
| + |
| + if args.java_output_directory: |
| + # If requested, generate the java files directly into indicated directory. |
| + self.output_dir = os.path.join(args.java_output_directory, package_path) |
| + self.DoGenerateFiles(); |
| + else: |
|
qsr
2014/09/26 15:57:12
You should always generate the srcjar, this is the
ppi
2014/09/26 16:12:17
Done.
|
| + # Otherwise, generate the java files in a temporary directory and place a |
| + # single srcjar in the output directory. |
| + zip_filename = os.path.join(self.output_dir, |
| + "%s.srcjar" % self.module.name) |
| + with TempDir() as temp_java_root: |
| + self.output_dir = os.path.join(temp_java_root, package_path) |
| + self.DoGenerateFiles(); |
| + ZipContentInto(self.output_dir, temp_java_root, zip_filename) |
| + |
| def GetJinjaParameters(self): |
| return { |
| 'lstrip_blocks': True, |