Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Alexander Kuppe2010-07-18 17:22:20 +0000
committerMarkus Alexander Kuppe2010-07-18 17:22:20 +0000
commit88d440cc9653c0592750d752f60dffd659141e11 (patch)
tree4f5a302f0ed8e6903781a8a701358168f79ab932 /providers
parentddf625354696ffd475f56e14fbfb7df37dcf1e6b (diff)
downloadorg.eclipse.ecf-88d440cc9653c0592750d752f60dffd659141e11.tar.gz
org.eclipse.ecf-88d440cc9653c0592750d752f60dffd659141e11.tar.xz
org.eclipse.ecf-88d440cc9653c0592750d752f60dffd659141e11.zip
NEW - bug 320188: [Discovery][DNS-SD] IDiscoveryAdvertiser must use registration domains
https://bugs.eclipse.org/bugs/show_bug.cgi?id=320188
Diffstat (limited to 'providers')
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java51
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java40
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java31
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java55
4 files changed, 103 insertions, 74 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 192b25c91..16fcbc86d 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,9 +12,6 @@ package org.eclipse.ecf.provider.dnssd;
import java.net.InetAddress;
import java.net.UnknownHostException;
-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;
@@ -25,6 +22,7 @@ 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.identity.IServiceTypeID;
import org.xbill.DNS.Message;
import org.xbill.DNS.Name;
import org.xbill.DNS.Rcode;
@@ -60,34 +58,37 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
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 Record srvRecord = serviceID.toSRVRecord(); // TYPE.SRV
+ final Record[] txtRecords = serviceID.toTXTRecords(srvRecord); // TYPE.TXT
+ final Name name = serviceID.getDnsName();
+
+ final String[] registrationDomains = getRegistrationDomains(serviceID.getServiceTypeID());
+
+ for (int i = 0; i < registrationDomains.length; i++) {
+ final Name zone = new Name(registrationDomains[i]);
+ final Name fqdn = new Name(name.toString() + "." + zone.toString());
final Update update = new Update(zone);
+
+ //TYPE.SRV
if(mode == ADD) {
//TODO add absent/present condition checks
- update.replace(record);
+ update.replace(srvRecord.withName(fqdn));
} else {
- update.delete(record);
+ update.delete(srvRecord.withName(fqdn));
}
- // TYPE.TXT
- final Record[] txtRecords = serviceID.toTXTRecords(record.getName(), zone);
+ //TYPE.TXT
for (int j = 0; j < txtRecords.length; j++) {
if(mode == ADD) {
- update.add(txtRecords[j]);
+ update.add(txtRecords[j].withName(fqdn));
} else {
- update.delete(txtRecords[j]);
+ update.delete(txtRecords[j].withName(fqdn));
}
}
// set up a new resolver for the given domain (a scope might use different domains)
- ((SimpleResolver)resolver).setAddress(InetAddress.getByName("ns1.ecf-project.org"));
+ ((SimpleResolver) resolver).setAddress(getUpdateDomain(zone));
resolver.setTCP(true);
final Message response = resolver.send(update);
if(response.getRcode() != Rcode.NOERROR) {
@@ -99,6 +100,22 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
}
}
+ private InetAddress getUpdateDomain(final Name zone) throws UnknownHostException {
+ //TODO resolve dyndns domain
+ return InetAddress.getByName("ns1.ecf-project.org");
+ }
+
+
+ private String[] getRegistrationDomains(IServiceTypeID aServiceTypeId) {
+ String[] rrs = new String[] {BnRDnsSdServiceTypeID.REG_DOMAINS, BnRDnsSdServiceTypeID.DEFAULT_REG_DOMAIN};
+ final String[] registrationDomains = getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
+ String[] scopes = aServiceTypeId.getScopes();
+ for (int i = 0; i < scopes.length; i++) {
+ scopes[i] = scopes[i].concat(".");
+ }
+ return registrationDomains.length == 0 ? scopes : registrationDomains;
+ }
+
/* (non-Javadoc)
* @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#unregisterAllServices()
*/
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java
index bee1530d0..18a09b203 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java
@@ -11,6 +11,11 @@
package org.eclipse.ecf.provider.dnssd;
import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.ContainerConnectException;
@@ -23,6 +28,9 @@ import org.eclipse.ecf.discovery.DiscoveryContainerConfig;
import org.eclipse.ecf.discovery.IServiceInfo;
import org.eclipse.ecf.discovery.identity.IServiceID;
import org.eclipse.ecf.discovery.identity.IServiceTypeID;
+import org.xbill.DNS.Lookup;
+import org.xbill.DNS.PTRRecord;
+import org.xbill.DNS.Record;
import org.xbill.DNS.Resolver;
import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.TSIG;
@@ -126,6 +134,36 @@ public abstract class DnsSdDiscoveryContainerAdapter extends
getConnectedID()));
}
+ protected String[] getBrowsingOrRegistrationDomains(final IServiceTypeID aServiceTypeId, final String[] rrs) {
+ final Set res = new HashSet();
+ for (int i = 0; i < rrs.length; i++) {
+ final BnRDnsSdServiceTypeID serviceType =
+ new BnRDnsSdServiceTypeID(aServiceTypeId, rrs[i]);
+
+ final Record[] records = getRecords(serviceType);
+ for (int j = 0; j < records.length; j++) {
+ final PTRRecord record = (PTRRecord) records[j];
+ res.add(record.getTarget().toString());
+ }
+ }
+
+ return (String[]) res.toArray(new String[res.size()]);
+ }
+
+ protected Record[] getRecords(final DnsSdServiceTypeID serviceTypeId) {
+ final List result = new ArrayList();
+ final Lookup[] queries = serviceTypeId.getInternalQueries();
+ for (int i = 0; i < queries.length; i++) {
+ final Lookup query = queries[i];
+ query.setResolver(resolver);
+ final Record[] queryResult = query.run();
+ if(queryResult != null) {
+ result.addAll(Arrays.asList(queryResult));
+ }
+ }
+ return (Record[]) result.toArray(new Record[result.size()]);
+ }
+
/**
* @param searchPaths The default search path used for discovery
*/
@@ -159,4 +197,6 @@ public abstract class DnsSdDiscoveryContainerAdapter extends
public void setTsigKey(String tsigKeyName, String tsigKey) {
resolver.setTSIGKey(new TSIG(tsigKeyName, tsigKey));
}
+
+
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
index b0c9f8fea..9ceed4bda 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
@@ -14,11 +14,9 @@ import java.net.URI;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
-import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.ContainerConnectException;
@@ -102,20 +100,6 @@ public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter {
return (IServiceTypeID[]) result.toArray(new IServiceTypeID[result.size()]);
}
- private Record[] getRecords(final DnsSdServiceTypeID serviceTypeId) {
- List result = new ArrayList();
- Lookup[] queries = serviceTypeId.getInternalQueries();
- for (int i = 0; i < queries.length; i++) {
- Lookup query = queries[i];
- query.setResolver(resolver);
- Record[] queryResult = query.run();
- if(queryResult != null) {
- result.addAll(Arrays.asList(queryResult));
- }
- }
- return (Record[]) result.toArray(new Record[result.size()]);
- }
-
/*
* (non-Javadoc)
*
@@ -254,20 +238,7 @@ public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter {
}
private String[] getBrowsingDomains(IServiceTypeID aServiceTypeId) {
- Set res = new HashSet();
-
String[] rrs = new String[] {BnRDnsSdServiceTypeID.BROWSE_DOMAINS, BnRDnsSdServiceTypeID.DEFAULT_BROWSE_DOMAIN};
- for (int i = 0; i < rrs.length; i++) {
- BnRDnsSdServiceTypeID serviceType =
- new BnRDnsSdServiceTypeID(aServiceTypeId, rrs[i]);
-
- Record[] defaultBrowsing = getRecords(serviceType);
- for (int j = 0; j < defaultBrowsing.length; j++) {
- PTRRecord record = (PTRRecord) defaultBrowsing[j];
- res.add(record.getTarget().toString());
- }
- }
-
- return (String[]) res.toArray(new String[res.size()]);
+ return getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
}
}
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 90f1be186..bd297ddce 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
@@ -14,9 +14,7 @@ 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;
@@ -25,7 +23,9 @@ 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;
+import org.xbill.DNS.SRVRecord;
+import org.xbill.DNS.TXTRecord;
+import org.xbill.DNS.TextParseException;
public class DnsSdServiceID extends ServiceID {
@@ -35,32 +35,33 @@ public class DnsSdServiceID extends ServiceID {
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();
+ public Name getDnsName() throws TextParseException {
+ return new Name("_" + type.getServices()[0] + "._"
+ + type.getProtocols()[0]);
+ }
+
+ /**
+ * @return A relative SRV record independent of a given domain/zone
+ * @throws IOException
+ */
+ public Record toSRVRecord() throws IOException {
+ final Name name = new Name(getDnsName().toString(), new Name(type.getScopes()[0] + "."));
+ final long ttl = serviceInfo.getTTL();
+ final int priority = serviceInfo.getPriority();
+ final int weight = serviceInfo.getWeight();
+ final int port = serviceInfo.getLocation().getPort();
+ final Name target = Name.fromString(serviceInfo.getLocation().getHost() + ".");
- result.put(zone, Record.fromString(name, Type.SRV, DClass.IN,
- ttl, priority + " " + weight + " " + port + " " + target
- + ".", zone));
- }
- return result;
+ return new SRVRecord(name, DClass.IN, ttl, priority, weight, port, target);
}
- // TYPE.TXT
- public Record[] toTXTRecords(final Name name, final Name zone) throws IOException {
+ /**
+ * @param aRecord The corresponding SRVRecord
+ * @return A relative TXT record independent of a given domain/zone
+ * @throws IOException
+ */
+ public Record[] toTXTRecords(final Record aRecord) throws IOException {
final List result = new ArrayList();
final IServiceProperties properties = serviceInfo.getServiceProperties();
final Enumeration enumeration = properties.getPropertyNames();
@@ -68,8 +69,8 @@ public class DnsSdServiceID extends ServiceID {
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));
+ final long ttl = serviceInfo.getTTL();
+ result.add(new TXTRecord(aRecord.getName(), DClass.IN, ttl, key + "=" + value));
}
return (Record[]) result.toArray(new Record[result.size()]);
}

Back to the top