diff options
| author | Markus Alexander Kuppe | 2010-06-25 14:57:42 +0000 |
|---|---|---|
| committer | Markus Alexander Kuppe | 2010-06-25 14:57:42 +0000 |
| commit | 151951492d7be18d218f829aff41344e6ccc4473 (patch) | |
| tree | cba11ec222804e400590e4e75be208d980a78292 | |
| parent | 355854f8498a89c2e5d1045f0cf2c0bab28ba317 (diff) | |
| download | org.eclipse.ecf-151951492d7be18d218f829aff41344e6ccc4473.tar.gz org.eclipse.ecf-151951492d7be18d218f829aff41344e6ccc4473.tar.xz org.eclipse.ecf-151951492d7be18d218f829aff41344e6ccc4473.zip | |
NEW - bug 314999: [Discovery][DNS-SD] Implement IDiscoveryAdvertiser
https://bugs.eclipse.org/bugs/show_bug.cgi?id=314999
2 files changed, 72 insertions, 1 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java index c83354740..717de13df 100644 --- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java +++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java @@ -10,7 +10,9 @@ ******************************************************************************/ package org.eclipse.ecf.provider.dnssd; +import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Enumeration; import org.eclipse.core.runtime.Assert; import org.eclipse.ecf.core.ContainerConnectException; @@ -19,9 +21,17 @@ import org.eclipse.ecf.core.events.ContainerConnectingEvent; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.security.IConnectContext; import org.eclipse.ecf.discovery.IServiceInfo; +import org.eclipse.ecf.discovery.IServiceProperties; import org.eclipse.ecf.discovery.identity.IServiceID; import org.eclipse.ecf.discovery.identity.IServiceTypeID; +import org.xbill.DNS.DClass; +import org.xbill.DNS.Message; +import org.xbill.DNS.Name; +import org.xbill.DNS.Rcode; +import org.xbill.DNS.Record; import org.xbill.DNS.SimpleResolver; +import org.xbill.DNS.Type; +import org.xbill.DNS.Update; public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryLocator { @@ -30,7 +40,52 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryLocator { */ public void registerService(IServiceInfo serviceInfo) { Assert.isNotNull(serviceInfo); - throw new UnsupportedOperationException("Not yet implemented"); + DnsSdServiceID serviceID = (DnsSdServiceID) serviceInfo.getServiceID(); + DnsSdServiceTypeID serviceTypeID = (DnsSdServiceTypeID) serviceID.getServiceTypeID(); + + String[] scopes = serviceTypeID.getScopes(); + for (int i = 0; i < scopes.length; i++) { + try { + String domain = scopes[i] + "."; + Name zone = Name.fromString(domain); + + Name name = Name.fromString("_" + serviceTypeID.getServices()[0] + "._" + serviceTypeID.getProtocols()[0], zone); + + //TODO make TTL configurable per serviceinfo instance or via config admin + int ttl = 3600; + int priority = serviceInfo.getPriority(); + int port = serviceInfo.getLocation().getPort(); + String target = serviceInfo.getLocation().getHost(); + int weight = serviceInfo.getWeight(); + + // TYPE.SRV + Record record = Record.fromString(name, Type.SRV, DClass.IN, ttl, priority + " " + weight + " " + port + " " + target + ".", zone); + Update update = new Update(zone); + update.replace(record); + + // TYPE.TXT for service properties + IServiceProperties properties = serviceInfo.getServiceProperties(); + Enumeration enumeration = properties.getPropertyNames(); + while(enumeration.hasMoreElements()) { + Object property = enumeration.nextElement(); + String key = property.toString(); + String value = (String) properties.getProperty(key).toString(); + record = Record.fromString(name, Type.TXT, DClass.IN, ttl, key + "=" + value, zone); + update.add(record); + } + + // set up a new resolver for the given domain + ((SimpleResolver)resolver).setAddress(InetAddress.getByName("ns1.ecf-project.org")); + resolver.setTCP(true); + Message response = resolver.send(update); + + if(response.getRcode() != Rcode.NOERROR) { + DnsSdDiscoveryException.getException(response.getRcode()); + } + } catch (Exception e) { + throw new DnsSdDiscoveryException(e); + } + } } /* (non-Javadoc) diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryException.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryException.java index 369d97d24..2b5cf3b3e 100644 --- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryException.java +++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryException.java @@ -11,13 +11,29 @@ package org.eclipse.ecf.provider.dnssd; import org.eclipse.ecf.core.util.ECFRuntimeException; +import org.xbill.DNS.Rcode; public class DnsSdDiscoveryException extends ECFRuntimeException { + public static DnsSdDiscoveryException getException(int rcode) { + switch (rcode) { + case Rcode.REFUSED: + return new DnsSdDiscoveryException("DNS update denied by server (return code: " + rcode + ")"); + case Rcode.NOTAUTH: + return new DnsSdDiscoveryException("TSIG verify failed (BADKEY) (return code: " + rcode + ")"); + default: + return new DnsSdDiscoveryException("DNS update failed with return code: " + rcode); + } + } + private static final long serialVersionUID = 415901701737755102L; public DnsSdDiscoveryException(Throwable e) { super(e); } + + public DnsSdDiscoveryException(String message) { + super(message); + } } |
