/*
* Copyright 2015 Scouter Project.
*
* 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 scouter.agent.proxy;
import scouter.lang.pack.MapPack;
import scouter.lang.pack.Pack;
import scouter.lang.value.ListValue;
import scouter.util.SystemUtil;
import scouter.util.ThreadUtil;
import java.io.PrintWriter;
import java.util.List;
public class ToolsMainFactory {
private static final String TOOLS_MAIN = "scouter.xtra.tools.ToolsMain";
public static MapPack heaphisto(Pack param) throws Throwable {
MapPack m = new MapPack();
if (SystemUtil.IS_JAVA_1_5) {
m.put("error", "Not supported java version : " + SystemUtil.JAVA_VERSION);
return m;
}
if (SystemUtil.JAVA_VENDOR.startsWith("IBM")) {
m.put("error", "Not supported java vendor : " + SystemUtil.JAVA_VENDOR);
return m;
}
ClassLoader loader = LoaderManager.getToolsLoader();
if (loader == null) {
return null;
}
if (SystemUtil.JAVA_VENDOR.startsWith("IBM")) {
m.put("error", "Not supported java vendor : " + SystemUtil.JAVA_VENDOR);
return m;
}
try {
Class c = Class.forName(TOOLS_MAIN, true, loader);
IToolsMain toolsMain = (IToolsMain) c.newInstance();
List<String> out = toolsMain.heaphisto(0, 100000, "all");
ListValue lv = m.newList("heaphisto");
for (int i = 0; i < out.size(); i++) {
lv.add(out.get(i));
}
} catch (Exception e) {
m.put("error", e.getMessage());
}
return m;
}
public static void heaphisto(PrintWriter out) throws Throwable {
if (SystemUtil.IS_JAVA_1_5) {
return;
}
if (SystemUtil.JAVA_VENDOR.startsWith("IBM")) {
return;
}
ClassLoader loader = LoaderManager.getToolsLoader();
if (loader == null) {
return;
}
try {
Class c = Class.forName(TOOLS_MAIN, true, loader);
IToolsMain toolsMain = (IToolsMain) c.newInstance();
toolsMain.heaphisto(out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* get thread dump
* @param param
* @return
* @throws Throwable
*/
public static Pack threadDump(Pack param) throws Throwable {
MapPack m = new MapPack();
//Java 1.5 or IBM JDK
if (SystemUtil.IS_JAVA_1_5||SystemUtil.JAVA_VENDOR.startsWith("IBM")) {
List<String> out = ThreadUtil.getThreadDumpList();
ListValue lv = m.newList("threadDump");
for (int i = 0; i < out.size(); i++) {
lv.add(out.get(i));
}
return m;
}
ClassLoader loader = LoaderManager.getToolsLoader();
if (loader == null) {
List<String> out = ThreadUtil.getThreadDumpList();
ListValue lv = m.newList("threadDump");
for (int i = 0; i < out.size(); i++) {
lv.add(out.get(i));
}
return m;
}
try {
Class c = Class.forName(TOOLS_MAIN, true, loader);
IToolsMain toolsMain = (IToolsMain) c.newInstance();
List<String> out = (List<String>) toolsMain.threadDump(0, 100000);
ListValue lv = m.newList("threadDump");
for (int i = 0; i < out.size(); i++) {
lv.add(out.get(i));
}
} catch (Exception e) {
m.put("error", e.getMessage());
}
return m;
}
public static boolean activeStack = false;
public static synchronized void threadDump(PrintWriter out) throws Throwable {
activeStack = true;
if (SystemUtil.IS_JAVA_1_5 || SystemUtil.JAVA_VENDOR.startsWith("IBM")) {
out.print(ThreadUtil.getThreadDump());
return;
}
ClassLoader loader = LoaderManager.getToolsLoader();
if (loader == null) {
out.print(ThreadUtil.getThreadDump());
return;
}
try {
Class c = Class.forName(TOOLS_MAIN, true, loader);
IToolsMain toolsMain = (IToolsMain) c.newInstance();
toolsMain.threadDump(out);
} catch (Exception e) {
e.printStackTrace();
}
}
}