Revert "prefer to use JDK utils in low-level classes, do not extend DynamicBundle...
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / module / ModifiableModuleModel.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.module;
3
4 import com.intellij.openapi.project.Project;
5 import org.jetbrains.annotations.ApiStatus;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8 import org.jetbrains.annotations.SystemIndependent;
9
10 import java.io.File;
11 import java.io.IOException;
12 import java.nio.file.Path;
13 import java.util.Map;
14
15 /**
16  * Represents the model for the list of modules in a project, or a temporary copy
17  * of that model displayed in the configuration UI.
18  *
19  * @see ModuleManager#getModifiableModel()
20  */
21 @ApiStatus.NonExtendable
22 public interface ModifiableModuleModel {
23   /**
24    * Returns the list of all modules in the project. Same as {@link ModuleManager#getModules()}.
25    *
26    * @return the array of modules.
27    */
28   Module @NotNull [] getModules();
29
30   @NotNull Module newModule(@NotNull String filePath, @NotNull String moduleTypeId);
31
32   /**
33    * Creates a module of the specified type at the specified path and adds it to the project
34    * to which the module manager is related. {@link #commit()} must be called to
35    * bring the changes in effect.
36    *
37    * @param file         path to an *.iml file where module configuration will be saved; name of the module will be equal to the file name without extension.
38    * @param moduleTypeId the ID of the module type to create.
39    * @return the module instance.
40    */
41   default @NotNull Module newModule(@NotNull Path file, @NotNull String moduleTypeId) {
42     return newModule(file.toAbsolutePath().normalize().toString().replace(File.separatorChar, '/'), moduleTypeId);
43   }
44
45   /**
46    * Creates a non-persistent module of the specified type and adds it to the project
47    * to which the module manager is related. {@link #commit()} must be called to
48    * bring the changes in effect.
49    *
50    * In contrast with modules created by {@link #newModule(String, String)},
51    * non-persistent modules aren't stored on a filesystem and aren't being written
52    * in a project XML file. When IDE closes, all non-persistent modules vanishes out.
53    */
54   @ApiStatus.Experimental
55   @NotNull
56   default Module newNonPersistentModule(@NotNull String moduleName, @NotNull String moduleTypeId) {
57     throw new UnsupportedOperationException();
58   }
59
60   /**
61    * @deprecated use {@link #newModule(String, String)} instead
62    */
63   @Deprecated
64   @NotNull
65   Module newModule(@NotNull String filePath, @NotNull String moduleTypeId, @Nullable Map<String, String> options);
66
67   /**
68    * Loads a module from an .iml file with the specified path and adds it to the project.
69    * {@link #commit()} must be called to bring the changes in effect.
70    *
71    * @param filePath the path to load the module from.
72    * @return the module instance.
73    * @throws IOException                 if an I/O error occurred when loading the module file.
74    * @throws ModuleWithNameAlreadyExists if a module with such a name already exists in the project.
75    */
76   @NotNull
77   Module loadModule(@NotNull @SystemIndependent String filePath) throws IOException, ModuleWithNameAlreadyExists;
78
79   Module loadModule(@NotNull Path file) throws IOException;
80
81   /**
82    * Disposes of the specified module and removes it from the project. {@link #commit()}
83    * must be called to bring the changes in effect.
84    *
85    * @param module the module to remove.
86    */
87   void disposeModule(@NotNull Module module);
88
89   /**
90    * Returns the project module with the specified name.
91    *
92    * @param name the name of the module to find.
93    * @return the module instance, or null if no module with such name exists.
94    */
95   @Nullable
96   Module findModuleByName(@NotNull String name);
97
98   /**
99    * Disposes of all modules in the project.
100    */
101   void dispose();
102
103   /**
104    * Checks if there are any uncommitted changes to the model.
105    *
106    * @return true if there are uncommitted changes, false otherwise
107    */
108   boolean isChanged();
109
110   /**
111    * Commits changes made in this model to the actual project structure.
112    */
113   void commit();
114
115   /**
116    * Schedules the rename of a module to be performed when the model is committed.
117    *
118    * @param module  the module to rename.
119    * @param newName the new name to rename the module to.
120    * @throws ModuleWithNameAlreadyExists if a module with such a name already exists in the project.
121    */
122   void renameModule(@NotNull Module module, @NotNull String newName) throws ModuleWithNameAlreadyExists;
123
124   /**
125    * Returns the project module which has been renamed to the specified name.
126    *
127    * @param newName the name of the renamed module to find.
128    * @return the module instance, or null if no module has been renamed to such a name.
129    */
130   @Nullable
131   Module getModuleToBeRenamed(@NotNull String newName);
132
133   /**
134    * Returns the name to which the specified module has been renamed.
135    *
136    * @param module the module for which the new name is requested.
137    * @return the new name, or null if the module has not been renamed.
138    */
139   @Nullable
140   String getNewName(@NotNull Module module);
141
142   /**
143    * @return the new name of {@code module} if it has been renamed or its old name it hasn't.
144    */
145   @NotNull
146   String getActualName(@NotNull Module module);
147
148   String @Nullable [] getModuleGroupPath(@NotNull Module module);
149
150   boolean hasModuleGroups();
151
152   void setModuleGroupPath(@NotNull Module module, String @Nullable("null means remove") [] groupPath);
153
154   @NotNull
155   Project getProject();
156 }