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>