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

org.globus.net.PortRange Maven / Gradle / Ivy

/*
 * Copyright 1999-2010 University of Chicago
 *
 * 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 org.globus.net;

import java.io.IOException;

import org.globus.common.CoGProperties;

/**
 * This class manages the port ranges. It keeps track of which
 * ports are used and which ones are open.
 */
public class PortRange {

    protected static final byte UNUSED = 0;
    protected static final byte USED   = 1;
    
    private boolean portRange = false;
    private int minPort, maxPort;
    private byte [] ports;
    
    private static PortRange tcpPortRange = null;
    private static PortRange tcpSourcePortRange = null;
    private static PortRange udpSourcePortRange = null;
    
    protected PortRange() {
    }
    
    /**
     * Returns PortRange instance for TCP listening sockets.
     *
     * @see #getTcpInstance()
     */
    public static PortRange getInstance() {
        return getTcpInstance();
    }
    
    /**
     * Returns PortRange instance for TCP listening sockets.
     * If the tcp.port.range property is set, the class
     * will be initialized with the specified port ranges.
     *
     * @return PortRange the default instace of this class.
     */
    public static synchronized PortRange getTcpInstance() {
        if (tcpPortRange == null) {
            tcpPortRange = new PortRange();
            tcpPortRange.init(CoGProperties.getDefault().getTcpPortRange());
        }
        return tcpPortRange;
    }
    
    /**
     * Returns PortRange instance for TCP source sockets.
     * If the tcp.source.port.range property is set, the class
     * will be initialized with the specified port ranges.
     *
     * @return PortRange the default instace of this class.
     */
    public static synchronized PortRange getTcpSourceInstance() {
        if (tcpSourcePortRange == null) {
            tcpSourcePortRange = new PortRange();
            tcpSourcePortRange.init( 
                  CoGProperties.getDefault().getTcpSourcePortRange());
        }
        return tcpSourcePortRange;
    }

    /**
     * Returns PortRange instance for UDP source sockets.
     * If the udp.source.port.range property is set, the class
     * will be initialized with the specified port ranges.
     *
     * @return PortRange the default instace of this class.
     */
    public static synchronized PortRange getUdpSourceInstance() {
        if (udpSourcePortRange == null) {
            udpSourcePortRange = new PortRange();
            udpSourcePortRange.init( 
                  CoGProperties.getDefault().getUdpSourcePortRange());
        }
        return udpSourcePortRange;
    }
    
    /**
     * Checks if the port range is set.
     *
     * @return true if the port range is set, false otherwise.
     */
    public boolean isEnabled() {
        return portRange;
    }
    
    /**
     * Returns first available port.
     *
     * @param lastPortNumber port number to start finding the next 
     *                       available port from. Set it to 0 if
     *                       called initialy.
     * @return the next available port number from the lastPortNumber.
     * @exception IOException if there is no more free ports available or
     *            if the lastPortNumber is incorrect.
     */
    public synchronized int getFreePort(int lastPortNumber) 
        throws IOException {
        int id = 0;
        if (lastPortNumber != 0) {
            id = lastPortNumber - minPort;
            if (id < 0) {
                throw new IOException("Port number out of range.");
            }
        }
        for(int i=id;inot
     * check if it is a free, but only checks if it is within said range.
     */
    public boolean isInRange(int portNumber) {

        if ((minPort <= portNumber) && (maxPort >= portNumber)) {
            return true;
        }
        
        return false;
    }

    private synchronized void setPort(int portNumber, byte type) {
        int id = portNumber - minPort;
        if (id < 0) {
            throw new IllegalArgumentException("Port number out of range: " + portNumber);
        }
        ports[id] = type;
    }
    
    private void init(String portRangeStr) {
        portRange = false;
        
        if (portRangeStr == null) return ;
        
        int pos = portRangeStr.indexOf(",");
        if (pos == -1) {
            throw new IllegalArgumentException("Missing comma in the port range property: " +
                                               portRangeStr);
        }
        
        int min, max;
        
        try {
            min = Integer.parseInt(portRangeStr.substring(0, pos).trim());
        } catch(Exception e) {
            throw new IllegalArgumentException("The minimum port range value is invalid: " + 
                                               e.getMessage());
        }
        
        try {
            max = Integer.parseInt(portRangeStr.substring(pos+1).trim());
        } catch(Exception e) {
            throw new IllegalArgumentException("The maximum port range value is invalid: " + 
                                               e.getMessage());
        }
    
        if (min >= max) {
            throw new IllegalArgumentException("The minimum port range value is greater then " + 
                                               "the maximum port range value.");
        }
    
        minPort = min;
        maxPort = max;
        ports     = new byte[ maxPort-minPort ];
        portRange = true;    
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy