Skip to content

Commit a987527

Browse files
Merge branch 'main' of github.com:code-dot-org/javabuilder into create-codepipeline
2 parents c1a76f5 + 324dcf3 commit a987527

File tree

57 files changed

+384
-455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+384
-455
lines changed

api-gateway-routes/api_gateway_proxy_function.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ def on_connect(event, context)
7979
function_name = ENV['BUILD_AND_RUN_CONSOLE_PROJECT_LAMBDA_ARN']
8080
elsif authorizer['mini_app_type'] == 'theater'
8181
function_name = ENV['BUILD_AND_RUN_THEATER_PROJECT_LAMBDA_ARN']
82-
elsif authorizer['mini_app_type'] == 'playground'
83-
function_name = ENV['BUILD_AND_RUN_PLAYGROUND_PROJECT_LAMBDA_ARN']
8482
else
8583
return { statusCode: 400, body: "invalid mini-app" }
8684
end

org-code-javabuilder/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ app/.project
1717
.vscode/*
1818

1919
*.zip
20+
21+
# ignore neighborhood grid.txt file (auto-generated when running locally)
22+
lib/grid.txt

org-code-javabuilder/lib/src/main/java/dev/javabuilder/LocalMetricClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package dev.javabuilder;
22

3+
import org.code.protocol.JavabuilderSharedObject;
34
import org.code.protocol.MetricClient;
45

56
// Local implementation of MetricClient. Since all we can do locally
67
// is log and we already have regular logging for every metric,
78
// these methods do nothing.
8-
public class LocalMetricClient implements MetricClient {
9+
public class LocalMetricClient extends JavabuilderSharedObject implements MetricClient {
910
@Override
1011
public void publishSevereError() {}
1112

org-code-javabuilder/lib/src/main/java/dev/javabuilder/LocalSystemExitHelper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import org.code.javabuilder.PerformanceTracker;
44
import org.code.javabuilder.SystemExitHelper;
5+
import org.code.protocol.JavabuilderContext;
56

67
public class LocalSystemExitHelper implements SystemExitHelper {
78

89
@Override
910
public void exit(int status) {
10-
PerformanceTracker.getInstance().trackInstanceEnd();
11-
PerformanceTracker.getInstance().logPerformance();
11+
PerformanceTracker performanceTracker =
12+
(PerformanceTracker) JavabuilderContext.getInstance().get(PerformanceTracker.class);
13+
performanceTracker.trackInstanceEnd();
14+
performanceTracker.logPerformance();
1215
System.exit(status);
1316
}
1417
}

org-code-javabuilder/lib/src/main/java/dev/javabuilder/WebSocketServer.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,19 @@ public WebSocketServer() {
5353
@OnOpen
5454
public void onOpen(Session session) {
5555
this.finishedExecution = false;
56-
PerformanceTracker.resetTracker();
57-
PerformanceTracker.getInstance().trackInstanceStart(Clock.systemUTC().instant());
56+
JavabuilderContext.getInstance().destroyAndReset();
57+
PerformanceTracker performanceTracker = new PerformanceTracker();
58+
JavabuilderContext.getInstance().register(PerformanceTracker.class, performanceTracker);
59+
performanceTracker.trackInstanceStart(Clock.systemUTC().instant());
5860
// Decode the authorization token
5961
String token = session.getRequestParameterMap().get("Authorization").get(0);
6062
Base64.Decoder decoder = Base64.getDecoder();
6163
String payload = new String(decoder.decode(token.split("\\.")[1]));
6264
JSONObject queryInput = new JSONObject(payload);
6365

6466
final String connectionId = "LocalhostWebSocketConnection";
65-
final String levelId = queryInput.getString("level_id");
67+
final String levelId =
68+
queryInput.has("level_id") ? String.valueOf(queryInput.getInt("level_id")) : "noneProvided";
6669
final String channelId =
6770
queryInput.has("channel_id") ? queryInput.getString("channel_id") : "noneProvided";
6871
final ExecutionType executionType =
@@ -76,8 +79,8 @@ public void onOpen(Session session) {
7679
// turn off the default console logger
7780
this.logger.setUseParentHandlers(false);
7881

79-
MetricClient metricClient = new LocalMetricClient();
80-
MetricClientManager.create(metricClient);
82+
LocalMetricClient metricClient = new LocalMetricClient();
83+
JavabuilderContext.getInstance().register(MetricClient.class, metricClient);
8184

8285
Properties.setConnectionId(connectionId);
8386

@@ -88,7 +91,6 @@ public void onOpen(Session session) {
8891
if (executionType == ExecutionType.TEST) {
8992
outputAdapter = new UserTestOutputAdapter(websocketOutputAdapter);
9093
}
91-
final LifecycleNotifier lifecycleNotifier = new LifecycleNotifier();
9294

9395
final ExceptionHandler exceptionHandler =
9496
new ExceptionHandler(outputAdapter, new LocalSystemExitHelper());
@@ -107,7 +109,6 @@ public void onOpen(Session session) {
107109
compileList,
108110
new LocalTempDirectoryManager(),
109111
contentManager,
110-
lifecycleNotifier,
111112
new LocalSystemExitHelper());
112113
codeExecutionManager.execute();
113114
} catch (Throwable e) {
@@ -133,14 +134,17 @@ public void onOpen(Session session) {
133134
@OnClose
134135
public void myOnClose() {
135136
Logger.getLogger(MAIN_LOGGER).info("WebSocket closed.");
136-
PerformanceTracker.getInstance().logPerformance();
137+
PerformanceTracker performanceTracker =
138+
(PerformanceTracker) JavabuilderContext.getInstance().get(PerformanceTracker.class);
139+
performanceTracker.logPerformance();
137140
// If the websocket was closed before execution was finished, make sure we clean up.
138141
if (!this.finishedExecution) {
139142
if (codeExecutionManager != null) {
140143
this.codeExecutionManager.shutDown();
141144
}
142145
this.logger.removeHandler(this.logHandler);
143146
}
147+
JavabuilderContext.getInstance().destroyAndReset();
144148
}
145149

146150
/**

org-code-javabuilder/lib/src/main/java/org/code/javabuilder/AWSMetricClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
44
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
55
import com.amazonaws.services.cloudwatch.model.*;
6+
import org.code.protocol.JavabuilderSharedObject;
67
import org.code.protocol.MetricClient;
78

89
// Metric Client which published metrics to AWS CloudWatch.
910
// Requires cloudwatch:PutMetricData permission on the Lambda.
10-
public class AWSMetricClient implements MetricClient {
11+
public class AWSMetricClient extends JavabuilderSharedObject implements MetricClient {
1112
private final AmazonCloudWatch cloudWatchClient;
1213
private final Dimension functionNameDimension;
1314

org-code-javabuilder/lib/src/main/java/org/code/javabuilder/AWSSystemExitHelper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.amazonaws.services.apigatewaymanagementapi.model.GoneException;
88
import java.util.logging.Handler;
99
import java.util.logging.Logger;
10+
import org.code.protocol.JavabuilderContext;
1011

1112
public class AWSSystemExitHelper implements SystemExitHelper {
1213
private final String connectionId;
@@ -19,8 +20,10 @@ public AWSSystemExitHelper(String connectionId, AmazonApiGatewayManagementApi ap
1920

2021
@Override
2122
public void exit(int status) {
22-
PerformanceTracker.getInstance().trackInstanceEnd();
23-
PerformanceTracker.getInstance().logPerformance();
23+
PerformanceTracker performanceTracker =
24+
(PerformanceTracker) JavabuilderContext.getInstance().get(PerformanceTracker.class);
25+
performanceTracker.trackInstanceEnd();
26+
performanceTracker.logPerformance();
2427
this.cleanUpResources();
2528
System.exit(status);
2629
}

org-code-javabuilder/lib/src/main/java/org/code/javabuilder/CodeBuilderRunnable.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ private void executeCodeBuilder() throws JavabuilderException, InternalFacingExc
3434
UserProjectFiles validationFiles = fileLoader.getValidation();
3535
CodeBuilder codeBuilder =
3636
new CodeBuilder(
37-
GlobalProtocol.getInstance(), userProjectFiles, validationFiles, this.tempFolder);
37+
JavabuilderContext.getInstance().getGlobalProtocol(),
38+
userProjectFiles,
39+
validationFiles,
40+
this.tempFolder);
3841
switch (this.executionType) {
3942
case COMPILE_ONLY:
4043
codeBuilder.buildUserCode(this.compileList);

org-code-javabuilder/lib/src/main/java/org/code/javabuilder/CodeExecutionManager.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class CodeExecutionManager {
2323
private final ExecutionType executionType;
2424
private final List<String> compileList;
2525
private final TempDirectoryManager tempDirectoryManager;
26-
private final LifecycleNotifier lifecycleNotifier;
2726
private final ContentManager contentManager;
2827
private final SystemExitHelper systemExitHelper;
2928
private final CodeBuilderRunnableFactory codeBuilderRunnableFactory;
@@ -53,7 +52,6 @@ public CodeExecutionManager(
5352
List<String> compileList,
5453
TempDirectoryManager tempDirectoryManager,
5554
ContentManager contentManager,
56-
LifecycleNotifier lifecycleNotifier,
5755
SystemExitHelper systemExitHelper) {
5856
this(
5957
fileLoader,
@@ -62,7 +60,6 @@ public CodeExecutionManager(
6260
executionType,
6361
compileList,
6462
tempDirectoryManager,
65-
lifecycleNotifier,
6663
contentManager,
6764
systemExitHelper,
6865
new CodeBuilderRunnableFactory());
@@ -75,7 +72,6 @@ public CodeExecutionManager(
7572
ExecutionType executionType,
7673
List<String> compileList,
7774
TempDirectoryManager tempDirectoryManager,
78-
LifecycleNotifier lifecycleNotifier,
7975
ContentManager contentManager,
8076
SystemExitHelper systemExitHelper,
8177
CodeBuilderRunnableFactory codeBuilderRunnableFactory) {
@@ -85,7 +81,6 @@ public CodeExecutionManager(
8581
this.executionType = executionType;
8682
this.compileList = compileList;
8783
this.tempDirectoryManager = tempDirectoryManager;
88-
this.lifecycleNotifier = lifecycleNotifier;
8984
this.contentManager = contentManager;
9085
this.systemExitHelper = systemExitHelper;
9186
this.codeBuilderRunnableFactory = codeBuilderRunnableFactory;
@@ -125,8 +120,10 @@ public void shutDown() {
125120
*/
126121
private void onPreExecute() throws InternalServerException {
127122
// Create the Global Protocol instance
128-
GlobalProtocol.create(
129-
this.outputAdapter, this.inputAdapter, this.lifecycleNotifier, this.contentManager);
123+
GlobalProtocol protocolInstance =
124+
new GlobalProtocol(
125+
this.outputAdapter, new InputHandler(this.inputAdapter), this.contentManager);
126+
JavabuilderContext.getInstance().register(GlobalProtocol.class, protocolInstance);
130127

131128
// Create temp folder
132129
try {
@@ -138,8 +135,7 @@ private void onPreExecute() throws InternalServerException {
138135
// Save System in/out and replace with custom in/out
139136
this.systemInputStream = System.in;
140137
this.systemOutputStream = System.out;
141-
this.overrideInputStream =
142-
new InputRedirectionStream(GlobalProtocol.getInstance().getInputHandler());
138+
this.overrideInputStream = new InputRedirectionStream(protocolInstance.getInputHandler());
143139
this.overrideOutputStream = new OutputPrintStream(this.outputAdapter);
144140
System.setOut(this.overrideOutputStream);
145141
System.setIn(this.overrideInputStream);
@@ -148,15 +144,13 @@ private void onPreExecute() throws InternalServerException {
148144

149145
/**
150146
* Post-execution steps: 1) Notify listeners, 2) clean up global resources, 3) clear temporary
151-
* folder, 4) close custom in/out streams, 5) Replace System.in/out with original in/out, 6)
152-
* Destroy Global Protocol
147+
* folder, 4) close custom in/out streams, 5) Replace System.in/out with original in/out
153148
*/
154149
private void onPostExecute() {
155150
// Notify user and listeners
156151
LambdaUtils.safelySendMessage(
157152
this.outputAdapter, new StatusMessage(StatusMessageKey.EXITED), false);
158-
this.lifecycleNotifier.onExecutionEnded();
159-
GlobalProtocol.getInstance().cleanUpResources();
153+
JavabuilderContext.getInstance().onExecutionEnded();
160154
try {
161155
// Close custom input/output streams
162156
this.overrideInputStream.close();
@@ -170,10 +164,9 @@ private void onPostExecute() {
170164
LoggerUtils.logTrackingException(e);
171165
this.systemExitHelper.exit(TEMP_DIRECTORY_CLEANUP_ERROR_CODE);
172166
} finally {
173-
// Replace System in/out with original System in/out and destroy Global Protocol
167+
// Replace System in/out with original System in/out
174168
System.setIn(this.systemInputStream);
175169
System.setOut(this.systemOutputStream);
176-
GlobalProtocol.destroy();
177170
this.isInitialized = false;
178171
}
179172
}

org-code-javabuilder/lib/src/main/java/org/code/javabuilder/JavaRunner.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import java.util.List;
77
import java.util.stream.Collectors;
88
import org.code.javabuilder.util.JarUtils;
9-
import org.code.protocol.JavabuilderException;
10-
import org.code.protocol.OutputAdapter;
11-
import org.code.protocol.StatusMessage;
12-
import org.code.protocol.StatusMessageKey;
9+
import org.code.protocol.*;
1310

1411
/** The class that executes the student's code */
1512
public class JavaRunner {
@@ -93,11 +90,13 @@ private boolean run(
9390
classLoaderUrls, JavaRunner.class.getClassLoader(), classNames, permissionLevel);
9491

9592
boolean runResult;
96-
PerformanceTracker.getInstance().trackUserCodeStart();
93+
PerformanceTracker performanceTracker =
94+
(PerformanceTracker) JavabuilderContext.getInstance().get(PerformanceTracker.class);
95+
performanceTracker.trackUserCodeStart();
9796
try {
9897
runResult = runner.run(urlClassLoader);
9998
} finally {
100-
PerformanceTracker.getInstance().trackUserCodeEnd();
99+
performanceTracker.trackUserCodeEnd();
101100
}
102101

103102
try {

0 commit comments

Comments
 (0)