/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.base.ds;
import java.io.Serializable;
import java.util.Comparator;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
/**
* Service Reference Comparator.
* This comparator follows OSGi Ranking policy.
* @author hengsin
*/
public final class ServiceRankingComparator implements Comparator>, Serializable {
/**
* generated serial id
*/
private static final long serialVersionUID = 3444598255961708618L;
/**
* share service ranking comparator instance
*/
public static final ServiceRankingComparator INSTANCE = new ServiceRankingComparator();
private ServiceRankingComparator() {}
/**
* Compares two service reference.
* @param serviceReference1 service reference 1
* @param serviceReference2 service reference 2
* @return -1 if service reference 1 service.ranking value
* is higher than service reference 2, 1 otherwise.
* (i.e for sorting in descending order of service.ranking value)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@Override
public int compare(ServiceReference> serviceReference1, ServiceReference> serviceReference2) {
if (serviceReference1.equals(serviceReference2)) { return 0; }
if (serviceReference2 != null) {
Object serviceRankingP1 = serviceReference1.getProperty(Constants.SERVICE_RANKING);
Object serviceRankingP2 = serviceReference2.getProperty(Constants.SERVICE_RANKING);
int serviceRanking1 = 0;
int serviceRanking2 = 0;
if (serviceRankingP1 instanceof Integer) {
serviceRanking1 = (Integer) serviceRankingP1;
}
if (serviceRankingP2 instanceof Integer) {
serviceRanking2 = (Integer) serviceRankingP2;
}
if (serviceRanking1 == serviceRanking2) {
// Check service.id
Object serviceIdP1 = serviceReference1.getProperty(Constants.SERVICE_ID);
Object serviceIdP2 = serviceReference2.getProperty(Constants.SERVICE_ID);
long serviceId1 = (Long) serviceIdP1;
long serviceId2 = (Long) serviceIdP2;
if (serviceId1 == serviceId2) {
return 0;
} else if (serviceId1 > serviceId2) {
return -1;
} else {
return 1;
}
} else if (serviceRanking1 > serviceRanking2) {
return -1;
} else {
return 1;
}
} else {
return 0;
}
}
}