package krasa; import java.io.PrintWriter; import java.util.*; import javax.swing.*; import org.jetbrains.annotations.NotNull; import com.intellij.execution.*; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.process.OSProcessHandler; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.module.*; import com.intellij.openapi.project.*; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; /** * @author Vojtech Krasa */ public class PortalApplicationComponent implements ApplicationComponent { public static final String CLEAN_UTIL_PORTAL = "clean, util, portal"; public static final Icon ICON = IconLoader.getIcon("/actions/uninstall.png"); private static volatile boolean isDisplayed; public void initComponent() { if (MatyasUtils.isMatyas()) { return; } initializeActions(); } private void initializeActions() { DefaultActionGroup mainToolBar = (DefaultActionGroup) ActionManager.getInstance().getAction("BuildMenu"); if (!isDisplayed) { isDisplayed = true; mainToolBar.add(cleanUtilPortal()); mainToolBar.add(payment()); mainToolBar.add(portal()); mainToolBar.add(all()); } } private DumbAwareAction all() { return new DumbAwareAction("all", "all", ICON) { public void actionPerformed(final AnActionEvent e) { final Process process = getProcess(); RunContentExecutor executor = getRunContentExecutor(e.getProject(), process); executor.withAfterCompletion(new Runnable() { @Override public void run() { payment().actionPerformed(e); portal().actionPerformed(e); } }); executor.run(); run(e, process, "util.bat clean", "util.bat", "exit"); } }; } private DumbAwareAction portal() { return new DumbAwareAction("portal", "portal", IconLoader.getIcon("/actions/uninstall.png")) { public void actionPerformed(AnActionEvent e) { run(e, "portal-platform.bat", "exit "); } }; } private DumbAwareAction payment() { return new DumbAwareAction("payment", "payment", IconLoader.getIcon("/actions/uninstall.png")) { public void actionPerformed(AnActionEvent e) { run(e, "payment.bat", "exit"); } }; } private DumbAwareAction cleanUtilPortal() { return new DumbAwareAction(CLEAN_UTIL_PORTAL, CLEAN_UTIL_PORTAL, IconLoader.getIcon("/actions/uninstall.png")) { public void actionPerformed(AnActionEvent e) { run(e, "util.bat clean", "util.bat", "portal-platform.bat", "exit"); } }; } private void run(AnActionEvent e, String... strings) { final Process process = createCmd(e.getProject()); run(e, process, strings); } private void run(AnActionEvent e, Process process, String... strings) { String baseDir = getBaseDir(e); List<String> commands = new ArrayList<String>(); commands.add(getDrive(baseDir)); commands.add(getScriptsDir(baseDir)); commands.addAll(Arrays.asList(strings)); writeCommands(process, commands); } @NotNull private String getBaseDir(AnActionEvent e) { Project project = e.getProject(); Module[] modules = ModuleManager.getInstance(project).getModules(); for (Module module : modules) { if (module.getName().toUpperCase().startsWith("PORTAL")) { VirtualFile moduleFile = module.getModuleFile(); VirtualFile baseDir = moduleFile.getParent(); return baseDir.getPath(); } } throw new RuntimeException("portal module not found"); } private String getDrive(String path) { return path.substring(0, 1) + ":"; } private Process createCmd(Project project) { final Process process = getProcess(); RunContentExecutor executor = getRunContentExecutor(project, process); executor.run(); return process; } private Process getProcess() { try { GeneralCommandLine generalCommandLine = new GeneralCommandLine("cmd"); return generalCommandLine.createProcess(); } catch (ExecutionException e1) { throw new RuntimeException(e1); } } private RunContentExecutor getRunContentExecutor(Project project, Process process) { OSProcessHandler osProcessHandler = new OSProcessHandler(process, ""); return new RunContentExecutor(project, osProcessHandler); } private void writeCommands(Process process, List<String> strings) { PrintWriter printWriter = new PrintWriter(process.getOutputStream()); for (String string : strings) { printWriter.println(string); } printWriter.flush(); } private String getScriptsDir(String path) { return "cd " + path.replaceAll("[/]", "\\\\") + "\\sdp\\scripts"; } public void disposeComponent() { // TODO: insert component disposal logic here } @NotNull public String getComponentName() { return "ProjectCommandLauncherComponent"; } }