Skip to content

Commit 52a86d3

Browse files
odenixbioball
andauthored
Untangle external reader code (#776)
- move the following classes into package externalreader: - ExternalModuleResolver - ExternalResourceResolver - MessageTransportModuleResolver (renamed to ExternalModuleResolverImpl, made package-private) - MessageTransportResourceResolver (renamed to ExternalResourceResolverImpl, made package-private) - replace interface ExternalModuleResolver.Spec with record ExternalModuleReaderSpec - replace interface ExternalResourceResolver.Spec with record ExternalResourceReaderSpec - translate between messaging.ResourceReaderSpec and ExternalResourceReaderSpec (eliminates dependency from messaging on higher layer) - translate between messaging.ResourceResolverSpec and ExternalResourceResolverSpec (eliminates dependency from messaging on higher layer) - add ServerMessages.ExternalReader and translate between this message component and the PklEvaluatorSettings.ExternalReader API - add ServerMessages.Proxy and translate between this message component and the PklEvaluatorSettings.Proxy API - change type of CreateEvaluatorRequest.allowedModules/allowedResources from List<Pattern>? to List<String>? - removes a lot of code - should not need to create a Pattern object to send a message - deprecate method evaluatorSettings.PklEvaluatorSettings.Proxy.create() - only seems useful internally, inlined Co-authored-by: Dan Chao <[email protected]>
1 parent 31c80e7 commit 52a86d3

31 files changed

+218
-212
lines changed

pkl-core/src/main/java/org/pkl/core/evaluatorSettings/PklEvaluatorSettings.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -137,6 +137,7 @@ public record Http(@Nullable Proxy proxy) {
137137
}
138138

139139
public record Proxy(@Nullable URI address, @Nullable List<String> noProxy) {
140+
@Deprecated(forRemoval = true)
140141
public static Proxy create(@Nullable String address, @Nullable List<String> noProxy) {
141142
URI addressUri;
142143
try {
@@ -147,14 +148,19 @@ public static Proxy create(@Nullable String address, @Nullable List<String> noPr
147148
return new Proxy(addressUri, noProxy);
148149
}
149150

150-
@SuppressWarnings("unchecked")
151151
public static @Nullable Proxy parse(Value input) {
152152
if (input instanceof PNull) {
153153
return null;
154154
} else if (input instanceof PObject proxy) {
155155
var address = (String) proxy.get("address");
156+
@SuppressWarnings("unchecked")
156157
var noProxy = (List<String>) proxy.get("noProxy");
157-
return create(address, noProxy);
158+
try {
159+
var addressUri = address == null ? null : new URI(address);
160+
return new Proxy(addressUri, noProxy);
161+
} catch (URISyntaxException e) {
162+
throw new PklException(ErrorMessages.create("invalidUri", address));
163+
}
158164
} else {
159165
throw PklBugException.unreachableCode();
160166
}

pkl-core/src/main/java/org/pkl/core/module/ExternalModuleResolver.java renamed to pkl-core/src/main/java/org/pkl/core/externalreader/ExternalModuleResolver.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -13,24 +13,19 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.pkl.core.module;
16+
package org.pkl.core.externalreader;
1717

1818
import java.io.IOException;
1919
import java.net.URI;
2020
import java.util.List;
2121
import org.pkl.core.SecurityManager;
2222
import org.pkl.core.SecurityManagerException;
23+
import org.pkl.core.messaging.MessageTransport;
24+
import org.pkl.core.module.PathElement;
2325

2426
public interface ExternalModuleResolver {
25-
26-
interface Spec {
27-
boolean hasHierarchicalUris();
28-
29-
boolean isGlobbable();
30-
31-
boolean isLocal();
32-
33-
String scheme();
27+
static ExternalModuleResolver of(MessageTransport transport, long evaluatorId) {
28+
return new ExternalModuleResolverImpl(transport, evaluatorId);
3429
}
3530

3631
String resolveModule(SecurityManager securityManager, URI uri)

pkl-core/src/main/java/org/pkl/core/messaging/MessageTransportModuleResolver.java renamed to pkl-core/src/main/java/org/pkl/core/externalreader/ExternalModuleResolverImpl.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.pkl.core.messaging;
16+
package org.pkl.core.externalreader;
1717

1818
import java.io.IOException;
1919
import java.net.URI;
@@ -26,21 +26,23 @@
2626
import java.util.concurrent.Future;
2727
import org.pkl.core.SecurityManager;
2828
import org.pkl.core.SecurityManagerException;
29+
import org.pkl.core.messaging.MessageTransport;
30+
import org.pkl.core.messaging.MessageTransports;
2931
import org.pkl.core.messaging.Messages.ListModulesRequest;
3032
import org.pkl.core.messaging.Messages.ListModulesResponse;
3133
import org.pkl.core.messaging.Messages.ReadModuleRequest;
3234
import org.pkl.core.messaging.Messages.ReadModuleResponse;
33-
import org.pkl.core.module.ExternalModuleResolver;
35+
import org.pkl.core.messaging.ProtocolException;
3436
import org.pkl.core.module.PathElement;
3537

36-
public class MessageTransportModuleResolver implements ExternalModuleResolver {
38+
final class ExternalModuleResolverImpl implements ExternalModuleResolver {
3739
private final MessageTransport transport;
3840
private final long evaluatorId;
3941
private final Map<URI, Future<String>> readResponses = new ConcurrentHashMap<>();
4042
private final Map<URI, Future<List<PathElement>>> listResponses = new ConcurrentHashMap<>();
4143
private final Random requestIdGenerator = new Random();
4244

43-
public MessageTransportModuleResolver(MessageTransport transport, long evaluatorId) {
45+
ExternalModuleResolverImpl(MessageTransport transport, long evaluatorId) {
4446
this.transport = transport;
4547
this.evaluatorId = evaluatorId;
4648
}

pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderMessagePackDecoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.

pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderMessages.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,35 +23,33 @@
2323
final class ExternalReaderMessages {
2424
private ExternalReaderMessages() {}
2525

26-
public record InitializeModuleReaderRequest(long requestId, String scheme)
27-
implements Server.Request {
26+
record InitializeModuleReaderRequest(long requestId, String scheme) implements Server.Request {
2827
public Type type() {
2928
return Type.INITIALIZE_MODULE_READER_REQUEST;
3029
}
3130
}
3231

33-
public record InitializeResourceReaderRequest(long requestId, String scheme)
34-
implements Server.Request {
32+
record InitializeResourceReaderRequest(long requestId, String scheme) implements Server.Request {
3533
public Type type() {
3634
return Type.INITIALIZE_RESOURCE_READER_REQUEST;
3735
}
3836
}
3937

40-
public record InitializeModuleReaderResponse(long requestId, @Nullable ModuleReaderSpec spec)
38+
record InitializeModuleReaderResponse(long requestId, @Nullable ModuleReaderSpec spec)
4139
implements Client.Response {
4240
public Type type() {
4341
return Type.INITIALIZE_MODULE_READER_RESPONSE;
4442
}
4543
}
4644

47-
public record InitializeResourceReaderResponse(long requestId, @Nullable ResourceReaderSpec spec)
45+
record InitializeResourceReaderResponse(long requestId, @Nullable ResourceReaderSpec spec)
4846
implements Client.Response {
4947
public Type type() {
5048
return Type.INITIALIZE_RESOURCE_READER_RESPONSE;
5149
}
5250
}
5351

54-
public record CloseExternalProcess() implements Server.OneWay {
52+
record CloseExternalProcess() implements Server.OneWay {
5553
public Type type() {
5654
return Type.CLOSE_EXTERNAL_PROCESS;
5755
}

pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderProcess.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,8 +17,6 @@
1717

1818
import java.io.IOException;
1919
import org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;
20-
import org.pkl.core.module.ExternalModuleResolver;
21-
import org.pkl.core.resource.ExternalResourceResolver;
2220
import org.pkl.core.util.Nullable;
2321

2422
/** An external process that reads Pkl modules and resources. */
@@ -56,15 +54,17 @@ ExternalResourceResolver getResourceResolver(long evaluatorId)
5654
* @throws IllegalStateException if this process has already been {@linkplain #close closed}
5755
* @throws IOException if an I/O error occurs
5856
*/
59-
ExternalModuleResolver.@Nullable Spec getModuleReaderSpec(String scheme) throws IOException;
57+
@Nullable
58+
ModuleReaderSpec getModuleReaderSpec(String scheme) throws IOException;
6059

6160
/**
6261
* Returns the spec, if available, of this process's resource reader with the given scheme.
6362
*
6463
* @throws IllegalStateException if this process has already been {@linkplain #close closed}
6564
* @throws IOException if an I/O error occurs
6665
*/
67-
ExternalResourceResolver.@Nullable Spec getResourceReaderSpec(String scheme) throws IOException;
66+
@Nullable
67+
ResourceReaderSpec getResourceReaderSpec(String scheme) throws IOException;
6868

6969
/**
7070
* Closes this process, releasing any associated resources.

pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderProcessImpl.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,8 @@
3030
import org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;
3131
import org.pkl.core.externalreader.ExternalReaderMessages.*;
3232
import org.pkl.core.messaging.MessageTransport;
33-
import org.pkl.core.messaging.MessageTransportModuleResolver;
34-
import org.pkl.core.messaging.MessageTransportResourceResolver;
3533
import org.pkl.core.messaging.MessageTransports;
3634
import org.pkl.core.messaging.ProtocolException;
37-
import org.pkl.core.module.ExternalModuleResolver;
38-
import org.pkl.core.resource.ExternalResourceResolver;
3935
import org.pkl.core.util.ErrorMessages;
4036
import org.pkl.core.util.LateInit;
4137
import org.pkl.core.util.Nullable;
@@ -46,9 +42,9 @@ final class ExternalReaderProcessImpl implements ExternalReaderProcess {
4642

4743
private final ExternalReader spec;
4844
private final @Nullable String logPrefix;
49-
private final Map<String, Future<ExternalModuleResolver.@Nullable Spec>>
50-
initializeModuleReaderResponses = new ConcurrentHashMap<>();
51-
private final Map<String, Future<ExternalResourceResolver.@Nullable Spec>>
45+
private final Map<String, Future<@Nullable ModuleReaderSpec>> initializeModuleReaderResponses =
46+
new ConcurrentHashMap<>();
47+
private final Map<String, Future<@Nullable ResourceReaderSpec>>
5248
initializeResourceReaderResponses = new ConcurrentHashMap<>();
5349
private final Random requestIdGenerator = new Random();
5450

@@ -80,13 +76,13 @@ private void log(String msg) {
8076
@Override
8177
public ExternalModuleResolver getModuleResolver(long evaluatorId)
8278
throws ExternalReaderProcessException {
83-
return new MessageTransportModuleResolver(getTransport(), evaluatorId);
79+
return ExternalModuleResolver.of(getTransport(), evaluatorId);
8480
}
8581

8682
@Override
8783
public ExternalResourceResolver getResourceResolver(long evaluatorId)
8884
throws ExternalReaderProcessException {
89-
return new MessageTransportResourceResolver(getTransport(), evaluatorId);
85+
return ExternalResourceResolver.of(getTransport(), evaluatorId);
9086
}
9187

9288
private MessageTransport getTransport() throws ExternalReaderProcessException {
@@ -175,13 +171,12 @@ public void close() {
175171
}
176172

177173
@Override
178-
public ExternalModuleResolver.@Nullable Spec getModuleReaderSpec(String uriScheme)
179-
throws IOException {
174+
public ModuleReaderSpec getModuleReaderSpec(String uriScheme) throws IOException {
180175
return MessageTransports.resolveFuture(
181176
initializeModuleReaderResponses.computeIfAbsent(
182177
uriScheme,
183178
(scheme) -> {
184-
var future = new CompletableFuture<ExternalModuleResolver.@Nullable Spec>();
179+
var future = new CompletableFuture<@Nullable ModuleReaderSpec>();
185180
var request =
186181
new InitializeModuleReaderRequest(requestIdGenerator.nextLong(), scheme);
187182
try {
@@ -190,7 +185,15 @@ public void close() {
190185
request,
191186
(response) -> {
192187
if (response instanceof InitializeModuleReaderResponse resp) {
193-
future.complete(resp.spec());
188+
var spec =
189+
resp.spec() == null
190+
? null
191+
: new ModuleReaderSpec(
192+
resp.spec().scheme(),
193+
resp.spec().hasHierarchicalUris(),
194+
resp.spec().isLocal(),
195+
resp.spec().isGlobbable());
196+
future.complete(spec);
194197
} else {
195198
future.completeExceptionally(
196199
new ProtocolException("unexpected response"));
@@ -204,13 +207,12 @@ public void close() {
204207
}
205208

206209
@Override
207-
public ExternalResourceResolver.@Nullable Spec getResourceReaderSpec(String uriScheme)
208-
throws IOException {
210+
public ResourceReaderSpec getResourceReaderSpec(String uriScheme) throws IOException {
209211
return MessageTransports.resolveFuture(
210212
initializeResourceReaderResponses.computeIfAbsent(
211213
uriScheme,
212214
(scheme) -> {
213-
var future = new CompletableFuture<ExternalResourceResolver.@Nullable Spec>();
215+
var future = new CompletableFuture<@Nullable ResourceReaderSpec>();
214216
var request =
215217
new InitializeResourceReaderRequest(requestIdGenerator.nextLong(), scheme);
216218
try {
@@ -220,7 +222,14 @@ public void close() {
220222
(response) -> {
221223
log(response.toString());
222224
if (response instanceof InitializeResourceReaderResponse resp) {
223-
future.complete(resp.spec());
225+
var spec =
226+
resp.spec() == null
227+
? null
228+
: new ResourceReaderSpec(
229+
resp.spec().scheme(),
230+
resp.spec().hasHierarchicalUris(),
231+
resp.spec().isGlobbable());
232+
future.complete(spec);
224233
} else {
225234
future.completeExceptionally(
226235
new ProtocolException("unexpected response"));

pkl-core/src/main/java/org/pkl/core/resource/ExternalResourceResolver.java renamed to pkl-core/src/main/java/org/pkl/core/externalreader/ExternalResourceResolver.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -13,24 +13,20 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.pkl.core.resource;
16+
package org.pkl.core.externalreader;
1717

1818
import java.io.IOException;
1919
import java.net.URI;
2020
import java.util.List;
2121
import java.util.Optional;
2222
import org.pkl.core.SecurityManager;
2323
import org.pkl.core.SecurityManagerException;
24+
import org.pkl.core.messaging.MessageTransport;
2425
import org.pkl.core.module.PathElement;
2526

2627
public interface ExternalResourceResolver {
27-
28-
interface Spec {
29-
boolean hasHierarchicalUris();
30-
31-
boolean isGlobbable();
32-
33-
String scheme();
28+
static ExternalResourceResolver of(MessageTransport transport, long evaluatorId) {
29+
return new ExternalResourceResolverImpl(transport, evaluatorId);
3430
}
3531

3632
Optional<Object> read(URI uri) throws IOException;

pkl-core/src/main/java/org/pkl/core/messaging/MessageTransportResourceResolver.java renamed to pkl-core/src/main/java/org/pkl/core/externalreader/ExternalResourceResolverImpl.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.pkl.core.messaging;
16+
package org.pkl.core.externalreader;
1717

1818
import java.io.IOException;
1919
import java.net.URI;
@@ -27,19 +27,21 @@
2727
import java.util.concurrent.Future;
2828
import org.pkl.core.SecurityManager;
2929
import org.pkl.core.SecurityManagerException;
30+
import org.pkl.core.messaging.MessageTransport;
31+
import org.pkl.core.messaging.MessageTransports;
3032
import org.pkl.core.messaging.Messages.*;
33+
import org.pkl.core.messaging.ProtocolException;
3134
import org.pkl.core.module.PathElement;
32-
import org.pkl.core.resource.ExternalResourceResolver;
3335
import org.pkl.core.resource.Resource;
3436

35-
public class MessageTransportResourceResolver implements ExternalResourceResolver {
37+
final class ExternalResourceResolverImpl implements ExternalResourceResolver {
3638
private final MessageTransport transport;
3739
private final long evaluatorId;
3840
private final Map<URI, Future<byte[]>> readResponses = new ConcurrentHashMap<>();
3941
private final Map<URI, Future<List<PathElement>>> listResponses = new ConcurrentHashMap<>();
4042
private final Random requestIdGenerator = new Random();
4143

42-
public MessageTransportResourceResolver(MessageTransport transport, long evaluatorId) {
44+
ExternalResourceResolverImpl(MessageTransport transport, long evaluatorId) {
4345
this.transport = transport;
4446
this.evaluatorId = evaluatorId;
4547
}

0 commit comments

Comments
 (0)