|
40 | 40 | import _frozen_importlib
|
41 | 41 |
|
42 | 42 |
|
43 |
| -class JavaPackageLoader: |
44 |
| - @staticmethod |
45 |
| - def _make_getattr(modname): |
46 |
| - if modname.startswith("java."): |
47 |
| - modname_wo = modname[len("java."):] + "." |
48 |
| - else: |
49 |
| - modname_wo = None |
50 |
| - modname = modname + "." |
51 |
| - def __getattr__(key, default=None): |
52 |
| - try: |
53 |
| - return type(modname + key) |
54 |
| - except KeyError: |
55 |
| - pass |
56 |
| - if modname_wo: |
57 |
| - try: |
58 |
| - return type(modname_wo + key) |
59 |
| - except KeyError: |
60 |
| - pass |
61 |
| - raise AttributeError(key) |
62 |
| - return __getattr__ |
| 43 | +if sys.graal_python_host_import_enabled: |
| 44 | + class JavaPackageLoader: |
| 45 | + @staticmethod |
| 46 | + def is_java_package(name): |
| 47 | + return any(p.getName().startswith(name) for p in type("java.lang.Package").getPackages()) |
| 48 | + |
| 49 | + @staticmethod |
| 50 | + def _make_getattr(modname): |
| 51 | + modname = modname + "." |
| 52 | + def __getattr__(key, default=None): |
| 53 | + loadname = modname + key |
| 54 | + if JavaPackageLoader.is_java_package(loadname): |
| 55 | + return JavaPackageLoader._create_module(loadname) |
| 56 | + else: |
| 57 | + try: |
| 58 | + return type(modname + key) |
| 59 | + except KeyError: |
| 60 | + raise AttributeError(key) |
| 61 | + return __getattr__ |
| 62 | + |
| 63 | + @staticmethod |
| 64 | + def create_module(spec): |
| 65 | + return JavaPackageLoader._create_module(spec.name) |
63 | 66 |
|
64 |
| - @staticmethod |
65 |
| - def create_module(spec): |
66 |
| - newmod = _frozen_importlib._new_module(spec.name) |
67 |
| - newmod.__getattr__ = JavaPackageLoader._make_getattr(spec.name) |
68 |
| - newmod.__path__ = __path__ |
69 |
| - return newmod |
| 67 | + @staticmethod |
| 68 | + def _create_module(name): |
| 69 | + newmod = _frozen_importlib._new_module(name) |
| 70 | + newmod.__getattr__ = JavaPackageLoader._make_getattr(name) |
| 71 | + newmod.__path__ = __path__ |
| 72 | + return newmod |
70 | 73 |
|
71 |
| - @staticmethod |
72 |
| - def exec_module(module): |
73 |
| - pass |
| 74 | + @staticmethod |
| 75 | + def exec_module(module): |
| 76 | + pass |
74 | 77 |
|
75 | 78 |
|
76 |
| -class JavaTypeLoader: |
77 |
| - @staticmethod |
78 |
| - def create_module(spec): |
79 |
| - pass |
| 79 | + class JavaTypeLoader: |
| 80 | + @staticmethod |
| 81 | + def create_module(spec): |
| 82 | + pass |
80 | 83 |
|
81 |
| - @staticmethod |
82 |
| - def exec_module(module): |
83 |
| - try: |
| 84 | + @staticmethod |
| 85 | + def exec_module(module): |
84 | 86 | sys.modules[module.__name__] = type(module.__name__)
|
85 |
| - except KeyError: |
86 |
| - if module.__name__.startswith("java."): |
87 |
| - sys.modules[module.__name__] = type(module.__name__[len("java."):]) |
88 |
| - else: |
89 |
| - raise |
90 | 87 |
|
91 | 88 |
|
92 |
| -class JavaImportFinder: |
93 |
| - @staticmethod |
94 |
| - def find_spec(fullname, path, target=None): |
95 |
| - if path and path == __path__: |
96 |
| - if fullname.rpartition('.')[2].islower(): |
| 89 | + class JavaImportFinder: |
| 90 | + @staticmethod |
| 91 | + def find_spec(fullname, path, target=None): |
| 92 | + if JavaPackageLoader.is_java_package(fullname): |
97 | 93 | return _frozen_importlib.ModuleSpec(fullname, JavaPackageLoader, is_package=True)
|
98 | 94 | else:
|
99 |
| - return _frozen_importlib.ModuleSpec(fullname, JavaTypeLoader, is_package=False) |
| 95 | + try: |
| 96 | + type(fullname) |
| 97 | + return _frozen_importlib.ModuleSpec(fullname, JavaTypeLoader, is_package=False) |
| 98 | + except KeyError: |
| 99 | + pass |
100 | 100 |
|
101 | 101 |
|
102 |
| -sys.meta_path.append(JavaImportFinder) |
| 102 | + sys.meta_path.append(JavaImportFinder) |
| 103 | + __getattr__ = JavaPackageLoader._make_getattr("java") |
0 commit comments