package damp.ekeko.snippets.data;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.dom.ASTNode;
import clojure.lang.IFn;
import clojure.lang.IPersistentCollection;
import clojure.lang.RT;
import clojure.lang.Symbol;
import damp.ekeko.snippets.gui.BoundDirectivesViewer;
public class TemplateGroup {
//Java wrapper for SnippetGroup record on the Clojure side
public static IFn FN_MAKE_SNIPPETGROUP;
public static IFn FN_SNIPPETGROUP_NAME;
public static IFn FN_SNIPPETGROUP_SNIPPET_FOR_NODE;
public static IFn FN_SNIPPET_ROOT;
public static IFn FN_SNIPPET_USERQUERY;
public static IFn FN_SNIPPETGROUP_SNIPPETS;
public static IFn FN_SNIPPET_FROM_STRING;
public static IFn FN_SNIPPET_FROM_NODE;
public static IFn FN_QUERY_BY_SNIPPET;
public static IFn FN_QUERY_BY_SNIPPETGROUP;
public static IFn FN_QUERY_BY_SNIPPETGROUP_NOGUI;
/*
public static IFn FN_SNIPPETGROUP_QUERY;
public static IFn FN_SNIPPET_QUERY;
*/
public static IFn FN_APPLY_TO_SNIPPETGROUP;
public static IFn FN_ADD_SNIPPET_TO_SNIPPETGROUP;
public static IFn FN_ADD_COPY_OF_SNIPPET_TO_SNIPPETGROUP;
public static IFn FN_ADD_COPY_OF_SNIPPETGROUP_TO_SNIPPETGROUP;
public static IFn FN_REMOVE_SNIPPET_FROM_SNIPPETGROUP;
public static IFn FN_SEARCH;
public static IFn FN_PARSE_TO_NODES;
public static IFn FN_UPDATE_SNIPPET_IN_SNIPPETGROUP;
public static IFn FN_TRANSFORM_BY_SNIPPETGROUPS;
public static IFn FN_SNIPPETGROUP_NORMALIZED_MATCH_VARS;
public static IFn FN_COPY_SNIPPETGROUP;
protected Object cljGroup;
public static void transformBySnippetGroups(Object cljLHSGroup, Object cljRHSGroup) {
FN_TRANSFORM_BY_SNIPPETGROUPS.invoke(cljLHSGroup, cljRHSGroup);
}
//returns new snippet group
public static Object updateSnippetInSnippetGroup(Object cljGroup, Object cljSnippet, IFn updater) {
return FN_UPDATE_SNIPPET_IN_SNIPPETGROUP.invoke(cljGroup, cljSnippet, updater);
}
public static TemplateGroup newFromClojureGroup(Object cljGroup) {
TemplateGroup group = new TemplateGroup();
group.cljGroup = cljGroup;
return group;
}
public static TemplateGroup newFromGroupName(String name) {
TemplateGroup group = new TemplateGroup();
group.cljGroup = FN_MAKE_SNIPPETGROUP.invoke(name);
return group;
}
private TemplateGroup() {
}
public static Object[] getArray(Object clojureList) {
return (Object[]) RT.var("clojure.core", "to-array").invoke(clojureList);
}
public static Object copyClojureTemplateGroup(Object cljGroup) {
return FN_COPY_SNIPPETGROUP.invoke(cljGroup);
}
public Object copyOfClojureTemplateGroup() {
return copyClojureTemplateGroup(cljGroup);
}
public TemplateGroup copy() {
return newFromClojureGroup(copyOfClojureTemplateGroup());
}
public Object getGroup() {
return cljGroup;
}
@SuppressWarnings("rawtypes")
public List getSnippets() {
return (List) FN_SNIPPETGROUP_SNIPPETS.invoke(cljGroup);
}
public String getName() {
return (String) FN_SNIPPETGROUP_NAME.invoke(cljGroup);
}
public Object getSnippet(Object node) {
return FN_SNIPPETGROUP_SNIPPET_FOR_NODE.invoke(cljGroup, node);
}
public ASTNode getRoot(Object node) {
return (ASTNode) FN_SNIPPET_ROOT.invoke(getSnippet(node));
}
public static ASTNode getRootOfSnippet(Object snippet) {
return (ASTNode) FN_SNIPPET_ROOT.invoke(snippet);
}
//TODO: can be eliminated once transformsview has been reviewed
public String toString(Object node) {
return node.toString();
}
public String nodeToString(Object node) {
return node.toString();
}
@SuppressWarnings("rawtypes")
public Collection getLogicConditions(Object snippet) {
return (Collection) FN_SNIPPET_USERQUERY.invoke(snippet);
}
public void applyOperator(Object operator, Object operands) {
cljGroup = FN_APPLY_TO_SNIPPETGROUP.invoke(cljGroup, operator, operands);
}
public Object addDirective(Object template, Object node, Object boundDirective) {
Object[] updated = (Object[]) BoundDirectivesViewer.FN_GROUP_ADD_DIRECTIVE_TO_NODE.invoke(cljGroup, template, node, boundDirective);
cljGroup = updated[0];
return updated[1]; //snippet in group
}
public Object removeBoundDirective(Object template, Object node, Object boundDirective) {
Object[] updated = (Object[]) BoundDirectivesViewer.FN_GROUP_REMOVE_BOUNDDIRECTIVE_FROM_NODE.invoke(cljGroup, template, node, boundDirective);
cljGroup = updated[0];
return updated[1]; //snippet in group
}
public Object addSnippetCode(String code) {
Object snippet = FN_SNIPPET_FROM_STRING.invoke(code);
cljGroup = FN_ADD_SNIPPET_TO_SNIPPETGROUP.invoke(cljGroup, snippet);
return snippet;
}
public Object addSnippetCode(ASTNode node) {
Object snippet = FN_SNIPPET_FROM_NODE.invoke(node);
cljGroup = FN_ADD_SNIPPET_TO_SNIPPETGROUP.invoke(cljGroup, snippet);
return snippet;
}
public void addCopyOfSnippet(Object snippet) {
cljGroup = FN_ADD_COPY_OF_SNIPPET_TO_SNIPPETGROUP.invoke(cljGroup, snippet);
}
public void addCopyOfSnippetGroup(TemplateGroup snippetGroup) {
cljGroup = FN_ADD_COPY_OF_SNIPPETGROUP_TO_SNIPPETGROUP.invoke(cljGroup, snippetGroup.getGroup());
}
public void removeSnippet(Object snippet) {
cljGroup = FN_REMOVE_SNIPPET_FROM_SNIPPETGROUP.invoke(cljGroup, snippet);
}
public void setClojureGroup(Object cljGroup) {
this.cljGroup = cljGroup;
}
/*
public String getQuery(Object node) {
Object snippet = getSnippet(node);
Object query = "";
if (snippet == null)
query = FN_SNIPPETGROUP_QUERY.invoke(getGroup(), Symbol.intern("damp.ekeko/ekeko*"), false);
else
query = FN_SNIPPET_QUERY.invoke(snippet, Symbol.intern("damp.ekeko/ekeko*"));
return query.toString().replace(") ", ") \n").replace("] ", "] \n");
}
*/
public void runQuery(final Object node) {
Job job = new Job("Matching template") {
protected IStatus run(final IProgressMonitor m) {
m.beginTask("Evaluating corresponding query", 1);
Object snippet = getSnippet(node);
if (snippet == null)
FN_QUERY_BY_SNIPPETGROUP.invoke(getGroup());
else
FN_QUERY_BY_SNIPPET.invoke(snippet);
//RT.var(ns_snippets,"query-by-snippet-in-group*").invoke(snippet, getGroup());
m.worked(1);
m.done();
return Status.OK_STATUS;
}
};
job.schedule();
}
public Collection getResults() {
return (Collection) FN_QUERY_BY_SNIPPETGROUP_NOGUI.invoke(getGroup());
}
public Object[] searchSpace(Object[] positiveExamples, Object[] negativeExamples) {
//return getArray(RT.var(ns_search,"dfs-snippet").invoke(getGroup(), positiveExamples, negativeExamples));
return getArray(FN_SEARCH.invoke(getGroup(), positiveExamples, negativeExamples));
}
public static Object parseStringsToNodes(String[] arrStr) {
return FN_PARSE_TO_NODES.invoke(arrStr);
}
public Collection getNormalizedMatchVariables() {
return (Collection) FN_SNIPPETGROUP_NORMALIZED_MATCH_VARS.invoke(getGroup());
}
}