package org.webcat.reporter; import org.webcat.grader.Submission; import org.webcat.ui.generators.JavascriptGenerator; import ognl.Node; import ognl.Ognl; import ognl.OgnlContext; import ognl.enhance.ExpressionAccessor; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WOResponse; import com.webobjects.eoaccess.EOEntity; import com.webobjects.eoaccess.EOModel; import com.webobjects.eoaccess.EOModelGroup; import com.webobjects.eocontrol.EOFetchSpecification; import com.webobjects.eocontrol.EOGenericRecord; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSComparator; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSMutableDictionary; import com.webobjects.foundation.NSComparator.ComparisonException; import er.ajax.AjaxTreeModel; public class DebuggingPage extends ReporterComponent { public DebuggingPage(WOContext context) { super(context); } public String entity = "Submission"; public String qualifier; public String expression; public NSMutableArray<String> entities; public NSMutableArray<NSDictionary<String, String>> results; public NSDictionary<String, String> result; public int index; public Node astItem; public ASTDelegate astDelegate = new ASTDelegate(); public Node astRoot = null; @Override public void appendToResponse(WOResponse response, WOContext context) { entities = new NSMutableArray<String>(); for (EOModel model : EOModelGroup.defaultGroup().models()) { for (EOEntity anEntity : model.entities()) { entities.addObject(anEntity.name()); } } try { entities.sortUsingComparator( NSComparator.AscendingCaseInsensitiveStringComparator); } catch (ComparisonException e) { e.printStackTrace(); } super.appendToResponse(response, context); } public WOActionResults executeExpression() { // Fetch some objects if (expression != null && expression.length() > 0) { EOQualifier q = null; if (qualifier != null && qualifier.length() > 0) { q = EOQualifier.qualifierWithQualifierFormat(qualifier, null); } EOFetchSpecification fetch = new EOFetchSpecification(entity, q, null); fetch.setFetchLimit(100); NSArray<Submission> submissions = Submission .objectsWithFetchSpecification(localContext(), fetch); OgnlContext context = ReportUtilityEnvironment.newOgnlContext(); ExpressionAccessor accessor = null; try { Node node = Ognl.compileExpression(context, null, expression); astRoot = node; accessor = node.getAccessor(); } catch (Exception e1) { e1.printStackTrace(); } results = new NSMutableArray<NSDictionary<String,String>>(); for (EOGenericRecord sub : submissions) { NSMutableDictionary<String, String> nextResult = new NSMutableDictionary<String, String>(); nextResult.setObjectForKey( sub.valueForKey("id").toString(), "id"); try { context.setRoot(sub); context.setCurrentObject(sub); String value = Ognl.getValue(accessor, context, sub).toString(); nextResult.setObjectForKey(value, "value"); } catch (Exception e) { nextResult.setObjectForKey( "<span style='color: red'>" + e.toString() + "</span>", "value"); } results.addObject(nextResult); } } return new JavascriptGenerator().refresh("expressionResults"); } public static class ASTDelegate implements AjaxTreeModel.Delegate { public NSArray<Node> childrenTreeNodes(Object node) { if (node == null) { return null; } NSMutableArray<Node> nodes = new NSMutableArray<Node>(); for (int i = 0; i < ((Node) node).jjtGetNumChildren(); i++) { nodes.addObject(((Node) node).jjtGetChild(i)); } return nodes; } public boolean isLeaf(Object node) { if (node == null) { return true; } return ((Node) node).jjtGetNumChildren() == 0; } public Object parentTreeNode(Object node) { if (node == null) { return null; } return ((Node) node).jjtGetParent(); } } }