//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";
}
}
Không có nhận xét nào:
Đăng nhận xét