Author: rwinston Date: Sun Mar 2 11:30:05 2008 New Revision: 632812 URL: http://svn.apache.org/viewvc?rev=632812&view=rev Log: Update changes and add example for SubnetUtils
Added: commons/proper/net/branches/NET_2_0/src/main/java/examples/SubnetUtilsExample.java Modified: commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/util/SubnetUtils.java commons/proper/net/branches/NET_2_0/src/site/xdoc/changes.xml Added: commons/proper/net/branches/NET_2_0/src/main/java/examples/SubnetUtilsExample.java URL: http://svn.apache.org/viewvc/commons/proper/net/branches/NET_2_0/src/main/java/examples/SubnetUtilsExample.java?rev=632812&view=auto ============================================================================== --- commons/proper/net/branches/NET_2_0/src/main/java/examples/SubnetUtilsExample.java (added) +++ commons/proper/net/branches/NET_2_0/src/main/java/examples/SubnetUtilsExample.java Sun Mar 2 11:30:05 2008 @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 examples; + +import java.util.Scanner; + +import org.apache.commons.net.util.SubnetUtils; +import org.apache.commons.net.util.SubnetUtils.SubnetInfo; + +/** + * Example class that shows how to use the [EMAIL PROTECTED] SubnetUtils} class. + * @author Rory Winston <[EMAIL PROTECTED]> + * + */ +public class SubnetUtilsExample { + + public static void main(String[] args) { + String subnet = "192.168.0.1/24"; + SubnetUtils utils = new SubnetUtils(subnet); + SubnetInfo info = utils.getInfo(); + + System.out.printf("Subnet Information for %s:\n", subnet); + System.out.println("--------------------------------------"); + System.out.printf("IP Address:\t\t\t%s\t[%s]\n", info.getAddress(), + Integer.toBinaryString(info.asInteger(info.getAddress()))); + System.out.printf("Netmask:\t\t\t%s\t[%s]\n", info.getNetmask(), + Integer.toBinaryString(info.asInteger(info.getNetmask()))); + System.out.printf("CIDR Representation:\t\t%s\n\n", info.getCidrSignature()); + + System.out.printf("Supplied IP Address:\t\t%s\n\n", info.getAddress()); + + System.out.printf("Network Address:\t\t%s\t[%s]\n", info.getNetworkAddress(), + Integer.toBinaryString(info.asInteger(info.getNetworkAddress()))); + System.out.printf("Broadcast Address:\t\t%s\t[%s]\n", info.getBroadcastAddress(), + Integer.toBinaryString(info.asInteger(info.getBroadcastAddress()))); + System.out.printf("First Usable Address:\t\t%s\t[%s]\n", info.getLowAddress(), + Integer.toBinaryString(info.asInteger(info.getLowAddress()))); + System.out.printf("Last Usable Address:\t\t%s\t[%s]\n", info.getHighAddress(), + Integer.toBinaryString(info.asInteger(info.getHighAddress()))); + + System.out.printf("Total usable addresses: \t%d\n\n", info.getAddressCount()); + + final String prompt ="Enter an IP address (e.g. 192.168.0.10):"; + System.out.println(prompt); + Scanner scanner = new Scanner(System.in); + while (scanner.hasNextLine()) { + String address = scanner.nextLine(); + System.out.println("The IP address [" + address + "] is " + + (info.isInRange(address) ? "" : "not ") + + "within the subnet [" + subnet + "]"); + System.out.println(prompt); + } + + } + +} Modified: commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/util/SubnetUtils.java URL: http://svn.apache.org/viewvc/commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/util/SubnetUtils.java?rev=632812&r1=632811&r2=632812&view=diff ============================================================================== --- commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/util/SubnetUtils.java (original) +++ commons/proper/net/branches/NET_2_0/src/main/java/org/apache/commons/net/util/SubnetUtils.java Sun Mar 2 11:30:05 2008 @@ -25,18 +25,18 @@ * @author <[EMAIL PROTECTED]> */ public class SubnetUtils { - + private static final String IP_ADDRESS = "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})"; private static final String SLASH_FORMAT = IP_ADDRESS + "/(\\d{1,3})"; private static final Pattern addressPattern = Pattern.compile(IP_ADDRESS); private static final Pattern cidrPattern = Pattern.compile(SLASH_FORMAT); private static final int NBITS = 32; - + private int netmask = 0; private int address = 0; private int network = 0; private int broadcast = 0; - + /** * Constructor that takes a CIDR-notation string, e.g. "192.168.0.1/16" * @param cidrNotation A CIDR-notation string, e.g. "192.168.0.1/16" @@ -44,7 +44,7 @@ public SubnetUtils(String cidrNotation) { calculate(cidrNotation); } - + /** * Constructor that takes two dotted decimal addresses. * @param address An IP address, e.g. "192.168.0.1" @@ -53,12 +53,14 @@ public SubnetUtils(String address, String mask) { calculate(toCidrNotation(address, mask)); } - + /** * Convenience container for subnet summary information. * */ public final class SubnetInfo { + private SubnetInfo() {} + private int netmask() { return netmask; } private int network() { return network; } private int address() { return address; } @@ -66,24 +68,27 @@ private int low() { return network() + 1; } private int high() { return broadcast() - 1; } - public boolean isInRange(String address) { return isInRange(toInteger(address)); } - private boolean isInRange(int address) { return ((address-low()) <= (high()-low())); } - - public String getBroadcastAddress() { return format(toArray(broadcast())); } - - public String getNetworkAddress() { return format(toArray(network())); } - public String getLowAddress() { return format(toArray(low())); } - public String getHighAddress() { return format(toArray(high())); } - public int getAddressCount() { return (broadcast() - low()); } + public boolean isInRange(String address) { return isInRange(toInteger(address)); } + private boolean isInRange(int address) { return ((address-low()) <= (high()-low())); } + + public String getBroadcastAddress() { return format(toArray(broadcast())); } + public String getNetworkAddress() { return format(toArray(network())); } + public String getNetmask() { return format(toArray(netmask())); } + public String getAddress() { return format(toArray(address())); } + public String getLowAddress() { return format(toArray(low())); } + public String getHighAddress() { return format(toArray(high())); } + public int getAddressCount() { return (broadcast() - low()); } + + public int asInteger(String address) { return toInteger(address); } public String getCidrSignature() { return toCidrNotation( - format(toArray(address())), - format(toArray(netmask())) - ); + format(toArray(address())), + format(toArray(netmask())) + ); } } - + /** * Return a [EMAIL PROTECTED] SubnetInfo} instance that contains subnet-specific statistics * @return @@ -95,26 +100,26 @@ */ private void calculate(String mask) { Matcher matcher = cidrPattern.matcher(mask); - + if (matcher.matches()) { address = matchAddress(matcher); - + /* Create a binary netmask from the number of bits specification /x */ int cidrPart = rangeCheck(Integer.valueOf(matcher.group(5)), 0, NBITS-1); for (int j = 0; j < cidrPart; ++j) { netmask |= (1 << 31-j); } - + /* Calculate base network address */ network = (address & netmask); - + /* Calculate broadcast address */ broadcast = network | ~(netmask); } else throw new IllegalArgumentException("Could not parse [" + mask + "]"); } - + /* * Convert a dotted decimal format address to a packed integer format */ @@ -139,7 +144,7 @@ } return addr; } - + /* * Convert a packed integer address into a 4-element array */ @@ -167,21 +172,21 @@ private int rangeCheck(Integer value, int begin, int end) { if (value >= begin && value <= end) return value; - + throw new IllegalArgumentException("Value out of range: [" + value + "]"); } - + /* * Count the number of 1-bits in a 32-bit integer using a divide-and-conquer strategy * see Hacker's Delight section 5.1 */ int pop(int x) { - x = x - ((x >>> 1) & 0x55555555); - x = (x & 0x33333333) + ((x >>> 2) & 0x33333333); - x = (x + (x >>> 4)) & 0x0F0F0F0F; - x = x + (x >>> 8); - x = x + (x >>> 16); - return x & 0x0000003F; + x = x - ((x >>> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >>> 2) & 0x33333333); + x = (x + (x >>> 4)) & 0x0F0F0F0F; + x = x + (x >>> 8); + x = x + (x >>> 16); + return x & 0x0000003F; } /* Convert two dotted decimal addresses to a single xxx.xxx.xxx.xxx/yy format @@ -191,5 +196,4 @@ private String toCidrNotation(String addr, String mask) { return addr + "/" + pop(toInteger(mask)); } - } Modified: commons/proper/net/branches/NET_2_0/src/site/xdoc/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/net/branches/NET_2_0/src/site/xdoc/changes.xml?rev=632812&r1=632811&r2=632812&view=diff ============================================================================== --- commons/proper/net/branches/NET_2_0/src/site/xdoc/changes.xml (original) +++ commons/proper/net/branches/NET_2_0/src/site/xdoc/changes.xml Sun Mar 2 11:30:05 2008 @@ -146,6 +146,12 @@ <action dev="rwinston" type="fix" issue="NET-173"> Add configurable multiline parsing. </action> + <action dev="rwinston" type="fix" issue="NET-188"> + Add fix for broken leap year date parsing. + </action> + <action dev="rwinston" type="add"> + Add SubnetUtils class (suggested by Kenny McLeod) + </action>