1 52 53 package com.go.trove.net; 54 55 import java.net.*; 56 import java.util.*; 57 import java.lang.ref.*; 58 import com.go.trove.util.SoftHashMap; 59 60 71 public class InetAddressResolver { 72 private static final long RESOLVE_PERIOD = 10 * 60 * 1000; 74 private static Timer cResolveTimer; 75 76 private static Map cResolvers = new SoftHashMap(); 77 78 private static Timer getResolveTimer() { 79 Timer timer = cResolveTimer; 80 if (timer == null) { 81 timer = new Timer(true); 82 timer.schedule(new TimerTask() { 83 public void run() { 84 Thread.currentThread().setName("InetAddressResolver"); 85 } 86 }, 0); 87 cResolveTimer = timer; 88 } 89 return timer; 90 } 91 92 100 public static InetAddressResolver listenFor(String host, 101 InetAddressListener listener) { 102 synchronized (cResolvers) { 103 InetAddressResolver resolver = 104 (InetAddressResolver)cResolvers.get(host); 105 if (resolver == null) { 106 resolver = new InetAddressResolver(host); 107 cResolvers.put(host, resolver); 108 } 109 resolver.addListener(listener); 110 return resolver; 111 } 112 } 113 114 private final String mHost; 115 116 private List mListeners = new ArrayList(); 117 118 private Object mResolutionResults; 120 121 private InetAddressResolver(String host) { 122 mHost = host; 123 124 long delay = (long)(Math.random() * RESOLVE_PERIOD); 127 getResolveTimer().schedule(new Resolver(this), delay, RESOLVE_PERIOD); 128 } 129 130 private synchronized void addListener(InetAddressListener listener) { 131 mListeners.add(listener); 132 if (!resolveAddresses()) { 133 notifyListener(listener); 135 } 136 } 137 138 private synchronized void notifyListener(InetAddressListener listener) { 139 if (mResolutionResults instanceof UnknownHostException) { 140 listener.unknown((UnknownHostException)mResolutionResults); 141 } 142 else { 143 InetAddress[] addresses = (InetAddress[])mResolutionResults; 144 addresses = (InetAddress[])addresses.clone(); 145 listener.resolved(addresses); 146 } 147 } 148 149 private synchronized boolean resolveAddresses() { 151 boolean changed; 152 try { 153 InetAddress[] addresses = InetAddress.getAllByName(mHost); 154 if (mResolutionResults instanceof UnknownHostException) { 155 changed = true; 156 } 157 else { 158 Arrays.sort(addresses, new Comparator() { 160 public int compare(Object a, Object b) { 161 return ((InetAddress)a).getHostAddress() 162 .compareTo(((InetAddress)b).getHostAddress()); 163 } 164 }); 165 166 changed = !Arrays.equals 167 (addresses, (InetAddress[])mResolutionResults); 168 } 169 mResolutionResults = addresses; 170 } 171 catch (UnknownHostException e) { 172 changed = !(mResolutionResults instanceof UnknownHostException); 173 mResolutionResults = e; 174 } 175 176 if (changed) { 177 int size = mListeners.size(); 178 for (int i=0; i<size; i++) { 179 notifyListener((InetAddressListener)mListeners.get(i)); 180 } 181 } 182 183 return changed; 184 } 185 186 private class Resolver extends TimerTask { 187 private final Reference mOwner; 190 191 public Resolver(InetAddressResolver owner) { 192 mOwner = new WeakReference(owner); 193 } 194 195 public void run() { 196 InetAddressResolver owner = (InetAddressResolver)mOwner.get(); 197 if (owner == null) { 198 cancel(); 199 } 200 Thread t = Thread.currentThread(); 201 String originalName = t.getName(); 202 t.setName("InetAddressResolver:" + owner.mHost); 203 try { 204 owner.resolveAddresses(); 205 } 206 finally { 207 t.setName(originalName); 208 } 209 } 210 } 211 } 212 | Popular Tags |