diff --git a/.idea/misc.xml b/.idea/misc.xml index 1b7916988..ab998683f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,8 @@ - \ No newline at end of file diff --git a/library/src/androidTest/java/com/qiniu/android/AsynTest.java b/library/src/androidTest/java/com/qiniu/android/AsynTest.java index c7330fb34..0c0dfd2b4 100644 --- a/library/src/androidTest/java/com/qiniu/android/AsynTest.java +++ b/library/src/androidTest/java/com/qiniu/android/AsynTest.java @@ -70,7 +70,7 @@ public void run() { @Override public void run() { - if (Thread.currentThread().getName().equals("main")){ + if (Thread.currentThread() == Looper.getMainLooper().getThread()){ testParam.successCount += 1; } @@ -112,7 +112,7 @@ public void testAsyncBg(){ @Override public void run() { String threadName = Thread.currentThread().getName(); - if (!threadName.equals("main")){ + if (Thread.currentThread() != Looper.getMainLooper().getThread()){ synchronized (this){ testParam.successCount += 1; } diff --git a/library/src/androidTest/java/com/qiniu/android/DnsCacheFileTest.java b/library/src/androidTest/java/com/qiniu/android/DnsCacheFileTest.java index 0cdaba183..2cad26c48 100644 --- a/library/src/androidTest/java/com/qiniu/android/DnsCacheFileTest.java +++ b/library/src/androidTest/java/com/qiniu/android/DnsCacheFileTest.java @@ -10,7 +10,7 @@ public class DnsCacheFileTest extends BaseTest { public void testCreate(){ try { - DnsCacheFile file = new DnsCacheFile(""); + DnsCacheFile file = new DnsCacheFile(null); if (file != null){ assertTrue(false); } diff --git a/library/src/main/java/com/qiniu/android/collect/UploadInfoReporter.java b/library/src/main/java/com/qiniu/android/collect/UploadInfoReporter.java index 7eda01ce5..61cde936e 100644 --- a/library/src/main/java/com/qiniu/android/collect/UploadInfoReporter.java +++ b/library/src/main/java/com/qiniu/android/collect/UploadInfoReporter.java @@ -221,10 +221,7 @@ private RequestTransaction createUploadRequestTransaction(String tokenString){ ArrayList hosts = new ArrayList<>(); hosts.add(config.serverURL); - ArrayList ioHosts = new ArrayList<>(); - ioHosts.add(ZoneInfo.SDKDefaultIOHost); - - transaction = new RequestTransaction(hosts, ioHosts, token); + transaction = new RequestTransaction(hosts, ZoneInfo.EmptyRegionId, token); return transaction; } diff --git a/library/src/main/java/com/qiniu/android/common/AutoZone.java b/library/src/main/java/com/qiniu/android/common/AutoZone.java index 24af07319..94aa98477 100644 --- a/library/src/main/java/com/qiniu/android/common/AutoZone.java +++ b/library/src/main/java/com/qiniu/android/common/AutoZone.java @@ -85,10 +85,7 @@ public void complete(ResponseInfo responseInfo, UploadRegionRequestMetrics reque private RequestTransaction createUploadRequestTransaction(UpToken token){ List hosts = getUcServerList(); - ArrayList ioHosts = new ArrayList<>(); - ioHosts.add(ZoneInfo.SDKDefaultIOHost); - - RequestTransaction transaction = new RequestTransaction(hosts, ioHosts, token); + RequestTransaction transaction = new RequestTransaction(hosts, ZoneInfo.EmptyRegionId, token); transactions.add(transaction); return transaction; } diff --git a/library/src/main/java/com/qiniu/android/common/FixedZone.java b/library/src/main/java/com/qiniu/android/common/FixedZone.java index 12ac44e26..4f98a20b1 100644 --- a/library/src/main/java/com/qiniu/android/common/FixedZone.java +++ b/library/src/main/java/com/qiniu/android/common/FixedZone.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** @@ -16,35 +17,35 @@ public final class FixedZone extends Zone { */ public static final Zone zone0 = new FixedZone(new String[]{"upload.qiniup.com", "up.qiniup.com"}, new String[]{"upload.qbox.me", "up.qbox.me"}, - new String[]{"iovip.qbox.me"}); + "z0"); /** * 华北机房 */ public static final Zone zone1 = new FixedZone(new String[]{"upload-z1.qiniup.com", "up-z1.qiniup.com"}, new String[]{"upload-z1.qbox.me", "up-z1.qbox.me"}, - new String[]{"iovip-z1.qbox.me"}); + "z1"); /** * 华南机房 */ public static final Zone zone2 = new FixedZone(new String[]{"upload-z2.qiniup.com", "up-z2.qiniup.com"}, new String[]{"upload-z2.qbox.me", "up-z2.qbox.me"}, - new String[]{"iovip-z2.qbox.me"}); + "z2"); /** * 北美机房 */ public static final Zone zoneNa0 = new FixedZone(new String[]{"upload-na0.qiniup.com", "up-na0.qiniup.com"}, new String[]{"upload-na0.qbox.me", "up-na0.qbox.me"}, - new String[]{"iovip-na0.qbox.me"}); + "na0"); /** * 新加坡机房 */ public static final Zone zoneAs0 = new FixedZone(new String[]{"upload-as0.qiniup.com", "up-as0.qiniup.com"}, new String[]{"upload-as0.qbox.me", "up-as0.qbox.me"}, - new String[]{"iovip-as0.qbox.me"}); + "as0"); private ZonesInfo zonesInfo; @@ -81,37 +82,34 @@ public FixedZone(String[] upDomains) { this(upDomains, null); } - public FixedZone(String[] upDomains, String[] ioDomains) { - this(upDomains, null, ioDomains); + public FixedZone(String[] upDomains, String regionId) { + this(upDomains, null, regionId); } - private FixedZone(String[] upDomains, String[] oldUpDomains, String[] ioDomains) { - this.zonesInfo = createZonesInfo(upDomains, oldUpDomains, ioDomains); + private FixedZone(String[] upDomains, String[] oldUpDomains, String regionId) { + this.zonesInfo = createZonesInfo(upDomains, oldUpDomains, regionId); } private ZonesInfo createZonesInfo(String[] upDomains, String[] oldUpDomains, - String[] ioDomains) { + String regionId) { if (upDomains == null || upDomains.length == 0) { return null; } - ArrayList upDomainsList = new ArrayList(Arrays.asList(upDomains)); - ArrayList oldUpDomainsList = null; + List upDomainsList = new ArrayList(Arrays.asList(upDomains)); + List oldUpDomainsList = null; if (oldUpDomains != null){ oldUpDomainsList = new ArrayList(Arrays.asList(oldUpDomains)); } - ArrayList ioDomainsList = null; - if (ioDomains != null){ - ioDomainsList = new ArrayList(Arrays.asList(ioDomains)); - } - ZoneInfo zoneInfo = ZoneInfo.buildInfo(upDomainsList, oldUpDomainsList, ioDomainsList); + ZoneInfo zoneInfo = ZoneInfo.buildInfo(upDomainsList, oldUpDomainsList, regionId); if (zoneInfo == null) { return null; } ArrayList zoneInfoList = new ArrayList(); zoneInfoList.add(zoneInfo); + return new ZonesInfo(zoneInfoList); } diff --git a/library/src/main/java/com/qiniu/android/common/ZoneInfo.java b/library/src/main/java/com/qiniu/android/common/ZoneInfo.java index c39487a93..dd0d60c95 100644 --- a/library/src/main/java/com/qiniu/android/common/ZoneInfo.java +++ b/library/src/main/java/com/qiniu/android/common/ZoneInfo.java @@ -22,49 +22,39 @@ public class ZoneInfo { private static int DOMAIN_FROZEN_SECONDS = 10 * 60; - private int ttl; - public UploadServerGroup acc; - public UploadServerGroup src; - public UploadServerGroup old_acc; - public UploadServerGroup old_src; - - public String regionId; - public ArrayList allHosts; + public final int ttl; + public final List domains; + public final List old_domains; + + public final String regionId; + public List allHosts; public JSONObject detailInfo; public static ZoneInfo buildInfo(List mainHosts, - List ioHosts){ - return buildInfo(mainHosts, null, ioHosts); + String regionId){ + return buildInfo(mainHosts, null, regionId); } public static ZoneInfo buildInfo(List mainHosts, List oldHosts, - List ioHosts){ + String regionId){ if (mainHosts == null){ return null; } HashMap up = new HashMap<>(); - - HashMap up_acc = new HashMap<>(); - up_acc.put("main", mainHosts); - up.put("acc", up_acc); - + up.put("domains", mainHosts); if (oldHosts != null){ - HashMap up_old_acc = new HashMap<>(); - up_old_acc.put("main", oldHosts); - up.put("old_acc", up_old_acc); + up.put("old", oldHosts); } - HashMap io_src = new HashMap<>(); - HashMap io = new HashMap<>(); - io_src.put("main", (ioHosts != null ? ioHosts : new ArrayList())); - io.put("src", io_src); - + if (regionId == null){ + regionId = EmptyRegionId; + } HashMap info = new HashMap<>(); info.put("ttl", 86400*1000); + info.put("region", regionId); info.put("up", up); - info.put("io", io); JSONObject object = new JSONObject(info); @@ -76,16 +66,13 @@ public static ZoneInfo buildInfo(List mainHosts, } private ZoneInfo(int ttl, - UploadServerGroup acc, - UploadServerGroup src, - UploadServerGroup old_acc, - UploadServerGroup old_src) { - + String regionId, + List domains, + List old_domains) { this.ttl = ttl; - this.acc = acc; - this.src = src; - this.old_acc = old_acc; - this.old_src = old_src; + this.regionId = regionId; + this.domains = domains; + this.old_domains = old_domains; } /** @@ -99,73 +86,49 @@ public static ZoneInfo buildFromJson(JSONObject obj) throws JSONException { return null; } - int ttl = obj.getInt("ttl"); - List domainsList = new ArrayList<>(); - ConcurrentHashMap domainsMap = new ConcurrentHashMap<>(); + int ttl = obj.optInt("ttl"); + String regionId = obj.optString("region"); + if (regionId == null){ + regionId = EmptyRegionId; + } - String io_host = "null"; - try { - JSONObject io = obj.getJSONObject("io"); - JSONObject io_src = io.getJSONObject("src"); - JSONArray io_main = io_src.getJSONArray("main"); - io_host = io_main.length() > 0 ? io_main.getString(0) : "null"; - } catch (JSONException e){} - - String zoneRegion = "unknown"; - if (io_host.equals("iovip.qbox.me")){ - zoneRegion = "z0"; - } else if (io_host.equals("iovip-z1.qbox.me")){ - zoneRegion = "z1"; - } else if (io_host.equals("iovip-z2.qbox.me")){ - zoneRegion = "z2"; - } else if (io_host.equals("iovip-na0.qbox.me")){ - zoneRegion = "na0"; - } else if (io_host.equals("iovip-as0.qbox.me")){ - zoneRegion = "as0"; - } else if (io_host.equals(SDKDefaultIOHost)){ - zoneRegion = EmptyRegionId; + JSONObject up = obj.optJSONObject("up"); + if (up == null){ + return null; } - JSONObject up = obj.getJSONObject("up"); + List allHosts = new ArrayList<>(); + List domains = new ArrayList<>(); + JSONArray domainsJson = up.optJSONArray("domains"); + if (domainsJson != null && domainsJson.length() > 0){ + for (int i=0; i< domainsJson.length(); i++) { + String domain = domainsJson.optString(i); + if (domain != null && domain.length() > 0){ + domains.add(domain); + allHosts.add(domain); + } + } + } - JSONObject acc = null; - JSONObject src = null; - JSONObject old_acc = null; - JSONObject old_src = null; - try { - acc = up.getJSONObject("acc");; - } catch (JSONException e) {} - try { - src = up.getJSONObject("src");; - } catch (JSONException e) {} - try { - old_acc = up.getJSONObject("old_acc");; - } catch (JSONException e) {} - try { - old_src = up.getJSONObject("old_src");; - } catch (JSONException e) {} + List old_domains = new ArrayList<>(); + JSONArray old_domainsJson = up.optJSONArray("old"); + if (old_domainsJson != null && old_domainsJson.length() > 0){ + for (int i=0; i< old_domainsJson.length(); i++) { + String domain = old_domainsJson.optString(i); + if (domain != null && domain.length() > 0){ + old_domains.add(domain); + allHosts.add(domain); + } + } + } - ZoneInfo zoneInfo = new ZoneInfo(ttl, - UploadServerGroup.buildInfoFromJson(acc), - UploadServerGroup.buildInfoFromJson(src), - UploadServerGroup.buildInfoFromJson(old_acc), - UploadServerGroup.buildInfoFromJson(old_src)); - zoneInfo.regionId = zoneRegion; + if (domains.size() == 0 && old_domains.size() == 0){ + return null; + } + + ZoneInfo zoneInfo = new ZoneInfo(ttl, regionId, domains, old_domains); zoneInfo.detailInfo = obj; - ArrayList allHosts = new ArrayList<>(); - if (zoneInfo.acc != null && zoneInfo.acc.allHosts != null){ - allHosts.addAll(zoneInfo.acc.allHosts); - } - if (zoneInfo.src != null && zoneInfo.src.allHosts != null){ - allHosts.addAll(zoneInfo.src.allHosts); - } - if (zoneInfo.old_acc != null && zoneInfo.old_acc.allHosts != null){ - allHosts.addAll(zoneInfo.old_acc.allHosts); - } - if (zoneInfo.old_src != null && zoneInfo.old_src.allHosts != null){ - allHosts.addAll(zoneInfo.old_src.allHosts); - } zoneInfo.allHosts = allHosts; return zoneInfo; diff --git a/library/src/main/java/com/qiniu/android/http/dns/DnsCacheFile.java b/library/src/main/java/com/qiniu/android/http/dns/DnsCacheFile.java index 667b7e019..fef7c89f5 100644 --- a/library/src/main/java/com/qiniu/android/http/dns/DnsCacheFile.java +++ b/library/src/main/java/com/qiniu/android/http/dns/DnsCacheFile.java @@ -16,15 +16,20 @@ public class DnsCacheFile implements Recorder { public File f; public DnsCacheFile(String directory) throws IOException { + if (directory == null) { + throw new IOException("directory invalid"); + } + this.directory = directory; f = new File(directory); - if (!f.isDirectory() || !f.exists()) { + + if (!f.exists()) { boolean r = f.mkdirs(); if (!r) { throw new IOException("mkdir failed"); } - return; } + if (!f.isDirectory()) { throw new IOException("does not mkdir"); } diff --git a/library/src/main/java/com/qiniu/android/http/dns/DnsCacheInfo.java b/library/src/main/java/com/qiniu/android/http/dns/DnsCacheInfo.java index 2d4e1baa4..b2433284b 100644 --- a/library/src/main/java/com/qiniu/android/http/dns/DnsCacheInfo.java +++ b/library/src/main/java/com/qiniu/android/http/dns/DnsCacheInfo.java @@ -20,12 +20,16 @@ public class DnsCacheInfo implements java.io.Serializable { public String localIp; public ConcurrentHashMap> info; - public static DnsCacheInfo createDnsCacheInfoByJsonData(byte[] jsonData) { + public static DnsCacheInfo createDnsCacheInfoByData(byte[] jsonData) { if (jsonData == null){ return null; } - DnsCacheInfo dnsCacheInfo = (DnsCacheInfo)StringUtils.toObject(jsonData); - return dnsCacheInfo; + Object dnsCacheInfo = StringUtils.toObject(jsonData); + if (dnsCacheInfo instanceof DnsCacheInfo){ + return (DnsCacheInfo)dnsCacheInfo; + } else { + return null; + } } public DnsCacheInfo() { diff --git a/library/src/main/java/com/qiniu/android/http/dns/DnsPrefetcher.java b/library/src/main/java/com/qiniu/android/http/dns/DnsPrefetcher.java index ae138589a..62f929d89 100644 --- a/library/src/main/java/com/qiniu/android/http/dns/DnsPrefetcher.java +++ b/library/src/main/java/com/qiniu/android/http/dns/DnsPrefetcher.java @@ -8,22 +8,15 @@ import com.qiniu.android.http.ResponseInfo; import com.qiniu.android.http.metrics.UploadRegionRequestMetrics; import com.qiniu.android.storage.GlobalConfiguration; -import com.qiniu.android.storage.Recorder; import com.qiniu.android.storage.UpToken; import com.qiniu.android.utils.AndroidNetwork; -import com.qiniu.android.utils.StringUtils; import com.qiniu.android.utils.Utils; import com.qiniu.android.utils.Wait; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; import java.util.concurrent.ConcurrentHashMap; @@ -226,7 +219,7 @@ private boolean preFetchHost(String preHost, Dns dns){ private boolean recoverDnsCache(byte[] data){ - DnsCacheInfo dnsCacheInfo = DnsCacheInfo.createDnsCacheInfoByJsonData(data); + DnsCacheInfo dnsCacheInfo = DnsCacheInfo.createDnsCacheInfoByData(data); if (dnsCacheInfo == null || dnsCacheInfo.info == null || dnsCacheInfo.info.size() == 0){ return false; } @@ -321,9 +314,11 @@ public void complete(int code, ResponseInfo responseInfo, UploadRegionRequestMet ZonesInfo autoZonesInfo = currentZone.getZonesInfo(token); ArrayList autoHosts = new ArrayList<>(); - for (ZoneInfo zoneInfo : autoZonesInfo.zonesInfo) { - if (zoneInfo != null && zoneInfo.allHosts != null){ - autoHosts.addAll(zoneInfo.allHosts); + if (autoZonesInfo != null && autoZonesInfo.zonesInfo != null && autoZonesInfo.zonesInfo.size() > 0) { + for (ZoneInfo zoneInfo : autoZonesInfo.zonesInfo) { + if (zoneInfo != null && zoneInfo.allHosts != null) { + autoHosts.addAll(zoneInfo.allHosts); + } } } return autoHosts.toArray(new String[0]); diff --git a/library/src/main/java/com/qiniu/android/http/request/RequestTransaction.java b/library/src/main/java/com/qiniu/android/http/request/RequestTransaction.java index 04d0e2515..9a2d72531 100644 --- a/library/src/main/java/com/qiniu/android/http/request/RequestTransaction.java +++ b/library/src/main/java/com/qiniu/android/http/request/RequestTransaction.java @@ -43,20 +43,20 @@ public RequestTransaction(List hosts, } public RequestTransaction(List hosts, - List ioHosts, + String regionId, UpToken token){ - this(new Configuration.Builder().build(), UploadOptions.defaultOptions(), hosts, ioHosts, null, token); + this(new Configuration.Builder().build(), UploadOptions.defaultOptions(), hosts, regionId, null, token); } public RequestTransaction(Configuration config, UploadOptions uploadOption, List hosts, - List ioHosts, + String regionId, String key, UpToken token){ this(config, uploadOption, key, token); IUploadRegion region = new UploadDomainRegion(); - region.setupRegionData(ZoneInfo.buildInfo(hosts, ioHosts)); + region.setupRegionData(ZoneInfo.buildInfo(hosts, regionId)); this.initData(region, region); } @@ -106,7 +106,7 @@ public boolean shouldRetry(ResponseInfo responseInfo, JSONObject response) { HashMap header = new HashMap<>(); header.put("User-Agent", userAgent); - String action = "/v3/query?ak=" + (token.accessKey != null ? token.accessKey : "") + "&bucket=" + (token.bucket != null ? token.bucket : "") ; + String action = "/v4/query?ak=" + (token.accessKey != null ? token.accessKey : "") + "&bucket=" + (token.bucket != null ? token.bucket : "") ; regionRequest.get(action, isAsync, header, shouldRetryHandler, new HttpRegionRequest.RequestCompleteHandler() { @Override public void complete(ResponseInfo responseInfo, UploadRegionRequestMetrics requestMetrics, JSONObject response) { diff --git a/library/src/main/java/com/qiniu/android/http/serverRegion/UploadDomainRegion.java b/library/src/main/java/com/qiniu/android/http/serverRegion/UploadDomainRegion.java index 12489e079..09b787fb1 100644 --- a/library/src/main/java/com/qiniu/android/http/serverRegion/UploadDomainRegion.java +++ b/library/src/main/java/com/qiniu/android/http/serverRegion/UploadDomainRegion.java @@ -41,38 +41,18 @@ public void setupRegionData(ZoneInfo zoneInfo) { isAllFrozen = false; ArrayList domainHostList = new ArrayList<>(); - ArrayList serverGroups = new ArrayList<>(); - if (zoneInfo.acc != null){ - serverGroups.add(zoneInfo.acc); - if (zoneInfo.acc.allHosts != null){ - domainHostList.addAll(zoneInfo.acc.allHosts); - } - } - if (zoneInfo.src != null){ - serverGroups.add(zoneInfo.src); - if (zoneInfo.src.allHosts != null){ - domainHostList.addAll(zoneInfo.src.allHosts); - } + if (zoneInfo.domains != null){ + domainHostList.addAll(zoneInfo.domains); } this.domainHostList = domainHostList; - domainHashMap = createDomainDictionary(serverGroups); + this.domainHashMap = createDomainDictionary(domainHostList); ArrayList oldDomainHostList = new ArrayList<>(); - serverGroups = new ArrayList<>(); - if (zoneInfo.old_acc != null){ - serverGroups.add(zoneInfo.old_acc); - if (zoneInfo.old_acc.allHosts != null){ - oldDomainHostList.addAll(zoneInfo.old_acc.allHosts); - } + if (zoneInfo.old_domains != null){ + oldDomainHostList.addAll(zoneInfo.old_domains); } - if (zoneInfo.old_src != null){ - serverGroups.add(zoneInfo.old_src); - if (zoneInfo.old_src.allHosts != null){ - oldDomainHostList.addAll(zoneInfo.old_src.allHosts); - } - } - this.oldDomainHostList = oldDomainHostList; - oldDomainHashMap = createDomainDictionary(serverGroups); + this.oldDomainHostList = domainHostList; + this.oldDomainHashMap = createDomainDictionary(domainHostList); } @Override @@ -112,15 +92,12 @@ public IUploadServer getNextServer(boolean isOldServer, IUploadServer freezeServ return server; } - private HashMap createDomainDictionary(ArrayList serverGroups){ + private HashMap createDomainDictionary(List hosts){ HashMap domainHashMap = new HashMap<>(); - for (int i = 0; i < serverGroups.size(); i++) { - ZoneInfo.UploadServerGroup serverGroup = serverGroups.get(i); - for (int j = 0; j < serverGroup.allHosts.size(); j++){ - String host = serverGroup.allHosts.get(j); - UploadServerDomain domain = new UploadServerDomain(host); - domainHashMap.put(host, domain); - } + for (int i = 0; i < hosts.size(); i++) { + String host = hosts.get(i); + UploadServerDomain domain = new UploadServerDomain(host); + domainHashMap.put(host, domain); } return domainHashMap; } diff --git a/library/src/main/java/com/qiniu/android/storage/UploadManager.java b/library/src/main/java/com/qiniu/android/storage/UploadManager.java index 90950d4c7..76a56ee18 100644 --- a/library/src/main/java/com/qiniu/android/storage/UploadManager.java +++ b/library/src/main/java/com/qiniu/android/storage/UploadManager.java @@ -333,12 +333,15 @@ private void completeAction(final String token, reportQuality(responseInfo, taskMetrics, token); if (completionHandler != null){ + final Wait wait = new Wait(); AsyncRun.runInMain(new Runnable() { @Override public void run() { completionHandler.complete(key, responseInfo, response); + wait.stopWait(); } }); + wait.startWait(); } }