Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Alexander Kuppe2010-07-20 15:36:33 +0000
committerMarkus Alexander Kuppe2010-07-20 15:36:33 +0000
commit560f68196e60e4c1391eb45f4446afb613b40886 (patch)
treeeed63b84acbcb6e818e3c15c251aefd810852208
parentdfc694630adf60cd9663bc15f2adca40a232be82 (diff)
downloadorg.eclipse.ecf-560f68196e60e4c1391eb45f4446afb613b40886.tar.gz
org.eclipse.ecf-560f68196e60e4c1391eb45f4446afb613b40886.tar.xz
org.eclipse.ecf-560f68196e60e4c1391eb45f4446afb613b40886.zip
NEW - bug 320188: [Discovery][DNS-SD] IDiscoveryAdvertiser must use registration domains
https://bugs.eclipse.org/bugs/show_bug.cgi?id=320188
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/.settings/.api_filters56
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/BnRDnsSdServiceTypeID.java18
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java28
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java39
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java5
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdServiceID.java6
6 files changed, 121 insertions, 31 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/.settings/.api_filters b/providers/bundles/org.eclipse.ecf.provider.dnssd/.settings/.api_filters
new file mode 100644
index 000000000..0144a9db1
--- /dev/null
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/.settings/.api_filters
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.ecf.provider.dnssd" version="2">
+ <resource path="src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java" type="org.eclipse.ecf.provider.dnssd.DnsSdDiscoveryAdvertiser">
+ <filter id="643846161">
+ <message_arguments>
+ <message_argument value="Name"/>
+ <message_argument value="DnsSdDiscoveryAdvertiser"/>
+ <message_argument value="getAuthoritativeNameServer(Name)"/>
+ </message_arguments>
+ </filter>
+ <filter id="643846161">
+ <message_arguments>
+ <message_argument value="Name"/>
+ <message_argument value="DnsSdDiscoveryAdvertiser"/>
+ <message_argument value="getUpdateDomain(Name)"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java" type="org.eclipse.ecf.provider.dnssd.DnsSdDiscoveryContainerAdapter">
+ <filter id="627060751">
+ <message_arguments>
+ <message_argument value="Resolver"/>
+ <message_argument value="DnsSdDiscoveryContainerAdapter"/>
+ <message_argument value="resolver"/>
+ </message_arguments>
+ </filter>
+ <filter id="643842064">
+ <message_arguments>
+ <message_argument value="Record"/>
+ <message_argument value="DnsSdDiscoveryContainerAdapter"/>
+ <message_argument value="getRecords(DnsSdServiceTypeID)"/>
+ </message_arguments>
+ </filter>
+ <filter id="643846161">
+ <message_arguments>
+ <message_argument value="Lookup"/>
+ <message_argument value="DnsSdDiscoveryContainerAdapter"/>
+ <message_argument value="getSRVRecord(Lookup, Comparator)"/>
+ </message_arguments>
+ </filter>
+ <filter id="643846161">
+ <message_arguments>
+ <message_argument value="Lookup"/>
+ <message_argument value="DnsSdDiscoveryContainerAdapter"/>
+ <message_argument value="getSRVRecords(Lookup[])"/>
+ </message_arguments>
+ </filter>
+ <filter id="643846161">
+ <message_arguments>
+ <message_argument value="Lookup"/>
+ <message_argument value="DnsSdDiscoveryContainerAdapter"/>
+ <message_argument value="getSRVRecords(Lookup[], Comparator)"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/BnRDnsSdServiceTypeID.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/BnRDnsSdServiceTypeID.java
index 95a4daee8..e9a6de71c 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/BnRDnsSdServiceTypeID.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/BnRDnsSdServiceTypeID.java
@@ -11,6 +11,7 @@
package org.eclipse.ecf.provider.dnssd;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import org.eclipse.ecf.discovery.identity.IServiceTypeID;
@@ -71,4 +72,21 @@ public class BnRDnsSdServiceTypeID extends DnsSdServiceTypeID {
}
return (Lookup[]) result.toArray(new Lookup[result.size()]);
}
+
+ void setScope(String target) {
+ if(target.endsWith(".")) {
+ target = target.substring(0, target.length() - 1);
+ }
+ scopes = new String[]{target};
+ createType();
+ }
+
+ Collection getScopesAsZones() {
+ final List res = new ArrayList(scopes.length);
+ for (int i = 0; i < scopes.length; i++) {
+ String scope = scopes[i];
+ res.add(scope + ".");
+ }
+ return res;
+ }
}
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 b416adbc9..9e0702a82 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
@@ -118,7 +118,7 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
fireContainerEvent(new ContainerConnectedEvent(this.getID(), targetID));
}
- private void sendToServer(final IServiceInfo serviceInfo, final boolean mode) {
+ protected void sendToServer(final IServiceInfo serviceInfo, final boolean mode) {
Assert.isNotNull(serviceInfo);
final DnsSdServiceID serviceID = (DnsSdServiceID) serviceInfo.getServiceID();
try {
@@ -198,23 +198,11 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
}
}
- private Collection getUpdateDomain(final Name zone) throws TextParseException {
+ protected Collection getUpdateDomain(final Name zone) throws TextParseException {
// query for special "_dns-update" SRV records which mark the server to use for dyndns
final Lookup query = new Lookup(_DNS_UPDATE + zone, Type.SRV);
// use the SRV record with the lowest priority/weight first
final SortedSet srvRecords = getSRVRecord(query, new SRVRecordComparator());
-//
-// int prio = Integer.MAX_VALUE, weight = Integer.MAX_VALUE;
-// for (Iterator iterator = srvRecords.iterator(); iterator.hasNext();) {
-// final SRVRecord srvRecord = (SRVRecord) iterator.next();
-// if(srvRecord.getPriority() < prio) {
-// if (srvRecord.getWeight() < weight) {
-// prio = srvRecord.getPriority();
-// weight = srvRecord.getPriority();
-// result.add(new URI("dns://" + srvRecord.getTarget() + ":" + srvRecord.getPort()));
-// }
-// }
-// }
// if no dedicated "_dns-update" server is configured, fall back to regular authoritative server
if(srvRecords.size() == 0) {
@@ -223,7 +211,7 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
return srvRecords;
}
- private Collection getAuthoritativeNameServer(final Name zone) throws TextParseException {
+ protected Collection getAuthoritativeNameServer(final Name zone) throws TextParseException {
final Set result = new HashSet();
final Name name = new Name(_DNS_UPDATE + zone);
@@ -258,13 +246,13 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
return result;
}
- 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();
+ protected String[] getRegistrationDomains(IServiceTypeID aServiceTypeId) {
+ final String[] rrs = new String[] {BnRDnsSdServiceTypeID.REG_DOMAINS, BnRDnsSdServiceTypeID.DEFAULT_REG_DOMAIN};
+ final Collection registrationDomains = getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
+ final String[] scopes = aServiceTypeId.getScopes();
for (int i = 0; i < scopes.length; i++) {
scopes[i] = scopes[i].concat(".");
}
- return registrationDomains.length == 0 ? scopes : registrationDomains;
+ return registrationDomains.size() == 0 ? scopes : (String[]) registrationDomains.toArray(new String[registrationDomains.size()]);
}
}
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 d9c8853e6..4050a1bda 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
@@ -13,6 +13,7 @@ package org.eclipse.ecf.provider.dnssd;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
@@ -140,22 +141,48 @@ public abstract class DnsSdDiscoveryContainerAdapter extends
getConnectedID()));
}
- protected String[] getBrowsingOrRegistrationDomains(final IServiceTypeID aServiceTypeId, final String[] rrs) {
+ protected Collection getBrowsingOrRegistrationDomains(final IServiceTypeID aServiceTypeId, final String[] rrs) {
final Set res = new HashSet();
+ getBrowsingOrRegistrationDomains(aServiceTypeId, rrs, res);
+ return res;
+ }
+
+ private void getBrowsingOrRegistrationDomains(final IServiceTypeID aServiceTypeId,
+ final String[] rrs, final Set res) {
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());
+ if(records.length == 0) {
+ res.addAll(serviceType.getScopesAsZones());
+ } else {
+ for (int j = 0; j < records.length; j++) {
+ final PTRRecord record = (PTRRecord) records[j];
+ final String target = record.getTarget().toString();
+ if(isFinal(record)) {
+ res.add(target.toString());
+ } else {
+ if(!res.contains(target)) { // guard against cycles
+ final BnRDnsSdServiceTypeID newServiceType =
+ new BnRDnsSdServiceTypeID(serviceType, rrs[i]);
+ newServiceType.setScope(target);
+ getBrowsingOrRegistrationDomains(newServiceType, rrs, res);
+ } else {
+ continue;
+ }
+ }
+ }
}
}
-
- return (String[]) res.toArray(new String[res.size()]);
}
+ private boolean isFinal(PTRRecord record) {
+ Name name = record.getName();
+ Name target = record.getTarget();
+ return name.subdomain(target);
+ }
+
protected Record[] getRecords(final DnsSdServiceTypeID serviceTypeId) {
final List result = new ArrayList();
final Lookup[] queries = serviceTypeId.getInternalQueries();
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 ddc96392c..627e344f7 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
@@ -212,7 +212,8 @@ public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter {
}
private String[] getBrowsingDomains(IServiceTypeID aServiceTypeId) {
- String[] rrs = new String[] {BnRDnsSdServiceTypeID.BROWSE_DOMAINS, BnRDnsSdServiceTypeID.DEFAULT_BROWSE_DOMAIN};
- return getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
+ final String[] rrs = new String[] {BnRDnsSdServiceTypeID.BROWSE_DOMAINS, BnRDnsSdServiceTypeID.DEFAULT_BROWSE_DOMAIN};
+ final Collection res = getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
+ return (String[]) res.toArray(new String[res.size()]);
}
}
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 bd297ddce..bbd1361bf 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
@@ -36,7 +36,7 @@ public class DnsSdServiceID extends ServiceID {
}
- public Name getDnsName() throws TextParseException {
+ Name getDnsName() throws TextParseException {
return new Name("_" + type.getServices()[0] + "._"
+ type.getProtocols()[0]);
}
@@ -45,7 +45,7 @@ public class DnsSdServiceID extends ServiceID {
* @return A relative SRV record independent of a given domain/zone
* @throws IOException
*/
- public Record toSRVRecord() throws IOException {
+ 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();
@@ -61,7 +61,7 @@ public class DnsSdServiceID extends ServiceID {
* @return A relative TXT record independent of a given domain/zone
* @throws IOException
*/
- public Record[] toTXTRecords(final Record aRecord) throws IOException {
+ Record[] toTXTRecords(final Record aRecord) throws IOException {
final List result = new ArrayList();
final IServiceProperties properties = serviceInfo.getServiceProperties();
final Enumeration enumeration = properties.getPropertyNames();

Back to the top