/*
* This file is part of VisualVM for IDEA
*
* Copyright (c) 2008, Esko Luontola. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package krasa.visualvm.runner;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.configurations.ConfigurationInfoProvider;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.ModuleRunProfile;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.configurations.RunnerSettings;
import com.intellij.execution.impl.DefaultJavaProgramRunner;
import com.intellij.execution.remote.RemoteConfiguration;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.diagnostic.Logger;
import krasa.visualvm.*;
import krasa.visualvm.executor.RunVisualVMExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class RunVisualVMRunner extends DefaultJavaProgramRunner {
private static final Logger log = Logger.getInstance(DebugVisualVMRunner.class.getName());
@NotNull
public String getRunnerId() {
return RunVisualVMExecutor.RUN_WITH_VISUAL_VM;
}
public boolean canRun(@NotNull String executorId, @NotNull RunProfile profile) {
return executorId.equals(RunVisualVMExecutor.RUN_WITH_VISUAL_VM) && profile instanceof ModuleRunProfile
&& !(profile instanceof RemoteConfiguration);
}
@Override
public void execute(@NotNull final ExecutionEnvironment env, @Nullable final Callback callback)
throws ExecutionException {
final VisualVMGenericRunnerSettings settings = ((VisualVMGenericRunnerSettings) env.getRunnerSettings());
if (settings != null) {
settings.generateId();
new VisualVMContext(settings).save();
}
LogHelper.print("#execute", this);
boolean b = MyConfigurable.openSettingsIfNotConfigured(env.getProject());
if (!b) {
return;
}
super.execute(env, callback);
}
@Override
protected RunContentDescriptor doExecute(@NotNull RunProfileState state, @NotNull ExecutionEnvironment env)
throws ExecutionException {
RunContentDescriptor runContentDescriptor = super.doExecute(state, env);
runVisualVM(env, state);
return runContentDescriptor;
}
@Override
public void onProcessStarted(RunnerSettings settings, ExecutionResult executionResult) {
super.onProcessStarted(settings, executionResult);
LogHelper.print("#onProcessStarted", this);
}
@Override
public void patch(JavaParameters javaParameters, RunnerSettings settings, RunProfile runProfile, final boolean beforeExecution) throws ExecutionException {
addVisualVMIdToJavaParameter(javaParameters, settings);
super.patch(javaParameters, settings, runProfile, beforeExecution);
}
/*used for tomcat and normal applications*/
private void addVisualVMIdToJavaParameter(JavaParameters javaParameters, RunnerSettings settings) throws ExecutionException {
final VisualVMGenericRunnerSettings runnerSettings = ((VisualVMGenericRunnerSettings) settings);
LogHelper.print("#addVisualVMIdToJavaParameter -Dvisualvm.id=" + runnerSettings.getVisualVMId(), this);
javaParameters.getVMParametersList().add("-Dvisualvm.id=" + runnerSettings.getVisualVMId());
}
@Override
@Nullable
public RunnerSettings createConfigurationData(final ConfigurationInfoProvider settingsProvider) {
return new VisualVMGenericRunnerSettings();
}
private void runVisualVM(ExecutionEnvironment env, RunProfileState state) throws ExecutionException {
final VisualVMGenericRunnerSettings settings = ((VisualVMGenericRunnerSettings) env.getRunnerSettings());
// tomcat uses PatchedLocalState
if (state.getClass().getSimpleName().equals(Hacks.BUNDLED_SERVERS_RUN_PROFILE_STATE)) {
LogHelper.print("#runVisualVMAsync " + settings.getVisualVMId(), this);
new Thread() {
@Override
public void run() {
try {
Thread.sleep(ApplicationSettingsComponent.getInstance().getState().getDelayForVisualVMStartAsLong());
VisualVMHelper.startVisualVM(settings, RunVisualVMRunner.this);
} catch (Exception e) {
log.error(e);
}
}
}.start();
} else {
VisualVMHelper.startVisualVM(settings, this);
}
}
}