package cn.emay.sdk.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import cn.emay.sdk.common.CommonConstants; import cn.emay.sdk.core.dto.cache.UrlDTO; import cn.emay.sdk.core.dto.sms.common.ResultModel; import cn.emay.sdk.core.dto.sms.request.BalanceRequest; import cn.emay.sdk.core.dto.sms.response.BalanceResponse; import cn.emay.sdk.util.http.client.EmayHttpClient; import cn.emay.sdk.util.http.request.impl.EmayHttpRequestString; import cn.emay.sdk.util.http.response.impl.string.EmayHttpResponseString; import cn.emay.sdk.util.http.response.impl.string.EmayHttpResponseStringPraser; import cn.emay.sdk.util.json.JsonHelper; import cn.emay.sdk.util.json.gson.JsonArray; import cn.emay.sdk.util.json.gson.JsonElement; import cn.emay.sdk.util.json.gson.JsonParser; import cn.emay.sdk.util.json.gson.reflect.TypeToken; public class HostUtil { public static String getUrl(String appId, String secretkey) { String host = ""; List list = CommonConstants.interList; try { if (list != null) { long minUseTime = -1l; for (String url : list) { long useTime = getBalance(appId, secretkey, url); if (useTime == -1) { continue; } else if (minUseTime == -1 || minUseTime > useTime) { minUseTime = useTime; host = url; } } } } catch (Exception e) { e.printStackTrace(); } return host; } public static void getSDKInter() { EmayHttpClient client = new EmayHttpClient(); EmayHttpRequestString request = null; try { request = new EmayHttpRequestString(CommonConstants.getSdkUrl, "UTF-8", "POST", null, null, null); EmayHttpResponseString res = client.service(request, new EmayHttpResponseStringPraser()); if (res != null && res.getResultCode().getCode().equals("SUCCESS")) { String json = res.getResultString(); if (json != null && !json.equals("")) { List list = new ArrayList(); JsonArray array = new JsonParser().parse(json).getAsJsonObject().getAsJsonArray("result"); Iterator iterator = array.iterator(); while (iterator.hasNext()) { JsonElement element = iterator.next(); String ip = element.getAsJsonObject().get("ip").getAsString(); Integer port = element.getAsJsonObject().get("port").getAsInt(); list.add("http://" + ip + ":" + port); } CommonConstants.interList = list; } } } catch (Exception e) { e.printStackTrace(); } } public static long getBalance(String appId, String secretKey, String host) { long useTime = 0l; try { long time = System.currentTimeMillis(); BalanceRequest request = new BalanceRequest(); ResultModel result = HttpUtil.request(appId, secretKey, host + "/inter/getBalance", request, BalanceResponse.class); if (result != null && result.getCode().equals("SUCCESS")) { useTime = System.currentTimeMillis() - time; } else { useTime = -1l; } } catch (Exception e) { e.printStackTrace(); useTime = -1l; } return useTime; } public static List> sortMap(Map map) { List> list = new ArrayList>(map.entrySet()); Collections.sort(list, new Comparator>() { public int compare(Map.Entry o1, Map.Entry o2) { return (o2.getValue() - o1.getValue()); } }); return list; } public static File creatCacheFile(String filePath) { File file = null; try { if (StringUtil.isEmpty(filePath)) { file = new File(CommonConstants.fileName); if (!file.exists()) { file.createNewFile(); } return file; } file = new File(filePath); if (!file.exists()) { File fileParent = file.getParentFile(); if (!fileParent.exists()) { fileParent.mkdirs(); } file.createNewFile(); } if (!file.canWrite() || !file.canRead()) { return null; } } catch (Exception e) { e.printStackTrace(); return null; } return file; } public static boolean writeFile(File file, String content) { BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(content.getBytes("UTF-8")); bos.flush(); } catch (Exception e) { e.printStackTrace(); return false; } finally { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } return true; } public static String readFile(File file) { long fileSize = file.length(); String json = ""; if (fileSize > Integer.MAX_VALUE) { return null; } byte[] by = new byte[(int) fileSize]; try { FileInputStream in = new FileInputStream(file); int offset = 0; int numRead = 0; while (offset < by.length && (numRead = in.read(by, offset, by.length - offset)) >= 0) { offset += numRead; } json = new String(by, "UTF-8"); in.close(); } catch (Exception e) { return null; } return json; } public static void contrastWrite(File file, String appId, String host) { List list = new ArrayList(); String json = readFile(file); if (StringUtil.isEmpty(json)) { UrlDTO dto = new UrlDTO(appId, host); list.add(dto); json = JsonHelper.toJsonString(list); writeFile(file, json); } else { list = JsonHelper.fromJson(new TypeToken>() { }, json); Map map = new HashMap(); for (UrlDTO urlDTO : list) { map.put(urlDTO.getAppId(), urlDTO.getUrl()); if (urlDTO.getAppId().equals(appId) && !urlDTO.getUrl().equals(host)) { urlDTO.setUrl(host); json = JsonHelper.toJsonString(list); writeFile(file, json); break; } } if (!map.containsKey(appId)) { list.add(new UrlDTO(appId, host)); writeFile(file, JsonHelper.toJsonString(list)); } } } public static String getFileUrl(File file, String appId) { String url = ""; String json = readFile(file); if (StringUtil.isEmpty(json)) { return url; } else { List list = JsonHelper.fromJson(new TypeToken>() { }, json); for (UrlDTO urlDTO : list) { if (urlDTO.getAppId().equals(appId)) { url = urlDTO.getUrl(); break; } } } return url; } }