Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Alexander Kuppe2010-06-25 14:57:42 +0000
committerMarkus Alexander Kuppe2010-06-25 14:57:42 +0000
commit151951492d7be18d218f829aff41344e6ccc4473 (patch)
treecba11ec222804e400590e4e75be208d980a78292
parent355854f8498a89c2e5d1045f0cf2c0bab28ba317 (diff)
downloadorg.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
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java57
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryException.java16
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);
+ }
}

Back to the top