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

com.bigdata.rdf.internal.IPv4Address Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program 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; version 2 of the License.

This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.bigdata.rdf.internal;

import java.io.Serializable;
import java.util.Arrays;

import com.bigdata.util.BytesUtil.UnsignedByteArrayComparator;

/**
 * Class models an IPv4 address.
 */
public class IPv4Address implements Serializable, Comparable {

	/**
     * 
     */
    private static final long serialVersionUID = 8707927477744805951L;
    
	final private byte[] address;

	public IPv4Address(final byte[] address) {
		this.address = address;
	}
	
	public IPv4Address(final IPv4Address ip) {
		this.address = ip.getBytes();
	}

	/**
	 * Returns the byte array representation of the address
	 * 
	 * @return
	 */
	public byte[] getBytes() {
		return this.address;
	}

	@Override
	public int hashCode() {
		return Arrays.hashCode(address);
	}

	@Override
	public boolean equals(final Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final IPv4Address other = (IPv4Address) obj;

		return UnsignedByteArrayComparator.INSTANCE.compare(address,
				other.address) == 0;
	}
	
	/**
	 * Return printable version of the IP address
	 */
	@Override
	public String toString() {
		return byteArrayToIPString(address);
		
	}
	
	/**
	 * Converts the byte array to an IP string with option CIDR representation
	 * @param addr
	 * @return
	 */
	public static String byteArrayToIPString(byte [] addr) {
		final int netmask = addr[4] & 0xff;
    	
        return (addr[0] & 0xff) + "." + (addr[1] & 0xff) + "." + 
        	   (addr[2] & 0xff) + "." + (addr[3] & 0xff) +
        	   (netmask <= 32 ? "/" + netmask : ""); 
	}
	
	public static IPv4Address IPv4Factory(final String... s) {

		final byte[] address = new byte[5];
		long longVal;

		if(s.length == 4) {
		//Array of strings for IP address without CIDR
		//192.168.1.100
				for (int i = 0; i < 4; i++) {
					longVal = Integer.parseInt(s[i]);
					if (longVal < 0 || longVal > 0xff)
						return null;
					address[i] = (byte) (longVal & 0xff);
				}
				address[4] = (byte) (33 & 0xff);
		} else if (s.length == 5) {
		//Array of strings with CIDR
		//192.168.1.100/32

				for (int i = 0; i < 5; i++) {
					longVal = Integer.parseInt(s[i]);
					if (longVal < 0 || longVal > 0xff)
						return null;
					if (i == 4 && longVal > 32)
					    return null;
					address[i] = (byte) (longVal & 0xff);
				}
		} else {
			//Factory is undefined for other length string arrays
			return null;
		}

		return new IPv4Address(address);
	}

    @Override
    public int compareTo(IPv4Address other) {
        return UnsignedByteArrayComparator.INSTANCE.compare(address, other.address);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy