001: package org.cougaar.qos.qrs;
002:
003: /*
004:
005: * <copyright>
006: *
007: * Copyright 2002-2007 BBNT Solutions, LLC
008: * under sponsorship of the Defense Advanced Research Projects
009: * Agency (DARPA).
010: *
011: * You can redistribute this software and/or modify it under the
012: * terms of the Cougaar Open Source License as published on the
013: * Cougaar Open Source Website (www.cougaar.org).
014: *
015: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
016: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
017: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
018: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
019: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
020: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
021: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
022: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
023: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
024: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
025: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
026: *
027: * </copyright>
028:
029: */
030:
031: import java.util.HashMap;
032: import java.util.Map;
033:
034: import org.cougaar.util.log.Logger;
035:
036: // Nice clean code
037: public class SiteAddress {
038: private static Map<String, SiteAddress> sites = new HashMap<String, SiteAddress>();
039:
040: private static final long[] Masks = { 0x00000000, 0x80000000,
041: 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,
042: 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
043: 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,
044: 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,
045: 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
046: 0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
047: 0xFFFFFFFF };
048:
049: public long net;
050: private final long net_masked;
051: public long mask;
052:
053: private SiteAddress(String maskedAddress) {
054: int slash = maskedAddress.indexOf('/');
055: String maskbits_string = maskedAddress.substring(1 + slash);
056: int maskedbits = Integer.parseInt(maskbits_string);
057: String address = maskedAddress.substring(0, slash);
058: net = stringToLongAddress(address);
059: mask = countToMask(maskedbits);
060: net_masked = mask & net;
061: }
062:
063: private long unsignedByteToLong(byte b) {
064: if (b < 0) {
065: return 256 + b;
066: } else {
067: return b;
068: }
069: }
070:
071: private long stringToLongAddress(String address) {
072: try {
073: byte[] net_bytes = stringToAddress(address);
074: return unsignedByteToLong(net_bytes[0]) << 24
075: | unsignedByteToLong(net_bytes[1]) << 16
076: | unsignedByteToLong(net_bytes[2]) << 8
077: | unsignedByteToLong(net_bytes[3]);
078: } catch (java.net.UnknownHostException ex) {
079: Logger logger = Logging.getLogger(SiteAddress.class);
080: logger.error("Bogus net " + address);
081: return 0;
082: }
083: }
084:
085: public boolean contains(long addr) {
086: return (addr & mask) == net_masked;
087: }
088:
089: public boolean contains(String addr) {
090: return (stringToLongAddress(addr) & mask) == net_masked;
091: }
092:
093: public String toString() {
094: return ((net & 0xff000000) >> 24) + "."
095: + ((net & 0x00ff0000) >> 16) + "."
096: + ((net & 0x0000ff00) >> 8) + "." + (net & 0x000000ff)
097: + "/" + maskToCount(mask);
098: }
099:
100: public static Iterable<SiteAddress> elements() {
101: return sites.values();
102: }
103:
104: public static SiteAddress getSiteAddress(String maskedAddress) {
105: SiteAddress site = sites.get(maskedAddress);
106: if (site == null) {
107: site = new SiteAddress(maskedAddress);
108: sites.put(maskedAddress, site);
109: }
110: return site;
111: }
112:
113: public static long countToMask(int count) {
114: return Masks[count];
115: }
116:
117: public static int maskToCount(long mask) {
118: for (int i = 0; i < Masks.length; i++) {
119: if (mask == Masks[i]) {
120: return i;
121: }
122: }
123: return -1;
124: }
125:
126: public static byte[] stringToAddress(String addressString)
127: throws java.net.UnknownHostException {
128: return java.net.InetAddress.getByName(addressString)
129: .getAddress();
130: }
131: }
|