1 /* 2 * Copyright (c) 2011, 2018, 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 if (args[0].equals("-?") || 54 args[0].equals("-h") || 55 args[0].equals("--help") || 56 // -help: legacy. 57 args[0].equals("-help")) { 58 showUsage = true; 59 return; 60 } 61 62 processString = args[0]; 63 64 StringBuilder sb = new StringBuilder(); 65 for (int i = 1; i < args.length; i++) { 66 if (args[i].equals("-f")) { 67 if (args.length == i + 1) { 68 throw new IllegalArgumentException( 69 "No file specified for parameter -f"); 70 } else if (args.length == i + 2) { 71 try { 72 readCommandFile(args[i + 1]); 73 } catch(IOException e) { 74 throw new IllegalArgumentException( 75 "Could not read from file specified with -f option: " 76 + args[i + 1]); 77 } 78 return; 79 } else { 80 throw new IllegalArgumentException( 81 "Options after -f are not allowed"); 82 } 83 } else if (args[i].equals("PerfCounter.print")) { 84 listCounters = true; 85 } else { 86 sb.append(args[i]).append(" "); 87 } 88 } 89 90 if (listCounters != true && sb.length() == 0) { 91 throw new IllegalArgumentException("No command specified"); 92 } 93 94 command = sb.toString().trim(); 95 } 96 97 private void readCommandFile(String path) throws IOException { 98 try (BufferedReader bf = new BufferedReader(new FileReader(path));) { 99 StringBuilder sb = new StringBuilder(); 100 String s; 101 while ((s = bf.readLine()) != null) { 102 sb.append(s).append("\n"); 103 } 104 command = sb.toString(); 105 } 106 } 107 108 public static void usage() { 109 System.out.println("Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>"); 110 System.out.println(" or: jcmd -l "); 111 System.out.println(" or: jcmd -h "); 112 System.out.println(" "); 113 System.out.println(" command must be a valid jcmd command for the selected jvm. "); 114 System.out.println(" Use the command \"help\" to see which commands are available. "); 115 System.out.println(" If the pid is 0, commands will be sent to all Java processes. "); 116 System.out.println(" The main class argument will be used to match (either partially "); 117 System.out.println(" or fully) the class used to start Java. "); 118 System.out.println(" If no options are given, lists Java processes (same as -l). "); 119 System.out.println(" "); 120 System.out.println(" PerfCounter.print display the counters exposed by this process "); 121 System.out.println(" -f read and execute commands from the file "); 122 System.out.println(" -l list JVM processes on the local machine "); 123 System.out.println(" -? -h --help print this help message "); 124 } 125 }