| /******************************************************************************* |
| * Copyright (c) 2009 Markus Alexander Kuppe. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Markus Alexander Kuppe (ecf-dev_eclipse.org <at> lemmster <dot> de) - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ecf.provider.dnssd; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.ecf.core.identity.IDCreateException; |
| import org.eclipse.ecf.core.identity.Namespace; |
| import org.eclipse.ecf.discovery.identity.IServiceTypeID; |
| import org.eclipse.ecf.discovery.identity.ServiceTypeID; |
| import org.xbill.DNS.Lookup; |
| import org.xbill.DNS.Name; |
| import org.xbill.DNS.TextParseException; |
| import org.xbill.DNS.Type; |
| |
| public class DnsSdServiceTypeID extends ServiceTypeID implements IServiceTypeID { |
| |
| private static final long serialVersionUID = 1247933069737880365L; |
| |
| DnsSdServiceTypeID() { |
| super(new DnsSdNamespace()); |
| scopes = DEFAULT_SCOPE; |
| protocols = DEFAULT_PROTO; |
| namingAuthority = DEFAULT_NA; |
| services = new String[]{""}; //$NON-NLS-1$ |
| } |
| |
| public DnsSdServiceTypeID(Namespace ns, IServiceTypeID id) { |
| super(ns, id); |
| } |
| |
| public DnsSdServiceTypeID(Namespace namespace, String aType) |
| throws IDCreateException { |
| super(namespace, aType); |
| } |
| |
| DnsSdServiceTypeID(Namespace namespace, Name aName) { |
| super(namespace, aName.toString()); |
| } |
| |
| Lookup[] getInternalQueries() { |
| String[] protos = protocols; |
| int type = Type.SRV; |
| |
| String service = null; |
| if (services == null || services.length == 0 |
| || (services.length == 1 && services[0].equals(""))) { //$NON-NLS-1$ |
| // if no service is set, create a non service specific query |
| service = "_services._dns-sd._"; //$NON-NLS-1$ |
| |
| // and set proto to "udp" irregardless what has been set |
| protos = new String[] { "udp" }; //$NON-NLS-1$ |
| |
| // and query for PTR records |
| type = Type.PTR; |
| } else { |
| service = "_"; //$NON-NLS-1$ |
| for (int i = 0; i < services.length; i++) { |
| service += services[i]; |
| service += "._"; //$NON-NLS-1$ |
| } |
| } |
| |
| List result = new ArrayList(); |
| for (int i = 0; i < scopes.length; i++) { |
| String scope = scopes[i]; |
| // remove dangling "." |
| if(scope.endsWith(".")) { //$NON-NLS-1$ |
| scope = scope.substring(0, scope.length() - 1); |
| } |
| for (int j = 0; j < protos.length; j++) { |
| Lookup query; |
| try { |
| query = new Lookup(service + protos[j] + "." + scope + ".", //$NON-NLS-1$ //$NON-NLS-2$ |
| type); |
| } catch (TextParseException e) { |
| continue; |
| } |
| result.add(query); |
| } |
| } |
| return (Lookup[]) result.toArray(new Lookup[result.size()]); |
| } |
| |
| /** |
| * @param searchPaths Sets the default search path |
| */ |
| void setSearchPath(Name[] searchPaths) { |
| String[] s = new String[searchPaths.length]; |
| for(int i = 0; i < searchPaths.length; i++) { |
| s[i] = searchPaths[i].toString(); |
| } |
| setSearchPath(s); |
| } |
| |
| /** |
| * @param searchPaths Sets the default search path |
| */ |
| void setSearchPath(String[] searchPaths) { |
| scopes = searchPaths; |
| } |
| |
| /** |
| * @return Search scopes used during discovery |
| */ |
| String[] getSearchPath() { |
| return scopes; |
| } |
| |
| /** |
| * @param additionalSearchPaths Adds the given array to the existing search paths |
| */ |
| void addSearchPath(String[] additionalSearchPaths) { |
| //convert arrays to collections (lists) |
| Collection coll1 = Arrays.asList(scopes); |
| Collection coll2 = Arrays.asList(additionalSearchPaths); |
| |
| // remove dupes |
| Set s = new HashSet(); |
| s.addAll(coll1); |
| s.addAll(coll2); |
| |
| // convert into new scopes |
| scopes = (String[]) s.toArray(new String[s.size()]); |
| } |
| } |