1# Copyright 2019 The Meson development team
2
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6
7#     http://www.apache.org/licenses/LICENSE-2.0
8
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14from mesonbuild.templates.sampleimpl import SampleImpl
15import re
16
17
18hello_java_template = '''
19
20public class {class_name} {{
21    final static String PROJECT_NAME = "{project_name}";
22
23    public static void main (String args[]) {{
24        if(args.length != 0) {{
25            System.out.println(args + " takes no arguments.");
26            System.exit(0);
27        }}
28        System.out.println("This is project " + PROJECT_NAME + ".");
29        System.exit(0);
30    }}
31}}
32
33'''
34
35hello_java_meson_template = '''project('{project_name}', 'java',
36  version : '{version}',
37  default_options : ['warning_level=3'])
38
39exe = jar('{exe_name}', '{source_name}',
40  main_class : '{exe_name}',
41  install : true)
42
43test('basic', exe)
44'''
45
46lib_java_template = '''
47
48public class {class_name} {{
49    final static int number = 6;
50
51    public final int get_number() {{
52      return number;
53    }}
54}}
55
56'''
57
58lib_java_test_template = '''
59
60public class {class_test} {{
61    public static void main (String args[]) {{
62        if(args.length != 0) {{
63            System.out.println(args + " takes no arguments.");
64            System.exit(1);
65        }}
66
67        {class_name} c = new {class_name}();
68        Boolean result = true;
69        System.exit(result.compareTo(c.get_number() != 6));
70    }}
71}}
72
73'''
74
75lib_java_meson_template = '''project('{project_name}', 'java',
76  version : '{version}',
77  default_options : ['warning_level=3'])
78
79jarlib = jar('{class_name}', '{source_file}',
80  main_class : '{class_name}',
81  install : true,
82)
83
84test_jar = jar('{class_test}', '{test_source_file}',
85  main_class : '{class_test}',
86  link_with : jarlib)
87test('{test_name}', test_jar)
88
89# Make this library usable as a Meson subproject.
90{ltoken}_dep = declare_dependency(
91  include_directories: include_directories('.'),
92  link_with : jarlib)
93'''
94
95
96class JavaProject(SampleImpl):
97    def __init__(self, options):
98        super().__init__()
99        self.name = options.name
100        self.version = options.version
101
102    def create_executable(self) -> None:
103        lowercase_token = re.sub(r'[^a-z0-9]', '_', self.name.lower())
104        uppercase_token = lowercase_token.upper()
105        class_name = uppercase_token[0] + lowercase_token[1:]
106        source_name = uppercase_token[0] + lowercase_token[1:] + '.java'
107        open(source_name, 'w', encoding='utf-8').write(
108            hello_java_template.format(project_name=self.name,
109                                       class_name=class_name))
110        open('meson.build', 'w', encoding='utf-8').write(
111            hello_java_meson_template.format(project_name=self.name,
112                                             exe_name=class_name,
113                                             source_name=source_name,
114                                             version=self.version))
115
116    def create_library(self) -> None:
117        lowercase_token = re.sub(r'[^a-z0-9]', '_', self.name.lower())
118        uppercase_token = lowercase_token.upper()
119        class_name = uppercase_token[0] + lowercase_token[1:]
120        class_test = uppercase_token[0] + lowercase_token[1:] + '_test'
121        lib_java_name = uppercase_token[0] + lowercase_token[1:] + '.java'
122        test_java_name = uppercase_token[0] + lowercase_token[1:] + '_test.java'
123        kwargs = {'utoken': uppercase_token,
124                  'ltoken': lowercase_token,
125                  'class_test': class_test,
126                  'class_name': class_name,
127                  'source_file': lib_java_name,
128                  'test_source_file': test_java_name,
129                  'project_name': self.name,
130                  'lib_name': lowercase_token,
131                  'test_name': lowercase_token,
132                  'version': self.version,
133                  }
134        open(lib_java_name, 'w', encoding='utf-8').write(lib_java_template.format(**kwargs))
135        open(test_java_name, 'w', encoding='utf-8').write(lib_java_test_template.format(**kwargs))
136        open('meson.build', 'w', encoding='utf-8').write(lib_java_meson_template.format(**kwargs))
137