package com.sun.slp;
import java.util.*;
import java.net.*;
class ActiveDiscoverer extends Thread {
static private SLPConfig config = null;
private CSrvMsg activeMsg = null;
private int version = 0;
private ServerDATable table = null;
private Vector useScopes = null;
private InetAddress address = null;
ActiveDiscoverer(int version,
ServerDATable table,
Vector useScopes,
InetAddress address) {
this.version = version;
this.table = table;
this.useScopes = useScopes;
this.address = address;
if (config == null) {
config = SLPConfig.getSLPConfig();
}
}
public void start() {
long sleepyTime = config.getRandomWait();
try {
activeMsg = new CSrvMsg(config.getLocale(),
Defaults.DA_SERVICE_TYPE,
useScopes,
"");
} catch (ServiceLocationException ex) {
Assert.slpassert(false,
"sdat_active_err",
new Object[] {
Integer.valueOf(ex.getErrorCode()),
ex.getMessage()});
}
addPreconfiguredDAs();
if (config.getActiveDiscoveryInterval() > 0) {
try {
Thread.currentThread().sleep(sleepyTime);
} catch (InterruptedException ex) {
}
activeDiscovery();
} else {
config.writeLog("ad_active_off",
new Object[0]);
}
super.start();
}
public void run() {
Thread.currentThread().setName("SLP Active DA Discovery");
long sleepyTime = config.getActiveDiscoveryInterval() * 1000;
if (sleepyTime <= 0) {
sleepyTime = (ServiceURL.LIFETIME_MAXIMUM / 2) * 1000;
}
if (config.isDA()) {
Vector interfaces = config.getInterfaces();
int i, n = interfaces.size();
for (i = 0; i < n; i++) {
InetAddress interfac = (InetAddress)interfaces.elementAt(i);
ServiceURL url = new ServiceURL(Defaults.DA_SERVICE_TYPE +
"://" +
interfac.getHostAddress(),
ServiceURL.LIFETIME_MAXIMUM);
Vector scopes = config.getSAConfiguredScopes();
long timestamp = 0;
String mySPIs = System.getProperty("sun.net.slp.SPIs");
mySPIs = mySPIs == null ? "" : mySPIs;
table.recordNewDA(url,
scopes,
timestamp,
version,
config.getDAAttributes(),
mySPIs);
}
}
do {
try {
sleep(sleepyTime);
if (config.getActiveDiscoveryInterval() > 0) {
activeDiscovery();
} else {
addPreconfiguredDAs();
}
} catch (InterruptedException ex) {
}
} while (true);
}
synchronized private void activeDiscovery() {
SrvLocHeader hdr = activeMsg.getHeader();
hdr.previousResponders.removeAllElements();
try {
Transact.transactActiveAdvertRequest(Defaults.DA_SERVICE_TYPE,
activeMsg,
table);
} catch (ServiceLocationException ex) {
config.writeLog("ad_multi_error",
new Object[] { Integer.valueOf(ex.getErrorCode()),
ex.getMessage() });
}
}
synchronized private void addPreconfiguredDAs() {
Vector daAddrs = config.getPreconfiguredDAs();
int i, n = daAddrs.size();
for (i = 0; i < n; i++) {
InetAddress daAddr = (InetAddress)daAddrs.elementAt(i);
SrvLocMsg reply = null;
try {
reply = Transact.transactTCPMsg(daAddr, activeMsg, false);
} catch (ServiceLocationException ex) {
if (config.traceDrop()) {
config.writeLog("ad_trans_error", new Object[] {
Integer.valueOf(ex.getErrorCode()),
daAddr,
ex.getMessage() });
}
continue;
}
if (!(reply instanceof CDAAdvert)) {
if (config.traceDrop()) {
config.writeLog("ad_preconfig_not_advert",
new Object[] { daAddr, reply });
}
continue;
}
CDAAdvert advert = (CDAAdvert)reply;
SrvLocHeader hdr = advert.getHeader();
if (config.getActiveDiscoveryInterval() <= 0) {
advert.URL =
new ServiceURL(advert.URL.toString(),
ServiceURL.LIFETIME_MAXIMUM);
}
config.addPreconfiguredDAScopes(hdr.scopes);
table.recordNewDA(advert.URL,
hdr.scopes,
advert.timestamp,
hdr.version,
advert.attrs,
advert.spis);
}
}
}