Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Alexander Kuppe2010-07-18 09:12:55 +0000
committerMarkus Alexander Kuppe2010-07-18 09:12:55 +0000
commitddf625354696ffd475f56e14fbfb7df37dcf1e6b (patch)
treec8b95f58ccef11d2711c530b76f9f635546b532b
parent1476a25326195bddd89cbae2cc057a01699ef1d8 (diff)
downloadorg.eclipse.ecf-ddf625354696ffd475f56e14fbfb7df37dcf1e6b.tar.gz
org.eclipse.ecf-ddf625354696ffd475f56e14fbfb7df37dcf1e6b.tar.xz
org.eclipse.ecf-ddf625354696ffd475f56e14fbfb7df37dcf1e6b.zip
NEW - bug 314999: [Discovery][DNS-SD] Implement IDiscoveryAdvertiser
https://bugs.eclipse.org/bugs/show_bug.cgi?id=314999 Refactorings
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java126
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java52
2 files changed, 92 insertions, 86 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 5f0c76277..192b25c91 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
@@ -12,7 +12,9 @@ package org.eclipse.ecf.provider.dnssd;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.ContainerConnectException;
@@ -23,17 +25,17 @@ import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.discovery.DiscoveryContainerConfig;
import org.eclipse.ecf.discovery.IServiceInfo;
-import org.eclipse.ecf.discovery.IServiceProperties;
-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 DnsSdDiscoveryContainerAdapter {
+
+ private static final boolean ADD = true;
+ private static final boolean REMOVE = false;
public DnsSdDiscoveryAdvertiser() {
super(DnsSdNamespace.NAME, new DiscoveryContainerConfig(IDFactory
@@ -45,102 +47,55 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
* @see org.eclipse.ecf.provider.dnssd.DnsSdDiscoveryLocator#registerService(org.eclipse.ecf.discovery.IServiceInfo)
*/
public void registerService(IServiceInfo serviceInfo) {
- Assert.isNotNull(serviceInfo);
- 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);
-
- long ttl = serviceInfo.getTTL();
- 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);
- }
- }
+ sendToServer(serviceInfo, ADD);
}
/* (non-Javadoc)
* @see org.eclipse.ecf.provider.dnssd.DnsSdDiscoveryLocator#unregisterService(org.eclipse.ecf.discovery.IServiceInfo)
*/
public void unregisterService(IServiceInfo serviceInfo) {
- Assert.isNotNull(serviceInfo);
- 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);
-
- long ttl = serviceInfo.getTTL();
- int priority = serviceInfo.getPriority();
- int port = serviceInfo.getLocation().getPort();
- String target = serviceInfo.getLocation().getHost();
- int weight = serviceInfo.getWeight();
+ sendToServer(serviceInfo, REMOVE);
+ }
- // TYPE.SRV
- Record record = Record.fromString(name, Type.SRV, DClass.IN, ttl, priority + " " + weight + " " + port + " " + target + ".", zone);
- Update update = new Update(zone);
- update.delete(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);
+ private void sendToServer(final IServiceInfo serviceInfo, final boolean mode) {
+ Assert.isNotNull(serviceInfo);
+ final DnsSdServiceID serviceID = (DnsSdServiceID) serviceInfo.getServiceID();
+
+ try {
+ // TYPE.SRV
+ final Map srvRecords = serviceID.toSRVRecords();
+ for (Iterator itr = srvRecords.entrySet().iterator(); itr.hasNext(); ) {
+ final Map.Entry entry = (Entry) itr.next();
+ final Name zone = (Name) entry.getKey();
+ final Record record = (Record) entry.getValue();
+ final Update update = new Update(zone);
+ if(mode == ADD) {
+ //TODO add absent/present condition checks
+ update.replace(record);
+ } else {
update.delete(record);
}
- // set up a new resolver for the given domain
+ // TYPE.TXT
+ final Record[] txtRecords = serviceID.toTXTRecords(record.getName(), zone);
+ for (int j = 0; j < txtRecords.length; j++) {
+ if(mode == ADD) {
+ update.add(txtRecords[j]);
+ } else {
+ update.delete(txtRecords[j]);
+ }
+ }
+
+ // set up a new resolver for the given domain (a scope might use different domains)
((SimpleResolver)resolver).setAddress(InetAddress.getByName("ns1.ecf-project.org"));
resolver.setTCP(true);
- Message response = resolver.send(update);
-
+ final Message response = resolver.send(update);
if(response.getRcode() != Rcode.NOERROR) {
- DnsSdDiscoveryException.getException(response.getRcode());
+ throw DnsSdDiscoveryException.getException(response.getRcode());
}
- } catch (Exception e) {
- throw new DnsSdDiscoveryException(e);
}
+ } catch (Exception e) {
+ throw new DnsSdDiscoveryException(e);
}
}
@@ -155,6 +110,7 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
* @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#purgeCache()
*/
public IServiceInfo[] purgeCache() {
+ // purge cache means renew resolver?
throw new UnsupportedOperationException("Not yet implemented");
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java
index 70bb5328c..90f1be186 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java
@@ -10,17 +10,67 @@
******************************************************************************/
package org.eclipse.ecf.provider.dnssd;
+import java.io.IOException;
import java.net.URI;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.eclipse.ecf.core.identity.Namespace;
+import org.eclipse.ecf.discovery.IServiceProperties;
import org.eclipse.ecf.discovery.identity.IServiceTypeID;
import org.eclipse.ecf.discovery.identity.ServiceID;
+import org.xbill.DNS.DClass;
+import org.xbill.DNS.Name;
+import org.xbill.DNS.Record;
+import org.xbill.DNS.Type;
public class DnsSdServiceID extends ServiceID {
private static final long serialVersionUID = -5265675009221335638L;
- protected DnsSdServiceID(Namespace namespace, IServiceTypeID type, URI anUri) {
+ protected DnsSdServiceID(final Namespace namespace, final IServiceTypeID type, final URI anUri) {
super(namespace, type, anUri);
}
+
+ // TYPE.SRV
+ public Map toSRVRecords() throws IOException {
+ final Map result = new HashMap();
+ final String[] scopes = type.getScopes();
+ for (int i = 0; i < scopes.length; i++) {
+ final String domain = scopes[i] + ".";
+ final Name zone = Name.fromString(domain);
+
+ final Name name = Name.fromString("_" + type.getServices()[0] + "._"
+ + type.getProtocols()[0], zone);
+
+ final long ttl = serviceInfo.getTTL();
+ final int priority = serviceInfo.getPriority();
+ final int port = serviceInfo.getLocation().getPort();
+ final String target = serviceInfo.getLocation().getHost();
+ final int weight = serviceInfo.getWeight();
+
+ result.put(zone, Record.fromString(name, Type.SRV, DClass.IN,
+ ttl, priority + " " + weight + " " + port + " " + target
+ + ".", zone));
+ }
+ return result;
+ }
+
+ // TYPE.TXT
+ public Record[] toTXTRecords(final Name name, final Name zone) throws IOException {
+ final List result = new ArrayList();
+ final IServiceProperties properties = serviceInfo.getServiceProperties();
+ final Enumeration enumeration = properties.getPropertyNames();
+ while (enumeration.hasMoreElements()) {
+ final Object property = enumeration.nextElement();
+ final String key = property.toString();
+ final String value = (String) properties.getProperty(key).toString();
+ result.add(Record.fromString(name, Type.TXT, DClass.IN,
+ serviceInfo.getTTL(), key + "=" + value, zone));
+ }
+ return (Record[]) result.toArray(new Record[result.size()]);
+ }
}

Back to the top