< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java
Print this page
*** 33,43 ****
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import jdk.internal.jimage.decompressor.CompressedResourceHeader;
! import jdk.internal.loader.ResourceHelper;
import jdk.tools.jlink.plugin.ResourcePool;
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
import jdk.tools.jlink.plugin.ResourcePoolEntry;
import jdk.tools.jlink.plugin.ResourcePoolModule;
import jdk.tools.jlink.plugin.ResourcePoolModuleView;
--- 33,46 ----
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import jdk.internal.jimage.decompressor.CompressedResourceHeader;
! import jdk.internal.module.Resources;
! import jdk.internal.module.ModuleInfo;
! import jdk.internal.module.ModuleInfo.Attributes;
! import jdk.internal.module.ModuleTarget;
import jdk.tools.jlink.plugin.ResourcePool;
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
import jdk.tools.jlink.plugin.ResourcePoolEntry;
import jdk.tools.jlink.plugin.ResourcePoolModule;
import jdk.tools.jlink.plugin.ResourcePoolModuleView;
*** 45,83 ****
/**
* A manager for pool of resources.
*/
public class ResourcePoolManager {
! // utility to read ModuleDescriptor of the given ResourcePoolModule
! static ModuleDescriptor readModuleDescriptor(ResourcePoolModule mod) {
String p = "/" + mod.name() + "/module-info.class";
Optional<ResourcePoolEntry> content = mod.findEntry(p);
if (!content.isPresent()) {
throw new PluginException("module-info.class not found for " +
mod.name() + " module");
}
ByteBuffer bb = ByteBuffer.wrap(content.get().contentBytes());
try {
! return ModuleDescriptor.read(bb);
} catch (RuntimeException re) {
! throw new RuntimeException("module descriptor cannot be read for " + mod.name(), re);
}
}
/**
* Returns true if a resource has an effective package.
*/
public static boolean isNamedPackageResource(String path) {
return (path.endsWith(".class") && !path.endsWith("module-info.class")) ||
! !ResourceHelper.isSimpleResource(path);
}
class ResourcePoolModuleImpl implements ResourcePoolModule {
final Map<String, ResourcePoolEntry> moduleContent = new LinkedHashMap<>();
// lazily initialized
private ModuleDescriptor descriptor;
final String name;
private ResourcePoolModuleImpl(String name) {
this.name = name;
}
--- 48,88 ----
/**
* A manager for pool of resources.
*/
public class ResourcePoolManager {
! // utility to read Module Attributes of the given ResourcePoolModule
! static Attributes readModuleAttributes(ResourcePoolModule mod) {
String p = "/" + mod.name() + "/module-info.class";
Optional<ResourcePoolEntry> content = mod.findEntry(p);
if (!content.isPresent()) {
throw new PluginException("module-info.class not found for " +
mod.name() + " module");
}
ByteBuffer bb = ByteBuffer.wrap(content.get().contentBytes());
try {
! return ModuleInfo.read(bb, null);
} catch (RuntimeException re) {
! throw new RuntimeException("module info cannot be read for " + mod.name(), re);
}
}
/**
* Returns true if a resource has an effective package.
*/
public static boolean isNamedPackageResource(String path) {
return (path.endsWith(".class") && !path.endsWith("module-info.class")) ||
! Resources.canEncapsulate(path);
}
class ResourcePoolModuleImpl implements ResourcePoolModule {
final Map<String, ResourcePoolEntry> moduleContent = new LinkedHashMap<>();
// lazily initialized
private ModuleDescriptor descriptor;
+ private ModuleTarget target;
+
final String name;
private ResourcePoolModuleImpl(String name) {
this.name = name;
}
*** 98,114 ****
return Optional.ofNullable(moduleContent.get(path));
}
@Override
public ModuleDescriptor descriptor() {
! if (descriptor == null) {
! descriptor = readModuleDescriptor(this);
! }
return descriptor;
}
@Override
public Set<String> packages() {
Set<String> pkgs = new HashSet<>();
moduleContent.values().stream()
.filter(m -> m.type() == ResourcePoolEntry.Type.CLASS_OR_RESOURCE)
.forEach(res -> {
--- 103,137 ----
return Optional.ofNullable(moduleContent.get(path));
}
@Override
public ModuleDescriptor descriptor() {
! initModuleAttributes();
return descriptor;
}
@Override
+ public String osName() {
+ initModuleAttributes();
+ return target != null? target.osName() : null;
+ }
+
+ @Override
+ public String osArch() {
+ initModuleAttributes();
+ return target != null? target.osArch() : null;
+ }
+
+ private void initModuleAttributes() {
+ if (this.descriptor == null) {
+ Attributes attr = readModuleAttributes(this);
+ this.descriptor = attr.descriptor();
+ this.target = attr.target();
+ }
+ }
+
+ @Override
public Set<String> packages() {
Set<String> pkgs = new HashSet<>();
moduleContent.values().stream()
.filter(m -> m.type() == ResourcePoolEntry.Type.CLASS_OR_RESOURCE)
.forEach(res -> {
< prev index next >