package com.codetroopers.play.elasticsearch; import org.elasticsearch.common.geo.GeoPoint; import org.joda.time.format.ISODateTimeFormat; import play.Logger; import java.math.BigDecimal; import java.util.*; public abstract class IndexUtils { @SuppressWarnings("unchecked") public static <T extends Indexable> List<T> getIndexables(Map map, String key, Class<T> t) { List<Map<String, Object>> mapList = (List<Map<String, Object>>) map.get(key); List<T> list = new ArrayList<>(); if (mapList != null) { for (Map<String, Object> map1 : mapList) { list.add(getIndexable(map1, t)); } } return list; } public static <T extends Indexable> T getIndexable(Map map, String key, Class<T> t) { Map map1 = (Map) map.get(key); return getIndexable(map1, t); } @SuppressWarnings("unchecked") public static <T extends Indexable> T getIndexable(Map map, Class<T> t) { T instance = IndexUtils.getInstanceIndexable(t); return (T) instance.fromIndex(map); } /** * Converts a List of Object T to an List of Map<String, Object> for serialize in the index * * @param listT * @param <T> * @return */ @SuppressWarnings("unchecked") public static <T extends Indexable> List<Map<String, Object>> toIndex(List<T> listT) { List<Map<String, Object>> mapList = new ArrayList<>(); for (T t : listT) { mapList.add(t.toIndex()); } return mapList; } public static <T extends Index> T getInstanceIndex(Class<T> clazz) { T object = null; try { object = clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { Logger.error("...", e); } return object; } public static <T extends Indexable> T getInstanceIndexable(Class<T> clazz) { T object = null; try { object = clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { Logger.error("...", e); } return object; } /** * Convert String to Object * * @param value * @param targetType * @return */ public static Object convertValue(final Object value, final Class<?> targetType) { if (value == null) { return null; } if (targetType.equals(value.getClass())) { return value; } if (targetType.equals(String.class)) { return value.toString(); } else if (targetType.equals(BigDecimal.class)) { return new BigDecimal(value.toString()); } else if (targetType.equals(Date.class)) { return convertToDate(value); } else if (targetType.equals(Integer.class)) { if (value instanceof Number) { return ((Number) value).intValue(); } else { return Integer.valueOf(value.toString()); } } else if (targetType.equals(Long.class)) { if (value instanceof Number) { return ((Number) value).longValue(); } else { return Long.valueOf(value.toString()); } } else if (targetType.equals(Double.class)) { if (value instanceof Number) { return ((Number) value).doubleValue(); } else { return Double.valueOf(value.toString()); } } else if (targetType.equals(Float.class)) { if (value instanceof Number) { return ((Number) value).floatValue(); } else { return Float.valueOf(value.toString()); } } else if (targetType.equals(UUID.class)) { return UUID.fromString((String) value); } else if (targetType.equals(GeoPoint.class)) { Map geoValuesMap = (Map) value; return new GeoPoint((Double)geoValuesMap.get("lat"),(Double)geoValuesMap.get("lon")); } else { return value; } } /** * Convert to date. * * @param value the value * @return the date */ private static Date convertToDate(Object value) { Date date = null; if (value != null && !"".equals(value)) { if (value instanceof Long) { date = new Date((Long) value); } else if (value instanceof String) { String val = (String) value; int dateLength = String.valueOf(Long.MAX_VALUE).length(); if (dateLength == val.length()) { date = new Date(Long.valueOf(val)); } else { date = getDate(val); } } else { date = (Date) value; } } return date; } private static Date getDate(String val) { try { return ISODateTimeFormat.dateTimeParser().withZoneUTC().parseLocalDateTime(val).toDate(); } catch (Throwable t) { Logger.error(val, t); } return null; } }