Updating versions of project dependencies: rkernelVersion->master.130
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / projectRoot / daemon / ModuleProjectStructureElement.java
1 package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon;
2
3 import com.intellij.CommonBundle;
4 import com.intellij.ide.JavaUiBundle;
5 import com.intellij.openapi.module.ModifiableModuleModel;
6 import com.intellij.openapi.module.Module;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.projectRoots.Sdk;
9 import com.intellij.openapi.roots.*;
10 import com.intellij.openapi.roots.libraries.Library;
11 import com.intellij.openapi.roots.ui.configuration.ModuleEditor;
12 import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
13 import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
14 import com.intellij.util.ArrayUtil;
15 import org.jetbrains.annotations.Nls;
16 import org.jetbrains.annotations.NotNull;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 public class ModuleProjectStructureElement extends ProjectStructureElement {
22   private final Module myModule;
23
24   public ModuleProjectStructureElement(@NotNull StructureConfigurableContext context, @NotNull Module module) {
25     super(context);
26     myModule = module;
27   }
28
29   public Module getModule() {
30     return myModule;
31   }
32
33   public void checkModulesNames(ProjectStructureProblemsHolder problemsHolder) {
34     final ModifiableModuleModel moduleModel = myContext.getModulesConfigurator().getModuleModel();
35     final Module[] all = moduleModel.getModules();
36     if (!ArrayUtil.contains(myModule, all)) {
37       return;//module has been deleted
38     }
39
40     for (Module each : all) {
41       if (each != myModule && myContext.getRealName(each).equals(myContext.getRealName(myModule))) {
42         problemsHolder.registerProblem(JavaUiBundle.message("project.roots.module.duplicate.name.message"), null,
43                                        ProjectStructureProblemType.error("duplicate-module-name"), createPlace(),
44                                        null);
45         break;
46       }
47     }
48   }
49
50   @Override
51   public void check(ProjectStructureProblemsHolder problemsHolder) {
52     checkModulesNames(problemsHolder);
53
54     final ModuleRootModel rootModel = myContext.getModulesConfigurator().getRootModel(myModule);
55     if (rootModel == null) return; //already disposed
56     final OrderEntry[] entries = rootModel.getOrderEntries();
57     for (OrderEntry entry : entries) {
58       if (!entry.isValid()){
59         if (entry instanceof JdkOrderEntry && ((JdkOrderEntry)entry).getJdkName() == null) {
60           if (!(entry instanceof InheritedJdkOrderEntry)) {
61             problemsHolder.registerProblem(JavaUiBundle.message("project.roots.module.jdk.problem.message"), null, ProjectStructureProblemType.error("module-sdk-not-defined"), createPlace(entry),
62                                            null);
63           }
64         }
65         else {
66           problemsHolder.registerProblem(JavaUiBundle.message("project.roots.library.problem.message", entry.getPresentableName()), null,
67                                          ProjectStructureProblemType.error("invalid-module-dependency"), createPlace(entry),
68                                          null);
69         }
70       }
71     }
72   }
73
74   private PlaceInProjectStructure createPlace() {
75     final Project project = myContext.getProject();
76     return new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulePlace(myModule), this);
77   }
78
79   private PlaceInProjectStructure createPlace(OrderEntry entry) {
80     return new PlaceInModuleClasspath(myContext, myModule, this, entry);
81   }
82
83   @Override
84   public List<ProjectStructureElementUsage> getUsagesInElement() {
85     final List<ProjectStructureElementUsage> usages = new ArrayList<>();
86     final ModuleEditor moduleEditor = myContext.getModulesConfigurator().getModuleEditor(myModule);
87     if (moduleEditor != null) {
88       for (OrderEntry entry : moduleEditor.getOrderEntries()) {
89         if (entry instanceof ModuleOrderEntry) {
90           ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry;
91           final Module module = moduleOrderEntry.getModule();
92           if (module != null) {
93             usages.add(new UsageInModuleClasspath(myContext, this, new ModuleProjectStructureElement(myContext, module), moduleOrderEntry.getScope()));
94           }
95         }
96         else if (entry instanceof LibraryOrderEntry) {
97           LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry)entry;
98           final Library library = libraryOrderEntry.getLibrary();
99           if (library != null) {
100             usages.add(new UsageInModuleClasspath(myContext, this, new LibraryProjectStructureElement(myContext, library),
101                                                   libraryOrderEntry.getScope()));
102           }
103         }
104         else if (entry instanceof JdkOrderEntry) {
105           final Sdk jdk = ((JdkOrderEntry)entry).getJdk();
106           if (jdk != null) {
107             usages.add(new UsageInModuleClasspath(myContext, this, new SdkProjectStructureElement(myContext, jdk), null));
108           }
109         }
110       }
111     }
112     return usages;
113   }
114
115   @Override
116   public boolean equals(Object o) {
117     if (this == o) return true;
118     if (!(o instanceof ModuleProjectStructureElement)) return false;
119
120     return myModule.equals(((ModuleProjectStructureElement)o).myModule);
121
122   }
123
124   @Override
125   public int hashCode() {
126     return myModule.hashCode();
127   }
128
129   @Override
130   public @Nls(capitalization = Nls.Capitalization.Sentence) String getPresentableName() {
131     return myModule.getName();
132   }
133
134   @Override
135   public @Nls(capitalization = Nls.Capitalization.Sentence) String getTypeName() {
136     return CommonBundle.message("label.module");
137   }
138
139   @Override
140   public String getId() {
141     return "module:" + myModule.getName();
142   }
143 }