/* * Copyright 2003-2017 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.idea.core.project.stubs; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; import com.intellij.openapi.application.ApplicationAdapter; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import jetbrains.mps.idea.core.project.stubs.DifferentSdkException; import jetbrains.mps.idea.core.project.stubs.JdkStubSolutionManager; import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Created by danilla on 16/02/17. */ public class MultipleSdkProblemNotifier implements ProjectComponent { private final Project myProject; private Data myDataToReport; public MultipleSdkProblemNotifier(Project project) { myProject = project; } @Override public void projectOpened() { } @Override public void projectClosed() { } @Override public void initComponent() { } @Override public void disposeComponent() { } @NotNull @Override public String getComponentName() { return "MPS multiple SDK problem notifier"; } public void reportSdkProblem(Module unluckyModule, DifferentSdkException exc) { ApplicationManager.getApplication().assertWriteAccessAllowed(); if (myDataToReport == null) { myDataToReport = new Data(); ApplicationManager.getApplication().addApplicationListener(new ApplicationAdapter() { @Override public void afterWriteActionFinished(@NotNull Object action) { myDataToReport.luckyModules.addAll(ApplicationManager.getApplication().getComponent(JdkStubSolutionManager.class).getModules()); new Notification("MPS facet", "Multiple SDKs currently not supported in MPS plugin", myDataToReport.createMessage(), NotificationType.WARNING).notify(myProject); myDataToReport = null; ApplicationManager.getApplication().removeApplicationListener(this); } }); } myDataToReport.unluckyModules.put(unluckyModule, exc.getRequestedSdk()); myDataToReport.sdkInUse = exc.getCurrentSdk(); } private class Data { Map<Module, Sdk> unluckyModules = new HashMap<>(); Set<Module> luckyModules = new HashSet<>(); Sdk sdkInUse; private String createMessage() { StringBuilder sb = new StringBuilder(); sb.append("There are different SDKs used in modules with MPS facets.\n"); sb.append("SDK "); sb.append(sdkInUse.getName()); sb.append(" is used by "); if (luckyModules.size() == 1) { sb.append("module "); Module lucky = luckyModules.iterator().next(); sb.append(lucky.getName()); if (!myProject.equals(lucky.getProject())) { sb.append(" in project "); sb.append(lucky.getProject().getName()); } } else { sb.append("modules "); Set<Project> luckyProjects = new HashSet<>(); boolean head = true; for (Module m : luckyModules) { if (!head) { sb.append(", "); } head = false; sb.append(m.getName()); luckyProjects.add(m.getProject()); } if (luckyProjects.size() > 1) { sb.append(luckyProjects.contains(myProject) ? " in this and other projects" : "from other projects"); } } sb.append(".\n"); sb.append("The following modules will have a wrong SDK for MPS models: \n"); boolean head = true; for (Module m : unluckyModules.keySet()) { if (!head) { sb.append(", "); } head = false; sb.append(m.getName()); } sb.append(".\n"); sb.append("Please assign a single JDK or Idea SDK to modules where you need MPS support"); return sb.toString(); } } }