Upstream version 9.37.195.0
[platform/framework/web/crosswalk.git] / src / xwalk / tools / reflection_generator / reflection_generator.py
1 #!/usr/bin/env python
2
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.
6
7 import optparse
8 import os
9 import shutil
10 import sys
11
12 from bridge_generator import BridgeGenerator
13 from interface_generator import InterfaceGenerator
14 from java_class import JavaClassLoader
15 from wrapper_generator import WrapperGenerator
16
17 # Classes list that have to generate bridge and wrap code.
18 CLASSES_TO_BE_PROCESS = [
19   'XWalkExtensionInternal',
20   'XWalkViewInternal',
21   'XWalkUIClientInternal',
22   'XWalkResourceClientInternal',
23   'XWalkPreferencesInternal',
24   'XWalkNavigationItemInternal',
25   'XWalkNavigationHistoryInternal',
26   'XWalkJavascriptResultHandlerInternal',
27   'XWalkJavascriptResultInternal',
28 ]
29
30
31 def PerformSerialize(output_path, generator):
32   # Serialize the code.
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())
38   file_handle.close()
39   print '%s has been generated!' % (file_name)
40
41
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)
48   else:
49     # Generate Bridge code.
50     bridge_generator = BridgeGenerator(java_data, class_loader)
51     bridge_generator.RunTask()
52     # Serialize.
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)
58
59
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)
70
71
72 def CopyReflectionHelperJava(helper_class, wrap_output):
73   if helper_class is None:
74     return
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')
83     else:
84       fo.write(line + '\n')
85   fo.close()
86   f.close()
87
88
89 def Touch(path):
90   if not os.path.isdir(os.path.dirname(path)):
91     os.makedirs(os.path.dirname(path))
92   with open(path, 'a'):
93     os.utime(path, None)
94
95
96 def main(argv):
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.
100   """
101   option_parser = optparse.OptionParser(usage=usage)
102   option_parser.add_option('--input_dir',
103                            help= ('Input source file directory which contains'
104                                   'input files'))
105   option_parser.add_option('--bridge_output',
106                            help=('Output directory where the bridge code'
107                                  'is placed.'))
108   option_parser.add_option('--wrap_output',
109                            help=('Output directory where the wrap code'
110                                 'is placed.'))
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.')
118     return 1
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)
123
124   if options.input_dir:
125     GenerateBindingForJavaDirectory(options.input_dir,
126         options.bridge_output, options.wrap_output)
127     CopyReflectionHelperJava(options.helper_class,
128         options.wrap_output)
129
130   if options.stamp:
131     Touch(options.stamp)
132
133
134 if __name__ == '__main__':
135   sys.exit(main(sys.argv))