1 /* 2 * Copyright (c) 1998, 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 package com.sun.tools.jdi; 26 27 import com.sun.jdi.connect.*; 28 import com.sun.jdi.connect.spi.*; 29 import java.util.Map; 30 import java.util.HashMap; 31 import java.io.IOException; 32 import com.sun.jdi.connect.spi.TransportService; 33 34 /* 35 * An ListeningConnector that uses the SocketTransportService 36 */ 37 public class SocketListeningConnector extends GenericListeningConnector { 38 39 static final String ARG_PORT = "port"; 40 static final String ARG_LOCALADDR = "localAddress"; 41 42 public SocketListeningConnector() { 43 super(new SocketTransportService()); 44 45 addIntegerArgument( 46 ARG_PORT, 47 getString("socket_listening.port.label"), 48 getString("socket_listening.port"), 49 "", 50 false, 51 0, Integer.MAX_VALUE); 52 53 addStringArgument( 54 ARG_LOCALADDR, 55 getString("socket_listening.localaddr.label"), 56 getString("socket_listening.localaddr"), 57 "", // default is wildcard 58 false); 59 60 transport = new Transport() { 61 public String name() { 62 return "dt_socket"; // for compatibility reasons 63 } 64 }; 65 } 66 67 68 public String 69 startListening(Map<String,? extends Connector.Argument> args) 70 throws IOException, IllegalConnectorArgumentsException 71 { 72 String port = argument(ARG_PORT, args).value(); 73 String localaddr = argument(ARG_LOCALADDR, args).value(); 74 75 // default to system chosen port 76 if (port.length() == 0) { 77 port = "0"; 78 } 79 80 if (localaddr.length() > 0) { 81 localaddr = localaddr + ":" + port; 82 } else { 83 localaddr = port; 84 } 85 86 return super.startListening(localaddr, args); 87 } 88 89 public String name() { 90 return "com.sun.jdi.SocketListen"; 91 } 92 93 public String description() { 94 return getString("socket_listening.description"); 95 } 96 97 // If the port is auto detected update the argument map with the bound port number. 98 @Override 99 protected void updateArgumentMapIfRequired( 100 Map<String, ? extends Connector.Argument> args, TransportService.ListenKey listener) { 101 if (isWildcardPort(args)) { 102 String[] address = listener.address().split(":"); 103 if (address.length > 1) { 104 args.get(ARG_PORT).setValue(address[1]); 105 } 106 } 107 } 108 109 private boolean isWildcardPort(Map<String, ? extends Connector.Argument> args) { 110 String port = args.get(ARG_PORT).value(); 111 return port.isEmpty() || Integer.valueOf(port) == 0; 112 } 113 }