Revert "prefer to use JDK utils in low-level classes, do not extend DynamicBundle...
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / roots / ModifiableRootModel.java
1 /*
2  * Copyright 2000-2019 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.roots;
17
18 import com.intellij.openapi.module.Module;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.projectRoots.Sdk;
21 import com.intellij.openapi.roots.libraries.Library;
22 import com.intellij.openapi.roots.libraries.LibraryTable;
23 import com.intellij.openapi.vfs.VirtualFile;
24 import com.intellij.util.Consumer;
25 import org.jetbrains.annotations.ApiStatus;
26 import org.jetbrains.annotations.NonNls;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 /**
31  * Model of roots that should be used by clients to modify module roots.
32  * <p/>
33  * Invoke {@link #commit()} to persist changes, see also {@link ModuleRootModificationUtil}.
34  *
35  * @author dsl
36  * @see ModuleRootManager#getModifiableModel()
37  * @see ModuleRootModificationUtil
38  */
39 @ApiStatus.NonExtendable
40 public interface ModifiableRootModel extends ModuleRootModel {
41   @NotNull
42   Project getProject();
43
44   /**
45    * Adds the specified file or directory as a content root.
46    *
47    * @param root root of a content
48    * @return new content entry
49    */
50   @NotNull
51   ContentEntry addContentEntry(@NotNull VirtualFile root);
52
53   /**
54    * Adds the specified file or directory as a content root.
55    *
56    * @param url root of a content
57    * @return new content entry
58    */
59   @NotNull
60   ContentEntry addContentEntry(@NotNull String url);
61
62   /**
63    * Remove the specified content root.
64    *
65    * @param entry the content root to remove.
66    */
67   void removeContentEntry(@NotNull ContentEntry entry);
68
69   /**
70    * Appends an order entry to the classpath.
71    *
72    * @param orderEntry the order entry to add.
73    */
74   void addOrderEntry(@NotNull OrderEntry orderEntry);
75
76   /**
77    * Creates an entry for a given library and adds it to order.
78    *
79    * @param library the library for which the entry is created.
80    * @return newly created order entry for the library
81    */
82   @NotNull
83   LibraryOrderEntry addLibraryEntry(@NotNull Library library);
84
85   /**
86    * Adds an entry for invalid library.
87    */
88   @NotNull
89   LibraryOrderEntry addInvalidLibrary(@NotNull @NonNls String name, @NotNull String level);
90
91   @NotNull
92   ModuleOrderEntry addModuleOrderEntry(@NotNull Module module);
93
94   @NotNull
95   ModuleOrderEntry addInvalidModuleEntry(@NotNull String name);
96
97   @Nullable
98   ModuleOrderEntry findModuleOrderEntry(@NotNull Module module);
99
100   @Nullable
101   LibraryOrderEntry findLibraryOrderEntry(@NotNull Library library);
102
103   /**
104    * Removes order entry from an order.
105    */
106   void removeOrderEntry(@NotNull OrderEntry orderEntry);
107
108   void rearrangeOrderEntries(OrderEntry @NotNull [] newOrder);
109
110   void clear();
111
112   /**
113    * Commits changes to a {@link ModuleRootManager}.
114    * Should be invoked in a write action. After <code>commit()<code>, the model
115    * becomes read-only.
116    * <p>
117    * Use of {@link ModuleRootModificationUtil#updateModel(Module, Consumer)} is recommended.
118    */
119   void commit();
120
121   /**
122    * Must be invoked for uncommitted models that are no longer needed.
123    * <p>
124    * Use of {@link ModuleRootModificationUtil#updateModel(Module, Consumer)} is recommended.
125    */
126   void dispose();
127
128   /**
129    * Returns library table with module libraries.
130    * <p/>
131    * <b>Note:</b> returned library table does not support listeners. Also, one shouldn't invoke 'commit()' or 'dispose()' methods on it,
132    * it is automatically committed or disposed along with this {@link ModifiableRootModel} instance.
133    *
134    * @return library table to be modified
135    */
136   @NotNull
137   LibraryTable getModuleLibraryTable();
138
139   /**
140    * Sets SDK for this module to a specific value.
141    */
142   void setSdk(@Nullable Sdk sdk);
143
144   /**
145    * Sets JDK name and type for this module.
146    * To be used when SDK with this name and type does not exist (e.g. when importing module configuration).
147    *
148    * @param sdkName SDK name
149    * @param sdkType SDK type
150    */
151   void setInvalidSdk(@NotNull String sdkName, @NotNull String sdkType);
152
153   /**
154    * Makes this module inheriting SDK from its project.
155    */
156   void inheritSdk();
157
158   boolean isChanged();
159
160   boolean isWritable();
161
162   <T extends OrderEntry> void replaceEntryOfType(@NotNull Class<T> entryClass, T entry);
163
164   @Nullable
165   String getSdkName();
166
167   boolean isDisposed();
168 }