345a043dd4e7c0d89629dc1eb37af65569c03203
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / roots / ModifiableRootModel.java
1 /*
2  * Copyright 2000-2017 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 org.jetbrains.annotations.NonNls;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 /**
29  * Model of roots that should be used by clients to modify module roots.
30  *
31  * @author dsl
32  * @see ModuleRootManager#getModifiableModel()
33  */
34 public interface ModifiableRootModel extends ModuleRootModel {
35   @NotNull
36   Project getProject();
37
38   /**
39    * Adds the specified file or directory as a content root.
40    *
41    * @param root root of a content
42    * @return new content entry
43    */
44   @NotNull
45   ContentEntry addContentEntry(@NotNull VirtualFile root);
46
47   /**
48    * Adds the specified file or directory as a content root.
49    *
50    * @param url root of a content
51    * @return new content entry
52    */
53   @NotNull
54   ContentEntry addContentEntry(@NotNull String url);
55
56   /**
57    * Remove the specified content root.
58    *
59    * @param entry the content root to remove.
60    */
61   void removeContentEntry(@NotNull ContentEntry entry);
62
63   /**
64    * Appends an order entry to the classpath.
65    *
66    * @param orderEntry the order entry to add.
67    */
68   void addOrderEntry(@NotNull OrderEntry orderEntry);
69
70   /**
71    * Creates an entry for a given library and adds it to order
72    *
73    * @param library the library for which the entry is created.
74    * @return newly created order entry for the library
75    */
76   @NotNull
77   LibraryOrderEntry addLibraryEntry(@NotNull Library library);
78
79   /**
80    * Adds an entry for invalid library.
81    */
82   @NotNull
83   LibraryOrderEntry addInvalidLibrary(@NotNull @NonNls String name, @NotNull String level);
84
85   @NotNull
86   ModuleOrderEntry addModuleOrderEntry(@NotNull Module module);
87
88   @NotNull
89   ModuleOrderEntry addInvalidModuleEntry(@NotNull String name);
90
91   @Nullable
92   ModuleOrderEntry findModuleOrderEntry(@NotNull Module module);
93
94   @Nullable
95   LibraryOrderEntry findLibraryOrderEntry(@NotNull Library library);
96
97   /**
98    * Removes order entry from an order.
99    */
100   void removeOrderEntry(@NotNull OrderEntry orderEntry);
101
102   void rearrangeOrderEntries(@NotNull OrderEntry[] newOrder);
103
104   void clear();
105
106   /**
107    * Commits changes to a <code>{@link ModuleRootManager}</code>.
108    * Should be invoked in a write action. After <code>commit()<code>, the model
109    * becomes read-only.
110    *
111    * Use of ModuleRootModificationUtil.updateModel() is recommended.
112    */
113   void commit();
114
115   /**
116    * Must be invoked for uncommitted models that are no longer needed.
117    *
118    * Use of ModuleRootModificationUtil.updateModel() is recommended.
119    */
120   void dispose();
121
122   /**
123    * Returns library table with module libraries.<br>
124    * <b>Note:</b> returned library table does not support listeners. Also one shouldn't invoke 'commit()' or 'dispose()' methods on it,
125    * it is automatically committed or disposed along with this {@link ModifiableRootModel} instance.
126    *
127    * @return library table to be modified
128    */
129   @NotNull
130   LibraryTable getModuleLibraryTable();
131
132   /**
133    * Sets JDK for this module to a specific value
134    */
135   void setSdk(@Nullable Sdk jdk);
136
137   /**
138    * Sets JDK name and type for this module.
139    * To be used when JDK with this name and type does not exist (e.g. when importing module configuration).
140    *
141    * @param sdkName JDK name
142    * @param sdkType JDK type
143    */
144   void setInvalidSdk(@NotNull String sdkName, String sdkType);
145
146   /**
147    * Makes this module inheriting JDK from its project
148    */
149   void inheritSdk();
150
151   boolean isChanged();
152
153   boolean isWritable();
154
155   <T extends OrderEntry> void replaceEntryOfType(@NotNull Class<T> entryClass, T entry);
156
157   @Nullable
158   String getSdkName();
159
160   boolean isDisposed();
161 }