You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rw...@apache.org on 2008/03/02 20:30:05 UTC

svn commit: r632812 - in /commons/proper/net/branches/NET_2_0/src: main/java/examples/SubnetUtilsExample.java main/java/org/apache/commons/net/util/SubnetUtils.java site/xdoc/changes.xml

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 {@link SubnetUtils} class. 
+ * @author Rory Winston <rw...@apache.org>
+ *
+ */
+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 <rw...@apache.org>
  */
 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 {@link 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>