diff options
author | Markus Alexander Kuppe | 2010-07-18 17:22:20 +0000 |
---|---|---|
committer | Markus Alexander Kuppe | 2010-07-18 17:22:20 +0000 |
commit | 88d440cc9653c0592750d752f60dffd659141e11 (patch) | |
tree | 4f5a302f0ed8e6903781a8a701358168f79ab932 /providers | |
parent | ddf625354696ffd475f56e14fbfb7df37dcf1e6b (diff) | |
download | org.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')
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()]); } |