blob: 05ace8176e6f207e922000ed9cdff57d5116d680 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 com.android.tools.idea.gradle.project;
import com.android.tools.idea.gradle.messages.Message;
import com.android.tools.idea.gradle.messages.ProjectSyncMessages;
import com.android.tools.idea.gradle.project.subset.ProjectSubset;
import com.android.tools.idea.gradle.service.notification.hyperlink.NotificationHyperlink;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.project.ModuleData;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static com.android.tools.idea.gradle.messages.CommonMessageGroupNames.PROJECT_STRUCTURE_ISSUES;
import static com.intellij.openapi.util.io.FileUtil.toSystemDependentName;
public final class ProjectDiagnostics {
private ProjectDiagnostics() {
}
public static void findAndReportStructureIssues(@NotNull Project project) {
Multimap<String, Module> modulesByPath = ArrayListMultimap.create();
ModuleManager moduleManager = ModuleManager.getInstance(project);
for (Module module : moduleManager.getModules()) {
File moduleFilePath = new File(toSystemDependentName(module.getModuleFilePath()));
File moduleDirPath = moduleFilePath.getParentFile();
if (moduleDirPath != null) {
modulesByPath.put(moduleDirPath.getPath(), module);
}
}
Set<String> modulePaths = modulesByPath.keySet();
for (String modulePath : modulePaths) {
Collection<Module> modules = modulesByPath.get(modulePath);
int moduleCount = modules.size();
if (moduleCount > 1) {
ProjectSyncMessages messages = ProjectSyncMessages.getInstance(project);
StringBuilder msg = new StringBuilder();
msg.append("The modules ");
int i = 0;
Set<String> moduleNames = Sets.newHashSet();
for (Module module : modules) {
if (i++ != 0) {
msg.append(", ");
}
String name = module.getName();
moduleNames.add(name);
msg.append("'").append(name).append("'");
}
msg.append(" point to same directory in the file system.");
String[] lines = { msg.toString(), "Each module has to have a unique path."};
Message message = new Message(PROJECT_STRUCTURE_ISSUES, Message.Type.ERROR, lines);
List<DataNode<ModuleData>> modulesToDisplayInDialog = Lists.newArrayList();
if (ProjectSubset.isSettingEnabled() ) {
ProjectSubset subset = ProjectSubset.getInstance(project);
Collection<DataNode<ModuleData>> cachedModules = subset.getCachedModuleData();
if (cachedModules != null) {
for (DataNode<ModuleData> moduleNode : cachedModules) {
if (moduleNames.contains(moduleNode.getData().getExternalName())) {
modulesToDisplayInDialog.add(moduleNode);
}
}
}
}
if (modulesToDisplayInDialog.isEmpty()) {
messages.add(message);
}
else {
messages.add(message, new AddOrRemoveModulesHyperlink());
}
}
}
}
private static class AddOrRemoveModulesHyperlink extends NotificationHyperlink {
AddOrRemoveModulesHyperlink() {
super("add.or.remove.modules", "Configure Project Subset");
}
@Override
protected void execute(@NotNull Project project) {
ProjectSubset subset = ProjectSubset.getInstance(project);
subset.addOrRemoveModules();
}
}
}