1/*
2* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*
5* This code is free software; you can redistribute it and/or modify it
6* under the terms of the GNU General Public License version 2 only, as
7* published by the Free Software Foundation.
8*
9* This code is distributed in the hope that it will be useful, but WITHOUT
10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12* version 2 for more details (a copy is included in the LICENSE file that
13* accompanied this code).
14*
15* You should have received a copy of the GNU General Public License version
16* 2 along with this work; if not, write to the Free Software Foundation,
17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18*
19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20* or visit www.oracle.com if you need additional information or have any
21* questions.
22*
23*/
24
25#ifndef SHARE_CLASSFILE_MODULES_HPP
26#define SHARE_CLASSFILE_MODULES_HPP
27
28#include "memory/allocation.hpp"
29#include "runtime/handles.hpp"
30
31class ModuleEntryTable;
32class Symbol;
33
34class Modules : AllStatic {
35
36public:
37 // define_module defines a module containing the specified packages. It binds the
38 // module to its class loader by creating the ModuleEntry record in the
39 // ClassLoader's ModuleEntry table, and creates PackageEntry records in the class
40 // loader's PackageEntry table. As in JVM_DefineClass the jstring format for all
41 // package names must use "/" and not "."
42 //
43 // IllegalArgumentExceptions are thrown for the following :
44 // * Module's Class loader is not a subclass of java.lang.ClassLoader
45 // * Module's Class loader already has a module with that name
46 // * Module's Class loader has already defined types for any of the module's packages
47 // * Module_name is syntactically bad
48 // * Packages contains an illegal package name
49 // * A package already exists in another module for this class loader
50 // * Module is an unnamed module
51 // * num_packages is negative
52 // * num_packages is non-zero when packages is null
53 // NullPointerExceptions are thrown if module is null.
54 static void define_module(jobject module, jboolean is_open, jstring version,
55 jstring location, const char* const* packages,
56 jsize num_packages, TRAPS);
57
58 // Provides the java.lang.Module for the unnamed module defined
59 // to the boot loader.
60 //
61 // IllegalArgumentExceptions are thrown for the following :
62 // * Module has a name
63 // * Module is not a subclass of java.lang.Module
64 // * Module's class loader is not the boot loader
65 // NullPointerExceptions are thrown if module is null.
66 static void set_bootloader_unnamed_module(jobject module, TRAPS);
67
68 // This either does a qualified export of package in module from_module to module
69 // to_module or, if to_module is null, does an unqualified export of package.
70 // The format for the package name must use "/' not ".".
71 //
72 // Error conditions causing IlegalArgumentException to be throw :
73 // * Module from_module does not exist
74 // * Module to_module is not null and does not exist
75 // * Package is not syntactically correct
76 // * Package is not defined for from_module's class loader
77 // * Package is not in module from_module.
78 static void add_module_exports(jobject from_module, const char* package, jobject to_module, TRAPS);
79
80 // This does a qualified export of package in module from_module to module
81 // to_module. The format for the package name must use "/' not ".".
82 //
83 // Error conditions causing IlegalArgumentException to be throw :
84 // * Module from_module does not exist
85 // * Module to_module does not exist
86 // * Package is not syntactically correct
87 // * Package is not defined for from_module's class loader
88 // * Package is not in module from_module.
89 static void add_module_exports_qualified(jobject from_module, const char* package, jobject to_module, TRAPS);
90
91 // add_reads_module adds module to_module to the list of modules that from_module
92 // can read. If from_module is the same as to_module then this is a no-op.
93 // If to_module is null then from_module is marked as a loose module (meaning that
94 // from_module can read all current and future unnamed modules).
95 // An IllegalArgumentException is thrown if from_module is null or either (non-null)
96 // module does not exist.
97 static void add_reads_module(jobject from_module, jobject to_module, TRAPS);
98
99 // Return the java.lang.Module object for this class object.
100 static jobject get_module(jclass clazz, TRAPS);
101
102 // Return the java.lang.Module object for this class loader and package.
103 // Returns NULL if the class loader has not loaded any classes in the package.
104 // The package should contain /'s, not .'s, as in java/lang, not java.lang.
105 // NullPointerException is thrown if package is null.
106 // IllegalArgumentException is thrown if loader is neither null nor a subtype of
107 // java/lang/ClassLoader.
108 static jobject get_named_module(Handle h_loader, const char* package, TRAPS);
109
110 // If package is defined by loader, return the
111 // java.lang.Module object for the module in which the package is defined.
112 // Returns NULL if package is invalid or not defined by loader.
113 static jobject get_module(Symbol* package_name, Handle h_loader, TRAPS);
114
115 // Marks the specified package as exported to all unnamed modules.
116 // If either module or package is null then NullPointerException is thrown.
117 // If module or package is bad, or module is unnamed, or package is not in
118 // module then IllegalArgumentException is thrown.
119 static void add_module_exports_to_all_unnamed(jobject module, const char* package, TRAPS);
120
121 // Return TRUE if package_name is syntactically valid, false otherwise.
122 static bool verify_package_name(const char *package_name);
123
124 // Return TRUE iff package is defined by loader
125 static bool is_package_defined(Symbol* package_name, Handle h_loader, TRAPS);
126 static ModuleEntryTable* get_module_entry_table(Handle h_loader);
127};
128
129#endif // SHARE_CLASSFILE_MODULES_HPP
130