diff options
| author | Markus Alexander Kuppe | 2010-07-18 09:12:55 +0000 |
|---|---|---|
| committer | Markus Alexander Kuppe | 2010-07-18 09:12:55 +0000 |
| commit | ddf625354696ffd475f56e14fbfb7df37dcf1e6b (patch) | |
| tree | c8b95f58ccef11d2711c530b76f9f635546b532b | |
| parent | 1476a25326195bddd89cbae2cc057a01699ef1d8 (diff) | |
| download | org.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
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()]); + } } |
