package jetbrains.mps.ide.script.plugin;
/*Generated by MPS */
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.smodel.Language;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.workbench.action.BaseGroup;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.util.NameUtil;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.Comparator;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.Iterator;
import jetbrains.mps.internal.collections.runtime.SortedSetSequence;
import java.util.Collections;
import java.util.HashMap;
public class ScriptsActionGroupHelper {
public ScriptsActionGroupHelper() {
}
public static List<SNode> getMigrationScripts(List<Language> languages) {
List<SNode> migrationScripts = new ArrayList<SNode>();
for (Language language : languages) {
SModel m = SModuleOperations.getAspect(language, "scripts");
if (m != null) {
ListSequence.fromList(migrationScripts).addSequence(ListSequence.fromList(SModelOperations.roots(m, MetaAdapterFactory.getConcept(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, "jetbrains.mps.lang.script.structure.MigrationScript"))));
}
}
return migrationScripts;
}
public static void populateByCategoryGroup(List<SNode> migrationScripts, BaseGroup ownerGroup, boolean applyToSelection) {
_FunctionTypes._return_P1_E0<? extends String, ? super SNode> getCategoryClosure = new _FunctionTypes._return_P1_E0<String, SNode>() {
public String invoke(SNode script) {
String cat = NameUtil.pluralize(NameUtil.capitalize(SPropertyOperations.getString_def(script, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081153L, "type"), "enhancement")));
if (cat == null) {
cat = "<uncategorized>";
}
return cat;
}
};
Map<String, List<SNode>> byCategory = groupBy(migrationScripts, getCategoryClosure);
Set<String> sorted = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if ("<uncategorized>".equals(o1)) {
return 1;
}
if ("<uncategorized>".equals(o2)) {
return -1;
}
return o1.compareTo(o2);
}
});
sorted.addAll(MapSequence.fromMap(byCategory).keySet());
for (String cat : sorted) {
BaseGroup categoryGroup = createGroup(cat, ownerGroup);
_FunctionTypes._return_P1_E0<? extends String, ? super SNode> getBuildClosure = new _FunctionTypes._return_P1_E0<String, SNode>() {
public String invoke(SNode script) {
return (SPropertyOperations.getString(script, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081155L, "toBuild")) == null ? "" : SPropertyOperations.getString(script, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081155L, "toBuild")));
}
};
Map<String, List<SNode>> byBuild = groupBy(MapSequence.fromMap(byCategory).get(cat), getBuildClosure);
if (SetSequence.fromSet(MapSequence.fromMap(byBuild).keySet()).count() > 1) {
{
Iterator<String> buildName_it = SortedSetSequence.fromSet(new TreeSet<String>(MapSequence.fromMap(byBuild).keySet())).iterator();
String buildName_var;
while (buildName_it.hasNext()) {
buildName_var = buildName_it.next();
BaseGroup subGroup = createGroup(buildName_var, categoryGroup);
addActions(subGroup, MapSequence.fromMap(byBuild).get(buildName_var), applyToSelection);
}
}
} else {
addActions(categoryGroup, MapSequence.fromMap(byCategory).get(cat), applyToSelection);
}
}
}
private static BaseGroup createGroup(String name, BaseGroup parentGroup) {
BaseGroup group = new BaseGroup(name);
group.setPopup(true);
parentGroup.add(group);
return group;
}
private static void addActions(BaseGroup group, List<SNode> scripts, boolean applyToSelection) {
Collections.sort(scripts, new Comparator<SNode>() {
@Override
public int compare(SNode node1, SNode node2) {
String name1 = ScriptsActionGroupHelper.makeScriptActionName(null, SPropertyOperations.getString(node1, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x11225f2354aL, "title")), null).toLowerCase();
String name2 = ScriptsActionGroupHelper.makeScriptActionName(null, SPropertyOperations.getString(node2, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x11225f2354aL, "title")), null).toLowerCase();
return name1.compareTo(name2);
}
});
{
Iterator<SNode> script_it = ListSequence.fromList(scripts).iterator();
SNode script_var;
while (script_it.hasNext()) {
script_var = script_it.next();
group.add(new RunMigrationScriptAction(script_var, ScriptsActionGroupHelper.makeScriptActionName(null, SPropertyOperations.getString(script_var, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x11225f2354aL, "title")), null), applyToSelection));
}
}
}
private static Map<String, List<SNode>> groupBy(List<SNode> scripts, _FunctionTypes._return_P1_E0<? extends String, ? super SNode> groupKeyProducer) {
Map<String, List<SNode>> result = MapSequence.fromMap(new HashMap<String, List<SNode>>());
{
Iterator<SNode> script_it = ListSequence.fromList(scripts).iterator();
SNode script_var;
while (script_it.hasNext()) {
script_var = script_it.next();
String groupKey = groupKeyProducer.invoke(script_var);
List<SNode> group = MapSequence.fromMap(result).get(groupKey);
if (group == null) {
group = new ArrayList<SNode>();
MapSequence.fromMap(result).put(groupKey, group);
}
ListSequence.fromList(group).addElement(script_var);
}
}
return result;
}
public static String makeScriptActionName(String category, String title, String build) {
StringBuilder sb = new StringBuilder();
if (category != null) {
sb.append(category).append(": ");
}
sb.append(title);
if (build != null) {
sb.append(" [migrate to ").append(build).append("]");
}
return sb.toString();
}
}