moved REMOTE_SESSION_KEY init into base attachVirtualMachine
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / ui / DebuggerPanelsManager.java
1 /*
2  * Copyright 2000-2016 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.debugger.ui;
17
18 import com.intellij.debugger.DebugEnvironment;
19 import com.intellij.debugger.DebugUIEnvironment;
20 import com.intellij.debugger.DebuggerManagerEx;
21 import com.intellij.debugger.DefaultDebugUIEnvironment;
22 import com.intellij.debugger.engine.JavaDebugProcess;
23 import com.intellij.debugger.impl.DebuggerContextImpl;
24 import com.intellij.debugger.impl.DebuggerSession;
25 import com.intellij.debugger.impl.DebuggerStateManager;
26 import com.intellij.execution.ExecutionException;
27 import com.intellij.execution.Executor;
28 import com.intellij.execution.configurations.RemoteConnection;
29 import com.intellij.execution.configurations.RunProfileState;
30 import com.intellij.execution.executors.DefaultDebugExecutor;
31 import com.intellij.execution.runners.ExecutionEnvironment;
32 import com.intellij.execution.ui.RunContentDescriptor;
33 import com.intellij.execution.ui.RunContentManager;
34 import com.intellij.execution.ui.RunContentWithExecutorListener;
35 import com.intellij.openapi.components.ProjectComponent;
36 import com.intellij.openapi.project.Project;
37 import com.intellij.openapi.util.Comparing;
38 import com.intellij.xdebugger.XDebugProcess;
39 import com.intellij.xdebugger.XDebugProcessStarter;
40 import com.intellij.xdebugger.XDebugSession;
41 import com.intellij.xdebugger.XDebuggerManager;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44
45 public class DebuggerPanelsManager implements ProjectComponent {
46   private final Project myProject;
47
48   public DebuggerPanelsManager(Project project) {
49     myProject = project;
50   }
51
52   private DebuggerStateManager getContextManager() {
53     return DebuggerManagerEx.getInstanceEx(myProject).getContextManager();
54   }
55
56   @Nullable
57   public RunContentDescriptor attachVirtualMachine(@NotNull ExecutionEnvironment environment,
58                                                    RunProfileState state,
59                                                    RemoteConnection remoteConnection,
60                                                    boolean pollConnection) throws ExecutionException {
61     return attachVirtualMachine(new DefaultDebugUIEnvironment(environment, state, remoteConnection, pollConnection));
62   }
63
64   @Nullable
65   public RunContentDescriptor attachVirtualMachine(DebugUIEnvironment environment) throws ExecutionException {
66     final DebugEnvironment modelEnvironment = environment.getEnvironment();
67     final DebuggerSession debuggerSession = DebuggerManagerEx.getInstanceEx(myProject).attachVirtualMachine(modelEnvironment);
68     if (debuggerSession == null) {
69       return null;
70     }
71
72     XDebugSession debugSession =
73       XDebuggerManager.getInstance(myProject).startSessionAndShowTab(modelEnvironment.getSessionName(), environment.getReuseContent(), new XDebugProcessStarter() {
74         @Override
75         @NotNull
76         public XDebugProcess start(@NotNull XDebugSession session) {
77           return JavaDebugProcess.create(session, debuggerSession);
78         }
79       });
80     return debugSession.getRunContentDescriptor();
81   }
82
83
84   @Override
85   public void projectOpened() {
86     myProject.getMessageBus().connect(myProject).subscribe(RunContentManager.TOPIC, new RunContentWithExecutorListener() {
87       @Override
88       public void contentSelected(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor) {
89         if (executor == DefaultDebugExecutor.getDebugExecutorInstance()) {
90           DebuggerSession session = descriptor == null ? null : getSession(myProject, descriptor);
91           if (session != null) {
92             getContextManager().setState(session.getContextManager().getContext(), session.getState(), DebuggerSession.Event.CONTEXT, null);
93           }
94           else {
95             getContextManager().setState(DebuggerContextImpl.EMPTY_CONTEXT, DebuggerSession.State.DISPOSED, DebuggerSession.Event.CONTEXT, null);
96           }
97         }
98       }
99
100       @Override
101       public void contentRemoved(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor) {
102       }
103     });
104   }
105
106   @Override
107   public void projectClosed() {
108   }
109
110   @Override
111   @NotNull
112   public String getComponentName() {
113     return "DebuggerPanelsManager";
114   }
115
116   @Override
117   public void initComponent() {
118   }
119
120   @Override
121   public void disposeComponent() {
122   }
123
124   public static DebuggerPanelsManager getInstance(Project project) {
125     return project.getComponent(DebuggerPanelsManager.class);
126   }
127
128   private static DebuggerSession getSession(Project project, RunContentDescriptor descriptor) {
129     for (JavaDebugProcess process : XDebuggerManager.getInstance(project).getDebugProcesses(JavaDebugProcess.class)) {
130       if (Comparing.equal(process.getProcessHandler(), descriptor.getProcessHandler())) {
131         return process.getDebuggerSession();
132       }
133     }
134     return null;
135   }
136 }