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(); } }