/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps; import com.intellij.ide.Bootstrap; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.SystemInfo; import jetbrains.mps.util.ClassPathReader; import jetbrains.mps.util.ClassType; import java.io.File; import java.io.FileNotFoundException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Launcher { public static void main(String[] args) throws Exception { String mpsInternal = System.getProperty("mps.internal"); System.setProperty("idea.is.internal", mpsInternal != null ? mpsInternal : "false"); System.setProperty("idea.no.jre.check", "true"); System.setProperty("idea.load.plugins", "true"); String fsNotifierKey = "idea.filewatcher.executable.path"; String altExecPath = System.getProperty(fsNotifierKey); if (altExecPath == null || !new File(altExecPath).isFile()) { String execPath = PathManager.getBinPath() + File.separatorChar + getFsNotifierName(); if (!new File(execPath).exists()) { System.setProperty(fsNotifierKey, PathManager.getBinPath() + File.separatorChar + getFsNotifierDir() + File.separatorChar + getFsNotifierName()); } } System.setProperty("idea.additional.classpath", getAdditionalMPSClasspathString()); Bootstrap.main(args, "jetbrains.mps.MPSMainImpl", "start"); } private static String getFsNotifierDir() { if (SystemInfo.isWindows) { return "win"; } else if (SystemInfo.isMac) { return "mac"; } else if (SystemInfo.isLinux) { return "linux"; } return null; } private static String getFsNotifierName() { if (SystemInfo.isWindows) { return "fsnotifier.exe"; } else if (SystemInfo.isMac) { return "fsnotifier"; } else if (SystemInfo.isLinux) { return SystemInfo.isAMD64 ? "fsnotifier64" : "fsnotifier"; } return null; } private static String getAdditionalMPSClasspathString() { StringBuilder builder = new StringBuilder(); for (String path : getAdditionalMPSClasspath()) { builder.append(path); builder.append(File.pathSeparator); } return builder.toString(); } private static List<String> getAdditionalMPSClasspath() { List<String> result = new ArrayList<>(); try { // we're probably running from the sources, let's add the class dirs to the classpath Class<Bootstrap> clazz = Bootstrap.class; String self = PathManager.getResourceRoot(clazz, "/" + clazz.getName().replace('.', '/') + ".class"); assert self != null; File selfRoot = new File(self).getAbsoluteFile(); addMPSBootstrapClassFolders(result, selfRoot); } catch (MalformedURLException ignored) { } return result; } private static void addMPSBootstrapClassFolders(List<String> classPath, File selfRoot) throws MalformedURLException { String homePath = PathManager.getHomePath(); ClassPathReader classPathReader = new ClassPathReader(PathManager.getHomePath()); classPathReader.read().stream().forEach(path -> { File dir = new File(homePath, path); if (dir.isDirectory()) { if (!selfRoot.equals(dir)) { classPath.add(dir.getAbsolutePath()); } } }); } }