3 # Copyright (c) 2014 Intel Corporation. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
12 from bridge_generator import BridgeGenerator
13 from interface_generator import InterfaceGenerator
14 from java_class import JavaClassLoader
15 from wrapper_generator import WrapperGenerator
17 # Classes list that have to generate bridge and wrap code.
18 CLASSES_TO_BE_PROCESS = [
19 'XWalkExtensionInternal',
21 'XWalkUIClientInternal',
22 'XWalkResourceClientInternal',
23 'XWalkPreferencesInternal',
24 'XWalkNavigationItemInternal',
25 'XWalkNavigationHistoryInternal',
26 'XWalkJavascriptResultHandlerInternal',
27 'XWalkJavascriptResultInternal',
31 def PerformSerialize(output_path, generator):
33 file_name = os.path.join(output_path, generator.GetGeneratedClassFileName())
34 if not os.path.isdir(os.path.dirname(file_name)):
35 os.makedirs(os.path.dirname(file_name))
36 file_handle = open(file_name, 'w')
37 file_handle.write(generator.GetGeneratedCode())
39 print '%s has been generated!' % (file_name)
42 def GenerateBindingForJavaClass(
43 java_data, bridge_output, wrap_output, class_loader):
44 if java_data.class_type == 'interface':
45 interface_generator = InterfaceGenerator(java_data, class_loader)
46 interface_generator.RunTask()
47 PerformSerialize(wrap_output, interface_generator)
49 # Generate Bridge code.
50 bridge_generator = BridgeGenerator(java_data, class_loader)
51 bridge_generator.RunTask()
53 PerformSerialize(bridge_output, bridge_generator)
54 # Generate Wrapper code.
55 wrapper_generator = WrapperGenerator(java_data, class_loader)
56 wrapper_generator.RunTask()
57 PerformSerialize(wrap_output, wrapper_generator)
60 def GenerateBindingForJavaDirectory(input_dir, bridge_output, wrap_output):
61 java_class_loader = JavaClassLoader(input_dir, CLASSES_TO_BE_PROCESS)
62 for input_file in os.listdir(input_dir):
63 input_class_name = input_file.replace('.java', '')
64 if java_class_loader.IsInternalClass(input_class_name):
65 # Load all java classes in first.
66 java_data = java_class_loader.LoadJavaClass(input_class_name)
67 print 'Generate bridge and wrapper code for %s' % input_class_name
68 GenerateBindingForJavaClass(
69 java_data, bridge_output, wrap_output, java_class_loader)
72 def CopyReflectionHelperJava(helper_class, wrap_output):
73 if helper_class is None:
75 f = open(helper_class, 'r')
76 output = os.path.join(wrap_output, os.path.basename(helper_class))
77 if not os.path.isdir(os.path.dirname(output)):
78 os.makedirs(os.path.dirname(output))
79 fo = open(output, 'w')
80 for line in f.read().split('\n'):
81 if line.startswith('package '):
82 fo.write('package org.xwalk.core;\n')
90 if not os.path.isdir(os.path.dirname(path)):
91 os.makedirs(os.path.dirname(path))
97 usage = """Usage: %prog [OPTIONS]
98 This script can generate bridge and wrap source files for given directory.
99 \'input_dir\' is provided as directory containing source files.
101 option_parser = optparse.OptionParser(usage=usage)
102 option_parser.add_option('--input_dir',
103 help= ('Input source file directory which contains'
105 option_parser.add_option('--bridge_output',
106 help=('Output directory where the bridge code'
108 option_parser.add_option('--wrap_output',
109 help=('Output directory where the wrap code'
111 option_parser.add_option('--helper_class',
112 help=('the path of ReflectionHelper java source, '
113 'will copy it to output folder'))
114 option_parser.add_option('--stamp', help='the file to touch on success.')
115 options, _ = option_parser.parse_args(argv)
116 if not options.input_dir:
117 print('Error: Must specify input.')
119 if os.path.isdir(options.bridge_output):
120 shutil.rmtree(options.bridge_output)
121 if os.path.isdir(options.wrap_output):
122 shutil.rmtree(options.wrap_output)
124 if options.input_dir:
125 GenerateBindingForJavaDirectory(options.input_dir,
126 options.bridge_output, options.wrap_output)
127 CopyReflectionHelperJava(options.helper_class,
134 if __name__ == '__main__':
135 sys.exit(main(sys.argv))