diff options
| author | Markus Alexander Kuppe | 2010-07-20 15:36:33 +0000 |
|---|---|---|
| committer | Markus Alexander Kuppe | 2010-07-20 15:36:33 +0000 |
| commit | 560f68196e60e4c1391eb45f4446afb613b40886 (patch) | |
| tree | eed63b84acbcb6e818e3c15c251aefd810852208 | |
| parent | dfc694630adf60cd9663bc15f2adca40a232be82 (diff) | |
| download | org.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
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(); |
