Skip to content

Commit

Permalink
trying to get Run to work even if share fails.
Browse files Browse the repository at this point in the history
  • Loading branch information
dyoo committed Apr 12, 2013
1 parent 06dfc1e commit b0e31fc
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 117 deletions.
11 changes: 8 additions & 3 deletions src/org/wescheme/servlet/LoadProjectServlet.java
Expand Up @@ -56,11 +56,16 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc
Program prog = getProgramByPublicId(pm, req.getParameter("publicId"));
if (isOwner(userSession, prog) || prog.getIsSourcePublic()) {
resp.setContentType("text/json");
resp.getWriter().print(prog.toJSON(pm).toString());
resp.getWriter().print(prog.toJSON(true, pm).toString());
} else {
// Show the record, but without source.
// The intent is to how the record, but without source.
//
// Kludge: however, we're weakening this with respect to
// letting Run work even when the server hasn't finished
// doing a server-side bytecode compile.
resp.setContentType("text/json");
resp.getWriter().print(prog.toJSON(false, pm).toString());
//resp.getWriter().print(prog.toJSON(false, pm).toString());
resp.getWriter().print(prog.toJSON(true, pm).toString());
}
} else {
resp.sendError(400, "pid or publicId parameter missing");
Expand Down
227 changes: 129 additions & 98 deletions war-src/js/run.js
Expand Up @@ -5,127 +5,158 @@
goog.require("plt.wescheme.AjaxActions");
goog.require("plt.wescheme.makeDynamicModuleLoader");

goog.provide("plt.wescheme.runner");

(function() {


var Runner = function(compilationServerUrl, interactionsDiv) {
var that = this;
this.interactionsDiv = jQuery(interactionsDiv);
this.evaluator = new Evaluator({
write: function(thing) {
that.addToInteractions(thing);
},
compilationServletUrl: compilationServerUrl
});
this.evaluator.setImageProxy("/imageProxy");
this.evaluator.setRootLibraryPath("/js/mzscheme-vm/collects");
this.evaluator.setDynamicModuleLoader(
plt.wescheme.makeDynamicModuleLoader("/js/mzscheme-vm/collects"));
};


var Runner = function(compilationServerUrl, interactionsDiv) {
var that = this;
this.interactionsDiv = jQuery(interactionsDiv);
this.evaluator = new Evaluator({
write: function(thing) {
that.addToInteractions(thing);
},
compilationServletUrl: compilationServerUrl
});
this.evaluator.setImageProxy("/imageProxy");
this.evaluator.setRootLibraryPath("/js/mzscheme-vm/collects");
this.evaluator.setDynamicModuleLoader(
plt.wescheme.makeDynamicModuleLoader("/js/mzscheme-vm/collects"));
};


Runner.prototype.runCompiledCode = function(title, compiledCode, permStringArray) {
var that = this;
var onSuccessRun = function() {
};
var onFailRun = function(exn) {
that.renderErrorAsDomNode(exn);
Runner.prototype.runCompiledCode = function(compiledCode, permStringArray) {
var that = this;
var onSuccessRun = function() {
};
var onFailRun = function(exn) {
that.renderErrorAsDomNode(exn);
};
this.evaluator.executeCompiledProgram((0,eval)('(' + compiledCode + ')'),
onSuccessRun,
onFailRun);
};
this.evaluator.executeCompiledProgram((0,eval)('(' + compiledCode + ')'),
onSuccessRun,
onFailRun);
};


// Returns if x is a dom node.
function isDomNode(x) {
return (x.nodeType != undefined);
}
Runner.prototype.runSourceCode = function(sourceCode, permStringArray) {
var that = this;
var onSuccessRun = function() {
};
var onFailRun = function(exn) {
that.renderErrorAsDomNode(exn);
};
this.evaluator.executeProgram(title,
sourceCode,
onSuccessRun,
onFailRun);
};


Runner.prototype.addToInteractions = function (interactionVal) {
if (isDomNode(interactionVal)) {
this.interactionsDiv.append(interactionVal);
} else {
var newArea = jQuery("<div style='width: 100%'></div>");
newArea.text(interactionVal);
this.interactionsDiv.append(newArea);

// Returns if x is a dom node.
function isDomNode(x) {
return (x.nodeType != undefined);
}
this.interactionsDiv.attr("scrollTop", this.interactionsDiv.attr("scrollHeight"));
};


Runner.prototype.addToInteractions = function (interactionVal) {
if (isDomNode(interactionVal)) {
this.interactionsDiv.append(interactionVal);
} else {
var newArea = jQuery("<div style='width: 100%'></div>");
newArea.text(interactionVal);
this.interactionsDiv.append(newArea);
}
this.interactionsDiv.attr("scrollTop", this.interactionsDiv.attr("scrollHeight"));
};

// renderErrorAsDomNode: exception -> element
// Given an exception, produces error dom node to be displayed.
Runner.prototype.renderErrorAsDomNode = function(err) {
var msg = this.evaluator.getMessageFromExn(err);

var dom = document.createElement('div');
dom['class'] = 'moby-error';

var msgDom = document.createElement('div');
msgDom['class'] = 'moby-error:message';
msgDom.appendChild(document.createTextNode(msg));
dom.appendChild(msgDom);
// renderErrorAsDomNode: exception -> element
// Given an exception, produces error dom node to be displayed.
Runner.prototype.renderErrorAsDomNode = function(err) {
var msg = this.evaluator.getMessageFromExn(err);

var stacktrace = this.evaluator.getTraceFromExn(err);
for (var i = 0; i < stacktrace.length; i++) {
dom.appendChild(document.createTextNode("at: line " + stacktrace[i].line +
", column " + stacktrace[i].column));
}
var dom = document.createElement('div');
dom['class'] = 'moby-error';

return dom;
};
var msgDom = document.createElement('div');
msgDom['class'] = 'moby-error:message';
msgDom.appendChild(document.createTextNode(msg));
dom.appendChild(msgDom);

var stacktrace = this.evaluator.getTraceFromExn(err);
for (var i = 0; i < stacktrace.length; i++) {
dom.appendChild(document.createTextNode("at: line " + stacktrace[i].line +
", column " + stacktrace[i].column));
}

return dom;
};

function init(compilationServerUrl, publicId) {
var runner =
new Runner(compilationServerUrl, document.getElementById('interactions'));
var callback = function(aProgram) {
var title = aProgram.getTitle();
var programCode = aProgram.getObjectCode();
var permissions = aProgram.getPermissions();

var j = jQuery("#interactions");


var supportsFullScreen = function() {
var elem = document.createElement('div');
return ((elem.webkitRequestFullscreen ||
elem.mozRequestFullScreen ||
elem.requestFullscreen) !== undefined);
};
function init(compilationServerUrl, publicId) {
var runner =
new Runner(compilationServerUrl, document.getElementById('interactions'));
var afterLoad = function(aProgram) {
var title = aProgram.getTitle();
var programCode = aProgram.getObjectCode();
var sourceCode = aProgram.getSourceCode();
var permissions = aProgram.getPermissions();

var j = jQuery("#interactions");

var toggleFullscreen = function() {
var elem;
if (j.find("canvas").length == 1) {
elem = j.find("canvas").get(0);
} else {
elem = j.get(0);
}
if (elem.webkitRequestFullscreen) {
elem.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else {
if (elem.mozRequestFullScreen) {
elem.mozRequestFullScreen();

var supportsFullScreen = function() {
var elem = document.createElement('div');
return ((elem.webkitRequestFullscreen ||
elem.mozRequestFullScreen ||
elem.requestFullscreen) !== undefined);
};

var toggleFullscreen = function() {
var elem;
if (j.find("canvas").length == 1) {
elem = j.find("canvas").get(0);
} else {
elem = j.get(0);
}
if (elem.webkitRequestFullscreen) {
elem.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else {
elem.requestFullscreen();
if (elem.mozRequestFullScreen) {
elem.mozRequestFullScreen();
} else {
elem.requestFullscreen();
}
}
};
if(supportsFullScreen()) {
jQuery("<div><img src='/images/fullscreen.png' width='16' height='16'></div>")
.css("float", "right")
.css("cursor", "auto")
.click(toggleFullscreen)
.appendTo(j);
}

// Change the title of the document to that of the program.
document.title = title;
if (programCode) {
runner.runCompiledCode(programCode, permissions);
} else {
///
// FIXME: add call to queue/retrieve a server-side compilation here.
///
runner.runSourceCode(title, sourceCode, permissions);
}
};
if(supportsFullScreen()) {
jQuery("<div><img src='/images/fullscreen.png' width='16' height='16'></div>")
.css("float", "right")
.css("cursor", "auto")
.click(toggleFullscreen)
.appendTo(j);
}
new plt.wescheme.AjaxActions().loadProject(
null, publicId, afterLoad, function() { alert("unable to load program"); });
}

// Change the title of the document to that of the program.
document.title = title;
runner.runCompiledCode(title, programCode, permissions);
};
new plt.wescheme.AjaxActions().loadProject(
null, publicId, callback, function() { alert("unable to load program"); });
}

plt.wescheme.runner.Runner = Runner;
plt.wescheme.runner.init = init;
}());
25 changes: 14 additions & 11 deletions war-src/js/sharingdialog.js
Expand Up @@ -89,17 +89,20 @@ goog.require("plt.wescheme.WeSchemeIntentBus");
newDialog.append(jQuery("<p/>"));
newDialog.append(jQuery(plt.wescheme.helpers.generateSocialBookmarks(title, anchor.href)));

// Add error message content if something weird happened during the build.
if (errMessage !== false) {
newDialog.append(
jQuery("<p/>").text("However, the program won't be able to run because of the following: "));
newDialog.append(jQuery("<tt/>").css("color", "red").text(errMessage));
if (isPublic) {
newDialog.append(
jQuery("<p/>")
.text("Although it won't run, its source can still be viewed."));
}
}
// Ignore errMessage.
// We'll deal with it during Run time.
//
// // Add error message content if something weird happened during the build.
// if (errMessage !== false) {
// newDialog.append(
// jQuery("<p/>").text("However, the program won't be able to run because of the following: "));
// newDialog.append(jQuery("<tt/>").css("color", "red").text(errMessage));
// if (isPublic) {
// newDialog.append(
// jQuery("<p/>")
// .text("Although it won't run, its source can still be viewed."));
// }
// }

newDialog.dialog("open");
},
Expand Down
2 changes: 1 addition & 1 deletion war/WEB-INF/appengine-web.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>wescheme</application>
<version>68</version>
<version>69</version>

<!-- Configure java.util.logging -->
<system-properties>
Expand Down
2 changes: 1 addition & 1 deletion war/run.jsp
Expand Up @@ -35,7 +35,7 @@

</head>

<body onload="init('<%= compilationServerUrl %>', '<%= publicId%>')">
<body onload="plt.wescheme.runner.init('<%= compilationServerUrl %>', '<%= publicId%>')">
<div id="interactions">
</div>

Expand Down
4 changes: 1 addition & 3 deletions war/view.jsp
Expand Up @@ -17,7 +17,6 @@
String publicId = request.getParameter("publicId");
String encodedId = java.net.URLEncoder.encode(publicId, "utf-8");
PersistenceManager pm = PMF.get().getPersistenceManager();
boolean hasSource = false;
boolean isPublic = false;
String title = "";
String notes = "";
Expand All @@ -26,7 +25,6 @@
title = aProgram.getTitle();
notes = aProgram.getNotes();
isPublic = aProgram.getIsSourcePublic();
hasSource = !("".equals(aProgram.getObject().toString()));
} catch (RuntimeException e) {
aProgram = null;
} finally {
Expand Down Expand Up @@ -70,7 +68,7 @@ WeScheme is unable to find your program.



<% if (aProgram != null && hasSource) { %>
<% if (aProgram != null) { %>
<a id="runIt" class="linkbutton"
href="/run?publicId=<%= encodedId %>">Run it!</a>
<% } %>
Expand Down

0 comments on commit b0e31fc

Please sign in to comment.