/*******************************************************************************
* 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.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
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.SRVRecord;
import org.xbill.DNS.TXTRecord;
import org.xbill.DNS.TextParseException;
public class DnsSdServiceID extends ServiceID {
private static final long serialVersionUID = -5265675009221335638L;
protected DnsSdServiceID(final Namespace namespace, final IServiceTypeID type, final URI anUri) {
super(namespace, type, anUri);
}
Name getDnsName() throws TextParseException {
return new Name("_" + type.getServices()[0] + "._" //$NON-NLS-1$ //$NON-NLS-2$
+ type.getProtocols()[0]);
}
/**
* @return A relative SRV record independent of a given domain/zone
* @throws IOException
*/
Record toSRVRecord() throws IOException {
final Name name = new Name(getDnsName().toString(), new Name(type.getScopes()[0] + ".")); //$NON-NLS-1$
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() + "."); //$NON-NLS-1$
return new SRVRecord(name, DClass.IN, ttl, priority, weight, port, target);
}
/**
* @param aRecord The corresponding SRVRecord
* @return A relative TXT record independent of a given domain/zone
* @throws IOException
*/
Record[] toTXTRecords(final Record aRecord) 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();
final long ttl = serviceInfo.getTTL();
result.add(new TXTRecord(aRecord.getName(), DClass.IN, ttl, key + "=" + value)); //$NON-NLS-1$
}
return (Record[]) result.toArray(new Record[result.size()]);
}
}