1 /* 2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.tools.jcmd; 27 28 import java.io.BufferedReader; 29 import java.io.FileReader; 30 import java.io.IOException; 31 32 class Arguments { 33 private boolean listProcesses = false; 34 private boolean listCounters = false; 35 private boolean showUsage = false; 36 private String command = null; 37 private String processString = null; 38 39 public boolean isListProcesses() { return listProcesses; } 40 public boolean isListCounters() { return listCounters; } 41 public boolean isShowUsage() { return showUsage; } 42 public String getCommand() { return command; } 43 public String getProcessString() { return processString; } 44 45 public Arguments(String[] args) { 46 if (args.length == 0 || args[0].equals("-l")) { 47 listProcesses = true; 48 /* list all processes */ 49 processString = "0"; 50 return; 51 } 52 53 // -help: legacy. Undocumented. 54 if (args[0].equals("-?") || args[0].equals("-h") || args[0].equals("--help") || args[0].equals("-help")) { 55 showUsage = true; 56 return; 57 } 58 59 processString = args[0]; 60 61 StringBuilder sb = new StringBuilder(); 62 for (int i = 1; i < args.length; i++) { 63 if (args[i].equals("-f")) { 64 if (args.length == i + 1) { 65 throw new IllegalArgumentException( 66 "No file specified for parameter -f"); 67 } else if (args.length == i + 2) { 68 try { 69 readCommandFile(args[i + 1]); 70 } catch(IOException e) { 71 throw new IllegalArgumentException( 72 "Could not read from file specified with -f option: " 73 + args[i + 1]); 74 } 75 return; 76 } else { 77 throw new IllegalArgumentException( 78 "Options after -f are not allowed"); 79 } 80 } else if (args[i].equals("PerfCounter.print")) { 81 listCounters = true; 82 } else { 83 sb.append(args[i]).append(" "); 84 } 85 } 86 87 if (listCounters != true && sb.length() == 0) { 88 throw new IllegalArgumentException("No command specified"); 89 } 90 91 command = sb.toString().trim(); 92 } 93 94 private void readCommandFile(String path) throws IOException { 95 try (BufferedReader bf = new BufferedReader(new FileReader(path));) { 96 StringBuilder sb = new StringBuilder(); 97 String s; 98 while ((s = bf.readLine()) != null) { 99 sb.append(s).append("\n"); 100 } 101 command = sb.toString(); 102 } 103 } 104 105 public static void usage() { 106 System.out.println("Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>"); 107 System.out.println(" or: jcmd -l "); 108 System.out.println(" or: jcmd -h "); 109 System.out.println(" "); 110 System.out.println(" command must be a valid jcmd command for the selected jvm. "); 111 System.out.println(" Use the command \"help\" to see which commands are available. "); 112 System.out.println(" If the pid is 0, commands will be sent to all Java processes. "); 113 System.out.println(" The main class argument will be used to match (either partially "); 114 System.out.println(" or fully) the class used to start Java. "); 115 System.out.println(" If no options are given, lists Java processes (same as -l). "); 116 System.out.println(" "); 117 System.out.println(" PerfCounter.print display the counters exposed by this process "); 118 System.out.println(" -f read and execute commands from the file "); 119 System.out.println(" -l list JVM processes on the local machine "); 120 System.out.println(" -? -h --help this help "); 121 } 122 }