if (device == null) {
throw new IllegalArgumentException(String.format(
"No looking glass at [%s]!", id));
}
ToolUserAction lastAction = Query.
from(ToolUserAction.class).
where("device = ?", device).
sortDescending("time").
noCache().
first();
if (lastAction != null &&
"ping".equals(page.param(String.class, "action"))) {
long end = System.currentTimeMillis() + 30000;
while (System.currentTimeMillis() < end &&
lastAction.getTime() == page.param(long.class, "time")) {
try {
Thread.sleep(500);
} catch (InterruptedException error) {
break;
}
lastAction = Query.
from(ToolUserAction.class).
where("device = ?", device).
sortDescending("time").
noCache().
first();
}
Map<String, Object> response = new HashMap<String, Object>();
response.put("changed", lastAction == null || lastAction.getTime() != page.param(long.class, "time"));
page.getResponse().setContentType("application/json");
page.writeRaw(ObjectUtils.toJson(response));
return;
}
ToolUser user = device.getUser();
page.writeHeader();
page.writeStart("div", "class", "message message-info");
page.writeHtml("Mirroring ");
page.writeObjectLabel(user);
page.writeHtml(" in ");
page.writeHtml(device.getUserAgentDisplay());
if (lastAction != null) {
Object lastActionContent = lastAction.getContent();
if (lastActionContent != null) {
page.writeHtml(" - ");
page.writeStart("a",
"target", "_blank",
"href", page.objectUrl("/content/edit.jsp", lastActionContent));
page.writeTypeObjectLabel(lastActionContent);
page.writeEnd();
}
}
page.writeEnd();
Class<?> viewClass = ObjectUtils.getClassByName(page.param(String.class, "view"));
if (viewClass == null ||
!LookingGlassView.class.isAssignableFrom(viewClass)) {
viewClass = LookingGlassView.PreviewView.class;
}
page.writeStart("form",
"method", "get",
"action", page.cmsUrl("/lookingGlass"));
page.writeElement("input", "type", "hidden", "name", "id", "value", id);
page.writeStart("select",
"data-bsp-autosubmit", "",
"name", "view");
for (Class<? extends LookingGlassView> c : ClassFinder.Static.findClasses(LookingGlassView.class)) {
if (Modifier.isAbstract(c.getModifiers())) {
continue;
}
page.writeStart("option",
"selected", c.equals(viewClass) ? "selected" : null,
"value", c.getName());
page.writeHtml(StringUtils.toLabel(c.getSimpleName()));
page.writeEnd();
}
page.writeEnd();
page.writeEnd();
if (lastAction != null) {
((LookingGlassView) TypeDefinition.getInstance(viewClass).newInstance()).renderAction(page, user, lastAction);
}
page.writeStart("script", "type", "text/javascript");
page.writeRaw("(function($, win) {");
page.writeRaw("var ping = function() {");
page.writeRaw("$.ajax({");
page.writeRaw("'dataType': 'json',");
page.writeRaw("'cache': false,");
page.writeRaw("'url': '");
page.writeRaw(page.cmsUrl("/lookingGlass",
"id", id,
"action", "ping",
"time", lastAction != null ? lastAction.getTime() : null));
page.writeRaw("',");
page.writeRaw("'success': function(response) {");
page.writeRaw("if (response.changed) {");
page.writeRaw("win.location = win.location;");