package org.elasticsearch.jdbc.es; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.elasticsearch.jdbc.exception.ResolveSearchResponseException; import org.elasticsearch.utils.Constants; import java.util.Collections; import java.util.List; public class JdbcSearchResponseResolver { private String oriSearchResponseGson; public JdbcSearchResponseResolver(String oriSearchResponseGson) { if (StringUtils.isBlank(oriSearchResponseGson)) { throw new IllegalArgumentException("param[oriSearchResponseGson] can not be blank"); } this.oriSearchResponseGson = oriSearchResponseGson; } public String getOriSearchResponseGson() { return oriSearchResponseGson; } public JdbcSearchResponse resolveSearchResponse(Class clazz) throws ResolveSearchResponseException { Gson defaultEsDateFormatGson = new GsonBuilder().setDateFormat(Constants.DEFAULT_ES_DATE_FORMAT).create(); return resolveSearchResponse(clazz, defaultEsDateFormatGson); } public JdbcSearchResponse resolveSearchResponse(TypeToken typeToken) throws ResolveSearchResponseException { Gson defaultEsDateFormatGson = new GsonBuilder().setDateFormat(Constants.DEFAULT_ES_DATE_FORMAT).create(); return resolveSearchResponse(typeToken, defaultEsDateFormatGson); } public JdbcSearchResponse resolveSearchResponse(Class clazz, String datePattern) throws ResolveSearchResponseException { Gson dateFormatGson = new GsonBuilder().setDateFormat(datePattern).create(); return resolveSearchResponse(clazz, dateFormatGson); } public JdbcSearchResponse resolveSearchResponse(TypeToken typeToken, String datePattern) throws ResolveSearchResponseException { Gson dateFormatGson = new GsonBuilder().setDateFormat(datePattern).create(); return resolveSearchResponse(typeToken, dateFormatGson); } public JdbcSearchResponse resolveSearchResponse(Class clazz, Gson gson) throws ResolveSearchResponseException { return resolveSearchResponse(new ResolveStrategy() { @Override public T resolve(String resultItem) { return gson.fromJson(resultItem, clazz); } }); } public JdbcSearchResponse resolveSearchResponse(TypeToken typeToken, Gson gson) throws ResolveSearchResponseException { return resolveSearchResponse(new ResolveStrategy() { @Override public T resolve(String resultItem) { return gson.fromJson(resultItem, typeToken.getType()); } }); } public JdbcSearchResponse resolveSearchResponse(ResolveStrategy resolveStrategy) throws ResolveSearchResponseException { JdbcSearchResponse searchRespStrGson = parseSearchResponseGson(oriSearchResponseGson); JdbcSearchResponse retJdbcSearchResponse = new JdbcSearchResponse(); setBasicPropertyForResponse(retJdbcSearchResponse, searchRespStrGson); List resultList = resolveResultList(searchRespStrGson.getResultList(), resolveStrategy); retJdbcSearchResponse.setResultList(resultList); return retJdbcSearchResponse; } protected List resolveResultList(List resultList, ResolveStrategy resolveStrategy) { if (CollectionUtils.isEmpty(resultList)) { return Collections.emptyList(); } List resolvedList = null; try { resolvedList = Lists.transform(resultList, new Function() { @Override public T apply(String resultItem) { return resolveStrategy.resolve(resultItem); } }); } catch (Exception ex) { throw new ResolveSearchResponseException("Failed to resolve gson from response", ex); } return resolvedList; } protected JdbcSearchResponse parseSearchResponseGson(String searchRespGson) { JdbcSearchResponse searchRespStrGson; try { searchRespStrGson = new Gson().fromJson(oriSearchResponseGson, new TypeToken>() {}.getType()); } catch (Exception exp) { throw new ResolveSearchResponseException(String.format("Failed to parse responseGson[%s] to JdbcSearchResponse", oriSearchResponseGson), exp); } return searchRespStrGson; } protected void setBasicPropertyForResponse(JdbcSearchResponse targetResponse, JdbcSearchResponse sourceResponse) { targetResponse.setTotalShards(sourceResponse.getTotalShards()); targetResponse.setTotalCount(sourceResponse.getTotalCount()); targetResponse.setTookInMillis(sourceResponse.getTookInMillis()); targetResponse.setFailedShards(sourceResponse.getFailedShards()); targetResponse.setSuccessfulShards(sourceResponse.getSuccessfulShards()); } public interface ResolveStrategy { T resolve(String resultItem); } }