| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more contributor license |
| * agreements. See the NOTICE file distributed with this work for additional information regarding |
| * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the License. You may obtain a |
| * copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package org.apache.geode.management.internal.cli.commands.lifecycle; |
| |
| import static org.apache.geode.internal.process.ProcessStreamReader.waitAndCaptureProcessStandardErrorStream; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.apache.commons.lang3.StringUtils; |
| import org.springframework.shell.core.annotation.CliCommand; |
| import org.springframework.shell.core.annotation.CliOption; |
| |
| import org.apache.geode.management.cli.CliMetaData; |
| import org.apache.geode.management.internal.cli.GfshParser; |
| import org.apache.geode.management.internal.cli.commands.OfflineGfshCommand; |
| import org.apache.geode.management.internal.cli.i18n.CliStrings; |
| import org.apache.geode.management.internal.cli.result.model.InfoResultModel; |
| import org.apache.geode.management.internal.cli.result.model.ResultModel; |
| import org.apache.geode.management.internal.cli.util.JdkTool; |
| |
| public class StartJVisualVMCommand extends OfflineGfshCommand { |
| @CliCommand(value = CliStrings.START_JVISUALVM, help = CliStrings.START_JVISUALVM__HELP) |
| @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_MANAGER, |
| CliStrings.TOPIC_GEODE_JMX, CliStrings.TOPIC_GEODE_M_AND_M}) |
| public ResultModel startJVisualVM( |
| @CliOption(key = CliStrings.START_JCONSOLE__J, optionContext = GfshParser.J_OPTION_CONTEXT, |
| help = CliStrings.START_JCONSOLE__J__HELP) final String[] jvmArgs) |
| throws IOException { |
| |
| String jvisualvmProcessOutput = getProcessOutput(jvmArgs); |
| |
| ResultModel result = new ResultModel(); |
| InfoResultModel infoResultModel = result.addInfo(); |
| |
| if (StringUtils.isNotBlank(jvisualvmProcessOutput)) { |
| infoResultModel.addLine(System.lineSeparator()); |
| infoResultModel.addLine(jvisualvmProcessOutput); |
| } |
| |
| return result; |
| |
| } |
| |
| String getProcessOutput(String[] jvmArgs) throws IOException { |
| String[] jvisualvmCommandLine = createJVisualVMCommandLine(jvmArgs); |
| |
| if (isDebugging()) { |
| getGfsh().printAsInfo( |
| String.format("JVisualVM command-line (%1$s)", Arrays.toString(jvisualvmCommandLine))); |
| } |
| |
| Process jvisualvmProcess = Runtime.getRuntime().exec(jvisualvmCommandLine); |
| getGfsh().printAsInfo(CliStrings.START_JVISUALVM__RUN); |
| return waitAndCaptureProcessStandardErrorStream(jvisualvmProcess); |
| } |
| |
| String[] createJVisualVMCommandLine(final String[] jvmArgs) { |
| List<String> commandLine = new ArrayList<>(); |
| |
| commandLine.add(JdkTool.getJVisualVMPathname()); |
| |
| if (jvmArgs != null) { |
| for (final String arg : jvmArgs) { |
| commandLine.add("-J" + arg); |
| } |
| } |
| |
| return commandLine.toArray(new String[commandLine.size()]); |
| } |
| } |