/*
* This file is part of aion-emu <aion-emu.com>.
*
* aion-emu is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-emu is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-emu. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.commons.network;
import java.util.Arrays;
/**
* Utility class that is designed to check belongings of one address to the range.<br>
* This class is designed in the way that we won't need any changes to external classes in case of migration to IPv6.
*
* @author Taran
* @author SoulKeeper
*/
public class IPRange
{
/**
* Minimal ip address of the range
*/
private final long min;
/**
* Maximum ip address of the range
*/
private final long max;
/**
* Address that is host for this range
*/
private final byte[] address;
/**
* Creates new IPRange object.
*
* @param min
* minal ip address
* @param max
* maximal ip address
* @param address
* ip address that will be used as host for this range
*/
public IPRange(String min, String max, String address)
{
this.min = toLong(toByteArray(min));
this.max = toLong(toByteArray(max));
this.address = toByteArray(address);
}
/**
* Creates new IPRange object
*
* @param min
* minimal ip address
* @param max
* maximal ip address
* @param address
* ip address that will be used as host for this range
*/
public IPRange(byte[] min, byte[] max, byte[] address)
{
this.min = toLong(min);
this.max = toLong(max);
this.address = address;
}
/**
* Checks if address is in range
*
* @param address
* address to check if is in range
* @return true if is in range, false in other case
*/
public boolean isInRange(String address)
{
long addr = toLong(toByteArray(address));
return addr >= min && addr <= max;
}
/**
* Retuns address that is assigned to this range
*
* @return address that is assigned to this range
*/
public byte[] getAddress()
{
return address;
}
/**
* Returns minimal ip address of the range
*
* @return minimal ip address of the range
*/
public byte[] getMinAsByteArray()
{
return toBytes(min);
}
/**
* Returns maximal ip address of the range
*
* @return maximal ip address of the range
*/
public byte[] getMaxAsByteArray()
{
return toBytes(max);
}
/**
* Converts IPv4 address to long
*
* @param bytes
* byte array to convert
* @return long that represents address
*/
private static long toLong(byte[] bytes)
{
long result = 0;
result += (bytes[3] & 0xFF);
result += ((bytes[2] & 0xFF) << 8);
result += ((bytes[1] & 0xFF) << 16);
result += (bytes[0] << 24);
return result & 0xFFFFFFFFL;
}
/**
* Converts long to byte array
*
* @param val
* long to convert
* @return byte array
*/
private static byte[] toBytes(long val)
{
byte[] result = new byte[4];
result[3] = (byte) (val & 0xFF);
result[2] = (byte) ((val >> 8) & 0xFF);
result[1] = (byte) ((val >> 16) & 0xFF);
result[0] = (byte) ((val >> 24) & 0xFF);
return result;
}
/**
* Convers IPv4 address to byte array
*
* @param address
* String to convert
* @return byte array that represents string
*/
public static byte[] toByteArray(String address)
{
byte[] result = new byte[4];
String[] strings = address.split("\\.");
for(int i = 0, n = strings.length; i < n; i++)
{
result[i] = (byte) Integer.parseInt(strings[i]);
}
return result;
}
/**
* Equals of IPRange object. Auto-Generated.
*
* @param o
* object to compare with
* @return true if IPRanges are equal, false in other case
*/
@Override
public boolean equals(Object o)
{
if(this == o)
return true;
if(!(o instanceof IPRange))
return false;
IPRange ipRange = (IPRange) o;
return max == ipRange.max && min == ipRange.min && Arrays.equals(address, ipRange.address);
}
/**
* Hashcode of IPRange object. Auto generated.
*
* @return hashcode
*/
@Override
public int hashCode()
{
int result = (int) (min ^ (min >>> 32));
result = 31 * result + (int) (max ^ (max >>> 32));
result = 31 * result + Arrays.hashCode(address);
return result;
}
}