/******************************************************************************* * Copyright (c) 2010 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.tests.provider.dnssd; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.eclipse.ecf.discovery.IServiceInfo; import org.xbill.DNS.Record; import org.xbill.DNS.SRVRecord; import org.xbill.DNS.TXTRecord; public class DnsSdAdvertiserComparator implements Comparator { private static final int membercount = 5; /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(final Object arg0, final Object arg1) { int result = -1; if (arg0 instanceof IServiceInfo) { final IServiceInfo serviceInfo = (IServiceInfo) arg0; if (arg1 instanceof List) { result = (serviceInfo.getServiceProperties().size() + membercount) * -1; final List records = (List) arg1; for (final Iterator itr = records.iterator(); itr.hasNext();) { final Record record = (Record) itr.next(); if(record instanceof SRVRecord) { result = compareSrvRecord(result, serviceInfo, record); } else if(record instanceof TXTRecord) { final String[] str = record.rdataToString().split("="); final String key = str[0].substring(1); final String value = str[1].substring(0, str[1].length() - 1); final Object property = serviceInfo.getServiceProperties().getProperty(key); if(property != null) { result += value.equals(property.toString()) ? 1 : -1; } else { result += -1; } } } } else if(arg1 instanceof SRVRecord) { result = compareSrvRecord(-membercount, serviceInfo, (SRVRecord) arg1); } } return result; } private int compareSrvRecord(int result, final IServiceInfo serviceInfo, final Record record) { final SRVRecord srvRec = (SRVRecord) record; final String name = srvRec.getName().toString(); final String string = "_" + DnsSdTestHelper.REG_SCHEME + "._" + DnsSdTestHelper.PROTO; if(name.startsWith(string)) { final String target = srvRec.getTarget().toString(); result += serviceInfo.getPriority() == srvRec.getPriority() ? 1 : -1; result += serviceInfo.getWeight() == srvRec.getWeight() ? 1 : -1; result += DnsSdTestHelper.TTL == srvRec.getTTL() ? 1 : -1; result += serviceInfo.getLocation().getHost().equals(target.substring(0, target.length() - 1)) ? 1 : -1; result += serviceInfo.getLocation().getPort() == srvRec.getPort() ? 1 : -1; } return result; } }