828ee744b47e808a34874a48dbfe2dd418db6020
[idea/community.git] / platform / lang-impl / src / com / intellij / openapi / module / impl / ModuleManagerComponent.java
1 /*
2  * Copyright 2000-2014 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.module.impl;
17
18 import com.intellij.ProjectTopics;
19 import com.intellij.notification.Notification;
20 import com.intellij.notification.NotificationType;
21 import com.intellij.notification.Notifications;
22 import com.intellij.openapi.application.Application;
23 import com.intellij.openapi.application.ApplicationManager;
24 import com.intellij.openapi.components.State;
25 import com.intellij.openapi.components.Storage;
26 import com.intellij.openapi.components.StoragePathMacros;
27 import com.intellij.openapi.components.StorageScheme;
28 import com.intellij.openapi.diagnostic.Logger;
29 import com.intellij.openapi.module.Module;
30 import com.intellij.openapi.module.ModuleType;
31 import com.intellij.openapi.module.UnknownModuleType;
32 import com.intellij.openapi.progress.ProgressIndicator;
33 import com.intellij.openapi.progress.ProgressManager;
34 import com.intellij.openapi.project.Project;
35 import com.intellij.openapi.project.ProjectBundle;
36 import com.intellij.openapi.project.impl.ProjectLifecycleListener;
37 import com.intellij.util.messages.MessageBus;
38 import com.intellij.util.messages.MessageBusConnection;
39 import com.intellij.util.messages.MessageHandler;
40
41 import java.io.IOException;
42 import java.lang.reflect.Method;
43 import java.util.List;
44
45 /**
46  * @author yole
47  */
48 @State(
49   name = ModuleManagerImpl.COMPONENT_NAME,
50   storages = {
51     @Storage(file = StoragePathMacros.PROJECT_FILE),
52     @Storage(file = StoragePathMacros.PROJECT_CONFIG_DIR + "/modules.xml", scheme = StorageScheme.DIRECTORY_BASED)
53   }
54 )
55 public class ModuleManagerComponent extends ModuleManagerImpl {
56   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.module.impl.ModuleManagerComponent");
57   private final ProgressManager myProgressManager;
58   private final MessageBusConnection myConnection;
59
60   public ModuleManagerComponent(Project project, ProgressManager progressManager, MessageBus bus) {
61     super(project, bus);
62     myConnection = bus.connect(project);
63     myProgressManager = progressManager;
64     myConnection.setDefaultHandler(new MessageHandler() {
65       @Override
66       public void handle(Method event, Object... params) {
67         cleanCachedStuff();
68       }
69     });
70
71     myConnection.subscribe(ProjectTopics.PROJECT_ROOTS);
72     myConnection.subscribe(ProjectLifecycleListener.TOPIC, new ProjectLifecycleListener.Adapter() {
73       @Override
74       public void projectComponentsInitialized(final Project project) {
75         long t = System.currentTimeMillis();
76         loadModules(myModuleModel);
77         t = System.currentTimeMillis() - t;
78         LOG.info(myModuleModel.getModules().length + " module(s) loaded in " + t + " ms");
79       }
80     });
81
82   }
83
84   @Override
85   protected void showUnknownModuleTypeNotification(List<Module> modulesWithUnknownTypes) {
86     if (!ApplicationManager.getApplication().isHeadlessEnvironment() && !modulesWithUnknownTypes.isEmpty()) {
87       String message;
88       if (modulesWithUnknownTypes.size() == 1) {
89         message = ProjectBundle.message("module.unknown.type.single.error", modulesWithUnknownTypes.get(0).getName(),
90                                         ModuleType.get(modulesWithUnknownTypes.get(0)).getId());
91       }
92       else {
93         StringBuilder modulesBuilder = new StringBuilder();
94         for (final Module module : modulesWithUnknownTypes) {
95           modulesBuilder.append("<br>\"");
96           modulesBuilder.append(module.getName()).append("\" (type '").append(ModuleType.get(module).getId()).append("')");
97         }
98         modulesBuilder.append("<br>");
99         message = ProjectBundle.message("module.unknown.type.multiple.error", modulesBuilder.toString());
100       }
101       // it is not modal warning at all
102       //Messages.showWarningDialog(myProject, message, ProjectBundle.message("module.unknown.type.title"));
103       Notifications.Bus.notify(new Notification(
104         "Module Manager",
105         ProjectBundle.message("module.unknown.type.title"),
106         message,
107         NotificationType.WARNING
108       ), myProject);
109     }
110   }
111
112   @Override
113   protected ModuleEx createModule(String filePath) {
114     return new ModuleImpl(filePath, myProject);
115   }
116
117   @Override
118   protected ModuleEx createAndLoadModule(String filePath) throws IOException {
119     ModuleImpl module = new ModuleImpl(filePath, myProject);
120     module.getStateStore().load();
121     return module;
122   }
123
124   @Override
125   protected boolean isUnknownModuleType(Module module) {
126     return ModuleType.get(module) instanceof UnknownModuleType;
127   }
128
129   @Override
130   protected void fireModulesAdded() {
131     Runnable runnableWithProgress = new Runnable() {
132       @Override
133       public void run() {
134         for (final Module module : myModuleModel.myPathToModule.values()) {
135           final Application app = ApplicationManager.getApplication();
136           final Runnable swingRunnable = new Runnable() {
137             @Override
138             public void run() {
139               fireModuleAddedInWriteAction(module);
140             }
141           };
142           if (app.isDispatchThread()) {
143             swingRunnable.run();
144           }
145           else {
146             ProgressIndicator pi = ProgressManager.getInstance().getProgressIndicator();
147             app.invokeAndWait(swingRunnable, pi.getModalityState());
148           }
149         }
150       }
151     };
152
153     ProgressIndicator progressIndicator = myProgressManager.getProgressIndicator();
154     if (progressIndicator == null) {
155       myProgressManager.runProcessWithProgressSynchronously(runnableWithProgress, "Initializing modules...", false, myProject);
156     }
157     else {
158       runnableWithProgress.run();
159     }
160   }
161
162   @Override
163   protected void deliverPendingEvents() {
164     myConnection.deliverImmediately();
165   }
166 }