/*
* Copyright 2011 Cloud.com, Inc.
*
* 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 com.cloud.bridge.util;
import java.io.IOException;
/**
* Represents a network IP address or a range of addresses.
* A range is useful when representing IP addresses defined in
* CIDR format. The range is a 32 bit IP inclusive.
*/
public class IpAddressRange {
private long minAddress;
private long maxAddress;
public IpAddressRange() {
}
public long getMinAddress() {
return minAddress;
}
public void setMinAddress(long param) {
this.minAddress = param;
}
public long getMaxAddress() {
return maxAddress;
}
public void setMaxAddress(long param) {
this.maxAddress = param;
}
public String toString()
{
StringBuffer value = new StringBuffer();
value.append( "(ip range min: " + minAddress );
value.append( ", max: " + maxAddress + ")" );
return value.toString();
}
/**
* Is the parameter (i.e., left) inside the range represented by this object?
* @param left
* @return boolean
*/
public boolean contains(IpAddressRange left)
{
long leftMin = left.getMinAddress();
if ( leftMin < minAddress || leftMin > maxAddress )
return false;
else return true;
}
public static IpAddressRange parseRange(String ipAddress) throws Exception
{
IpAddressRange range = null;
long maskBits = 0;
long address = 0;
if (null == ipAddress) return null;
// -> is it a CIDR format?
String[] halfs = ipAddress.split( "/" );
if ( 2 == halfs.length )
{
range = new IpAddressRange();
address = IpAddressRange.ipToInt( halfs[0] );
maskBits = Integer.parseInt( halfs[1] ) & 0xFF;
if (maskBits >= 1 && maskBits <= 32)
{
range.setMinAddress( address & (~((1 << (32-maskBits))-1) & 0xFFFFFFFF));
range.setMaxAddress( range.getMinAddress() | (((1 << (32-maskBits))-1) & 0xFFFFFFFF));
}
}
else if (1 == halfs.length)
{
// -> should be just a simple IP address
range = new IpAddressRange();
address = IpAddressRange.ipToInt( ipAddress );
range.setMaxAddress( address );
range.setMinAddress( address );
}
else throw new Exception( "Invalid Ip Address: " + ipAddress );
return range;
}
/**
* In order to do unsigned math here we must use long types so that high order bits
* are not used as the sign of the number.
*
* @param ipAddress
* @return
*/
private static long ipToInt(String ipAddress) throws Exception
{
String[] parts = ipAddress.split( "[.]" );
if (4 != parts.length)
throw new Exception( "Invalid Ip Address: " + ipAddress );
long[] address = new long[4];
address[0] = Long.parseLong( parts[0] );
address[1] = Long.parseLong( parts[1] );
address[2] = Long.parseLong( parts[2] );
address[3] = Long.parseLong( parts[3] );
if (address[0] < 0 || address[1] < 0 || address[2] < 0 || address[3] < 0)
throw new Exception( "Invalid Ip Address: " + ipAddress );
if (address[0] > 255 || address[1] > 255 || address[2] > 255 || address[3] > 255)
throw new Exception( "Invalid Ip Address: " + ipAddress );
long value = (address[0]<<24) | (address[1]<<16) | (address[2]<<8) | address[3];
return value;
}
}