< prev index next >
src/java.base/share/classes/jdk/internal/module/ModuleInfo.java
Print this page
@@ -87,22 +87,28 @@
* that represent the non-standard class file attributes that are read from
* the class file.
*/
public static final class Attributes {
private final ModuleDescriptor descriptor;
+ private final ModuleTarget target;
private final ModuleHashes recordedHashes;
private final ModuleResolution moduleResolution;
Attributes(ModuleDescriptor descriptor,
+ ModuleTarget target,
ModuleHashes recordedHashes,
ModuleResolution moduleResolution) {
this.descriptor = descriptor;
+ this.target = target;
this.recordedHashes = recordedHashes;
this.moduleResolution = moduleResolution;
}
public ModuleDescriptor descriptor() {
return descriptor;
}
+ public ModuleTarget target() {
+ return target;
+ }
public ModuleHashes recordedHashes() {
return recordedHashes;
}
public ModuleResolution moduleResolution() {
return moduleResolution;
@@ -219,12 +225,12 @@
Set<String> attributes = new HashSet<>();
Builder builder = null;
Set<String> allPackages = null;
String mainClass = null;
- String[] osValues = null;
- ModuleHashes hashes = null;
+ ModuleTarget moduleTarget = null;
+ ModuleHashes moduelHashes = null;
ModuleResolution moduleResolution = null;
for (int i = 0; i < attributes_count ; i++) {
int name_index = in.readUnsignedShort();
String attribute_name = cpool.getUtf8(name_index);
@@ -249,16 +255,16 @@
case MODULE_MAIN_CLASS :
mainClass = readModuleMainClassAttribute(in, cpool);
break;
case MODULE_TARGET :
- osValues = readModuleTargetAttribute(in, cpool);
+ moduleTarget = readModuleTargetAttribute(in, cpool);
break;
case MODULE_HASHES :
if (parseHashes) {
- hashes = readModuleHashesAttribute(in, cpool);
+ moduelHashes = readModuleHashesAttribute(in, cpool);
} else {
in.skipBytes(length);
}
break;
@@ -280,19 +286,14 @@
// the Module attribute is required
if (builder == null) {
throw invalidModuleDescriptor(MODULE + " attribute not found");
}
- // ModuleMainClass and ModuleTarget attributes
+ // ModuleMainClass attribute
if (mainClass != null) {
builder.mainClass(mainClass);
}
- if (osValues != null) {
- if (osValues[0] != null) builder.osName(osValues[0]);
- if (osValues[1] != null) builder.osArch(osValues[1]);
- if (osValues[2] != null) builder.osVersion(osValues[2]);
- }
// If the ModulePackages attribute is not present then the packageFinder
// is used to find the set of packages
boolean usedPackageFinder = false;
if (allPackages == null && packageFinder != null) {
@@ -321,11 +322,14 @@
}
builder.packages(allPackages);
}
ModuleDescriptor descriptor = builder.build();
- return new Attributes(descriptor, hashes, moduleResolution);
+ return new Attributes(descriptor,
+ moduleTarget,
+ moduelHashes,
+ moduleResolution);
}
/**
* Reads the Module attribute, returning the ModuleDescriptor.Builder to
* build the corresponding ModuleDescriptor.
@@ -420,11 +424,15 @@
int exports_to_count = in.readUnsignedShort();
if (exports_to_count > 0) {
Set<String> targets = new HashSet<>(exports_to_count);
for (int j=0; j<exports_to_count; j++) {
int exports_to_index = in.readUnsignedShort();
- targets.add(cpool.getModuleName(exports_to_index));
+ String target = cpool.getModuleName(exports_to_index);
+ if (!targets.add(target)) {
+ throw invalidModuleDescriptor(pkg + " exported to "
+ + target + " more than once");
+ }
}
builder.exports(mods, pkg, targets);
} else {
builder.exports(mods, pkg);
}
@@ -456,11 +464,15 @@
int open_to_count = in.readUnsignedShort();
if (open_to_count > 0) {
Set<String> targets = new HashSet<>(open_to_count);
for (int j=0; j<open_to_count; j++) {
int opens_to_index = in.readUnsignedShort();
- targets.add(cpool.getModuleName(opens_to_index));
+ String target = cpool.getModuleName(opens_to_index);
+ if (!targets.add(target)) {
+ throw invalidModuleDescriptor(pkg + " opened to "
+ + target + " more than once");
+ }
}
builder.opens(mods, pkg, targets);
} else {
builder.opens(mods, pkg);
}
@@ -484,11 +496,14 @@
int with_count = in.readUnsignedShort();
List<String> providers = new ArrayList<>(with_count);
for (int j=0; j<with_count; j++) {
index = in.readUnsignedShort();
String pn = cpool.getClassName(index);
- providers.add(pn);
+ if (!providers.add(pn)) {
+ throw invalidModuleDescriptor(sn + " provides " + pn
+ + " more than once");
+ }
}
builder.provides(sn, providers);
}
}
@@ -526,28 +541,25 @@
}
/**
* Reads the ModuleTarget attribute
*/
- private String[] readModuleTargetAttribute(DataInput in, ConstantPool cpool)
+ private ModuleTarget readModuleTargetAttribute(DataInput in, ConstantPool cpool)
throws IOException
{
- String[] values = new String[3];
+ String osName = null;
+ String osArch = null;
int name_index = in.readUnsignedShort();
if (name_index != 0)
- values[0] = cpool.getUtf8(name_index);
+ osName = cpool.getUtf8(name_index);
int arch_index = in.readUnsignedShort();
if (arch_index != 0)
- values[1] = cpool.getUtf8(arch_index);
-
- int version_index = in.readUnsignedShort();
- if (version_index != 0)
- values[2] = cpool.getUtf8(version_index);
+ osArch = cpool.getUtf8(arch_index);
- return values;
+ return new ModuleTarget(osName, osArch);
}
/**
* Reads the ModuleHashes attribute
< prev index next >