Thứ Ba, 23 tháng 2, 2016

ip calc

//http://www.cs.ucsb.edu/~methiast/cs56/W12/issues/0000414/IP_Calculator/browse/src/edu/ucsb/cs56/w12/choice/issue0000414/IPCalc.java
package edu.ucsb.cs56.w12.choice.issue0000414;

import java.util.ArrayList;
import java.util.List;
import java.io.*;

/**
 * This class handles all the logic for the application.
 * It contains getters, setters, and a means of obtaining,
 * parsing, and converting the netowork information.
 *
 * @author Methias Talamantes
 * @version for CS56, Winter 12, UCSB
 */
public class IPCalc {

    private int baseIPnumeric;
    private int netmaskNumeric;
    //used for host range
    private String firstIP;
    private String lastIP;

/**
* Constructor
*
*@param IPinCIDRFormat IP in CIDR format e.g. 192.168.1.0/24
*/
    public IPCalc(String IPinCIDRFormat) throws NumberFormatException {

        String[] st = IPinCIDRFormat.split("\\/");
        if (st.length != 2) {
            throw new NumberFormatException("Invalid CIDR format '"
                    + IPinCIDRFormat + "', should be: xx.xx.xx.xx/xx");
 }
        String symbolicIP = st[0];
        String symbolicCIDR = st[1];

        Integer numericCIDR = new Integer(symbolicCIDR);
        if (numericCIDR > 32) {
            throw new NumberFormatException("CIDR can not be greater than 32");
 }

        //Get IP
        st = symbolicIP.split("\\.");
        if (st.length != 4) {
            throw new NumberFormatException("Invalid IP address: " + symbolicIP);
 }

        int i = 24;
        baseIPnumeric = 0;
 
        for (int n = 0; n < st.length; n++) {
            int value = Integer.parseInt(st[n]);
            if (value != (value & 0xff)) {
                throw new NumberFormatException("Invalid IP address: " + symbolicIP);
            }
            baseIPnumeric += value << i;
            i -= 8;
        }

 //Get netmask
        if (numericCIDR < 8)
            throw new NumberFormatException("Netmask CIDR can not be less than 8");
        netmaskNumeric = 0xffffffff;
        netmaskNumeric = netmaskNumeric << (32 - numericCIDR);
    }

/**
* Get the IP in symbolic form, i.e. xxx.xxx.xxx.xxx
*
*@return The reult of convertNumericIpToSymbolic() when passed baseIPnumeric
*/
    public String getIP() {
        return convertNumericIpToSymbolic(baseIPnumeric);
    }

/**
* Converts Numeric version of IP to Symbolic, i.e. xxx.xxx.xxx.xxx
*
*@param ip IP Address in numeric form
*@return the result of sb.toString(), the symbolic IP as a String
*/ 
    private String convertNumericIpToSymbolic(Integer ip) {
        StringBuffer sb = new StringBuffer(15);
        for (int shift = 24; shift > 0; shift -= 8) {
            // process 3 bytes, from high order byte down.
            sb.append(Integer.toString((ip >>> shift) & 0xff));
            sb.append('.');
        }
        sb.append(Integer.toString(ip & 0xff));
        return sb.toString();
    }

/**
* Get the net mask in symbolic form, i.e. xxx.xxx.xxx.xxx
*
*@return the result of sb.toString(), the symbolic netmask as a String
*/
    public String getNetmask() {
        StringBuffer sb = new StringBuffer(15);
        for (int shift = 24; shift > 0; shift -= 8) {
            // process 3 bytes, from high order byte down.
            sb.append(Integer.toString((netmaskNumeric >>> shift) & 0xff));
            sb.append('.');
        }
        sb.append(Integer.toString(netmaskNumeric & 0xff));
        return sb.toString();
    }

/**
* Calculates the range of hosts and assigns min and max to firstIP and lastIP
*
*/
    public void getHostAddressRange() {

        int numberOfBits;
        for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) {
            if ((netmaskNumeric << numberOfBits) == 0)
                break;
        }
        Integer numberOfIPs = 0;
        for (int n = 0; n < (32 - numberOfBits); n++) {
            numberOfIPs = numberOfIPs << 1;
            numberOfIPs = numberOfIPs | 0x01;
        }

        Integer baseIP = baseIPnumeric & netmaskNumeric;
        firstIP = convertNumericIpToSymbolic(baseIP + 1);
        lastIP = convertNumericIpToSymbolic(baseIP + numberOfIPs - 1);
    }

/**
* Returns number of hosts available in given range
*
*@return number of hosts
*/
    public Long getNumberOfHosts() {
        int numberOfBits;
        for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) {
            if ((netmaskNumeric << numberOfBits) == 0)
                break;
        }
        Double x = Math.pow(2, (32 - numberOfBits));
        if (x == -1) {
            x = 1D;
 }
        return x.longValue();
    }

/**
*Calculates wildcard mask
*
*@return the result of sb.toString(), in this case the wilcard mask in symbolic form
*/

    public String getWildcardMask() {
        Integer wildcardMask = netmaskNumeric ^ 0xffffffff;
        StringBuffer sb = new StringBuffer(15);
        for (int shift = 24; shift > 0; shift -= 8) {
            // process 3 bytes, from high order byte down.
            sb.append(Integer.toString((wildcardMask >>> shift) & 0xff));
            sb.append('.');
        }
        sb.append(Integer.toString(wildcardMask & 0xff));
        return sb.toString();

    }

/** 
* Calculates the broadcast address
*
*@return the broadcast ip address as a String
*/
    public String getBroadcastAddress() {
        if (netmaskNumeric == 0xffffffff) {
            return "0.0.0.0";
 }
        int numberOfBits;
        for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) {
            if ((netmaskNumeric << numberOfBits) == 0)
                break;
        }
        Integer numberOfIPs = 0;
        for (int n = 0; n < (32 - numberOfBits); n++) {
            numberOfIPs = numberOfIPs << 1;
            numberOfIPs = numberOfIPs | 0x01;
        }
        Integer baseIP = baseIPnumeric & netmaskNumeric;
        Integer ourIP = baseIP + numberOfIPs;
        String ip = convertNumericIpToSymbolic(ourIP);
        return ip;
    }
    
/**
* @param ipCidr IP Address and Netmask in CIDR format (e.g. 192.168.1.0/24)
* @return IP Address and Symbolic Netmask to be displayed in GUI
*/
    public String showIpNet(String ipCidr) {
        
        String st[] = ipCidr.split("\\/");
        String symbolicIP = st[0];
        
        IPCalcView gui = new IPCalcView();

        String symbolicCIDR = st[1];
        Integer numericCIDR = new Integer(symbolicCIDR);
        if (numericCIDR > 32)
            gui.label2.setText("CIDR can not be greater than 32");
        if (numericCIDR < 8)
            gui.label2.setText("Netmask CIDR can not be less than 8");
        netmaskNumeric = 0xffffffff; 
        netmaskNumeric = netmaskNumeric << (32 - numericCIDR);
        String symbolicNet = this.getNetmask();
        
        return "IP Address: " + symbolicIP + "\n" + "Netmask: " + symbolicNet + "\n";
        
    } //close showIpCidr
    
/**
* Displays broadcast 
*
* @return Broadcast string to be displayed in GUI
*/
    public String showBroadcast() {
        String broadcast = this.getBroadcastAddress();
        return "Broadcast: " + broadcast + "\n";
    }
    
/**
* Displays Wildcard
* 
* @return Wildcard string to be displayed in GUI
*/   
    public String showWildcard() {
        String wildcard = this.getWildcardMask();
        return "Wildcard: " + wildcard + "\n";
    }
    
/**
* Displays number of hosts
* 
* @return Number of hosts to be displayed in GUI
*/
    public String showNumHosts() {
        Long numberOfHosts = this.getNumberOfHosts() - 2;
        return "Number of Hosts in Range: " + numberOfHosts + "\n";
    }
    
/**
* Displays First and Last available IP
* 
* @return Min and Max available IP to be displayed in GUI
*/
    public String showFirstAndLast() {
        this.getHostAddressRange();
        String firstIP = this.firstIP;
        String LastIP = this.lastIP;
        return "First Available Host: " + firstIP + "\n" + "Last Available "
                + "Host: " + lastIP + "\n";
    }
    
}