Skip to content

Commit 2d39744

Browse files
authored
Merge pull request #26 from DensyDev/feat/export-annotation
feat: script export access & annotation to export property
2 parents 93a1ce3 + 1a51400 commit 2d39744

8 files changed

Lines changed: 96 additions & 13 deletions

File tree

api/src/main/java/org/densy/scriptify/api/script/module/ScriptModuleManager.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.densy.scriptify.api.script.module;
22

3+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
34
import org.densy.scriptify.api.script.module.export.resolver.ScriptModuleExportResolverFactory;
45
import org.jetbrains.annotations.Nullable;
56
import org.jetbrains.annotations.UnmodifiableView;
@@ -25,6 +26,20 @@ public interface ScriptModuleManager {
2526
*/
2627
void setModuleExportResolver(ScriptModuleExportResolverFactory factory);
2728

29+
/**
30+
* Gets the script's access to the module and its exported properties.
31+
*
32+
* @return ScriptAccess enum
33+
*/
34+
ScriptAccess getScriptAccess();
35+
36+
/**
37+
* Sets the script's access to the module and its exported properties.
38+
*
39+
* @param scriptAccess ScriptAccess to set
40+
*/
41+
void setScriptAccess(ScriptAccess scriptAccess);
42+
2843
/**
2944
* Gets the internal global module. Exports added here are available globally without import.
3045
*/
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.densy.scriptify.api.script.module.export.access;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
* Defines the script's access to the module and its exported properties.
10+
*/
11+
public enum ScriptAccess {
12+
/**
13+
* Full access.
14+
*/
15+
ALL,
16+
/**
17+
* Explicit access to fields, methods, and constructors marked with an annotation {@link ScriptAccess.Export}
18+
*/
19+
EXPLICIT;
20+
21+
/**
22+
* An annotation that exports access to a method, field, or constructor for a script.
23+
*
24+
* <pre>
25+
* public class MyService {
26+
* public String publicMethod() { ... } // unavailable in script
27+
*
28+
* @ScriptAccess.Export
29+
* public String internalMethod() { ... } // available in script
30+
*
31+
* @ScriptAccess.Export
32+
* public String sensitiveField; // available in script
33+
* }
34+
* </pre>
35+
*/
36+
@Retention(RetentionPolicy.RUNTIME)
37+
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
38+
public @interface Export {
39+
40+
}
41+
}

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ java {
1212

1313
allprojects {
1414
group = "org.densy.scriptify"
15-
version = "1.6.0-SNAPSHOT"
15+
version = "1.6.1-SNAPSHOT"
1616
}
1717

1818
subprojects {
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.densy.scriptify.http.script.function.data;
22

3+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
4+
35
public enum HttpMethod {
4-
GET,
5-
PUT,
6-
POST,
7-
DELETE,
8-
PATCH,
9-
HEAD,
10-
OPTIONS,
11-
TRACE
6+
@ScriptAccess.Export GET,
7+
@ScriptAccess.Export PUT,
8+
@ScriptAccess.Export POST,
9+
@ScriptAccess.Export DELETE,
10+
@ScriptAccess.Export PATCH,
11+
@ScriptAccess.Export HEAD,
12+
@ScriptAccess.Export OPTIONS,
13+
@ScriptAccess.Export TRACE
1214
}

http/src/main/java/org/densy/scriptify/http/script/function/data/HttpRequest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.densy.scriptify.http.script.function.data;
22

3-
import org.densy.scriptify.api.script.ScriptObject;
43
import okhttp3.*;
4+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
55

66
import java.io.IOException;
77
import java.util.HashMap;
@@ -14,24 +14,29 @@ public class HttpRequest {
1414
private String body = "";
1515
private String mediaType = "";
1616

17+
@ScriptAccess.Export
1718
public HttpRequest(String url, HttpMethod method) {
1819
this.url = url;
1920
this.method = method;
2021
}
2122

23+
@ScriptAccess.Export
2224
public void setBody(String body, String mediaType) {
2325
this.body = body;
2426
this.mediaType = mediaType;
2527
}
2628

29+
@ScriptAccess.Export
2730
public void addHeader(String key, String value) {
2831
headers.put(key, value);
2932
}
3033

34+
@ScriptAccess.Export
3135
public Object send(String outputType) {
3236
return this.send(OutputType.valueOf(outputType));
3337
}
3438

39+
@ScriptAccess.Export
3540
public Object send(OutputType outputType) {
3641
Request.Builder requestBuilder = new Request.Builder()
3742
.url(url);
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.densy.scriptify.http.script.function.data;
22

3+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
4+
35
public enum OutputType {
4-
STRING,
5-
BYTES
6+
@ScriptAccess.Export STRING,
7+
@ScriptAccess.Export BYTES
68
}

script-js-graalvm/src/main/java/org/densy/scriptify/js/graalvm/script/JsScript.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.densy.scriptify.api.script.function.ScriptFunctionManager;
1111
import org.densy.scriptify.api.script.function.definition.ScriptFunctionDefinition;
1212
import org.densy.scriptify.api.script.module.ScriptModuleManager;
13+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
1314
import org.densy.scriptify.api.script.module.export.resolver.ScriptModuleExportResolver;
1415
import org.densy.scriptify.api.script.security.ScriptSecurityManager;
1516
import org.densy.scriptify.core.script.constant.StandardConstantManager;
@@ -89,7 +90,10 @@ public CompiledScript<Value> compile(String script) throws ScriptException {
8990
};
9091

9192
Context.Builder builder = Context.newBuilder("js")
92-
.allowHostAccess(HostAccess.newBuilder(HostAccess.ALL)
93+
.allowHostAccess(HostAccess.newBuilder(switch (moduleManager.getScriptAccess()) {
94+
case ALL -> HostAccess.ALL;
95+
case EXPLICIT -> HostAccess.EXPLICIT;
96+
})
9397
// Mapping for the ScriptObject class required
9498
// to convert a ScriptObject to the value it contains
9599
.targetTypeMapping(
@@ -98,6 +102,8 @@ public CompiledScript<Value> compile(String script) throws ScriptException {
98102
object -> true,
99103
ScriptObject::getValue
100104
)
105+
.allowAccessAnnotatedBy(ScriptAccess.Export.class)
106+
.allowImplementationsAnnotatedBy(ScriptAccess.Export.class)
101107
.build())
102108
.allowIO(IOAccess.newBuilder()
103109
.fileSystem(new VirtualModuleFileSystem(

script-js-graalvm/src/main/java/org/densy/scriptify/js/graalvm/script/module/GraalModuleManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.densy.scriptify.api.script.module.ScriptModule;
66
import org.densy.scriptify.api.script.module.ScriptModuleManager;
77
import org.densy.scriptify.api.script.module.export.ScriptExport;
8+
import org.densy.scriptify.api.script.module.export.access.ScriptAccess;
89
import org.densy.scriptify.api.script.module.export.resolver.ScriptModuleExportResolver;
910
import org.densy.scriptify.api.script.module.export.resolver.ScriptModuleExportResolverFactory;
1011
import org.densy.scriptify.core.script.module.ScriptInternalGlobalModule;
@@ -21,6 +22,7 @@ public class GraalModuleManager implements ScriptModuleManager {
2122
private final ScriptInternalGlobalModule globalModule = new ScriptInternalGlobalModule();
2223
private final Map<String, ScriptModule> modules = new LinkedHashMap<>();
2324
private ScriptModuleExportResolverFactory moduleExportResolverFactory;
25+
private ScriptAccess scriptAccess = ScriptAccess.ALL;
2426

2527
public GraalModuleManager(Script<?> script) {
2628
this.setModuleExportResolver(new GraalModuleExportResolverFactory(script));
@@ -36,6 +38,16 @@ public void setModuleExportResolver(ScriptModuleExportResolverFactory moduleExpo
3638
this.moduleExportResolverFactory = Objects.requireNonNull(moduleExportResolverFactory, "moduleExportResolverFactory cannot be null");
3739
}
3840

41+
@Override
42+
public ScriptAccess getScriptAccess() {
43+
return scriptAccess;
44+
}
45+
46+
@Override
47+
public void setScriptAccess(ScriptAccess scriptAccess) {
48+
this.scriptAccess = Objects.requireNonNull(scriptAccess, "scriptAccess cannot be null");;
49+
}
50+
3951
@Override
4052
public ScriptInternalGlobalModule getGlobalModule() {
4153
return globalModule;

0 commit comments

Comments
 (0)