/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* 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 com.alibaba.druid.support.console;
import java.io.PrintStream;
public class Option {
public static final int DATA_SOURCE = 1 ;
public static final int SQL = 2 ;
public static final int ACTIVE_CONN = 4 ;
private int printDataType = 0;
private int pid = -1;
private int id = -1;
private int interval = -1;
private boolean detailPrint;
private PrintStream printStream = System.out;
public void addPrintDataType(int newValue) {
this.printDataType= this.printDataType | newValue;
}
public static boolean isPrintHelp(String[] args) {
if (args == null ) {
return true;
}
for (String arg: args) {
if (arg.equals("-help") ) {
return true;
}
}
return false;
}
public boolean printSqlData() {
return ((printDataType & SQL) == SQL);
}
public boolean printDataSourceData() {
return ( (printDataType & DATA_SOURCE) == DATA_SOURCE);
}
public boolean printActiveConn() {
return ( (printDataType & ACTIVE_CONN) == ACTIVE_CONN);
}
public int getPrintDataType() {
return this.printDataType;
}
public void setPid(int pid) {
this.pid=pid;
}
public int getPid() {
return this.pid;
}
public static String getUrl(int dataType) {
switch (dataType) {
case SQL:
return "/sql.json";
case DATA_SOURCE:
return "/datasource.json";
case ACTIVE_CONN:
return "/activeConnectionStackTrace.json";
default:
return null;
}
}
private static int parsePositiveInt(String v) {
try {
return Integer.parseInt(v);
} catch (NumberFormatException e) {
return -1;
}
}
public static Option parseOptions(String[] args) throws OptionParseException{
Option option = new Option();
int i = 0;
if (args.length < 1 ) {
throw new OptionParseException("not enough arguments!");
}
while (i < args.length) {
int v1 = parsePositiveInt(args[i]);
//check last two arguments
if ( (i == args.length - 2) && v1 > 0) {
int v2 = parsePositiveInt(args[i+1]);
if ( v2 > 0) {
option.setPid(v1);
option.setInterval(v2);
} else {
throw new OptionParseException("请在参数的最后位置上 指定 pid 和 refresh-interval");
}
break;
} else if ( i == args.length -1 ) {
option.setPid(v1);
}
if (args[i].equals("-sql")) {
option.addPrintDataType(SQL);
} else if (args[i].equals("-ds")) {
option.addPrintDataType(DATA_SOURCE);
} else if (args[i].equals("-act")) {
option.addPrintDataType(ACTIVE_CONN);
} else if (args[i].equals("-detail")) {
option.setDetailPrint(true);
} else if (args[i].equals("-id")) {
try {
int id = Integer.parseInt(args[i+1]);
option.setId(id);
i++;
} catch (NumberFormatException e) {
throw new OptionParseException("id参数必须是整数");
}
}
i++;
}
if (option.getPrintDataType() == 0) {
throw new OptionParseException("请在{'-sql','-ds','-act'}参数中选择一个或多个");
}
if (option.getPid() == -1 ) {
throw new OptionParseException("请在参数中指定 pid");
}
return option;
}
public static void printHelp(String errorMsg) {
printHelp(System.out, errorMsg);
}
public static void printHelp() {
printHelp(System.out, null);
}
public static void printHelp(PrintStream out, String errorMsg) {
if (errorMsg != null ) {
out.println(errorMsg);
out.println();
}
out.println("Usage: druidStat -help | -sql -ds -act [-detail] [-id id] <pid> [refresh-interval]");
out.println();
out.println("参数: ");
out.println(" -help 打印此帮助信息");
out.println(" -sql 打印SQL统计数据");
out.println(" -ds 打印DataSource统计数据");
out.println(" -act 打印活动连接的堆栈信息");
out.println(" -detail 打印统计数据的全部字段信息");
out.println(" -id id 要打印的数据的具体id值" );
out.println(" pid 使用druid连接池的jvm进程id");
out.println(" refresh-interval 自动刷新时间间隔, 以秒为单位" );
out.println();
out.println("说明: ");
out.println(" -sql,-ds,-act参数中要至少指定一种数据进行打印, 可以");
out.println(" 组合使用, 比如 -sql -ds 一起的话就打印两种统计数据");
out.println(" -id id可以跟 -sql 或-ds组合, 比如 -sql -id 5 或 -ds -id 1086752");
out.println(" pid必需指定, refresh-interval可选, 如不指定,则打印数据后退出");
out.println(" pid和refresh-interval参数必需放在命令行的最后, 否则解析会出错");
out.println();
out.println("例子: ");
out.println(" 打印3983进程的sql 统计数据.");
out.println(" >druidStat -sql 3983");
out.println(" 打印3983进程的ds统计数据.");
out.println(" >druidStat -ds 3983");
out.println(" 打印3983进程的sql的id为10的详细统计数据.");
out.println(" >druidStat -sql -id 10 -detail 3983");
out.println(" 打印3983进程的当前活动连接的堆栈信息");
out.println(" >druidStat -act 3983");
out.println(" 打印3983进程的ds,sql,和act信息");
out.println(" >druidStat -ds -sql -act 3983");
out.println(" 每隔5秒自动打印ds统计数据");
out.println(" >druidStat -ds 3983 5");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setDetailPrint(boolean detailPrint) {
this.detailPrint=detailPrint;
}
public boolean isDetailPrint() {
return this.detailPrint;
}
public void setInterval(int interval) {
this.interval=interval;
}
public int getInterval() {
return this.interval;
}
public void setPrintStream(PrintStream printStream) {
this.printStream=printStream;
}
public PrintStream getPrintStream() {
return this.printStream;
}
}