All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.gridkit.jvmtool.JvmProcessPrinter Maven / Gradle / Ivy

/**
 * Copyright 2013 Alexey Ragozin
 *
 * Licensed 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.gridkit.jvmtool;

import java.util.List;

import org.gridkit.lab.jvm.attach.AttachManager;
import org.gridkit.lab.jvm.attach.JavaProcessId;

import com.beust.jcommander.Parameter;

/**
 * Configurable process description builder
 *  
 * @author Alexey Ragozin ([email protected])
 */
public class JvmProcessPrinter {
	
	@Parameter(names = {"-pd", "--process-details"}, variableArity = true, description = "Print custom information related to a process. Following tags can be used: PID, MAIN, FDQN_MAIN, ARGS, D, d, X")
	private List displayFields;
	
	public boolean isDefined() {
		return displayFields != null && !displayFields.isEmpty();
	}

	public String describe(JavaProcessId jpid) {
		StringBuilder sb = new StringBuilder();
		boolean first = true;
		for(String tag: displayFields) {
			if (!first) {
				sb.append('\t');
			}
			first = false;
			if ("PID".equals(tag)) {
				sb.append(getPid(jpid));
			}
			else if ("MAIN".equals(tag)) {
				sb.append(getShortMain(jpid));
			}
			else if ("FDQN_MAIN".equals(tag)) {
				sb.append(getMain(jpid));
			}
			else if ("ARGS".equals(tag)) {
				sb.append(getArgs(jpid));
			}
			else if (tag.startsWith("d")) {
				sb.append(getProp(jpid, tag.substring(1)));
			}
			else if (tag.startsWith("D")) {
				sb.append(tag.substring(1)).append("=");
				sb.append(getProp(jpid, tag.substring(1)));
			}
			else if (tag.startsWith("X")) {
				sb.append(getFlag(jpid, tag.substring(1)));
			}
			else {
				sb.append("Unknown(" + tag + ")");
			}
		}
		
		return sb.toString();
	}

	private String getProp(JavaProcessId jpid, String propName) {
		return (String) AttachManager.getDetails(jpid).getSystemProperties().get(propName);
	}

	private String getFlag(JavaProcessId jpid, String flagName) {
		return (String) AttachManager.getDetails(jpid).getVmFlag(flagName);
	}

	private String getArgs(JavaProcessId jpid) {
		String desc = jpid.getDescription();		
		int n = desc.indexOf(' ');
		if (n >= 0) {
			desc = desc.substring(n + 1);
		}
		return desc;
	}

	private String getMain(JavaProcessId jpid) {
		String desc = jpid.getDescription();		
		int n = desc.indexOf(' ');
		if (n >= 0) {
			desc = desc.substring(0, n);
		}
		return desc;
	}

	private String getShortMain(JavaProcessId jpid) {
		String main = getMain(jpid);
		if (main.endsWith(".jar")) {
			return main;
		}
		int n = main.lastIndexOf('.');
		if (n >= 0) {
			main = main.substring(n + 1);
		}
		return main;
	}

	private String getPid(JavaProcessId jpid) {
		return String.valueOf(jpid.getPID());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy