package cc.blynk.utils;
import cc.blynk.core.http.model.NameCountResponse;
import cc.blynk.server.core.stats.model.CommandStat;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 09.12.15.
*/
public class AdminHttpUtil {
private static final Logger log = LogManager.getLogger(AdminHttpUtil.class);
@SuppressWarnings("unchecked")
public static List<?> sort(List<?> list, String field, String order, boolean nameAsInt) {
if (list.size() == 0) {
return list;
}
try {
Comparator c = new GenericComparator(list.get(0).getClass(), field, nameAsInt);
Collections.sort(list, "ASC".equals(order) ? c : Collections.reverseOrder(c));
} catch (NoSuchFieldException e) {
log.warn("No order field '{}'", field);
} catch (Exception e) {
log.error("Problem sorting.", e);
}
return list;
}
public static List<?> sort(List<?> list, String field, String order) {
return sort(list, field, order, false);
}
public static List<NameCountResponse> convertMapToPair(Map<String, ?> map) {
return map.entrySet().stream().map(NameCountResponse::new).collect(Collectors.toList());
}
@SuppressWarnings("unchecked")
public static List<NameCountResponse> convertObjectToMap(CommandStat commandStat) {
return convertMapToPair(JsonParser.mapper.convertValue(commandStat, Map.class));
}
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 10.12.15.
*/
public static class GenericComparator implements Comparator {
private final Class<?> fieldType;
private final Field field;
private final boolean nameAsInt;
public GenericComparator(Class<?> type, String sortField, boolean nameAsInt) throws NoSuchFieldException{
this.field = type.getField(sortField);
this.fieldType = field.getType();
this.nameAsInt = nameAsInt;
}
@Override
public int compare(Object o1, Object o2) {
try {
Object v1 = field.get(o1);
Object v2 = field.get(o2);
return compareActual(v1, v2, fieldType);
} catch (Exception e) {
throw new RuntimeException("Error on compare during sorting. Type : " + e.getMessage());
}
}
private int compareActual(Object v1, Object v2, Class<?> returnType) {
if (returnType == int.class || returnType == Integer.class) {
return Integer.compare((int) v1, (int) v2);
}
if (returnType == long.class || returnType == Long.class) {
return Long.compare((long) v1, (long) v2);
}
if (returnType == String.class) {
if (nameAsInt) {
return Integer.valueOf((String) v1).compareTo(Integer.valueOf((String) v2));
} else {
return ((String) v1).compareTo((String) v2);
}
}
throw new RuntimeException("Unexpected field type. Type : " + returnType.getName());
}
}
}