package com.oracle.truffle.tools.chromeinspector.test;
import java.io.PrintWriter;
import java.net.URI;
import java.util.List;
import com.oracle.truffle.api.instrumentation.TruffleInstrument;
import com.oracle.truffle.api.test.ReflectionUtils;
import com.oracle.truffle.tools.chromeinspector.InspectorExecutionContext;
import com.oracle.truffle.tools.chromeinspector.server.ConnectionWatcher;
import com.oracle.truffle.tools.chromeinspector.server.InspectServerSession;
@TruffleInstrument.Registration(id = InspectorTestInstrument.ID, services = InspectSessionInfoProvider.class)
public final class InspectorTestInstrument extends TruffleInstrument {
public static final String ID = "InspectorTestInstrument";
@Override
protected void onCreate(final Env env) {
env.registerService(new InspectSessionInfoProvider() {
@Override
public InspectSessionInfo getSessionInfo(final boolean suspend, final boolean inspectInternal, final boolean inspectInitialization, final List<URI> sourcePath) {
return new InspectSessionInfo() {
private InspectServerSession iss;
private InspectorExecutionContext context;
private ConnectionWatcher connectionWatcher;
private long id;
InspectSessionInfo init() {
this.context = new InspectorExecutionContext("test", inspectInternal, inspectInitialization, env, sourcePath, new PrintWriter(env.err(), true));
this.connectionWatcher = new ConnectionWatcher();
this.iss = InspectServerSession.create(context, suspend, connectionWatcher);
this.id = context.getId();
ReflectionUtils.invoke(connectionWatcher, "notifyOpen");
return this;
}
@Override
public InspectServerSession getInspectServerSession() {
return iss;
}
@Override
public InspectorExecutionContext getInspectorContext() {
return context;
}
@Override
public ConnectionWatcher getConnectionWatcher() {
return connectionWatcher;
}
@Override
public long getId() {
return id;
}
}.init();
}
});
}
}
interface InspectSessionInfoProvider {
InspectSessionInfo getSessionInfo(boolean suspend, boolean inspectInternal, boolean inspectInitialization, List<URI> sourcePath);
}
interface InspectSessionInfo {
InspectServerSession getInspectServerSession();
InspectorExecutionContext getInspectorContext();
ConnectionWatcher getConnectionWatcher();
long getId();
}