mirror of
https://github.com/apple/pkl.git
synced 2026-03-26 19:11:12 +01:00
More external reader refinements (#766)
* org.pkl.core.Readers -> org.pkl.core.Closeables * Remove coupling between pkl.core.module/resource and pkl.core.messaging
This commit is contained in:
@@ -15,8 +15,8 @@
|
||||
*/
|
||||
package org.pkl.core;
|
||||
|
||||
public final class Readers {
|
||||
private Readers() {}
|
||||
public final class Closeables {
|
||||
private Closeables() {}
|
||||
|
||||
/** Closes the given readers, ignoring any exceptions. */
|
||||
public static void closeQuietly(Iterable<? extends AutoCloseable> readers) {
|
||||
@@ -17,8 +17,6 @@ package org.pkl.core.externalreader;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;
|
||||
import org.pkl.core.messaging.Messages.ModuleReaderSpec;
|
||||
import org.pkl.core.messaging.Messages.ResourceReaderSpec;
|
||||
import org.pkl.core.module.ExternalModuleResolver;
|
||||
import org.pkl.core.resource.ExternalResourceResolver;
|
||||
import org.pkl.core.util.Nullable;
|
||||
@@ -58,8 +56,7 @@ public interface ExternalReaderProcess extends AutoCloseable {
|
||||
* @throws IllegalStateException if this process has already been {@linkplain #close closed}
|
||||
* @throws IOException if an I/O error occurs
|
||||
*/
|
||||
@Nullable
|
||||
ModuleReaderSpec getModuleReaderSpec(String scheme) throws IOException;
|
||||
ExternalModuleResolver.@Nullable Spec getModuleReaderSpec(String scheme) throws IOException;
|
||||
|
||||
/**
|
||||
* Returns the spec, if available, of this process's resource reader with the given scheme.
|
||||
@@ -67,8 +64,7 @@ public interface ExternalReaderProcess extends AutoCloseable {
|
||||
* @throws IllegalStateException if this process has already been {@linkplain #close closed}
|
||||
* @throws IOException if an I/O error occurs
|
||||
*/
|
||||
@Nullable
|
||||
ResourceReaderSpec getResourceReaderSpec(String scheme) throws IOException;
|
||||
ExternalResourceResolver.@Nullable Spec getResourceReaderSpec(String scheme) throws IOException;
|
||||
|
||||
/**
|
||||
* Closes this process, releasing any associated resources.
|
||||
|
||||
@@ -32,8 +32,6 @@ import org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;
|
||||
import org.pkl.core.externalreader.ExternalReaderMessages.*;
|
||||
import org.pkl.core.messaging.MessageTransport;
|
||||
import org.pkl.core.messaging.MessageTransports;
|
||||
import org.pkl.core.messaging.Messages.ModuleReaderSpec;
|
||||
import org.pkl.core.messaging.Messages.ResourceReaderSpec;
|
||||
import org.pkl.core.messaging.ProtocolException;
|
||||
import org.pkl.core.module.ExternalModuleResolver;
|
||||
import org.pkl.core.resource.ExternalResourceResolver;
|
||||
@@ -47,9 +45,9 @@ final class ExternalReaderProcessImpl implements ExternalReaderProcess {
|
||||
|
||||
private final ExternalReader spec;
|
||||
private final @Nullable String logPrefix;
|
||||
private final Map<String, Future<@Nullable ModuleReaderSpec>> initializeModuleReaderResponses =
|
||||
new ConcurrentHashMap<>();
|
||||
private final Map<String, Future<@Nullable ResourceReaderSpec>>
|
||||
private final Map<String, Future<ExternalModuleResolver.@Nullable Spec>>
|
||||
initializeModuleReaderResponses = new ConcurrentHashMap<>();
|
||||
private final Map<String, Future<ExternalResourceResolver.@Nullable Spec>>
|
||||
initializeResourceReaderResponses = new ConcurrentHashMap<>();
|
||||
private final Random requestIdGenerator = new Random();
|
||||
|
||||
@@ -191,12 +189,13 @@ final class ExternalReaderProcessImpl implements ExternalReaderProcess {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ModuleReaderSpec getModuleReaderSpec(String uriScheme) throws IOException {
|
||||
public ExternalModuleResolver.@Nullable Spec getModuleReaderSpec(String uriScheme)
|
||||
throws IOException {
|
||||
return MessageTransports.resolveFuture(
|
||||
initializeModuleReaderResponses.computeIfAbsent(
|
||||
uriScheme,
|
||||
(scheme) -> {
|
||||
var future = new CompletableFuture<@Nullable ModuleReaderSpec>();
|
||||
var future = new CompletableFuture<ExternalModuleResolver.@Nullable Spec>();
|
||||
var request =
|
||||
new InitializeModuleReaderRequest(requestIdGenerator.nextLong(), scheme);
|
||||
try {
|
||||
@@ -219,12 +218,13 @@ final class ExternalReaderProcessImpl implements ExternalReaderProcess {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ResourceReaderSpec getResourceReaderSpec(String uriScheme) throws IOException {
|
||||
public ExternalResourceResolver.@Nullable Spec getResourceReaderSpec(String uriScheme)
|
||||
throws IOException {
|
||||
return MessageTransports.resolveFuture(
|
||||
initializeResourceReaderResponses.computeIfAbsent(
|
||||
uriScheme,
|
||||
(scheme) -> {
|
||||
var future = new CompletableFuture<@Nullable ResourceReaderSpec>();
|
||||
var future = new CompletableFuture<ExternalResourceResolver.@Nullable Spec>();
|
||||
var request =
|
||||
new InitializeResourceReaderRequest(requestIdGenerator.nextLong(), scheme);
|
||||
try {
|
||||
|
||||
@@ -20,17 +20,20 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import org.pkl.core.messaging.Message.*;
|
||||
import org.pkl.core.module.ExternalModuleResolver;
|
||||
import org.pkl.core.module.PathElement;
|
||||
import org.pkl.core.resource.ExternalResourceResolver;
|
||||
import org.pkl.core.util.Nullable;
|
||||
|
||||
public final class Messages {
|
||||
private Messages() {}
|
||||
|
||||
public record ModuleReaderSpec(
|
||||
String scheme, boolean hasHierarchicalUris, boolean isLocal, boolean isGlobbable) {}
|
||||
String scheme, boolean hasHierarchicalUris, boolean isLocal, boolean isGlobbable)
|
||||
implements ExternalModuleResolver.Spec {}
|
||||
|
||||
public record ResourceReaderSpec(
|
||||
String scheme, boolean hasHierarchicalUris, boolean isGlobbable) {}
|
||||
public record ResourceReaderSpec(String scheme, boolean hasHierarchicalUris, boolean isGlobbable)
|
||||
implements ExternalResourceResolver.Spec {}
|
||||
|
||||
public record ListResourcesRequest(long requestId, long evaluatorId, URI uri)
|
||||
implements Server.Request {
|
||||
|
||||
@@ -35,6 +35,17 @@ import org.pkl.core.messaging.Messages.ReadModuleResponse;
|
||||
import org.pkl.core.messaging.ProtocolException;
|
||||
|
||||
public class ExternalModuleResolver {
|
||||
|
||||
public interface Spec {
|
||||
boolean hasHierarchicalUris();
|
||||
|
||||
boolean isGlobbable();
|
||||
|
||||
boolean isLocal();
|
||||
|
||||
String scheme();
|
||||
}
|
||||
|
||||
private final MessageTransport transport;
|
||||
private final long evaluatorId;
|
||||
private final Map<URI, Future<String>> readResponses = new ConcurrentHashMap<>();
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.ServiceLoader;
|
||||
import javax.annotation.concurrent.GuardedBy;
|
||||
import org.pkl.core.Readers;
|
||||
import org.pkl.core.Closeables;
|
||||
import org.pkl.core.externalreader.ExternalReaderProcess;
|
||||
import org.pkl.core.externalreader.ExternalReaderProcessException;
|
||||
import org.pkl.core.util.ErrorMessages;
|
||||
@@ -102,7 +102,7 @@ public final class ModuleKeyFactories {
|
||||
/**
|
||||
* Closes the given factories, ignoring any exceptions.
|
||||
*
|
||||
* @deprecated Replaced by {@link Readers#closeQuietly}.
|
||||
* @deprecated Replaced by {@link Closeables#closeQuietly}.
|
||||
*/
|
||||
@Deprecated(since = "0.27.0", forRemoval = true)
|
||||
public static void closeQuietly(Iterable<ModuleKeyFactory> factories) {
|
||||
@@ -267,7 +267,7 @@ public final class ModuleKeyFactories {
|
||||
@GuardedBy("this")
|
||||
private ExternalModuleResolver resolver;
|
||||
|
||||
public ExternalProcess(String scheme, ExternalReaderProcess process, long evaluatorId) {
|
||||
ExternalProcess(String scheme, ExternalReaderProcess process, long evaluatorId) {
|
||||
this.scheme = scheme;
|
||||
this.process = process;
|
||||
this.evaluatorId = evaluatorId;
|
||||
@@ -283,8 +283,7 @@ public final class ModuleKeyFactories {
|
||||
return resolver;
|
||||
}
|
||||
|
||||
public Optional<ModuleKey> create(URI uri)
|
||||
throws URISyntaxException, ExternalReaderProcessException, IOException {
|
||||
public Optional<ModuleKey> create(URI uri) throws ExternalReaderProcessException, IOException {
|
||||
if (!scheme.equalsIgnoreCase(uri.getScheme())) return Optional.empty();
|
||||
|
||||
var spec = process.getModuleReaderSpec(scheme);
|
||||
|
||||
@@ -30,7 +30,6 @@ import java.util.Map;
|
||||
import org.pkl.core.SecurityManager;
|
||||
import org.pkl.core.SecurityManagerException;
|
||||
import org.pkl.core.externalreader.ExternalReaderProcessException;
|
||||
import org.pkl.core.messaging.Messages.ModuleReaderSpec;
|
||||
import org.pkl.core.packages.Dependency;
|
||||
import org.pkl.core.packages.Dependency.LocalDependency;
|
||||
import org.pkl.core.packages.PackageAssetUri;
|
||||
@@ -131,7 +130,7 @@ public final class ModuleKeys {
|
||||
|
||||
/** Creates a module key for an externally read module. */
|
||||
public static ModuleKey externalResolver(
|
||||
URI uri, ModuleReaderSpec spec, ExternalModuleResolver resolver) {
|
||||
URI uri, ExternalModuleResolver.Spec spec, ExternalModuleResolver resolver) {
|
||||
return new ExternalResolver(uri, spec, resolver);
|
||||
}
|
||||
|
||||
@@ -779,10 +778,10 @@ public final class ModuleKeys {
|
||||
public static class ExternalResolver implements ModuleKey {
|
||||
|
||||
private final URI uri;
|
||||
private final ModuleReaderSpec spec;
|
||||
private final ExternalModuleResolver.Spec spec;
|
||||
private final ExternalModuleResolver resolver;
|
||||
|
||||
public ExternalResolver(URI uri, ModuleReaderSpec spec, ExternalModuleResolver resolver) {
|
||||
ExternalResolver(URI uri, ExternalModuleResolver.Spec spec, ExternalModuleResolver resolver) {
|
||||
this.uri = uri;
|
||||
this.spec = spec;
|
||||
this.resolver = resolver;
|
||||
|
||||
@@ -34,6 +34,15 @@ import org.pkl.core.messaging.ProtocolException;
|
||||
import org.pkl.core.module.PathElement;
|
||||
|
||||
public class ExternalResourceResolver {
|
||||
|
||||
public interface Spec {
|
||||
boolean hasHierarchicalUris();
|
||||
|
||||
boolean isGlobbable();
|
||||
|
||||
String scheme();
|
||||
}
|
||||
|
||||
private final MessageTransport transport;
|
||||
private final long evaluatorId;
|
||||
private final Map<URI, Future<byte[]>> readResponses = new ConcurrentHashMap<>();
|
||||
|
||||
@@ -31,7 +31,6 @@ import org.pkl.core.SecurityManager;
|
||||
import org.pkl.core.SecurityManagerException;
|
||||
import org.pkl.core.externalreader.ExternalReaderProcess;
|
||||
import org.pkl.core.externalreader.ExternalReaderProcessException;
|
||||
import org.pkl.core.messaging.Messages.ResourceReaderSpec;
|
||||
import org.pkl.core.module.FileResolver;
|
||||
import org.pkl.core.module.ModulePathResolver;
|
||||
import org.pkl.core.module.PathElement;
|
||||
@@ -163,7 +162,7 @@ public final class ResourceReaders {
|
||||
|
||||
/** Returns a reader for external and client reader resources. */
|
||||
public static ResourceReader externalResolver(
|
||||
ResourceReaderSpec spec, ExternalResourceResolver resolver) {
|
||||
ExternalResourceResolver.Spec spec, ExternalResourceResolver resolver) {
|
||||
return new ExternalResolver(spec, resolver);
|
||||
}
|
||||
|
||||
@@ -692,10 +691,11 @@ public final class ResourceReaders {
|
||||
}
|
||||
|
||||
private static final class ExternalResolver implements ResourceReader {
|
||||
private final ResourceReaderSpec readerSpec;
|
||||
private final ExternalResourceResolver.Spec readerSpec;
|
||||
private final ExternalResourceResolver resolver;
|
||||
|
||||
public ExternalResolver(ResourceReaderSpec readerSpec, ExternalResourceResolver resolver) {
|
||||
public ExternalResolver(
|
||||
ExternalResourceResolver.Spec readerSpec, ExternalResourceResolver resolver) {
|
||||
this.readerSpec = readerSpec;
|
||||
this.resolver = resolver;
|
||||
}
|
||||
@@ -721,7 +721,7 @@ public final class ResourceReaders {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasElement(org.pkl.core.SecurityManager securityManager, URI elementUri)
|
||||
public boolean hasElement(SecurityManager securityManager, URI elementUri)
|
||||
throws SecurityManagerException {
|
||||
return resolver.hasElement(securityManager, elementUri);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import org.pkl.core.*;
|
||||
import org.pkl.core.Readers;
|
||||
import org.pkl.core.http.HttpClient;
|
||||
import org.pkl.core.module.ModuleKeyFactories;
|
||||
import org.pkl.core.module.ModulePathResolver;
|
||||
@@ -135,8 +134,8 @@ public final class ExecutorSpiImpl implements ExecutorSpi {
|
||||
} catch (PklException e) {
|
||||
throw new ExecutorSpiException(e.getMessage(), e.getCause());
|
||||
} finally {
|
||||
Readers.closeQuietly(builder.getModuleKeyFactories());
|
||||
Readers.closeQuietly(builder.getResourceReaders());
|
||||
Closeables.closeQuietly(builder.getModuleKeyFactories());
|
||||
Closeables.closeQuietly(builder.getResourceReaders());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user