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