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:
Josh B
2024-11-01 14:05:45 -07:00
committed by GitHub
parent 3f38173ed5
commit fa25fb46fd
16 changed files with 70 additions and 55 deletions

View File

@@ -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) {

View File

@@ -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.

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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<>();

View File

@@ -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);

View File

@@ -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;

View File

@@ -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<>();

View File

@@ -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);
}

View File

@@ -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());
}
}