All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.btrace.spi.impl.PortLocatorImpl Maven / Gradle / Ivy

The newest version!
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.sun.btrace.spi.impl;

import com.sun.btrace.api.BTraceTask;
import com.sun.btrace.spi.PortLocator;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jaroslav Bachorik 
 */
final public class PortLocatorImpl implements PortLocator {
    final private static Logger LOGGER = Logger.getLogger(PortLocator.class.getName());

    public int getTaskPort(BTraceTask task) {
        VirtualMachine vm = null;
        try {
            vm = VirtualMachine.attach(String.valueOf(task.getPid()));
            String portStr = vm.getSystemProperties().getProperty(PORT_PROPERTY);
            return portStr != null ? Integer.parseInt(portStr) : findFreePort();
        } catch (AttachNotSupportedException ex) {
            Logger.getLogger(PortLocatorImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PortLocatorImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (vm != null) {
                try {
                    vm.detach();
                } catch (IOException e) {
                    LOGGER.log(Level.SEVERE, null, e);
                }
            }
        }
        return findFreePort();
    }

    private static int findFreePort() {
        ServerSocket server = null;
        int port = 0;
        try {
            server = new ServerSocket(0);
            port = server.getLocalPort();
        } catch (IOException e) {
            port = DEFAULT_PORT;
        } finally {
            try {
                server.close();
            } catch (Exception e) {
                // ignore
            }
        }
        return port;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy