Skip to content

Commit

Permalink
Reorganize how serializers are stored, since they are accumulating.
Browse files Browse the repository at this point in the history
Add the ability to grab full source of any script.
Fleshen out `scripts` command a tad.
  • Loading branch information
bobmcwhirter committed Nov 17, 2014
1 parent 08bafef commit 7cbeca5
Show file tree
Hide file tree
Showing 21 changed files with 196 additions and 70 deletions.
8 changes: 8 additions & 0 deletions src/main/java/org/dynjs/debugger/Debugger.java
Expand Up @@ -8,6 +8,7 @@
import org.dynjs.debugger.requests.Response;
import org.dynjs.parser.Statement;
import org.dynjs.runtime.ExecutionContext;
import org.dynjs.runtime.SourceProvider;

import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
Expand Down Expand Up @@ -43,6 +44,8 @@ public enum StepAction {

private ReferenceManager referenceManager = new ReferenceManager();

private Set<SourceProvider> sources = new HashSet<>();

private boolean paused = false;
private Statement currentStatement = null;

Expand Down Expand Up @@ -95,12 +98,17 @@ public ExecutionContext getCurrentContext() {

public void enterContext(ExecutionContext context) {
this.contextStack.add(0, context);
this.sources.add(context.getSource());
}

public void exitContext(ExecutionContext context) {
this.contextStack.remove(0);
}

public Set<SourceProvider> getSources() {
return this.sources;
}

public boolean isRunning() {
return ! this.paused;
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/dynjs/debugger/agent/JSONEncoder.java
Expand Up @@ -7,6 +7,7 @@
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import org.dynjs.debugger.Debugger;
import org.dynjs.debugger.agent.serializers.*;
import org.dynjs.debugger.events.ConnectEvent;
import org.dynjs.debugger.events.EventWrapper;
import org.dynjs.debugger.requests.ResponseWrapper;
Expand All @@ -32,6 +33,7 @@ public JSONEncoder(Debugger debugger) {
this.module.addSerializer( new ResponseWrapperSerializer( handleSerializer ) );
this.module.addSerializer( new EvaluateResponseSerializer( handleSerializer ) );
this.module.addSerializer( new LookupResponseSerializer( handleSerializer ) );
this.module.addSerializer( new ScriptsResponseSerializer( handleSerializer ) );
}

@Override
Expand Down
@@ -1,4 +1,4 @@
package org.dynjs.debugger.agent;
package org.dynjs.debugger.agent.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
Expand All @@ -15,7 +15,7 @@ public class EvaluateResponseSerializer extends StdSerializer<EvaluateResponse>

private final HandleSerializer handleSerializer;

EvaluateResponseSerializer(HandleSerializer handleSerializer) {
public EvaluateResponseSerializer(HandleSerializer handleSerializer) {
super(EvaluateResponse.class);
this.handleSerializer = handleSerializer;
}
Expand Down
@@ -1,14 +1,11 @@
package org.dynjs.debugger.agent;
package org.dynjs.debugger.agent.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.dynjs.debugger.Debugger;
import org.dynjs.runtime.JSObject;
import org.dynjs.runtime.NameEnumerator;
import org.dynjs.runtime.PropertyDescriptor;
import org.dynjs.runtime.Types;
import org.dynjs.runtime.*;

import java.io.IOException;

Expand All @@ -19,7 +16,7 @@ public class HandleSerializer extends JsonSerializer<Object> {

private Debugger debugger;

HandleSerializer(Debugger debugger) {
public HandleSerializer(Debugger debugger) {
super();
this.debugger = debugger;
}
Expand All @@ -33,8 +30,8 @@ public void serialize(Object value, JsonGenerator jgen, SerializerProvider provi

public void serializeAsMapEntry(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
int ref = this.debugger.getReferenceManager().getReference(value);
jgen.writeFieldName( "" + ref );
serialize( value, jgen, provider );
jgen.writeFieldName("" + ref);
serialize(value, jgen, provider);
}

public void serializeBody(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
Expand All @@ -60,9 +57,24 @@ public void serializeBody(Object value, JsonGenerator jgen, SerializerProvider p
} else if (value instanceof JSObject) {
jgen.writeStringField("type", "object");
serializeJSObject((JSObject) value, jgen, provider);
} else if (value instanceof SourceProvider) {
serializeScript((SourceProvider) value, false, jgen, provider);
}
}

public void serializeScript(SourceProvider value, boolean includeSource, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStringField("type", "script");
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("id", value.getId());
if (includeSource) {
jgen.writeStringField("source", value.getSource());
}
jgen.writeNumberField("sourceLength", value.getSourceLength());
jgen.writeNumberField("lineCount", value.getLineCount());
jgen.writeNumberField("scriptType", 2);
jgen.writeNumberField("compilationType", 0);
}

private void serializeJSObject(JSObject result, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeFieldName("properties");

Expand Down
@@ -1,10 +1,9 @@
package org.dynjs.debugger.agent;
package org.dynjs.debugger.agent.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.dynjs.debugger.requests.EvaluateResponse;
import org.dynjs.debugger.requests.LookupResponse;

import java.io.IOException;
Expand All @@ -16,7 +15,7 @@ public class LookupResponseSerializer extends StdSerializer<LookupResponse> {

private final HandleSerializer handleSerializer;

LookupResponseSerializer(HandleSerializer handleSerializer) {
public LookupResponseSerializer(HandleSerializer handleSerializer) {
super(LookupResponse.class);
this.handleSerializer = handleSerializer;
}
Expand Down
@@ -1,13 +1,13 @@
package org.dynjs.debugger.agent;
package org.dynjs.debugger.agent.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.dynjs.debugger.requests.EvaluateResponse;
import org.dynjs.debugger.requests.ResponseWrapper;

import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
Expand All @@ -17,7 +17,7 @@ public class ResponseWrapperSerializer extends StdSerializer<ResponseWrapper> {

private final HandleSerializer handleSerializer;

ResponseWrapperSerializer(HandleSerializer handleSerializer) {
public ResponseWrapperSerializer(HandleSerializer handleSerializer) {
super(ResponseWrapper.class);
this.handleSerializer = handleSerializer;
}
Expand All @@ -39,7 +39,7 @@ public void serialize(ResponseWrapper value, JsonGenerator jgen, SerializerProvi
jgen.writeFieldName( "refs" );

jgen.writeStartArray();
List<Object> refs = value.getRefs();
Collection<? extends Object> refs = value.getRefs();
for ( Object each : refs ) {
this.handleSerializer.serialize(each, jgen, provider );
}
Expand Down
@@ -0,0 +1,37 @@
package org.dynjs.debugger.agent.serializers;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.dynjs.debugger.requests.ScriptsResponse;
import org.dynjs.runtime.SourceProvider;

import java.io.IOException;

/**
* @author Bob McWhirter
*/
public class ScriptsResponseSerializer extends StdSerializer<ScriptsResponse> {

private final HandleSerializer handleSerializer;

public ScriptsResponseSerializer(HandleSerializer handleSerializer) {
super(ScriptsResponse.class);
this.handleSerializer = handleSerializer;
}

@Override
public void serialize(ScriptsResponse value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {

jgen.writeStartArray();

for ( SourceProvider each : value.getScripts() ) {
this.handleSerializer.serializeScript( each, value.isIncludeSource(), jgen, provider );
}

jgen.writeEndArray();
}


}
28 changes: 27 additions & 1 deletion src/main/java/org/dynjs/debugger/commands/Scripts.java
Expand Up @@ -3,6 +3,10 @@
import org.dynjs.debugger.Debugger;
import org.dynjs.debugger.requests.ScriptsRequest;
import org.dynjs.debugger.requests.ScriptsResponse;
import org.dynjs.runtime.SourceProvider;

import java.util.HashSet;
import java.util.Set;

/**
* @author Bob McWhirter
Expand All @@ -15,6 +19,28 @@ public Scripts(Debugger debugger) {

@Override
public ScriptsResponse handle(ScriptsRequest request) {
return new ScriptsResponse(request, true, true);
Set<SourceProvider> allScripts = this.debugger.getSources();
Set<SourceProvider> selectedScripts = null;

if (request.getArguments().getIds() == null) {
selectedScripts = allScripts;
} else {
selectedScripts = new HashSet<>();

int[] ids = request.getArguments().getIds();

for (SourceProvider each : allScripts) {
LOOKUP:
for (int i = 0; i < ids.length; ++i) {
if (each.getId() == ids[i]) {
selectedScripts.add(each);
break LOOKUP;
}
}
}

}

return new ScriptsResponse(request, selectedScripts, request.getArguments().isIncludeSource(), true, true);
}
}
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

Expand Down Expand Up @@ -47,7 +48,7 @@ public boolean isRunning() {

@Override
@JsonIgnore
public List<Object> getRefs() {
public Collection<? extends Object> getRefs() {
return Collections.emptyList();
}
}
Expand Down
Expand Up @@ -6,6 +6,7 @@
import org.dynjs.runtime.Types;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
Expand All @@ -25,7 +26,7 @@ public Object getResult() {
}

@Override
public List<Object> getRefs() {
public Collection<Object> getRefs() {
List<Object> refs = new ArrayList<>();

getRefs( this.result, refs );
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/dynjs/debugger/requests/Response.java
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.dynjs.debugger.Message;

import java.util.Collection;
import java.util.List;

/**
Expand All @@ -16,5 +17,5 @@ public interface Response extends Message {
boolean isRunning();

@JsonIgnore
List<Object> getRefs();
Collection<? extends Object> getRefs();
}
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import org.dynjs.debugger.agent.handlers.WrappingHandler;

import java.util.Collection;
import java.util.List;

/**
Expand Down Expand Up @@ -42,7 +43,7 @@ public int getSeq() {
return this.seq;
}

public List<Object> getRefs() {
public Collection<? extends Object> getRefs() {
return this.body.getRefs();
}

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/dynjs/debugger/requests/ScriptsRequest.java
Expand Up @@ -12,6 +12,7 @@ public static class Arguments {

private boolean includeSource;
private int types;
private int[] ids;

public void setIncludeSource(boolean includeSource) {
this.includeSource = includeSource;
Expand All @@ -29,6 +30,14 @@ public int getTypes() {
return this.types;
}

public void setIds(int[] ids) {
this.ids = ids;
}

public int[] getIds() {
return this.ids;
}

}

private Arguments arguments;
Expand Down
26 changes: 25 additions & 1 deletion src/main/java/org/dynjs/debugger/requests/ScriptsResponse.java
@@ -1,11 +1,35 @@
package org.dynjs.debugger.requests;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.dynjs.runtime.SourceProvider;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
* @author Bob McWhirter
*/
public class ScriptsResponse extends AbstractResponse<ScriptsRequest> {

public ScriptsResponse(ScriptsRequest request, boolean success, boolean running) {
private final Set<SourceProvider> scripts;
private final boolean includeSource;

public ScriptsResponse(ScriptsRequest request, Set<SourceProvider> scripts, boolean includeSource, boolean success, boolean running) {
super(request, success, running);
this.scripts = scripts;
this.includeSource = includeSource;
}

@JsonIgnore
public Collection<SourceProvider> getScripts() {
return this.scripts;
}

@JsonIgnore
public boolean isIncludeSource() {
return this.includeSource;
}


}
2 changes: 1 addition & 1 deletion src/main/java/org/dynjs/runtime/Compiler.java
Expand Up @@ -59,7 +59,7 @@ public Compiler withSource(SourceProvider source) {
return this;
}

public Compiler withSource(File source) throws FileNotFoundException {
public Compiler withSource(File source) throws IOException {
this.sourceProvider = new FileSourceProvider(source);
this.fileName = source.getName();
return this;
Expand Down

0 comments on commit 7cbeca5

Please sign in to comment.