From 0fbd5c6add4617eb3685379b0ebbfe6c6e928fc9 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@QQ.com> Date: Mon, 2 Jul 2018 10:44:42 +0800 Subject: [PATCH 01/28] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4099c6a9..b6fcdfd6 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.4' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.4' +compile 'com.arialyy.aria:aria-core:3.4.5' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.5' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` From 99f875c4c3a0061f0be273afb04f1ddb43cd5a12 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 2 Jul 2018 20:52:56 +0800 Subject: [PATCH 02/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=98=AFtimer=E4=B8=BAnull=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/AriaManager.java | 12 ---- .../aria/core/command/normal/StartCmd.java | 8 ++- .../arialyy/aria/core/common/AbsFileer.java | 57 +++++++++++++------ .../download/downloader/AbsGroupUtil.java | 12 ++-- app/src/main/AndroidManifest.xml | 6 +- app/src/main/assets/aria_config.xml | 2 +- .../simple/download/SingleTaskActivity.java | 8 +-- .../download/group/DownloadGroupActivity.java | 4 +- .../multi_download/MultiDownloadActivity.java | 2 +- .../multi_download/MultiTaskActivity.java | 6 ++ 10 files changed, 68 insertions(+), 49 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java index 940b05cf..ba810bb9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -26,7 +26,6 @@ import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.widget.PopupWindow; -import android.widget.Toast; import com.arialyy.aria.core.command.ICmd; import com.arialyy.aria.core.common.QueueMod; import com.arialyy.aria.core.download.DownloadEntity; @@ -71,7 +70,6 @@ import org.xml.sax.SAXException; * activity 和其Dialog、Fragment的映射表 */ private Map> mSubClass = new ConcurrentHashMap<>(); - private List mActivityCount = new ArrayList<>(); public static Context APP; private List mCommands = new ArrayList<>(); private Configuration.DownloadConfig mDConfig; @@ -470,9 +468,6 @@ import org.xml.sax.SAXException; private class LifeCallback implements Application.ActivityLifecycleCallbacks { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - mActivityCount.add( - String.format("%s_%s", activity.getClass().getName(), activity.hashCode())); - ALog.w(TAG, "size = " + mActivityCount.size()); } @Override public void onActivityStarted(Activity activity) { @@ -497,13 +492,6 @@ import org.xml.sax.SAXException; @Override public void onActivityDestroyed(Activity activity) { removeReceiver(activity); - mActivityCount.remove( - String.format("%s_%s", activity.getClass().getName(), activity.hashCode())); - ALog.w(TAG, "size = " + mActivityCount.size()); - if (mActivityCount.size() == 0) { - ALog.e(TAG, "gggg"); - //Toast.makeText(activity, "destroy", Toast.LENGTH_SHORT).show(); - } } } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java index eaaf57d0..ece35307 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java @@ -17,6 +17,7 @@ package com.arialyy.aria.core.command.normal; import android.text.TextUtils; +import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.QueueMod; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; @@ -82,14 +83,14 @@ class StartCmd extends AbsNormalCmd { || task.getState() == IEntity.STATE_COMPLETE) { resumeTask(); } else { - sendWaitState(); + sendWaitState(task); } } } else { //任务没执行并且执行队列中没有该任务,才认为任务没有运行中 if (!task.isRunning() && !mQueue.taskIsRunning(task.getKey())) { resumeTask(); - }else { + } else { ALog.w(TAG, String.format("任务【%s】已经在运行", task.getTaskName())); } } @@ -152,7 +153,8 @@ class StartCmd extends AbsNormalCmd { AbsTask task = getTask(te.getEntity()); if (task != null) continue; if (te instanceof DownloadTaskEntity) { - if (te.getRequestType() == AbsTaskEntity.D_FTP || te.getRequestType() == AbsTaskEntity.U_FTP) { + if (te.getRequestType() == AbsTaskEntity.D_FTP + || te.getRequestType() == AbsTaskEntity.U_FTP) { te.setUrlEntity(CommonUtil.getFtpUrlInfo(te.getEntity().getKey())); } mQueue = DownloadTaskQueue.getInstance(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 5680a83d..47ed0589 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -117,7 +117,7 @@ public abstract class AbsFileer - - + + diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index 55c155be..b9aa70df 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -34,7 +34,7 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 8d5e1477..7093e227 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -46,13 +46,13 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - //"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 //"https://static.donguo.me//video/ip/course/pfys_1.mp4"; //"https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864"; //"https://d.pcs.baidu.com/file/a02c89a2d479d4fd2756f3313d42491d?fid=4232431903-250528-1114369760340736&dstime=1525491372&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-3C13vkOkuk4TqXvVYW05zj1K0ao%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=8651730921842106225&dp-callid=0&r=165533013"; //"http://apk500.bce.baidu-mgame.com/game/67000/67734/20170622040827_oem_5502845.apk?r=1"; - "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; + //"https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; @Bind(R.id.cancel) Button mCancel; @@ -220,8 +220,8 @@ public class SingleTaskActivity extends BaseActivity { startD(); break; case R.id.stop: - //Aria.download(this).load(DOWNLOAD_URL).stop(); - startActivity(new Intent(this, SingleTaskActivity.class)); + Aria.download(this).load(DOWNLOAD_URL).stop(); + //startActivity(new Intent(this, SingleTaskActivity.class)); //Aria.download(this).load(DOWNLOAD_URL).removeRecord(); break; case R.id.cancel: diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 16fc2b0f..1544e4a5 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -92,8 +92,8 @@ public class DownloadGroupActivity extends BaseActivity { mAdapter.updateBtState(task.getKey(), false); } + @DownloadGroup.onWait void groupTaskWait(DownloadGroupTask task) { + ALog.d(TAG, String.format("group【%s】wait---", task.getTaskName())); + mAdapter.updateBtState(task.getKey(), true); + } + @DownloadGroup.onTaskStop void groupTaskStop(DownloadGroupTask task) { mAdapter.updateBtState(task.getKey(), true); Log.d(TAG, String.format("group【%s】stop", task.getTaskName())); From 8201eef57161c890b0bbfdb362fde5df55643abe Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Tue, 3 Jul 2018 20:10:53 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E5=AE=8C=E6=95=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/AbsFileer.java | 48 +++++++++--- .../arialyy/aria/core/common/ProxyHelper.java | 2 +- .../aria/core/common/StateConstance.java | 6 +- .../aria/core/download/BaseNormalTarget.java | 4 +- .../download/downloader/HttpThreadTask.java | 24 ++++-- .../com/arialyy/aria/util/CommonUtil.java | 2 +- app/src/main/AndroidManifest.xml | 4 +- .../download/group/DownloadGroupActivity.java | 6 +- .../simple/download/group/GroupModule.java | 74 +++++++++++++++++++ .../arialyy/simple/test/AnyRunActivity.java | 7 +- .../arialyy/simple/test/AnyRunnModule.java | 2 +- 11 files changed, 148 insertions(+), 31 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 47ed0589..df094f64 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -245,7 +245,7 @@ public abstract class AbsFileer tr.endLocation) { + ALog.w(TAG, String.format("分块【%s】错误,将重新开始该分块", temp.getPath())); + temp.delete(); + tr.startLocation = i * blockLen; + } + mStartThreadNum++; + } } } - mTotalThreadNum = mRecord.threadRecords.size(); - mTaskEntity.setNewTask(false); + i++; } + mTotalThreadNum = mRecord.threadRecords.size(); + mTaskEntity.setNewTask(false); } else { File file = new File(mRecord.filePath); if (!file.exists()) { - ALog.w(TAG, String.format("下载文件【%s】不存在,任务将重新开始", file.getPath())); + ALog.w(TAG, String.format("文件【%s】不存在,任务将重新开始", file.getPath())); mRecord.deleteData(); initRecord(true); return; @@ -483,22 +507,24 @@ public abstract class AbsFileer= 0) { - Long r = tr.startLocation; + if (tr.startLocation > 0) { + long r = tr.startLocation; //记录的位置需要在线程区间中 - if (startL < r && r < (i == (mTotalThreadNum - 1) ? fileLength : endL)) { + if (startL < r && r <= (i == (mTotalThreadNum - 1) ? fileLength : endL)) { mConstance.CURRENT_LOCATION += r - startL; startL = r; } ALog.d(TAG, String.format("任务【%s】线程__%s__恢复任务", mEntity.getFileName(), i)); + } else { + tr.startLocation = startL; } //最后一个线程的结束位置即为文件的总长度 if (i == (mTotalThreadNum - 1)) { endL = fileLength; } - // 更新记录 - tr.startLocation = startL; - tr.endLocation = endL; + if (tr.endLocation <= 0) { + tr.endLocation = endL; + } if (isNewTr) { mRecord.threadRecords.add(tr); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java index c5e59eb4..480795d3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java @@ -47,7 +47,7 @@ public class ProxyHelper { } private void init() { - List classes = CommonUtil.getClassName(AriaManager.APP, + List classes = CommonUtil.getPkgClassNames(AriaManager.APP, "com.arialyy.aria.ProxyClassCounter"); for (String className : classes) { count(className); diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java b/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java index b3cae98b..cad1c6e1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java @@ -50,14 +50,16 @@ public class StateConstance { * 所有子线程是否都已经停止 */ public boolean isStop() { - return STOP_NUM == START_THREAD_NUM; + ALog.d(TAG, String.format("stop_num=%s; start_thread_num=%s; complete_num=%s", STOP_NUM, + START_THREAD_NUM, COMPLETE_THREAD_NUM)); + return STOP_NUM == START_THREAD_NUM || STOP_NUM + COMPLETE_THREAD_NUM == START_THREAD_NUM; } /** * 所有子线程是否都已经失败 */ public boolean isFail() { - ALog.d(TAG, String.format("fail_num=%s; start_thread_num=%s, complete_num=%s", FAIL_NUM, + ALog.d(TAG, String.format("fail_num=%s; start_thread_num=%s; complete_num=%s", FAIL_NUM, START_THREAD_NUM, COMPLETE_THREAD_NUM)); return COMPLETE_THREAD_NUM != START_THREAD_NUM && (FAIL_NUM == START_THREAD_NUM || FAIL_NUM + COMPLETE_THREAD_NUM == START_THREAD_NUM); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java index 5bc9abdc..b272d294 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java @@ -162,7 +162,7 @@ abstract class BaseNormalTarget } } - //设置文件保存路径,如果新文件路径和就文件路径不同,则修改路径 + //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径 if (!filePath.equals(mEntity.getDownloadPath())) { if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) { ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径"); @@ -200,7 +200,7 @@ abstract class BaseNormalTarget ALog.e(TAG, "下载失败,url【" + url + "】不合法"); return false; } - if (!TextUtils.isEmpty(newUrl)){ + if (!TextUtils.isEmpty(newUrl)) { mEntity.setUrl(newUrl); mTaskEntity.setUrl(newUrl); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 7708c4f6..23caeacd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -76,7 +76,6 @@ final class HttpThreadTask extends AbsThreadTask 0) { Thread.sleep(mSleepTime); } - bf.flip(); - foc.write(bf); - bf.compact(); - progress(len); + // + //bf.flip(); + //foc.write(bf); + //bf.compact(); + //progress(len); + if (mChildCurrentLocation + len >= mConfig.END_LOCATION) { + len = (int) (mConfig.END_LOCATION - mChildCurrentLocation); + bf.flip(); + fos.write(bf.array(), 0, len); + bf.compact(); + progress(len); + break; + } else { + bf.flip(); + foc.write(bf); + bf.compact(); + progress(len); + } } handleComplete(); } catch (InterruptedException e) { @@ -157,6 +170,7 @@ final class HttpThreadTask extends AbsThreadTask getClassName(Context context, String className) { + public static List getPkgClassNames(Context context, String className) { List classNameList = new ArrayList<>(); String pPath = context.getPackageCodePath(); File dir = new File(pPath).getParentFile(); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8051a8c7..04f66b2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,10 +16,10 @@ + - diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 1544e4a5..6811af74 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -45,7 +45,7 @@ public class DownloadGroupActivity extends BaseActivity getSubName2() { + List taskSubFile; + taskSubFile = new ArrayList<>(); + //taskSubFile.add("2156.mp4"); + // taskSubFile.add("2115.mp4"); + //taskSubFile.add("2009.mp4"); + //taskSubFile.add("1893.mp4"); + //taskSubFile.add("1952.mp4"); + //taskSubFile.add("1958.mp4"); + taskSubFile.add("1994.mp4"); + //taskSubFile.add("2083.mp4"); + taskSubFile.add("2305.JPG"); + taskSubFile.add("2183.JPG"); + taskSubFile.add("2154.JPG"); + taskSubFile.add("2153.JPG"); + taskSubFile.add("2152.JPG"); + taskSubFile.add("2151.JPG"); + taskSubFile.add("2149.JPG"); + taskSubFile.add("2148.JPG"); + taskSubFile.add("2147.JPG"); + taskSubFile.add("2146.JPG"); + taskSubFile.add("1949.JPG"); + taskSubFile.add("1887.JPG"); + taskSubFile.add("1996.txt"); + return taskSubFile; + } + + public List getUrls2() { + List downLoadUrls; + downLoadUrls = new ArrayList<>(); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2156&clientId=A000011106034058176"); + // downLoadUrls.add("http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2115&clientId=A000011106034058176"); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2009&clientId=A000011106034058176"); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1893&clientId=A000011106034058176"); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1952&clientId=A000011106034058176"); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1958&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"); + //downLoadUrls.add( + // "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2083&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2305&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2183&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2154&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2153&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2152&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2151&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2149&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2148&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2147&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=2146&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1949&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1887&clientId=A000011106034058176"); + downLoadUrls.add( + "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1996&clientId=A000011106034058176"); + return downLoadUrls; + } } diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index fef44ccf..caa1047b 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -27,7 +27,8 @@ public class AnyRunActivity extends BaseActivity { //String URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; - String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; + //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; + String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; //private String URL = "http://cn-hbsjz-cmcc-v-03.acgvideo.com/upgcxcode/63/82/5108263/5108263-1-80.flv?expires=1530178500&platform=pc&ssig=vr7gLl0duyqWqSMnIpzaDA&oi=3746029570&nfa=BpfiWF+i4mNW8KzjZFHzBQ==&dynamic=1&hfa=2030547937&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=&trid=3476be01a9254115b15f8cc7198600fe&nfc=1"; @@ -49,8 +50,8 @@ public class AnyRunActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - //module.start(URL); - module.startFtp(URL); + module.start(URL); + //module.startFtp(URL); break; case R.id.stop: module.stop(URL); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index c54fa1eb..40f2632f 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -65,7 +65,7 @@ public class AnyRunnModule { void start(String url) { mUrl = url; - String path = Environment.getExternalStorageDirectory().getPath() + "/aaas.apk"; + String path = Environment.getExternalStorageDirectory().getPath() + "/mmm.mp4"; Aria.download(this) .load(url) .setRequestMode(RequestEnum.GET) From 671ae11e2b2583fe7c76d749bc806afb68ef63ea Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Wed, 4 Jul 2018 20:06:09 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D4.4.4=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=9C=A8=E5=A4=9A=E4=B8=AAdex=E7=9A=84=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=EF=BC=8C=E6=97=A0=E6=B3=95=E8=BF=9B=E8=A1=8C=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BB=84=E5=90=88=E4=BB=BB=E5=8A=A1=E5=AD=90=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/ProxyHelper.java | 76 ++++++++++++++++++- .../aria/core/common/StateConstance.java | 4 +- .../core/download/DownloadGroupTarget.java | 3 +- .../aria/core/download/DownloadGroupTask.java | 1 - .../aria/core/download/DownloadReceiver.java | 20 ++--- .../aria/core/manager/DGTEFactory.java | 6 +- .../aria/core/upload/UploadReceiver.java | 22 ++++-- .../java/com/arialyy/compiler/CountFiler.java | 2 +- .../com/arialyy/compiler/ElementHandler.java | 2 +- DEV_LOG.md | 6 ++ .../download/group/DownloadGroupActivity.java | 64 ++++++++++++++-- .../simple/download/group/GroupModule.java | 12 +-- .../simple/widget/SubStateLinearLayout.java | 2 + build.gradle | 2 +- 14 files changed, 179 insertions(+), 43 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java index 480795d3..97a2787b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java @@ -15,26 +15,47 @@ */ package com.arialyy.aria.core.common; +import android.os.Build; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.util.CommonUtil; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Created by Aria.Lao on 2017/7/10. * 代理参数获取 */ public class ProxyHelper { + /** + * 普通下载任务类型 + */ + public static int PROXY_TYPE_DOWNLOAD = 0x01; + /** + * 组合下载任务类型 + */ + public static int PROXY_TYPE_DOWNLOAD_GROUP = 0x02; + ///** + // * 组合任务子任务类型 + // */ + //public static int PROXY_TYPE_DOWNLOAD_GROUP_SUB = 0x03; + /** + * 普通上传任务类型 + */ + public static int PROXY_TYPE_UPLOAD = 0x04; public Set downloadCounter = new HashSet<>(), uploadCounter = new HashSet<>(), downloadGroupCounter = new HashSet<>(), downloadGroupSubCounter = new HashSet<>(); + private Map> mProxyCache = new ConcurrentHashMap<>(); public static volatile ProxyHelper INSTANCE = null; + private boolean canLoadClass = false; private ProxyHelper() { - init(); + //init(); } public static ProxyHelper getInstance() { @@ -46,14 +67,63 @@ public class ProxyHelper { return INSTANCE; } + /** + * @since 3.4.6 版本开始,已经在ElementHandler中关闭了ProxyClassCounter对象的生成 + */ + @Deprecated private void init() { List classes = CommonUtil.getPkgClassNames(AriaManager.APP, "com.arialyy.aria.ProxyClassCounter"); - for (String className : classes) { - count(className); + canLoadClass = classes != null + && !classes.isEmpty() + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; + if (canLoadClass) { + for (String className : classes) { + count(className); + } } } + /** + * 是否能读取到代理计数文件 + * + * @return {@code true} 可以读取,{@code false} 不能读取 + */ + public boolean isCanLoadCountClass() { + return canLoadClass; + } + + /** + * 检查观察者对象的代理文件类型 + * + * @param clazz 观察者对象 + * @return {@link #PROXY_TYPE_DOWNLOAD},如果没有实体对象则返回空的list + */ + public Set checkProxyType(Class clazz) { + final String className = clazz.getName(); + Set result = mProxyCache.get(clazz.getName()); + if (result != null) { + return result; + } + result = new HashSet<>(); + try { + if (Class.forName(className.concat("$$DownloadGroupListenerProxy")) != null) { + result.add(PROXY_TYPE_DOWNLOAD_GROUP); + } else if (Class.forName(className.concat("$$DownloadListenerProxy")) != null) { + result.add(PROXY_TYPE_DOWNLOAD); + } else if (Class.forName(className.concat("$$UploadListenerProxy")) != null) { + result.add(PROXY_TYPE_UPLOAD); + } + } catch (ClassNotFoundException e) { + //e.printStackTrace(); + } + if (!result.isEmpty()) { + mProxyCache.put(clazz.getName(), result); + } + return result; + } + + @Deprecated private void count(String className) { try { Class clazz = Class.forName(className); diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java b/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java index cad1c6e1..9201fa85 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/StateConstance.java @@ -50,8 +50,8 @@ public class StateConstance { * 所有子线程是否都已经停止 */ public boolean isStop() { - ALog.d(TAG, String.format("stop_num=%s; start_thread_num=%s; complete_num=%s", STOP_NUM, - START_THREAD_NUM, COMPLETE_THREAD_NUM)); + //ALog.d(TAG, String.format("stop_num=%s; start_thread_num=%s; complete_num=%s", STOP_NUM, + // START_THREAD_NUM, COMPLETE_THREAD_NUM)); return STOP_NUM == START_THREAD_NUM || STOP_NUM + COMPLETE_THREAD_NUM == START_THREAD_NUM; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java index 85100747..8cbb23dc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java @@ -18,6 +18,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.text.TextUtils; +import android.util.Log; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.delegate.HttpHeaderDelegate; import com.arialyy.aria.core.inf.IHttpHeaderTarget; @@ -66,8 +67,8 @@ public class DownloadGroupTarget extends BaseGroupTarget im private void init() { mGroupName = CommonUtil.getMd5Code(mUrls); mTaskEntity = TEManager.getInstance().getGTEntity(DownloadGroupTaskEntity.class, mUrls); + //ALog.d(TAG, "gHash=" + mEntity.getSubEntities().get(0).hashCode() + "; subHash="+mEntity.getT) mEntity = mTaskEntity.getEntity(); - if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java index 78cd6e7b..28c3a725 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java @@ -49,7 +49,6 @@ public class DownloadGroupTask extends AbsGroupTask { mUtil = new FtpDirDownloadUtil(mListener, mTaskEntity); break; } - Log.d(TAG, "FTP_TASK_MD5:" + mTaskEntity.hashCode()); } @Override public boolean isRunning() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index b688ffaf..686ec364 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -160,15 +160,17 @@ public class DownloadReceiver extends AbsReceiver { ALog.e(TAG, String.format("【%s】观察者为空", targetName)); return; } - Set dCounter = ProxyHelper.getInstance().downloadCounter; - Set dgCounter = ProxyHelper.getInstance().downloadGroupCounter; - Set dgsCounter = ProxyHelper.getInstance().downloadGroupSubCounter; - if (dCounter != null && dCounter.contains(targetName)) { - DownloadSchedulers.getInstance().register(obj); - } - if ((dgCounter != null && dgCounter.contains(targetName)) || (dgsCounter != null - && dgsCounter.contains(targetName))) { - DownloadGroupSchedulers.getInstance().register(obj); + Set set = ProxyHelper.getInstance().checkProxyType(obj.getClass()); + if (set != null && !set.isEmpty()) { + for (Integer type : set) { + if (type == ProxyHelper.PROXY_TYPE_DOWNLOAD) { + DownloadSchedulers.getInstance().register(obj); + } else if (type == ProxyHelper.PROXY_TYPE_DOWNLOAD_GROUP) { + DownloadGroupSchedulers.getInstance().register(obj); + } + } + } else { + ALog.i(TAG, "没有Aria的注解方法"); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/manager/DGTEFactory.java b/Aria/src/main/java/com/arialyy/aria/core/manager/DGTEFactory.java index 5dd0f510..73582af9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/manager/DGTEFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/manager/DGTEFactory.java @@ -59,15 +59,11 @@ class DGTEFactory implements IGTEFactory keys = am.getReceiver().keySet(); for (String key : keys) { am.getReceiver().remove(key); @@ -148,9 +150,15 @@ public class UploadReceiver extends AbsReceiver { ALog.e(TAG, String.format("【%s】观察者为空", targetName)); return; } - Set cCounter = ProxyHelper.getInstance().uploadCounter; - if (cCounter != null && cCounter.contains(targetName)) { - UploadSchedulers.getInstance().register(obj); + Set set = ProxyHelper.getInstance().checkProxyType(obj.getClass()); + if (set != null && !set.isEmpty()) { + for (Integer type : set) { + if (type == ProxyHelper.PROXY_TYPE_UPLOAD) { + UploadSchedulers.getInstance().register(obj); + } + } + } else { + ALog.i(TAG, "没有Aria的注解方法"); } } diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/CountFiler.java b/AriaCompiler/src/main/java/com/arialyy/compiler/CountFiler.java index 7a6ed484..3783e222 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/CountFiler.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/CountFiler.java @@ -35,7 +35,7 @@ import javax.lang.model.element.Modifier; * Created by lyy on 2017/9/6. * 各类注解统计技术类 */ -final class CountFiler { +@Deprecated final class CountFiler { private Filer mFiler; private ParamObtainUtil mPbUtil; diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandler.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandler.java index e497fe65..9d92dd12 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandler.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandler.java @@ -142,7 +142,7 @@ class ElementHandler { void createProxyFile() { try { new EventProxyFiler(mFiler, mPbUtil).createEventProxyFile(); - new CountFiler(mFiler, mPbUtil).createCountFile(); + //new CountFiler(mFiler, mPbUtil).createCountFile(); } catch (IOException e) { e.printStackTrace(); } diff --git a/DEV_LOG.md b/DEV_LOG.md index a5ba12cc..8052e351 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,10 @@ ## 开发日志 + + v_3.4.6 + - 修复android 4.4.4 版本多dex下无法进行回调的问题 + - 优化分块下载 + - 修复了字符串中有特殊字符导致的路径冲突问题;修复ftp分块下载失败问题 + - 修复连接中有`+`导致的地址呗使用问题。 + - 修复表重复创建导致的崩溃问题 https://github.com/AriaLyy/Aria/issues/264 + v_3.4.4 - 实现[多线程分块下载](https://aria.laoyuyu.me/aria_doc/start/config.html) - 修复`stopAll()`和`resumeAll()`导致的进度为0问题 diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 6811af74..dc705a90 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -22,6 +22,7 @@ import android.view.View; import butterknife.Bind; import com.arialyy.annotations.DownloadGroup; import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadGroupEntity; import com.arialyy.aria.core.download.DownloadGroupTask; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; @@ -133,14 +134,15 @@ public class DownloadGroupActivity extends BaseActivity Date: Thu, 5 Jul 2018 10:12:20 +0800 Subject: [PATCH 05/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=84=E5=90=88?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8D=95=E7=BA=BF=E7=A8=8B=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E4=B8=AD=E5=BA=94=E7=94=A8=E8=A2=AB=E6=9D=80?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E5=8F=98=E5=A4=A7=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/AbsFileer.java | 244 +++++++++++------- .../aria/core/common/AbsThreadTask.java | 106 +++++++- .../arialyy/aria/core/common/ProxyHelper.java | 16 +- .../aria/core/common/StateConstance.java | 5 +- .../aria/core/common/SubThreadConfig.java | 4 +- .../aria/core/download/DownloadReceiver.java | 2 +- .../download/downloader/AbsGroupUtil.java | 9 +- .../downloader/DownloadGroupUtil.java | 4 + .../download/downloader/HttpThreadTask.java | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../download/group/DownloadGroupActivity.java | 59 ++--- .../simple/widget/SubStateLinearLayout.java | 3 +- app/src/main/res/values/strings.xml | 4 +- build.gradle | 2 +- 14 files changed, 320 insertions(+), 142 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index df094f64..6b817f2d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -109,6 +109,28 @@ public abstract class AbsFileer tr.endLocation) { - ALog.w(TAG, String.format("分块【%s】错误,将重新开始该分块", temp.getPath())); - temp.delete(); - tr.startLocation = i * blockLen; - } - mStartThreadNum++; - } - } - } - i++; - } - mTotalThreadNum = mRecord.threadRecords.size(); - mTaskEntity.setNewTask(false); + handleBlockRecord(); } else { - File file = new File(mRecord.filePath); - if (!file.exists()) { - ALog.w(TAG, String.format("文件【%s】不存在,任务将重新开始", file.getPath())); - mRecord.deleteData(); - initRecord(true); - return; - } - for (ThreadRecord tr : mRecord.threadRecords) { - if (tr.isComplete) { - mCompleteThreadNum++; - } else { - mStartThreadNum++; - } - } - mTotalThreadNum = mRecord.threadRecords.size(); - mTaskEntity.setNewTask(false); + handleNormalRecord(); } } } } + /** + * 处理普通任务的记录 + */ + private void handleNormalRecord() { + File file = new File(mRecord.filePath); + if (!file.exists()) { + ALog.w(TAG, String.format("文件【%s】不存在,任务将重新开始", file.getPath())); + mRecord.deleteData(); + initRecord(true); + return; + } + + if (mRecord.isOpenDynamicFile) { + ThreadRecord tr = mRecord.threadRecords.get(0); + if (tr == null) { + mTaskEntity.setNewTask(true); + mTotalThreadNum = 1; + return; + } + if (file.length() > mEntity.getFileSize()) { + ALog.i(TAG, String.format("文件【%s】错误,任务重新开始", file.getPath())); + file.delete(); + tr.startLocation = 0; + tr.isComplete = false; + tr.endLocation = mEntity.getFileSize(); + mStartThreadNum++; + } else if (file.length() == mEntity.getFileSize()) { + tr.isComplete = true; + mCompleteThreadNum++; + } else { + if (file.length() != tr.startLocation) { + ALog.i(TAG, String.format("修正【%s】的进度记录为:%s", file.getPath(), file.length())); + tr.startLocation = file.length(); + tr.isComplete = false; + mStartThreadNum++; + } + } + } else { + for (ThreadRecord tr : mRecord.threadRecords) { + if (tr.isComplete) { + mCompleteThreadNum++; + } else { + mStartThreadNum++; + } + } + } + mTotalThreadNum = mRecord.threadRecords.size(); + mTaskEntity.setNewTask(false); + } + + /** + * 处理分块任务的记录 + */ + private void handleBlockRecord() { + final int threadNum = mRecord.threadRecords.size(); + final long blockLen = mEntity.getFileSize() / threadNum; + int i = 0; + for (ThreadRecord tr : mRecord.threadRecords) { + File temp = new File(String.format(SUB_PATH, mRecord.filePath, tr.threadId)); + if (!temp.exists()) { + ALog.i(TAG, String.format("分块文件【%s】不存在,该分块将重新开始", temp.getPath())); + tr.isComplete = false; + tr.startLocation = -1; + mStartThreadNum++; + } else { + if (tr.isComplete) { + mCompleteThreadNum++; + } else { + long realLocation = i * blockLen + temp.length(); + ALog.i(TAG, String.format( + "startLocation = %s; endLocation = %s; block = %s; tempLen = %s; i = %s", + tr.startLocation, tr.endLocation, blockLen, temp.length(), i)); + if (tr.endLocation == realLocation) { + ALog.d(TAG, String.format("分块【%s】已完成,更新记录", temp.getPath())); + tr.startLocation = realLocation; + tr.isComplete = true; + mCompleteThreadNum++; + } else { + tr.isComplete = false; + if (realLocation < tr.startLocation) { + ALog.i(TAG, String.format("修正分块【%s】的进度记录为:%s", temp.getPath(), realLocation)); + tr.startLocation = realLocation; + } else if (realLocation > tr.endLocation) { + ALog.i(TAG, String.format("分块【%s】错误,将重新开始该分块", temp.getPath())); + temp.delete(); + tr.startLocation = i * blockLen; + } + mStartThreadNum++; + } + } + } + i++; + } + mTotalThreadNum = mRecord.threadRecords.size(); + mTaskEntity.setNewTask(false); + } + /** * convertDb 为兼容性代码 * 从3.4.1开始,线程配置信息将存储在数据库中。 @@ -463,7 +529,7 @@ public abstract class AbsFileer config = new SubThreadConfig<>(); - config.FILE_SIZE = fileLength; + config.TOTAL_FILE_SIZE = fileLength; config.URL = mEntity.isRedirect() ? mEntity.getRedirectUrl() : mEntity.getUrl(); config.TEMP_FILE = mRecord.isBlock ? new File(String.format(SUB_PATH, mTempFile.getPath(), i)) : mTempFile; @@ -566,34 +632,36 @@ public abstract class AbsFileer keys = mTask.keySet(); - for (Integer key : keys) { - AbsThreadTask task = mTask.get(key); - if (task != null && !task.isThreadComplete()) { - task.getConfig().START_LOCATION = task.getConfig().THREAD_RECORD.startLocation; - mConstance.resetState(); - startTimer(); - ALog.d(TAG, String.format("任务【%s】开始重试,线程__%s__【开始位置:%s,结束位置:%s】", mEntity.getFileName(), - key, task.getConfig().START_LOCATION, task.getConfig().END_LOCATION)); - if (!mFixedThreadPool.isShutdown()) { - mFixedThreadPool.execute(task); - } else { - ALog.w(TAG, "线程池已关闭"); - mListener.onFail(true); - } - } - } + public void retryTask() { + ALog.w(TAG, String.format("任务【%s】开始重试", mEntity.getFileName())); + startFlow(); + //if (isBreak()) { + // return; + //} + //if (mTask == null || mTask.size() == 0) { + // ALog.w(TAG, "没有线程任务"); + // return; + //} + //Set keys = mTask.keySet(); + //for (Integer key : keys) { + // AbsThreadTask task = mTask.get(key); + // if (task != null && !task.isThreadComplete()) { + // + // task.getConfig().START_LOCATION = task.getConfig().THREAD_RECORD.startLocation; + // mConstance.resetState(); + // startTimer(); + // ALog.d(TAG, String.format("任务【%s】开始重试,线程__%s__【开始位置:%s,结束位置:%s】", mEntity.getFileName(), + // key, task.getConfig().START_LOCATION, task.getConfig().END_LOCATION)); + // if (!mFixedThreadPool.isShutdown()) { + // mFixedThreadPool.execute(task); + // } else { + // ALog.w(TAG, "线程池已关闭"); + // mListener.onFail(true); + // } + // } + //} } /** @@ -608,17 +676,17 @@ public abstract class AbsFileer config = new SubThreadConfig<>(); - config.FILE_SIZE = mEntity.getFileSize(); + config.TOTAL_FILE_SIZE = mEntity.getFileSize(); config.URL = mEntity.isRedirect() ? mEntity.getRedirectUrl() : mEntity.getUrl(); config.TEMP_FILE = mTempFile; config.THREAD_ID = 0; config.START_LOCATION = 0; - config.END_LOCATION = config.FILE_SIZE; + config.END_LOCATION = config.TOTAL_FILE_SIZE; config.SUPPORT_BP = mTaskEntity.isSupportBP(); config.TASK_ENTITY = mTaskEntity; ThreadRecord record = new ThreadRecord(); record.startLocation = 0; - record.endLocation = config.FILE_SIZE; + record.endLocation = config.TOTAL_FILE_SIZE; record.key = mTempFile.getPath(); config.THREAD_RECORD = record; AbsThreadTask task = selectThreadTask(config); diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java index c776b047..a8f6fe24 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java @@ -104,6 +104,52 @@ public abstract class AbsThreadTask tr.endLocation) { + ALog.i(TAG, String.format("分块【%s】错误,将重新下载该分块", file.getPath())); + boolean b = file.delete(); + ALog.w(TAG, "删除:" + b); + tr.startLocation = block * tr.threadId; + tr.isComplete = false; + mConfig.START_LOCATION = tr.startLocation; + } else if (file.length() == tr.endLocation) { + STATE.COMPLETE_THREAD_NUM++; + tr.isComplete = true; + } else { + tr.startLocation = file.length(); + mConfig.START_LOCATION = file.length(); + tr.isComplete = false; + long size = 0; + for (int i = 0, len = getTaskRecord().threadRecords.size(); i < len; i++) { + File temp = new File(String.format(AbsFileer.SUB_PATH, getTaskRecord().filePath, i)); + if (temp.exists()) { + size += file.length(); + } + } + STATE.CURRENT_LOCATION = size; + ALog.i(TAG, String.format("修正分块【%s】进度,开始位置:%s", file.getPath(), tr.startLocation)); + } + } else { + mConfig.START_LOCATION = mChildCurrentLocation == 0 ? mConfig.START_LOCATION + : mConfig.THREAD_RECORD.startLocation; + } + } + /** * 处理失败状态 * @@ -328,12 +411,17 @@ public abstract class AbsThreadTask { //线程Id public int THREAD_ID; - //下载文件大小 - public long FILE_SIZE; + //文件总长度 + public long TOTAL_FILE_SIZE; //子线程启动下载位置 public long START_LOCATION; //子线程结束下载位置 diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index 686ec364..a151a1d0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -170,7 +170,7 @@ public class DownloadReceiver extends AbsReceiver { } } } else { - ALog.i(TAG, "没有Aria的注解方法"); + ALog.w(TAG, "没有Aria的注解方法"); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index c4745cc1..5abb73ab 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -275,6 +275,7 @@ public abstract class AbsGroupUtil implements IUtil { */ protected void onPre() { mListener.onPre(); + isRunning = true; mGroupSize = mGTEntity.getSubTaskEntities().size(); mTotalLen = mGTEntity.getEntity().getFileSize(); isNeedLoadFileSize = mTotalLen <= 10; @@ -492,20 +493,22 @@ public abstract class AbsGroupUtil implements IUtil { subEntity.setFailNum(subEntity.getFailNum() + 1); saveData(IEntity.STATE_FAIL, lastLen); handleSpeed(0); - reTry(needRetry); + //reTry(needRetry); + reTry(false); } /** * 重试下载,只有全部都下载失败才会执行任务组的整体重试,否则只会执行单个子任务的重试 */ private void reTry(boolean needRetry) { - Downloader dt = mDownloaderMap.get(subEntity.getUrl()); synchronized (AbsGroupUtil.LOCK) { + Downloader dt = mDownloaderMap.get(subEntity.getUrl()); if (!isCancel && !isStop && dt != null && !dt.isBreak() && needRetry && subEntity.getFailNum() < 3 && (NetUtils.isConnected(AriaManager.APP) || isNotNetRetry)) { + ALog.d(TAG, "downloader retry"); reStartTask(dt); } else { mFailMap.put(subTaskEntity.getUrl(), subTaskEntity); @@ -531,7 +534,7 @@ public abstract class AbsGroupUtil implements IUtil { timer.schedule(new TimerTask() { @Override public void run() { if (dt != null) { - dt.retryThreadTask(); + dt.retryTask(); } } }, 5000); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java index f01a6436..ae0c0fdc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java @@ -163,6 +163,10 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { */ private void checkStartFlow() { synchronized (DownloadGroupUtil.class) { + if (isStop) { + closeTimer(); + return; + } if (mInitFailNum == mExeNum) { closeTimer(); mListener.onFail(true); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 23caeacd..58d56049 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -60,7 +60,7 @@ final class HttpThreadTask extends AbsThreadTask - + diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index dc705a90..1e936757 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -46,7 +46,7 @@ public class DownloadGroupActivity extends BaseActivityhttps://res5.d.cn/5a6a3384c1b2be1a52034c72752e8475414630ebc69318b84ef584115ebf5eaaab945ae07b7fe3596afc72a7940ff328d4a9553f6ae92d6c09ba4bfb533137f6.apk--> http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk - http://static.ilongyuan.cn/rayark/RayarkFZ_2.0.7.apk + @@ -87,7 +87,7 @@ 战斗吧剑灵.apk - 天魔幻想.apk + diff --git a/build.gradle b/build.gradle index 1056598a..0882d5ad 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.6_dev2' + publishVersion = '3.4.6_dev3' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From d47ac22dfa43fd82dcdee8ddbbb2b243201b6e0a Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 6 Jul 2018 21:09:18 +0800 Subject: [PATCH 06/28] 3.4.6 --- .../arialyy/aria/core/common/AbsFileer.java | 5 +++ .../aria/core/common/AbsThreadTask.java | 45 +++++++++++-------- .../aria/core/common/ThreadRecord.java | 5 +++ .../download/downloader/AbsGroupUtil.java | 3 +- .../download/downloader/HttpThreadTask.java | 5 --- .../java/com/arialyy/aria/orm/DBConfig.java | 2 +- DEV_LOG.md | 1 + README.md | 15 ++++--- app/src/main/assets/aria_config.xml | 2 +- build.gradle | 2 +- 10 files changed, 50 insertions(+), 35 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 6b817f2d..f20c6a69 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -567,6 +567,11 @@ public abstract class AbsFileer 0) { Thread.sleep(mSleepTime); } - // - //bf.flip(); - //foc.write(bf); - //bf.compact(); - //progress(len); if (mChildCurrentLocation + len >= mConfig.END_LOCATION) { len = (int) (mConfig.END_LOCATION - mChildCurrentLocation); bf.flip(); diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java index 582cd5cc..11271b97 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java @@ -35,7 +35,7 @@ class DBConfig { /*adb pull /mnt/sdcard/Android/data/com.arialyy.simple/files/DB/AriaLyyDb d:/db*/ static Map mapping = new HashMap<>(); static String DB_NAME; - static int VERSION = 39; + static int VERSION = 40; /** * 是否将数据库保存在Sd卡,{@code true} 是 diff --git a/DEV_LOG.md b/DEV_LOG.md index 8052e351..ee873164 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,6 +1,7 @@ ## 开发日志 + v_3.4.6 - 修复android 4.4.4 版本多dex下无法进行回调的问题 + - 新增`updateUrl(newUrl)`用于修改任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) - 优化分块下载 - 修复了字符串中有特殊字符导致的路径冲突问题;修复ftp分块下载失败问题 - 修复连接中有`+`导致的地址呗使用问题。 diff --git a/README.md b/README.md index b6fcdfd6..b87c92cf 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.5' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.5' +compile 'com.arialyy.aria:aria-core:3.4.6' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.6' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` @@ -100,10 +100,13 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.4.4 - - 实现[多线程分块下载](https://aria.laoyuyu.me/aria_doc/start/config.html) - - 修复`stopAll()`和`resumeAll()`导致的进度为0问题 - - 修复任务组添加header无效的问题 + + v_3.4.6 + - 修复android 4.4.4 版本多dex下无法进行回调的问题 + - 新增`updateUrl(newUrl)`用于修改任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) + - 优化分块下载 + - 修复了字符串中有特殊字符导致的路径冲突问题;修复ftp分块下载失败问题 + - 修复连接中有`+`导致的地址呗使用问题。 + - 修复表重复创建导致的崩溃问题 https://github.com/AriaLyy/Aria/issues/264 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index b9aa70df..01b6db9a 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -37,7 +37,7 @@ - + diff --git a/build.gradle b/build.gradle index 0882d5ad..3a3d1e21 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.6_dev3' + publishVersion = '3.4.6' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 1ca3ff900dac1f1d7b4a1a837704dac63875eb34 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 9 Jul 2018 21:56:34 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=86=E5=9D=97?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E6=9C=89=E6=97=B6=E5=81=8F?= =?UTF-8?q?=E5=A4=A7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/common/AbsFileer.java | 4 ++-- .../aria/core/download/DownloadGroupTarget.java | 8 ++++++-- .../com/arialyy/aria/core/inf/AbsTarget.java | 17 +++++++++++++++-- DEV_LOG.md | 2 ++ README.md | 13 ++++--------- build.gradle | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index f20c6a69..23250a4b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -392,10 +392,10 @@ public abstract class AbsFileer tr.endLocation) { + }else if (realLocation > tr.endLocation) { ALog.i(TAG, String.format("分块【%s】错误,将重新开始该分块", temp.getPath())); temp.delete(); tr.startLocation = i * blockLen; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java index 8cbb23dc..a9f0ded1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java @@ -18,11 +18,11 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.text.TextUtils; -import android.util.Log; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.delegate.HttpHeaderDelegate; import com.arialyy.aria.core.inf.IHttpHeaderTarget; import com.arialyy.aria.core.manager.TEManager; +import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import java.io.File; @@ -67,7 +67,6 @@ public class DownloadGroupTarget extends BaseGroupTarget im private void init() { mGroupName = CommonUtil.getMd5Code(mUrls); mTaskEntity = TEManager.getInstance().getGTEntity(DownloadGroupTaskEntity.class, mUrls); - //ALog.d(TAG, "gHash=" + mEntity.getSubEntities().get(0).hashCode() + "; subHash="+mEntity.getT) mEntity = mTaskEntity.getEntity(); if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); @@ -239,6 +238,11 @@ public class DownloadGroupTarget extends BaseGroupTarget im if (oldFile.exists()) { oldFile.renameTo(new File(newPath)); } + if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", newPath)) { + ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在", newPath)); + return; + } + CommonUtil.modifyTaskRecord(oldFile.getPath(), newPath); entity.setDownloadPath(newPath); taskEntity.setKey(newPath); diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java index e9c75be5..4be6c97f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java @@ -21,10 +21,13 @@ import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.command.ICmd; import com.arialyy.aria.core.command.normal.CancelCmd; import com.arialyy.aria.core.command.normal.NormalCmdFactory; +import com.arialyy.aria.core.common.TaskRecord; +import com.arialyy.aria.core.download.DownloadGroupEntity; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.manager.TEManager; import com.arialyy.aria.core.upload.UploadTaskEntity; +import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import java.util.ArrayList; @@ -35,7 +38,7 @@ import java.util.List; */ public abstract class AbsTarget implements ITarget { - protected String TAG ; + protected String TAG; protected ENTITY mEntity; protected TASK_ENTITY mTaskEntity; protected String mTargetName; @@ -64,7 +67,17 @@ public abstract class AbsTarget'`替换为 ``` @@ -100,13 +100,8 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.4.6 - - 修复android 4.4.4 版本多dex下无法进行回调的问题 - - 新增`updateUrl(newUrl)`用于修改任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) - - 优化分块下载 - - 修复了字符串中有特殊字符导致的路径冲突问题;修复ftp分块下载失败问题 - - 修复连接中有`+`导致的地址呗使用问题。 - - 修复表重复创建导致的崩溃问题 https://github.com/AriaLyy/Aria/issues/264 + + v_3.4.7 + - 修复分块任务异常操作导致的问题 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/build.gradle b/build.gradle index 3a3d1e21..2c1ceeb5 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.6' + publishVersion = '3.4.7' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From d1e591b448a28a6352988fad016f96e3e463487c Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Thu, 12 Jul 2018 22:05:18 +0800 Subject: [PATCH 08/28] =?UTF-8?q?ftps=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/FtpUrlEntity.java | 29 +++++ .../aria/core/common/ProtocolType.java | 39 +++++++ .../common/{ => ftp}/AbsFtpInfoThread.java | 89 +++++++++++---- .../common/{ => ftp}/AbsFtpThreadTask.java | 50 +++++++-- .../aria/core/common/ftp/FTPSSLConfig.java | 104 ++++++++++++++++++ .../{delegate => common/ftp}/FtpDelegate.java | 32 +++--- .../common/ftp/SSLSessionReuseFTPSClient.java | 54 +++++++++ .../http}/HttpHeaderDelegate.java | 26 ++--- .../core/download/DownloadGroupTarget.java | 44 +++++++- .../aria/core/download/DownloadTarget.java | 28 ++--- .../core/download/FtpDirDownloadTarget.java | 9 +- .../aria/core/download/FtpDownloadTarget.java | 18 ++- .../download/downloader/ConnectionHelp.java | 43 ++++---- .../download/downloader/FtpDirInfoThread.java | 2 +- .../downloader/FtpFileInfoThread.java | 2 +- .../download/downloader/FtpThreadTask.java | 2 +- .../com/arialyy/aria/core/inf/AbsTarget.java | 31 +++++- .../aria/core/inf/IHttpHeaderTarget.java | 4 + .../com/arialyy/aria/core/inf/ITarget.java | 43 +------- .../aria/core/upload/FtpUploadTarget.java | 6 +- .../aria/core/upload/UploadTarget.java | 11 +- .../upload/uploader/FtpFileInfoThread.java | 2 +- .../core/upload/uploader/FtpThreadTask.java | 2 +- .../java/com/arialyy/aria/orm/DBConfig.java | 2 +- .../com/arialyy/aria/util/SSLContextUtil.java | 53 +++++++-- DEV_LOG.md | 4 + app/src/main/AndroidManifest.xml | 4 +- .../download/group/DownloadGroupActivity.java | 5 +- .../simple/download/group/GroupModule.java | 5 +- .../arialyy/simple/test/AnyRunActivity.java | 7 +- .../arialyy/simple/test/AnyRunnModule.java | 7 +- 31 files changed, 574 insertions(+), 183 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java rename Aria/src/main/java/com/arialyy/aria/core/common/{ => ftp}/AbsFtpInfoThread.java (78%) rename Aria/src/main/java/com/arialyy/aria/core/common/{ => ftp}/AbsFtpThreadTask.java (73%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSSLConfig.java rename Aria/src/main/java/com/arialyy/aria/core/{delegate => common/ftp}/FtpDelegate.java (63%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ftp/SSLSessionReuseFTPSClient.java rename Aria/src/main/java/com/arialyy/aria/core/{delegate => common/http}/HttpHeaderDelegate.java (87%) diff --git a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java index da821979..eaa7173c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java @@ -17,6 +17,7 @@ */ package com.arialyy.aria.core; +import com.arialyy.aria.orm.annotation.Ignore; import java.net.InetAddress; /** @@ -32,6 +33,12 @@ public class FtpUrlEntity implements Cloneable { public String account; + /** + * 是否是ftps + * {@code true}ftps协议的地址,{@code false}不是ftps协议的地址 + */ + public boolean isFtps = false; + /** * 原始url */ @@ -46,9 +53,11 @@ public class FtpUrlEntity implements Cloneable { * 登录的用户名 */ public String user; + /** * 密码 */ + @Ignore public String password; /** @@ -71,6 +80,26 @@ public class FtpUrlEntity implements Cloneable { */ public InetAddress validAddr; + /** + * 证书路径 + */ + public String storePath; + + /** + * 证书密码 + */ + public String storePass; + + /** + * SSL协议 + */ + public String SSLProtocol; + + /** + * 私钥别名 + */ + public String keyAlias; + @Override public FtpUrlEntity clone() { FtpUrlEntity entity = null; try { diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java new file mode 100644 index 00000000..740e85ee --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.core.common; + +import android.support.annotation.StringDef; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@StringDef({ + ProtocolType.Default, + ProtocolType.SSL, + ProtocolType.SSLv3, + ProtocolType.TLS, + ProtocolType.TLSv1, + ProtocolType.TLSv1_1, + ProtocolType.TLSv1_2 +}) +@Retention(RetentionPolicy.SOURCE) public @interface ProtocolType { + String Default = "Default"; + String SSL = "SSL"; + String SSLv3 = "SSLv3"; + String TLS = "TLS"; + String TLSv1 = "TLSv1"; + String TLSv1_1 = "TLSv1.1"; + String TLSv1_2 = "TLSv1.2"; +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java similarity index 78% rename from Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java rename to Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java index c2b649ec..799bdb87 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java @@ -13,26 +13,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.arialyy.aria.core.common; +package com.arialyy.aria.core.common.ftp; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.FtpUrlEntity; +import com.arialyy.aria.core.common.OnFileInfoCallback; +import com.arialyy.aria.core.common.ProtocolType; import com.arialyy.aria.core.inf.AbsEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.Regular; +import com.arialyy.aria.util.SSLContextUtil; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.net.ssl.SSLContext; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; +import org.apache.commons.net.ftp.FTPSClient; /** * Created by Aria.Lao on 2017/7/25. @@ -78,9 +83,11 @@ public abstract class AbsFtpInfoThread 0) { - client = new FTPClient(); + client = newInstanceClient(urlEntity); InetAddress ip = InetAddress.getByName(urlEntity.hostName); client.setConnectTimeout(mConnectTimeOut); // 连接10s超时 client.connect(ip, Integer.parseInt(urlEntity.port)); @@ -182,7 +185,13 @@ public abstract class AbsFtpInfoThread> extends AbsThreadTask { private final String TAG = "AbsFtpThreadTask"; - protected String charSet, port; + protected String charSet; /** * D_FTP 服务器编码 */ @@ -55,7 +62,7 @@ public abstract class AbsFtpThreadTask implements ITarget { + private final String TAG = "FTPSSLConfig"; + private TARGET mTarget; + private FtpUrlEntity mUrlEntity; + + public FTPSSLConfig(TARGET target) { + mTarget = target; + mUrlEntity = mTarget.getTaskEntity().getUrlEntity(); + } + + /** + * 设置协议类型 + * + * @param protocol {@link ProtocolType} + */ + public FTPSSLConfig setProtocol(@ProtocolType String protocol) { + if (TextUtils.isEmpty(protocol)) { + throw new NullPointerException("协议为空"); + } + mUrlEntity.SSLProtocol = protocol; + return this; + } + + /** + * 设置证书别名 + * + * @param keyAlias 别名 + */ + public FTPSSLConfig setAlias(String keyAlias) { + if (TextUtils.isEmpty(keyAlias)) { + throw new NullPointerException("别名为空"); + } + mUrlEntity.keyAlias = keyAlias; + return this; + } + + /** + * 设置证书密码 + * + * @param storePass 私钥密码 + */ + public FTPSSLConfig setStorePass(String storePass) { + if (TextUtils.isEmpty(storePass)) { + throw new NullPointerException("证书密码为空"); + } + mUrlEntity.storePass = storePass; + return this; + } + + /** + * 设置证书路径 + * + * @param storePath 证书路径 + */ + public FTPSSLConfig setStorePath(String storePath) { + if (TextUtils.isEmpty(storePath)) { + throw new NullPointerException("证书路径为空"); + } + mUrlEntity.storePath = storePath; + return this; + } + + @Override public void start() { + mTarget.start(); + } + + @Override public void stop() { + mTarget.stop(); + } + + @Override public void resume() { + mTarget.resume(); + } + + @Override public void cancel() { + mTarget.cancel(); + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java similarity index 63% rename from Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java rename to Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java index 736a53c8..80e1c284 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java @@ -13,35 +13,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.arialyy.aria.core.delegate; +package com.arialyy.aria.core.common.ftp; import android.text.TextUtils; -import com.arialyy.aria.core.inf.AbsEntity; -import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.FtpUrlEntity; +import com.arialyy.aria.core.inf.AbsTarget; import com.arialyy.aria.core.inf.IFtpTarget; -import com.arialyy.aria.core.inf.ITarget; import com.arialyy.aria.util.ALog; /** * Created by laoyuyu on 2018/3/9. * ftp 委托 */ -public class FtpDelegate> - implements IFtpTarget { +public class FtpDelegate implements IFtpTarget { private static final String TAG = "FtpDelegate"; - private ENTITY mEntity; - private TASK_ENTITY mTaskEntity; + private FtpUrlEntity mUrlEntity; private TARGET mTarget; - public FtpDelegate(TARGET target, TASK_ENTITY taskEntity) { + public FtpDelegate(TARGET target) { mTarget = target; - mTaskEntity = taskEntity; - mEntity = mTaskEntity.getEntity(); + mUrlEntity = target.getTaskEntity().getUrlEntity(); } @Override public TARGET charSet(String charSet) { - if (TextUtils.isEmpty(charSet)) return mTarget; - mTaskEntity.setCharSet(charSet); + if (TextUtils.isEmpty(charSet)) { + throw new NullPointerException("字符编码为空"); + } + mTarget.getTaskEntity().setCharSet(charSet); return mTarget; } @@ -57,10 +55,10 @@ public class FtpDelegate> +public class HttpHeaderDelegate implements IHttpHeaderTarget { private static final String TAG = "HttpHeaderDelegate"; - private ENTITY mEntity; - private TASK_ENTITY mTaskEntity; private TARGET mTarget; - public HttpHeaderDelegate(TARGET target, TASK_ENTITY taskEntity) { + public HttpHeaderDelegate(TARGET target) { mTarget = target; - mTaskEntity = taskEntity; - - mEntity = mTaskEntity.getEntity(); } /** @@ -61,7 +56,7 @@ public class HttpHeaderDelegate implements IHttpHeaderTarget { - private HttpHeaderDelegate - mDelegate; + private HttpHeaderDelegate mDelegate; /** * 子任务下载地址, */ @@ -71,7 +71,35 @@ public class DownloadGroupTarget extends BaseGroupTarget im if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); } - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); + } + + /** + * 更新组合任务下载地址 + * + * @param urls 新的组合任务下载地址列表 + */ + @CheckResult + public DownloadGroupTarget updateUrls(List urls) { + if (urls == null || urls.isEmpty()) { + throw new NullPointerException("下载地址列表为空"); + } + if (urls.size() != mUrls.size()) { + throw new IllegalArgumentException("新下载地址数量和旧下载地址数量不一致"); + } + mUrls.clear(); + mUrls.addAll(urls); + mGroupName = CommonUtil.getMd5Code(urls); + mEntity.setGroupName(mGroupName); + mTaskEntity.setKey(mGroupName); + mEntity.update(); + if (mEntity.getSubEntities() != null && !mEntity.getSubEntities().isEmpty()) { + for (DownloadEntity de : mEntity.getSubEntities()) { + de.setGroupName(mGroupName); + de.update(); + } + } + return this; } /** @@ -268,6 +296,7 @@ public class DownloadGroupTarget extends BaseGroupTarget im return true; } + @CheckResult @Override public DownloadGroupTarget addHeader(@NonNull String key, @NonNull String value) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { mDelegate.addHeader(subTask, key, value); @@ -275,6 +304,7 @@ public class DownloadGroupTarget extends BaseGroupTarget im return mDelegate.addHeader(key, value); } + @CheckResult @Override public DownloadGroupTarget addHeaders(Map headers) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { mDelegate.addHeaders(subTask, headers); @@ -282,10 +312,16 @@ public class DownloadGroupTarget extends BaseGroupTarget im return mDelegate.addHeaders(headers); } + @CheckResult @Override public DownloadGroupTarget setRequestMode(RequestEnum requestEnum) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { subTask.setRequestEnum(requestEnum); } return mDelegate.setRequestMode(requestEnum); } + + @CheckResult + @Override public DownloadGroupTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java index 5014e30c..b20ccebd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java @@ -18,7 +18,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import com.arialyy.aria.core.common.RequestEnum; -import com.arialyy.aria.core.delegate.HttpHeaderDelegate; +import com.arialyy.aria.core.common.http.HttpHeaderDelegate; import com.arialyy.aria.core.inf.IHttpHeaderTarget; import java.net.Proxy; import java.util.Map; @@ -29,7 +29,7 @@ import java.util.Map; */ public class DownloadTarget extends BaseNormalTarget implements IHttpHeaderTarget { - private HttpHeaderDelegate mDelegate; + private HttpHeaderDelegate mDelegate; DownloadTarget(DownloadEntity entity, String targetName) { @@ -38,7 +38,7 @@ public class DownloadTarget extends BaseNormalTarget DownloadTarget(String url, String targetName) { initTarget(url, targetName); - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); } /** @@ -53,17 +53,6 @@ public class DownloadTarget extends BaseNormalTarget return this; } - /** - * 设置URL的代理 - * - * @param proxy {@link Proxy} - */ - @CheckResult - public DownloadTarget setUrlProxy(Proxy proxy) { - mTaskEntity.setProxy(proxy); - return this; - } - /** * 设置文件存储路径 * 该api后续版本会删除 @@ -100,6 +89,17 @@ public class DownloadTarget extends BaseNormalTarget return HTTP; } + + /** + * 设置URL的代理 + * + * @param proxy {@link Proxy} + */ + @CheckResult + @Override public DownloadTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } + @CheckResult @Override public DownloadTarget addHeader(@NonNull String key, @NonNull String value) { return mDelegate.addHeader(key, value); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java index a5978483..758d8cb5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java @@ -17,7 +17,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.text.TextUtils; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.core.manager.TEManager; @@ -29,7 +29,7 @@ import com.arialyy.aria.util.ALog; */ public class FtpDirDownloadTarget extends BaseGroupTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; FtpDirDownloadTarget(String url, String targetName) { mTargetName = targetName; @@ -44,7 +44,7 @@ public class FtpDirDownloadTarget extends BaseGroupTarget if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); } - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); } @Override protected int getTargetType() { @@ -90,14 +90,17 @@ public class FtpDirDownloadTarget extends BaseGroupTarget } return true; } + @CheckResult @Override public FtpDirDownloadTarget charSet(String charSet) { return mDelegate.charSet(charSet); } + @CheckResult @Override public FtpDirDownloadTarget login(String userName, String password) { return mDelegate.login(userName, password); } + @CheckResult @Override public FtpDirDownloadTarget login(String userName, String password, String account) { return mDelegate.login(userName, password, account); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java index 6d73b43c..3637f347 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java @@ -17,7 +17,8 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FTPSSLConfig; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; @@ -28,7 +29,7 @@ import com.arialyy.aria.util.CommonUtil; */ public class FtpDownloadTarget extends BaseNormalTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; public FtpDownloadTarget(DownloadEntity entity, String targetName) { this(entity.getUrl(), targetName); @@ -45,7 +46,18 @@ public class FtpDownloadTarget extends BaseNormalTarget mTaskEntity.setUrlEntity(CommonUtil.getFtpUrlInfo(url)); mTaskEntity.setRequestType(AbsTaskEntity.D_FTP); - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); + } + + /** + * 是否是FTPS协议 + * 如果是FTPS协议,需要使用{@link FTPSSLConfig#setPrivateKeyPath(String)}、{@link FTPSSLConfig#setCertPath(String)} + * 设置证书信息 + */ + @CheckResult + public FTPSSLConfig asFtps() { + mTaskEntity.getUrlEntity().isFtps = true; + return new FTPSSLConfig<>(this); } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java index 01277969..6b9250f1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java @@ -16,6 +16,7 @@ package com.arialyy.aria.core.download.downloader; import android.text.TextUtils; +import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -26,8 +27,6 @@ import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.net.URLConnection; -import java.util.List; -import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; import java.util.zip.InflaterInputStream; @@ -75,9 +74,11 @@ class ConnectionHelp { urlConn = url.openConnection(); } if (urlConn instanceof HttpsURLConnection) { + AriaManager manager = AriaManager.getInstance(AriaManager.APP); conn = (HttpsURLConnection) urlConn; SSLContext sslContext = - SSLContextUtil.getSSLContext(SSLContextUtil.CA_ALIAS, SSLContextUtil.CA_PATH); + SSLContextUtil.getSSLContextFromAssets(manager.getDownloadConfig().getCaName(), + manager.getDownloadConfig().getCaPath()); if (sslContext == null) { sslContext = SSLContextUtil.getDefaultSLLContext(); } @@ -126,24 +127,24 @@ class ConnectionHelp { if (conn.getRequestProperty("Accept") == null) { StringBuilder accept = new StringBuilder(); //accept - //.append("image/gif, ") - //.append("image/jpeg, ") - //.append("image/pjpeg, ") - //.append("image/webp, ") - //.append("image/apng, ") - //.append("application/xml, ") - //.append("application/xaml+xml, ") - //.append("application/xhtml+xml, ") - //.append("application/x-shockwave-flash, ") - //.append("application/x-ms-xbap, ") - //.append("application/x-ms-application, ") - //.append("application/msword, ") - //.append("application/vnd.ms-excel, ") - //.append("application/vnd.ms-xpsdocument, ") - //.append("application/vnd.ms-powerpoint, ") - //.append("text/plain, ") - //.append("text/html, ") - //.append("*/*"); + //.append("image/gif, ") + //.append("image/jpeg, ") + //.append("image/pjpeg, ") + //.append("image/webp, ") + //.append("image/apng, ") + //.append("application/xml, ") + //.append("application/xaml+xml, ") + //.append("application/xhtml+xml, ") + //.append("application/x-shockwave-flash, ") + //.append("application/x-ms-xbap, ") + //.append("application/x-ms-application, ") + //.append("application/msword, ") + //.append("application/vnd.ms-excel, ") + //.append("application/vnd.ms-xpsdocument, ") + //.append("application/vnd.ms-powerpoint, ") + //.append("text/plain, ") + //.append("text/html, ") + //.append("*/*"); conn.setRequestProperty("Accept", "*/*"); } //302获取重定向地址 diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java index 7c6ab6eb..65797d49 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java @@ -16,9 +16,9 @@ package com.arialyy.aria.core.download.downloader; import com.arialyy.aria.core.FtpUrlEntity; -import com.arialyy.aria.core.common.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadGroupEntity; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java index acb3371a..1e1ca043 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java @@ -15,7 +15,7 @@ */ package com.arialyy.aria.core.download.downloader; -import com.arialyy.aria.core.common.AbsFtpInfoThread; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.download.DownloadEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index 4d2390e8..82389993 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -16,7 +16,7 @@ package com.arialyy.aria.core.download.downloader; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.AbsFtpThreadTask; +import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.download.DownloadEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java index 4be6c97f..4bf7d9a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java @@ -37,7 +37,7 @@ import java.util.List; * Created by AriaL on 2017/7/3. */ public abstract class AbsTarget - implements ITarget { + implements ITarget { protected String TAG; protected ENTITY mEntity; protected TASK_ENTITY mTaskEntity; @@ -82,12 +82,18 @@ public abstract class AbsTarget { */ @CheckResult TARGET setRequestMode(RequestEnum requestEnum); + + @CheckResult + TARGET setUrlProxy(Proxy proxy); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java index 8b4b998a..8176258a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java @@ -18,48 +18,7 @@ package com.arialyy.aria.core.inf; /** * Created by AriaL on 2017/6/29. */ -public interface ITarget { - /** - * 获取任务状态 - * - * @return {@link IEntity} - */ - int getTaskState(); - - /** - * 任务是否在执行 - * - * @return {@code true} 任务正在执行 - */ - boolean isRunning(); - - /** - * 任务是否存在 - * - * @return {@code true} 任务存在 - */ - boolean taskExists(); - - /** - * 任务文件大小 - */ - long getSize(); - - /** - * 转换后的大小 - */ - String getConvertSize(); - - /** - * 获取任务进度百分比 - */ - int getPercent(); - - /** - * 获取任务进度,如果任务存在,则返回当前进度 - */ - long getCurrentProgress(); - +public interface ITarget { /** * 开始下载 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java index 060d6b88..06793fd7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java @@ -18,7 +18,7 @@ package com.arialyy.aria.core.upload; import android.support.annotation.CheckResult; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.command.normal.NormalCmdFactory; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; @@ -29,7 +29,7 @@ import com.arialyy.aria.util.CommonUtil; */ public class FtpUploadTarget extends BaseNormalTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; private String mAccount, mUser, mPw; private boolean needLogin = false; @@ -42,7 +42,7 @@ public class FtpUploadTarget extends BaseNormalTarget private void initTask(String filePath) { initTarget(filePath); mTaskEntity.setRequestType(AbsTaskEntity.U_FTP); - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java index a87e1bee..734ff20a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java @@ -18,9 +18,10 @@ package com.arialyy.aria.core.upload; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import com.arialyy.aria.core.common.RequestEnum; -import com.arialyy.aria.core.delegate.HttpHeaderDelegate; +import com.arialyy.aria.core.common.http.HttpHeaderDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IHttpHeaderTarget; +import java.net.Proxy; import java.util.Map; /** @@ -29,7 +30,7 @@ import java.util.Map; */ public class UploadTarget extends BaseNormalTarget implements IHttpHeaderTarget { - private HttpHeaderDelegate mDelegate; + private HttpHeaderDelegate mDelegate; UploadTarget(String filePath, String targetName) { this.mTargetName = targetName; @@ -42,7 +43,7 @@ public class UploadTarget extends BaseNormalTarget //http暂时不支持断点上传 mTaskEntity.setSupportBP(false); mTaskEntity.setRequestType(AbsTaskEntity.U_HTTP); - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); } /** @@ -90,4 +91,8 @@ public class UploadTarget extends BaseNormalTarget @Override public UploadTarget setRequestMode(RequestEnum requestEnum) { return mDelegate.setRequestMode(requestEnum); } + + @Override public UploadTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java index 2ad915da..efbceba2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java @@ -15,7 +15,7 @@ */ package com.arialyy.aria.core.upload.uploader; -import com.arialyy.aria.core.common.AbsFtpInfoThread; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.common.TaskRecord; diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index efe780a5..511d6f7d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -16,7 +16,7 @@ package com.arialyy.aria.core.upload.uploader; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.AbsFtpThreadTask; +import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.inf.IEventListener; diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java index 11271b97..fc6f89c1 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java @@ -35,7 +35,7 @@ class DBConfig { /*adb pull /mnt/sdcard/Android/data/com.arialyy.simple/files/DB/AriaLyyDb d:/db*/ static Map mapping = new HashMap<>(); static String DB_NAME; - static int VERSION = 40; + static int VERSION = 41; /** * 是否将数据库保存在Sd卡,{@code true} 是 diff --git a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java index df832458..9a2e465c 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java @@ -17,6 +17,7 @@ package com.arialyy.aria.util; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.KeyManagementException; @@ -42,30 +43,46 @@ import javax.net.ssl.X509TrustManager; * SSL证书工具 */ public class SSLContextUtil { + private static final String TAG = "SSLContextUtil"; - public static String CA_PATH, CA_ALIAS; + /** + * 从assets目录下加载证书 + * + * @param caAlias CA证书别名 + * @param caPath 保存在assets目录下的CA证书完整路径 + */ + public static SSLContext getSSLContextFromAssets(String caAlias, String caPath) { + try { + InputStream caInput = AriaManager.APP.getAssets().open(caPath); + Certificate ca = loadCert(caInput); + return createContext(caAlias, ca); + } catch (IOException | CertificateException e) { + e.printStackTrace(); + } + return null; + } /** * 颁发服务器证书的 CA 未知 * * @param caAlias CA证书别名 - * @param caPath 保存在assets目录下的CA证书完整路径 + * @param caPath CA证书路径 */ public static SSLContext getSSLContext(String caAlias, String caPath) { if (TextUtils.isEmpty(caAlias) || TextUtils.isEmpty(caPath)) { return null; } - // Load CAs from an InputStream - // (could be from a resource or ByteArrayInputStream or ...) - CertificateFactory cf = null; try { - cf = CertificateFactory.getInstance("X.509"); - InputStream caInput = AriaManager.APP.getAssets().open(caPath); - Certificate ca; - ca = cf.generateCertificate(caInput); - System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); + Certificate ca = loadCert(new FileInputStream(caPath)); + return createContext(caAlias, ca); + } catch (CertificateException | IOException e) { + e.printStackTrace(); + } + return null; + } - // Create a KeyStore containing our trusted CAs + private static SSLContext createContext(String caAlias, Certificate ca) { + try { String keyStoreType = KeyStore.getDefaultType(); KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); @@ -89,6 +106,20 @@ public class SSLContextUtil { return null; } + /** + * 加载CA证书 + * + * @param is CA证书文件流 + * @throws CertificateException + */ + private static Certificate loadCert(InputStream is) throws CertificateException, IOException { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + Certificate ca = cf.generateCertificate(is); + ALog.d(TAG, String.format("ca【%s】", ((X509Certificate) ca).getSubjectDN())); + is.close(); + return ca; + } + /** * 服务器证书不是由 CA 签署的,而是自签署时,获取默认的SSL */ diff --git a/DEV_LOG.md b/DEV_LOG.md index 2f1c8d47..bf17d87b 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,8 @@ ## 开发日志 + + v_3.4.8 + - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) + - 出于安全考虑,FTP数据库去掉密码的保存 + - 增加FTPS支持 [see]() + v_3.4.7 - 修复分块任务异常操作导致的问题 + v_3.4.6 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7550c3f4..a79260ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,9 +17,9 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 1e936757..452d3a99 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -32,6 +32,7 @@ import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityDownloadGroupBinding; import com.arialyy.simple.widget.SubStateLinearLayout; +import java.util.ArrayList; import java.util.List; /** @@ -80,6 +81,8 @@ public class DownloadGroupActivity extends BaseActivity temp = new ArrayList<>(); + temp.add("https://d.pcs.baidu.com/file/130335545f3f4d9cc38afe709c19af5a?fid=1411168371-250528-1010657263806840&dstime=1531134714&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-h8KgJ6gl4oY9UR6NqvwJsT4nVSM%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=4401996296756616039&dp-callid=0&r=279987343"); Aria.download(this) .loadGroup(mUrls) .setDirPath( @@ -88,7 +91,7 @@ public class DownloadGroupActivity extends BaseActivity getUrls1() { List urls = new ArrayList<>(); - String[] str = getContext().getResources().getStringArray(R.array.group_urls); - Collections.addAll(urls, str); + //String[] str = getContext().getResources().getStringArray(R.array.group_urls); + //Collections.addAll(urls, str); + urls.add("https://d.pcs.baidu.com/file/130335545f3f4d9cc38afe709c19af5a?fid=1411168371-250528-1010657263806840&dstime=1531134607&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-sNCujT7lC42aMcfiHcgqAzYHuw4%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=4401967667009194668&dp-callid=0&r=540192514"); return urls; } diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index caa1047b..2df1eb6a 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -28,7 +28,8 @@ public class AnyRunActivity extends BaseActivity { //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; - String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; + String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; + //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; //private String URL = "http://cn-hbsjz-cmcc-v-03.acgvideo.com/upgcxcode/63/82/5108263/5108263-1-80.flv?expires=1530178500&platform=pc&ssig=vr7gLl0duyqWqSMnIpzaDA&oi=3746029570&nfa=BpfiWF+i4mNW8KzjZFHzBQ==&dynamic=1&hfa=2030547937&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=&trid=3476be01a9254115b15f8cc7198600fe&nfc=1"; @@ -50,8 +51,8 @@ public class AnyRunActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - module.start(URL); - //module.startFtp(URL); + //module.start(URL); + module.startFtp(URL); break; case R.id.stop: module.stop(URL); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index 40f2632f..1af461d3 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -10,7 +10,6 @@ import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.aria.util.CommonUtil; import com.arialyy.frame.util.show.L; import java.io.File; -import java.net.Proxy; /** * Created by laoyuyu on 2018/4/13. @@ -79,7 +78,11 @@ public class AnyRunnModule { Aria.download(this) .loadFtp(url) .login("lao", "123456") - .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/") + .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/Download/") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") + .setStorePass("123456") .start(); } From 5bdc1c881baee78a5a66e6b43ba1e97a734f0a2d Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 13 Jul 2018 23:40:51 +0800 Subject: [PATCH 09/28] =?UTF-8?q?ftps=20=E4=B8=8A=E4=BC=A0/=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E4=BC=98=E5=8C=96=EF=BC=8C=E4=B8=8A=E4=BC=A0/?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E9=80=9F=E5=BA=A6=E9=99=90=E5=88=B6=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/ConfigHelper.java | 3 + .../com/arialyy/aria/core/FtpUrlEntity.java | 9 +- .../arialyy/aria/core/common/AbsFileer.java | 38 ++++--- .../aria/core/common/AbsThreadTask.java | 39 +++++-- .../aria/core/common/BandwidthLimiter.java | 104 ++++++++++++++++++ .../com/arialyy/aria/core/common/IUtil.java | 6 +- .../aria/core/common/ProtocolType.java | 2 +- .../core/common/ftp/AbsFtpInfoThread.java | 12 +- .../core/common/ftp/AbsFtpThreadTask.java | 7 +- .../{FTPSSLConfig.java => FTPSConfig.java} | 16 +-- .../aria/core/common/ftp/FtpDelegate.java | 6 + .../aria/core/download/DownloadReceiver.java | 4 +- .../aria/core/download/DownloadTask.java | 10 -- .../core/download/FtpDirDownloadTarget.java | 36 +++++- .../aria/core/download/FtpDownloadTarget.java | 14 ++- .../download/downloader/AbsGroupUtil.java | 10 +- .../download/downloader/ConnectionHelp.java | 5 +- .../core/download/downloader/Downloader.java | 9 ++ .../download/downloader/FtpDirInfoThread.java | 2 +- .../download/downloader/FtpThreadTask.java | 34 +++--- .../download/downloader/HttpThreadTask.java | 29 +++-- .../downloader/SimpleDownloadUtil.java | 6 +- .../arialyy/aria/core/inf/AbsGroupTask.java | 8 +- .../com/arialyy/aria/core/inf/AbsTask.java | 13 +++ .../com/arialyy/aria/core/inf/IFtpTarget.java | 9 ++ .../arialyy/aria/core/queue/AbsTaskQueue.java | 14 +++ .../aria/core/queue/DownloadTaskQueue.java | 12 -- .../aria/core/upload/FtpUploadTarget.java | 33 +++++- .../aria/core/upload/UploadReceiver.java | 10 ++ .../core/upload/uploader/FtpThreadTask.java | 29 +++-- .../core/upload/uploader/HttpThreadTask.java | 17 ++- .../upload/uploader/SimpleUploadUtil.java | 4 +- .../com/arialyy/aria/util/CommonUtil.java | 18 +++ .../com/arialyy/aria/util/SSLContextUtil.java | 45 ++++++-- DEV_LOG.md | 1 + app/src/main/AndroidManifest.xml | 10 +- app/src/main/assets/aria_config.xml | 7 +- ...TestActivity.java => TestFTPActivity.java} | 16 ++- ...pActivity.java => TestFTPDirActivity.java} | 8 +- .../com/arialyy/aria/core/Configuration.java | 45 +++++--- .../arialyy/aria/core/upload/UploadTask.java | 1 - 41 files changed, 518 insertions(+), 183 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/BandwidthLimiter.java rename Aria/src/main/java/com/arialyy/aria/core/common/ftp/{FTPSSLConfig.java => FTPSConfig.java} (83%) rename app/src/main/java/com/arialyy/simple/test/{TestActivity.java => TestFTPActivity.java} (84%) rename app/src/main/java/com/arialyy/simple/test/{TestGroupActivity.java => TestFTPDirActivity.java} (90%) diff --git a/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java b/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java index 0d26d978..e8dda5b6 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java @@ -184,6 +184,9 @@ class ConfigHelper extends DefaultHandler { if (mType == ConfigType.DOWNLOAD) { mDownloadConfig.maxSpeed = maxSpeed; } + if (mType == ConfigType.UPLOAD) { + mUploadConfig.maxSpeed = maxSpeed; + } } private void loadConvertSpeed(String value) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java index eaa7173c..8d4df9e5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java @@ -17,6 +17,7 @@ */ package com.arialyy.aria.core; +import com.arialyy.aria.core.common.ProtocolType; import com.arialyy.aria.orm.annotation.Ignore; import java.net.InetAddress; @@ -47,7 +48,7 @@ public class FtpUrlEntity implements Cloneable { /** * ftp协议:ftp */ - public String protocol; + public String scheme; /** * 登录的用户名 @@ -91,9 +92,11 @@ public class FtpUrlEntity implements Cloneable { public String storePass; /** - * SSL协议 + * 连接协议 + * {@link ProtocolType} */ - public String SSLProtocol; + @ProtocolType + public String protocol; /** * 私钥别名 diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 23250a4b..91fbc955 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -21,7 +21,6 @@ import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsNormalEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; -import com.arialyy.aria.core.inf.IDownloadListener; import com.arialyy.aria.core.inf.IEventListener; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.ALog; @@ -45,7 +44,7 @@ import java.util.concurrent.Executors; * 任务处理器 */ public abstract class AbsFileer> - implements Runnable, IUtil { + implements Runnable { private static final String STATE = "_state_"; private static final String RECORD = "_record_"; /** @@ -93,7 +92,12 @@ public abstract class AbsFileer tr.endLocation) { + } else if (realLocation > tr.endLocation) { ALog.i(TAG, String.format("分块【%s】错误,将重新开始该分块", temp.getPath())); temp.delete(); tr.startLocation = i * blockLen; diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java index edf100a5..e8be8cf4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java @@ -26,7 +26,6 @@ import com.arialyy.aria.util.ErrorHelp; import com.arialyy.aria.util.FileUtil; import com.arialyy.aria.util.NetUtils; import java.io.File; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Timer; @@ -49,7 +48,7 @@ public abstract class AbsThreadTask 0) { + mSpeedBandUtil = new BandwidthLimiter(getMaxSpeed(), mThreadNum); } } @@ -115,6 +115,23 @@ public abstract class AbsThreadTask 1) { + maxRate = maxRate / threadNum; + } + this.setMaxRate(maxRate); + } + + /** + * Set the max upload or download rate in KB/s. maxRate must be grater than + * 0. If maxRate is zero, it means there is no bandwidth limit. + * + * @param maxRate If maxRate is zero, it means there is no bandwidth limit. + * @throws IllegalArgumentException + */ + public synchronized void setMaxRate(int maxRate) + throws IllegalArgumentException { + if (maxRate < 0) { + throw new IllegalArgumentException("maxRate can not less than 0"); + } + this.maxRate = maxRate; + if (maxRate == 0) { + this.timeCostPerChunk = 0; + } else { + this.timeCostPerChunk = (1000000000L * CHUNK_LENGTH) + / (this.maxRate * KB); + } + } + + /** + * Next 1 byte should do bandwidth limit. + */ + public synchronized void limitNextBytes() { + this.limitNextBytes(1); + } + + /** + * Next len bytes should do bandwidth limit + */ + public synchronized void limitNextBytes(int len) { + this.bytesWillBeSentOrReceive += len; + + /* We have sent CHUNK_LENGTH bytes */ + while (this.bytesWillBeSentOrReceive > CHUNK_LENGTH) { + long nowTick = System.nanoTime(); + long missedTime = this.timeCostPerChunk + - (nowTick - this.lastPieceSentOrReceiveTick); + if (missedTime > 0) { + try { + Thread.currentThread().sleep(missedTime / 1000000, + (int) (missedTime % 1000000)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + this.bytesWillBeSentOrReceive -= CHUNK_LENGTH; + this.lastPieceSentOrReceiveTick = nowTick + + (missedTime > 0 ? missedTime : 0); + } + } +} \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/IUtil.java b/Aria/src/main/java/com/arialyy/aria/core/common/IUtil.java index 17698d8f..f7354574 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/IUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/IUtil.java @@ -60,7 +60,9 @@ public interface IUtil { void resume(); /** - * 设置最大速度 + * 设置最大下载/上传速度 + * + * @param speed 单位:kb */ - void setMaxSpeed(double maxSpeed); + void setMaxSpeed(int speed); } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java index 740e85ee..8a80e123 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java @@ -29,7 +29,7 @@ import java.lang.annotation.RetentionPolicy; ProtocolType.TLSv1_2 }) @Retention(RetentionPolicy.SOURCE) public @interface ProtocolType { - String Default = "Default"; + String Default = "TLS"; String SSL = "SSL"; String SSLv3 = "SSLv3"; String TLS = "TLS"; diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java index 799bdb87..2379d7f4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java @@ -85,7 +85,7 @@ public abstract class AbsFtpInfoThread implements ITarget { - private final String TAG = "FTPSSLConfig"; +public class FTPSConfig implements ITarget { + private final String TAG = "FTPSConfig"; private TARGET mTarget; private FtpUrlEntity mUrlEntity; - public FTPSSLConfig(TARGET target) { + public FTPSConfig(TARGET target) { mTarget = target; mUrlEntity = mTarget.getTaskEntity().getUrlEntity(); } @@ -39,11 +39,11 @@ public class FTPSSLConfig implements ITarget { * * @param protocol {@link ProtocolType} */ - public FTPSSLConfig setProtocol(@ProtocolType String protocol) { + public FTPSConfig setProtocol(@ProtocolType String protocol) { if (TextUtils.isEmpty(protocol)) { throw new NullPointerException("协议为空"); } - mUrlEntity.SSLProtocol = protocol; + mUrlEntity.protocol = protocol; return this; } @@ -52,7 +52,7 @@ public class FTPSSLConfig implements ITarget { * * @param keyAlias 别名 */ - public FTPSSLConfig setAlias(String keyAlias) { + public FTPSConfig setAlias(String keyAlias) { if (TextUtils.isEmpty(keyAlias)) { throw new NullPointerException("别名为空"); } @@ -65,7 +65,7 @@ public class FTPSSLConfig implements ITarget { * * @param storePass 私钥密码 */ - public FTPSSLConfig setStorePass(String storePass) { + public FTPSConfig setStorePass(String storePass) { if (TextUtils.isEmpty(storePass)) { throw new NullPointerException("证书密码为空"); } @@ -78,7 +78,7 @@ public class FTPSSLConfig implements ITarget { * * @param storePath 证书路径 */ - public FTPSSLConfig setStorePath(String storePath) { + public FTPSConfig setStorePath(String storePath) { if (TextUtils.isEmpty(storePath)) { throw new NullPointerException("证书路径为空"); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java index 80e1c284..04f2792d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java @@ -20,6 +20,7 @@ import com.arialyy.aria.core.FtpUrlEntity; import com.arialyy.aria.core.inf.AbsTarget; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.ALog; +import java.net.Proxy; /** * Created by laoyuyu on 2018/3/9. @@ -61,4 +62,9 @@ public class FtpDelegate implements IFtpTarget mUrlEntity.account = account; return mTarget; } + + @Override public TARGET setProxy(Proxy proxy) { + mTarget.getTaskEntity().setProxy(proxy); + return mTarget; + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index a151a1d0..143c0a69 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -47,12 +47,12 @@ public class DownloadReceiver extends AbsReceiver { /** * 设置最大下载速度,单位:kb - * 该方法为实验性功能,清不要轻易在生产环境中使用。 * * @param maxSpeed 为0表示不限速 */ - @Deprecated public void setMaxSpeed(int maxSpeed) { + public DownloadReceiver setMaxSpeed(int maxSpeed) { AriaManager.getInstance(AriaManager.APP).getDownloadConfig().setMaxSpeed(maxSpeed); + return this; } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java index 56181f2f..f86f9721 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java @@ -35,7 +35,6 @@ public class DownloadTask extends AbsNormalTask { private DownloadListener mListener; private DownloadEntity mEntity; - private IUtil mUtil; private DownloadTask(DownloadTaskEntity taskEntity, Handler outHandler) { mTaskEntity = taskEntity; @@ -96,15 +95,6 @@ public class DownloadTask extends AbsNormalTask { stop(true); } - /** - * 设置最大下载速度,单位:kb - * - * @param maxSpeed 为0表示不限速 - */ - public void setMaxSpeed(double maxSpeed) { - mUtil.setMaxSpeed(maxSpeed); - } - /** * 开始下载 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java index 758d8cb5..d18b90dd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java @@ -17,11 +17,14 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.text.TextUtils; +import com.arialyy.aria.core.FtpUrlEntity; +import com.arialyy.aria.core.common.ftp.FTPSConfig; import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.core.manager.TEManager; import com.arialyy.aria.util.ALog; +import java.net.Proxy; /** * Created by Aria.Lao on 2017/7/26. @@ -58,11 +61,21 @@ public class FtpDirDownloadTarget extends BaseGroupTarget mTaskEntity.save(); if (mTaskEntity.getSubTaskEntities() != null) { //初始化子项的登录信息 + FtpUrlEntity tUrlEntity = mTaskEntity.getUrlEntity(); for (DownloadTaskEntity entity : mTaskEntity.getSubTaskEntities()) { - entity.getUrlEntity().needLogin = mTaskEntity.getUrlEntity().needLogin; - entity.getUrlEntity().account = mTaskEntity.getUrlEntity().account; - entity.getUrlEntity().user = mTaskEntity.getUrlEntity().user; - entity.getUrlEntity().password = mTaskEntity.getUrlEntity().password; + FtpUrlEntity urlEntity = entity.getUrlEntity(); + urlEntity.needLogin = tUrlEntity.needLogin; + urlEntity.account = tUrlEntity.account; + urlEntity.user = tUrlEntity.user; + urlEntity.password = tUrlEntity.password; + // 处理ftps详细 + if (tUrlEntity.isFtps) { + urlEntity.isFtps = true; + urlEntity.protocol = tUrlEntity.protocol; + urlEntity.storePath = tUrlEntity.storePath; + urlEntity.storePass = tUrlEntity.storePass; + urlEntity.keyAlias = tUrlEntity.keyAlias; + } } } } @@ -91,6 +104,17 @@ public class FtpDirDownloadTarget extends BaseGroupTarget return true; } + /** + * 是否是FTPS协议 + * 如果是FTPS协议,需要使用{@link FTPSConfig#setStorePath(String)} 、{@link FTPSConfig#setAlias(String)} + * 设置证书信息 + */ + @CheckResult + public FTPSConfig asFtps() { + mTaskEntity.getUrlEntity().isFtps = true; + return new FTPSConfig<>(this); + } + @CheckResult @Override public FtpDirDownloadTarget charSet(String charSet) { return mDelegate.charSet(charSet); @@ -105,4 +129,8 @@ public class FtpDirDownloadTarget extends BaseGroupTarget @Override public FtpDirDownloadTarget login(String userName, String password, String account) { return mDelegate.login(userName, password, account); } + + @Override public FtpDirDownloadTarget setProxy(Proxy proxy) { + return mDelegate.setProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java index 3637f347..8494ec20 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java @@ -17,11 +17,12 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; -import com.arialyy.aria.core.common.ftp.FTPSSLConfig; +import com.arialyy.aria.core.common.ftp.FTPSConfig; import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; +import java.net.Proxy; /** * Created by lyy on 2016/12/5. @@ -51,13 +52,13 @@ public class FtpDownloadTarget extends BaseNormalTarget /** * 是否是FTPS协议 - * 如果是FTPS协议,需要使用{@link FTPSSLConfig#setPrivateKeyPath(String)}、{@link FTPSSLConfig#setCertPath(String)} + * 如果是FTPS协议,需要使用{@link FTPSConfig#setStorePath(String)} 、{@link FTPSConfig#setAlias(String)} * 设置证书信息 */ @CheckResult - public FTPSSLConfig asFtps() { + public FTPSConfig asFtps() { mTaskEntity.getUrlEntity().isFtps = true; - return new FTPSSLConfig<>(this); + return new FTPSConfig<>(this); } /** @@ -102,4 +103,9 @@ public class FtpDownloadTarget extends BaseNormalTarget @Override public FtpDownloadTarget login(String userName, String password, String account) { return mDelegate.login(userName, password, account); } + + @CheckResult + @Override public FtpDownloadTarget setProxy(Proxy proxy) { + return mDelegate.setProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 845aff7e..03a1b21b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -312,8 +312,14 @@ public abstract class AbsGroupUtil implements IUtil { start(); } - @Override public void setMaxSpeed(double maxSpeed) { - + @Override public void setMaxSpeed(int speed) { + Set keys = mDownloaderMap.keySet(); + for (String key : keys) { + Downloader dt = mDownloaderMap.get(key); + if (dt != null) { + dt.setMaxSpeed(speed); + } + } } private void clearState() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java index 6b9250f1..a7b985a7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java @@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.downloader; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.common.ProtocolType; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -78,9 +79,9 @@ class ConnectionHelp { conn = (HttpsURLConnection) urlConn; SSLContext sslContext = SSLContextUtil.getSSLContextFromAssets(manager.getDownloadConfig().getCaName(), - manager.getDownloadConfig().getCaPath()); + manager.getDownloadConfig().getCaPath(), ProtocolType.Default); if (sslContext == null) { - sslContext = SSLContextUtil.getDefaultSLLContext(); + sslContext = SSLContextUtil.getDefaultSLLContext(ProtocolType.Default); } SSLSocketFactory ssf = sslContext.getSocketFactory(); ((HttpsURLConnection) conn).setSSLSocketFactory(ssf); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java index 2335093d..caa53482 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java @@ -83,6 +83,15 @@ class Downloader extends AbsFileer { return false; } + @Override protected void onPostPre() { + super.onPostPre(); + ((IDownloadListener) mListener).onPostPre(mEntity.getFileSize()); + File file = new File(mEntity.getDownloadPath()); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + } + @Override protected AbsThreadTask selectThreadTask(SubThreadConfig config) { switch (mTaskEntity.getRequestType()) { case AbsTaskEntity.D_FTP: diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java index 65797d49..269f4b36 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java @@ -61,7 +61,7 @@ class FtpDirInfoThread extends AbsFtpInfoThread FtpThreadTask(StateConstance constance, IDownloadListener listener, SubThreadConfig downloadInfo) { super(constance, listener, downloadInfo); - AriaManager manager = AriaManager.getInstance(AriaManager.APP); - mConnectTimeOut = manager.getDownloadConfig().getConnectTimeOut(); - mReadTimeOut = manager.getDownloadConfig().getIOTimeOut(); - mBufSize = manager.getDownloadConfig().getBuffSize(); - isNotNetRetry = manager.getDownloadConfig().isNotNetRetry(); + mConnectTimeOut = mAridManager.getDownloadConfig().getConnectTimeOut(); + mReadTimeOut = mAridManager.getDownloadConfig().getIOTimeOut(); + mBufSize = mAridManager.getDownloadConfig().getBuffSize(); + isNotNetRetry = mAridManager.getDownloadConfig().isNotNetRetry(); isOpenDynamicFile = STATE.TASK_RECORD.isOpenDynamicFile; isBlock = STATE.TASK_RECORD.isBlock; - setMaxSpeed(manager.getDownloadConfig().getMaxSpeed()); } @Override public void run() { @@ -70,7 +67,10 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("任务【%s】线程__%s__开始下载【开始位置 : %s,结束位置:%s】", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID, mConfig.START_LOCATION, mConfig.END_LOCATION)); client = createClient(); - if (client == null) return; + if (client == null) { + fail(mChildCurrentLocation, "ftp client 创建失败", null); + return; + } if (mConfig.START_LOCATION > 0) { client.setRestartOffset(mConfig.START_LOCATION); } @@ -168,8 +168,8 @@ class FtpThreadTask extends AbsFtpThreadTask if (isBreak()) { break; } - if (mSleepTime > 0) { - Thread.sleep(mSleepTime); + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(len); } if (mChildCurrentLocation + len >= mConfig.END_LOCATION) { len = (int) (mConfig.END_LOCATION - mChildCurrentLocation); @@ -186,8 +186,6 @@ class FtpThreadTask extends AbsFtpThreadTask } } handleComplete(); - } catch (InterruptedException e) { - e.printStackTrace(); } catch (IOException e) { fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e); } finally { @@ -221,7 +219,9 @@ class FtpThreadTask extends AbsFtpThreadTask if (isBreak()) { break; } - if (mSleepTime > 0) Thread.sleep(mSleepTime); + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(len); + } if (mChildCurrentLocation + len >= mConfig.END_LOCATION) { len = (int) (mConfig.END_LOCATION - mChildCurrentLocation); file.write(buffer, 0, len); @@ -234,8 +234,6 @@ class FtpThreadTask extends AbsFtpThreadTask } } catch (IOException e) { fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e); - } catch (InterruptedException e) { - e.printStackTrace(); } finally { try { if (file != null) { @@ -246,4 +244,8 @@ class FtpThreadTask extends AbsFtpThreadTask } } } + + @Override public int getMaxSpeed() { + return mAridManager.getDownloadConfig().getMaxSpeed(); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 1424fd6f..9e75a3f4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -15,7 +15,6 @@ */ package com.arialyy.aria.core.download.downloader; -import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.AbsThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; @@ -49,14 +48,12 @@ final class HttpThreadTask extends AbsThreadTask downloadInfo) { super(constance, listener, downloadInfo); - AriaManager manager = AriaManager.getInstance(AriaManager.APP); - mConnectTimeOut = manager.getDownloadConfig().getConnectTimeOut(); - mReadTimeOut = manager.getDownloadConfig().getIOTimeOut(); - mBufSize = manager.getDownloadConfig().getBuffSize(); - isNotNetRetry = manager.getDownloadConfig().isNotNetRetry(); + mConnectTimeOut = mAridManager.getDownloadConfig().getConnectTimeOut(); + mReadTimeOut = mAridManager.getDownloadConfig().getIOTimeOut(); + mBufSize = mAridManager.getDownloadConfig().getBuffSize(); + isNotNetRetry = mAridManager.getDownloadConfig().isNotNetRetry(); isOpenDynamicFile = STATE.TASK_RECORD.isOpenDynamicFile; isBlock = STATE.TASK_RECORD.isBlock; - setMaxSpeed(manager.getDownloadConfig().getMaxSpeed()); } @Override public void run() { @@ -140,8 +137,8 @@ final class HttpThreadTask extends AbsThreadTask 0) { - Thread.sleep(mSleepTime); + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(len); } if (mChildCurrentLocation + len >= mConfig.END_LOCATION) { len = (int) (mConfig.END_LOCATION - mChildCurrentLocation); @@ -158,8 +155,6 @@ final class HttpThreadTask extends AbsThreadTask 0) { - Thread.sleep(mSleepTime); + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(len); } file.write(buffer, 0, len); progress(len); @@ -251,4 +246,8 @@ final class HttpThreadTask extends AbsThreadTask extends AbsTask { - protected AbsGroupUtil mUtil; - @Override public String getKey() { return mTaskEntity.getEntity().getKey(); } @@ -37,7 +35,7 @@ public abstract class AbsGroupTask */ public void startSubTask(String url) { if (mUtil != null) { - mUtil.startSubTask(url); + ((AbsGroupUtil) mUtil).startSubTask(url); } } @@ -48,7 +46,7 @@ public abstract class AbsGroupTask */ public void stopSubTask(String url) { if (mUtil != null) { - mUtil.stopSubTask(url); + ((AbsGroupUtil) mUtil).stopSubTask(url); } } @@ -59,7 +57,7 @@ public abstract class AbsGroupTask */ public void cancelSubTask(String url) { if (mUtil != null) { - mUtil.cancelSubTask(url); + ((AbsGroupUtil) mUtil).cancelSubTask(url); } } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java index bb5a1ba6..c8eeec44 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java @@ -17,6 +17,7 @@ package com.arialyy.aria.core.inf; import android.content.Context; import android.os.Handler; +import com.arialyy.aria.core.common.IUtil; import com.arialyy.aria.util.CommonUtil; /** @@ -38,11 +39,23 @@ public abstract class AbsTask implements ITas protected Context mContext; protected boolean isHeighestTask = false; private boolean isCancel = false, isStop = false; + protected IUtil mUtil; public Handler getOutHandler() { return mOutHandler; } + /** + * 设置最大下载/上传速度 + * + * @param speed 单位为:kb + */ + public void setMaxSpeed(int speed) { + if (mUtil != null) { + mUtil.setMaxSpeed(speed); + } + } + /** * 任务是否完成 * diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java index 129c70d3..2fc81a17 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IFtpTarget.java @@ -16,6 +16,7 @@ package com.arialyy.aria.core.inf; import android.support.annotation.CheckResult; +import java.net.Proxy; /** * Created by laoyuyu on 2018/3/9. @@ -45,4 +46,12 @@ public interface IFtpTarget { */ @CheckResult TARGET login(String userName, String password, String account); + + /** + * 设置代理 + * + * @param proxy {@link Proxy} + */ + @CheckResult + TARGET setProxy(Proxy proxy); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 5a171948..7bf73715 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -22,6 +22,8 @@ import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.queue.pool.BaseCachePool; import com.arialyy.aria.core.queue.pool.BaseExecutePool; import com.arialyy.aria.util.ALog; +import java.util.Map; +import java.util.Set; /** * Created by lyy on 2017/2/23. @@ -80,6 +82,18 @@ abstract class AbsTaskQueue tasks = mExecutePool.getAllTask(); + Set keys = tasks.keySet(); + for (String key : keys) { + TASK task = tasks.get(key); + task.setMaxSpeed(maxSpeed); + } + } + /** * 获取配置文件配置的最大可执行任务数 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java index 8245d30a..60b9561e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java @@ -104,18 +104,6 @@ public class DownloadTaskQueue extends AbsTaskQueue tasks = mExecutePool.getAllTask(); - Set keys = tasks.keySet(); - for (String key : keys) { - DownloadTask task = tasks.get(key); - task.setMaxSpeed(maxSpeed); - } - } - @Override public DownloadTask createTask(String target, DownloadTaskEntity entity) { DownloadTask task = null; if (!TextUtils.isEmpty(target)) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java index 06793fd7..fe60aae0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java @@ -17,11 +17,14 @@ package com.arialyy.aria.core.upload; import android.support.annotation.CheckResult; import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.FtpUrlEntity; import com.arialyy.aria.core.command.normal.NormalCmdFactory; +import com.arialyy.aria.core.common.ftp.FTPSConfig; import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; +import java.net.Proxy; /** * Created by Aria.Lao on 2017/7/27. @@ -62,7 +65,16 @@ public class FtpUploadTarget extends BaseNormalTarget if (!b) { return false; } - mTaskEntity.setUrlEntity(CommonUtil.getFtpUrlInfo(mTempUrl)); + FtpUrlEntity temp = mTaskEntity.getUrlEntity(); + FtpUrlEntity newEntity = CommonUtil.getFtpUrlInfo(mTempUrl); + if (temp != null) { //处理FTPS的信息 + newEntity.isFtps = temp.isFtps; + newEntity.storePass = temp.storePass; + newEntity.keyAlias = temp.keyAlias; + newEntity.protocol = temp.protocol; + newEntity.storePath = temp.storePath; + } + mTaskEntity.setUrlEntity(newEntity); mTaskEntity.getUrlEntity().account = mAccount; mTaskEntity.getUrlEntity().user = mUser; mTaskEntity.getUrlEntity().password = mPw; @@ -70,6 +82,21 @@ public class FtpUploadTarget extends BaseNormalTarget return true; } + /** + * 是否是FTPS协议 + * 如果是FTPS协议,需要使用{@link FTPSConfig#setStorePath(String)} 、{@link FTPSConfig#setAlias(String)} + * 设置证书信息 + */ + @CheckResult + public FTPSConfig asFtps() { + if (mTaskEntity.getUrlEntity() == null) { + FtpUrlEntity urlEntity = new FtpUrlEntity(); + urlEntity.isFtps = true; + mTaskEntity.setUrlEntity(urlEntity); + } + return new FTPSConfig<>(this); + } + @CheckResult @Override public FtpUploadTarget charSet(String charSet) { return mDelegate.charSet(charSet); @@ -89,4 +116,8 @@ public class FtpUploadTarget extends BaseNormalTarget mAccount = account; return this; } + + @Override public FtpUploadTarget setProxy(Proxy proxy) { + return mDelegate.setProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java index 6f25ce8c..dd42bb1b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java @@ -40,6 +40,16 @@ import java.util.Set; public class UploadReceiver extends AbsReceiver { private static final String TAG = "UploadReceiver"; + /** + * 设置最大上传速度,单位:kb + * + * @param maxSpeed 为0表示不限速 + */ + public UploadReceiver setMaxSpeed(int maxSpeed) { + AriaManager.getInstance(AriaManager.APP).getUploadConfig().setMaxSpeed(maxSpeed); + return this; + } + /** * 加载HTTP单文件上传任务 * diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index 511d6f7d..bfb59627 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -15,10 +15,9 @@ */ package com.arialyy.aria.core.upload.uploader; -import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; +import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.inf.IEventListener; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadTaskEntity; @@ -41,11 +40,14 @@ class FtpThreadTask extends AbsFtpThreadTask { FtpThreadTask(StateConstance constance, IEventListener listener, SubThreadConfig info) { super(constance, listener, info); - AriaManager manager = AriaManager.getInstance(AriaManager.APP); - mConnectTimeOut = manager.getUploadConfig().getConnectTimeOut(); - mReadTimeOut = manager.getUploadConfig().getIOTimeOut(); - mBufSize = manager.getUploadConfig().getBuffSize(); - isNotNetRetry = manager.getUploadConfig().isNotNetRetry(); + mConnectTimeOut = mAridManager.getUploadConfig().getConnectTimeOut(); + mReadTimeOut = mAridManager.getUploadConfig().getIOTimeOut(); + mBufSize = mAridManager.getUploadConfig().getBuffSize(); + isNotNetRetry = mAridManager.getUploadConfig().isNotNetRetry(); + } + + @Override public int getMaxSpeed() { + return mAridManager.getUploadConfig().getMaxSpeed(); } @Override public void run() { @@ -128,15 +130,18 @@ class FtpThreadTask extends AbsFtpThreadTask { @Override public void onFtpInputStream(FTPClient client, long totalBytesTransferred, int bytesTransferred, long streamSize) { - if (isBreak() && !isStoped) { - try { + try { + if (isBreak() && !isStoped) { isStoped = true; client.abor(); - } catch (IOException e) { - e.printStackTrace(); } + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(bytesTransferred); + } + progress(bytesTransferred); + } catch (IOException e) { + e.printStackTrace(); } - progress(bytesTransferred); } }); } catch (IOException e) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index ac14c2a7..822ba74e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -15,7 +15,6 @@ */ package com.arialyy.aria.core.upload.uploader; -import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.AbsThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; @@ -52,11 +51,10 @@ class HttpThreadTask extends AbsThreadTask { HttpThreadTask(StateConstance constance, IUploadListener listener, SubThreadConfig uploadInfo) { super(constance, listener, uploadInfo); - AriaManager manager = AriaManager.getInstance(AriaManager.APP); - mConnectTimeOut = manager.getUploadConfig().getConnectTimeOut(); - mReadTimeOut = manager.getUploadConfig().getIOTimeOut(); - mBufSize = manager.getUploadConfig().getBuffSize(); - isNotNetRetry = manager.getUploadConfig().isNotNetRetry(); + mConnectTimeOut = mAridManager.getUploadConfig().getConnectTimeOut(); + mReadTimeOut = mAridManager.getUploadConfig().getIOTimeOut(); + mBufSize = mAridManager.getUploadConfig().getBuffSize(); + isNotNetRetry = mAridManager.getUploadConfig().isNotNetRetry(); } @Override public void run() { @@ -167,6 +165,9 @@ class HttpThreadTask extends AbsThreadTask { if (STATE.isCancel) { break; } + if (mSpeedBandUtil != null) { + mSpeedBandUtil.limitNextBytes(bytesRead); + } } mOutputStream.flush(); @@ -212,4 +213,8 @@ class HttpThreadTask extends AbsThreadTask { mOutputStream.close(); return response.toString(); } + + @Override public int getMaxSpeed() { + return mAridManager.getUploadConfig().getMaxSpeed(); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java index 9f4d1c1c..591876c3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java @@ -99,7 +99,7 @@ public class SimpleUploadUtil implements IUtil, Runnable { mUploader.cancel(); } - @Override public void setMaxSpeed(double maxSpeed) { - mUploader.setMaxSpeed(maxSpeed); + @Override public void setMaxSpeed(int speed) { + mUploader.setMaxSpeed(speed); } } diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index 1763f596..dc89d6b6 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -289,6 +289,7 @@ public class CommonUtil { entity.user = userInfo; } } + entity.scheme = uri.getScheme(); entity.remotePath = TextUtils.isEmpty(remotePath) ? "/" : remotePath; return entity; } @@ -395,6 +396,23 @@ public class CommonUtil { return md5; } + /** + * 获取字符串的md5 + * + * @return 字符串为空或获取md5失败,则返回"" + */ + public static String getStrMd5(String str) { + if (TextUtils.isEmpty(str)) return ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes()); + return new BigInteger(1, md.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + ALog.e(TAG, e.getMessage()); + } + return ""; + } + /** * 删除任务组记录 * diff --git a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java index 9a2e465c..0e5f7b48 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java @@ -17,6 +17,7 @@ package com.arialyy.aria.util; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.common.ProtocolType; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -30,6 +31,8 @@ import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import java.util.Map; +import java.util.WeakHashMap; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; @@ -44,18 +47,26 @@ import javax.net.ssl.X509TrustManager; */ public class SSLContextUtil { private static final String TAG = "SSLContextUtil"; + private static Map SSL_CACHE = new WeakHashMap<>(); /** * 从assets目录下加载证书 * * @param caAlias CA证书别名 * @param caPath 保存在assets目录下的CA证书完整路径 + * @param protocol 连接协议 */ - public static SSLContext getSSLContextFromAssets(String caAlias, String caPath) { + public static SSLContext getSSLContextFromAssets(String caAlias, String caPath, + @ProtocolType String protocol) { try { + String cacheKey = getCacheKey(caAlias, caPath); + SSLContext sslContext = SSL_CACHE.get(cacheKey); + if (sslContext != null) { + return sslContext; + } InputStream caInput = AriaManager.APP.getAssets().open(caPath); Certificate ca = loadCert(caInput); - return createContext(caAlias, ca); + return createContext(caAlias, ca, protocol, cacheKey); } catch (IOException | CertificateException e) { e.printStackTrace(); } @@ -67,21 +78,32 @@ public class SSLContextUtil { * * @param caAlias CA证书别名 * @param caPath CA证书路径 + * @param protocol 连接协议 */ - public static SSLContext getSSLContext(String caAlias, String caPath) { + public static SSLContext getSSLContext(String caAlias, String caPath, + @ProtocolType String protocol) { if (TextUtils.isEmpty(caAlias) || TextUtils.isEmpty(caPath)) { return null; } try { + String cacheKey = getCacheKey(caAlias, caPath); + SSLContext sslContext = SSL_CACHE.get(cacheKey); + if (sslContext != null) { + return sslContext; + } Certificate ca = loadCert(new FileInputStream(caPath)); - return createContext(caAlias, ca); + return createContext(caAlias, ca, protocol, cacheKey); } catch (CertificateException | IOException e) { e.printStackTrace(); } return null; } - private static SSLContext createContext(String caAlias, Certificate ca) { + /** + * @param cacheKey 别名 + 证书路径,然后取md5 + */ + private static SSLContext createContext(String caAlias, Certificate ca, + @ProtocolType String protocol, String cacheKey) { try { String keyStoreType = KeyStore.getDefaultType(); KeyStore keyStore = KeyStore.getInstance(keyStoreType); @@ -97,8 +119,10 @@ public class SSLContextUtil { kmf.init(keyStore, null); // Create an SSLContext that uses our TrustManager - SSLContext context = SSLContext.getInstance("TLS"); + SSLContext context = + SSLContext.getInstance(TextUtils.isEmpty(protocol) ? ProtocolType.Default : protocol); context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); + SSL_CACHE.put(cacheKey, context); return context; } catch (CertificateException | NoSuchAlgorithmException | IOException | KeyStoreException | KeyManagementException | UnrecoverableKeyException e) { e.printStackTrace(); @@ -106,6 +130,10 @@ public class SSLContextUtil { return null; } + private static String getCacheKey(String alias, String path) { + return CommonUtil.getStrMd5(String.format("%s_%s", alias, path)); + } + /** * 加载CA证书 * @@ -123,10 +151,11 @@ public class SSLContextUtil { /** * 服务器证书不是由 CA 签署的,而是自签署时,获取默认的SSL */ - public static SSLContext getDefaultSLLContext() { + public static SSLContext getDefaultSLLContext(@ProtocolType String protocol) { SSLContext sslContext = null; try { - sslContext = SSLContext.getInstance("TLS"); + sslContext = + SSLContext.getInstance(TextUtils.isEmpty(protocol) ? ProtocolType.Default : protocol); sslContext.init(null, new TrustManager[] { trustManagers }, new SecureRandom()); } catch (Exception e) { e.printStackTrace(); diff --git a/DEV_LOG.md b/DEV_LOG.md index bf17d87b..2f0f0626 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -3,6 +3,7 @@ - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) - 出于安全考虑,FTP数据库去掉密码的保存 - 增加FTPS支持 [see]() + - 增加速度限制支持[see]() + v_3.4.7 - 修复分块任务异常操作导致的问题 + v_3.4.6 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a79260ea..36686969 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,13 +13,13 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"> - - - + + + @@ -29,7 +29,7 @@ - + diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index 01b6db9a..aacfdc1b 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -11,6 +11,10 @@ + + + + + diff --git a/app/src/main/java/com/arialyy/simple/test/TestActivity.java b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java similarity index 84% rename from app/src/main/java/com/arialyy/simple/test/TestActivity.java rename to app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java index 4c680de5..7be6bf1b 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java @@ -19,12 +19,12 @@ import java.io.File; * Created by Administrator on 2018/4/12. */ -public class TestActivity extends BaseActivity { - String TAG = "TestActivity"; +public class TestFTPActivity extends BaseActivity { + String TAG = "TestFTPActivity"; //String URL = "http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 //private final String URL = "ftp://192.168.1.3:21/download//AriaPrj.rar"; - private final String FILE_PATH = "/mnt/sdcard/AriaPrj.rar"; - private final String URL = "ftp://192.168.1.2:21/aa//你好"; + private final String FILE_PATH = "/mnt/sdcard/mmm.mp4"; + private final String URL = "ftps://192.168.29.140:990/aa/你好"; @Override protected int setLayoutId() { @@ -35,7 +35,7 @@ public class TestActivity extends BaseActivity { super.init(savedInstanceState); mBar.setVisibility(View.GONE); Aria.upload(this).register(); - + Aria.upload(this).setMaxSpeed(128); } @Upload.onWait void onWait(UploadTask task) { @@ -51,7 +51,7 @@ public class TestActivity extends BaseActivity { } @Upload.onTaskRunning protected void running(UploadTask task) { - Log.d(TAG, "running"); + Log.d(TAG, "running,speed=" + task.getConvertSpeed()); } @Upload.onTaskResume void taskResume(UploadTask task) { @@ -82,6 +82,10 @@ public class TestActivity extends BaseActivity { .login("lao", "123456") .setUploadUrl(URL) .setExtendField("韩寒哈大双") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") + .setStorePass("123456") .start(); //Uri uri = Uri.parse("ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"); //ALog.d(TAG, "sh = " + uri.getScheme() + ", user = " + uri.getUserInfo() + ", host = " + uri.getHost() + ", port = " + uri.getPort() + " remotePath = " + uri.getPath()); diff --git a/app/src/main/java/com/arialyy/simple/test/TestGroupActivity.java b/app/src/main/java/com/arialyy/simple/test/TestFTPDirActivity.java similarity index 90% rename from app/src/main/java/com/arialyy/simple/test/TestGroupActivity.java rename to app/src/main/java/com/arialyy/simple/test/TestFTPDirActivity.java index d8856485..74831170 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/TestFTPDirActivity.java @@ -17,9 +17,9 @@ import java.util.List; * Created by Administrator on 2018/4/12. */ -public class TestGroupActivity extends BaseActivity { +public class TestFTPDirActivity extends BaseActivity { List mUrls; - private static final String dir = "ftp://192.168.1.8:21/upload/测试"; + private static final String dir = "ftps://192.168.29.140:990/upload/测试"; @Override protected int setLayoutId() { return R.layout.activity_test; @@ -87,6 +87,10 @@ public class TestGroupActivity extends BaseActivity { .setGroupAlias("ftp文件夹下载") //.setSubTaskFileName(getModule(GroupModule.class).getSubName()) .login("lao", "123456") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") + .setStorePass("123456") .start(); break; case R.id.stop: diff --git a/aria/src/main/java/com/arialyy/aria/core/Configuration.java b/aria/src/main/java/com/arialyy/aria/core/Configuration.java index 99ffc7a3..09cc56c8 100644 --- a/aria/src/main/java/com/arialyy/aria/core/Configuration.java +++ b/aria/src/main/java/com/arialyy/aria/core/Configuration.java @@ -17,6 +17,7 @@ package com.arialyy.aria.core; import android.text.TextUtils; import com.arialyy.aria.core.common.QueueMod; +import com.arialyy.aria.core.queue.DownloadGroupTaskQueue; import com.arialyy.aria.core.queue.DownloadTaskQueue; import com.arialyy.aria.core.queue.UploadTaskQueue; import com.arialyy.aria.util.ALog; @@ -247,6 +248,21 @@ class Configuration { */ int iOTimeOut = 20 * 1000; + /** + * 设置最大下载/上传速度,单位:kb, 为0表示不限速 + */ + int maxSpeed = 0; + + public int getMaxSpeed() { + return maxSpeed; + } + + public BaseTaskConfig setMaxSpeed(int maxSpeed) { + this.maxSpeed = maxSpeed; + saveKey("maxSpeed", String.valueOf(maxSpeed)); + return this; + } + public long getUpdateInterval() { return updateInterval; } @@ -374,11 +390,6 @@ class Configuration { */ int threadNum = 3; - /** - * 设置最大下载速度,单位:kb, 为0表示不限速 - */ - int maxSpeed = 0; - /** * 多线程下载是否使用块下载模式,{@code true}使用,{@code false}不使用 * 注意: @@ -393,6 +404,13 @@ class Configuration { return useBlock; } + @Override public DownloadConfig setMaxSpeed(int maxSpeed) { + super.setMaxSpeed(maxSpeed); + DownloadTaskQueue.getInstance().setMaxSpeed(maxSpeed); + DownloadGroupTaskQueue.getInstance().setMaxSpeed(maxSpeed); + return this; + } + public DownloadConfig setUseBlock(boolean useBlock) { this.useBlock = useBlock; saveKey("useBlock", String.valueOf(useBlock)); @@ -407,17 +425,6 @@ class Configuration { return this; } - public int getMaxSpeed() { - return maxSpeed; - } - - public DownloadConfig setMaxSpeed(int maxSpeed) { - this.maxSpeed = maxSpeed; - saveKey("maxSpeed", String.valueOf(maxSpeed)); - DownloadTaskQueue.getInstance().setMaxSpeed(maxSpeed); - return this; - } - public DownloadConfig setThreadNum(int threadNum) { this.threadNum = threadNum; saveKey("threadNum", String.valueOf(threadNum)); @@ -478,6 +485,12 @@ class Configuration { loadConfig(); } + @Override public UploadConfig setMaxSpeed(int maxSpeed) { + super.setMaxSpeed(maxSpeed); + UploadTaskQueue.getInstance().setMaxSpeed(maxSpeed); + return this; + } + public UploadConfig setMaxTaskNum(int maxTaskNum) { oldMaxTaskNum = this.maxTaskNum; this.maxTaskNum = maxTaskNum; diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index f2c91750..af00d525 100644 --- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -29,7 +29,6 @@ import com.arialyy.aria.util.ALog; public class UploadTask extends AbsNormalTask { private static final String TAG = "UploadTask"; - private SimpleUploadUtil mUtil; private BaseUListener mListener; private UploadTask(UploadTaskEntity taskEntity, Handler outHandler) { From 343848b557495563e8e7cf02e6afba210c084b5e Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 16 Jul 2018 20:10:45 +0800 Subject: [PATCH 10/28] =?UTF-8?q?=E5=86=85=E5=AD=98=E5=8D=A1=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../downloader/FtpFileInfoThread.java | 12 +- .../downloader/HttpFileInfoThread.java | 6 + .../com/arialyy/aria/util/CommonUtil.java | 49 +++ .../java/com/arialyy/aria/util/FileUtil.java | 303 ++++++++++++++++++ .../arialyy/simple/test/AnyRunActivity.java | 8 +- .../arialyy/simple/test/AnyRunnModule.java | 2 +- 6 files changed, 374 insertions(+), 6 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java index 1e1ca043..3d8ab2f0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java @@ -15,11 +15,13 @@ */ package com.arialyy.aria.core.download.downloader; -import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; +import com.arialyy.aria.util.CommonUtil; +import org.apache.commons.net.ftp.FTPFile; /** * Created by Aria.Lao on 2017/7/25. @@ -31,6 +33,14 @@ class FtpFileInfoThread extends AbsFtpInfoThread dirs = FileUtil.getSDPathList(AriaManager.APP); + if (dirs == null || dirs.isEmpty()) { + return true; + } + for (String path : dirs) { + if (filePath.contains(path)) { + if (fileSize > 0 && fileSize > getAvailableExternalMemorySize(path)) { + return false; + } + } + } + return true; + } + + /** + * sdcard 可用大小 + * + * @param sdcardPath sdcard 根路径 + * @return 单位为:byte + */ + public static long getAvailableExternalMemorySize(String sdcardPath) { + StatFs stat = new StatFs(sdcardPath); + long blockSize = stat.getBlockSize(); + long availableBlocks = stat.getAvailableBlocks(); + return availableBlocks * blockSize; + } + + /** + * sdcard 总大小 + * + * @param sdcardPath sdcard 根路径 + * @return 单位为:byte + */ + public static long getTotalExternalMemorySize(String sdcardPath) { + StatFs stat = new StatFs(sdcardPath); + long blockSize = stat.getBlockSize(); + long totalBlocks = stat.getBlockCount(); + return totalBlocks * blockSize; + } + /** * 获取某包下所有类 * diff --git a/Aria/src/main/java/com/arialyy/aria/util/FileUtil.java b/Aria/src/main/java/com/arialyy/aria/util/FileUtil.java index 8732e99b..8fc0a22e 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/FileUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/FileUtil.java @@ -17,26 +17,43 @@ */ package com.arialyy.aria.util; +import android.app.ActivityManager; +import android.content.Context; +import android.os.Build; +import android.os.Environment; +import android.text.TextUtils; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.io.SequenceInputStream; +import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; /** * 文件操作工具类 */ public class FileUtil { private static final String TAG = "FileUtil"; + private static final Pattern DIR_SEPORATOR = Pattern.compile("/"); + private static final String EXTERNAL_STORAGE_PATH = + Environment.getExternalStorageDirectory().getPath(); /** * 合并文件 @@ -148,4 +165,290 @@ public class FileUtil { e.printStackTrace(); } } + + /** + * 获取SD卡目录列表 + */ + public static List getSDPathList(Context context) { + List paths; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + paths = getVolumeList(context); + if (paths == null || paths.isEmpty()) { + paths = getStorageDirectories(); + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + paths = getVolumeList(context); + } else { + List mounts = readMountsFile(); + List volds = readVoldFile(); + paths = compareMountsWithVold(mounts, volds); + } + return paths; + } + + /** + * getSDPathList + */ + private static List getVolumeList(final Context context) { + List pathList = null; + try { + android.os.storage.StorageManager manager = + (android.os.storage.StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + Method method = manager.getClass().getMethod("getVolumePaths"); + String[] paths = (String[]) method.invoke(manager); + pathList = Arrays.asList(paths); + } catch (Exception e) { + e.printStackTrace(); + } + if (pathList == null || pathList.isEmpty()) { + pathList = new ArrayList<>(); + pathList.add(EXTERNAL_STORAGE_PATH); + } + LinkedHashMap paths = new LinkedHashMap<>(); + for (String path : pathList) { + File root = new File(path); + if (!root.exists() || !root.isDirectory() || !canWrite(path)) { + continue; + } + //去除mount的相同目录 + int key = (root.getTotalSpace() + "-" + root.getUsableSpace()).hashCode(); + String prevPath = paths.get(key); + if (!TextUtils.isEmpty(prevPath) && prevPath.length() < path.length()) { + continue; + } + paths.put(key, path); + } + List list = new ArrayList<>(); + for (Integer key : paths.keySet()) { + list.add(paths.get(key)); + } + return list; + } + + private static boolean canWrite(String dirPath) { + File dir = new File(dirPath); + if (dir.canWrite()) { + return true; + } + boolean canWrite; + File testWriteFile = null; + try { + testWriteFile = new File(dirPath, "tw.txt"); + if (testWriteFile.exists()) { + testWriteFile.delete(); + } + testWriteFile.createNewFile(); + FileWriter writer = new FileWriter(testWriteFile); + writer.write(1); + writer.close(); + canWrite = true; + } catch (Exception e) { + e.printStackTrace(); + canWrite = false; + } finally { + try { + if (testWriteFile != null && testWriteFile.exists()) { + testWriteFile.delete(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return canWrite; + } + + /** + * Raturns all available SD-Cards in the system (include emulated) Warning: Hack! Based on Android source code of version 4.3 + * (API 18) Because there is no standard way to get it. TODO: Test on future Android versions 4.2+ + * + * @return paths to all available SD-Cards in the system (include emulated) + */ + public static List getStorageDirectories() { + // Final set of paths + final List rv = new ArrayList<>(); + // Primary physical SD-CARD (not emulated) + final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE"); + // All Secondary SD-CARDs (all exclude primary) separated by ":" + final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE"); + // Primary emulated SD-CARD + final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET"); + if (TextUtils.isEmpty(rawEmulatedStorageTarget)) { + // Device has physical external storage; use plain paths. + if (TextUtils.isEmpty(rawExternalStorage)) { + // EXTERNAL_STORAGE undefined; falling back to default. + rv.add("/storage/sdcard0"); + } else { + rv.add(rawExternalStorage); + } + } else { + // Device has emulated storage; external storage paths should have + // userId burned into them. + final String rawUserId; + + //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + final String path = Environment.getExternalStorageDirectory().getAbsolutePath(); + final String[] folders = DIR_SEPORATOR.split(path); + final String lastFolder = folders[folders.length - 1]; + boolean isDigit = false; + if (!TextUtils.isEmpty(lastFolder) && TextUtils.isDigitsOnly(lastFolder)) { + isDigit = true; + } + rawUserId = isDigit ? lastFolder : ""; + //} else { + // rawUserId = ""; + //} + // /storage/emulated/0[1,2,...] + if (TextUtils.isEmpty(rawUserId)) { + rv.add(rawExternalStorage); + } else { + rv.add(rawEmulatedStorageTarget + File.separator + rawUserId); + } + } + // Add all secondary storages + if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) { + // All Secondary SD-CARDs splited into array + final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator); + Collections.addAll(rv, rawSecondaryStorages); + } + // checkout SD-CARDs writable + for (int i = rv.size() - 1; i >= 0; i--) { + String path = rv.get(i); + File root = new File(path); + if (!root.exists() || !root.isDirectory() || !canWrite(path)) { + rv.remove(i); + } + } + return rv; + } + + /** + * Scan the /proc/mounts file and look for lines like this: /dev/block/vold/179:1 /mnt/sdcard vfat + * rw,dirsync,nosuid,nodev,noexec ,relatime,uid=1000,gid=1015,fmask=0602,dmask=0602,allow_utime=0020, + * codepage=cp437,iocharset= iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 When one is found, split it into its + * elements and then pull out the path to the that mount point and add it to the arraylist + */ + private static List readMountsFile() { + // some mount files don't list the default + // path first, so we add it here to + // ensure that it is first in our list + List mounts = new ArrayList<>(); + mounts.add(EXTERNAL_STORAGE_PATH); + try { + Scanner scanner = new Scanner(new File("/proc/mounts")); + while (scanner.hasNext()) { + String line = scanner.nextLine(); + if (line.startsWith("/dev/block/vold/") || line.startsWith("/dev/block//vold/")) {// + String[] lineElements = line.split(" "); + // String partition = lineElements[0]; + String element = lineElements[1]; + // don't add the default mount path + // it's already in the list. + if (!element.equals(EXTERNAL_STORAGE_PATH)) { + mounts.add(element); + } + } + } + scanner.close(); + } catch (Exception e) { + // e.printStackTrace(); + } + return mounts; + } + + private static List readVoldFile() { + // read /etc/vold.conf or /etc/vold.fstab (it depends on version what + // config file is present) + List vold = null; + Scanner scanner = null; + try { + try { + scanner = new Scanner(new File("/system/etc/vold.fstab")); + } catch (FileNotFoundException e1) { + // e1.printStackTrace(); + scanner = new Scanner(new File("/system/etc/vold.conf")); + } + vold = new ArrayList(); + vold.add(EXTERNAL_STORAGE_PATH); + while (scanner.hasNext()) { + String line = scanner.nextLine(); + if (TextUtils.isEmpty(line)) { + continue; + } + line = line.trim(); + if (line.startsWith("dev_mount")) { + String[] lineElements = line.split(" "); + if (lineElements.length < 3) { + continue; + } + String element = lineElements[2]; + if (element.contains(":")) { + element = element.substring(0, element.indexOf(":")); + } + // ignore default path + if (!element.equals(EXTERNAL_STORAGE_PATH)) { + vold.add(element); + } + } else if (line.startsWith("mount_point")) { + String element = line.replaceAll("mount_point", "").trim(); + if (!element.equals(EXTERNAL_STORAGE_PATH)) { + vold.add(element); + } + } + } + } catch (Exception e) { + // e.printStackTrace(); + } + return vold; + } + + private static List compareMountsWithVold(List mounts, List volds) { + /* + * 有时候这两个list中的数据并不相同,我们只需要取两个list的交集部分。 + */ + for (int i = mounts.size() - 1; i >= 0; i--) { + String mount = mounts.get(i); + File root = new File(mount); + // 判断目录是否存在并且可读 + if (!root.exists() || !root.isDirectory() || !root.canWrite()) { + mounts.remove(i); + continue; + } + if (volds != null && !volds.contains(mount)) { + mounts.remove(i); + } + } + // 清除无用数据 + if (volds != null) { + volds.clear(); + } + return mounts; + } + + public static long getTotalMemory() { + String file_path = "/proc/meminfo";// 系统内存信息文件 + String ram_info; + String[] arrayOfRam; + long initial_memory = 0L; + try { + FileReader fr = new FileReader(file_path); + BufferedReader localBufferedReader = new BufferedReader(fr, 8192); + // 读取meminfo第一行,系统总内存大小 + ram_info = localBufferedReader.readLine(); + arrayOfRam = ram_info.split("\\s+");// 实现多个空格切割的效果 + initial_memory = + Integer.valueOf(arrayOfRam[1]) * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte + localBufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return initial_memory; + } + + public static long getAvailMemory(Context context) { + ActivityManager activityManager = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); + activityManager.getMemoryInfo(memoryInfo); + return memoryInfo.availMem; + } } diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index 2df1eb6a..4dcc4cb8 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -21,14 +21,14 @@ public class AnyRunActivity extends BaseActivity { AnyRunnModule module; String[] urls; int index = 0; - //String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; + String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; //String URL = "http://58.213.157.242:8081/sims_file/rest/v1/file/mshd_touchscreen_ms/guideFile/41c33556-dc4a-4d78-bb76-b9f627f94448.mp4/%E5%85%AB%E5%8D%A6%E6%B4%B2%E5%8D%97%E4%BA%AC%E5%86%9C%E4%B8%9A%E5%98%89%E5%B9%B4%E5%8D%8E0511.mp4"; //String URL = "http://d1.showself.com/download/showself_android-s236279_release.apk"; //String URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; - String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; + //String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; @@ -51,8 +51,8 @@ public class AnyRunActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - //module.start(URL); - module.startFtp(URL); + module.start(URL); + //module.startFtp(URL); break; case R.id.stop: module.stop(URL); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index 1af461d3..6ca15480 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -64,7 +64,7 @@ public class AnyRunnModule { void start(String url) { mUrl = url; - String path = Environment.getExternalStorageDirectory().getPath() + "/mmm.mp4"; + String path = Environment.getExternalStorageDirectory().getPath() + "/mmm1.mp4"; Aria.download(this) .load(url) .setRequestMode(RequestEnum.GET) From d61417537b91433993e09c85ff61c3f2467d65da Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Tue, 17 Jul 2018 21:13:50 +0800 Subject: [PATCH 11/28] 3.4.8 --- .../aria/core/download/FtpDirDownloadTarget.java | 10 ++++++++++ .../aria/core/download/FtpDownloadTarget.java | 16 ++++++++++++++++ .../aria/core/upload/BaseNormalTarget.java | 10 ++++++++++ DEV_LOG.md | 7 ++++--- README.md | 13 +++++++++---- app/src/main/AndroidManifest.xml | 4 ++-- .../com/arialyy/simple/test/TestFTPActivity.java | 6 +++--- build.gradle | 2 +- 8 files changed, 55 insertions(+), 13 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java index d18b90dd..4d0f2a5c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java @@ -79,6 +79,16 @@ public class FtpDirDownloadTarget extends BaseGroupTarget } } } + if (mTaskEntity.getUrlEntity().isFtps) { + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().storePath)) { + ALog.e(TAG, "证书路径为空"); + return false; + } + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().keyAlias)) { + ALog.e(TAG, "证书别名为空"); + return false; + } + } return b; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java index 8494ec20..1c19c66c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java @@ -17,10 +17,12 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; +import android.text.TextUtils; import com.arialyy.aria.core.common.ftp.FTPSConfig; import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; +import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import java.net.Proxy; @@ -61,6 +63,20 @@ public class FtpDownloadTarget extends BaseNormalTarget return new FTPSConfig<>(this); } + @Override protected boolean checkEntity() { + if (mTaskEntity.getUrlEntity().isFtps){ + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().storePath)){ + ALog.e(TAG, "证书路径为空"); + return false; + } + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().keyAlias)){ + ALog.e(TAG, "证书别名为空"); + return false; + } + } + return super.checkEntity(); + } + /** * 设置文件保存文件夹路径 * diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java index 805bc1e5..b56ad759 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java @@ -80,6 +80,16 @@ abstract class BaseNormalTarget mEntity.save(); mTaskEntity.save(); } + if (mTaskEntity.getUrlEntity().isFtps) { + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().storePath)) { + ALog.e(TAG, "证书路径为空"); + return false; + } + if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().keyAlias)) { + ALog.e(TAG, "证书别名为空"); + return false; + } + } return b; } diff --git a/DEV_LOG.md b/DEV_LOG.md index 2f0f0626..a4c11901 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,9 +1,10 @@ ## 开发日志 + v_3.4.8 - - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) + - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/update_url.html) - 出于安全考虑,FTP数据库去掉密码的保存 - - 增加FTPS支持 [see]() - - 增加速度限制支持[see]() + - 增加FTPS支持 [see](https://aria.laoyuyu.me/aria_doc/download/ftps.html) + - 增加速度限制支持[see](https://aria.laoyuyu.me/aria_doc/api/speed_handle.html) + - 增加内存空间不足验证 + v_3.4.7 - 修复分块任务异常操作导致的问题 + v_3.4.6 diff --git a/README.md b/README.md index 9a9668aa..e4e13d78 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Aria有以下特点: - 支持HTTP任务组\FTP文件夹,断点续传下载 - 支持HTTP表单上传 - 支持文件FTP断点续传上传 + - 支持FTPS/SFTP断点续传,[see](https://aria.laoyuyu.me/aria_doc/download/ftps.html) + 支持https地址下载 - 在配置文件中很容易就可以设置CA证书的信息 + 支持[多线程分块下载](https://aria.laoyuyu.me/aria_doc/start/config.html),能更有效的发挥机器IO性能 @@ -31,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.7' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.7' +compile 'com.arialyy.aria:aria-core:3.4.8' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.8' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` @@ -100,8 +101,12 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.4.7 - - 修复分块任务异常操作导致的问题 + + v_3.4.8 + - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/update_url.html) + - 出于安全考虑,FTP数据库去掉密码的保存 + - 增加FTPS支持 [see](https://aria.laoyuyu.me/aria_doc/download/ftps.html) + - 增加速度限制支持[see](https://aria.laoyuyu.me/aria_doc/api/speed_handle.html) + - 增加内存空间不足验证 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36686969..c29c9966 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,9 +17,9 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java index 7be6bf1b..3ca181e2 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java @@ -6,6 +6,7 @@ import android.util.Log; import android.view.View; import com.arialyy.annotations.Upload; import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.common.ProtocolType; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.upload.UploadTask; import com.arialyy.aria.util.ALog; @@ -83,9 +84,8 @@ public class TestFTPActivity extends BaseActivity { .setUploadUrl(URL) .setExtendField("韩寒哈大双") .asFtps() - .setStorePath("/mnt/sdcard/Download/server.crt") - .setAlias("www.laoyuyu.me") - .setStorePass("123456") + //.setStorePath("/mnt/sdcard/Download/server.crt") + //.setAlias("www.laoyuyu.me") .start(); //Uri uri = Uri.parse("ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"); //ALog.d(TAG, "sh = " + uri.getScheme() + ", user = " + uri.getUserInfo() + ", host = " + uri.getHost() + ", port = " + uri.getPort() + " remotePath = " + uri.getPath()); diff --git a/build.gradle b/build.gradle index 2c1ceeb5..5f5e6e62 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.7' + publishVersion = '3.4.8' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 5f4df90f73ce65a0fed255ab6d152cca52431507 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Tue, 24 Jul 2018 21:46:14 +0800 Subject: [PATCH 12/28] fix bug https://github.com/AriaLyy/Aria/issues/275 --- .../main/java/com/arialyy/aria/orm/AbsDelegate.java | 13 +++++++------ .../java/com/arialyy/aria/orm/DelegateFind.java | 8 ++++++-- .../java/com/arialyy/aria/util/SSLContextUtil.java | 3 +++ DEV_LOG.md | 2 ++ README.md | 4 ++-- app/src/main/AndroidManifest.xml | 4 ++-- .../com/arialyy/simple/test/AnyRunActivity.java | 4 ++-- build.gradle | 2 +- 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/orm/AbsDelegate.java b/Aria/src/main/java/com/arialyy/aria/orm/AbsDelegate.java index 0fc7e88c..eafac17d 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/AbsDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/AbsDelegate.java @@ -18,7 +18,6 @@ package com.arialyy.aria.orm; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v4.util.LruCache; -import android.text.TextUtils; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import java.lang.reflect.Field; @@ -134,11 +133,13 @@ abstract class AbsDelegate { } void closeCursor(Cursor cursor) { - if (cursor != null && !cursor.isClosed()) { - try { - cursor.close(); - } catch (android.database.SQLException e) { - e.printStackTrace(); + synchronized (AbsDelegate.class) { + if (cursor != null && !cursor.isClosed()) { + try { + cursor.close(); + } catch (android.database.SQLException e) { + e.printStackTrace(); + } } } } diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java b/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java index 81c8a85d..e292a67f 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java @@ -201,7 +201,7 @@ class DelegateFind extends AbsDelegate { * @param pColumnAlias 关联查询父表别名 * @param cColumnAlias 关联查询子表别名 */ - private List newInstanceEntity( + private synchronized List newInstanceEntity( Class clazz, Class

parent, Class child, Cursor cursor, @@ -373,7 +373,7 @@ class DelegateFind extends AbsDelegate { /** * 根据数据游标创建一个具体的对象 */ - private List newInstanceEntity(Class clazz, Cursor cursor) { + private synchronized List newInstanceEntity(Class clazz, Cursor cursor) { List fields = CommonUtil.getAllFields(clazz); List entitys = new ArrayList<>(); if (fields != null && fields.size() > 0) { @@ -419,6 +419,10 @@ class DelegateFind extends AbsDelegate { */ private void setFieldValue(Class type, Field field, int column, Cursor cursor, Object entity) throws IllegalAccessException { + if (cursor == null || cursor.isClosed()) { + ALog.e(TAG, "cursor没有初始化"); + return; + } if (type == String.class) { String temp = cursor.getString(column); if (!TextUtils.isEmpty(temp)) { diff --git a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java index 0e5f7b48..b6a9427d 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java @@ -58,6 +58,9 @@ public class SSLContextUtil { */ public static SSLContext getSSLContextFromAssets(String caAlias, String caPath, @ProtocolType String protocol) { + if (TextUtils.isEmpty(caAlias) || TextUtils.isEmpty(caPath)){ + return null; + } try { String cacheKey = getCacheKey(caAlias, caPath); SSLContext sslContext = SSL_CACHE.get(cacheKey); diff --git a/DEV_LOG.md b/DEV_LOG.md index a4c11901..1760c145 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,6 @@ ## 开发日志 + + v_3.4.9 + - fix bug https://github.com/AriaLyy/Aria/issues/276 + v_3.4.8 - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/update_url.html) - 出于安全考虑,FTP数据库去掉密码的保存 diff --git a/README.md b/README.md index e4e13d78..0c57ecc4 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.8' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.8' +compile 'com.arialyy.aria:aria-core:3.4.9' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.9' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c29c9966..87d31608 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,11 +15,11 @@ android:theme="@style/AppTheme.NoActionBar"> - + diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index 4dcc4cb8..4a903a86 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -21,12 +21,12 @@ public class AnyRunActivity extends BaseActivity { AnyRunnModule module; String[] urls; int index = 0; - String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; + //String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; //String URL = "http://58.213.157.242:8081/sims_file/rest/v1/file/mshd_touchscreen_ms/guideFile/41c33556-dc4a-4d78-bb76-b9f627f94448.mp4/%E5%85%AB%E5%8D%A6%E6%B4%B2%E5%8D%97%E4%BA%AC%E5%86%9C%E4%B8%9A%E5%98%89%E5%B9%B4%E5%8D%8E0511.mp4"; //String URL = "http://d1.showself.com/download/showself_android-s236279_release.apk"; //String URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; - //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; + String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; //String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; diff --git a/build.gradle b/build.gradle index 5f5e6e62..f7206410 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.8' + publishVersion = '3.4.9' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From a63222a220747b40893909b81f22ffae4605a843 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 17 Aug 2018 21:38:10 +0800 Subject: [PATCH 13/28] fix bug https://github.com/AriaLyy/Aria/issues/288 https://github.com/AriaLyy/Aria/issues/282 --- .../arialyy/aria/core/common/ProxyHelper.java | 2 +- .../aria/core/download/BaseNormalTarget.java | 2 +- .../aria/core/download/DownloadReceiver.java | 18 +++++++++--------- .../core/download/downloader/AbsGroupUtil.java | 9 +++++---- .../aria/core/manager/ThreadTaskManager.java | 4 ++++ .../aria/core/scheduler/AbsSchedulers.java | 1 + .../aria/core/upload/UploadReceiver.java | 11 ++++++++--- .../com/arialyy/aria/orm/DelegateUpdate.java | 6 +++--- .../java/com/arialyy/aria/util/CommonUtil.java | 11 +++++++---- DEV_LOG.md | 5 +++++ README.md | 13 +++++-------- app/src/main/AndroidManifest.xml | 4 ++-- .../simple/download/SingleTaskActivity.java | 7 +++++-- .../arialyy/simple/test/AnyRunActivity.java | 3 ++- .../com/arialyy/simple/test/AnyRunnModule.java | 10 +++++----- .../arialyy/simple/test/TestFTPActivity.java | 5 ++--- build.gradle | 2 +- 17 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java index 8dd0e254..a1d64f23 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProxyHelper.java @@ -49,7 +49,7 @@ public class ProxyHelper { public static int PROXY_TYPE_UPLOAD = 0x04; public Set downloadCounter = new HashSet<>(), uploadCounter = new HashSet<>(), downloadGroupCounter = new HashSet<>(), downloadGroupSubCounter = new HashSet<>(); - private Map> mProxyCache = new ConcurrentHashMap<>(); + public Map> mProxyCache = new ConcurrentHashMap<>(); public static volatile ProxyHelper INSTANCE = null; private boolean canLoadClass = false; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java index b272d294..154ecd1e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java @@ -86,7 +86,7 @@ abstract class BaseNormalTarget * @return {@code true}任务存在 */ @Override public boolean taskExists() { - return DownloadTaskQueue.getInstance().getTask(mEntity.getUrl()) != null; + return DownloadTaskQueue.getInstance().getTask(mEntity.getKey()) != null; } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index 143c0a69..b3c84d77 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -206,15 +206,15 @@ public class DownloadReceiver extends AbsReceiver { ALog.e(TAG, String.format("【%s】观察者为空", targetName)); return; } - Set dCounter = ProxyHelper.getInstance().downloadCounter; - Set dgCounter = ProxyHelper.getInstance().downloadGroupCounter; - Set dgsCounter = ProxyHelper.getInstance().downloadGroupSubCounter; - if (dCounter != null && dCounter.contains(targetName)) { - DownloadSchedulers.getInstance().unRegister(obj); - } - if (dgCounter != null && dgCounter.contains(targetName) || (dgsCounter != null - && dgsCounter.contains(targetName))) { - DownloadGroupSchedulers.getInstance().unRegister(obj); + Set set = ProxyHelper.getInstance().mProxyCache.get(obj.getClass().getName()); + if (set != null) { + for (Integer integer : set) { + if (integer == ProxyHelper.PROXY_TYPE_DOWNLOAD) { + DownloadSchedulers.getInstance().unRegister(obj); + } else if (integer == ProxyHelper.PROXY_TYPE_DOWNLOAD_GROUP) { + DownloadGroupSchedulers.getInstance().unRegister(obj); + } + } } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 03a1b21b..9e9ed848 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -63,22 +64,22 @@ public abstract class AbsGroupUtil implements IUtil { /** * 保存所有没有下载完成的任务,key为下载地址 */ - Map mExeMap = new HashMap<>(); + Map mExeMap = new ConcurrentHashMap<>(); /** * 下载失败的映射表,key为下载地址 */ - Map mFailMap = new HashMap<>(); + Map mFailMap = new ConcurrentHashMap<>(); /** * 该任务组对应的所有任务 */ - private Map mTasksMap = new HashMap<>(); + private Map mTasksMap = new ConcurrentHashMap<>(); /** * 下载器映射表,key为下载地址 */ - private Map mDownloaderMap = new HashMap<>(); + private Map mDownloaderMap = new ConcurrentHashMap<>(); /** * 是否需要读取文件长度,{@code true}需要 diff --git a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java new file mode 100644 index 00000000..d0ccb984 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java @@ -0,0 +1,4 @@ +package com.arialyy.aria.core.manager; + +public class ThreadTaskManager { +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java index ceb1a5c6..46831b45 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java +++ b/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java @@ -259,6 +259,7 @@ abstract class AbsSchedulers dCounter = ProxyHelper.getInstance().uploadCounter; - if (dCounter != null && dCounter.contains(targetName)) { - UploadSchedulers.getInstance().unRegister(obj); + + Set set = ProxyHelper.getInstance().mProxyCache.get(obj.getClass().getName()); + if (set != null) { + for (Integer integer : set) { + if (integer == ProxyHelper.PROXY_TYPE_UPLOAD) { + UploadSchedulers.getInstance().unRegister(obj); + } + } } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DelegateUpdate.java b/Aria/src/main/java/com/arialyy/aria/orm/DelegateUpdate.java index f1a87b81..66239fb9 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DelegateUpdate.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DelegateUpdate.java @@ -82,7 +82,7 @@ class DelegateUpdate extends AbsDelegate { /** * 删除某条数据 */ - void delData(SQLiteDatabase db, Class clazz, String... expression) { + synchronized void delData(SQLiteDatabase db, Class clazz, String... expression) { db = checkDb(db); CheckUtil.checkSqlExpression(expression); @@ -101,7 +101,7 @@ class DelegateUpdate extends AbsDelegate { /** * 修改某行数据 */ - void modifyData(SQLiteDatabase db, DbEntity dbEntity) { + synchronized void modifyData(SQLiteDatabase db, DbEntity dbEntity) { db = checkDb(db); Class clazz = dbEntity.getClass(); List fields = CommonUtil.getAllFields(clazz); @@ -141,7 +141,7 @@ class DelegateUpdate extends AbsDelegate { /** * 插入数据 */ - void insertData(SQLiteDatabase db, DbEntity dbEntity) { + synchronized void insertData(SQLiteDatabase db, DbEntity dbEntity) { db = checkDb(db); Class clazz = dbEntity.getClass(); List fields = CommonUtil.getAllFields(clazz); diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index 326c406d..3d33e56c 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -502,11 +502,14 @@ public class CommonUtil { } } } - File dir = new File(groupEntity.getDirPath()); - if (dir.exists() && (removeFile || !groupEntity.isComplete())) { - dir.delete(); + + if (!TextUtils.isEmpty(groupEntity.getDirPath())) { + File dir = new File(groupEntity.getDirPath()); + if (dir.exists() && (removeFile || !groupEntity.isComplete())) { + dir.delete(); + } + groupEntity.deleteData(); } - groupEntity.deleteData(); } /** diff --git a/DEV_LOG.md b/DEV_LOG.md index 1760c145..1143fec3 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,9 @@ ## 开发日志 + + v_3.4.11 + - fix bug https://github.com/AriaLyy/Aria/issues/288 + - fix bug https://github.com/AriaLyy/Aria/issues/282 + + v_3.4.10 + - fix bug https://github.com/AriaLyy/Aria/issues/280 + v_3.4.9 - fix bug https://github.com/AriaLyy/Aria/issues/276 + v_3.4.8 diff --git a/README.md b/README.md index 0c57ecc4..cf24cb27 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.9' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.9' +compile 'com.arialyy.aria:aria-core:3.4.11' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.11' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` @@ -101,12 +101,9 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.4.8 - - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/update_url.html) - - 出于安全考虑,FTP数据库去掉密码的保存 - - 增加FTPS支持 [see](https://aria.laoyuyu.me/aria_doc/download/ftps.html) - - 增加速度限制支持[see](https://aria.laoyuyu.me/aria_doc/api/speed_handle.html) - - 增加内存空间不足验证 + + v_3.4.11 + - fix bug https://github.com/AriaLyy/Aria/issues/288 + - fix bug https://github.com/AriaLyy/Aria/issues/282 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 87d31608..314d14ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,10 +16,10 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 7093e227..0bb2cc84 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -33,6 +33,7 @@ import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.download.DownloadTarget; import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.aria.core.inf.IEntity; +import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import com.arialyy.frame.util.show.L; import com.arialyy.frame.util.show.T; @@ -130,6 +131,7 @@ public class SingleTaskActivity extends BaseActivity { } @Download.onTaskRunning protected void running(DownloadTask task) { + ALog.d(TAG, String.format("%s_running_%s", getClass().getName(), hashCode())); if (task.getKey().equals(DOWNLOAD_URL)) { //Log.d(TAG, task.getKey()); long len = task.getFileSize(); @@ -220,8 +222,9 @@ public class SingleTaskActivity extends BaseActivity { startD(); break; case R.id.stop: - Aria.download(this).load(DOWNLOAD_URL).stop(); - //startActivity(new Intent(this, SingleTaskActivity.class)); + //Aria.download(this).load(DOWNLOAD_URL).stop(); + startActivity(new Intent(this, SingleTaskActivity.class)); + Aria.download(this).unRegister(); //Aria.download(this).load(DOWNLOAD_URL).removeRecord(); break; case R.id.cancel: diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index 4a903a86..8433f960 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -26,11 +26,12 @@ public class AnyRunActivity extends BaseActivity { //String URL = "http://d1.showself.com/download/showself_android-s236279_release.apk"; //String URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; - String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; + //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; //String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; + String URL = "https://app-dl.byfen.com//app//201810//ef0400d637e768e9c630b4d38633ee06.zip"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; //private String URL = "http://cn-hbsjz-cmcc-v-03.acgvideo.com/upgcxcode/63/82/5108263/5108263-1-80.flv?expires=1530178500&platform=pc&ssig=vr7gLl0duyqWqSMnIpzaDA&oi=3746029570&nfa=BpfiWF+i4mNW8KzjZFHzBQ==&dynamic=1&hfa=2030547937&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=&trid=3476be01a9254115b15f8cc7198600fe&nfc=1"; diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index 6ca15480..5388313f 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -64,7 +64,7 @@ public class AnyRunnModule { void start(String url) { mUrl = url; - String path = Environment.getExternalStorageDirectory().getPath() + "/mmm1.mp4"; + String path = Environment.getExternalStorageDirectory().getPath() + "/mmm2.mp4"; Aria.download(this) .load(url) .setRequestMode(RequestEnum.GET) @@ -79,10 +79,10 @@ public class AnyRunnModule { .loadFtp(url) .login("lao", "123456") .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/Download/") - .asFtps() - .setStorePath("/mnt/sdcard/Download/server.crt") - .setAlias("www.laoyuyu.me") - .setStorePass("123456") + //.asFtps() + //.setStorePath("/mnt/sdcard/Download/server.crt") + //.setAlias("www.laoyuyu.me") + //.setStorePass("123456") .start(); } diff --git a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java index 3ca181e2..39747303 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java @@ -25,7 +25,7 @@ public class TestFTPActivity extends BaseActivity { //String URL = "http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 //private final String URL = "ftp://192.168.1.3:21/download//AriaPrj.rar"; private final String FILE_PATH = "/mnt/sdcard/mmm.mp4"; - private final String URL = "ftps://192.168.29.140:990/aa/你好"; + private final String URL = "ftps://9.9.9.59:990/aa/你好"; @Override protected int setLayoutId() { @@ -82,8 +82,7 @@ public class TestFTPActivity extends BaseActivity { .loadFtp(FILE_PATH) .login("lao", "123456") .setUploadUrl(URL) - .setExtendField("韩寒哈大双") - .asFtps() + //.asFtps() //.setStorePath("/mnt/sdcard/Download/server.crt") //.setAlias("www.laoyuyu.me") .start(); diff --git a/build.gradle b/build.gradle index f7206410..5cadcae4 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.9' + publishVersion = '3.4.11' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 6d5398de40aacdf1070df573d5c325fc987a4bb5 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 17 Aug 2018 22:38:49 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/AbsFileer.java | 49 +------- .../aria/core/common/AbsThreadTask.java | 7 +- .../aria/core/common/ThreadTaskManager.java | 78 ------------ .../download/downloader/FtpThreadTask.java | 15 +-- .../download/downloader/HttpThreadTask.java | 11 +- .../aria/core/manager/ThreadTaskManager.java | 112 ++++++++++++++++++ .../core/upload/uploader/FtpThreadTask.java | 11 +- .../core/upload/uploader/HttpThreadTask.java | 7 +- .../simple/download/SingleTaskActivity.java | 6 +- 9 files changed, 151 insertions(+), 145 deletions(-) delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ThreadTaskManager.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 91fbc955..cae8612f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -22,6 +22,7 @@ import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsNormalEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IEventListener; +import com.arialyy.aria.core.manager.ThreadTaskManager; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; @@ -36,8 +37,6 @@ import java.util.Properties; import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Created by AriaL on 2017/7/1. @@ -63,7 +62,6 @@ public abstract class AbsFileer keys = mTask.keySet(); - //for (Integer key : keys) { - // AbsThreadTask task = mTask.get(key); - // if (task != null && !task.isThreadComplete()) { - // - // task.getConfig().START_LOCATION = task.getConfig().THREAD_RECORD.startLocation; - // mConstance.resetState(); - // startTimer(); - // ALog.d(TAG, String.format("任务【%s】开始重试,线程__%s__【开始位置:%s,结束位置:%s】", mEntity.getFileName(), - // key, task.getConfig().START_LOCATION, task.getConfig().END_LOCATION)); - // if (!mFixedThreadPool.isShutdown()) { - // mFixedThreadPool.execute(task); - // } else { - // ALog.w(TAG, "线程池已关闭"); - // mListener.onFail(true); - // } - // } - //} } /** @@ -707,8 +669,7 @@ public abstract class AbsFileer> - implements Runnable { + implements Callable { /** * 线程重试次数 */ @@ -352,7 +354,8 @@ public abstract class AbsThreadTask> mThreadTasks = new ConcurrentHashMap<>(); - - private ThreadTaskManager() { - - } - - public static ThreadTaskManager getInstance() { - if (INSTANCE == null) { - synchronized (ThreadTaskManager.class) { - INSTANCE = new ThreadTaskManager(); - } - } - return INSTANCE; - } - - /** - * 添加单条线程记录 - * - * @param key 任务对应的key - * @param threadTask 线程任务 - */ - public void addTask(String key, AbsThreadTask threadTask) { - if (mThreadTasks.get(key) == null) { - mThreadTasks.put(key, new ArrayList()); - } - mThreadTasks.get(key).add(threadTask); - } - - /** - * 删除对应的任务的线程记录 - * - * @param key 任务对应的key - */ - public void removeTask(String key) { - for (Iterator>> iter = mThreadTasks.entrySet().iterator(); - iter.hasNext(); ) { - Map.Entry> entry = iter.next(); - if (key.equals(entry.getKey())) { - List list = mThreadTasks.get(key); - if (list != null && !list.isEmpty()) { - list.clear(); - } - iter.remove(); - } - } - } - - - -} diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index 314a7230..bbaa67ed 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -53,10 +53,10 @@ class FtpThreadTask extends AbsFtpThreadTask isBlock = STATE.TASK_RECORD.isBlock; } - @Override public void run() { + @Override public DownloadTaskEntity call() throws Exception { if (mConfig.THREAD_RECORD.isComplete) { handleComplete(); - return; + return mTaskEntity; } mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -69,7 +69,7 @@ class FtpThreadTask extends AbsFtpThreadTask client = createClient(); if (client == null) { fail(mChildCurrentLocation, "ftp client 创建失败", null); - return; + return mTaskEntity; } if (mConfig.START_LOCATION > 0) { client.setRestartOffset(mConfig.START_LOCATION); @@ -81,7 +81,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取文件信息错误,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return; + return mTaskEntity; } String remotePath = new String(mTaskEntity.getUrlEntity().remotePath.getBytes(charSet), SERVER_CHARSET); @@ -93,7 +93,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取流失败,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return; + return mTaskEntity; } if (isOpenDynamicFile) { @@ -118,6 +118,7 @@ class FtpThreadTask extends AbsFtpThreadTask e.printStackTrace(); } } + return mTaskEntity; } /** @@ -164,7 +165,7 @@ class FtpThreadTask extends AbsFtpThreadTask foc = fos.getChannel(); fic = Channels.newChannel(is); ByteBuffer bf = ByteBuffer.allocate(mBufSize); - while ((len = fic.read(bf)) != -1) { + while (!Thread.currentThread().isInterrupted() && (len = fic.read(bf)) != -1) { if (isBreak()) { break; } @@ -215,7 +216,7 @@ class FtpThreadTask extends AbsFtpThreadTask file.seek(mConfig.START_LOCATION); byte[] buffer = new byte[mBufSize]; int len; - while ((len = is.read(buffer)) != -1) { + while (!Thread.currentThread().isInterrupted() && (len = is.read(buffer)) != -1) { if (isBreak()) { break; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 9e75a3f4..9bc2ec5b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -33,6 +33,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.Channels; +import java.nio.channels.ClosedByInterruptException; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; @@ -56,10 +57,10 @@ final class HttpThreadTask extends AbsThreadTask> mThreadTasks = new HashMap<>(); + + public static ThreadTaskManager getInstance() { + if (INSTANCE == null) { + synchronized (LOCK) { + INSTANCE = new ThreadTaskManager(); + } + } + return INSTANCE; + } + + private ThreadTaskManager() { + mExePool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + } + + /** + * 启动线程任务 + * + * @param key 任务对应的key{@link AbsTaskEntity#getKey()} + * @param threadTask 线程任务{@link AbsThreadTask} + */ + public void startThread(String key, AbsThreadTask threadTask) { + if (mExePool.isShutdown()) { + ALog.e(TAG, "线程池已经关闭"); + return; + } + key = getKey(key); + Set temp = mThreadTasks.get(key); + if (temp == null) { + temp = new HashSet<>(); + mThreadTasks.put(key, temp); + } + temp.add(mExePool.submit(threadTask)); + } + + /** + * 停止任务的所有线程 + * + * @param key 任务对应的key{@link AbsTaskEntity#getKey()} + */ + public void stopTaskThread(String key) { + if (mExePool.isShutdown()) { + ALog.e(TAG, "线程池已经关闭"); + return; + } + Set temp = mThreadTasks.get(getKey(key)); + for (Future future : temp) { + if (future.isDone() || future.isCancelled()) { + continue; + } + future.cancel(true); + } + mThreadTasks.remove(key); + } + + /** + * 重试线程任务 + * + * @param task 线程任务 + */ + public void retryThread(AbsThreadTask task) { + if (mExePool.isShutdown()) { + ALog.e(TAG, "线程池已经关闭"); + return; + } + mExePool.submit(task); + } + + /** + * map中的key + * + * @param key 任务的key{@link AbsTaskEntity#getKey()} + * @return 转换后的map中的key + */ + private String getKey(String key) { + return CommonUtil.getStrMd5(key); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index bfb59627..c3a233f6 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -50,7 +50,7 @@ class FtpThreadTask extends AbsFtpThreadTask { return mAridManager.getUploadConfig().getMaxSpeed(); } - @Override public void run() { + @Override public UploadTaskEntity call() throws Exception { //当前子线程的下载位置 mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -60,7 +60,9 @@ class FtpThreadTask extends AbsFtpThreadTask { String.format("任务【%s】线程__%s__开始上传【开始位置 : %s,结束位置:%s】", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID, mConfig.START_LOCATION, mConfig.END_LOCATION)); client = createClient(); - if (client == null) return; + if (client == null) { + return mTaskEntity; + } initPath(); client.makeDirectory(dir); client.changeWorkingDirectory(dir); @@ -69,7 +71,7 @@ class FtpThreadTask extends AbsFtpThreadTask { if (!FTPReply.isPositivePreliminary(reply) && reply != FTPReply.FILE_ACTION_OK) { fail(mChildCurrentLocation, "上传失败,错误码为:" + reply + ",msg:" + client.getReplyString(), null); client.disconnect(); - return; + return mTaskEntity; } file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize); @@ -79,7 +81,7 @@ class FtpThreadTask extends AbsFtpThreadTask { } upload(client, file); if (isBreak()) { - return; + return mTaskEntity; } ALog.i(TAG, String.format("任务【%s】线程__%s__上传完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID)); @@ -110,6 +112,7 @@ class FtpThreadTask extends AbsFtpThreadTask { e.printStackTrace(); } } + return mTaskEntity; } private void initPath() throws UnsupportedEncodingException { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index 822ba74e..1978b9ed 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -57,12 +57,12 @@ class HttpThreadTask extends AbsThreadTask { isNotNetRetry = mAridManager.getUploadConfig().isNotNetRetry(); } - @Override public void run() { + @Override public UploadTaskEntity call() throws Exception { File uploadFile = new File(mEntity.getFilePath()); if (!uploadFile.exists()) { ALog.e(TAG, String.format("【%s】,文件不存在。", mEntity.getFilePath())); fail(); - return; + return mTaskEntity; } mListener.onPre(); URL url; @@ -103,6 +103,7 @@ class HttpThreadTask extends AbsThreadTask { e.printStackTrace(); fail(); } + return mTaskEntity; } private void fail() { @@ -199,7 +200,7 @@ class HttpThreadTask extends AbsThreadTask { if (status == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(mHttpConn.getInputStream())); String line; - while ((line = reader.readLine()) != null) { + while (!Thread.currentThread().isInterrupted() && (line = reader.readLine()) != null) { response.append(line); } reader.close(); diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 0bb2cc84..53c76670 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -222,9 +222,9 @@ public class SingleTaskActivity extends BaseActivity { startD(); break; case R.id.stop: - //Aria.download(this).load(DOWNLOAD_URL).stop(); - startActivity(new Intent(this, SingleTaskActivity.class)); - Aria.download(this).unRegister(); + Aria.download(this).load(DOWNLOAD_URL).stop(); + //startActivity(new Intent(this, SingleTaskActivity.class)); + //Aria.download(this).unRegister(); //Aria.download(this).load(DOWNLOAD_URL).removeRecord(); break; case R.id.cancel: From 7f975b2e915d3937ffe15c98147ed335a422cc55 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 20 Aug 2018 22:03:05 +0800 Subject: [PATCH 15/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dkotlin=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6ide=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=20https://github.com/AriaL?= =?UTF-8?q?yy/Aria/issues/286?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/AbsFileer.java | 15 +++----- .../aria/core/common/AbsThreadTask.java | 37 +++++-------------- .../aria/core/common/BandwidthLimiter.java | 2 +- .../core/download/DownloadGroupTarget.java | 4 +- .../download/downloader/AbsGroupUtil.java | 14 +------ .../download/downloader/HttpThreadTask.java | 5 +-- .../aria/core/manager/ThreadTaskManager.java | 28 ++++++++++---- .../java/org/apache/commons/net/io/Util.java | 2 +- DEV_LOG.md | 3 ++ README.md | 10 ++--- app/build.gradle | 6 +-- app/src/main/AndroidManifest.xml | 5 ++- app/src/main/assets/aria_config.xml | 2 +- .../java/com/arialyy/simple/MainActivity.java | 2 + .../simple/download/KotlinDownloadActivity.kt | 8 ++-- .../simple/download/SingleTaskActivity.java | 2 +- .../download/group/DownloadGroupActivity.java | 4 +- .../simple/download/group/GroupModule.java | 2 +- .../arialyy/simple/test/TestFTPActivity.java | 6 +-- app/src/main/res/values/strings.xml | 2 +- .../com/arialyy/aria/core/Configuration.java | 2 +- build.gradle | 6 +-- 22 files changed, 77 insertions(+), 90 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index cae8612f..8c2a5237 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -42,8 +42,7 @@ import java.util.TimerTask; * Created by AriaL on 2017/7/1. * 任务处理器 */ -public abstract class AbsFileer> - implements Runnable { +public abstract class AbsFileer> { private static final String STATE = "_state_"; private static final String RECORD = "_record_"; /** @@ -104,13 +103,6 @@ public abstract class AbsFileer= Build.VERSION_CODES.LOLLIPOP; - } - @Override protected void finalize() throws Throwable { super.finalize(); if (mConfigThreadPool != null) { @@ -333,10 +330,6 @@ public abstract class AbsThreadTask CHUNK_LENGTH) { + while (!Thread.currentThread().isInterrupted() && this.bytesWillBeSentOrReceive > CHUNK_LENGTH) { long nowTick = System.nanoTime(); long missedTime = this.timeCostPerChunk - (nowTick - this.lastPieceSentOrReceiveTick); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java index 7643a8f7..6a1adcf4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java @@ -266,8 +266,8 @@ public class DownloadGroupTarget extends BaseGroupTarget im if (oldFile.exists()) { oldFile.renameTo(new File(newPath)); } - if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", newPath)) { - ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在", newPath)); + if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'", newPath)) { + ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在或文件已下载", newPath)); return; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 9e9ed848..36db9187 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -26,13 +26,11 @@ import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.NetUtils; import java.io.File; -import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** @@ -56,7 +54,6 @@ public abstract class AbsGroupUtil implements IUtil { */ long mTotalLen = 0; long mCurrentLocation = 0; - private ExecutorService mExePool; protected IDownloadGroupListener mListener; DownloadGroupTaskEntity mGTEntity; private boolean isRunning = false; @@ -97,7 +94,6 @@ public abstract class AbsGroupUtil implements IUtil { AbsGroupUtil(IDownloadGroupListener listener, DownloadGroupTaskEntity groupEntity) { mListener = listener; mGTEntity = groupEntity; - mExePool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); mUpdateInterval = AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getUpdateInterval(); } @@ -228,10 +224,6 @@ public abstract class AbsGroupUtil implements IUtil { isCancel = true; closeTimer(); onCancel(); - if (!mExePool.isShutdown()) { - mExePool.shutdown(); - } - Set keys = mDownloaderMap.keySet(); for (String key : keys) { Downloader dt = mDownloaderMap.get(key); @@ -251,9 +243,6 @@ public abstract class AbsGroupUtil implements IUtil { isStop = true; closeTimer(); onStop(); - if (!mExePool.isShutdown()) { - mExePool.shutdown(); - } Set keys = mDownloaderMap.keySet(); for (String key : keys) { @@ -392,9 +381,8 @@ public abstract class AbsGroupUtil implements IUtil { ChildDownloadListener listener = new ChildDownloadListener(taskEntity); Downloader dt = new Downloader(listener, taskEntity); mDownloaderMap.put(taskEntity.getEntity().getUrl(), dt); - if (mExePool.isShutdown()) return dt; if (start) { - mExePool.execute(dt); + dt.start(); } return dt; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 9bc2ec5b..acf9192b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -33,7 +33,6 @@ import java.net.MalformedURLException; import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.Channels; -import java.nio.channels.ClosedByInterruptException; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; @@ -57,7 +56,7 @@ final class HttpThreadTask extends AbsThreadTask temp = mThreadTasks.get(getKey(key)); - for (Future future : temp) { - if (future.isDone() || future.isCancelled()) { - continue; + try { + for (Future future : temp) { + if (future.isDone() || future.isCancelled()) { + continue; + } + future.cancel(true); } - future.cancel(true); + } catch (Exception e) { + ALog.e(TAG, e); } + temp.clear(); mThreadTasks.remove(key); } @@ -96,11 +101,20 @@ public class ThreadTaskManager { * * @param task 线程任务 */ - public void retryThread(AbsThreadTask task) { + public synchronized void retryThread(AbsThreadTask task) { if (mExePool.isShutdown()) { ALog.e(TAG, "线程池已经关闭"); return; } + try { + if (task == null || task.isInterrupted()) { + ALog.e(TAG, "线程为空或线程已经中断"); + return; + } + } catch (Exception e) { + ALog.e(TAG, e); + return; + } mExePool.submit(task); } diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java b/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java index 04fbdb0d..8b8fa789 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java +++ b/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java @@ -92,7 +92,7 @@ public final class Util { byte[] buffer = new byte[bufferSize > 0 ? bufferSize : DEFAULT_COPY_BUFFER_SIZE]; try { - while ((numBytes = source.read(buffer)) != -1) { + while (!Thread.currentThread().isInterrupted() && (numBytes = source.read(buffer)) != -1) { // Technically, some read(byte[]) methods may return 0 and we cannot // accept that as an indication of EOF. diff --git a/DEV_LOG.md b/DEV_LOG.md index 1143fec3..ba49504a 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,7 @@ ## 开发日志 + + v_3.4.12 + - fix bug https://github.com/AriaLyy/Aria/issues/286 + - 优化线程池任务 + v_3.4.11 - fix bug https://github.com/AriaLyy/Aria/issues/288 - fix bug https://github.com/AriaLyy/Aria/issues/282 diff --git a/README.md b/README.md index cf24cb27..22be89e0 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.11' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.11' +compile 'com.arialyy.aria:aria-core:3.4.12' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.12' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` @@ -101,9 +101,9 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.4.11 - - fix bug https://github.com/AriaLyy/Aria/issues/288 - - fix bug https://github.com/AriaLyy/Aria/issues/282 + + v_3.4.12 + - fix bug https://github.com/AriaLyy/Aria/issues/286 + - 优化线程池任务 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/app/build.gradle b/app/build.gradle index 3f35f8e5..d0b770e4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.android.application' -//apply plugin: 'kotlin-android' -//apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' //apply plugin: 'kotlin-kapt' android { @@ -51,7 +51,7 @@ dependencies { compile 'com.arialyy.frame:MVVM2:2.2.0' compile project(':Aria') compile project(':AriaCompiler') - // compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" // compile 'com.arialyy.aria:aria-core:3.3.16' // annotationProcessor 'com.arialyy.aria:aria-compiler:3.3.16' debugCompile 'com.amitshekhar.android:debug-db:1.0.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 314d14ce..434990a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,10 +14,11 @@ android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"> - - + + + diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index aacfdc1b..4e5da29d 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -35,7 +35,7 @@ 3、从3.4.1开始,如果线程数为1,文件初始化时将不再预占用对应长度的空间,下载多少byte,则占多大的空间; 对于采用多线程的任务或旧任务,依然采用原来的文件空间占用方式; --> - + diff --git a/app/src/main/java/com/arialyy/simple/MainActivity.java b/app/src/main/java/com/arialyy/simple/MainActivity.java index 52291d32..36142640 100644 --- a/app/src/main/java/com/arialyy/simple/MainActivity.java +++ b/app/src/main/java/com/arialyy/simple/MainActivity.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; import butterknife.OnClick; +import com.arialyy.aria.core.Aria; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityMainBinding; import com.arialyy.simple.download.DownloadActivity; @@ -39,6 +40,7 @@ public class MainActivity extends BaseActivity { setSupportActionBar(mBar); mBar.setTitle("Aria Demo"); getSupportActionBar().setDisplayHomeAsUpEnabled(false); + } @Override protected int setLayoutId() { diff --git a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt index 8a22289a..4848e007 100644 --- a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt +++ b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt @@ -41,12 +41,14 @@ class KotlinDownloadActivity : AppCompatActivity() { // setBtState(false) // } // binding.fileSize = target.getConvertFileSize() + Aria.get(this).downloadConfig.maxTaskNum = 2 Aria.download(this).register() } - @Download.onTaskRunning protected fun running(task: DownloadTask) { + @Download.onTaskRunning + protected fun running(task: DownloadTask) { Log.d(TAG, task.percent.toString() + "") - val len = task.fileSize +// val len = task.fileSize // if (len == 0L) { // binding.progress = 0 // } else { @@ -65,7 +67,7 @@ class KotlinDownloadActivity : AppCompatActivity() { private fun startD() { Aria.download(this) - .load(DOWNLOAD_URL, true) + .load(DOWNLOAD_URL) .addHeader("groupName", "value") .setDownloadPath(Environment.getExternalStorageDirectory().path + "/hhhhhhhh.apk") .start() diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 53c76670..38d01617 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -245,7 +245,7 @@ public class SingleTaskActivity extends BaseActivity { //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") //.useServerFileName(true) //.setRequestMode(RequestEnum.GET) - .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/ggsg3.apk") + .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/ggsg4.apk") //.resetState() .start(); //.add(); diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 452d3a99..8f75bb19 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -47,7 +47,7 @@ public class DownloadGroupActivity extends BaseActivity getUrls() { List urls = new ArrayList<>(); - String[] str = getContext().getResources().getStringArray(R.array.group_url4); + String[] str = getContext().getResources().getStringArray(R.array.group_urls_1); Collections.addAll(urls, str); return urls; } diff --git a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java index 39747303..fd585c27 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/TestFTPActivity.java @@ -82,9 +82,9 @@ public class TestFTPActivity extends BaseActivity { .loadFtp(FILE_PATH) .login("lao", "123456") .setUploadUrl(URL) - //.asFtps() - //.setStorePath("/mnt/sdcard/Download/server.crt") - //.setAlias("www.laoyuyu.me") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") .start(); //Uri uri = Uri.parse("ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"); //ALog.d(TAG, "sh = " + uri.getScheme() + ", user = " + uri.getUserInfo() + ", host = " + uri.getHost() + ", port = " + uri.getPort() + " remotePath = " + uri.getPath()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4ced4d1c..d1c46d05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -85,7 +85,7 @@ - + 王者荣耀.apk 战斗吧剑灵.apk diff --git a/aria/src/main/java/com/arialyy/aria/core/Configuration.java b/aria/src/main/java/com/arialyy/aria/core/Configuration.java index 09cc56c8..7e518ed5 100644 --- a/aria/src/main/java/com/arialyy/aria/core/Configuration.java +++ b/aria/src/main/java/com/arialyy/aria/core/Configuration.java @@ -34,7 +34,7 @@ import java.util.Properties; * Created by lyy on 2016/12/8. * 信息配置 */ -class Configuration { +public class Configuration { static final String TAG = "Configuration"; static final String DOWNLOAD_CONFIG_FILE = "/Aria/DownloadConfig.properties"; static final String UPLOAD_CONFIG_FILE = "/Aria/UploadConfig.properties"; diff --git a/build.gradle b/build.gradle index 5cadcae4..c401c2cf 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { -// ext.kotlin_version = '1.1.51' + ext.kotlin_version = '1.1.51' repositories { jcenter() mavenCentral() @@ -9,7 +9,7 @@ buildscript { // classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.novoda:bintray-release:0.5.0' -// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' // classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' // NOTE: Do not place your application dependencies here; they belong @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.11' + publishVersion = '3.4.12' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From c2cfb5a36c167e2f7778c32723903c9c26021312 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Thu, 23 Aug 2018 21:38:45 +0800 Subject: [PATCH 16/28] fix bug --- .../com/arialyy/aria/core/command/AbsCmd.java | 1 - .../aria/core/command/AbsCmdFactory.java | 3 +- .../aria/core/command/group/AbsGroupCmd.java | 8 +--- .../core/command/group/GroupCancelCmd.java | 7 +--- .../core/command/group/GroupCmdFactory.java | 6 +-- .../core/command/group/GroupStartCmd.java | 7 +--- .../aria/core/command/group/GroupStopCmd.java | 7 +--- .../core/command/normal/AbsNormalCmd.java | 10 ++--- .../aria/core/command/normal/AddCmd.java | 4 +- .../core/command/normal/CancelAllCmd.java | 7 +--- .../aria/core/command/normal/CancelCmd.java | 8 +--- .../command/normal/HighestPriorityCmd.java | 10 +---- .../core/command/normal/NormalCmdFactory.java | 19 +++++----- .../core/command/normal/ResumeAllCmd.java | 7 +--- .../aria/core/command/normal/StartCmd.java | 9 +---- .../aria/core/command/normal/StopAllCmd.java | 7 +--- .../aria/core/command/normal/StopCmd.java | 10 ++--- .../com/arialyy/aria/core/common/AEvent.java | 37 +++++++++++++++++++ .../arialyy/aria/core/common/AbsFileer.java | 20 ++++++---- .../aria/core/common/AbsThreadTask.java | 27 +++++++++++++- .../aria/core/download/AbsDownloadTarget.java | 6 +-- .../aria/core/download/DownloadGroupTask.java | 8 +--- .../aria/core/download/DownloadReceiver.java | 6 +-- .../aria/core/download/DownloadTask.java | 8 +--- .../download/downloader/AbsGroupUtil.java | 7 +++- .../download/downloader/FtpThreadTask.java | 17 +++++---- .../download/downloader/HttpThreadTask.java | 14 ++++--- .../com/arialyy/aria/core/inf/AbsTarget.java | 25 ++++++------- .../com/arialyy/aria/core/inf/AbsTask.java | 14 +------ .../java/com/arialyy/aria/core/inf/ITask.java | 1 - .../aria/core/manager/ThreadTaskManager.java | 2 + .../arialyy/aria/core/queue/AbsTaskQueue.java | 5 --- .../core/queue/DownloadGroupTaskQueue.java | 19 ++++------ .../aria/core/queue/DownloadTaskQueue.java | 19 ++++------ .../arialyy/aria/core/queue/ITaskQueue.java | 3 +- .../arialyy/aria/core/queue/TaskFactory.java | 25 ++++++------- .../aria/core/queue/UploadTaskQueue.java | 19 ++++------ .../aria/core/upload/BaseNormalTarget.java | 2 +- .../aria/core/upload/FtpUploadTarget.java | 2 +- .../aria/core/upload/UploadReceiver.java | 4 +- .../core/upload/uploader/FtpThreadTask.java | 11 +++--- .../core/upload/uploader/HttpThreadTask.java | 9 +++-- .../com/arialyy/aria/util/CommonUtil.java | 4 +- README.md | 4 +- .../arialyy/aria/core/upload/UploadTask.java | 9 +---- build.gradle | 2 +- 46 files changed, 217 insertions(+), 242 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java index 34c80642..5e0f9ec3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java @@ -26,7 +26,6 @@ public abstract class AbsCmd implements ICmd { protected ITaskQueue mQueue; protected T mTaskEntity; protected String TAG; - protected String mTargetName; /** * 是否是下载任务的命令 diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java index d0def907..4783fd91 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java @@ -24,10 +24,9 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; public abstract class AbsCmdFactory { /** - * @param target 创建任务的对象 * @param entity 下载实体 * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public abstract CMD createCmd(String target, TASK_ENTITY entity, int type, int taskType); + public abstract CMD createCmd(TASK_ENTITY entity, int type, int taskType); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java index 0246b207..6f0cd071 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java @@ -36,11 +36,7 @@ public abstract class AbsGroupCmd extends AbsCmd extends AbsCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupCancelCmd(String targetName, T entity) { - super(targetName, entity); + GroupCancelCmd(T entity) { + super(entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java index 8af60348..e96a9437 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java @@ -62,13 +62,13 @@ public class GroupCmdFactory { AbsGroupCmd cmd = null; switch (type) { case SUB_TASK_START: - cmd = new GroupStartCmd<>(target, entity); + cmd = new GroupStartCmd<>(entity); break; case SUB_TASK_STOP: - cmd = new GroupStopCmd<>(target, entity); + cmd = new GroupStopCmd<>(entity); break; case SUB_TASK_CANCEL: - cmd = new GroupCancelCmd<>(target, entity); + cmd = new GroupCancelCmd<>(entity); } if (cmd != null) { cmd.childUrl = childUrl; diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java index 747e794c..be661ebc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java @@ -22,11 +22,8 @@ import com.arialyy.aria.core.inf.AbsGroupTaskEntity; * 任务组开始命令,该命令负责处理任务组子任务的开始\恢复等工作 */ class GroupStartCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupStartCmd(String targetName, T entity) { - super(targetName, entity); + GroupStartCmd( T entity) { + super( entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java index 483a7608..009a8e90 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java @@ -22,11 +22,8 @@ import com.arialyy.aria.core.inf.AbsGroupTaskEntity; * 停止任务组的命令 */ class GroupStopCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupStopCmd(String targetName, T entity) { - super(targetName, entity); + GroupStopCmd(T entity) { + super(entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java index 7e6a996a..3ef585b1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java @@ -46,13 +46,11 @@ public abstract class AbsNormalCmd extends AbsCmd { int taskType; /** - * @param targetName 产生任务的对象名 * @param taskType 下载任务类型{@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - AbsNormalCmd(String targetName, T entity, int taskType) { + AbsNormalCmd(T entity, int taskType) { this.taskType = taskType; - mTargetName = targetName; mTaskEntity = entity; TAG = CommonUtil.getClassName(this); if (taskType == ICmd.TASK_TYPE_DOWNLOAD) { @@ -126,7 +124,7 @@ public abstract class AbsNormalCmd extends AbsCmd { */ void removeTask(AbsTaskEntity taskEntity) { AbsTask tempTask = getTask(taskEntity.getEntity()); - if (tempTask == null){ + if (tempTask == null) { tempTask = createTask(taskEntity); } mQueue.cancelTask(tempTask); @@ -181,7 +179,7 @@ public abstract class AbsNormalCmd extends AbsCmd { * @return 创建的任务 */ AbsTask createTask() { - tempTask = mQueue.createTask(mTargetName, mTaskEntity); + tempTask = mQueue.createTask(mTaskEntity); return tempTask; } @@ -193,6 +191,6 @@ public abstract class AbsNormalCmd extends AbsCmd { */ AbsTask createTask(AbsTaskEntity taskEntity) { TEManager.getInstance().addTEntity(taskEntity); - return mQueue.createTask(mTargetName, taskEntity); + return mQueue.createTask(taskEntity); } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java index 554e9c74..a34d385f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java @@ -27,8 +27,8 @@ import com.arialyy.aria.util.ALog; */ class AddCmd extends AbsNormalCmd { - AddCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + AddCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java index 9c4181a5..f28c6130 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java @@ -41,11 +41,8 @@ public class CancelAllCmd extends AbsNormalCmd { */ public boolean removeFile = false; - /** - * @param targetName 产生任务的对象名 - */ - CancelAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + CancelAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java index 57ab73d1..f0a80cdf 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java @@ -16,7 +16,6 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; import com.arialyy.aria.core.inf.AbsTask; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -31,8 +30,8 @@ public class CancelCmd extends AbsNormalCmd { */ public boolean removeFile = false; - CancelCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + CancelCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -43,9 +42,6 @@ public class CancelCmd extends AbsNormalCmd { } if (task != null) { mTaskEntity.setRemoveFile(removeFile); - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } removeTask(); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java index ac3570d1..a033a145 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java @@ -36,11 +36,8 @@ import com.arialyy.aria.util.NetUtils; * 目前只只支持单下载任务的最高优先级任务 */ final class HighestPriorityCmd extends AbsNormalCmd { - /** - * @param targetName 产生任务的对象名 - */ - HighestPriorityCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + HighestPriorityCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -54,9 +51,6 @@ final class HighestPriorityCmd extends AbsNormalCmd task = (DownloadTask) createTask(); } if (task != null) { - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } ((DownloadTaskQueue) mQueue).setTaskHighestPriority(task); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java index 005e31b0..837d01a3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java @@ -78,32 +78,31 @@ public class NormalCmdFactory extends AbsCmdFactory } /** - * @param target 创建任务的对象 * @param entity 下载实体 * @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link * #TASK_STOP}、{@link #TASK_HIGHEST_PRIORITY}、{@link #TASK_STOP_ALL}、{@link #TASK_RESUME_ALL} * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public AbsNormalCmd createCmd(String target, AbsTaskEntity entity, int type, int taskType) { + public AbsNormalCmd createCmd(AbsTaskEntity entity, int type, int taskType) { switch (type) { case TASK_CREATE: - return new AddCmd<>(target, entity, taskType); + return new AddCmd<>(entity, taskType); case TASK_RESUME: case TASK_START: - return new StartCmd<>(target, entity, taskType); + return new StartCmd<>(entity, taskType); case TASK_CANCEL: - return new CancelCmd<>(target, entity, taskType); + return new CancelCmd<>(entity, taskType); case TASK_STOP: - return new StopCmd<>(target, entity, taskType); + return new StopCmd<>(entity, taskType); case TASK_HIGHEST_PRIORITY: - return new HighestPriorityCmd<>(target, entity, taskType); + return new HighestPriorityCmd<>(entity, taskType); case TASK_STOP_ALL: - return new StopAllCmd<>(target, entity, taskType); + return new StopAllCmd<>(entity, taskType); case TASK_RESUME_ALL: - return new ResumeAllCmd<>(target, entity, taskType); + return new ResumeAllCmd<>(entity, taskType); case TASK_CANCEL_ALL: - return new CancelAllCmd<>(target, entity, taskType); + return new CancelAllCmd<>(entity, taskType); default: return null; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java index 76a80536..2d183fd0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java @@ -32,11 +32,8 @@ import java.util.List; final class ResumeAllCmd extends AbsNormalCmd { private List mWaitList = new ArrayList<>(); - /** - * @param targetName 产生任务的对象名 - */ - ResumeAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + ResumeAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java index ece35307..511c8d10 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java @@ -16,8 +16,6 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; -import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.QueueMod; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; @@ -46,8 +44,8 @@ import java.util.List; */ class StartCmd extends AbsNormalCmd { - StartCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StartCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -68,9 +66,6 @@ class StartCmd extends AbsNormalCmd { AbsTask task = getTask(); if (task == null) { task = createTask(); - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } // 任务不存在时,根据配置不同,对任务执行操作 if (mod.equals(QueueMod.NOW.getTag())) { startTask(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java index 7f55e573..ff15dc92 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java @@ -7,11 +7,8 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; * 停止所有任务的命令,并清空所有等待队列 */ final class StopAllCmd extends AbsNormalCmd { - /** - * @param targetName 产生任务的对象名 - */ - StopAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StopAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java index 15a9479b..396cd389 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java @@ -16,10 +16,9 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; import com.arialyy.aria.core.inf.AbsTask; -import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.util.ALog; /** @@ -28,8 +27,8 @@ import com.arialyy.aria.util.ALog; */ class StopCmd extends AbsNormalCmd { - StopCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StopCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -42,9 +41,6 @@ class StopCmd extends AbsNormalCmd { ALog.w(TAG, "停止命令执行失败,【调度器中没有该任务】"); } } else { - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } stopTask(); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java b/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java new file mode 100644 index 00000000..f5852b92 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.core.common; + +/** + * Aria事件总线 + */ +public class AEvent { + private static final Object LOCK = new Object(); + private static volatile AEvent INSTANCE = null; + + private AEvent() { + + } + + public static AEvent getInstance() { + if (INSTANCE == null) { + synchronized (LOCK) { + INSTANCE = new AEvent(); + } + } + return INSTANCE; + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 8c2a5237..aa8dc8cd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -42,7 +42,8 @@ import java.util.TimerTask; * Created by AriaL on 2017/7/1. * 任务处理器 */ -public abstract class AbsFileer> { +public abstract class AbsFileer> + implements Runnable { private static final String STATE = "_state_"; private static final String RECORD = "_record_"; /** @@ -139,7 +140,7 @@ public abstract class AbsFileer> - implements Callable { + implements Callable { /** * 线程重试次数 */ @@ -60,13 +60,14 @@ public abstract class AbsThreadTask { public static class Builder { DownloadGroupTaskEntity taskEntity; Handler outHandler; - String targetName; - public Builder(String targetName, DownloadGroupTaskEntity taskEntity) { + public Builder(DownloadGroupTaskEntity taskEntity) { CheckUtil.checkTaskEntity(taskEntity); - this.targetName = targetName; this.taskEntity = taskEntity; } @@ -117,9 +115,7 @@ public class DownloadGroupTask extends AbsGroupTask { } public DownloadGroupTask build() { - DownloadGroupTask task = new DownloadGroupTask(taskEntity, outHandler); - task.setTargetName(targetName); - return task; + return new DownloadGroupTask(taskEntity, outHandler); } } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index b3c84d77..341d4d52 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -370,7 +370,7 @@ public class DownloadReceiver extends AbsReceiver { public void stopAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, + .createCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, ICmd.TASK_TYPE_DOWNLOAD)) .exe(); } @@ -383,7 +383,7 @@ public class DownloadReceiver extends AbsReceiver { public void resumeAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), NormalCmdFactory.TASK_RESUME_ALL, + .createCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_RESUME_ALL, ICmd.TASK_TYPE_DOWNLOAD)) .exe(); } @@ -397,7 +397,7 @@ public class DownloadReceiver extends AbsReceiver { public void removeAllTask(boolean removeFile) { final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP); CancelAllCmd cancelCmd = - (CancelAllCmd) CommonUtil.createNormalCmd(targetName, new DownloadTaskEntity(), + (CancelAllCmd) CommonUtil.createNormalCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_CANCEL_ALL, ICmd.TASK_TYPE_DOWNLOAD); cancelCmd.removeFile = removeFile; ariaManager.setCmd(cancelCmd).exe(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java index f86f9721..411bb131 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java @@ -143,10 +143,8 @@ public class DownloadTask extends AbsNormalTask { public static class Builder { DownloadTaskEntity taskEntity; Handler outHandler; - String targetName; - public Builder(String targetName, DownloadTaskEntity taskEntity) { - this.targetName = targetName; + public Builder(DownloadTaskEntity taskEntity) { this.taskEntity = taskEntity; } @@ -166,9 +164,7 @@ public class DownloadTask extends AbsNormalTask { } public DownloadTask build() { - DownloadTask task = new DownloadTask(taskEntity, outHandler); - task.setTargetName(targetName); - return task; + return new DownloadTask(taskEntity, outHandler); } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 36db9187..a07e6fe3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -31,13 +31,12 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; /** * Created by AriaL on 2017/6/30. * 任务组核心逻辑 */ -public abstract class AbsGroupUtil implements IUtil { +public abstract class AbsGroupUtil implements IUtil, Runnable { private static final Object LOCK = new Object(); private final String TAG = "AbsGroupUtil"; /** @@ -286,6 +285,10 @@ public abstract class AbsGroupUtil implements IUtil { } @Override public void start() { + new Thread(this).start(); + } + + @Override public void run() { if (isStop || isCancel) { closeTimer(); return; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index bbaa67ed..dcebff93 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -53,10 +53,11 @@ class FtpThreadTask extends AbsFtpThreadTask isBlock = STATE.TASK_RECORD.isBlock; } - @Override public DownloadTaskEntity call() throws Exception { + @Override public FtpThreadTask call() throws Exception { + super.call(); if (mConfig.THREAD_RECORD.isComplete) { handleComplete(); - return mTaskEntity; + return this; } mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -69,7 +70,7 @@ class FtpThreadTask extends AbsFtpThreadTask client = createClient(); if (client == null) { fail(mChildCurrentLocation, "ftp client 创建失败", null); - return mTaskEntity; + return this; } if (mConfig.START_LOCATION > 0) { client.setRestartOffset(mConfig.START_LOCATION); @@ -81,7 +82,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取文件信息错误,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return mTaskEntity; + return this; } String remotePath = new String(mTaskEntity.getUrlEntity().remotePath.getBytes(charSet), SERVER_CHARSET); @@ -93,7 +94,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取流失败,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return mTaskEntity; + return this; } if (isOpenDynamicFile) { @@ -118,7 +119,7 @@ class FtpThreadTask extends AbsFtpThreadTask e.printStackTrace(); } } - return mTaskEntity; + return this; } /** @@ -165,7 +166,7 @@ class FtpThreadTask extends AbsFtpThreadTask foc = fos.getChannel(); fic = Channels.newChannel(is); ByteBuffer bf = ByteBuffer.allocate(mBufSize); - while (!Thread.currentThread().isInterrupted() && (len = fic.read(bf)) != -1) { + while (isLive() && (len = fic.read(bf)) != -1) { if (isBreak()) { break; } @@ -216,7 +217,7 @@ class FtpThreadTask extends AbsFtpThreadTask file.seek(mConfig.START_LOCATION); byte[] buffer = new byte[mBufSize]; int len; - while (!Thread.currentThread().isInterrupted() && (len = is.read(buffer)) != -1) { + while (isLive() && (len = is.read(buffer)) != -1) { if (isBreak()) { break; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index acf9192b..20575ff0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -56,10 +56,11 @@ final class HttpThreadTask extends AbsThreadTask cmds = new ArrayList<>(); int taskType = checkTaskType(); cmds.add( - CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_STOP, - taskType)); - cmds.add(CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_START, - taskType)); + CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_STOP, taskType)); + cmds.add(CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_START, taskType)); AriaManager.getInstance(AriaManager.APP).setCmds(cmds).exe(); } } @@ -290,8 +288,9 @@ public abstract class AbsTarget implements ITas protected TASK_ENTITY mTaskEntity; protected Handler mOutHandler; - /** - * 用于生成该任务对象的hash码 - */ - private String mTargetName; protected Context mContext; - protected boolean isHeighestTask = false; + boolean isHeighestTask = false; private boolean isCancel = false, isStop = false; protected IUtil mUtil; @@ -212,14 +208,6 @@ public abstract class AbsTask implements ITas */ public abstract String getTaskName(); - public String getTargetName() { - return mTargetName; - } - - @Override public void setTargetName(String targetName) { - this.mTargetName = targetName; - } - public boolean isHighestPriorityTask() { return isHeighestTask; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java index 6a5016a9..21685b0d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java @@ -90,5 +90,4 @@ public interface ITask { */ String getConvertCurrentProgress(); - void setTargetName(String targetName); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java index 8229ae2f..5ae2d674 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java @@ -87,6 +87,8 @@ public class ThreadTaskManager { if (future.isDone() || future.isCancelled()) { continue; } + AbsThreadTask task = (AbsThreadTask) future.get(); + task.setInterrupted(true); future.cancel(true); } } catch (Exception e) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 7bf73715..80cb9a77 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -187,7 +187,6 @@ abstract class AbsTaskQueue ITask createTask( - String targetName, TASK_ENTITY entity, SCHEDULER schedulers) { + TASK_ENTITY entity, SCHEDULER schedulers) { if (entity instanceof DownloadTaskEntity) { - return createDownloadTask(targetName, (DownloadTaskEntity) entity, schedulers); + return createDownloadTask((DownloadTaskEntity) entity, schedulers); } else if (entity instanceof UploadTaskEntity) { - return createUploadTask(targetName, (UploadTaskEntity) entity, schedulers); + return createUploadTask((UploadTaskEntity) entity, schedulers); } else if (entity instanceof DownloadGroupTaskEntity) { - return createDownloadGroupTask(targetName, (DownloadGroupTaskEntity) entity, schedulers); + return createDownloadGroupTask((DownloadGroupTaskEntity) entity, schedulers); } return null; } @@ -78,9 +78,9 @@ class TaskFactory { * @param entity 下载任务实体{@link DownloadGroupTask} * @param schedulers {@link ISchedulers} */ - private DownloadGroupTask createDownloadGroupTask(String targetName, - DownloadGroupTaskEntity entity, ISchedulers schedulers) { - DownloadGroupTask.Builder builder = new DownloadGroupTask.Builder(targetName, entity); + private DownloadGroupTask createDownloadGroupTask(DownloadGroupTaskEntity entity, + ISchedulers schedulers) { + DownloadGroupTask.Builder builder = new DownloadGroupTask.Builder(entity); builder.setOutHandler(schedulers); return builder.build(); } @@ -89,10 +89,8 @@ class TaskFactory { * @param entity 上传任务实体{@link UploadTaskEntity} * @param schedulers {@link ISchedulers} */ - private UploadTask createUploadTask(String targetName, UploadTaskEntity entity, - ISchedulers schedulers) { + private UploadTask createUploadTask(UploadTaskEntity entity, ISchedulers schedulers) { UploadTask.Builder builder = new UploadTask.Builder(); - builder.setTargetName(targetName); builder.setUploadTaskEntity(entity); builder.setOutHandler(schedulers); return builder.build(); @@ -102,9 +100,8 @@ class TaskFactory { * @param entity 下载任务实体{@link DownloadTaskEntity} * @param schedulers {@link ISchedulers} */ - private DownloadTask createDownloadTask(String targetName, DownloadTaskEntity entity, - ISchedulers schedulers) { - DownloadTask.Builder builder = new DownloadTask.Builder(targetName, entity); + private DownloadTask createDownloadTask(DownloadTaskEntity entity, ISchedulers schedulers) { + DownloadTask.Builder builder = new DownloadTask.Builder(entity); builder.setOutHandler(schedulers); return builder.build(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java index 570a0f0d..d235304d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java @@ -16,7 +16,6 @@ package com.arialyy.aria.core.queue; -import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.queue.pool.BaseCachePool; import com.arialyy.aria.core.queue.pool.BaseExecutePool; @@ -62,19 +61,15 @@ public class UploadTaskQueue extends AbsTaskQueue return AriaManager.getInstance(AriaManager.APP).getUploadConfig().getMaxTaskNum(); } - @Override public UploadTask createTask(String targetName, UploadTaskEntity entity) { + @Override public UploadTask createTask(UploadTaskEntity entity) { UploadTask task = null; - if (!TextUtils.isEmpty(targetName)) { - if (mCachePool.getTask(entity.getEntity().getKey()) == null - && mExecutePool.getTask(entity.getEntity().getKey()) == null) { - task = (UploadTask) TaskFactory.getInstance() - .createTask(targetName, entity, UploadSchedulers.getInstance()); - mCachePool.putTask(task); - } else { - ALog.w(TAG, "任务已存在"); - } + if (mCachePool.getTask(entity.getEntity().getKey()) == null + && mExecutePool.getTask(entity.getEntity().getKey()) == null) { + task = (UploadTask) TaskFactory.getInstance() + .createTask(entity, UploadSchedulers.getInstance()); + mCachePool.putTask(task); } else { - ALog.e(TAG, "target name 为 null是!!"); + ALog.w(TAG, "任务已存在"); } return task; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java index b56ad759..df175a3e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java @@ -80,7 +80,7 @@ abstract class BaseNormalTarget mEntity.save(); mTaskEntity.save(); } - if (mTaskEntity.getUrlEntity().isFtps) { + if (mTaskEntity.getUrlEntity() != null && mTaskEntity.getUrlEntity().isFtps) { if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().storePath)) { ALog.e(TAG, "证书路径为空"); return false; diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java index fe60aae0..99f4978b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java @@ -54,7 +54,7 @@ public class FtpUploadTarget extends BaseNormalTarget public void add() { if (checkEntity()) { AriaManager.getInstance(AriaManager.APP) - .setCmd(CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_CREATE, + .setCmd(CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_CREATE, checkTaskType())) .exe(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java index 4f6dac4c..a2be1ed4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java @@ -123,7 +123,7 @@ public class UploadReceiver extends AbsReceiver { public void stopAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new UploadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, + .createCmd(new UploadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, ICmd.TASK_TYPE_UPLOAD)) .exe(); } @@ -137,7 +137,7 @@ public class UploadReceiver extends AbsReceiver { public void removeAllTask(boolean removeFile) { final AriaManager am = AriaManager.getInstance(AriaManager.APP); CancelAllCmd cancelCmd = - (CancelAllCmd) CommonUtil.createNormalCmd(targetName, new UploadTaskEntity(), + (CancelAllCmd) CommonUtil.createNormalCmd(new UploadTaskEntity(), NormalCmdFactory.TASK_CANCEL_ALL, ICmd.TASK_TYPE_UPLOAD); cancelCmd.removeFile = removeFile; am.setCmd(cancelCmd).exe(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index c3a233f6..12c5f8ef 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -50,7 +50,8 @@ class FtpThreadTask extends AbsFtpThreadTask { return mAridManager.getUploadConfig().getMaxSpeed(); } - @Override public UploadTaskEntity call() throws Exception { + @Override public FtpThreadTask call() throws Exception { + super.call(); //当前子线程的下载位置 mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -61,7 +62,7 @@ class FtpThreadTask extends AbsFtpThreadTask { mConfig.THREAD_ID, mConfig.START_LOCATION, mConfig.END_LOCATION)); client = createClient(); if (client == null) { - return mTaskEntity; + return this; } initPath(); client.makeDirectory(dir); @@ -71,7 +72,7 @@ class FtpThreadTask extends AbsFtpThreadTask { if (!FTPReply.isPositivePreliminary(reply) && reply != FTPReply.FILE_ACTION_OK) { fail(mChildCurrentLocation, "上传失败,错误码为:" + reply + ",msg:" + client.getReplyString(), null); client.disconnect(); - return mTaskEntity; + return this; } file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize); @@ -81,7 +82,7 @@ class FtpThreadTask extends AbsFtpThreadTask { } upload(client, file); if (isBreak()) { - return mTaskEntity; + return this; } ALog.i(TAG, String.format("任务【%s】线程__%s__上传完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID)); @@ -112,7 +113,7 @@ class FtpThreadTask extends AbsFtpThreadTask { e.printStackTrace(); } } - return mTaskEntity; + return this; } private void initPath() throws UnsupportedEncodingException { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index 1978b9ed..17cd60a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -57,12 +57,13 @@ class HttpThreadTask extends AbsThreadTask { isNotNetRetry = mAridManager.getUploadConfig().isNotNetRetry(); } - @Override public UploadTaskEntity call() throws Exception { + @Override public HttpThreadTask call() throws Exception { + super.call(); File uploadFile = new File(mEntity.getFilePath()); if (!uploadFile.exists()) { ALog.e(TAG, String.format("【%s】,文件不存在。", mEntity.getFilePath())); fail(); - return mTaskEntity; + return this; } mListener.onPre(); URL url; @@ -103,7 +104,7 @@ class HttpThreadTask extends AbsThreadTask { e.printStackTrace(); fail(); } - return mTaskEntity; + return this; } private void fail() { @@ -200,7 +201,7 @@ class HttpThreadTask extends AbsThreadTask { if (status == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(mHttpConn.getInputStream())); String line; - while (!Thread.currentThread().isInterrupted() && (line = reader.readLine()) != null) { + while (isLive() && (line = reader.readLine()) != null) { response.append(line); } reader.close(); diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index 3d33e56c..9463a705 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -689,9 +689,9 @@ public class CommonUtil { * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public static AbsNormalCmd createNormalCmd(String target, T entity, + public static AbsNormalCmd createNormalCmd(T entity, int cmd, int taskType) { - return NormalCmdFactory.getInstance().createCmd(target, entity, cmd, taskType); + return NormalCmdFactory.getInstance().createCmd(entity, cmd, taskType); } /** diff --git a/README.md b/README.md index 22be89e0..b6c32dc9 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.12' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.12' +compile 'com.arialyy.aria:aria-core:3.4.15' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.15' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index af00d525..0f87fafc 100644 --- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -83,7 +83,6 @@ public class UploadTask extends AbsNormalTask { public static class Builder { private Handler mOutHandler; private UploadTaskEntity mTaskEntity; - private String mTargetName; public void setOutHandler(ISchedulers outHandler) { try { @@ -98,18 +97,12 @@ public class UploadTask extends AbsNormalTask { mTaskEntity = taskEntity; } - public void setTargetName(String targetName) { - mTargetName = targetName; - } - public Builder() { } public UploadTask build() { - UploadTask task = new UploadTask(mTaskEntity, mOutHandler); - task.setTargetName(mTargetName); - return task; + return new UploadTask(mTaskEntity, mOutHandler); } } } diff --git a/build.gradle b/build.gradle index c401c2cf..33bd13cb 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.12' + publishVersion = '3.4.15' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 688c83a327f185460c6f0fd465765828936aa20c Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@QQ.com> Date: Fri, 24 Aug 2018 10:33:34 +0800 Subject: [PATCH 17/28] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b6c32dc9..e97d035f 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.15' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.15' +compile 'com.arialyy.aria:aria-core:3.4.16' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.16' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` From ec6f632aff97f1aa6ad3e978c19acc802a37bbac Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 24 Aug 2018 19:44:31 +0800 Subject: [PATCH 18/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E9=87=8D=E6=96=B0=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/command/AbsCmd.java | 1 - .../aria/core/command/AbsCmdFactory.java | 3 +- .../aria/core/command/group/AbsGroupCmd.java | 8 +--- .../core/command/group/GroupCancelCmd.java | 7 +--- .../core/command/group/GroupCmdFactory.java | 6 +-- .../core/command/group/GroupStartCmd.java | 7 +--- .../aria/core/command/group/GroupStopCmd.java | 7 +--- .../core/command/normal/AbsNormalCmd.java | 10 ++--- .../aria/core/command/normal/AddCmd.java | 4 +- .../core/command/normal/CancelAllCmd.java | 7 +--- .../aria/core/command/normal/CancelCmd.java | 8 +--- .../command/normal/HighestPriorityCmd.java | 10 +---- .../core/command/normal/NormalCmdFactory.java | 19 +++++----- .../core/command/normal/ResumeAllCmd.java | 7 +--- .../aria/core/command/normal/StartCmd.java | 9 +---- .../aria/core/command/normal/StopAllCmd.java | 7 +--- .../aria/core/command/normal/StopCmd.java | 10 ++--- .../com/arialyy/aria/core/common/AEvent.java | 37 +++++++++++++++++++ .../arialyy/aria/core/common/AbsFileer.java | 20 ++++++---- .../aria/core/common/AbsThreadTask.java | 27 +++++++++++++- .../aria/core/download/AbsDownloadTarget.java | 6 +-- .../aria/core/download/DownloadGroupTask.java | 8 +--- .../aria/core/download/DownloadReceiver.java | 6 +-- .../aria/core/download/DownloadTask.java | 8 +--- .../download/downloader/AbsGroupUtil.java | 7 +++- .../download/downloader/FtpThreadTask.java | 17 +++++---- .../download/downloader/HttpThreadTask.java | 14 ++++--- .../com/arialyy/aria/core/inf/AbsTarget.java | 25 ++++++------- .../com/arialyy/aria/core/inf/AbsTask.java | 14 +------ .../java/com/arialyy/aria/core/inf/ITask.java | 1 - .../aria/core/manager/ThreadTaskManager.java | 2 + .../arialyy/aria/core/queue/AbsTaskQueue.java | 5 --- .../core/queue/DownloadGroupTaskQueue.java | 19 ++++------ .../aria/core/queue/DownloadTaskQueue.java | 19 ++++------ .../arialyy/aria/core/queue/ITaskQueue.java | 3 +- .../arialyy/aria/core/queue/TaskFactory.java | 25 ++++++------- .../aria/core/queue/UploadTaskQueue.java | 19 ++++------ .../aria/core/upload/BaseNormalTarget.java | 2 +- .../aria/core/upload/FtpUploadTarget.java | 2 +- .../aria/core/upload/UploadReceiver.java | 4 +- .../core/upload/uploader/FtpThreadTask.java | 11 +++--- .../core/upload/uploader/HttpThreadTask.java | 9 +++-- .../com/arialyy/aria/util/CommonUtil.java | 4 +- README.md | 4 +- .../arialyy/aria/core/upload/UploadTask.java | 9 +---- build.gradle | 2 +- 46 files changed, 217 insertions(+), 242 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java index 34c80642..5e0f9ec3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java @@ -26,7 +26,6 @@ public abstract class AbsCmd implements ICmd { protected ITaskQueue mQueue; protected T mTaskEntity; protected String TAG; - protected String mTargetName; /** * 是否是下载任务的命令 diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java index d0def907..4783fd91 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmdFactory.java @@ -24,10 +24,9 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; public abstract class AbsCmdFactory { /** - * @param target 创建任务的对象 * @param entity 下载实体 * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public abstract CMD createCmd(String target, TASK_ENTITY entity, int type, int taskType); + public abstract CMD createCmd(TASK_ENTITY entity, int type, int taskType); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java index 0246b207..6f0cd071 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/AbsGroupCmd.java @@ -36,11 +36,7 @@ public abstract class AbsGroupCmd extends AbsCmd extends AbsCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupCancelCmd(String targetName, T entity) { - super(targetName, entity); + GroupCancelCmd(T entity) { + super(entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java index 8af60348..e96a9437 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupCmdFactory.java @@ -62,13 +62,13 @@ public class GroupCmdFactory { AbsGroupCmd cmd = null; switch (type) { case SUB_TASK_START: - cmd = new GroupStartCmd<>(target, entity); + cmd = new GroupStartCmd<>(entity); break; case SUB_TASK_STOP: - cmd = new GroupStopCmd<>(target, entity); + cmd = new GroupStopCmd<>(entity); break; case SUB_TASK_CANCEL: - cmd = new GroupCancelCmd<>(target, entity); + cmd = new GroupCancelCmd<>(entity); } if (cmd != null) { cmd.childUrl = childUrl; diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java index 747e794c..be661ebc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStartCmd.java @@ -22,11 +22,8 @@ import com.arialyy.aria.core.inf.AbsGroupTaskEntity; * 任务组开始命令,该命令负责处理任务组子任务的开始\恢复等工作 */ class GroupStartCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupStartCmd(String targetName, T entity) { - super(targetName, entity); + GroupStartCmd( T entity) { + super( entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java index 483a7608..009a8e90 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/group/GroupStopCmd.java @@ -22,11 +22,8 @@ import com.arialyy.aria.core.inf.AbsGroupTaskEntity; * 停止任务组的命令 */ class GroupStopCmd extends AbsGroupCmd { - /** - * @param targetName 创建任务的对象名 - */ - GroupStopCmd(String targetName, T entity) { - super(targetName, entity); + GroupStopCmd(T entity) { + super(entity); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java index 7e6a996a..3ef585b1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AbsNormalCmd.java @@ -46,13 +46,11 @@ public abstract class AbsNormalCmd extends AbsCmd { int taskType; /** - * @param targetName 产生任务的对象名 * @param taskType 下载任务类型{@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - AbsNormalCmd(String targetName, T entity, int taskType) { + AbsNormalCmd(T entity, int taskType) { this.taskType = taskType; - mTargetName = targetName; mTaskEntity = entity; TAG = CommonUtil.getClassName(this); if (taskType == ICmd.TASK_TYPE_DOWNLOAD) { @@ -126,7 +124,7 @@ public abstract class AbsNormalCmd extends AbsCmd { */ void removeTask(AbsTaskEntity taskEntity) { AbsTask tempTask = getTask(taskEntity.getEntity()); - if (tempTask == null){ + if (tempTask == null) { tempTask = createTask(taskEntity); } mQueue.cancelTask(tempTask); @@ -181,7 +179,7 @@ public abstract class AbsNormalCmd extends AbsCmd { * @return 创建的任务 */ AbsTask createTask() { - tempTask = mQueue.createTask(mTargetName, mTaskEntity); + tempTask = mQueue.createTask(mTaskEntity); return tempTask; } @@ -193,6 +191,6 @@ public abstract class AbsNormalCmd extends AbsCmd { */ AbsTask createTask(AbsTaskEntity taskEntity) { TEManager.getInstance().addTEntity(taskEntity); - return mQueue.createTask(mTargetName, taskEntity); + return mQueue.createTask(taskEntity); } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java index 554e9c74..a34d385f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/AddCmd.java @@ -27,8 +27,8 @@ import com.arialyy.aria.util.ALog; */ class AddCmd extends AbsNormalCmd { - AddCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + AddCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java index 9c4181a5..f28c6130 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelAllCmd.java @@ -41,11 +41,8 @@ public class CancelAllCmd extends AbsNormalCmd { */ public boolean removeFile = false; - /** - * @param targetName 产生任务的对象名 - */ - CancelAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + CancelAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java index 57ab73d1..f0a80cdf 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/CancelCmd.java @@ -16,7 +16,6 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; import com.arialyy.aria.core.inf.AbsTask; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -31,8 +30,8 @@ public class CancelCmd extends AbsNormalCmd { */ public boolean removeFile = false; - CancelCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + CancelCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -43,9 +42,6 @@ public class CancelCmd extends AbsNormalCmd { } if (task != null) { mTaskEntity.setRemoveFile(removeFile); - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } removeTask(); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java index ac3570d1..a033a145 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/HighestPriorityCmd.java @@ -36,11 +36,8 @@ import com.arialyy.aria.util.NetUtils; * 目前只只支持单下载任务的最高优先级任务 */ final class HighestPriorityCmd extends AbsNormalCmd { - /** - * @param targetName 产生任务的对象名 - */ - HighestPriorityCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + HighestPriorityCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -54,9 +51,6 @@ final class HighestPriorityCmd extends AbsNormalCmd task = (DownloadTask) createTask(); } if (task != null) { - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } ((DownloadTaskQueue) mQueue).setTaskHighestPriority(task); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java index 005e31b0..837d01a3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/NormalCmdFactory.java @@ -78,32 +78,31 @@ public class NormalCmdFactory extends AbsCmdFactory } /** - * @param target 创建任务的对象 * @param entity 下载实体 * @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link * #TASK_STOP}、{@link #TASK_HIGHEST_PRIORITY}、{@link #TASK_STOP_ALL}、{@link #TASK_RESUME_ALL} * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public AbsNormalCmd createCmd(String target, AbsTaskEntity entity, int type, int taskType) { + public AbsNormalCmd createCmd(AbsTaskEntity entity, int type, int taskType) { switch (type) { case TASK_CREATE: - return new AddCmd<>(target, entity, taskType); + return new AddCmd<>(entity, taskType); case TASK_RESUME: case TASK_START: - return new StartCmd<>(target, entity, taskType); + return new StartCmd<>(entity, taskType); case TASK_CANCEL: - return new CancelCmd<>(target, entity, taskType); + return new CancelCmd<>(entity, taskType); case TASK_STOP: - return new StopCmd<>(target, entity, taskType); + return new StopCmd<>(entity, taskType); case TASK_HIGHEST_PRIORITY: - return new HighestPriorityCmd<>(target, entity, taskType); + return new HighestPriorityCmd<>(entity, taskType); case TASK_STOP_ALL: - return new StopAllCmd<>(target, entity, taskType); + return new StopAllCmd<>(entity, taskType); case TASK_RESUME_ALL: - return new ResumeAllCmd<>(target, entity, taskType); + return new ResumeAllCmd<>(entity, taskType); case TASK_CANCEL_ALL: - return new CancelAllCmd<>(target, entity, taskType); + return new CancelAllCmd<>(entity, taskType); default: return null; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java index 76a80536..2d183fd0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java @@ -32,11 +32,8 @@ import java.util.List; final class ResumeAllCmd extends AbsNormalCmd { private List mWaitList = new ArrayList<>(); - /** - * @param targetName 产生任务的对象名 - */ - ResumeAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + ResumeAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java index ece35307..511c8d10 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java @@ -16,8 +16,6 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; -import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.QueueMod; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; @@ -46,8 +44,8 @@ import java.util.List; */ class StartCmd extends AbsNormalCmd { - StartCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StartCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -68,9 +66,6 @@ class StartCmd extends AbsNormalCmd { AbsTask task = getTask(); if (task == null) { task = createTask(); - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } // 任务不存在时,根据配置不同,对任务执行操作 if (mod.equals(QueueMod.NOW.getTag())) { startTask(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java index 7f55e573..ff15dc92 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopAllCmd.java @@ -7,11 +7,8 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; * 停止所有任务的命令,并清空所有等待队列 */ final class StopAllCmd extends AbsNormalCmd { - /** - * @param targetName 产生任务的对象名 - */ - StopAllCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StopAllCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java index 15a9479b..396cd389 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StopCmd.java @@ -16,10 +16,9 @@ package com.arialyy.aria.core.command.normal; -import android.text.TextUtils; import com.arialyy.aria.core.inf.AbsTask; -import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.util.ALog; /** @@ -28,8 +27,8 @@ import com.arialyy.aria.util.ALog; */ class StopCmd extends AbsNormalCmd { - StopCmd(String targetName, T entity, int taskType) { - super(targetName, entity, taskType); + StopCmd(T entity, int taskType) { + super(entity, taskType); } @Override public void executeCmd() { @@ -42,9 +41,6 @@ class StopCmd extends AbsNormalCmd { ALog.w(TAG, "停止命令执行失败,【调度器中没有该任务】"); } } else { - if (!TextUtils.isEmpty(mTargetName)) { - task.setTargetName(mTargetName); - } stopTask(); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java b/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java new file mode 100644 index 00000000..f5852b92 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.core.common; + +/** + * Aria事件总线 + */ +public class AEvent { + private static final Object LOCK = new Object(); + private static volatile AEvent INSTANCE = null; + + private AEvent() { + + } + + public static AEvent getInstance() { + if (INSTANCE == null) { + synchronized (LOCK) { + INSTANCE = new AEvent(); + } + } + return INSTANCE; + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 8c2a5237..aa8dc8cd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -42,7 +42,8 @@ import java.util.TimerTask; * Created by AriaL on 2017/7/1. * 任务处理器 */ -public abstract class AbsFileer> { +public abstract class AbsFileer> + implements Runnable { private static final String STATE = "_state_"; private static final String RECORD = "_record_"; /** @@ -139,7 +140,7 @@ public abstract class AbsFileer> - implements Callable { + implements Callable { /** * 线程重试次数 */ @@ -60,13 +60,14 @@ public abstract class AbsThreadTask { public static class Builder { DownloadGroupTaskEntity taskEntity; Handler outHandler; - String targetName; - public Builder(String targetName, DownloadGroupTaskEntity taskEntity) { + public Builder(DownloadGroupTaskEntity taskEntity) { CheckUtil.checkTaskEntity(taskEntity); - this.targetName = targetName; this.taskEntity = taskEntity; } @@ -117,9 +115,7 @@ public class DownloadGroupTask extends AbsGroupTask { } public DownloadGroupTask build() { - DownloadGroupTask task = new DownloadGroupTask(taskEntity, outHandler); - task.setTargetName(targetName); - return task; + return new DownloadGroupTask(taskEntity, outHandler); } } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index b3c84d77..341d4d52 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -370,7 +370,7 @@ public class DownloadReceiver extends AbsReceiver { public void stopAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, + .createCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, ICmd.TASK_TYPE_DOWNLOAD)) .exe(); } @@ -383,7 +383,7 @@ public class DownloadReceiver extends AbsReceiver { public void resumeAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new DownloadTaskEntity(), NormalCmdFactory.TASK_RESUME_ALL, + .createCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_RESUME_ALL, ICmd.TASK_TYPE_DOWNLOAD)) .exe(); } @@ -397,7 +397,7 @@ public class DownloadReceiver extends AbsReceiver { public void removeAllTask(boolean removeFile) { final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP); CancelAllCmd cancelCmd = - (CancelAllCmd) CommonUtil.createNormalCmd(targetName, new DownloadTaskEntity(), + (CancelAllCmd) CommonUtil.createNormalCmd(new DownloadTaskEntity(), NormalCmdFactory.TASK_CANCEL_ALL, ICmd.TASK_TYPE_DOWNLOAD); cancelCmd.removeFile = removeFile; ariaManager.setCmd(cancelCmd).exe(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java index f86f9721..411bb131 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java @@ -143,10 +143,8 @@ public class DownloadTask extends AbsNormalTask { public static class Builder { DownloadTaskEntity taskEntity; Handler outHandler; - String targetName; - public Builder(String targetName, DownloadTaskEntity taskEntity) { - this.targetName = targetName; + public Builder(DownloadTaskEntity taskEntity) { this.taskEntity = taskEntity; } @@ -166,9 +164,7 @@ public class DownloadTask extends AbsNormalTask { } public DownloadTask build() { - DownloadTask task = new DownloadTask(taskEntity, outHandler); - task.setTargetName(targetName); - return task; + return new DownloadTask(taskEntity, outHandler); } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 36db9187..a07e6fe3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -31,13 +31,12 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; /** * Created by AriaL on 2017/6/30. * 任务组核心逻辑 */ -public abstract class AbsGroupUtil implements IUtil { +public abstract class AbsGroupUtil implements IUtil, Runnable { private static final Object LOCK = new Object(); private final String TAG = "AbsGroupUtil"; /** @@ -286,6 +285,10 @@ public abstract class AbsGroupUtil implements IUtil { } @Override public void start() { + new Thread(this).start(); + } + + @Override public void run() { if (isStop || isCancel) { closeTimer(); return; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index bbaa67ed..dcebff93 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -53,10 +53,11 @@ class FtpThreadTask extends AbsFtpThreadTask isBlock = STATE.TASK_RECORD.isBlock; } - @Override public DownloadTaskEntity call() throws Exception { + @Override public FtpThreadTask call() throws Exception { + super.call(); if (mConfig.THREAD_RECORD.isComplete) { handleComplete(); - return mTaskEntity; + return this; } mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -69,7 +70,7 @@ class FtpThreadTask extends AbsFtpThreadTask client = createClient(); if (client == null) { fail(mChildCurrentLocation, "ftp client 创建失败", null); - return mTaskEntity; + return this; } if (mConfig.START_LOCATION > 0) { client.setRestartOffset(mConfig.START_LOCATION); @@ -81,7 +82,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取文件信息错误,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return mTaskEntity; + return this; } String remotePath = new String(mTaskEntity.getUrlEntity().remotePath.getBytes(charSet), SERVER_CHARSET); @@ -93,7 +94,7 @@ class FtpThreadTask extends AbsFtpThreadTask String.format("获取流失败,错误码为:%s,msg:%s", reply, client.getReplyString()), null); client.disconnect(); - return mTaskEntity; + return this; } if (isOpenDynamicFile) { @@ -118,7 +119,7 @@ class FtpThreadTask extends AbsFtpThreadTask e.printStackTrace(); } } - return mTaskEntity; + return this; } /** @@ -165,7 +166,7 @@ class FtpThreadTask extends AbsFtpThreadTask foc = fos.getChannel(); fic = Channels.newChannel(is); ByteBuffer bf = ByteBuffer.allocate(mBufSize); - while (!Thread.currentThread().isInterrupted() && (len = fic.read(bf)) != -1) { + while (isLive() && (len = fic.read(bf)) != -1) { if (isBreak()) { break; } @@ -216,7 +217,7 @@ class FtpThreadTask extends AbsFtpThreadTask file.seek(mConfig.START_LOCATION); byte[] buffer = new byte[mBufSize]; int len; - while (!Thread.currentThread().isInterrupted() && (len = is.read(buffer)) != -1) { + while (isLive() && (len = is.read(buffer)) != -1) { if (isBreak()) { break; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index acf9192b..20575ff0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -56,10 +56,11 @@ final class HttpThreadTask extends AbsThreadTask cmds = new ArrayList<>(); int taskType = checkTaskType(); cmds.add( - CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_STOP, - taskType)); - cmds.add(CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_START, - taskType)); + CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_STOP, taskType)); + cmds.add(CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_START, taskType)); AriaManager.getInstance(AriaManager.APP).setCmds(cmds).exe(); } } @@ -290,8 +288,9 @@ public abstract class AbsTarget implements ITas protected TASK_ENTITY mTaskEntity; protected Handler mOutHandler; - /** - * 用于生成该任务对象的hash码 - */ - private String mTargetName; protected Context mContext; - protected boolean isHeighestTask = false; + boolean isHeighestTask = false; private boolean isCancel = false, isStop = false; protected IUtil mUtil; @@ -212,14 +208,6 @@ public abstract class AbsTask implements ITas */ public abstract String getTaskName(); - public String getTargetName() { - return mTargetName; - } - - @Override public void setTargetName(String targetName) { - this.mTargetName = targetName; - } - public boolean isHighestPriorityTask() { return isHeighestTask; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java index 6a5016a9..21685b0d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java @@ -90,5 +90,4 @@ public interface ITask { */ String getConvertCurrentProgress(); - void setTargetName(String targetName); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java index 8229ae2f..5ae2d674 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java @@ -87,6 +87,8 @@ public class ThreadTaskManager { if (future.isDone() || future.isCancelled()) { continue; } + AbsThreadTask task = (AbsThreadTask) future.get(); + task.setInterrupted(true); future.cancel(true); } } catch (Exception e) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 7bf73715..80cb9a77 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -187,7 +187,6 @@ abstract class AbsTaskQueue ITask createTask( - String targetName, TASK_ENTITY entity, SCHEDULER schedulers) { + TASK_ENTITY entity, SCHEDULER schedulers) { if (entity instanceof DownloadTaskEntity) { - return createDownloadTask(targetName, (DownloadTaskEntity) entity, schedulers); + return createDownloadTask((DownloadTaskEntity) entity, schedulers); } else if (entity instanceof UploadTaskEntity) { - return createUploadTask(targetName, (UploadTaskEntity) entity, schedulers); + return createUploadTask((UploadTaskEntity) entity, schedulers); } else if (entity instanceof DownloadGroupTaskEntity) { - return createDownloadGroupTask(targetName, (DownloadGroupTaskEntity) entity, schedulers); + return createDownloadGroupTask((DownloadGroupTaskEntity) entity, schedulers); } return null; } @@ -78,9 +78,9 @@ class TaskFactory { * @param entity 下载任务实体{@link DownloadGroupTask} * @param schedulers {@link ISchedulers} */ - private DownloadGroupTask createDownloadGroupTask(String targetName, - DownloadGroupTaskEntity entity, ISchedulers schedulers) { - DownloadGroupTask.Builder builder = new DownloadGroupTask.Builder(targetName, entity); + private DownloadGroupTask createDownloadGroupTask(DownloadGroupTaskEntity entity, + ISchedulers schedulers) { + DownloadGroupTask.Builder builder = new DownloadGroupTask.Builder(entity); builder.setOutHandler(schedulers); return builder.build(); } @@ -89,10 +89,8 @@ class TaskFactory { * @param entity 上传任务实体{@link UploadTaskEntity} * @param schedulers {@link ISchedulers} */ - private UploadTask createUploadTask(String targetName, UploadTaskEntity entity, - ISchedulers schedulers) { + private UploadTask createUploadTask(UploadTaskEntity entity, ISchedulers schedulers) { UploadTask.Builder builder = new UploadTask.Builder(); - builder.setTargetName(targetName); builder.setUploadTaskEntity(entity); builder.setOutHandler(schedulers); return builder.build(); @@ -102,9 +100,8 @@ class TaskFactory { * @param entity 下载任务实体{@link DownloadTaskEntity} * @param schedulers {@link ISchedulers} */ - private DownloadTask createDownloadTask(String targetName, DownloadTaskEntity entity, - ISchedulers schedulers) { - DownloadTask.Builder builder = new DownloadTask.Builder(targetName, entity); + private DownloadTask createDownloadTask(DownloadTaskEntity entity, ISchedulers schedulers) { + DownloadTask.Builder builder = new DownloadTask.Builder(entity); builder.setOutHandler(schedulers); return builder.build(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java index 570a0f0d..d235304d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/UploadTaskQueue.java @@ -16,7 +16,6 @@ package com.arialyy.aria.core.queue; -import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.queue.pool.BaseCachePool; import com.arialyy.aria.core.queue.pool.BaseExecutePool; @@ -62,19 +61,15 @@ public class UploadTaskQueue extends AbsTaskQueue return AriaManager.getInstance(AriaManager.APP).getUploadConfig().getMaxTaskNum(); } - @Override public UploadTask createTask(String targetName, UploadTaskEntity entity) { + @Override public UploadTask createTask(UploadTaskEntity entity) { UploadTask task = null; - if (!TextUtils.isEmpty(targetName)) { - if (mCachePool.getTask(entity.getEntity().getKey()) == null - && mExecutePool.getTask(entity.getEntity().getKey()) == null) { - task = (UploadTask) TaskFactory.getInstance() - .createTask(targetName, entity, UploadSchedulers.getInstance()); - mCachePool.putTask(task); - } else { - ALog.w(TAG, "任务已存在"); - } + if (mCachePool.getTask(entity.getEntity().getKey()) == null + && mExecutePool.getTask(entity.getEntity().getKey()) == null) { + task = (UploadTask) TaskFactory.getInstance() + .createTask(entity, UploadSchedulers.getInstance()); + mCachePool.putTask(task); } else { - ALog.e(TAG, "target name 为 null是!!"); + ALog.w(TAG, "任务已存在"); } return task; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java index b56ad759..df175a3e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseNormalTarget.java @@ -80,7 +80,7 @@ abstract class BaseNormalTarget mEntity.save(); mTaskEntity.save(); } - if (mTaskEntity.getUrlEntity().isFtps) { + if (mTaskEntity.getUrlEntity() != null && mTaskEntity.getUrlEntity().isFtps) { if (TextUtils.isEmpty(mTaskEntity.getUrlEntity().storePath)) { ALog.e(TAG, "证书路径为空"); return false; diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java index fe60aae0..99f4978b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java @@ -54,7 +54,7 @@ public class FtpUploadTarget extends BaseNormalTarget public void add() { if (checkEntity()) { AriaManager.getInstance(AriaManager.APP) - .setCmd(CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_CREATE, + .setCmd(CommonUtil.createNormalCmd(mTaskEntity, NormalCmdFactory.TASK_CREATE, checkTaskType())) .exe(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java index 4f6dac4c..a2be1ed4 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java @@ -123,7 +123,7 @@ public class UploadReceiver extends AbsReceiver { public void stopAllTask() { AriaManager.getInstance(AriaManager.APP) .setCmd(NormalCmdFactory.getInstance() - .createCmd(targetName, new UploadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, + .createCmd(new UploadTaskEntity(), NormalCmdFactory.TASK_STOP_ALL, ICmd.TASK_TYPE_UPLOAD)) .exe(); } @@ -137,7 +137,7 @@ public class UploadReceiver extends AbsReceiver { public void removeAllTask(boolean removeFile) { final AriaManager am = AriaManager.getInstance(AriaManager.APP); CancelAllCmd cancelCmd = - (CancelAllCmd) CommonUtil.createNormalCmd(targetName, new UploadTaskEntity(), + (CancelAllCmd) CommonUtil.createNormalCmd(new UploadTaskEntity(), NormalCmdFactory.TASK_CANCEL_ALL, ICmd.TASK_TYPE_UPLOAD); cancelCmd.removeFile = removeFile; am.setCmd(cancelCmd).exe(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index c3a233f6..12c5f8ef 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -50,7 +50,8 @@ class FtpThreadTask extends AbsFtpThreadTask { return mAridManager.getUploadConfig().getMaxSpeed(); } - @Override public UploadTaskEntity call() throws Exception { + @Override public FtpThreadTask call() throws Exception { + super.call(); //当前子线程的下载位置 mChildCurrentLocation = mConfig.START_LOCATION; FTPClient client = null; @@ -61,7 +62,7 @@ class FtpThreadTask extends AbsFtpThreadTask { mConfig.THREAD_ID, mConfig.START_LOCATION, mConfig.END_LOCATION)); client = createClient(); if (client == null) { - return mTaskEntity; + return this; } initPath(); client.makeDirectory(dir); @@ -71,7 +72,7 @@ class FtpThreadTask extends AbsFtpThreadTask { if (!FTPReply.isPositivePreliminary(reply) && reply != FTPReply.FILE_ACTION_OK) { fail(mChildCurrentLocation, "上传失败,错误码为:" + reply + ",msg:" + client.getReplyString(), null); client.disconnect(); - return mTaskEntity; + return this; } file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize); @@ -81,7 +82,7 @@ class FtpThreadTask extends AbsFtpThreadTask { } upload(client, file); if (isBreak()) { - return mTaskEntity; + return this; } ALog.i(TAG, String.format("任务【%s】线程__%s__上传完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID)); @@ -112,7 +113,7 @@ class FtpThreadTask extends AbsFtpThreadTask { e.printStackTrace(); } } - return mTaskEntity; + return this; } private void initPath() throws UnsupportedEncodingException { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index 1978b9ed..17cd60a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -57,12 +57,13 @@ class HttpThreadTask extends AbsThreadTask { isNotNetRetry = mAridManager.getUploadConfig().isNotNetRetry(); } - @Override public UploadTaskEntity call() throws Exception { + @Override public HttpThreadTask call() throws Exception { + super.call(); File uploadFile = new File(mEntity.getFilePath()); if (!uploadFile.exists()) { ALog.e(TAG, String.format("【%s】,文件不存在。", mEntity.getFilePath())); fail(); - return mTaskEntity; + return this; } mListener.onPre(); URL url; @@ -103,7 +104,7 @@ class HttpThreadTask extends AbsThreadTask { e.printStackTrace(); fail(); } - return mTaskEntity; + return this; } private void fail() { @@ -200,7 +201,7 @@ class HttpThreadTask extends AbsThreadTask { if (status == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(mHttpConn.getInputStream())); String line; - while (!Thread.currentThread().isInterrupted() && (line = reader.readLine()) != null) { + while (isLive() && (line = reader.readLine()) != null) { response.append(line); } reader.close(); diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index 3d33e56c..9463a705 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -689,9 +689,9 @@ public class CommonUtil { * @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * ICmd#TASK_TYPE_UPLOAD} */ - public static AbsNormalCmd createNormalCmd(String target, T entity, + public static AbsNormalCmd createNormalCmd(T entity, int cmd, int taskType) { - return NormalCmdFactory.getInstance().createCmd(target, entity, cmd, taskType); + return NormalCmdFactory.getInstance().createCmd(entity, cmd, taskType); } /** diff --git a/README.md b/README.md index 22be89e0..b6c32dc9 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.4.12' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.12' +compile 'com.arialyy.aria:aria-core:3.4.15' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.15' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index af00d525..0f87fafc 100644 --- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -83,7 +83,6 @@ public class UploadTask extends AbsNormalTask { public static class Builder { private Handler mOutHandler; private UploadTaskEntity mTaskEntity; - private String mTargetName; public void setOutHandler(ISchedulers outHandler) { try { @@ -98,18 +97,12 @@ public class UploadTask extends AbsNormalTask { mTaskEntity = taskEntity; } - public void setTargetName(String targetName) { - mTargetName = targetName; - } - public Builder() { } public UploadTask build() { - UploadTask task = new UploadTask(mTaskEntity, mOutHandler); - task.setTargetName(mTargetName); - return task; + return new UploadTask(mTaskEntity, mOutHandler); } } } diff --git a/build.gradle b/build.gradle index c401c2cf..33bd13cb 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.12' + publishVersion = '3.4.15' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 652b53c8372d6d20ebc1c03891de001dc85b9caf Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Thu, 6 Sep 2018 21:43:44 +0800 Subject: [PATCH 19/28] =?UTF-8?q?fix=20bug=20https://github.com/AriaLyy/Ar?= =?UTF-8?q?ia/issues/302=20fix=20bug=20https://github.com/AriaLyy/Aria/iss?= =?UTF-8?q?ues/283=20fix=20bug=20https://github.com/AriaLyy/Aria/issues/30?= =?UTF-8?q?5=20=E7=8E=B0=E5=9C=A8=EF=BC=8C=E5=81=9C=E6=AD=A2=E6=89=80?= =?UTF-8?q?=E6=9C=89=E4=BB=BB=E5=8A=A1=EF=BC=8C=E6=9C=AA=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E7=9A=84=E4=BB=BB=E5=8A=A1=E7=8A=B6=E6=80=81=E5=B0=86=E5=8F=98?= =?UTF-8?q?=E4=B8=BA=E5=81=9C=E6=AD=A2=20=E4=BC=98=E5=8C=96=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E4=BB=BB=E5=8A=A1=E7=9A=84=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/normal/ResumeAllCmd.java | 4 ++ .../arialyy/aria/core/common/AbsFileer.java | 67 ++++++++++++------- .../aria/core/download/BaseDListener.java | 6 +- .../aria/core/download/DownloadGroupTask.java | 39 ++--------- .../aria/core/download/DownloadTask.java | 66 +----------------- .../core/download/downloader/Downloader.java | 5 +- .../arialyy/aria/core/inf/AbsGroupTask.java | 4 +- .../arialyy/aria/core/inf/AbsNormalTask.java | 11 +-- .../com/arialyy/aria/core/inf/AbsTask.java | 59 ++++++++++++++-- .../java/com/arialyy/aria/core/inf/ITask.java | 15 +++-- .../aria/core/inf/TaskSchedulerType.java | 22 ++++++ .../aria/core/manager/ThreadTaskManager.java | 22 +++--- .../arialyy/aria/core/queue/AbsTaskQueue.java | 11 ++- .../aria/core/queue/DownloadTaskQueue.java | 4 +- .../aria/core/scheduler/AbsSchedulers.java | 18 +++-- .../aria/core/upload/BaseUListener.java | 7 +- .../com/arialyy/aria/util/CommonUtil.java | 7 +- .../com/arialyy/compiler/EventProxyFiler.java | 31 ++++++++- DEV_LOG.md | 5 ++ app/src/main/AndroidManifest.xml | 3 +- .../simple/download/SingleTaskActivity.java | 23 ++++++- .../arialyy/aria/core/upload/UploadTask.java | 38 +---------- 22 files changed, 253 insertions(+), 214 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/inf/TaskSchedulerType.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java index 2d183fd0..cb4c0eba 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/ResumeAllCmd.java @@ -1,5 +1,6 @@ package com.arialyy.aria.core.command.normal; +import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadGroupEntity; @@ -62,6 +63,9 @@ final class ResumeAllCmd extends AbsNormalCmd { "isGroupChild=? AND state!=? ORDER BY stopTime DESC", "false", "1"); if (entities != null && !entities.isEmpty()) { for (DownloadEntity entity : entities) { + //if (TextUtils.isEmpty(entity.getDownloadPath())){ + // continue; + //} resumeTask(TEManager.getInstance().getTEntity(DownloadTaskEntity.class, entity.getKey())); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 8308f6b4..b5c5aed8 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -30,10 +30,8 @@ import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.DbHelper; import java.io.File; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.Timer; @@ -191,7 +189,7 @@ public abstract class AbsFileer, TASK extends AbsTask> +class BaseDListener, TASK extends AbsTask> implements IDownloadListener { private static final String TAG = "BaseDListener"; WeakReference outHandler; @@ -42,7 +43,6 @@ class BaseDListener { - private final String TAG = "DownloadGroupTask"; - private DownloadGroupListener mListener; +public class DownloadGroupTask extends AbsGroupTask { private DownloadGroupTask(DownloadGroupTaskEntity taskEntity, Handler outHandler) { mTaskEntity = taskEntity; @@ -43,48 +42,18 @@ public class DownloadGroupTask extends AbsGroupTask { mListener = new DownloadGroupListener(this, mOutHandler); switch (taskEntity.getRequestType()) { case AbsTaskEntity.D_HTTP: - mUtil = new DownloadGroupUtil(mListener, mTaskEntity); + mUtil = new DownloadGroupUtil((IDownloadGroupListener) mListener, mTaskEntity); break; case AbsTaskEntity.D_FTP_DIR: - mUtil = new FtpDirDownloadUtil(mListener, mTaskEntity); + mUtil = new FtpDirDownloadUtil((IDownloadGroupListener) mListener, mTaskEntity); break; } } - @Override public boolean isRunning() { - return mUtil.isRunning(); - } - public DownloadGroupEntity getEntity() { return mTaskEntity.getEntity(); } - @Override public void start() { - if (mUtil.isRunning()) { - ALog.d(TAG, "任务正在下载"); - } else { - mUtil.start(); - } - } - - @Override public void stop() { - super.stop(); - if (!mUtil.isRunning()) { - mListener.onStop(getCurrentProgress()); - } else { - mUtil.stop(); - } - } - - @Override public void cancel() { - super.cancel(); - if (!mUtil.isRunning()) { - mListener.onCancel(); - } else { - mUtil.cancel(); - } - } - @Override public String getTaskName() { return "任务组->" + (TextUtils.isEmpty(mTaskEntity.getEntity().getAlias()) ? mTaskEntity.getEntity().getGroupName() : mTaskEntity.getEntity().getAlias()); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java index 411bb131..07d904ff 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java @@ -19,9 +19,9 @@ package com.arialyy.aria.core.download; import android.os.Handler; import android.os.Looper; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.IUtil; import com.arialyy.aria.core.download.downloader.SimpleDownloadUtil; import com.arialyy.aria.core.inf.AbsNormalTask; +import com.arialyy.aria.core.inf.IDownloadListener; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.util.ALog; import java.io.File; @@ -30,18 +30,15 @@ import java.io.File; * Created by lyy on 2016/8/11. * 下载任务类 */ -public class DownloadTask extends AbsNormalTask { +public class DownloadTask extends AbsNormalTask { public static final String TAG = "DownloadTask"; - private DownloadListener mListener; - private DownloadEntity mEntity; - private DownloadTask(DownloadTaskEntity taskEntity, Handler outHandler) { mTaskEntity = taskEntity; mOutHandler = outHandler; mContext = AriaManager.APP; mListener = new DownloadListener(this, mOutHandler); - mUtil = new SimpleDownloadUtil(taskEntity, mListener); + mUtil = new SimpleDownloadUtil(taskEntity, (IDownloadListener) mListener); mEntity = taskEntity.getEntity(); } @@ -75,67 +72,10 @@ public class DownloadTask extends AbsNormalTask { return mEntity.getUrl(); } - /** - * 是否真正下载 - * - * @return {@code true} 真正下载 - */ - @Override public boolean isRunning() { - return mUtil.isRunning(); - } - public DownloadEntity getDownloadEntity() { return mEntity; } - /** - * 暂停任务,并让任务处于等待状态 - */ - @Override public void stopAndWait() { - stop(true); - } - - /** - * 开始下载 - */ - @Override public void start() { - mListener.isWait = false; - if (mUtil.isRunning()) { - ALog.d(TAG, "任务正在下载"); - } else { - mUtil.start(); - } - } - - /** - * 停止下载 - */ - @Override public void stop() { - super.stop(); - stop(false); - } - - private void stop(boolean isWait) { - mListener.isWait = isWait; - if (mUtil.isRunning()) { - mUtil.stop(); - } else { - mListener.onStop(mEntity.getCurrentProgress()); - } - } - - /** - * 取消下载 - */ - @Override public void cancel() { - super.cancel(); - if (mUtil.isRunning()) { - mUtil.cancel(); - } else { - mListener.onCancel(); - } - } - @Override public String getTaskName() { return mEntity.getFileName(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java index caa53482..0072d5c0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java @@ -58,7 +58,10 @@ class Downloader extends AbsFileer { @Override protected boolean handleNewTask() { if (!mRecord.isBlock) { - CommonUtil.createFile(mTempFile.getPath()); + if (mTempFile.exists()){ + mTempFile.delete(); + } + //CommonUtil.createFile(mTempFile.getPath()); } BufferedRandomAccessFile file = null; try { diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsGroupTask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsGroupTask.java index 89ba2b05..ce2e5f8c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsGroupTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsGroupTask.java @@ -21,8 +21,8 @@ import com.arialyy.aria.core.download.downloader.AbsGroupUtil; * Created by AriaL on 2017/6/29. * 任务组任务抽象类 */ -public abstract class AbsGroupTask - extends AbsTask { +public abstract class AbsGroupTask + extends AbsTask { @Override public String getKey() { return mTaskEntity.getEntity().getKey(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsNormalTask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsNormalTask.java index 7b86e535..3fd15067 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsNormalTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsNormalTask.java @@ -18,15 +18,8 @@ package com.arialyy.aria.core.inf; /** * Created by lyy on 2017/6/3. */ -public abstract class AbsNormalTask - extends AbsTask { - - /** - * 暂停任务,并让任务处于等待状态 - */ - public void stopAndWait() { - - } +public abstract class AbsNormalTask + extends AbsTask { /** * 最高优先级命令,最高优先级命令有以下属性 diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java index fbc8e7d9..b4b33053 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java @@ -18,24 +18,36 @@ package com.arialyy.aria.core.inf; import android.content.Context; import android.os.Handler; import com.arialyy.aria.core.common.IUtil; +import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; /** * Created by AriaL on 2017/6/29. */ -public abstract class AbsTask implements ITask { - +public abstract class AbsTask + implements ITask { /** * 是否需要重试,默认为true */ public boolean needRetry = true; protected TASK_ENTITY mTaskEntity; protected Handler mOutHandler; - protected Context mContext; boolean isHeighestTask = false; private boolean isCancel = false, isStop = false; protected IUtil mUtil; + /** + * 该任务的调度类型 + */ + @TaskSchedulerType + private int mSchedulerType = TaskSchedulerType.TYPE_DEFAULT; + protected IEventListener mListener; + protected ENTITY mEntity; + protected String TAG; + + protected AbsTask() { + TAG = CommonUtil.getClassName(this); + } public Handler getOutHandler() { return mOutHandler; @@ -127,16 +139,55 @@ public abstract class AbsTask implements ITas * * @return 如果实体不存在,则返回null,否则返回扩展字段 */ - @Override public String getExtendField() { + public String getExtendField() { return mTaskEntity.getEntity() == null ? null : mTaskEntity.getEntity().getStr(); } + @Override public void start() { + if (mUtil.isRunning()) { + ALog.d(TAG, "任务正在下载"); + } else { + mUtil.start(); + } + } + @Override public void stop() { + stop(TaskSchedulerType.TYPE_DEFAULT); + } + + @Override public void stop(@TaskSchedulerType int type) { isStop = true; + mSchedulerType = type; + if (mUtil.isRunning()) { + mUtil.stop(); + } else { + mListener.onStop(mEntity.getCurrentProgress()); + } } @Override public void cancel() { isCancel = true; + if (!mUtil.isRunning()) { + mListener.onCancel(); + } else { + mUtil.cancel(); + } + } + + /** + * 是否真正下载 + * + * @return {@code true} 真正下载 + */ + @Override public boolean isRunning() { + return mUtil.isRunning(); + } + + /** + * 任务的调度类型 + */ + public int getSchedulerType() { + return mSchedulerType; } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java index 21685b0d..d8d0dad2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITask.java @@ -25,11 +25,6 @@ public interface ITask { */ int getState(); - /** - * 获取扩展字段 - */ - String getExtendField(); - /** * 唯一标识符,DownloadTask 为下载地址,UploadTask 为文件路径 */ @@ -49,8 +44,17 @@ public interface ITask { void start(); + /** + * 停止任务 + */ void stop(); + /** + * 停止任务 + * @param type {@code 0}默认操作,{@code 1}停止任务不自动执行下一任务 + */ + void stop(int type); + void cancel(); /** @@ -89,5 +93,4 @@ public interface ITask { * @return 返回 3mb */ String getConvertCurrentProgress(); - } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/TaskSchedulerType.java b/Aria/src/main/java/com/arialyy/aria/core/inf/TaskSchedulerType.java new file mode 100644 index 00000000..b25496b7 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/TaskSchedulerType.java @@ -0,0 +1,22 @@ +package com.arialyy.aria.core.inf; + +import android.support.annotation.IntDef; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@IntDef({ + TaskSchedulerType.TYPE_DEFAULT, + TaskSchedulerType.TYPE_STOP_NOT_NEXT, + TaskSchedulerType.TYPE_STOP_AND_WAIT +}) +@Retention(RetentionPolicy.SOURCE) public @interface TaskSchedulerType { + int TYPE_DEFAULT = 1; + /** + * 停止当前任务并且不自动启动下一任务 + */ + int TYPE_STOP_NOT_NEXT = 2; + /** + * 停止任务并让当前任务处于等待状态 + */ + int TYPE_STOP_AND_WAIT = 3; +} \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java index 9efa6b15..84e21e6a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/manager/ThreadTaskManager.java @@ -83,19 +83,21 @@ public class ThreadTaskManager { } key = getKey(key); Set temp = mThreadTasks.get(key); - try { - for (Future future : temp) { - if (future.isDone() || future.isCancelled()) { - continue; + if (temp != null && temp.size() > 0) { + try { + for (Future future : temp) { + if (future.isDone() || future.isCancelled()) { + continue; + } + AbsThreadTask task = (AbsThreadTask) future.get(); + task.setInterrupted(true); + future.cancel(true); } - AbsThreadTask task = (AbsThreadTask) future.get(); - task.setInterrupted(true); - future.cancel(true); + } catch (Exception e) { + ALog.e(TAG, e); } - } catch (Exception e) { - ALog.e(TAG, e); + temp.clear(); } - temp.clear(); mThreadTasks.remove(key); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 80cb9a77..27efbd20 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -19,6 +19,7 @@ package com.arialyy.aria.core.queue; import com.arialyy.aria.core.inf.AbsTask; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IEntity; +import com.arialyy.aria.core.inf.TaskSchedulerType; import com.arialyy.aria.core.queue.pool.BaseCachePool; import com.arialyy.aria.core.queue.pool.BaseExecutePool; import com.arialyy.aria.util.ALog; @@ -69,7 +70,6 @@ abstract class AbsTaskQueue, +abstract class AbsSchedulers> implements ISchedulers { private final String TAG = "AbsSchedulers"; @@ -169,13 +170,13 @@ abstract class AbsSchedulers reTryNum) { callback(FAIL, task); mQueue.removeTaskFormQueue(task.getKey()); - startNextTask(); + startNextTask(task); ALog.d(TAG, "retry_next"); TEManager.getInstance().removeTEntity(task.getKey()); return; @@ -303,7 +304,7 @@ abstract class AbsSchedulers, TASK extends AbsTask> +class BaseUListener, TASK extends AbsTask> implements IUploadListener { private WeakReference outHandler; private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度 @@ -41,7 +42,6 @@ class BaseUListener type = new HashSet<>(); //添加注解方法 for (TaskEnum te : entity.methods.keySet()) { Map, String> temp = entity.methods.get(te); + //if (entity.proxyClassName.contains(TaskEnum.DOWNLOAD.proxySuffix)) { + // type.add(1); + //} else if (entity.proxyClassName.contains(TaskEnum.DOWNLOAD_GROUP.proxySuffix)) { + // type.add(2); + //} else if (entity.proxyClassName.contains(TaskEnum.UPLOAD.proxySuffix)) { + // type.add(3); + //} else if (entity.proxyClassName.contains(TaskEnum.UPLOAD_GROUP.proxySuffix)) { + // type.add(4); + //} if (temp != null) { for (Class annotation : temp.keySet()) { MethodSpec method = createProxyMethod(te, annotation, temp.get(annotation)); @@ -189,6 +200,24 @@ final class EventProxyFiler { sb.append("keyMapping.put(\"").append(methodName).append("\", ").append("set);\n"); cb.add(sb.toString(), ClassName.get(HashSet.class)); } + //注册当前类 + //for (Integer i : type) { + // String str = null; + // switch (i) { + // case 1: + // case 2: + // str = "$T.download(obj).register();\n"; + // break; + // case 3: + // case 4: + // str = "$T.upload(obj).register();\n"; + // break; + // } + // if (str != null) { + // cb.add(str, ClassName.get("com.arialyy.aria.core", "Aria")); + // } + //} + MethodSpec structure = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addCode(cb.build()).build(); builder.addMethod(structure); diff --git a/DEV_LOG.md b/DEV_LOG.md index ba49504a..e7702797 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,9 @@ ## 开发日志 + + v_3.4.17 + - fix bug https://github.com/AriaLyy/Aria/issues/302 + - fix bug https://github.com/AriaLyy/Aria/issues/283 + - 现在,停止所有任务,未开始的任务状态将变为停止 + - 优化停止任务的速度 + v_3.4.12 - fix bug https://github.com/AriaLyy/Aria/issues/286 - 优化线程池任务 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 434990a3..ea9f281d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,12 +13,11 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"> - - + diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 38d01617..6ac0832b 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -17,6 +17,7 @@ package com.arialyy.simple.download; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.util.Log; @@ -47,7 +48,9 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + //"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + //"https://yizi-kejian.oss-cn-beijing.aliyuncs.com/qimeng/package1/qmtable11.zip"; + "http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk"; //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 //"https://static.donguo.me//video/ip/course/pfys_1.mp4"; //"https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864"; @@ -188,6 +191,11 @@ public class SingleTaskActivity extends BaseActivity { L.d(TAG, "path ==> " + task.getDownloadEntity().getDownloadPath()); L.d(TAG, "md5Code ==> " + CommonUtil.getFileMD5(new File(task.getDownloadPath()))); L.d(TAG, "data ==> " + Aria.download(this).getDownloadEntity(DOWNLOAD_URL)); + //Intent install = new Intent(Intent.ACTION_VIEW); + //install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //File apkFile = new File(task.getDownloadPath()); + //install.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); + //startActivity(install); } } @@ -228,7 +236,7 @@ public class SingleTaskActivity extends BaseActivity { //Aria.download(this).load(DOWNLOAD_URL).removeRecord(); break; case R.id.cancel: - Aria.download(this).load(DOWNLOAD_URL).cancel(); + Aria.download(this).load(DOWNLOAD_URL).cancel(true); //Aria.download(this).load(DOWNLOAD_URL).removeRecord(); break; } @@ -237,6 +245,12 @@ public class SingleTaskActivity extends BaseActivity { private void startD() { //Aria.get(this).setLogLevel(ALog.LOG_CLOSE); //Aria.download(this).load("aaaa.apk"); + String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg8.apk"; + //File file = new File(path); + //if (file.exists()){ + // file.delete(); + //} + Aria.download(SingleTaskActivity.this) .load(DOWNLOAD_URL) //.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8") @@ -245,7 +259,10 @@ public class SingleTaskActivity extends BaseActivity { //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") //.useServerFileName(true) //.setRequestMode(RequestEnum.GET) - .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/ggsg4.apk") + .setFilePath(path) + //.setExtendField("{\n" + // + "\"id\":\"你的样子\"\n< > " + // + "}") //.resetState() .start(); //.add(); diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index 0f87fafc..4ea9b707 100644 --- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -18,6 +18,7 @@ package com.arialyy.aria.core.upload; import android.os.Handler; import android.os.Looper; import com.arialyy.aria.core.inf.AbsNormalTask; +import com.arialyy.aria.core.inf.IUploadListener; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.core.upload.uploader.SimpleUploadUtil; import com.arialyy.aria.util.ALog; @@ -26,56 +27,23 @@ import com.arialyy.aria.util.ALog; * Created by lyy on 2017/2/23. * 上传任务 */ -public class UploadTask extends AbsNormalTask { - private static final String TAG = "UploadTask"; - - private BaseUListener mListener; +public class UploadTask extends AbsNormalTask { private UploadTask(UploadTaskEntity taskEntity, Handler outHandler) { mTaskEntity = taskEntity; mOutHandler = outHandler; mListener = new BaseUListener<>(this, mOutHandler); - mUtil = new SimpleUploadUtil(taskEntity, mListener); + mUtil = new SimpleUploadUtil(taskEntity, (IUploadListener) mListener); } @Override public String getKey() { return mTaskEntity.getEntity().getFilePath(); } - @Override public boolean isRunning() { - return mUtil.isRunning(); - } - public UploadEntity getEntity() { return mTaskEntity.getEntity(); } - @Override public void start() { - if (mUtil.isRunning()) { - ALog.d(TAG, "任务正在下载"); - } else { - mUtil.start(); - } - } - - @Override public void stop() { - super.stop(); - if (mUtil.isRunning()) { - mUtil.stop(); - } else { - mListener.onStop(getCurrentProgress()); - } - } - - @Override public void cancel() { - super.cancel(); - if (mUtil.isRunning()) { - mUtil.cancel(); - } else { - mListener.onCancel(); - } - } - @Override public String getTaskName() { return mTaskEntity.getEntity().getFileName(); } From a33df648ab55526b1dda7f4c75e4c95666f4e5a6 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Fri, 7 Sep 2018 15:31:10 +0800 Subject: [PATCH 20/28] fix bug fix bug https://github.com/AriaLyy/Aria/issues/272 --- .../arialyy/aria/core/common/AbsFileer.java | 18 ++++---- .../aria/core/download/BaseDListener.java | 4 +- .../aria/core/download/DownloadGroupTask.java | 9 +--- .../aria/core/download/DownloadTask.java | 7 +--- .../download/downloader/AbsGroupUtil.java | 41 ++++++++----------- DEV_LOG.md | 7 +++- app/src/main/AndroidManifest.xml | 6 +-- .../arialyy/aria/core/upload/UploadTask.java | 8 +--- build.gradle | 2 +- 9 files changed, 39 insertions(+), 63 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index b5c5aed8..f6b6b3b7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -34,8 +34,8 @@ import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * Created by AriaL on 2017/7/1. @@ -67,7 +67,7 @@ public abstract class AbsFileer mTask = new SparseArray<>(); - private Timer mTimer; + private ScheduledThreadPoolExecutor mTimer; @Deprecated private File mConfigFile; /** * 进度刷新间隔 @@ -190,8 +190,8 @@ public abstract class AbsFileer outHandler; private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度 - private long mLastLen = 0; //上一次发送长度 + private long mLastLen; //上一次发送长度 private boolean isFirst = true; protected ENTITY mEntity; protected TASK_ENTITY mTaskEntity; private TASK mTask; - private boolean isConvertSpeed = false; + private boolean isConvertSpeed; private long mLastSaveTime; private long mUpdateInterval; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java index 0443e1d4..855ab3e9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTask.java @@ -18,7 +18,6 @@ package com.arialyy.aria.core.download; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; -import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.download.downloader.DownloadGroupUtil; import com.arialyy.aria.core.download.downloader.FtpDirDownloadUtil; @@ -26,7 +25,6 @@ import com.arialyy.aria.core.download.downloader.IDownloadGroupListener; import com.arialyy.aria.core.inf.AbsGroupTask; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.scheduler.ISchedulers; -import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CheckUtil; /** @@ -74,12 +72,7 @@ public class DownloadGroupTask extends AbsGroupTask - + @@ -29,7 +29,7 @@ - + diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index 4ea9b707..84b62020 100644 --- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -21,7 +21,6 @@ import com.arialyy.aria.core.inf.AbsNormalTask; import com.arialyy.aria.core.inf.IUploadListener; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.core.upload.uploader.SimpleUploadUtil; -import com.arialyy.aria.util.ALog; /** * Created by lyy on 2017/2/23. @@ -53,12 +52,7 @@ public class UploadTask extends AbsNormalTask { private UploadTaskEntity mTaskEntity; public void setOutHandler(ISchedulers outHandler) { - try { - mOutHandler = new Handler(outHandler); - } catch (Exception e) { - e.printStackTrace(); - mOutHandler = new Handler(Looper.getMainLooper(), outHandler); - } + mOutHandler = new Handler(Looper.getMainLooper(), outHandler); } public void setUploadTaskEntity(UploadTaskEntity taskEntity) { diff --git a/build.gradle b/build.gradle index ed1e5bf9..f2f07861 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.4.16' + publishVersion = '3.5_dev1' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From ff81d43e726aecd236363f3285f612366966c636 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 10 Sep 2018 19:35:55 +0800 Subject: [PATCH 21/28] 3.5 --- .../aria/core/common/BaseListener.java | 139 ++++++++++++++++++ .../aria/core/download/BaseDListener.java | 119 +-------------- .../aria/core/download/BaseGroupTarget.java | 2 +- .../core/download/DownloadGroupListener.java | 39 ++++- .../core/download/DownloadGroupTarget.java | 9 +- .../aria/core/download/DownloadListener.java | 35 ----- .../aria/core/download/DownloadTask.java | 2 +- .../aria/core/upload/BaseUListener.java | 118 +-------------- .../java/com/arialyy/aria/orm/SqlUtil.java | 2 +- .../com/arialyy/annotations/Download.java | 2 +- .../arialyy/annotations/DownloadGroup.java | 2 +- .../com/arialyy/compiler/ParamObtainUtil.java | 2 +- .../java/com/arialyy/compiler/PrintLog.java | 2 +- .../com/arialyy/compiler/ProxyClassParam.java | 2 +- .../java/com/arialyy/compiler/TaskEnum.java | 2 +- DEV_LOG.md | 2 + README.md | 17 ++- app/src/main/AndroidManifest.xml | 2 +- .../java/com/arialyy/simple/MainActivity.java | 2 +- .../download/DownloadDialogFragment.java | 2 +- .../simple/download/FtpDownloadActivity.java | 2 +- .../simple/download/KotlinDownloadActivity.kt | 2 +- .../simple/download/SimpleNotification.java | 2 +- .../fragment_download/DownloadFragment.java | 2 +- .../fragment_download/FragmentActivity.java | 2 +- .../download/group/ChildHandleDialog.java | 2 +- .../download/group/DownloadGroupActivity.java | 2 +- .../group/FTPDirDownloadActivity.java | 2 +- .../simple/download/group/GroupModule.java | 2 +- .../download/multi_download/MultiEntity.java | 2 +- .../download/multi_download/MultiModule.java | 2 +- .../DownloadNotification.java | 2 +- .../service_download/DownloadService.java | 2 +- .../simple/upload/FtpUploadActivity.java | 2 +- .../simple/upload/HttpUploadActivity.java | 2 +- .../simple/widget/SubStateLinearLayout.java | 2 +- .../arialyy/aria/core/upload/UploadTask.java | 2 +- 37 files changed, 240 insertions(+), 296 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/BaseListener.java delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/download/DownloadListener.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/BaseListener.java b/Aria/src/main/java/com/arialyy/aria/core/common/BaseListener.java new file mode 100644 index 00000000..cf182319 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/common/BaseListener.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.core.common; + +import android.os.Handler; +import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.inf.AbsEntity; +import com.arialyy.aria.core.inf.AbsTask; +import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.inf.IEntity; +import com.arialyy.aria.core.inf.IEventListener; +import com.arialyy.aria.core.inf.TaskSchedulerType; +import com.arialyy.aria.core.scheduler.ISchedulers; +import com.arialyy.aria.util.CommonUtil; +import java.lang.ref.WeakReference; + +public abstract class BaseListener, TASK extends AbsTask> + implements IEventListener { + private static final String TAG = "BaseListener"; + protected WeakReference outHandler; + private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度 + private long mLastLen; //上一次发送长度 + private boolean isFirst = true; + private TASK mTask; + private long mLastSaveTime; + protected ENTITY mEntity; + protected TASK_ENTITY mTaskEntity; + protected boolean isConvertSpeed; + protected long mUpdateInterval; + protected AriaManager manager; + + protected BaseListener(TASK task, Handler outHandler) { + this.outHandler = new WeakReference<>(outHandler); + this.mTask = new WeakReference<>(task).get(); + this.mEntity = mTask.getTaskEntity().getEntity(); + this.mTaskEntity = mTask.getTaskEntity(); + manager = AriaManager.getInstance(AriaManager.APP); + mLastLen = mEntity.getCurrentProgress(); + mLastSaveTime = System.currentTimeMillis(); + } + + @Override public void onPre() { + saveData(IEntity.STATE_PRE, -1); + sendInState2Target(ISchedulers.PRE); + } + + @Override public void onStart(long startLocation) { + saveData(IEntity.STATE_RUNNING, startLocation); + sendInState2Target(ISchedulers.START); + } + + @Override public void onResume(long resumeLocation) { + saveData(IEntity.STATE_RUNNING, resumeLocation); + sendInState2Target(ISchedulers.RESUME); + } + + @Override public void onProgress(long currentLocation) { + mEntity.setCurrentProgress(currentLocation); + long speed = currentLocation - mLastLen; + if (isFirst) { + speed = 0; + isFirst = false; + } + handleSpeed(speed); + sendInState2Target(ISchedulers.RUNNING); + if (System.currentTimeMillis() - mLastSaveTime >= RUN_SAVE_INTERVAL) { + saveData(IEntity.STATE_RUNNING, currentLocation); + mLastSaveTime = System.currentTimeMillis(); + } + + mLastLen = currentLocation; + } + + @Override public void onStop(long stopLocation) { + saveData(mTask.getSchedulerType() == TaskSchedulerType.TYPE_STOP_AND_WAIT ? IEntity.STATE_WAIT + : IEntity.STATE_STOP, stopLocation); + handleSpeed(0); + sendInState2Target(ISchedulers.STOP); + } + + @Override public void onComplete() { + saveData(IEntity.STATE_COMPLETE, mEntity.getFileSize()); + handleSpeed(0); + sendInState2Target(ISchedulers.COMPLETE); + } + + @Override public void onCancel() { + saveData(IEntity.STATE_CANCEL, -1); + handleSpeed(0); + sendInState2Target(ISchedulers.CANCEL); + } + + @Override public void onFail(boolean needRetry) { + mEntity.setFailNum(mEntity.getFailNum() + 1); + saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); + handleSpeed(0); + mTask.needRetry = needRetry; + sendInState2Target(ISchedulers.FAIL); + } + + private void handleSpeed(long speed) { + if (mUpdateInterval != 1000) { + speed = speed * 1000 / mUpdateInterval; + } + if (isConvertSpeed) { + mEntity.setConvertSpeed(CommonUtil.formatFileSize(speed < 0 ? 0 : speed) + "/s"); + } + mEntity.setSpeed(speed < 0 ? 0 : speed); + + mEntity.setPercent((int) (mEntity.getFileSize() <= 0 ? 0 + : mEntity.getCurrentProgress() * 100 / mEntity.getFileSize())); + } + + /** + * 将任务状态发送给下载器 + * + * @param state {@link ISchedulers#START} + */ + protected void sendInState2Target(int state) { + if (outHandler.get() != null) { + outHandler.get().obtainMessage(state, mTask).sendToTarget(); + } + } + + protected abstract void saveData(int state, long location); +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java index 9f375155..a2ddef33 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java @@ -16,53 +16,27 @@ package com.arialyy.aria.core.download; import android.os.Handler; -import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.common.BaseListener; import com.arialyy.aria.core.common.TaskRecord; -import com.arialyy.aria.core.inf.AbsEntity; -import com.arialyy.aria.core.inf.AbsTask; -import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IDownloadListener; import com.arialyy.aria.core.inf.IEntity; -import com.arialyy.aria.core.inf.TaskSchedulerType; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.CommonUtil; -import java.lang.ref.WeakReference; /** * 下载监听类 */ -class BaseDListener, TASK extends AbsTask> +class BaseDListener extends BaseListener implements IDownloadListener { private static final String TAG = "BaseDListener"; - WeakReference outHandler; - private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度 - private long mLastLen; //上一次发送长度 - private boolean isFirst = true; - protected ENTITY mEntity; - protected TASK_ENTITY mTaskEntity; - private TASK mTask; - private boolean isConvertSpeed; - private long mLastSaveTime; - private long mUpdateInterval; - BaseDListener(TASK task, Handler outHandler) { - this.outHandler = new WeakReference<>(outHandler); - this.mTask = new WeakReference<>(task).get(); - this.mEntity = mTask.getTaskEntity().getEntity(); - this.mTaskEntity = mTask.getTaskEntity(); - final AriaManager manager = AriaManager.getInstance(AriaManager.APP); + BaseDListener(DownloadTask task, Handler outHandler) { + super(task, outHandler); isConvertSpeed = manager.getDownloadConfig().isConvertSpeed(); - mLastLen = mEntity.getCurrentProgress(); - mLastSaveTime = System.currentTimeMillis(); mUpdateInterval = manager.getDownloadConfig().getUpdateInterval(); } - @Override public void onPre() { - saveData(IEntity.STATE_PRE, -1); - sendInState2Target(ISchedulers.PRE); - } - @Override public void onPostPre(long fileSize) { mEntity.setFileSize(fileSize); mEntity.setConvertFileSize(CommonUtil.formatFileSize(fileSize)); @@ -74,84 +48,8 @@ class BaseDListener= RUN_SAVE_INTERVAL) { - saveData(IEntity.STATE_RUNNING, currentLocation); - mLastSaveTime = System.currentTimeMillis(); - } - - mLastLen = currentLocation; - } - - @Override public void onStop(long stopLocation) { - saveData(mTask.getSchedulerType() == TaskSchedulerType.TYPE_STOP_AND_WAIT ? IEntity.STATE_WAIT : IEntity.STATE_STOP, stopLocation); - handleSpeed(0); - sendInState2Target(ISchedulers.STOP); - } - - @Override public void onCancel() { - saveData(IEntity.STATE_CANCEL, -1); - handleSpeed(0); - sendInState2Target(ISchedulers.CANCEL); - } - - @Override public void onComplete() { - saveData(IEntity.STATE_COMPLETE, mEntity.getFileSize()); - handleSpeed(0); - sendInState2Target(ISchedulers.COMPLETE); - } - - @Override public void onFail(boolean needRetry) { - mEntity.setFailNum(mEntity.getFailNum() + 1); - saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); - handleSpeed(0); - mTask.needRetry = needRetry; - sendInState2Target(ISchedulers.FAIL); - } - - private void handleSpeed(long speed) { - if (mUpdateInterval != 1000) { - speed = speed * 1000 / mUpdateInterval; - } - if (isConvertSpeed) { - mEntity.setConvertSpeed(CommonUtil.formatFileSize(speed < 0 ? 0 : speed) + "/s"); - } - mEntity.setSpeed(speed < 0 ? 0 : speed); - - mEntity.setPercent((int) (mEntity.getFileSize() <= 0 ? 0 - : mEntity.getCurrentProgress() * 100 / mEntity.getFileSize())); - } - - /** - * 将任务状态发送给下载器 - * - * @param state {@link ISchedulers#START} - */ - private void sendInState2Target(int state) { - if (outHandler.get() != null) { - outHandler.get().obtainMessage(state, mTask).sendToTarget(); - } - } - - private void saveData(int state, long location) { + @Override + protected void saveData(int state, long location) { mTaskEntity.setState(state); mEntity.setState(state); mEntity.setComplete(state == IEntity.STATE_COMPLETE); @@ -160,14 +58,11 @@ class BaseDListener extends AbsDownloadTarget { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java index d029b959..403d9e1b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java @@ -16,17 +16,20 @@ package com.arialyy.aria.core.download; import android.os.Handler; +import com.arialyy.aria.core.common.BaseListener; import com.arialyy.aria.core.download.downloader.IDownloadGroupListener; import com.arialyy.aria.core.inf.GroupSendParams; +import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.util.ALog; +import com.arialyy.aria.util.CommonUtil; /** * Created by Aria.Lao on 2017/7/20. * 任务组下载事件 */ class DownloadGroupListener - extends BaseDListener + extends BaseListener implements IDownloadGroupListener { private final String TAG = "DownloadGroupListener"; private GroupSendParams mSeedEntity; @@ -35,6 +38,8 @@ class DownloadGroupListener super(task, outHandler); mSeedEntity = new GroupSendParams<>(); mSeedEntity.groupTask = task; + isConvertSpeed = manager.getDownloadConfig().isConvertSpeed(); + mUpdateInterval = manager.getDownloadConfig().getUpdateInterval(); } @Override public void onSubPre(DownloadEntity subEntity) { @@ -100,4 +105,36 @@ class DownloadGroupListener mEntity.setCurrentProgress(location); mEntity.update(); } + + @Override public void onPostPre(long fileSize) { + mEntity.setFileSize(fileSize); + mEntity.setConvertFileSize(CommonUtil.formatFileSize(fileSize)); + saveData(IEntity.STATE_POST_PRE, -1); + sendInState2Target(ISchedulers.POST_PRE); + } + + @Override public void supportBreakpoint(boolean support) { + + } + + @Override protected void saveData(int state, long location) { + mTaskEntity.setState(state); + mEntity.setState(state); + mEntity.setComplete(state == IEntity.STATE_COMPLETE); + if (state == IEntity.STATE_CANCEL) { + if (mEntity instanceof DownloadGroupEntity) { + CommonUtil.delGroupTaskRecord(mTaskEntity.isRemoveFile(), mEntity); + } + return; + } else if (state == IEntity.STATE_STOP) { + mEntity.setStopTime(System.currentTimeMillis()); + } else if (mEntity.isComplete()) { + mEntity.setCompleteTime(System.currentTimeMillis()); + mEntity.setCurrentProgress(mEntity.getFileSize()); + } + if (location > 0) { + mEntity.setCurrentProgress(location); + } + mTaskEntity.update(); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java index 6a1adcf4..9a35d94b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java @@ -262,15 +262,16 @@ public class DownloadGroupTarget extends BaseGroupTarget im if (!newName.equals(entity.getFileName())) { String oldPath = mEntity.getDirPath() + "/" + entity.getFileName(); String newPath = mEntity.getDirPath() + "/" + newName; - File oldFile = new File(oldPath); - if (oldFile.exists()) { - oldFile.renameTo(new File(newPath)); - } if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'", newPath)) { ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在或文件已下载", newPath)); return; } + File oldFile = new File(oldPath); + if (oldFile.exists()) { + oldFile.renameTo(new File(newPath)); + } + CommonUtil.modifyTaskRecord(oldFile.getPath(), newPath); entity.setDownloadPath(newPath); taskEntity.setKey(newPath); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadListener.java deleted file mode 100644 index 78cf1d9f..00000000 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadListener.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.arialyy.aria.core.download; - -import android.os.Handler; -import com.arialyy.aria.core.inf.IDownloadListener; - -/** - * Created by Aria.Lao on 2017/7/20. - * 普通任务下载的事件监听器 - */ -class DownloadListener extends BaseDListener - implements IDownloadListener { - DownloadListener(DownloadTask task, Handler outHandler) { - super(task, outHandler); - } - - @Override public void supportBreakpoint(boolean support) { - - } - -} diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java index 6e0776b1..83a3f5e2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTask.java @@ -37,7 +37,7 @@ public class DownloadTask extends AbsNormalTask, TASK extends AbsTask> +class BaseUListener extends BaseListener implements IUploadListener { - private WeakReference outHandler; - private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度 - private long mLastLen = 0; //上一次发送长度 - private boolean isFirst = true; - protected ENTITY mEntity; - protected TASK_ENTITY mTaskEntity; - protected TASK mTask; - private boolean isConvertSpeed = false; - private long mLastSaveTime; - private long mUpdateInterval; - BaseUListener(TASK task, Handler outHandler) { - this.outHandler = new WeakReference<>(outHandler); - this.mTask = new WeakReference<>(task).get(); - this.mEntity = this.mTask.getTaskEntity().getEntity(); - this.mTaskEntity = this.mTask.getTaskEntity(); - final AriaManager manager = AriaManager.getInstance(AriaManager.APP); - isConvertSpeed = manager.getDownloadConfig().isConvertSpeed(); - mLastLen = mEntity.getCurrentProgress(); - mLastSaveTime = System.currentTimeMillis(); + BaseUListener(UploadTask task, Handler outHandler) { + super(task, outHandler); + isConvertSpeed = manager.getUploadConfig().isConvertSpeed(); mUpdateInterval = manager.getUploadConfig().getUpdateInterval(); } - @Override public void onPre() { - saveData(IEntity.STATE_PRE, -1); - sendInState2Target(ISchedulers.PRE); - } - - @Override public void onStart(long startLocation) { - saveData(IEntity.STATE_RUNNING, startLocation); - sendInState2Target(ISchedulers.START); - } - - @Override public void onResume(long resumeLocation) { - saveData(IEntity.STATE_RUNNING, resumeLocation); - sendInState2Target(ISchedulers.RESUME); - } - - @Override public void onProgress(long currentLocation) { - mEntity.setCurrentProgress(currentLocation); - long speed = currentLocation - mLastLen; - if (isFirst) { - speed = 0; - isFirst = false; - } - handleSpeed(speed); - sendInState2Target(ISchedulers.RUNNING); - if (System.currentTimeMillis() - mLastSaveTime >= RUN_SAVE_INTERVAL) { - saveData(IEntity.STATE_RUNNING, currentLocation); - mLastSaveTime = System.currentTimeMillis(); - } - mLastLen = currentLocation; - } - - @Override public void onStop(long stopLocation) { - saveData(mTask.getSchedulerType() == TaskSchedulerType.TYPE_STOP_AND_WAIT ? IEntity.STATE_WAIT - : IEntity.STATE_STOP, stopLocation); - handleSpeed(0); - sendInState2Target(ISchedulers.STOP); - } - - @Override public void onCancel() { - saveData(IEntity.STATE_CANCEL, -1); - handleSpeed(0); - sendInState2Target(ISchedulers.CANCEL); - } - - @Override public void onComplete() { - saveData(IEntity.STATE_COMPLETE, mEntity.getFileSize()); - handleSpeed(0); - sendInState2Target(ISchedulers.COMPLETE); - } - - @Override public void onFail(boolean needRetry) { - mEntity.setFailNum(mEntity.getFailNum() + 1); - saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); - handleSpeed(0); - mTask.needRetry = needRetry; - sendInState2Target(ISchedulers.FAIL); - } - - private void handleSpeed(long speed) { - if (mUpdateInterval != 1000) { - speed = speed * 1000 / mUpdateInterval; - } - if (isConvertSpeed) { - mEntity.setConvertSpeed(CommonUtil.formatFileSize(speed < 0 ? 0 : speed) + "/s"); - } - mEntity.setSpeed(speed < 0 ? 0 : speed); - mEntity.setPercent((int) (mEntity.getFileSize() <= 0 ? 0 - : mEntity.getCurrentProgress() * 100 / mEntity.getFileSize())); - } - - /** - * 将任务状态发送给下载器 - * - * @param state {@link ISchedulers#START} - */ - private void sendInState2Target(int state) { - if (outHandler.get() != null) { - outHandler.get().obtainMessage(state, mTask).sendToTarget(); - } - } - - private void saveData(int state, long location) { + @Override + protected void saveData(int state, long location) { mTaskEntity.setState(state); mEntity.setState(state); mEntity.setComplete(state == IEntity.STATE_COMPLETE); @@ -147,7 +45,7 @@ class BaseUListener * diff --git a/AriaAnnotations/src/main/java/com/arialyy/annotations/DownloadGroup.java b/AriaAnnotations/src/main/java/com/arialyy/annotations/DownloadGroup.java index bb26d4f1..b36529d6 100644 --- a/AriaAnnotations/src/main/java/com/arialyy/annotations/DownloadGroup.java +++ b/AriaAnnotations/src/main/java/com/arialyy/annotations/DownloadGroup.java @@ -21,7 +21,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Created by Aria.Lao on 2017/6/6. + * Created by lyy on 2017/6/6. * Aria下载事件被注解的方法中,参数仅能有一个,参数类型为{@link com.arialyy.aria.core.download.DownloadGroupTask} *

  *   
diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java
index 128b361a..63a4440d 100644
--- a/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java
+++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java
@@ -33,7 +33,7 @@ import javax.lang.model.element.VariableElement;
 import javax.lang.model.util.Elements;
 
 /**
- * Created by Aria.Lao on 2017/9/6.
+ * Created by lyy on 2017/9/6.
  * 构建代理文件的参数获取工具
  */
 class ParamObtainUtil {
diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/PrintLog.java b/AriaCompiler/src/main/java/com/arialyy/compiler/PrintLog.java
index 2ad5d754..3720ce6b 100644
--- a/AriaCompiler/src/main/java/com/arialyy/compiler/PrintLog.java
+++ b/AriaCompiler/src/main/java/com/arialyy/compiler/PrintLog.java
@@ -20,7 +20,7 @@ import javax.lang.model.element.Element;
 import javax.tools.Diagnostic;
 
 /**
- * Created by Aria.Lao on 2017/6/6.
+ * Created by lyy on 2017/6/6.
  */
 class PrintLog {
 
diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java
index ddfaaeaf..3b9a9a88 100644
--- a/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java
+++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java
@@ -21,7 +21,7 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * Created by Aria.Lao on 2017/6/7.
+ * Created by lyy on 2017/6/7.
  * 代理类参数
  */
 class ProxyClassParam {
diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/TaskEnum.java b/AriaCompiler/src/main/java/com/arialyy/compiler/TaskEnum.java
index ee0fb4c8..d5a65feb 100644
--- a/AriaCompiler/src/main/java/com/arialyy/compiler/TaskEnum.java
+++ b/AriaCompiler/src/main/java/com/arialyy/compiler/TaskEnum.java
@@ -16,7 +16,7 @@
 package com.arialyy.compiler;
 
 /**
- * Created by Aria.Lao on 2017/7/10.
+ * Created by lyy on 2017/7/10.
  * 任务类型枚举
  */
 enum TaskEnum {
diff --git a/DEV_LOG.md b/DEV_LOG.md
index 8813a308..e911c570 100644
--- a/DEV_LOG.md
+++ b/DEV_LOG.md
@@ -6,7 +6,9 @@
     - fix bug https://github.com/AriaLyy/Aria/issues/306
     - fix bug https://github.com/AriaLyy/Aria/issues/272  (现在,停止所有任务,未开始的任务状态将变为停止)
     - fix bug https://github.com/AriaLyy/Aria/issues/277
+    - fix bug https://github.com/AriaLyy/Aria/issues/303
     - 优化停止任务的速度
+    - 修复组合任务修改子任务文件名失败的问题
   + v_3.4.12
     - fix bug https://github.com/AriaLyy/Aria/issues/286
     - 优化线程池任务
diff --git a/README.md b/README.md
index e97d035f..f7a83467 100644
--- a/README.md
+++ b/README.md
@@ -32,8 +32,8 @@ Aria有以下特点:
 [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion)
 [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion)
 ```java
-compile 'com.arialyy.aria:aria-core:3.4.16'
-annotationProcessor 'com.arialyy.aria:aria-compiler:3.4.16'
+compile 'com.arialyy.aria:aria-core:3.5'
+annotationProcessor 'com.arialyy.aria:aria-compiler:3.5'
 ```
 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为
 ```
@@ -101,9 +101,16 @@ protected void onCreate(Bundle savedInstanceState) {
 
 
 ### 版本日志
-  + v_3.4.12
-    - fix bug https://github.com/AriaLyy/Aria/issues/286
-    - 优化线程池任务
+  + v_3.5
+    - fix bug https://github.com/AriaLyy/Aria/issues/302
+    - fix bug https://github.com/AriaLyy/Aria/issues/283
+    - fix bug https://github.com/AriaLyy/Aria/issues/305
+    - fix bug https://github.com/AriaLyy/Aria/issues/306
+    - fix bug https://github.com/AriaLyy/Aria/issues/272  (现在,停止所有任务,未开始的任务状态将变为停止)
+    - fix bug https://github.com/AriaLyy/Aria/issues/277
+    - fix bug https://github.com/AriaLyy/Aria/issues/303
+    - 优化停止任务的速度
+    - 修复组合任务修改子任务文件名失败的问题
 
 [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md)
 
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 87d72e57..b35e5470 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -35,7 +35,7 @@
     
     
     
-    
+    
     
     
     
diff --git a/app/src/main/java/com/arialyy/simple/MainActivity.java b/app/src/main/java/com/arialyy/simple/MainActivity.java
index 36142640..aa8f7d8c 100644
--- a/app/src/main/java/com/arialyy/simple/MainActivity.java
+++ b/app/src/main/java/com/arialyy/simple/MainActivity.java
@@ -31,7 +31,7 @@ import com.arialyy.simple.upload.FtpUploadActivity;
 import com.arialyy.simple.upload.HttpUploadActivity;
 
 /**
- * Created by Aria.Lao on 2017/3/1.
+ * Created by lyy on 2017/3/1.
  */
 public class MainActivity extends BaseActivity {
 
diff --git a/app/src/main/java/com/arialyy/simple/download/DownloadDialogFragment.java b/app/src/main/java/com/arialyy/simple/download/DownloadDialogFragment.java
index 91a091fb..a6be21c8 100644
--- a/app/src/main/java/com/arialyy/simple/download/DownloadDialogFragment.java
+++ b/app/src/main/java/com/arialyy/simple/download/DownloadDialogFragment.java
@@ -17,7 +17,7 @@ import com.arialyy.simple.base.BaseDialog;
 import com.arialyy.simple.databinding.DialogFragmentDownloadBinding;
 
 /**
- * Created by Aria.Lao on 2017/8/8.
+ * Created by lyy on 2017/8/8.
  */
 @SuppressLint("ValidFragment") public class DownloadDialogFragment
     extends BaseDialog {
diff --git a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
index 332183f6..1a13aa42 100644
--- a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java
@@ -31,7 +31,7 @@ import com.arialyy.simple.databinding.ActivityFtpDownloadBinding;
 import java.io.File;
 
 /**
- * Created by Aria.Lao on 2017/7/25.
+ * Created by lyy on 2017/7/25.
  * Ftp下载测试
  */
 public class FtpDownloadActivity extends BaseActivity {
diff --git a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt
index 4848e007..16c3e6e8 100644
--- a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt
+++ b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt
@@ -12,7 +12,7 @@ import com.arialyy.simple.R
 import com.arialyy.simple.base.BaseActivity
 
 /**
- * Created by Aria.Lao on 2017/10/23.
+ * Created by lyy on 2017/10/23.
  */
 class KotlinDownloadActivity : AppCompatActivity() {
 
diff --git a/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java b/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java
index 23346c15..285e066a 100644
--- a/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java
+++ b/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java
@@ -26,7 +26,7 @@
 //import com.arialyy.simple.R;
 //
 ///**
-// * Created by Aria.Lao on 2017/1/18.
+// * Created by lyy on 2017/1/18.
 // */
 //
 //public class SimpleNotification {
diff --git a/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java b/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java
index d8ba2fb4..2f27ca33 100644
--- a/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java
+++ b/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java
@@ -35,7 +35,7 @@ import com.arialyy.simple.databinding.FragmentDownloadBinding;
 import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
 
 /**
- * Created by Aria.Lao on 2017/1/4.
+ * Created by lyy on 2017/1/4.
  */
 public class DownloadFragment extends AbsFragment {
   @Bind(R.id.start) Button mStart;
diff --git a/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java b/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java
index adb2fc96..3d0c1344 100644
--- a/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java
@@ -23,7 +23,7 @@ import com.arialyy.simple.base.BaseActivity;
 import com.arialyy.simple.databinding.FragmentDownloadBinding;
 
 /**
- * Created by Aria.Lao on 2017/1/4.
+ * Created by lyy on 2017/1/4.
  */
 
 public class FragmentActivity extends BaseActivity {
diff --git a/app/src/main/java/com/arialyy/simple/download/group/ChildHandleDialog.java b/app/src/main/java/com/arialyy/simple/download/group/ChildHandleDialog.java
index 3de6d4f7..0b013adb 100644
--- a/app/src/main/java/com/arialyy/simple/download/group/ChildHandleDialog.java
+++ b/app/src/main/java/com/arialyy/simple/download/group/ChildHandleDialog.java
@@ -39,7 +39,7 @@ import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
 import java.util.List;
 
 /**
- * Created by Aria.Lao on 2017/9/5.
+ * Created by lyy on 2017/9/5.
  */
 @SuppressLint("ValidFragment") public class ChildHandleDialog
     extends BaseDialog {
diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java
index 8f75bb19..d100451c 100644
--- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java
@@ -36,7 +36,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Created by Aria.Lao on 2017/7/6.
+ * Created by lyy on 2017/7/6.
  */
 public class DownloadGroupActivity extends BaseActivity {
 
diff --git a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
index 3d71b325..d0d26214 100644
--- a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java
@@ -32,7 +32,7 @@ import com.arialyy.simple.databinding.ActivityDownloadGroupBinding;
 import com.arialyy.simple.widget.SubStateLinearLayout;
 
 /**
- * Created by Aria.Lao on 2017/7/6.
+ * Created by lyy on 2017/7/6.
  */
 public class FTPDirDownloadActivity extends BaseActivity {
   private static final String dir = "ftp://192.168.1.2:21/upload/测试";
diff --git a/app/src/main/java/com/arialyy/simple/download/group/GroupModule.java b/app/src/main/java/com/arialyy/simple/download/group/GroupModule.java
index 0239ad87..ad01a50a 100644
--- a/app/src/main/java/com/arialyy/simple/download/group/GroupModule.java
+++ b/app/src/main/java/com/arialyy/simple/download/group/GroupModule.java
@@ -23,7 +23,7 @@ import java.util.Collections;
 import java.util.List;
 
 /**
- * Created by Aria.Lao on 2017/7/6.
+ * Created by lyy on 2017/7/6.
  */
 public class GroupModule extends BaseModule {
   public GroupModule(Context context) {
diff --git a/app/src/main/java/com/arialyy/simple/download/multi_download/MultiEntity.java b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiEntity.java
index ca3adf37..27374174 100644
--- a/app/src/main/java/com/arialyy/simple/download/multi_download/MultiEntity.java
+++ b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiEntity.java
@@ -19,7 +19,7 @@ import com.arialyy.aria.core.download.DownloadEntity;
 import com.arialyy.aria.core.download.DownloadGroupEntity;
 
 /**
- * Created by Aria.Lao on 2017/7/14.
+ * Created by lyy on 2017/7/14.
  */
 public class MultiEntity {
   public static final int SIMPLE_DOWNLOAD = 0xa1;
diff --git a/app/src/main/java/com/arialyy/simple/download/multi_download/MultiModule.java b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiModule.java
index de0cd46c..6b4a84a2 100644
--- a/app/src/main/java/com/arialyy/simple/download/multi_download/MultiModule.java
+++ b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiModule.java
@@ -19,7 +19,7 @@ import android.content.Context;
 import com.arialyy.simple.base.BaseModule;
 
 /**
- * Created by Aria.Lao on 2017/7/14.
+ * Created by lyy on 2017/7/14.
  */
 public class MultiModule extends BaseModule{
   public MultiModule(Context context) {
diff --git a/app/src/main/java/com/arialyy/simple/download/service_download/DownloadNotification.java b/app/src/main/java/com/arialyy/simple/download/service_download/DownloadNotification.java
index 4495530f..8ab9469c 100644
--- a/app/src/main/java/com/arialyy/simple/download/service_download/DownloadNotification.java
+++ b/app/src/main/java/com/arialyy/simple/download/service_download/DownloadNotification.java
@@ -22,7 +22,7 @@ import android.support.v4.app.NotificationCompat;
 import com.arialyy.simple.R;
 
 /**
- * Created by Aria.Lao on 2017/1/18.
+ * Created by lyy on 2017/1/18.
  */
 public class DownloadNotification {
 
diff --git a/app/src/main/java/com/arialyy/simple/download/service_download/DownloadService.java b/app/src/main/java/com/arialyy/simple/download/service_download/DownloadService.java
index 4994bfaa..4d32568c 100644
--- a/app/src/main/java/com/arialyy/simple/download/service_download/DownloadService.java
+++ b/app/src/main/java/com/arialyy/simple/download/service_download/DownloadService.java
@@ -26,7 +26,7 @@ import com.arialyy.aria.core.download.DownloadTask;
 import com.arialyy.frame.util.show.T;
 
 /**
- * Created by Aria.Lao on 2017/4/5.
+ * Created by lyy on 2017/4/5.
  * 在服务中使用 Aria进行下载
  */
 public class DownloadService extends Service {
diff --git a/app/src/main/java/com/arialyy/simple/upload/FtpUploadActivity.java b/app/src/main/java/com/arialyy/simple/upload/FtpUploadActivity.java
index 21f8927c..7a3248e2 100644
--- a/app/src/main/java/com/arialyy/simple/upload/FtpUploadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/upload/FtpUploadActivity.java
@@ -31,7 +31,7 @@ import com.arialyy.simple.databinding.ActivityFtpUploadBinding;
 import java.io.File;
 
 /**
- * Created by Aria.Lao on 2017/7/28.
+ * Created by lyy on 2017/7/28.
  * Ftp 文件上传demo
  */
 public class FtpUploadActivity extends BaseActivity {
diff --git a/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java b/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
index c0b942c7..0304e8eb 100644
--- a/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
@@ -32,7 +32,7 @@ import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
 import java.io.File;
 
 /**
- * Created by Aria.Lao on 2017/2/9.
+ * Created by lyy on 2017/2/9.
  */
 public class HttpUploadActivity extends BaseActivity {
   private static final String TAG = "HttpUploadActivity";
diff --git a/app/src/main/java/com/arialyy/simple/widget/SubStateLinearLayout.java b/app/src/main/java/com/arialyy/simple/widget/SubStateLinearLayout.java
index 7b390d39..ad89fa56 100644
--- a/app/src/main/java/com/arialyy/simple/widget/SubStateLinearLayout.java
+++ b/app/src/main/java/com/arialyy/simple/widget/SubStateLinearLayout.java
@@ -32,7 +32,7 @@ import java.util.Map;
 import java.util.WeakHashMap;
 
 /**
- * Created by Aria.Lao on 2017/7/17.
+ * Created by lyy on 2017/7/17.
  */
 public class SubStateLinearLayout extends LinearLayout implements View.OnClickListener {
   private final String TAG = "SubStateLinearLayout";
diff --git a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java
index 84b62020..a8c6d6fc 100644
--- a/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java
+++ b/aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java
@@ -31,7 +31,7 @@ public class UploadTask extends AbsNormalTask {
   private UploadTask(UploadTaskEntity taskEntity, Handler outHandler) {
     mTaskEntity = taskEntity;
     mOutHandler = outHandler;
-    mListener = new BaseUListener<>(this, mOutHandler);
+    mListener = new BaseUListener(this, mOutHandler);
     mUtil = new SimpleUploadUtil(taskEntity, (IUploadListener) mListener);
   }
 

From 21bad6b9c1fea40e3b995b2ec782035f009cc9b2 Mon Sep 17 00:00:00 2001
From: laoyuyu <511455842@qq.com>
Date: Sun, 30 Sep 2018 20:11:28 +0800
Subject: [PATCH 22/28] =?UTF-8?q?=E4=BC=98=E5=8C=96`taskExists`=E6=96=B9?=
 =?UTF-8?q?=E6=B3=95=20=E6=B7=BB=E5=8A=A0`post`=E5=8F=82=E6=95=B0=E8=AF=B7?=
 =?UTF-8?q?=E6=B1=82=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../core/common/http/HttpHeaderDelegate.java  | 21 +----
 .../aria/core/common/http/PostDelegate.java   | 86 +++++++++++++++++++
 .../aria/core/download/AbsDownloadTarget.java |  5 ++
 .../aria/core/download/BaseNormalTarget.java  |  2 +-
 .../core/download/DownloadGroupTarget.java    | 29 ++++---
 .../aria/core/download/DownloadReceiver.java  |  5 +-
 .../aria/core/download/DownloadTarget.java    | 43 +++++++---
 .../core/download/DownloadTaskEntity.java     |  5 +-
 .../download/downloader/ConnectionHelp.java   |  8 +-
 .../downloader/HttpFileInfoThread.java        | 29 ++++++-
 .../download/downloader/HttpThreadTask.java   | 22 +++++
 .../com/arialyy/aria/core/inf/AbsTarget.java  |  1 +
 .../arialyy/aria/core/inf/AbsTaskEntity.java  | 13 +++
 ...erTarget.java => IHttpHeaderDelegate.java} | 10 +--
 .../arialyy/aria/core/inf/IPostDelegate.java  | 31 +++++++
 .../aria/core/upload/UploadReceiver.java      |  2 +-
 .../aria/core/upload/UploadTarget.java        | 18 ++--
 .../com/arialyy/aria/orm/DelegateWrapper.java |  7 --
 DEV_LOG.md                                    | 12 +++
 .../simple/download/SingleTaskActivity.java   |  8 +-
 .../arialyy/simple/test/AnyRunnModule.java    |  1 -
 .../simple/upload/HttpUploadActivity.java     |  2 +-
 build.gradle                                  |  2 +-
 py/download.py                                | 21 +++++
 py/upload.py                                  | 62 +++++++++++++
 25 files changed, 359 insertions(+), 86 deletions(-)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/http/PostDelegate.java
 rename Aria/src/main/java/com/arialyy/aria/core/inf/{IHttpHeaderTarget.java => IHttpHeaderDelegate.java} (88%)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/inf/IPostDelegate.java
 create mode 100644 py/download.py
 create mode 100644 py/upload.py

diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpHeaderDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpHeaderDelegate.java
index 281be7b9..9982cdfa 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpHeaderDelegate.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/http/HttpHeaderDelegate.java
@@ -17,10 +17,9 @@ package com.arialyy.aria.core.common.http;
 
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
-import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.inf.AbsTarget;
 import com.arialyy.aria.core.inf.AbsTaskEntity;
-import com.arialyy.aria.core.inf.IHttpHeaderTarget;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
 import com.arialyy.aria.util.ALog;
 import java.net.Proxy;
 import java.util.Collection;
@@ -32,7 +31,7 @@ import java.util.Set;
  * HTTP header参数设置委托类
  */
 public class HttpHeaderDelegate
-    implements IHttpHeaderTarget {
+    implements IHttpHeaderDelegate {
   private static final String TAG = "HttpHeaderDelegate";
   private TARGET mTarget;
 
@@ -76,18 +75,6 @@ public class HttpHeaderDelegate
     return mTarget;
   }
 
-  /**
-   * 设置请求类型,POST或GET,默认为在GET
-   * 只试用于HTTP请求
-   *
-   * @param requestEnum {@link RequestEnum}
-   */
-  @Override
-  public TARGET setRequestMode(RequestEnum requestEnum) {
-    setRequestMode(mTarget.getTaskEntity(), requestEnum);
-    return mTarget;
-  }
-
   @Override public TARGET setUrlProxy(Proxy proxy) {
     mTarget.getTaskEntity().setProxy(proxy);
     return mTarget;
@@ -101,10 +88,6 @@ public class HttpHeaderDelegate
     }
   }
 
-  public void setRequestMode(AbsTaskEntity taskEntity, RequestEnum requestEnum) {
-    taskEntity.setRequestEnum(requestEnum);
-  }
-
   public void addHeaders(AbsTaskEntity taskEntity, Map headers) {
      /*
       两个map比较逻辑
diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/http/PostDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/http/PostDelegate.java
new file mode 100644
index 00000000..f06f3ae9
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/common/http/PostDelegate.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.arialyy.aria.core.common.http;
+
+import android.text.TextUtils;
+import com.arialyy.aria.core.common.RequestEnum;
+import com.arialyy.aria.core.download.DownloadGroupTarget;
+import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.inf.AbsTarget;
+import com.arialyy.aria.core.inf.IPostDelegate;
+import com.arialyy.aria.core.inf.ITarget;
+import com.arialyy.aria.util.ALog;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * post处理委托类
+ */
+public class PostDelegate implements IPostDelegate, ITarget {
+  private static final String TAG = "PostDelegate";
+  private TARGET mTarget;
+
+  public PostDelegate(TARGET target) {
+    mTarget = target;
+    mTarget.getTaskEntity().setRequestEnum(RequestEnum.POST);
+  }
+
+  @Override public TARGET setParams(Map params) {
+    mTarget.getTaskEntity().setParams(params);
+    if (mTarget instanceof DownloadGroupTarget) {
+      for (DownloadTaskEntity subTask : ((DownloadGroupTaskEntity) mTarget.getTaskEntity()).getSubTaskEntities()) {
+        subTask.setParams(params);
+      }
+    }
+    return mTarget;
+  }
+
+  @Override public TARGET setParam(String key, String value) {
+    if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
+      ALog.d(TAG, "key 或value 为空");
+      return mTarget;
+    }
+    Map params = mTarget.getTaskEntity().getParams();
+    if (params == null) {
+      params = new HashMap<>();
+      mTarget.getTaskEntity().setParams(params);
+    }
+    params.put(key, value);
+    if (mTarget instanceof DownloadGroupTarget) {
+      for (DownloadTaskEntity subTask : ((DownloadGroupTaskEntity) mTarget.getTaskEntity()).getSubTaskEntities()) {
+        subTask.setParams(params);
+      }
+    }
+    return mTarget;
+  }
+
+  @Override public void start() {
+    mTarget.start();
+  }
+
+  @Override public void stop() {
+    mTarget.stop();
+  }
+
+  @Override public void resume() {
+    mTarget.resume();
+  }
+
+  @Override public void cancel() {
+    mTarget.cancel();
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
index f254db27..4662be8d 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/AbsDownloadTarget.java
@@ -40,6 +40,11 @@ abstract class AbsDownloadTarget
 
     //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径
     if (!filePath.equals(mEntity.getDownloadPath())) {
-      if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) {
+      if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath) && !forceDownload) {
         ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径");
         return false;
       }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
index 9a35d94b..2380f54f 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupTarget.java
@@ -20,7 +20,8 @@ import android.support.annotation.NonNull;
 import android.text.TextUtils;
 import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
-import com.arialyy.aria.core.inf.IHttpHeaderTarget;
+import com.arialyy.aria.core.common.http.PostDelegate;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
 import com.arialyy.aria.core.manager.TEManager;
 import com.arialyy.aria.orm.DbEntity;
 import com.arialyy.aria.util.ALog;
@@ -38,7 +39,7 @@ import java.util.Set;
  * 下载任务组
  */
 public class DownloadGroupTarget extends BaseGroupTarget implements
-    IHttpHeaderTarget {
+    IHttpHeaderDelegate {
   private HttpHeaderDelegate mDelegate;
   /**
    * 子任务下载地址,
@@ -74,6 +75,13 @@ public class DownloadGroupTarget extends BaseGroupTarget im
     mDelegate = new HttpHeaderDelegate<>(this);
   }
 
+  /**
+   * Post处理
+   */
+  public PostDelegate asPost() {
+    return new PostDelegate<>(this);
+  }
+
   /**
    * 更新组合任务下载地址
    *
@@ -178,6 +186,12 @@ public class DownloadGroupTarget extends BaseGroupTarget im
         return false;
       }
 
+      if (mTaskEntity.getRequestEnum() == RequestEnum.POST) {
+        for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) {
+          subTask.setRequestEnum(RequestEnum.POST);
+        }
+      }
+
       mEntity.save();
       mTaskEntity.save();
 
@@ -262,7 +276,8 @@ public class DownloadGroupTarget extends BaseGroupTarget im
     if (!newName.equals(entity.getFileName())) {
       String oldPath = mEntity.getDirPath() + "/" + entity.getFileName();
       String newPath = mEntity.getDirPath() + "/" + newName;
-      if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'", newPath)) {
+      if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=? or isComplete='true'",
+          newPath)) {
         ALog.w(TAG, String.format("更新文件名失败,路径【%s】已存在或文件已下载", newPath));
         return;
       }
@@ -313,14 +328,6 @@ public class DownloadGroupTarget extends BaseGroupTarget im
     return mDelegate.addHeaders(headers);
   }
 
-  @CheckResult
-  @Override public DownloadGroupTarget setRequestMode(RequestEnum requestEnum) {
-    for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) {
-      subTask.setRequestEnum(requestEnum);
-    }
-    return mDelegate.setRequestMode(requestEnum);
-  }
-
   @CheckResult
   @Override public DownloadGroupTarget setUrlProxy(Proxy proxy) {
     return mDelegate.setUrlProxy(proxy);
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
index 341d4d52..312f7aff 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
@@ -288,7 +288,7 @@ public class DownloadReceiver extends AbsReceiver {
    * @return {@code true}存在,{@code false} 不存在
    */
   public boolean taskExists(String downloadUrl) {
-    return DownloadEntity.findFirst(DownloadEntity.class, "url=?", downloadUrl) != null;
+    return DbEntity.checkDataExist(DownloadTaskEntity.class, "url=?", downloadUrl);
   }
 
   /**
@@ -301,8 +301,7 @@ public class DownloadReceiver extends AbsReceiver {
       return false;
     }
     String groupName = CommonUtil.getMd5Code(urls);
-    return DownloadGroupEntity.findFirst(DownloadGroupEntity.class, "groupName=?", groupName)
-        != null;
+    return DbEntity.checkDataExist(DownloadGroupEntity.class, "groupName=?", groupName);
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
index b20ccebd..14ad617d 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
@@ -19,7 +19,8 @@ import android.support.annotation.CheckResult;
 import android.support.annotation.NonNull;
 import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
-import com.arialyy.aria.core.inf.IHttpHeaderTarget;
+import com.arialyy.aria.core.common.http.PostDelegate;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
 import java.net.Proxy;
 import java.util.Map;
 
@@ -28,9 +29,8 @@ import java.util.Map;
  * https://github.com/AriaLyy/Aria
  */
 public class DownloadTarget extends BaseNormalTarget
-    implements IHttpHeaderTarget {
-  private HttpHeaderDelegate mDelegate;
-
+    implements IHttpHeaderDelegate {
+  private HttpHeaderDelegate mHeaderDelegate;
 
   DownloadTarget(DownloadEntity entity, String targetName) {
     this(entity.getUrl(), targetName);
@@ -38,7 +38,14 @@ public class DownloadTarget extends BaseNormalTarget
 
   DownloadTarget(String url, String targetName) {
     initTarget(url, targetName);
-    mDelegate = new HttpHeaderDelegate<>(this);
+    mHeaderDelegate = new HttpHeaderDelegate<>(this);
+  }
+
+  /**
+   * Post处理
+   */
+  public PostDelegate asPost() {
+    return new PostDelegate<>(this);
   }
 
   /**
@@ -78,6 +85,21 @@ public class DownloadTarget extends BaseNormalTarget
     return this;
   }
 
+  /**
+   * 设置文件存储路径,如果需要修改新的文件名,修改路径便可。
+   * 如:原文件路径 /mnt/sdcard/test.zip
+   * 如果需要将test.zip改为game.zip,只需要重新设置文件路径为:/mnt/sdcard/game.zip
+   *
+   * @param filePath 路径必须为文件路径,不能为文件夹路径
+   * @param forceDownload {@code true}强制下载,不考虑未见路径是否被占用
+   */
+  @CheckResult
+  public DownloadTarget setFilePath(@NonNull String filePath, boolean forceDownload) {
+    mTempFilePath = filePath;
+    this.forceDownload = forceDownload;
+    return this;
+  }
+
   /**
    * 从header中获取文件描述信息
    */
@@ -89,7 +111,6 @@ public class DownloadTarget extends BaseNormalTarget
     return HTTP;
   }
 
-
   /**
    * 设置URL的代理
    *
@@ -97,21 +118,17 @@ public class DownloadTarget extends BaseNormalTarget
    */
   @CheckResult
   @Override public DownloadTarget setUrlProxy(Proxy proxy) {
-    return mDelegate.setUrlProxy(proxy);
+    return mHeaderDelegate.setUrlProxy(proxy);
   }
 
   @CheckResult
   @Override public DownloadTarget addHeader(@NonNull String key, @NonNull String value) {
-    return mDelegate.addHeader(key, value);
+    return mHeaderDelegate.addHeader(key, value);
   }
 
   @CheckResult
   @Override public DownloadTarget addHeaders(Map headers) {
-    return mDelegate.addHeaders(headers);
+    return mHeaderDelegate.addHeaders(headers);
   }
 
-  @CheckResult
-  @Override public DownloadTarget setRequestMode(RequestEnum requestEnum) {
-    return mDelegate.setRequestMode(requestEnum);
-  }
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
index 0d046d50..f23f5f30 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
@@ -21,6 +21,7 @@ import com.arialyy.aria.orm.annotation.Foreign;
 import com.arialyy.aria.orm.annotation.Ignore;
 import com.arialyy.aria.orm.annotation.NoNull;
 import com.arialyy.aria.orm.annotation.Primary;
+import java.util.Map;
 
 /**
  * Created by lyy on 2017/1/23.
@@ -60,8 +61,6 @@ public class DownloadTaskEntity extends AbsNormalTaskEntity {
       onUpdate = ActionPolicy.CASCADE, onDelete = ActionPolicy.CASCADE)
   private String key;
 
-
-
   public DownloadTaskEntity() {
   }
 
@@ -112,6 +111,4 @@ public class DownloadTaskEntity extends AbsNormalTaskEntity {
   public void setGroupTask(boolean groupTask) {
     isGroupTask = groupTask;
   }
-
-
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java
index a7b985a7..e5a78c25 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java
@@ -100,6 +100,8 @@ class ConnectionHelp {
   static HttpURLConnection setConnectParam(DownloadTaskEntity entity, HttpURLConnection conn) {
     if (entity.getRequestEnum() == RequestEnum.POST) {
       conn.setDoInput(true);
+      conn.setDoOutput(true);
+      conn.setUseCaches(false);
     }
     Set keys = null;
     if (entity.getHeaders() != null && entity.getHeaders().size() > 0) {
@@ -108,7 +110,9 @@ class ConnectionHelp {
         conn.setRequestProperty(key, entity.getHeaders().get(key));
       }
     }
-
+    if (conn.getRequestProperty("Accept-Language") == null) {
+      conn.setRequestProperty("Accept-Language", "UTF-8");
+    }
     if (conn.getRequestProperty("Accept-Encoding") == null) {
       conn.setRequestProperty("Accept-Encoding", "identity");
     }
@@ -126,7 +130,7 @@ class ConnectionHelp {
           "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
     }
     if (conn.getRequestProperty("Accept") == null) {
-      StringBuilder accept = new StringBuilder();
+      //StringBuilder accept = new StringBuilder();
       //accept
       //.append("image/gif, ")
       //.append("image/jpeg, ")
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
index c65b3800..fc87f934 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java
@@ -19,6 +19,7 @@ import android.text.TextUtils;
 import com.arialyy.aria.core.AriaManager;
 import com.arialyy.aria.core.common.CompleteInfo;
 import com.arialyy.aria.core.common.OnFileInfoCallback;
+import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.download.DownloadEntity;
 import com.arialyy.aria.core.download.DownloadTaskEntity;
 import com.arialyy.aria.util.ALog;
@@ -28,9 +29,13 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 下载文件信息获取
@@ -76,6 +81,23 @@ class HttpFileInfoThread implements Runnable {
   }
 
   private void handleConnect(HttpURLConnection conn) throws IOException {
+    if (mTaskEntity.getRequestEnum() == RequestEnum.POST) {
+      Map params = mTaskEntity.getParams();
+      if (params != null) {
+        OutputStreamWriter dos = new OutputStreamWriter(conn.getOutputStream());
+        Set keys = params.keySet();
+        StringBuilder sb = new StringBuilder();
+        for (String key : keys) {
+          sb.append(key).append("=").append(URLEncoder.encode(params.get(key))).append("&");
+        }
+        String url = sb.toString();
+        url = url.substring(0, url.length() - 1);
+        dos.write(url);
+        dos.flush();
+        dos.close();
+      }
+    }
+
     long len = conn.getContentLength();
     if (len < 0) {
       String temp = conn.getHeaderField("Content-Length");
@@ -122,7 +144,7 @@ class HttpFileInfoThread implements Runnable {
             if (temp.length > 1) {
               String newName = URLDecoder.decode(temp[1], "utf-8");
               mEntity.setServerFileName(newName);
-              fileRename(newName);
+              renameFile(newName);
               break;
             }
           }
@@ -184,7 +206,7 @@ class HttpFileInfoThread implements Runnable {
   /**
    * 重命名文件
    */
-  private void fileRename(String newName) {
+  private void renameFile(String newName) {
     if (TextUtils.isEmpty(newName)) {
       ALog.w(TAG, "重命名失败【服务器返回的文件名为空】");
       return;
@@ -219,7 +241,8 @@ class HttpFileInfoThread implements Runnable {
     mEntity.setRedirect(true);
     mEntity.setRedirectUrl(newUrl);
     String cookies = conn.getHeaderField("Set-Cookie");
-    conn = (HttpURLConnection) new URL(newUrl).openConnection();
+    URL url = new URL(CommonUtil.convertUrl(newUrl));
+    conn = ConnectionHelp.handleConnection(url, mTaskEntity);
     conn = ConnectionHelp.setConnectParam(mTaskEntity, conn);
     conn.setRequestProperty("Cookie", cookies);
     conn.setRequestProperty("Range", "bytes=" + 0 + "-");
diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java
index 20575ff0..7e9534a3 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java
@@ -16,6 +16,7 @@
 package com.arialyy.aria.core.download.downloader;
 
 import com.arialyy.aria.core.common.AbsThreadTask;
+import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.common.StateConstance;
 import com.arialyy.aria.core.common.SubThreadConfig;
 import com.arialyy.aria.core.download.DownloadEntity;
@@ -28,13 +29,17 @@ import java.io.BufferedInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStreamWriter;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.FileChannel;
 import java.nio.channels.ReadableByteChannel;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Created by lyy on 2017/1/18.
@@ -83,6 +88,23 @@ final class HttpThreadTask extends AbsThreadTask params = mTaskEntity.getParams();
+        if (params != null) {
+          OutputStreamWriter dos = new OutputStreamWriter(conn.getOutputStream());
+          Set keys = params.keySet();
+          StringBuilder sb = new StringBuilder();
+          for (String key : keys) {
+            sb.append(key).append("=").append(URLEncoder.encode(params.get(key))).append("&");
+          }
+          String paramStr = sb.toString();
+          paramStr = paramStr.substring(0, paramStr.length() - 1);
+          dos.write(paramStr);
+          dos.flush();
+          dos.close();
+        }
+      }
+
       is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn));
       if (isOpenDynamicFile) {
         readDynamicFile(is);
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
index 96d44748..3eb6a485 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java
@@ -22,6 +22,7 @@ import com.arialyy.aria.core.command.ICmd;
 import com.arialyy.aria.core.command.normal.CancelCmd;
 import com.arialyy.aria.core.command.normal.NormalCmdFactory;
 import com.arialyy.aria.core.common.TaskRecord;
+import com.arialyy.aria.core.common.http.PostDelegate;
 import com.arialyy.aria.core.download.DownloadGroupEntity;
 import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
 import com.arialyy.aria.core.download.DownloadTaskEntity;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
index eba12e79..3e7331aa 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java
@@ -70,6 +70,11 @@ public abstract class AbsTaskEntity extends DbEntity {
    */
   @Ignore private boolean isNewTask = false;
 
+  /**
+   * 请求参数
+   */
+  @Ignore private Map params;
+
   /**
    * 任务状态,和Entity的state同步
    */
@@ -256,4 +261,12 @@ public abstract class AbsTaskEntity extends DbEntity {
   public void setCode(int code) {
     this.code = code;
   }
+
+  public Map getParams() {
+    return params;
+  }
+
+  public void setParams(Map params) {
+    this.params = params;
+  }
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
similarity index 88%
rename from Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderTarget.java
rename to Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
index 29ae6f52..80307556 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IHttpHeaderDelegate.java
@@ -26,7 +26,7 @@ import java.util.Map;
  * Created by laoyuyu on 2018/3/9.
  * HTTP Header功能接口
  */
-public interface IHttpHeaderTarget {
+public interface IHttpHeaderDelegate {
 
   /**
    * 给url请求添加Header数据
@@ -47,14 +47,6 @@ public interface IHttpHeaderTarget {
   @CheckResult
   TARGET addHeaders(Map headers);
 
-  /**
-   * 设置HTTP请求类型
-   *
-   * @param requestEnum {@link RequestEnum}
-   */
-  @CheckResult
-  TARGET setRequestMode(RequestEnum requestEnum);
-
   @CheckResult
   TARGET setUrlProxy(Proxy proxy);
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IPostDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IPostDelegate.java
new file mode 100644
index 00000000..b5ace80a
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IPostDelegate.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.arialyy.aria.core.inf;
+
+import java.util.Map;
+
+/**
+ * post 通用处理接口
+ */
+public interface IPostDelegate {
+
+  /**
+   * 设置Post请求参数
+   */
+  TARGET setParams(Map params);
+
+  TARGET setParam(String key, String value);
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
index a2be1ed4..63c3de42 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
@@ -89,7 +89,7 @@ public class UploadReceiver extends AbsReceiver {
    * @return {@code true}存在,{@code false} 不存在
    */
   public boolean taskExists(String filePath) {
-    return DbEntity.findFirst(UploadEntity.class, "filePath=?", filePath) != null;
+    return DbEntity.checkDataExist(UploadTaskEntity.class, "key=?", filePath);
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
index 734ff20a..fdd91f7d 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java
@@ -17,10 +17,10 @@ package com.arialyy.aria.core.upload;
 
 import android.support.annotation.CheckResult;
 import android.support.annotation.NonNull;
-import com.arialyy.aria.core.common.RequestEnum;
 import com.arialyy.aria.core.common.http.HttpHeaderDelegate;
+import com.arialyy.aria.core.common.http.PostDelegate;
 import com.arialyy.aria.core.inf.AbsTaskEntity;
-import com.arialyy.aria.core.inf.IHttpHeaderTarget;
+import com.arialyy.aria.core.inf.IHttpHeaderDelegate;
 import java.net.Proxy;
 import java.util.Map;
 
@@ -29,7 +29,7 @@ import java.util.Map;
  * http 单文件上传
  */
 public class UploadTarget extends BaseNormalTarget
-    implements IHttpHeaderTarget {
+    implements IHttpHeaderDelegate {
   private HttpHeaderDelegate mDelegate;
 
   UploadTarget(String filePath, String targetName) {
@@ -46,6 +46,13 @@ public class UploadTarget extends BaseNormalTarget
     mDelegate = new HttpHeaderDelegate<>(this);
   }
 
+  /**
+   * Post处理
+   */
+  public PostDelegate asPost() {
+    return new PostDelegate<>(this);
+  }
+
   /**
    * 设置userAgent
    */
@@ -87,11 +94,6 @@ public class UploadTarget extends BaseNormalTarget
     return mDelegate.addHeaders(headers);
   }
 
-  @CheckResult
-  @Override public UploadTarget setRequestMode(RequestEnum requestEnum) {
-    return mDelegate.setRequestMode(requestEnum);
-  }
-
   @Override public UploadTarget setUrlProxy(Proxy proxy) {
     return mDelegate.setUrlProxy(proxy);
   }
diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java b/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java
index 1c909eeb..e87c5b9d 100644
--- a/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java
+++ b/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java
@@ -56,13 +56,6 @@ public class DelegateWrapper {
     return INSTANCE;
   }
 
-  ///**
-  // * 保存关联数据
-  // */
-  //void saveRelationData(AbsWrapper wrapper){
-  //
-  //}
-
   /**
    * 查询关联表数据
    *
diff --git a/DEV_LOG.md b/DEV_LOG.md
index e911c570..717d4384 100644
--- a/DEV_LOG.md
+++ b/DEV_LOG.md
@@ -1,4 +1,16 @@
 ## 开发日志
+  + v_3.5.1
+    - 优化`taskExists`方法
+    - 添加`post`参数请求支持
+      ```java
+      Aria.download(SingleTaskActivity.this)
+              .load(DOWNLOAD_URL)
+              .setFilePath(path)
+              .asPost() // post请求
+              .setParam("key", "value") //传递参数
+              //.setParams(Map) // 传递多参数
+              .start();
+      ```
   + v_3.5
     - fix bug https://github.com/AriaLyy/Aria/issues/302
     - fix bug https://github.com/AriaLyy/Aria/issues/283
diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
index 6ac0832b..5ba749c1 100644
--- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
@@ -42,6 +42,7 @@ import com.arialyy.simple.R;
 import com.arialyy.simple.base.BaseActivity;
 import com.arialyy.simple.databinding.ActivitySingleBinding;
 import java.io.File;
+import java.util.Map;
 
 public class SingleTaskActivity extends BaseActivity {
 
@@ -50,13 +51,14 @@ public class SingleTaskActivity extends BaseActivity {
       //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
       //"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
   //"https://yizi-kejian.oss-cn-beijing.aliyuncs.com/qimeng/package1/qmtable11.zip";
-  "http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk";
+  //"http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk";
       //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载
       //"https://static.donguo.me//video/ip/course/pfys_1.mp4";
       //"https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864";
       //"https://d.pcs.baidu.com/file/a02c89a2d479d4fd2756f3313d42491d?fid=4232431903-250528-1114369760340736&dstime=1525491372&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-3C13vkOkuk4TqXvVYW05zj1K0ao%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=8651730921842106225&dp-callid=0&r=165533013";
       //"http://apk500.bce.baidu-mgame.com/game/67000/67734/20170622040827_oem_5502845.apk?r=1";
       //"https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe";
+      "http://9.9.9.59:5000/download/CentOS-7-x86_64-Minimal-1804.iso";
   @Bind(R.id.start) Button mStart;
   @Bind(R.id.stop) Button mStop;
   @Bind(R.id.cancel) Button mCancel;
@@ -234,6 +236,7 @@ public class SingleTaskActivity extends BaseActivity {
         //startActivity(new Intent(this, SingleTaskActivity.class));
         //Aria.download(this).unRegister();
         //Aria.download(this).load(DOWNLOAD_URL).removeRecord();
+        //Log.d(TAG, Aria.download(this).taskExists(DOWNLOAD_URL) + "");
         break;
       case R.id.cancel:
         Aria.download(this).load(DOWNLOAD_URL).cancel(true);
@@ -245,7 +248,7 @@ public class SingleTaskActivity extends BaseActivity {
   private void startD() {
     //Aria.get(this).setLogLevel(ALog.LOG_CLOSE);
     //Aria.download(this).load("aaaa.apk");
-    String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg8.apk";
+    String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg9.apk";
     //File file = new File(path);
     //if (file.exists()){
     //  file.delete();
@@ -260,6 +263,7 @@ public class SingleTaskActivity extends BaseActivity {
         //.useServerFileName(true)
         //.setRequestMode(RequestEnum.GET)
         .setFilePath(path)
+        .asPost().setParams("key", "value")
         //.setExtendField("{\n"
         //    + "\"id\":\"你的样子\"\n< > "
         //    + "}")
diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java
index 5388313f..06d3ff43 100644
--- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java
+++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java
@@ -67,7 +67,6 @@ public class AnyRunnModule {
     String path = Environment.getExternalStorageDirectory().getPath() + "/mmm2.mp4";
     Aria.download(this)
         .load(url)
-        .setRequestMode(RequestEnum.GET)
         .setFilePath(path)
         .resetState()
         .start();
diff --git a/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java b/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
index 0304e8eb..048800c9 100644
--- a/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/upload/HttpUploadActivity.java
@@ -56,7 +56,7 @@ public class HttpUploadActivity extends BaseActivity {
             "http://lib-test.xzxyun.com:8042/Api/upload?data={\"type\":\"1\",\"fileType\":\".apk\"}")
         //.setUploadUrl("http://192.168.1.6:8080/upload/sign_file/").setAttachment("file")
         //.addHeader("iplanetdirectorypro", "11a09102fb934ad0bc206f9c611d7933")
-        .setRequestMode(RequestEnum.POST)
+        .asPost()
         .start();
   }
 
diff --git a/build.gradle b/build.gradle
index f2f07861..365135f9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -39,7 +39,7 @@ task clean(type: Delete) {
 ext {
   userOrg = 'arialyy'
   groupId = 'com.arialyy.aria'
-  publishVersion = '3.5_dev1'
+  publishVersion = '3.5'
 //  publishVersion = '1.0.3'  //FTP插件
   repoName='maven'
   desc = 'android 下载框架'
diff --git a/py/download.py b/py/download.py
new file mode 100644
index 00000000..e42927df
--- /dev/null
+++ b/py/download.py
@@ -0,0 +1,21 @@
+# coding=utf-8
+
+import os
+from flask import Flask, send_from_directory, request
+
+app = Flask(__name__)
+
+
+@app.route("/download/", methods=['POST', 'GET'])
+def downloader(filename):
+    """
+    不支持断点的下载
+    """
+    data = request.values.get('key')
+    print data
+    dirpath = 'D:/test'
+    return send_from_directory(dirpath, filename, as_attachment=True)  # as_attachment=True 一定要写,不然会变成打开,而不是下载
+
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', debug=True)  # 需要关闭防火墙
diff --git a/py/upload.py b/py/upload.py
new file mode 100644
index 00000000..7dd9ad97
--- /dev/null
+++ b/py/upload.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+import os
+from flask import Flask, request, url_for, send_from_directory
+from werkzeug import secure_filename
+
+ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif', 'rar', 'apk'])
+
+app = Flask(__name__)
+app.config['UPLOAD_FOLDER'] = 'd:/db/'
+app.config['MAX_CONTENT_LENGTH'] = 1600 * 1024 * 1024
+
+"""
+可以选择这个扩展
+Flask-Uploads
+"""
+
+html = '''
+    
+    Upload File
+    

图片上传

+
+ + +
+ ''' + + +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS + + +@app.route('/uploads/') +def uploaded_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], + filename) + + +@app.route('/', methods=['GET', 'POST']) +def test(): + return'test' + + +@app.route('/upload/', methods=['GET', 'POST']) +def upload_file(): + print 'upload' + if request.method == 'POST': + print 'post' + file = request.files['file'] + print file + if file and allowed_file(file.filename): + print 'start save' + filename = secure_filename(file.filename) + file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) + # file_url = url_for('uploaded_file', filename=filename) + # return html + '
' + return '200' + return '405' + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) From 0b095b9b112ef31494deaf369e6a7541d24157c8 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 8 Oct 2018 08:58:30 +0800 Subject: [PATCH 23/28] fix bug https://github.com/AriaLyy/Aria/issues/311 --- .../aria/core/download/BaseNormalTarget.java | 12 +++++-- DEV_LOG.md | 7 ++++ README.md | 33 ++++++++++++------- .../simple/download/SingleTaskActivity.java | 8 ++--- build.gradle | 2 +- 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java index 2873900a..538de167 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseNormalTarget.java @@ -164,9 +164,15 @@ abstract class BaseNormalTarget //设置文件保存路径,如果新文件路径和旧文件路径不同,则修改路径 if (!filePath.equals(mEntity.getDownloadPath())) { - if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath) && !forceDownload) { - ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径"); - return false; + if (DbEntity.checkDataExist(DownloadEntity.class, "downloadPath=?", filePath)) { + if (!forceDownload) { + ALog.e(TAG, "下载失败,保存路径【" + filePath + "】已经被其它任务占用,请设置其它保存路径"); + return false; + }else { + ALog.d(TAG, "保存路径【" + filePath + "】已经被其它任务占用,当前任务将覆盖该路径的文件"); + DbEntity.deleteData(DownloadEntity.class, "downloadPath=?", filePath); + mTaskEntity = TEManager.getInstance().getTEntity(DownloadTaskEntity.class, url); + } } File oldFile = new File(mEntity.getDownloadPath()); File newFile = new File(filePath); diff --git a/DEV_LOG.md b/DEV_LOG.md index 717d4384..c91242bb 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -11,6 +11,13 @@ //.setParams(Map) // 传递多参数 .start(); ``` + - 增加强制设置文件路径的api, https://github.com/AriaLyy/Aria/issues/311 + ``` + Aria.download(SingleTaskActivity.this) + .load(DOWNLOAD_URL) + .setFilePath(path, true) // true表示忽略路径是否被占用 + .start(); + ``` + v_3.5 - fix bug https://github.com/AriaLyy/Aria/issues/302 - fix bug https://github.com/AriaLyy/Aria/issues/283 diff --git a/README.md b/README.md index f7a83467..6a4e9f26 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Aria有以下特点: [![Download](https://api.bintray.com/packages/arialyy/maven/AriaApi/images/download.svg)](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [![Download](https://api.bintray.com/packages/arialyy/maven/AriaCompiler/images/download.svg)](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.5' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.5' +compile 'com.arialyy.aria:aria-core:3.5.1' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.5.1' ``` 如果出现android support,请将 `compile 'com.arialyy.aria:aria-core:'`替换为 ``` @@ -101,16 +101,25 @@ protected void onCreate(Bundle savedInstanceState) { ### 版本日志 - + v_3.5 - - fix bug https://github.com/AriaLyy/Aria/issues/302 - - fix bug https://github.com/AriaLyy/Aria/issues/283 - - fix bug https://github.com/AriaLyy/Aria/issues/305 - - fix bug https://github.com/AriaLyy/Aria/issues/306 - - fix bug https://github.com/AriaLyy/Aria/issues/272 (现在,停止所有任务,未开始的任务状态将变为停止) - - fix bug https://github.com/AriaLyy/Aria/issues/277 - - fix bug https://github.com/AriaLyy/Aria/issues/303 - - 优化停止任务的速度 - - 修复组合任务修改子任务文件名失败的问题 ++ v_3.5.1 + - 优化`taskExists`方法 + - 添加`post`参数请求支持 + ```java + Aria.download(SingleTaskActivity.this) + .load(DOWNLOAD_URL) + .setFilePath(path) + .asPost() // post请求 + .setParam("key", "value") //传递参数 + //.setParams(Map) // 传递多参数 + .start(); + ``` + - 增加强制设置文件路径的api, https://github.com/AriaLyy/Aria/issues/311 + ``` + Aria.download(SingleTaskActivity.this) + .load(DOWNLOAD_URL) + .setFilePath(path, true) // true表示忽略路径是否被占用 + .start(); + ``` [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 5ba749c1..1fcfd4d3 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -49,7 +49,7 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - //"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; //"https://yizi-kejian.oss-cn-beijing.aliyuncs.com/qimeng/package1/qmtable11.zip"; //"http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk"; //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 @@ -58,7 +58,7 @@ public class SingleTaskActivity extends BaseActivity { //"https://d.pcs.baidu.com/file/a02c89a2d479d4fd2756f3313d42491d?fid=4232431903-250528-1114369760340736&dstime=1525491372&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-3C13vkOkuk4TqXvVYW05zj1K0ao%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=8651730921842106225&dp-callid=0&r=165533013"; //"http://apk500.bce.baidu-mgame.com/game/67000/67734/20170622040827_oem_5502845.apk?r=1"; //"https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; - "http://9.9.9.59:5000/download/CentOS-7-x86_64-Minimal-1804.iso"; + //"http://9.9.9.59:5000/download/CentOS-7-x86_64-Minimal-1804.iso"; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; @Bind(R.id.cancel) Button mCancel; @@ -262,8 +262,8 @@ public class SingleTaskActivity extends BaseActivity { //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") //.useServerFileName(true) //.setRequestMode(RequestEnum.GET) - .setFilePath(path) - .asPost().setParams("key", "value") + .setFilePath(path, false) + //.asPost().setParam("key", "value") //.setExtendField("{\n" // + "\"id\":\"你的样子\"\n< > " // + "}") diff --git a/build.gradle b/build.gradle index 365135f9..cf51dcf8 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.5' + publishVersion = '3.5.1' // publishVersion = '1.0.3' //FTP插件 repoName='maven' desc = 'android 下载框架' From 66b36b355a89900083f31dc7bce81b0f5800c605 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Mon, 5 Nov 2018 21:13:58 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Serializable=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=94=AF=E6=8C=81=20https://github.com/AriaLyy/Aria/i?= =?UTF-8?q?ssues/320=20=E5=A4=B1=E8=B4=A5=E5=9B=9E=E8=B0=83=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=94=99=E8=AF=AF=E5=8E=9F=E5=9B=A0=20https://github.?= =?UTF-8?q?com/AriaLyy/Aria/issues/310?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aria/core/common/AbsThreadTask.java | 32 ++-- .../aria/core/common/BaseListener.java | 7 +- .../aria/core/common/OnFileInfoCallback.java | 6 +- .../core/common/ftp/AbsFtpInfoThread.java | 41 +++-- .../core/common/ftp/AbsFtpThreadTask.java | 15 +- .../core/download/DownloadGroupListener.java | 6 +- .../download/downloader/AbsGroupUtil.java | 11 +- .../downloader/DownloadGroupUtil.java | 11 +- .../core/download/downloader/Downloader.java | 18 +-- .../downloader/FtpDirDownloadUtil.java | 7 +- .../downloader/FtpFileInfoThread.java | 6 +- .../download/downloader/FtpThreadTask.java | 32 ++-- .../downloader/HttpFileInfoThread.java | 35 +++-- .../download/downloader/HttpThreadTask.java | 27 +++- .../downloader/IDownloadGroupListener.java | 3 +- .../downloader/SimpleDownloadUtil.java | 16 +- .../com/arialyy/aria/core/inf/AbsEntity.java | 3 +- .../com/arialyy/aria/core/inf/AbsTask.java | 31 ++++ .../arialyy/aria/core/inf/IEventListener.java | 7 +- .../core/scheduler/AbsSchedulerListener.java | 9 ++ .../aria/core/scheduler/AbsSchedulers.java | 7 +- .../core/scheduler/ISchedulerListener.java | 10 +- .../aria/core/upload/UploadListener.java | 3 +- .../core/upload/uploader/FtpThreadTask.java | 27 ++-- .../core/upload/uploader/HttpThreadTask.java | 14 +- .../upload/uploader/SimpleUploadUtil.java | 6 +- .../aria/exception/AriaIOException.java | 28 ++++ .../arialyy/aria/exception/BaseException.java | 35 +++++ .../arialyy/aria/exception/TaskException.java | 31 ++++ .../java/com/arialyy/aria/util/CheckUtil.java | 4 +- .../java/com/arialyy/aria/util/ErrorHelp.java | 10 +- .../com/arialyy/compiler/EventProxyFiler.java | 53 +++++-- .../java/com/arialyy/compiler/MethodInfo.java | 27 ++++ .../com/arialyy/compiler/ParamObtainUtil.java | 89 +++++++---- .../com/arialyy/compiler/ProxyClassParam.java | 2 +- DEV_LOG.md | 9 ++ app/src/main/AndroidManifest.xml | 11 +- .../simple/download/KotlinDownloadActivity.kt | 148 +++++++++--------- .../simple/download/SingleTaskActivity.java | 5 +- .../arialyy/simple/test/AnyRunActivity.java | 7 +- .../arialyy/simple/test/AnyRunnModule.java | 8 +- .../arialyy/aria/exception/FileException.java | 12 +- gradle.properties | 4 +- 43 files changed, 598 insertions(+), 275 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/exception/AriaIOException.java create mode 100644 Aria/src/main/java/com/arialyy/aria/exception/BaseException.java create mode 100644 Aria/src/main/java/com/arialyy/aria/exception/TaskException.java create mode 100644 AriaCompiler/src/main/java/com/arialyy/compiler/MethodInfo.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java index bb4fe7be..906ece5d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java @@ -21,6 +21,9 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IEventListener; import com.arialyy.aria.core.manager.ThreadTaskManager; import com.arialyy.aria.core.upload.UploadEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.FileException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ErrorHelp; import com.arialyy.aria.util.FileUtil; @@ -94,6 +97,7 @@ public abstract class AbsThreadTask mEntity.getFileSize()) { - ALog.d(TAG, String.format("currentLocation=%s, fileSize=%s", STATE.CURRENT_LOCATION, - mEntity.getFileSize())); + String errorMsg = + String.format("下载失败,下载长度超出文件大;currentLocation=%s, fileSize=%s", STATE.CURRENT_LOCATION, + mEntity.getFileSize()); taskBreak = true; - fail(mChildCurrentLocation, "下载失败,下载长度超出文件大小", null, false); + fail(mChildCurrentLocation, new FileException(TAG, errorMsg), false); return; } mChildCurrentLocation += len; @@ -312,11 +318,10 @@ public abstract class AbsThreadTask, TASK extends AbsTask> @@ -103,12 +106,14 @@ public abstract class BaseListener= ips.length) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java index 403d9e1b..6b417a03 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java @@ -21,8 +21,10 @@ import com.arialyy.aria.core.download.downloader.IDownloadGroupListener; import com.arialyy.aria.core.inf.GroupSendParams; import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.scheduler.ISchedulers; +import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; +import com.arialyy.aria.util.ErrorHelp; /** * Created by Aria.Lao on 2017/7/20. @@ -64,9 +66,11 @@ class DownloadGroupListener sendInState2Target(ISchedulers.SUB_COMPLETE, subEntity); } - @Override public void onSubFail(DownloadEntity subEntity) { + @Override public void onSubFail(DownloadEntity subEntity, BaseException e) { saveCurrentLocation(); sendInState2Target(ISchedulers.SUB_FAIL, subEntity); + e.printStackTrace(); + ErrorHelp.saveError(e.getTag(), "", ALog.getExceptionString(e)); } @Override public void onSubCancel(DownloadEntity subEntity) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index ed34d8ce..45e50fb5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -22,6 +22,8 @@ import com.arialyy.aria.core.download.DownloadGroupTaskEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.IDownloadListener; import com.arialyy.aria.core.inf.IEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.NetUtils; @@ -482,7 +484,7 @@ public abstract class AbsGroupUtil implements IUtil, Runnable { } } - @Override public void onFail(boolean needRetry) { + @Override public void onFail(boolean needRetry, BaseException e) { subEntity.setFailNum(subEntity.getFailNum() + 1); saveData(IEntity.STATE_FAIL, lastLen); handleSpeed(0); @@ -504,12 +506,15 @@ public abstract class AbsGroupUtil implements IUtil, Runnable { reStartTask(dt); } else { mFailMap.put(subTaskEntity.getUrl(), subTaskEntity); - mListener.onSubFail(subEntity); + mListener.onSubFail(subEntity, new TaskException(TAG, + String.format("任务组子任务【%s】下载失败,下载地址【%s】", subEntity.getFileName(), + subEntity.getUrl()))); if (mFailMap.size() == mExeMap.size() || mFailMap.size() + mCompleteNum == mGroupSize) { closeTimer(); } if (mFailMap.size() == mGroupSize) { - mListener.onFail(true); + mListener.onFail(true, new TaskException(TAG, + String.format("任务组【%s】下载失败", mGTEntity.getEntity().getGroupName()))); } else if (mFailMap.size() + mCompleteNum >= mExeMap.size()) { mListener.onStop(mCurrentLocation); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java index ae0c0fdc..fd9a8ccc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/DownloadGroupUtil.java @@ -22,6 +22,8 @@ import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.IEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -85,8 +87,8 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { } if (mExeMap.size() == 0) { - ALog.e(TAG, "任务组无可执行任务"); - mListener.onFail(false); + mListener.onFail(false, new TaskException(TAG, + String.format("任务组【%s】无可执行任务", mGTEntity.getEntity().getGroupName()))); return; } Set keys = mExeMap.keySet(); @@ -133,7 +135,7 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { checkStartFlow(); } - @Override public void onFail(String url, String errorMsg, boolean needRetry) { + @Override public void onFail(String url, BaseException e, boolean needRetry) { if (isStop) return; ALog.e(TAG, String.format("任务【%s】初始化失败", url)); DownloadTaskEntity te = mExeMap.get(url); @@ -169,7 +171,8 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { } if (mInitFailNum == mExeNum) { closeTimer(); - mListener.onFail(true); + mListener.onFail(true, new TaskException(TAG, + String.format("任务组【%s】初始化失败", mGTEntity.getEntity().getGroupName()))); } if (!isStart && mInitCompleteNum + mInitFailNum == mExeNum || !isNeedLoadFileSize) { startRunningFlow(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java index 0072d5c0..4590213b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java @@ -23,10 +23,9 @@ import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IDownloadListener; -import com.arialyy.aria.util.ALog; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.BufferedRandomAccessFile; -import com.arialyy.aria.util.CommonUtil; -import com.arialyy.aria.util.ErrorHelp; import java.io.File; import java.io.IOException; @@ -58,7 +57,7 @@ class Downloader extends AbsFileer { @Override protected boolean handleNewTask() { if (!mRecord.isBlock) { - if (mTempFile.exists()){ + if (mTempFile.exists()) { mTempFile.delete(); } //CommonUtil.createFile(mTempFile.getPath()); @@ -72,8 +71,9 @@ class Downloader extends AbsFileer { } return true; } catch (IOException e) { - failDownload(String.format("下载失败【downloadUrl:%s】;【filePath:%s】\n %S", mEntity.getUrl(), - mEntity.getDownloadPath(), ALog.getExceptionString(e))); + failDownload(new TaskException(TAG, + String.format("下载失败,filePath: %s, url: %s", mEntity.getDownloadPath(), + mEntity.getUrl()), e)); } finally { if (file != null) { try { @@ -106,11 +106,9 @@ class Downloader extends AbsFileer { return null; } - private void failDownload(String errorMsg) { + private void failDownload(BaseException e) { closeTimer(); - ALog.e(TAG, errorMsg); mConstance.isRunning = false; - mListener.onFail(false); - ErrorHelp.saveError(TAG, "", errorMsg); + mListener.onFail(false, e); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java index 00ec7df8..1cd0715c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java @@ -19,6 +19,8 @@ import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ErrorHelp; import java.util.Set; @@ -51,14 +53,13 @@ public class FtpDirDownloadUtil extends AbsGroupUtil { } } - @Override public void onFail(String url, String errorMsg, boolean needRetry) { + @Override public void onFail(String url, BaseException e, boolean needRetry) { DownloadTaskEntity te = mExeMap.get(url); if (te != null) { mFailMap.put(url, te); mExeMap.remove(url); } - mListener.onFail(needRetry); - ErrorHelp.saveError(TAG, "", errorMsg); + mListener.onFail(needRetry, e); } }).start(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java index 3d8ab2f0..4ab8bd1e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java @@ -20,6 +20,7 @@ import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; +import com.arialyy.aria.exception.AriaIOException; import com.arialyy.aria.util.CommonUtil; import org.apache.commons.net.ftp.FTPFile; @@ -28,6 +29,7 @@ import org.apache.commons.net.ftp.FTPFile; * 获取ftp文件信息 */ class FtpFileInfoThread extends AbsFtpInfoThread { + private final String TAG = "FtpFileInfoThread"; FtpFileInfoThread(DownloadTaskEntity taskEntity, OnFileInfoCallback callback) { super(taskEntity, callback); @@ -36,7 +38,9 @@ class FtpFileInfoThread extends AbsFtpInfoThread mConfig.THREAD_ID, mConfig.START_LOCATION, mConfig.END_LOCATION)); client = createClient(); if (client == null) { - fail(mChildCurrentLocation, "ftp client 创建失败", null); + fail(mChildCurrentLocation, new TaskException(TAG, "ftp client 创建失败")); return this; } if (mConfig.START_LOCATION > 0) { @@ -79,8 +81,8 @@ class FtpThreadTask extends AbsFtpThreadTask int reply = client.getReplyCode(); if (!FTPReply.isPositivePreliminary(reply) && reply != FTPReply.COMMAND_OK) { fail(mChildCurrentLocation, - String.format("获取文件信息错误,错误码为:%s,msg:%s", reply, client.getReplyString()), - null); + new AriaIOException(TAG, + String.format("获取文件信息错误,错误码为:%s,msg:%s", reply, client.getReplyString()))); client.disconnect(); return this; } @@ -91,8 +93,8 @@ class FtpThreadTask extends AbsFtpThreadTask reply = client.getReplyCode(); if (!FTPReply.isPositivePreliminary(reply)) { fail(mChildCurrentLocation, - String.format("获取流失败,错误码为:%s,msg:%s", reply, client.getReplyString()), - null); + new AriaIOException(TAG, + String.format("获取流失败,错误码为:%s,msg:%s", reply, client.getReplyString()))); client.disconnect(); return this; } @@ -104,9 +106,11 @@ class FtpThreadTask extends AbsFtpThreadTask handleComplete(); } } catch (IOException e) { - fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e); + fail(mChildCurrentLocation, + new AriaIOException(TAG, String.format("下载失败【%s】", mConfig.URL), e)); } catch (Exception e) { - fail(mChildCurrentLocation, "获取流失败", e); + fail(mChildCurrentLocation, + new AriaIOException(TAG, String.format("下载失败【%s】", mConfig.URL), e)); } finally { try { if (is != null) { @@ -137,9 +141,10 @@ class FtpThreadTask extends AbsFtpThreadTask if (isBlock) { boolean success = mergeFile(); if (!success) { - ALog.e(TAG, String.format("任务【%s】分块文件合并失败", mConfig.TEMP_FILE.getName())); + //ALog.e(TAG, String.format("任务【%s】分块文件合并失败", mConfig.TEMP_FILE.getName())); STATE.isRunning = false; - mListener.onFail(false); + mListener.onFail(false, + new TaskException(TAG, String.format("任务【%s】分块文件合并失败", mConfig.TEMP_FILE.getName()))); return; } } @@ -149,7 +154,8 @@ class FtpThreadTask extends AbsFtpThreadTask } if (STATE.isFail()) { STATE.isRunning = false; - mListener.onFail(false); + mListener.onFail(false, + new TaskException(TAG, String.format("任务【%s】下载失败", mConfig.TEMP_FILE.getName()))); } } @@ -189,7 +195,8 @@ class FtpThreadTask extends AbsFtpThreadTask } handleComplete(); } catch (IOException e) { - fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e); + fail(mChildCurrentLocation, + new AriaIOException(TAG, String.format("下载失败【%s】", mConfig.URL), e)); } finally { try { if (fos != null) { @@ -235,7 +242,8 @@ class FtpThreadTask extends AbsFtpThreadTask } } } catch (IOException e) { - fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e); + fail(mChildCurrentLocation, + new AriaIOException(TAG, String.format("下载失败【%s】", mConfig.URL), e)); } finally { try { if (file != null) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java index fc87f934..848742e7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java @@ -22,6 +22,9 @@ import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; +import com.arialyy.aria.exception.AriaIOException; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CommonUtil; @@ -67,12 +70,9 @@ class HttpFileInfoThread implements Runnable { conn.connect(); handleConnect(conn); } catch (IOException e) { - failDownload("下载失败【downloadUrl:" - + mEntity.getUrl() - + "】\n【filePath:" - + mEntity.getDownloadPath() - + "】\n" - + ALog.getExceptionString(e), true); + failDownload(new AriaIOException(TAG, + String.format("下载失败,filePath: %s, url: %s", mEntity.getDownloadPath(), mEntity.getUrl())), + true); } finally { if (conn != null) { conn.disconnect(); @@ -116,7 +116,9 @@ class HttpFileInfoThread implements Runnable { } if (!CommonUtil.checkSDMemorySpace(mEntity.getDownloadPath(), len)) { - failDownload(String.format("路径【%s】内存空间不足", mEntity.getDownloadPath()), false); + failDownload(new TaskException(TAG, + String.format("下载失败,内存空间不足;filePath: %s, url: %s", mEntity.getDownloadPath(), + mEntity.getUrl())), false); return; } @@ -184,14 +186,16 @@ class HttpFileInfoThread implements Runnable { mTaskEntity.setSupportBP(false); end = true; } else if (code == HttpURLConnection.HTTP_NOT_FOUND) { - failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:404", true); + failDownload(new AriaIOException(TAG, + String.format("任务下载失败,errorCode:404, url: %s", mEntity.getUrl())), true); } else if (code == HttpURLConnection.HTTP_MOVED_TEMP || code == HttpURLConnection.HTTP_MOVED_PERM || code == HttpURLConnection.HTTP_SEE_OTHER || code == 307) { handleUrlReTurn(conn, conn.getHeaderField("Location")); } else { - failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code, true); + failDownload(new AriaIOException(TAG, + String.format("任务下载失败,errorCode:%s, url: %s", code, mEntity.getUrl())), true); } if (end) { mTaskEntity.setChunked(isChunked); @@ -229,12 +233,12 @@ class HttpFileInfoThread implements Runnable { if (TextUtils.isEmpty(newUrl) || newUrl.equalsIgnoreCase("null") || !newUrl.startsWith( "http")) { if (onFileInfoCallback != null) { - onFileInfoCallback.onFail(mEntity.getUrl(), "获取重定向链接失败", false); + onFileInfoCallback.onFail(mEntity.getUrl(), new TaskException(TAG, "获取重定向链接失败"), false); } return; } if (!CheckUtil.checkUrl(newUrl)) { - failDownload("下载失败,重定向url错误", false); + failDownload(new TaskException(TAG, "下载失败,重定向url错误"), false); return; } mTaskEntity.setRedirectUrl(newUrl); @@ -263,16 +267,17 @@ class HttpFileInfoThread implements Runnable { mTaskEntity.setNewTask(true); } if (len < 0) { - failDownload("任务【" + mEntity.getUrl() + "】下载失败,文件长度小于0", true); + failDownload( + new AriaIOException(TAG, String.format("任务下载失败,文件长度小于0, url: %s", mEntity.getUrl())), + true); return false; } return true; } - private void failDownload(String errorMsg, boolean needRetry) { - ALog.e(TAG, errorMsg); + private void failDownload(BaseException e, boolean needRetry) { if (onFileInfoCallback != null) { - onFileInfoCallback.onFail(mEntity.getUrl(), errorMsg, needRetry); + onFileInfoCallback.onFail(mEntity.getUrl(), e, needRetry); } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 7e9534a3..5ae61986 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -22,6 +22,8 @@ import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.IDownloadListener; +import com.arialyy.aria.exception.AriaIOException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.BufferedRandomAccessFile; import com.arialyy.aria.util.CommonUtil; @@ -121,11 +123,17 @@ final class HttpThreadTask extends AbsThreadTask implements ITask { + public static final String ERROR_INFO_KEY = "ERROR_INFO_KEY"; + /** * 是否需要重试,默认为true */ @@ -36,6 +41,10 @@ public abstract class AbsTask mExpand = new HashMap<>(); /** * 该任务的调度类型 */ @@ -53,6 +62,28 @@ public abstract class AbsTask { void onTaskCancel(TASK task); /** - * 任务下载失败 + * 任务失败 + * + * @deprecated @see{{@link #onTaskFail(ITask, Exception)}} */ + @Deprecated void onTaskFail(TASK task); + /** + * 任务失败 + */ + void onTaskFail(TASK task, Exception e); + /** * 任务完成 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java index 17506e92..c37416c2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java @@ -16,6 +16,7 @@ package com.arialyy.aria.core.upload; import com.arialyy.aria.core.inf.IUploadListener; +import com.arialyy.aria.exception.BaseException; /** * Created by lyy on 2017/2/23. @@ -49,7 +50,7 @@ class UploadListener implements IUploadListener { } - @Override public void onFail(boolean needRetry) { + @Override public void onFail(boolean needRetry, BaseException e) { } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index 12c5f8ef..4ba730a8 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -21,6 +21,8 @@ import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.inf.IEventListener; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadTaskEntity; +import com.arialyy.aria.exception.AriaIOException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.BufferedRandomAccessFile; import java.io.IOException; @@ -70,7 +72,10 @@ class FtpThreadTask extends AbsFtpThreadTask { client.setRestartOffset(mConfig.START_LOCATION); int reply = client.getReplyCode(); if (!FTPReply.isPositivePreliminary(reply) && reply != FTPReply.FILE_ACTION_OK) { - fail(mChildCurrentLocation, "上传失败,错误码为:" + reply + ",msg:" + client.getReplyString(), null); + fail(mChildCurrentLocation, + new AriaIOException(TAG, + String.format("文件上传错误,错误码为:%s, msg:%s, filePath: %s", reply, + client.getReplyString(), mEntity.getFilePath()))); client.disconnect(); return this; } @@ -95,12 +100,14 @@ class FtpThreadTask extends AbsFtpThreadTask { } if (STATE.isFail()) { STATE.isRunning = false; - mListener.onFail(false); + mListener.onFail(false, new TaskException(TAG, + String.format("上传失败,filePath: %s, uploadUrl: %s", mEntity.getFilePath(), mConfig.URL))); } } catch (IOException e) { - fail(mChildCurrentLocation, String.format("上传失败【%s】", mConfig.URL), e); + fail(mChildCurrentLocation, new AriaIOException(TAG, + String.format("上传失败,filePath: %s, uploadUrl: %s", mEntity.getFilePath(), mConfig.URL))); } catch (Exception e) { - fail(mChildCurrentLocation, "获取流失败", e); + fail(mChildCurrentLocation, new AriaIOException(TAG, null, e)); } finally { try { if (file != null) { @@ -128,7 +135,7 @@ class FtpThreadTask extends AbsFtpThreadTask { throws IOException { try { - ALog.d(TAG, String.format("remotePath【%s】", remotePath)); + ALog.d(TAG, String.format("remotePath: %s", remotePath)); client.storeFile(remotePath, new FtpFISAdapter(bis), new OnFtpInputStreamListener() { boolean isStoped = false; @@ -149,10 +156,11 @@ class FtpThreadTask extends AbsFtpThreadTask { } }); } catch (IOException e) { - if (e.getMessage().contains("IOException caught while copying")) { + if (e.getMessage().contains("AriaIOException caught while copying")) { e.printStackTrace(); } else { - fail(mChildCurrentLocation, "上传失败", e); + fail(mChildCurrentLocation, + new AriaIOException(TAG, String.format("上传失败,filePath: %s", mEntity.getFilePath()), e)); } } @@ -160,8 +168,9 @@ class FtpThreadTask extends AbsFtpThreadTask { if (!FTPReply.isPositiveCompletion(reply)) { if (reply != FTPReply.TRANSFER_ABORTED) { fail(mChildCurrentLocation, - String.format("上传文件错误,错误码为:%s,msg:%s", reply, client.getReplyString()), - null); + new AriaIOException(TAG, + String.format("文件上传错误,错误码为:%s, msg:%s, filePath: %s", reply, + client.getReplyString(), mEntity.getFilePath()))); } if (client.isConnected()) { client.disconnect(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index 17cd60a9..c5ce84fc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -21,6 +21,8 @@ import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.inf.IUploadListener; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadTaskEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.ALog; import java.io.BufferedReader; import java.io.File; @@ -61,8 +63,9 @@ class HttpThreadTask extends AbsThreadTask { super.call(); File uploadFile = new File(mEntity.getFilePath()); if (!uploadFile.exists()) { - ALog.e(TAG, String.format("【%s】,文件不存在。", mEntity.getFilePath())); - fail(); + fail(new TaskException(TAG, + String.format("上传失败,文件不存在;filePath: %s, url: %s", mEntity.getFilePath(), + mEntity.getUrl()))); return this; } mListener.onPre(); @@ -102,14 +105,15 @@ class HttpThreadTask extends AbsThreadTask { mListener.onComplete(); } catch (Exception e) { e.printStackTrace(); - fail(); + fail(new TaskException(TAG, + String.format("上传失败,filePath: %s, url: %s", mEntity.getFilePath(), mEntity.getUrl()), e)); } return this; } - private void fail() { + private void fail(BaseException e1) { try { - mListener.onFail(true); + mListener.onFail(true, e1); STATE.isRunning = false; if (mOutputStream != null) { mOutputStream.close(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java index 591876c3..774fe935 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/SimpleUploadUtil.java @@ -22,6 +22,8 @@ import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IUploadListener; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadTaskEntity; +import com.arialyy.aria.exception.BaseException; +import com.arialyy.aria.exception.TaskException; import com.arialyy.aria.util.CheckUtil; /** @@ -60,8 +62,8 @@ public class SimpleUploadUtil implements IUtil, Runnable { } } - @Override public void onFail(String url, String errorMsg, boolean needRetry) { - mListener.onFail(needRetry); + @Override public void onFail(String url, BaseException e, boolean needRetry) { + mListener.onFail(needRetry, e); } }).start(); break; diff --git a/Aria/src/main/java/com/arialyy/aria/exception/AriaIOException.java b/Aria/src/main/java/com/arialyy/aria/exception/AriaIOException.java new file mode 100644 index 00000000..db0ffc7a --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/exception/AriaIOException.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.exception; + +public class AriaIOException extends BaseException{ + private static final String ARIA_NET_EXCEPTION = "Aria Net Exception:"; + + public AriaIOException(String tag, String message) { + super(tag, String.format("%s%s", ARIA_NET_EXCEPTION, message)); + } + + public AriaIOException(String tag, String message, Exception e){ + super(tag, message, e); + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/exception/BaseException.java b/Aria/src/main/java/com/arialyy/aria/exception/BaseException.java new file mode 100644 index 00000000..98073c31 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/exception/BaseException.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.exception; + +public abstract class BaseException extends Exception { + + private String tag; + + public BaseException(String tag, String message) { + super(message); + this.tag = tag; + } + + public BaseException(String tag, String message, Exception e) { + super(String.format("%s\n%s", message == null ? "" : message, e == null ? "" : e.getMessage())); + this.tag = tag; + } + + public String getTag() { + return tag; + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/exception/TaskException.java b/Aria/src/main/java/com/arialyy/aria/exception/TaskException.java new file mode 100644 index 00000000..e8f7b765 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/exception/TaskException.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.aria.exception; + +/** + * 任务异常 + */ +public class TaskException extends BaseException { + private static final String ARIA_TASK_EXCEPTION = "Aria Task Exception:"; + + public TaskException(String tag, String detailMessage) { + super(tag, String.format("%s, %s", ARIA_TASK_EXCEPTION, detailMessage)); + } + + public TaskException(String tag, String message, Exception e){ + super(tag, message, e); + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java index 2e61f8c1..4ea24293 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java @@ -222,9 +222,9 @@ public class CheckUtil { } else if (TextUtils.isEmpty(entity.getUrl())) { throw new IllegalArgumentException("下载链接不能为空"); } else if (TextUtils.isEmpty(entity.getFileName())) { - throw new FileException("文件名不能为null"); + throw new NullPointerException("文件名不能为null"); } else if (TextUtils.isEmpty(entity.getDownloadPath())) { - throw new FileException("文件保存路径不能为null"); + throw new NullPointerException("文件保存路径不能为null"); } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java b/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java index 8f53fc75..d870f342 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java @@ -16,7 +16,6 @@ package com.arialyy.aria.util; import android.annotation.SuppressLint; -import android.util.Log; import com.arialyy.aria.core.AriaManager; import java.io.File; import java.io.FileWriter; @@ -38,8 +37,7 @@ public class ErrorHelp { * @param ex 异常 */ public static void saveError(String tag, String msg, String ex) { - String message = "\nmsg【" + msg + "】\nException:" + ex; - writeLogToFile(tag, message); + writeLogToFile(tag, String.format("\nmsg【%s】\nException:%s", msg, ex)); } /** @@ -48,10 +46,8 @@ public class ErrorHelp { * @return "/mnt/sdcard/Android/data/{package_name}/files/log/*" */ private static String getLogPath() { - String path = CommonUtil.getAppPath(AriaManager.APP) - + "log/AriaCrash_" - + getData("yyyy-MM-dd_HH:mm:ss") - + ".log"; + String path = String.format("%slog/AriaCrash_%s.log", CommonUtil.getAppPath(AriaManager.APP), + getData("yyyy-MM-dd_HH:mm:ss")); File log = new File(path); if (!log.getParentFile().exists()) { diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/EventProxyFiler.java b/AriaCompiler/src/main/java/com/arialyy/compiler/EventProxyFiler.java index f695759f..bf48b248 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/EventProxyFiler.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/EventProxyFiler.java @@ -16,6 +16,7 @@ package com.arialyy.compiler; import com.arialyy.annotations.Download; +import com.arialyy.annotations.DownloadGroup; import com.arialyy.annotations.Upload; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; @@ -91,33 +92,54 @@ final class EventProxyFiler { * * @param taskEnum 任务类型枚举{@link TaskEnum} * @param annotation {@link Download}、{@link Upload} - * @param methodName 被代理类注解的方法名 + * @param methodInfo 被代理类注解的方法信息 */ private MethodSpec createProxyMethod(TaskEnum taskEnum, Class annotation, - String methodName) { + MethodInfo methodInfo) { ClassName task = ClassName.get(taskEnum.getPkg(), taskEnum.getClassName()); ParameterSpec taskParam = ParameterSpec.builder(task, "task").addModifiers(Modifier.FINAL).build(); String callCode; + if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) { - callCode = "task, subEntity"; + if (methodInfo.params.get(methodInfo.params.size() - 1) + .asType() + .toString() + .equals(Exception.class.getName()) + && annotation == DownloadGroup.onSubTaskFail.class) { + callCode = "task, subEntity, e"; + } else { + callCode = "task, subEntity"; + } } else { - callCode = "task"; + if (methodInfo.params.get(methodInfo.params.size() - 1) + .asType() + .toString() + .equals(Exception.class.getName()) + && (annotation == Download.onTaskFail.class + || annotation == Upload.onTaskFail.class + || annotation == DownloadGroup.onTaskFail.class)) { + callCode = "task, e"; + } else { + callCode = "task"; + } } StringBuilder sb = new StringBuilder(); - sb.append("Set keys = keyMapping.get(\"").append(methodName).append("\");\n"); + sb.append("Set keys = keyMapping.get(\"") + .append(methodInfo.methodName) + .append("\");\n"); sb.append("if (keys != null) {\n\tif (keys.contains(task.getKey())) {\n") .append("\t\tobj.") - .append(methodName) + .append(methodInfo.methodName) .append("((") .append(taskEnum.getClassName()) .append(")") .append(callCode) .append(");\n\t}\n} else {\n") .append("\tobj.") - .append(methodName) + .append(methodInfo.methodName) .append("((") .append(taskEnum.getClassName()) .append(")") @@ -140,6 +162,15 @@ final class EventProxyFiler { builder.addParameter(subTaskParam); } + + if (annotation == Download.onTaskFail.class + || annotation == Upload.onTaskFail.class + || annotation == DownloadGroup.onTaskFail.class + || annotation == DownloadGroup.onSubTaskFail.class) { + ParameterSpec exception = ParameterSpec.builder(Exception.class, "e").build(); + builder.addParameter(exception); + } + return builder.build(); } @@ -165,7 +196,7 @@ final class EventProxyFiler { //Set type = new HashSet<>(); //添加注解方法 for (TaskEnum te : entity.methods.keySet()) { - Map, String> temp = entity.methods.get(te); + Map, MethodInfo> methodInfoMap = entity.methods.get(te); //if (entity.proxyClassName.contains(TaskEnum.DOWNLOAD.proxySuffix)) { // type.add(1); //} else if (entity.proxyClassName.contains(TaskEnum.DOWNLOAD_GROUP.proxySuffix)) { @@ -175,9 +206,9 @@ final class EventProxyFiler { //} else if (entity.proxyClassName.contains(TaskEnum.UPLOAD_GROUP.proxySuffix)) { // type.add(4); //} - if (temp != null) { - for (Class annotation : temp.keySet()) { - MethodSpec method = createProxyMethod(te, annotation, temp.get(annotation)); + if (methodInfoMap != null) { + for (Class annotation : methodInfoMap.keySet()) { + MethodSpec method = createProxyMethod(te, annotation, methodInfoMap.get(annotation)); builder.addMethod(method); } } diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/MethodInfo.java b/AriaCompiler/src/main/java/com/arialyy/compiler/MethodInfo.java new file mode 100644 index 00000000..13867491 --- /dev/null +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/MethodInfo.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.arialyy.compiler; + +import java.util.List; +import javax.lang.model.element.VariableElement; + +/** + * 方法信息 + */ +final class MethodInfo { + String methodName; + List params; +} diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java index 63a4440d..422eb8e2 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java @@ -15,6 +15,9 @@ */ package com.arialyy.compiler; +import com.arialyy.annotations.Download; +import com.arialyy.annotations.DownloadGroup; +import com.arialyy.annotations.Upload; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.HashMap; @@ -70,11 +73,15 @@ class ParamObtainUtil { ExecutableElement method = (ExecutableElement) element; TypeElement classElement = (TypeElement) method.getEnclosingElement(); PackageElement packageElement = mElementUtil.getPackageOf(classElement); - checkDownloadMethod(taskEnum, method); + String methodName = method.getSimpleName().toString(); String className = method.getEnclosingElement().toString(); //全类名\ String key = className + taskEnum.proxySuffix; ProxyClassParam proxyEntity = mMethodParams.get(key); + MethodInfo methodInfo = new MethodInfo(); + methodInfo.methodName = methodName; + methodInfo.params = (List) method.getParameters(); + checkMethod(taskEnum, method, annotationClazz, methodInfo.params); if (proxyEntity == null) { proxyEntity = new ProxyClassParam(); @@ -90,9 +97,10 @@ class ParamObtainUtil { } proxyEntity.taskEnums.add(taskEnum); if (proxyEntity.methods.get(taskEnum) == null) { - proxyEntity.methods.put(taskEnum, new HashMap, String>()); + proxyEntity.methods.put(taskEnum, new HashMap, MethodInfo>()); } - proxyEntity.methods.get(taskEnum).put(annotationClazz, methodName); + + proxyEntity.methods.get(taskEnum).put(annotationClazz, methodInfo); proxyEntity.keyMappings.put(methodName, getValues(taskEnum, method, annotationType)); } } @@ -144,52 +152,71 @@ class ParamObtainUtil { /** * 检查和下载相关的方法,如果被注解的方法为private或参数不合法,则抛异常 */ - private void checkDownloadMethod(TaskEnum taskEnum, ExecutableElement method) { + private void checkMethod(TaskEnum taskEnum, ExecutableElement method, + Class annotationClazz, List params) { String methodName = method.getSimpleName().toString(); String className = method.getEnclosingElement().toString(); Set modifiers = method.getModifiers(); if (modifiers.contains(Modifier.PRIVATE)) { - throw new IllegalAccessError(className + "." + methodName + "不能为private方法"); + throw new IllegalAccessError(String.format("%s.%s, 不能为private方法", className, methodName)); } - List params = (List) method.getParameters(); if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) { - if (params.size() != 2) { - throw new IllegalArgumentException(className - + "." - + methodName - + "参数错误, 参数只有两个,且第一个参数必须是" - + getCheckParams(taskEnum) - + ",第二个参数必须是" - + getCheckSubParams(taskEnum)); + if (isFailAnnotation(annotationClazz)) { + if (params.size() != 3 && params.size() != 2) { + throw new IllegalArgumentException( + String.format("%s.%s参数错误, 参数只能是两个或三个,第一个参数是:%s,第二个参数是:%s,第三个参数(可选)是:%s", className, + methodName, + getCheckParams(taskEnum), getCheckSubParams(taskEnum), + Exception.class.getSimpleName())); + } + } else { + if (params.size() != 2) { + throw new IllegalArgumentException( + String.format("%s.%s参数错误, 参数只能是两个,第一个参数是:%s,第二个参数是:%s", className, methodName, + getCheckParams(taskEnum), getCheckSubParams(taskEnum))); + } } } else { - if (params.size() != 1) { - throw new IllegalArgumentException( - className + "." + methodName + "参数错误, 参数只能有一个,且参数必须是" + getCheckParams(taskEnum)); + if (isFailAnnotation(annotationClazz)) { + if (params.size() != 1 && params.size() != 2) { + throw new IllegalArgumentException( + String.format("%s.%s参数错误, 参数只能有一个或两个,第一个参数是:%s,第二个参(可选)数是:%s", className, methodName, + getCheckParams(taskEnum), Exception.class.getSimpleName())); + } + } else { + if (params.size() != 1) { + throw new IllegalArgumentException( + String.format("%s.%s参数错误, 参数只能有一个,且参数必须是:%s", className, methodName, + getCheckParams(taskEnum))); + } } } if (!params.get(0).asType().toString().equals(getCheckParams(taskEnum))) { - throw new IllegalArgumentException(className - + "." - + methodName - + "参数【" - + params.get(0).getSimpleName() - + "】类型错误,参数必须是" - + getCheckParams(taskEnum)); + throw new IllegalArgumentException( + String.format("%s.%s参数【%s】类型错误,参数必须是:%s", className, methodName, + params.get(0).getSimpleName(), getCheckParams(taskEnum))); } if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) { if (!params.get(1).asType().toString().equals(getCheckSubParams(taskEnum))) { - throw new IllegalArgumentException(className - + "." - + methodName - + "参数【" - + params.get(0).getSimpleName() - + "】类型错误,参数必须是" - + getCheckSubParams(taskEnum)); + throw new IllegalArgumentException( + String.format("%s.%s参数【%s】类型错误,参数必须是:%s", className, methodName, + params.get(0).getSimpleName(), getCheckSubParams(taskEnum))); } } } + /** + * 判断是否是任务失败的回调注解 + * + * @return {@code true}是任务失败的回调注解 + */ + private boolean isFailAnnotation(Class annotationClazz) { + return annotationClazz == Download.onTaskFail.class + || annotationClazz == DownloadGroup.onTaskFail.class + || annotationClazz == DownloadGroup.onSubTaskFail.class + || annotationClazz == Upload.onTaskFail.class; + } + /** * 字符串数组转set * diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java index 3b9a9a88..b5f3f244 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java @@ -48,5 +48,5 @@ class ProxyClassParam { Set taskEnums; Map> keyMappings = new HashMap<>(); - Map, String>> methods = new HashMap<>(); + Map, MethodInfo>> methods = new HashMap<>(); } diff --git a/DEV_LOG.md b/DEV_LOG.md index c91242bb..b5895bbc 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,13 @@ ## 开发日志 + + v_3.5.2 + - 添加Serializable接口支持 https://github.com/AriaLyy/Aria/issues/320 + - 失败回调增加错误原因 https://github.com/AriaLyy/Aria/issues/310 + ``` + @Download.onTaskFail void taskFail(DownloadTask task, Exception e) { + e.getMessage(); + ... + } + ``` + v_3.5.1 - 优化`taskExists`方法 - 添加`post`参数请求支持 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b35e5470..05f2f200 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -12,14 +13,16 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppTheme.NoActionBar" + tools:ignore="GoogleAppIndexingWarning"> - + + @@ -29,7 +32,7 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt index 16c3e6e8..ef873639 100644 --- a/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt +++ b/app/src/main/java/com/arialyy/simple/download/KotlinDownloadActivity.kt @@ -1,75 +1,75 @@ -package com.arialyy.simple.download - -import android.os.Bundle -import android.os.Environment -import android.support.v7.app.AppCompatActivity -import android.util.Log -import android.view.View -import com.arialyy.annotations.Download -import com.arialyy.aria.core.Aria -import com.arialyy.aria.core.download.DownloadTask -import com.arialyy.simple.R -import com.arialyy.simple.base.BaseActivity - -/** - * Created by lyy on 2017/10/23. - */ -class KotlinDownloadActivity : AppCompatActivity() { - - private val DOWNLOAD_URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk" - - private val TAG = "KotlinDownloadActivity"; - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(setLayoutId()) - } - - fun setLayoutId(): Int { - return R.layout.activity_single - } - - fun init(savedInstanceState: Bundle?) { - title = "单任务下载" -// val target = Aria.download(this).load(DOWNLOAD_URL) -// binding.progress = target.getPercent() -// if (target.getTaskState() == IEntity.STATE_STOP) { -// mStart.setText("恢复") -// mStart.setTextColor(resources.getColor(android.R.color.holo_blue_light)) -// setBtState(true) -// } else if (target.isDownloading()) { -// setBtState(false) +//package com.arialyy.simple.download +// +//import android.os.Bundle +//import android.os.Environment +//import android.support.v7.app.AppCompatActivity +//import android.util.Log +//import android.view.View +//import com.arialyy.annotations.Download +//import com.arialyy.aria.core.Aria +//import com.arialyy.aria.core.download.DownloadTask +//import com.arialyy.simple.R +//import com.arialyy.simple.base.BaseActivity +// +///** +// * Created by lyy on 2017/10/23. +// */ +//class KotlinDownloadActivity : AppCompatActivity() { +// +// private val DOWNLOAD_URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk" +// +// private val TAG = "KotlinDownloadActivity"; +// +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// setContentView(setLayoutId()) +// } +// +// fun setLayoutId(): Int { +// return R.layout.activity_single +// } +// +// fun init(savedInstanceState: Bundle?) { +// title = "单任务下载" +//// val target = Aria.download(this).load(DOWNLOAD_URL) +//// binding.progress = target.getPercent() +//// if (target.getTaskState() == IEntity.STATE_STOP) { +//// mStart.setText("恢复") +//// mStart.setTextColor(resources.getColor(android.R.color.holo_blue_light)) +//// setBtState(true) +//// } else if (target.isDownloading()) { +//// setBtState(false) +//// } +//// binding.fileSize = target.getConvertFileSize() +// Aria.get(this).downloadConfig.maxTaskNum = 2 +// Aria.download(this).register() +// } +// +// @Download.onTaskRunning +// protected fun running(task: DownloadTask) { +// Log.d(TAG, task.percent.toString() + "") +//// val len = task.fileSize +//// if (len == 0L) { +//// binding.progress = 0 +//// } else { +//// binding.progress = task.percent +//// } +//// binding.speed = task.convertSpeed +// } +// +// fun onClick(view: View) { +// when (view.id) { +// R.id.start -> startD() +// R.id.stop -> Aria.download(this).load(DOWNLOAD_URL).stop() +// R.id.cancel -> Aria.download(this).load(DOWNLOAD_URL).cancel() // } -// binding.fileSize = target.getConvertFileSize() - Aria.get(this).downloadConfig.maxTaskNum = 2 - Aria.download(this).register() - } - - @Download.onTaskRunning - protected fun running(task: DownloadTask) { - Log.d(TAG, task.percent.toString() + "") -// val len = task.fileSize -// if (len == 0L) { -// binding.progress = 0 -// } else { -// binding.progress = task.percent -// } -// binding.speed = task.convertSpeed - } - - fun onClick(view: View) { - when (view.id) { - R.id.start -> startD() - R.id.stop -> Aria.download(this).load(DOWNLOAD_URL).stop() - R.id.cancel -> Aria.download(this).load(DOWNLOAD_URL).cancel() - } - } - - private fun startD() { - Aria.download(this) - .load(DOWNLOAD_URL) - .addHeader("groupName", "value") - .setDownloadPath(Environment.getExternalStorageDirectory().path + "/hhhhhhhh.apk") - .start() - } -} \ No newline at end of file +// } +// +// private fun startD() { +// Aria.download(this) +// .load(DOWNLOAD_URL) +// .addHeader("groupName", "value") +// .setDownloadPath(Environment.getExternalStorageDirectory().path + "/hhhhhhhh.apk") +// .start() +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 1fcfd4d3..dafd159b 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -16,6 +16,7 @@ package com.arialyy.simple.download; +import android.content.ContentResolver; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -49,7 +50,7 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apks"; //"https://yizi-kejian.oss-cn-beijing.aliyuncs.com/qimeng/package1/qmtable11.zip"; //"http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk"; //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 @@ -248,7 +249,7 @@ public class SingleTaskActivity extends BaseActivity { private void startD() { //Aria.get(this).setLogLevel(ALog.LOG_CLOSE); //Aria.download(this).load("aaaa.apk"); - String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg9.apk"; + String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg10.apk"; //File file = new File(path); //if (file.exists()){ // file.delete(); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index 8433f960..a0f1d547 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -31,7 +31,8 @@ public class AnyRunActivity extends BaseActivity { //String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; - String URL = "https://app-dl.byfen.com//app//201810//ef0400d637e768e9c630b4d38633ee06.zip"; + //String URL = "https://app-dl.byfen.com//app//201810//ef0400d637e768e9c630b4d38633ee06.zip"; + String URL = "ftps://9.9.9.59:990/download/SDK_Demo-release.apk"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; //private String URL = "http://cn-hbsjz-cmcc-v-03.acgvideo.com/upgcxcode/63/82/5108263/5108263-1-80.flv?expires=1530178500&platform=pc&ssig=vr7gLl0duyqWqSMnIpzaDA&oi=3746029570&nfa=BpfiWF+i4mNW8KzjZFHzBQ==&dynamic=1&hfa=2030547937&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=&trid=3476be01a9254115b15f8cc7198600fe&nfc=1"; @@ -52,8 +53,8 @@ public class AnyRunActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - module.start(URL); - //module.startFtp(URL); + //module.start(URL); + module.startFtp(URL); break; case R.id.stop: module.stop(URL); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index 06d3ff43..86bb4a03 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -78,10 +78,10 @@ public class AnyRunnModule { .loadFtp(url) .login("lao", "123456") .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/Download/") - //.asFtps() - //.setStorePath("/mnt/sdcard/Download/server.crt") - //.setAlias("www.laoyuyu.me") - //.setStorePass("123456") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") + .setStorePass("123456") .start(); } diff --git a/aria/src/main/java/com/arialyy/aria/exception/FileException.java b/aria/src/main/java/com/arialyy/aria/exception/FileException.java index 7122da80..0c4ffed5 100644 --- a/aria/src/main/java/com/arialyy/aria/exception/FileException.java +++ b/aria/src/main/java/com/arialyy/aria/exception/FileException.java @@ -19,10 +19,14 @@ package com.arialyy.aria.exception; * Created by lyy on 2017/1/18. * Aria 文件异常 */ -public class FileException extends NullPointerException { - private static final String ARIA_FILE_EXCEPTION = "Aria Exception:"; +public class FileException extends BaseException { + private static final String ARIA_FILE_EXCEPTION = "Aria File Exception:"; - public FileException(String detailMessage) { - super(ARIA_FILE_EXCEPTION + detailMessage); + public FileException(String tag, String detailMessage) { + super(tag, String.format("%s%s", ARIA_FILE_EXCEPTION, detailMessage)); + } + + public FileException(String tag, String message, Exception e){ + super(tag, message, e); } } diff --git a/gradle.properties b/gradle.properties index 36ed63a9..99bf62fd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Wed Dec 07 20:19:22 CST 2016 -#org.gradle.daemon=true -#org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 +org.gradle.daemon=true +org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 # gradle proxy https://chaosleong.github.io/2017/02/10/Configuring-Gradle-Proxy/ #systemProp.socksProxyHost=127.0.0.1 #systemProp.socksProxyPort=60777 From e22e2dc84025335eac288ed5d25298b5a4231837 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Thu, 8 Nov 2018 19:50:16 +0800 Subject: [PATCH 25/28] fix bug https://github.com/AriaLyy/Aria/issues/322 --- Aria/build.gradle | 2 +- AriaAnnotations/build.gradle | 2 +- AriaCompiler/build.gradle | 2 +- AriaFtpPlug/build.gradle | 2 +- .../commons/net/DatagramSocketClient.java | 4 +- .../commons/net/DatagramSocketFactory.java | 2 +- .../net/DefaultDatagramSocketFactory.java | 2 +- .../commons/net/DefaultSocketFactory.java | 2 +- .../net/MalformedServerReplyException.java | 2 +- .../commons/net/PrintCommandListener.java | 2 +- .../commons/net/ProtocolCommandEvent.java | 4 +- .../commons/net/ProtocolCommandListener.java | 5 +- .../commons/net/ProtocolCommandSupport.java | 8 +- .../apache/commons/net/SocketClient.java | 4 +- .../apache/commons/net/ftp/Configurable.java | 2 +- .../apache/commons/net/ftp/FTP.java | 50 +++++----- .../apache/commons/net/ftp/FTPClient.java | 91 ++++++++++--------- .../commons/net/ftp/FTPClientConfig.java | 8 +- .../apache/commons/net/ftp/FTPCmd.java | 2 +- .../apache/commons/net/ftp/FTPCommand.java | 2 +- .../net/ftp/FTPConnectionClosedException.java | 2 +- .../apache/commons/net/ftp/FTPFile.java | 2 +- .../commons/net/ftp/FTPFileEntryParser.java | 2 +- .../net/ftp/FTPFileEntryParserImpl.java | 2 +- .../apache/commons/net/ftp/FTPFileFilter.java | 2 +- .../commons/net/ftp/FTPFileFilters.java | 2 +- .../apache/commons/net/ftp/FTPHTTPClient.java | 4 +- .../commons/net/ftp/FTPListParseEngine.java | 4 +- .../apache/commons/net/ftp/FTPReply.java | 2 +- .../apache/commons/net/ftp/FTPSClient.java | 18 ++-- .../apache/commons/net/ftp/FTPSCommand.java | 2 +- .../net/ftp/FTPSServerSocketFactory.java | 2 +- .../commons/net/ftp/FTPSSocketFactory.java | 2 +- .../commons/net/ftp/FTPSTrustManager.java | 5 +- .../net/ftp/OnFtpInputStreamListener.java | 4 +- .../apache/commons/net/ftp/package-info.java | 2 +- .../ftp/parser/CompositeFileEntryParser.java | 8 +- .../ConfigurableFTPFileEntryParserImpl.java | 7 +- .../DefaultFTPFileEntryParserFactory.java | 18 ++-- .../parser/EnterpriseUnixFTPEntryParser.java | 10 +- .../ftp/parser/FTPFileEntryParserFactory.java | 6 +- .../net/ftp/parser/FTPTimestampParser.java | 2 +- .../ftp/parser/FTPTimestampParserImpl.java | 11 +-- .../net/ftp/parser/MLSxEntryParser.java | 7 +- .../net/ftp/parser/MVSFTPEntryParser.java | 10 +- .../ftp/parser/MacOsPeterFTPEntryParser.java | 10 +- .../net/ftp/parser/NTFTPEntryParser.java | 12 +-- .../net/ftp/parser/NetwareFTPEntryParser.java | 10 +- .../net/ftp/parser/OS2FTPEntryParser.java | 10 +- .../net/ftp/parser/OS400FTPEntryParser.java | 7 +- .../parser/ParserInitializationException.java | 2 +- .../parser/RegexFTPFileEntryParserImpl.java | 5 +- .../net/ftp/parser/UnixFTPEntryParser.java | 10 +- .../net/ftp/parser/VMSFTPEntryParser.java | 17 ++-- .../parser/VMSVersioningFTPEntryParser.java | 8 +- .../commons/net/ftp/parser/package-info.java | 2 +- .../apache/commons/net/io/CRLFLineReader.java | 2 +- .../commons/net/io/CopyStreamAdapter.java | 4 +- .../commons/net/io/CopyStreamEvent.java | 2 +- .../commons/net/io/CopyStreamException.java | 2 +- .../commons/net/io/CopyStreamListener.java | 2 +- .../net/io/DotTerminatedMessageReader.java | 2 +- .../net/io/DotTerminatedMessageWriter.java | 2 +- .../net/io/FromNetASCIIInputStream.java | 2 +- .../net/io/FromNetASCIIOutputStream.java | 2 +- .../commons/net/io/SocketInputStream.java | 2 +- .../commons/net/io/SocketOutputStream.java | 2 +- .../commons/net/io/ToNetASCIIInputStream.java | 2 +- .../net/io/ToNetASCIIOutputStream.java | 2 +- .../apache/commons/net/io/Util.java | 2 +- .../apache/commons/net/io/package-info.java | 2 +- .../apache/commons/net/util/Base64.java | 2 +- .../apache/commons/net/util/Charsets.java | 2 +- .../commons/net/util/KeyManagerUtils.java | 5 +- .../apache/commons/net/util/ListenerList.java | 2 +- .../commons/net/util/SSLContextUtils.java | 2 +- .../commons/net/util/SSLSocketUtils.java | 2 +- .../apache/commons/net/util/SubnetUtils.java | 2 +- .../commons/net/util/TrustManagerUtils.java | 2 +- .../apache/commons/net/util/package-info.java | 2 +- DEV_LOG.md | 1 + build.gradle | 4 +- gradle.properties | 4 +- 83 files changed, 248 insertions(+), 241 deletions(-) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/DatagramSocketClient.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/DatagramSocketFactory.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/DefaultDatagramSocketFactory.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/DefaultSocketFactory.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/MalformedServerReplyException.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/PrintCommandListener.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ProtocolCommandEvent.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ProtocolCommandListener.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ProtocolCommandSupport.java (93%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/SocketClient.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/Configurable.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTP.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPClient.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPClientConfig.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPCmd.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPCommand.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPConnectionClosedException.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPFile.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPFileEntryParser.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPFileEntryParserImpl.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPFileFilter.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPFileFilters.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPHTTPClient.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPListParseEngine.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPReply.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPSClient.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPSCommand.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPSServerSocketFactory.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPSSocketFactory.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/FTPSTrustManager.java (91%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/OnFtpInputStreamListener.java (92%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/package-info.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/CompositeFileEntryParser.java (91%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java (94%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/FTPTimestampParser.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/MLSxEntryParser.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/MVSFTPEntryParser.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/NTFTPEntryParser.java (93%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/OS2FTPEntryParser.java (93%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/OS400FTPEntryParser.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/ParserInitializationException.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/UnixFTPEntryParser.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/VMSFTPEntryParser.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/ftp/parser/package-info.java (95%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/CRLFLineReader.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/CopyStreamAdapter.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/CopyStreamEvent.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/CopyStreamException.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/CopyStreamListener.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/DotTerminatedMessageReader.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/DotTerminatedMessageWriter.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/FromNetASCIIInputStream.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/FromNetASCIIOutputStream.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/SocketInputStream.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/SocketOutputStream.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/ToNetASCIIInputStream.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/ToNetASCIIOutputStream.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/Util.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/io/package-info.java (96%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/Base64.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/Charsets.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/KeyManagerUtils.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/ListenerList.java (97%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/SSLContextUtils.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/SSLSocketUtils.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/SubnetUtils.java (99%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/TrustManagerUtils.java (98%) rename AriaFtpPlug/src/main/java/{org => aria}/apache/commons/net/util/package-info.java (95%) diff --git a/Aria/build.gradle b/Aria/build.gradle index 025b23bb..7e21ecf5 100644 --- a/Aria/build.gradle +++ b/Aria/build.gradle @@ -30,4 +30,4 @@ dependencies { // compile project(':AriaFtpPlug') } -apply from: 'bintray-release.gradle' +//apply from: 'bintray-release.gradle' diff --git a/AriaAnnotations/build.gradle b/AriaAnnotations/build.gradle index a9f2139b..0b581ad5 100644 --- a/AriaAnnotations/build.gradle +++ b/AriaAnnotations/build.gradle @@ -11,4 +11,4 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -apply from: 'bintray-release.gradle' \ No newline at end of file +//apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaCompiler/build.gradle b/AriaCompiler/build.gradle index a76e8659..38de01a1 100644 --- a/AriaCompiler/build.gradle +++ b/AriaCompiler/build.gradle @@ -14,4 +14,4 @@ dependencies { compile project(':AriaAnnotations') } -apply from: 'bintray-release.gradle' \ No newline at end of file +//apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaFtpPlug/build.gradle b/AriaFtpPlug/build.gradle index 0b581ad5..a9f2139b 100644 --- a/AriaFtpPlug/build.gradle +++ b/AriaFtpPlug/build.gradle @@ -11,4 +11,4 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -//apply from: 'bintray-release.gradle' \ No newline at end of file +apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketClient.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketClient.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketClient.java index 38e49fcc..2ddf9be4 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketClient.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketClient.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.net.DatagramSocket; import java.net.InetAddress; @@ -33,7 +33,7 @@ import java.nio.charset.Charset; * especially useful for adding things like proxy support as well as better * support for applets. For * example, you could create a - * {@link org.apache.commons.net.DatagramSocketFactory} + * {@link DatagramSocketFactory} * that * requests browser security capabilities before creating a socket. * All classes derived from DatagramSocketClient should use the diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java index e2013155..385cceb4 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/DatagramSocketFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.net.DatagramSocket; import java.net.InetAddress; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultDatagramSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultDatagramSocketFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java index 8ba558b8..e269124d 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultDatagramSocketFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.net.DatagramSocket; import java.net.InetAddress; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultSocketFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java index d5d0faa9..1fec9085 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/DefaultSocketFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.io.IOException; import java.net.InetAddress; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/MalformedServerReplyException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/MalformedServerReplyException.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java index fe0fa919..c63818fc 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/MalformedServerReplyException.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/PrintCommandListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/PrintCommandListener.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java index 9ef813db..14f92c78 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/PrintCommandListener.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.io.PrintStream; import java.io.PrintWriter; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandEvent.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandEvent.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java index 4c2f094f..9f0154e7 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandEvent.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.util.EventObject; @@ -25,7 +25,7 @@ import java.util.EventObject; * ASCII text reply. For debugging and other purposes, it is extremely * useful to log or keep track of the contents of the protocol messages. * The ProtocolCommandEvent class coupled with the - * {@link org.apache.commons.net.ProtocolCommandListener} + * {@link ProtocolCommandListener} * interface facilitate this process. * * diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandListener.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java index e9bf74ef..12f8e00e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandListener.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; +import aria.apache.commons.net.ftp.FTPClient; import java.util.EventListener; /*** @@ -30,7 +31,7 @@ import java.util.EventListener; * To receive ProtocolCommandEvents, you merely implement the * ProtocolCommandListener interface and register the class as a listener * with a ProtocolCommandEvent source such as - * {@link org.apache.commons.net.ftp.FTPClient}. + * {@link FTPClient}. * * * @see ProtocolCommandEvent diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandSupport.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java similarity index 93% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandSupport.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java index c420259f..01b1888e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ProtocolCommandSupport.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.io.Serializable; import java.util.EventListener; -import org.apache.commons.net.util.ListenerList; +import aria.apache.commons.net.util.ListenerList; /*** * ProtocolCommandSupport is a convenience class for managing a list of @@ -53,7 +53,7 @@ public class ProtocolCommandSupport implements Serializable { /*** * Fires a ProtocolCommandEvent signalling the sending of a command to all * registered listeners, invoking their - * {@link org.apache.commons.net.ProtocolCommandListener#protocolCommandSent protocolCommandSent() } + * {@link ProtocolCommandListener#protocolCommandSent protocolCommandSent() } * methods. * * @param command The string representation of the command type sent, not @@ -74,7 +74,7 @@ public class ProtocolCommandSupport implements Serializable { /*** * Fires a ProtocolCommandEvent signalling the reception of a command reply * to all registered listeners, invoking their - * {@link org.apache.commons.net.ProtocolCommandListener#protocolReplyReceived protocolReplyReceived() } + * {@link ProtocolCommandListener#protocolReplyReceived protocolReplyReceived() } * methods. * * @param replyCode The integer code indicating the natureof the reply. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/SocketClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/SocketClient.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java index bd472916..0ac183a7 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/SocketClient.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net; +package aria.apache.commons.net; import java.io.Closeable; import java.io.IOException; @@ -119,7 +119,7 @@ public abstract class SocketClient { * _socket_ to null, _timeout_ to 0, _defaultPort to 0, * _isConnected_ to false, charset to {@code Charset.defaultCharset()} * and _socketFactory_ to a shared instance of - * {@link org.apache.commons.net.DefaultSocketFactory}. + * {@link DefaultSocketFactory}. */ public SocketClient() { _socket_ = null; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/Configurable.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/Configurable.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java index dd8767ee..b0361f80 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/Configurable.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * This interface adds the aspect of configurability by means of diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTP.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTP.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java index de9c840f..12a99b15 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTP.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -30,21 +30,21 @@ import java.net.SocketException; import java.net.SocketTimeoutException; import java.util.ArrayList; -import org.apache.commons.net.MalformedServerReplyException; -import org.apache.commons.net.ProtocolCommandSupport; -import org.apache.commons.net.SocketClient; -import org.apache.commons.net.io.CRLFLineReader; +import aria.apache.commons.net.MalformedServerReplyException; +import aria.apache.commons.net.ProtocolCommandSupport; +import aria.apache.commons.net.SocketClient; +import aria.apache.commons.net.io.CRLFLineReader; /*** * FTP provides the basic the functionality necessary to implement your - * own FTP client. It extends org.apache.commons.net.SocketClient since + * own FTP client. It extends SocketClient since * extending TelnetClient was causing unwanted behavior (like connections * that did not time out properly). *

* To derive the full benefits of the FTP class requires some knowledge * of the FTP protocol defined in RFC 959. However, there is no reason * why you should have to use the FTP class. The - * {@link org.apache.commons.net.ftp.FTPClient} class, + * {@link FTPClient} class, * derived from FTP, * implements all the functionality required of an FTP client. The * FTP class is made public to provide access to various FTP constants @@ -57,16 +57,16 @@ import org.apache.commons.net.io.CRLFLineReader; * close a connection if the client has been idle for longer than a * given time period (usually 900 seconds). The FTP class will detect a * premature FTP server connection closing when it receives a - * {@link org.apache.commons.net.ftp.FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE } + * {@link FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE } * response to a command. * When that occurs, the FTP class method encountering that reply will throw - * an {@link org.apache.commons.net.ftp.FTPConnectionClosedException} + * an {@link FTPConnectionClosedException} * . FTPConectionClosedException * is a subclass of IOException and therefore need not be * caught separately, but if you are going to catch it separately, its * catch block must appear before the more general IOException * catch block. When you encounter an - * {@link org.apache.commons.net.ftp.FTPConnectionClosedException} + * {@link FTPConnectionClosedException} * , you must disconnect the connection with * {@link #disconnect disconnect() } to properly clean up the * system resources used by FTP. Before disconnecting, you may check the @@ -80,7 +80,7 @@ import org.apache.commons.net.io.CRLFLineReader; * Rather than list it separately for each method, we mention here that * every method communicating with the server and throwing an IOException * can also throw a - * {@link org.apache.commons.net.MalformedServerReplyException} + * {@link MalformedServerReplyException} * , which is a subclass * of IOException. A MalformedServerReplyException will be thrown when * the reply received from the server deviates enough from the protocol @@ -89,7 +89,7 @@ import org.apache.commons.net.io.CRLFLineReader; * * @see FTPClient * @see FTPConnectionClosedException - * @see org.apache.commons.net.MalformedServerReplyException + * @see MalformedServerReplyException * @version $Id: FTP.java 1782546 2017-02-11 00:05:41Z sebb $ ***/ @@ -1105,7 +1105,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP RETR command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param pathname The pathname of the file to retrieve. @@ -1126,7 +1126,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP STOR command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param pathname The pathname to use for the file when stored at @@ -1148,7 +1148,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP STOU command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @return The reply code received from the server. @@ -1168,7 +1168,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP STOU command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * @param pathname The base pathname to use for the file when stored at * the remote end of the transfer. Some FTP servers @@ -1190,7 +1190,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP APPE command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param pathname The pathname to use for the file when stored at @@ -1418,7 +1418,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP LIST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @return The reply code received from the server. @@ -1438,7 +1438,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP LIST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param pathname The pathname to list, @@ -1460,7 +1460,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP MLSD command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @return The reply code received from the server. @@ -1481,7 +1481,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP MLSD command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param path the path to report on @@ -1504,7 +1504,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP MLST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @return The reply code received from the server. @@ -1525,7 +1525,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP MLST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param path the path to report on @@ -1548,7 +1548,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP NLST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @return The reply code received from the server. @@ -1568,7 +1568,7 @@ public class FTP extends SocketClient { * A convenience method to send the FTP NLST command to the server, * receive the reply, and return the reply code. Remember, it is up * to you to manage the data connection. If you don't need this low - * level of access, use {@link org.apache.commons.net.ftp.FTPClient} + * level of access, use {@link FTPClient} * , which will handle all low level details for you. * * @param pathname The pathname to list, diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClient.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java index 862bea2f..4bcf98dc 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClient.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java @@ -14,8 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; +import aria.apache.commons.net.SocketClient; +import aria.apache.commons.net.ftp.parser.ParserInitializationException; +import aria.apache.commons.net.io.CopyStreamAdapter; +import aria.apache.commons.net.io.CopyStreamEvent; +import aria.apache.commons.net.io.CopyStreamException; +import aria.apache.commons.net.io.CopyStreamListener; +import aria.apache.commons.net.io.FromNetASCIIInputStream; +import aria.apache.commons.net.io.SocketInputStream; +import aria.apache.commons.net.io.SocketOutputStream; +import aria.apache.commons.net.io.ToNetASCIIOutputStream; +import aria.apache.commons.net.io.Util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; @@ -42,28 +53,22 @@ import java.util.Properties; import java.util.Random; import java.util.Set; -import org.apache.commons.net.MalformedServerReplyException; -import org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory; -import org.apache.commons.net.ftp.parser.FTPFileEntryParserFactory; -import org.apache.commons.net.ftp.parser.MLSxEntryParser; -import org.apache.commons.net.io.CRLFLineReader; -import org.apache.commons.net.io.CopyStreamAdapter; -import org.apache.commons.net.io.CopyStreamEvent; -import org.apache.commons.net.io.CopyStreamListener; -import org.apache.commons.net.io.FromNetASCIIInputStream; -import org.apache.commons.net.io.ToNetASCIIOutputStream; -import org.apache.commons.net.io.Util; +import aria.apache.commons.net.MalformedServerReplyException; +import aria.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory; +import aria.apache.commons.net.ftp.parser.FTPFileEntryParserFactory; +import aria.apache.commons.net.ftp.parser.MLSxEntryParser; +import aria.apache.commons.net.io.CRLFLineReader; /** * FTPClient encapsulates all the functionality necessary to store and * retrieve files from an FTP server. This class takes care of all * low level details of interacting with an FTP server and provides * a convenient higher level interface. As with all classes derived - * from {@link org.apache.commons.net.SocketClient}, + * from {@link SocketClient}, * you must first connect to the server with - * {@link org.apache.commons.net.SocketClient#connect connect } + * {@link SocketClient#connect connect } * before doing anything, and finally - * {@link org.apache.commons.net.SocketClient#disconnect disconnect } + * {@link SocketClient#disconnect disconnect } * after you're completely finished interacting with the server. * Then you need to check the FTP reply code to see if the connection * was successful. For example: @@ -162,14 +167,14 @@ import org.apache.commons.net.io.Util; * {@link FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE } * response to a command. * When that occurs, the FTP class method encountering that reply will throw - * an {@link org.apache.commons.net.ftp.FTPConnectionClosedException} + * an {@link FTPConnectionClosedException} * . * FTPConnectionClosedException * is a subclass of IOException and therefore need not be * caught separately, but if you are going to catch it separately, its * catch block must appear before the more general IOException * catch block. When you encounter an - * {@link org.apache.commons.net.ftp.FTPConnectionClosedException} + * {@link FTPConnectionClosedException} * , you must disconnect the connection with * {@link #disconnect disconnect() } to properly clean up the * system resources used by FTPClient. Before disconnecting, you may check the @@ -184,7 +189,7 @@ import org.apache.commons.net.io.Util; * Rather than list it separately for each method, we mention here that * every method communicating with the server and throwing an IOException * can also throw a - * {@link org.apache.commons.net.MalformedServerReplyException} + * {@link MalformedServerReplyException} * , which is a subclass * of IOException. A MalformedServerReplyException will be thrown when * the reply received from the server deviates enough from the protocol @@ -291,7 +296,7 @@ import org.apache.commons.net.io.Util; * @see FTPFileEntryParserFactory * @see DefaultFTPFileEntryParserFactory * @see FTPClientConfig - * @see org.apache.commons.net.MalformedServerReplyException + * @see MalformedServerReplyException */ public class FTPClient extends FTP implements Configurable { /** @@ -320,7 +325,7 @@ public class FTPClient extends FTP implements Configurable { * For example: *

    * Plan 9=Unix
-   * OS410=org.apache.commons.net.ftp.parser.OS400FTPEntryParser
+   * OS410=OS400FTPEntryParser
    * 
* * @since 3.0 @@ -713,7 +718,7 @@ public class FTPClient extends FTP implements Configurable { } else { output = socket.getOutputStream(); } - return new org.apache.commons.net.io.SocketOutputStream(socket, output); + return new SocketOutputStream(socket, output); } /** @@ -1757,7 +1762,7 @@ public class FTPClient extends FTP implements Configurable { * of the client being idle or some other reason causing the server * to send FTP reply code 421. This exception may be caught either * as an IOException or independently as itself. - * @throws org.apache.commons.net.io.CopyStreamException If an I/O error occurs while actually + * @throws CopyStreamException If an I/O error occurs while actually * transferring the file. The CopyStreamException allows you to * determine the number of bytes transferred and the IOException * causing the error. This exception may be caught either @@ -1874,7 +1879,7 @@ public class FTPClient extends FTP implements Configurable { } else { input = socket.getInputStream(); } - return new org.apache.commons.net.io.SocketInputStream(socket, input); + return new SocketInputStream(socket, input); } /** @@ -1892,7 +1897,7 @@ public class FTPClient extends FTP implements Configurable { * of the client being idle or some other reason causing the server * to send FTP reply code 421. This exception may be caught either * as an IOException or independently as itself. - * @throws org.apache.commons.net.io.CopyStreamException If an I/O error occurs while actually + * @throws CopyStreamException If an I/O error occurs while actually * transferring the file. The CopyStreamException allows you to * determine the number of bytes transferred and the IOException * causing the error. This exception may be caught either @@ -1965,7 +1970,7 @@ public class FTPClient extends FTP implements Configurable { * of the client being idle or some other reason causing the server * to send FTP reply code 421. This exception may be caught either * as an IOException or independently as itself. - * @throws org.apache.commons.net.io.CopyStreamException If an I/O error occurs while actually + * @throws CopyStreamException If an I/O error occurs while actually * transferring the file. The CopyStreamException allows you to * determine the number of bytes transferred and the IOException * causing the error. This exception may be caught either @@ -2026,7 +2031,7 @@ public class FTPClient extends FTP implements Configurable { * of the client being idle or some other reason causing the server * to send FTP reply code 421. This exception may be caught either * as an IOException or independently as itself. - * @throws org.apache.commons.net.io.CopyStreamException If an I/O error occurs while actually + * @throws CopyStreamException If an I/O error occurs while actually * transferring the file. The CopyStreamException allows you to * determine the number of bytes transferred and the IOException * causing the error. This exception may be caught either @@ -2087,7 +2092,7 @@ public class FTPClient extends FTP implements Configurable { * of the client being idle or some other reason causing the server * to send FTP reply code 421. This exception may be caught either * as an IOException or independently as itself. - * @throws org.apache.commons.net.io.CopyStreamException If an I/O error occurs while actually + * @throws CopyStreamException If an I/O error occurs while actually * transferring the file. The CopyStreamException allows you to * determine the number of bytes transferred and the IOException * causing the error. This exception may be caught either @@ -2826,7 +2831,7 @@ public class FTPClient extends FTP implements Configurable { * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply * from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * parserKey * parameter cannot be * resolved by the selected parser factory. @@ -2834,13 +2839,13 @@ public class FTPClient extends FTP implements Configurable { * happen when parserKey is neither * the fully qualified class name of a class * implementing the interface - * org.apache.commons.net.ftp.FTPFileEntryParser + * FTPFileEntryParser * nor a string containing one of the recognized keys * mapping to such a parser or if class loader * security issues prevent its being loaded. * @see DefaultFTPFileEntryParserFactory * @see FTPFileEntryParserFactory - * @see org.apache.commons.net.ftp.FTPFileEntryParser + * @see FTPFileEntryParser */ public FTPFile[] listFiles(String pathname) throws IOException { FTPListParseEngine engine = initiateListParsing((String) null, pathname); @@ -2875,7 +2880,7 @@ public class FTPClient extends FTP implements Configurable { * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply * from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * parserKey * parameter cannot be * resolved by the selected parser factory. @@ -2883,13 +2888,13 @@ public class FTPClient extends FTP implements Configurable { * happen when parserKey is neither * the fully qualified class name of a class * implementing the interface - * org.apache.commons.net.ftp.FTPFileEntryParser + * FTPFileEntryParser * nor a string containing one of the recognized keys * mapping to such a parser or if class loader * security issues prevent its being loaded. * @see DefaultFTPFileEntryParserFactory * @see FTPFileEntryParserFactory - * @see org.apache.commons.net.ftp.FTPFileEntryParser + * @see FTPFileEntryParser */ public FTPFile[] listFiles() throws IOException { return listFiles((String) null); @@ -2934,7 +2939,7 @@ public class FTPClient extends FTP implements Configurable { * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply * from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * parserKey * parameter cannot be * resolved by the selected parser factory. @@ -2942,13 +2947,13 @@ public class FTPClient extends FTP implements Configurable { * happen when parserKey is neither * the fully qualified class name of a class * implementing the interface - * org.apache.commons.net.ftp.FTPFileEntryParser + * FTPFileEntryParser * nor a string containing one of the recognized keys * mapping to such a parser or if class loader * security issues prevent its being loaded. * @see DefaultFTPFileEntryParserFactory * @see FTPFileEntryParserFactory - * @see org.apache.commons.net.ftp.FTPFileEntryParser + * @see FTPFileEntryParser * @since 3.0 */ public FTPFile[] listDirectories() throws IOException { @@ -2980,7 +2985,7 @@ public class FTPClient extends FTP implements Configurable { * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply * from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * parserKey * parameter cannot be * resolved by the selected parser factory. @@ -2988,13 +2993,13 @@ public class FTPClient extends FTP implements Configurable { * happen when parserKey is neither * the fully qualified class name of a class * implementing the interface - * org.apache.commons.net.ftp.FTPFileEntryParser + * FTPFileEntryParser * nor a string containing one of the recognized keys * mapping to such a parser or if class loader * security issues prevent its being loaded. * @see DefaultFTPFileEntryParserFactory * @see FTPFileEntryParserFactory - * @see org.apache.commons.net.ftp.FTPFileEntryParser + * @see FTPFileEntryParser * @since 3.0 */ public FTPFile[] listDirectories(String parent) throws IOException { @@ -3027,7 +3032,7 @@ public class FTPClient extends FTP implements Configurable { * as an IOException or independently as itself. * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * autodetect mechanism cannot * resolve the type of system we are connected with. * @see FTPListParseEngine @@ -3079,7 +3084,7 @@ public class FTPClient extends FTP implements Configurable { * as an IOException or independently as itself. * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * autodetect mechanism cannot * resolve the type of system we are connected with. * @see FTPListParseEngine @@ -3127,7 +3132,7 @@ public class FTPClient extends FTP implements Configurable { * as an IOException or independently as itself. * @throws IOException If an I/O error occurs while either sending a * command to the server or receiving a reply from the server. - * @throws org.apache.commons.net.ftp.parser.ParserInitializationException Thrown if the + * @throws ParserInitializationException Thrown if the * parserKey * parameter cannot be * resolved by the selected parser factory. @@ -3135,7 +3140,7 @@ public class FTPClient extends FTP implements Configurable { * happen when parserKey is neither * the fully qualified class name of a class * implementing the interface - * org.apache.commons.net.ftp.FTPFileEntryParser + * FTPFileEntryParser * nor a string containing one of the recognized keys * mapping to such a parser or if class loader * security issues prevent its being loaded. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java index 4d8acf56..abe8902e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; +import aria.apache.commons.net.ftp.parser.ConfigurableFTPFileEntryParserImpl; +import aria.apache.commons.net.ftp.parser.FTPTimestampParserImpl; import java.text.DateFormatSymbols; import java.util.Collection; import java.util.Locale; @@ -131,8 +133,8 @@ import java.util.TreeMap; * * @see Configurable * @see FTPClient - * @see org.apache.commons.net.ftp.parser.FTPTimestampParserImpl#configure(FTPClientConfig) - * @see org.apache.commons.net.ftp.parser.ConfigurableFTPFileEntryParserImpl + * @see FTPTimestampParserImpl#configure(FTPClientConfig) + * @see ConfigurableFTPFileEntryParserImpl * @since 1.4 */ public class FTPClientConfig { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCmd.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCmd.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java index a56fb772..de14835b 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCmd.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * @since 3.3 diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCommand.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCommand.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java index dee027f4..3a1aef89 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPCommand.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * FTPCommand stores a set of constants for FTP command codes. To interpret diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPConnectionClosedException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPConnectionClosedException.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java index 381aa19d..aa95277e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPConnectionClosedException.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFile.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFile.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java index 937c704a..5edcc119 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFile.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.Serializable; import java.util.Calendar; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java index 955c02d7..0c04b265 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.BufferedReader; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParserImpl.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParserImpl.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParserImpl.java index 599f7609..5af13643 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileEntryParserImpl.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParserImpl.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.BufferedReader; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilter.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilter.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilter.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilter.java index 84fd5efc..898ee154 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilter.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilter.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * Perform filtering on FTPFile entries. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilters.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilters.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java index 138ebc42..40a59a99 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPFileFilters.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * Implements some simple FTPFileFilter classes. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPHTTPClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPHTTPClient.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java index caa39687..0304e427 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPHTTPClient.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.BufferedReader; import java.io.IOException; @@ -30,7 +30,7 @@ import java.net.SocketException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.net.util.Base64; +import aria.apache.commons.net.util.Base64; /** * Experimental attempt at FTP client that tunnels over an HTTP proxy connection. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPListParseEngine.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPListParseEngine.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPListParseEngine.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPListParseEngine.java index 4998a939..51e117e5 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPListParseEngine.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPListParseEngine.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.BufferedReader; import java.io.IOException; @@ -27,7 +27,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; -import org.apache.commons.net.util.Charsets; +import aria.apache.commons.net.util.Charsets; /** * This class handles the entire process of parsing a listing of diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPReply.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPReply.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPReply.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPReply.java index 986d76fd..991cb93d 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPReply.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPReply.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /*** * FTPReply stores a set of constants for FTP reply codes. To interpret diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSClient.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java index 512a5628..7f79e98b 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSClient.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; +import aria.apache.commons.net.SocketClient; +import aria.apache.commons.net.util.KeyManagerUtils; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; @@ -33,10 +35,10 @@ import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; -import org.apache.commons.net.util.Base64; -import org.apache.commons.net.util.SSLContextUtils; -import org.apache.commons.net.util.SSLSocketUtils; -import org.apache.commons.net.util.TrustManagerUtils; +import aria.apache.commons.net.util.Base64; +import aria.apache.commons.net.util.SSLContextUtils; +import aria.apache.commons.net.util.SSLSocketUtils; +import aria.apache.commons.net.util.TrustManagerUtils; /** * FTP over SSL processing. If desired, the JVM property -Djavax.net.debug=all can be used to @@ -219,7 +221,7 @@ public class FTPSClient extends FTPClient { * rather than reimplementing all of the connect() methods. * * @throws IOException If it throw by _connectAction_. - * @see org.apache.commons.net.SocketClient#_connectAction_() + * @see SocketClient#_connectAction_() */ @Override protected void _connectAction_() throws IOException { // Implicit mode. @@ -324,7 +326,7 @@ public class FTPSClient extends FTPClient { * Set a {@link KeyManager} to use * * @param keyManager The KeyManager implementation to set. - * @see org.apache.commons.net.util.KeyManagerUtils + * @see KeyManagerUtils */ public void setKeyManager(KeyManager keyManager) { this.keyManager = keyManager; @@ -697,7 +699,7 @@ public class FTPSClient extends FTPClient { * the default TrustManager from the JVM will be used. * * @param trustManager The TrustManager implementation to set, may be {@code null} - * @see org.apache.commons.net.util.TrustManagerUtils + * @see TrustManagerUtils */ public void setTrustManager(TrustManager trustManager) { this.trustManager = trustManager; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSCommand.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSCommand.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java index 1cbb46f8..5937638b 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSCommand.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; /** * FTPS-specific commands. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSServerSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSServerSocketFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java index 2ef046e5..168067bc 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSServerSocketFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.IOException; import java.net.InetAddress; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSSocketFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java index 2015681e..7bbf818c 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSSocketFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; import java.io.IOException; import java.net.InetAddress; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSTrustManager.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java similarity index 91% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSTrustManager.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java index 5a5d7e93..0923ac02 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/FTPSTrustManager.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; +import aria.apache.commons.net.util.TrustManagerUtils; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -27,7 +28,7 @@ import javax.net.ssl.X509TrustManager; * * @since 2.0 * @deprecated 3.0 use - * {@link org.apache.commons.net.util.TrustManagerUtils#getValidateServerCertificateTrustManager() + * {@link TrustManagerUtils#getValidateServerCertificateTrustManager() * TrustManagerUtils#getValidateServerCertificateTrustManager()} instead */ @Deprecated public class FTPSTrustManager implements X509TrustManager { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/OnFtpInputStreamListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java similarity index 92% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/OnFtpInputStreamListener.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java index 9966080e..f7adaf6d 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/OnFtpInputStreamListener.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.net.ftp; +package aria.apache.commons.net.ftp; -import org.apache.commons.net.io.CopyStreamListener; +import aria.apache.commons.net.io.CopyStreamListener; /** * Created by AriaL on 2017/9/26. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/package-info.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java index 496aba13..f7df7cf0 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/package-info.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java @@ -18,4 +18,4 @@ /** * FTP and FTPS support classes */ -package org.apache.commons.net.ftp; \ No newline at end of file +package aria.apache.commons.net.ftp; \ No newline at end of file diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/CompositeFileEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java similarity index 91% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/CompositeFileEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java index a05e7ba7..638f67fb 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/CompositeFileEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; -import org.apache.commons.net.ftp.FTPFile; -import org.apache.commons.net.ftp.FTPFileEntryParser; -import org.apache.commons.net.ftp.FTPFileEntryParserImpl; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; +import aria.apache.commons.net.ftp.FTPFileEntryParserImpl; /** * This implementation allows to pack some FileEntryParsers together diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java index 3aebd8a7..1d8988b6 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java @@ -15,14 +15,13 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.Configurable; +import aria.apache.commons.net.ftp.FTPClientConfig; import java.text.ParseException; import java.util.Calendar; -import org.apache.commons.net.ftp.Configurable; -import org.apache.commons.net.ftp.FTPClientConfig; - /** *

* This abstract class implements the common timestamp parsing diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java index 80888917..cc499c71 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java @@ -15,23 +15,23 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.Configurable; +import aria.apache.commons.net.ftp.FTPClient; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.util.regex.Pattern; -import org.apache.commons.net.ftp.Configurable; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFileEntryParser; - /** * This is the default implementation of the * FTPFileEntryParserFactory interface. This is the * implementation that will be used by - * org.apache.commons.net.ftp.FTPClient.listFiles() + * FTPClient.listFiles() * if no other implementation has been specified. * - * @see org.apache.commons.net.ftp.FTPClient#listFiles - * @see org.apache.commons.net.ftp.FTPClient#setParserFactory + * @see FTPClient#listFiles + * @see FTPClient#setParserFactory */ public class DefaultFTPFileEntryParserFactory implements FTPFileEntryParserFactory { @@ -104,7 +104,7 @@ public class DefaultFTPFileEntryParserFactory implements FTPFileEntryParserFacto } catch (ClassCastException e) { throw new ParserInitializationException(parserClass.getName() + " does not implement the interface " - + "org.apache.commons.net.ftp.FTPFileEntryParser.", e); + + "FTPFileEntryParser.", e); } catch (Exception e) { throw new ParserInitializationException("Error initializing parser", e); } catch (ExceptionInInitializerError e) { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java index 98ae8aee..ca31583a 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/EnterpriseUnixFTPEntryParser.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.util.Calendar; -import org.apache.commons.net.ftp.FTPFile; - /** * Parser for the Connect Enterprise Unix FTP Server From Sterling Commerce. * Here is a sample of the sort of output line this parser processes: @@ -32,8 +32,8 @@ import org.apache.commons.net.ftp.FTPFile; * * * @version $Id: EnterpriseUnixFTPEntryParser.java 1741829 2016-05-01 00:24:44Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) - * @see org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see DefaultFTPFileEntryParserFactory */ public class EnterpriseUnixFTPEntryParser extends RegexFTPFileEntryParserImpl { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java similarity index 94% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java index c01cac15..2e3c84e0 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFileEntryParser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFileEntryParser; /** * The interface describes a factory for creating FTPFileEntryParsers. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParser.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParser.java index 52f48de1..dab122a4 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParser.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; import java.text.ParseException; import java.util.Calendar; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java index b0291dce..e84209ff 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.Configurable; +import aria.apache.commons.net.ftp.FTPClientConfig; import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.ParsePosition; @@ -25,12 +27,9 @@ import java.util.Calendar; import java.util.Date; import java.util.TimeZone; -import org.apache.commons.net.ftp.Configurable; -import org.apache.commons.net.ftp.FTPClientConfig; - /** * Default implementation of the {@link FTPTimestampParser FTPTimestampParser} - * interface also implements the {@link org.apache.commons.net.ftp.Configurable Configurable} + * interface also implements the {@link Configurable Configurable} * interface to allow the parsing to be configured from the outside. * * @see ConfigurableFTPFileEntryParserImpl @@ -355,7 +354,7 @@ public class FTPTimestampParserImpl implements FTPTimestampParser, Configurable * to parse timestamps. *

  • otherwise use default English month names
  • *

    - * Finally if a {@link org.apache.commons.net.ftp.FTPClientConfig#setServerTimeZoneId(String) + * Finally if a {@link FTPClientConfig#setServerTimeZoneId(String) * serverTimeZoneId} * has been supplied via the config, set that into all date formats that have * been configured. diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MLSxEntryParser.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MLSxEntryParser.java index c28b4a3f..b6d11bb8 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MLSxEntryParser.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParserImpl; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -26,9 +28,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.TimeZone; -import org.apache.commons.net.ftp.FTPFile; -import org.apache.commons.net.ftp.FTPFileEntryParserImpl; - /** * Parser class for MSLT and MLSD replies. See RFC 3659. *

    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MVSFTPEntryParser.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MVSFTPEntryParser.java index ff87813f..85a01925 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MVSFTPEntryParser.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.text.ParseException; import java.util.List; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * Implementation of FTPFileEntryParser and FTPFileListParser for IBM zOS/MVS * Systems. * * @version $Id: MVSFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for + * @see FTPFileEntryParser FTPFileEntryParser (for * usage instructions) */ public class MVSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java index 5752a9b9..2c8414d6 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/MacOsPeterFTPEntryParser.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.text.ParseException; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * Implementation FTPFileEntryParser and FTPFileListParser for pre MacOS-X Systems. * * @version $Id: MacOsPeterFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) * @since 3.1 */ public class diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NTFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java similarity index 93% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NTFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java index 7a45a226..cee2811a 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NTFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.Configurable; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.text.ParseException; import java.util.regex.Pattern; -import org.apache.commons.net.ftp.Configurable; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * Implementation of FTPFileEntryParser and FTPFileListParser for NT Systems. * * @version $Id: NTFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) */ public class NTFTPEntryParser extends ConfigurableFTPFileEntryParserImpl { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java index 387755ea..7585ebbe 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NetwareFTPEntryParser.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.text.ParseException; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * Implementation of FTPFileEntryParser and FTPFileListParser for Netware Systems. Note that some of * the proprietary @@ -31,7 +31,7 @@ import org.apache.commons.net.ftp.FTPFile; * for more details. * * @version $Id: NetwareFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) * @since 1.5 */ public class NetwareFTPEntryParser extends ConfigurableFTPFileEntryParserImpl { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS2FTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java similarity index 93% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS2FTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java index 261aa7f6..fc2413e9 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS2FTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.text.ParseException; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * Implementation of FTPFileEntryParser and FTPFileListParser for OS2 Systems. * * @version $Id: OS2FTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) */ public class OS2FTPEntryParser extends ConfigurableFTPFileEntryParserImpl diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS400FTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS400FTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java index 306a911d..43198267 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/OS400FTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java @@ -15,14 +15,13 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFile; import java.io.File; import java.text.ParseException; -import org.apache.commons.net.ftp.FTPClientConfig; -import org.apache.commons.net.ftp.FTPFile; - /** * @version $Id: OS400FTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ *

    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ParserInitializationException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java
    similarity index 97%
    rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ParserInitializationException.java
    rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java
    index dacc3468..72576687 100644
    --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/ParserInitializationException.java
    +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java
    @@ -15,7 +15,7 @@
      * limitations under the License.
      */
     
    -package org.apache.commons.net.ftp.parser;
    +package aria.apache.commons.net.ftp.parser;
     
     /**
      * This class encapsulates all errors that may be thrown by
    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
    similarity index 98%
    rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
    rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
    index 035d8349..90100f89 100644
    --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
    +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
    @@ -15,15 +15,14 @@
      * limitations under the License.
      */
     
    -package org.apache.commons.net.ftp.parser;
    +package aria.apache.commons.net.ftp.parser;
     
    +import aria.apache.commons.net.ftp.FTPFileEntryParserImpl;
     import java.util.regex.MatchResult;
     import java.util.regex.Matcher;
     import java.util.regex.Pattern;
     import java.util.regex.PatternSyntaxException;
     
    -import org.apache.commons.net.ftp.FTPFileEntryParserImpl;
    -
     /**
      * This abstract class implements both the older FTPFileListParser and
      * newer FTPFileEntryParser interfaces with default functionality.
    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/UnixFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
    similarity index 97%
    rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
    rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
    index 5a1a49c5..5e35f308 100644
    --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
    +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
    @@ -15,15 +15,15 @@
      * limitations under the License.
      */
     
    -package org.apache.commons.net.ftp.parser;
    +package aria.apache.commons.net.ftp.parser;
     
    +import aria.apache.commons.net.ftp.FTPClientConfig;
    +import aria.apache.commons.net.ftp.FTPFile;
    +import aria.apache.commons.net.ftp.FTPFileEntryParser;
     import java.text.ParseException;
     import java.util.List;
     import java.util.ListIterator;
     
    -import org.apache.commons.net.ftp.FTPClientConfig;
    -import org.apache.commons.net.ftp.FTPFile;
    -
     /**
      * Implementation FTPFileEntryParser and FTPFileListParser for standard
      * Unix Systems.
    @@ -33,7 +33,7 @@ import org.apache.commons.net.ftp.FTPFile;
      * new FTPFileEntryParser interface.
      *
      * @version $Id: UnixFTPEntryParser.java 1781925 2017-02-06 16:43:40Z sebb $
    - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
    + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
      */
     public class UnixFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
     
    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
    similarity index 95%
    rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
    rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
    index 3371371a..b2578cd0 100644
    --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
    +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
    @@ -15,16 +15,17 @@
      * limitations under the License.
      */
     
    -package org.apache.commons.net.ftp.parser;
    +package aria.apache.commons.net.ftp.parser;
     
    +import aria.apache.commons.net.ftp.FTPClientConfig;
    +import aria.apache.commons.net.ftp.FTPFile;
    +import aria.apache.commons.net.ftp.FTPFileEntryParser;
    +import aria.apache.commons.net.ftp.FTPListParseEngine;
     import java.io.BufferedReader;
     import java.io.IOException;
     import java.text.ParseException;
     import java.util.StringTokenizer;
     
    -import org.apache.commons.net.ftp.FTPClientConfig;
    -import org.apache.commons.net.ftp.FTPFile;
    -
     /**
      * Implementation FTPFileEntryParser and FTPFileListParser for VMS Systems.
      * This is a sample of VMS LIST output
    @@ -43,8 +44,8 @@ import org.apache.commons.net.ftp.FTPFile;
      * 

    * * @version $Id: VMSFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) - * @see org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see DefaultFTPFileEntryParserFactory */ public class VMSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl { @@ -234,8 +235,8 @@ public class VMSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl { * @deprecated (2.2) No other FTPFileEntryParser implementations have this method. */ @Deprecated public FTPFile[] parseFileList(java.io.InputStream listStream) throws IOException { - org.apache.commons.net.ftp.FTPListParseEngine engine = - new org.apache.commons.net.ftp.FTPListParseEngine(this); + FTPListParseEngine engine = + new FTPListParseEngine(this); engine.readServerList(listStream, null); return engine.getFiles(); } diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java index b8d0d396..948662a7 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package org.apache.commons.net.ftp.parser; +package aria.apache.commons.net.ftp.parser; +import aria.apache.commons.net.ftp.FTPClientConfig; +import aria.apache.commons.net.ftp.FTPFileEntryParser; import java.util.HashMap; import java.util.List; import java.util.ListIterator; @@ -25,8 +27,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import org.apache.commons.net.ftp.FTPClientConfig; - /** * Special implementation VMSFTPEntryParser with versioning turned on. * This parser removes all duplicates and only leaves the version with the highest @@ -43,7 +43,7 @@ import org.apache.commons.net.ftp.FTPClientConfig; *

    * * @version $Id: VMSVersioningFTPEntryParser.java 1747119 2016-06-07 02:22:24Z ggregory $ - * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions) + * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions) */ public class VMSVersioningFTPEntryParser extends VMSFTPEntryParser { diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/package-info.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/package-info.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/package-info.java index 7dc0ffd5..147da7ad 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/ftp/parser/package-info.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/package-info.java @@ -18,4 +18,4 @@ /** * FTP file listing parser classes */ -package org.apache.commons.net.ftp.parser; \ No newline at end of file +package aria.apache.commons.net.ftp.parser; \ No newline at end of file diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CRLFLineReader.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CRLFLineReader.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/CRLFLineReader.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CRLFLineReader.java index d124115a..593214d7 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CRLFLineReader.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CRLFLineReader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.BufferedReader; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamAdapter.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamAdapter.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamAdapter.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamAdapter.java index 81ca9a50..0f67dda9 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamAdapter.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamAdapter.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.util.EventListener; -import org.apache.commons.net.util.ListenerList; +import aria.apache.commons.net.util.ListenerList; /** * The CopyStreamAdapter will relay CopyStreamEvents to a list of listeners diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamEvent.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamEvent.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamEvent.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamEvent.java index cd45f083..f44d918e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamEvent.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.util.EventObject; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamException.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java index f4ad9faf..4314967c 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamException.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamListener.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java index da0da990..14670feb 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/CopyStreamListener.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.util.EventListener; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageReader.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageReader.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java index 9d703510..e554a359 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageReader.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.BufferedReader; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageWriter.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageWriter.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java index 2102dccf..637399bd 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/DotTerminatedMessageWriter.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.IOException; import java.io.Writer; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIInputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java index a65793e8..f8aeeded 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIInputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.IOException; import java.io.InputStream; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIOutputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java index 160fd17e..85e6112d 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/FromNetASCIIOutputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketInputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java index 87e27727..531e4029 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketInputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.FilterInputStream; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketOutputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java index 77e54755..3393ded7 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/SocketOutputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIInputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java index f51191e5..e7ee8bc5 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIInputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.FilterInputStream; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIOutputStream.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java index 08235538..d54a8758 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/ToNetASCIIOutputStream.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java index 8b8fa789..bdf74b76 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/Util.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.io; +package aria.apache.commons.net.io; import java.io.Closeable; import java.io.IOException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java similarity index 96% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/io/package-info.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java index 90fd4baa..06207d12 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/io/package-info.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java @@ -18,4 +18,4 @@ /** * Utility classes for IO support. */ -package org.apache.commons.net.io; \ No newline at end of file +package aria.apache.commons.net.io; \ No newline at end of file diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/Base64.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/Base64.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java index 93a7f206..a03150e0 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/Base64.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.io.UnsupportedEncodingException; import java.math.BigInteger; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/Charsets.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/Charsets.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java index c5968197..5001fcc0 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/Charsets.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.nio.charset.Charset; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/KeyManagerUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/KeyManagerUtils.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java index a90f1e59..012493b0 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/KeyManagerUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java @@ -16,8 +16,9 @@ * */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; +import aria.apache.commons.net.io.Util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -34,8 +35,6 @@ import java.util.Enumeration; import javax.net.ssl.KeyManager; import javax.net.ssl.X509ExtendedKeyManager; -import org.apache.commons.net.io.Util; - /** * General KeyManager utilities *

    diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/ListenerList.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/ListenerList.java similarity index 97% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/ListenerList.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/ListenerList.java index 72f81597..2ddfa637 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/ListenerList.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/ListenerList.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.io.Serializable; import java.util.EventListener; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLContextUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLContextUtils.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLContextUtils.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLContextUtils.java index 469a7037..ddec2139 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLContextUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLContextUtils.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.io.IOException; import java.security.GeneralSecurityException; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLSocketUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLSocketUtils.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLSocketUtils.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLSocketUtils.java index ff3f1b62..24f335ed 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SSLSocketUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SSLSocketUtils.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SubnetUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SubnetUtils.java similarity index 99% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/SubnetUtils.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SubnetUtils.java index 05a35fe6..9dd2e22e 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/SubnetUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/SubnetUtils.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/TrustManagerUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java similarity index 98% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/TrustManagerUtils.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java index 35894ced..63559d36 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/TrustManagerUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.net.util; +package aria.apache.commons.net.util; import java.security.GeneralSecurityException; import java.security.KeyStore; diff --git a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java similarity index 95% rename from AriaFtpPlug/src/main/java/org/apache/commons/net/util/package-info.java rename to AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java index 5515190e..7b95d75d 100644 --- a/AriaFtpPlug/src/main/java/org/apache/commons/net/util/package-info.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java @@ -18,4 +18,4 @@ /** * Utility classes */ -package org.apache.commons.net.util; \ No newline at end of file +package aria.apache.commons.net.util; \ No newline at end of file diff --git a/DEV_LOG.md b/DEV_LOG.md index b5895bbc..8abd2966 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -8,6 +8,7 @@ ... } ``` + - fix bug https://github.com/AriaLyy/Aria/issues/322 + v_3.5.1 - 优化`taskExists`方法 - 添加`post`参数请求支持 diff --git a/build.gradle b/build.gradle index cf51dcf8..2b43b342 100644 --- a/build.gradle +++ b/build.gradle @@ -39,8 +39,8 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.5.1' -// publishVersion = '1.0.3' //FTP插件 +// publishVersion = '3.5.1' + publishVersion = '1.0.4' //FTP插件 repoName='maven' desc = 'android 下载框架' website = 'https://github.com/AriaLyy/Aria' diff --git a/gradle.properties b/gradle.properties index 99bf62fd..36ed63a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Wed Dec 07 20:19:22 CST 2016 -org.gradle.daemon=true -org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 +#org.gradle.daemon=true +#org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 # gradle proxy https://chaosleong.github.io/2017/02/10/Configuring-Gradle-Proxy/ #systemProp.socksProxyHost=127.0.0.1 #systemProp.socksProxyPort=60777 From a625bd27a3b6f0ee99c587ae18a6e3130d754109 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Wed, 14 Nov 2018 19:32:28 +0800 Subject: [PATCH 26/28] =?UTF-8?q?fix=20bug=20https://github.com/AriaLyy/Ar?= =?UTF-8?q?ia/issues/319=20=E6=96=B0=E5=A2=9E201=20=E9=87=8D=E5=AE=9A?= =?UTF-8?q?=E5=90=91=E6=94=AF=E6=8C=81=20https://github.com/AriaLyy/Aria/i?= =?UTF-8?q?ssues/318=20=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8`useServerFileN?= =?UTF-8?q?ame(true)`=E4=B8=AD=E5=90=AB=E6=9C=89`"`=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=E5=90=8E=E7=BC=80=E5=90=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98=20=E4=BF=AE=E6=94=B9=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E7=BA=BF=E7=A8=8B=E7=9A=84=E4=BC=98=E5=85=88=E7=BA=A7?= =?UTF-8?q?=E4=B8=BA:=20Process.setThreadPriority(Process.THREAD=5FPRIORIT?= =?UTF-8?q?Y=5FBACKGROUND);?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Aria/build.gradle | 4 +- .../aria/core/common/AbsThreadTask.java | 3 ++ .../core/common/ftp/AbsFtpInfoThread.java | 12 +++--- .../core/common/ftp/AbsFtpThreadTask.java | 8 ++-- .../common/ftp/SSLSessionReuseFTPSClient.java | 4 +- .../download/downloader/ConnectionHelp.java | 2 +- .../download/downloader/FtpDirInfoThread.java | 2 +- .../downloader/FtpFileInfoThread.java | 2 +- .../download/downloader/FtpThreadTask.java | 4 +- .../downloader/HttpFileInfoThread.java | 8 +++- .../arialyy/aria/core/queue/AbsTaskQueue.java | 2 +- .../aria/core/scheduler/AbsSchedulers.java | 5 +-- .../core/scheduler/ISchedulerListener.java | 2 +- .../upload/uploader/FtpFileInfoThread.java | 2 +- .../core/upload/uploader/FtpThreadTask.java | 6 +-- .../com/arialyy/aria/util/CommonUtil.java | 41 ++++++++++--------- .../java/com/arialyy/aria/util/ErrorHelp.java | 8 +++- AriaAnnotations/build.gradle | 2 +- AriaCompiler/build.gradle | 2 +- AriaFtpPlug/build.gradle | 2 +- .../commons/net/util/TrustManagerUtils.java | 5 ++- DEV_LOG.md | 5 +++ .../simple/download/SingleTaskActivity.java | 11 ++--- build.gradle | 4 +- gradle.properties | 2 +- 25 files changed, 84 insertions(+), 64 deletions(-) diff --git a/Aria/build.gradle b/Aria/build.gradle index 7e21ecf5..247d08ee 100644 --- a/Aria/build.gradle +++ b/Aria/build.gradle @@ -26,8 +26,8 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile project(':AriaAnnotations') - compile 'com.arialyy.aria:aria-ftp-plug:1.0.3' + compile 'com.arialyy.aria:aria-ftp-plug:1.0.4' // compile project(':AriaFtpPlug') } -//apply from: 'bintray-release.gradle' +apply from: 'bintray-release.gradle' diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java index 906ece5d..0214c09d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java @@ -15,6 +15,7 @@ */ package com.arialyy.aria.core.common; +import android.os.Process; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.inf.AbsNormalEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -74,6 +75,7 @@ public abstract class AbsThreadTask 1) { - String newName = URLDecoder.decode(temp[1], "utf-8"); + String newName = URLDecoder.decode(temp[1], "utf-8").replaceAll("\"", ""); mEntity.setServerFileName(newName); renameFile(newName); break; @@ -191,11 +193,13 @@ class HttpFileInfoThread implements Runnable { } else if (code == HttpURLConnection.HTTP_MOVED_TEMP || code == HttpURLConnection.HTTP_MOVED_PERM || code == HttpURLConnection.HTTP_SEE_OTHER + || code == HttpURLConnection.HTTP_CREATED // 201 跳转 || code == 307) { handleUrlReTurn(conn, conn.getHeaderField("Location")); } else { failDownload(new AriaIOException(TAG, - String.format("任务下载失败,errorCode:%s, url: %s", code, mEntity.getUrl())), true); + String.format("任务下载失败,errorCode:%s, errorMsg: %s, url: %s", code, + conn.getResponseMessage(), mEntity.getUrl())), true); } if (end) { mTaskEntity.setChunked(isChunked); diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 27efbd20..3e1e6d85 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -76,7 +76,7 @@ abstract class AbsTaskQueue { /** * 任务失败 * - * @deprecated @see{{@link #onTaskFail(ITask, Exception)}} + * @deprecated {@link #onTaskFail(ITask, Exception)} */ @Deprecated void onTaskFail(TASK task); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java index efbceba2..406e101f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java @@ -15,6 +15,7 @@ */ package com.arialyy.aria.core.upload.uploader; +import aria.apache.commons.net.ftp.FTPFile; import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; @@ -25,7 +26,6 @@ import com.arialyy.aria.core.upload.UploadTaskEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.DbHelper; import java.util.ArrayList; -import org.apache.commons.net.ftp.FTPFile; /** * Created by Aria.Lao on 2017/9/26. diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index 4ba730a8..bc9b3c42 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -15,6 +15,9 @@ */ package com.arialyy.aria.core.upload.uploader; +import aria.apache.commons.net.ftp.FTPClient; +import aria.apache.commons.net.ftp.FTPReply; +import aria.apache.commons.net.ftp.OnFtpInputStreamListener; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; @@ -27,9 +30,6 @@ import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.BufferedRandomAccessFile; import java.io.IOException; import java.io.UnsupportedEncodingException; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPReply; -import org.apache.commons.net.ftp.OnFtpInputStreamListener; /** * Created by Aria.Lao on 2017/7/28. diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java index c35f8c0a..cdebd34a 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java @@ -54,14 +54,17 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.math.BigDecimal; import java.math.BigInteger; +import java.net.URLEncoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -352,25 +355,25 @@ public class CommonUtil { public static String convertUrl(String url) { Uri uri = Uri.parse(url); url = uri.toString(); - //if (hasDoubleCharacter(url)) { - // //预先处理空格,URLEncoder只会把空格转换为+ - // url = url.replaceAll(" ", "%20"); - // //匹配双字节字符(包括汉字在内) - // String regex = Regular.REG_DOUBLE_CHAR_AND_SPACE; - // Pattern p = Pattern.compile(regex); - // Matcher m = p.matcher(url); - // Set strs = new HashSet<>(); - // while (m.find()) { - // strs.add(m.group()); - // } - // try { - // for (String str : strs) { - // url = url.replaceAll(str, URLEncoder.encode(str, "UTF-8")); - // } - // } catch (UnsupportedEncodingException e) { - // e.printStackTrace(); - // } - //} + if (hasDoubleCharacter(url)) { + //预先处理空格,URLEncoder只会把空格转换为+ + url = url.replaceAll(" ", "%20"); + //匹配双字节字符(包括汉字在内) + String regex = Regular.REG_DOUBLE_CHAR_AND_SPACE; + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(url); + Set strs = new HashSet<>(); + while (m.find()) { + strs.add(m.group()); + } + try { + for (String str : strs) { + url = url.replaceAll(str, URLEncoder.encode(str, "UTF-8")); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } return url; } diff --git a/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java b/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java index d870f342..5f96c59c 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/util/ErrorHelp.java @@ -47,7 +47,7 @@ public class ErrorHelp { */ private static String getLogPath() { String path = String.format("%slog/AriaCrash_%s.log", CommonUtil.getAppPath(AriaManager.APP), - getData("yyyy-MM-dd_HH:mm:ss")); + getData("yyyy-MM-dd_HH_mm_ss")); File log = new File(path); if (!log.getParentFile().exists()) { @@ -76,7 +76,11 @@ public class ErrorHelp { stringBuffer.append("\n\n"); PrintWriter writer = null; try { - writer = new PrintWriter(new FileWriter(getLogPath(), true)); + File file = new File(getLogPath()); + if(!file.exists()){ + CommonUtil.createFile(file.getPath()); + } + writer = new PrintWriter(new FileWriter(file.getPath(), true)); writer.append(stringBuffer); writer.flush(); } catch (Exception e) { diff --git a/AriaAnnotations/build.gradle b/AriaAnnotations/build.gradle index 0b581ad5..a9f2139b 100644 --- a/AriaAnnotations/build.gradle +++ b/AriaAnnotations/build.gradle @@ -11,4 +11,4 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -//apply from: 'bintray-release.gradle' \ No newline at end of file +apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaCompiler/build.gradle b/AriaCompiler/build.gradle index 38de01a1..a76e8659 100644 --- a/AriaCompiler/build.gradle +++ b/AriaCompiler/build.gradle @@ -14,4 +14,4 @@ dependencies { compile project(':AriaAnnotations') } -//apply from: 'bintray-release.gradle' \ No newline at end of file +apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaFtpPlug/build.gradle b/AriaFtpPlug/build.gradle index a9f2139b..0b581ad5 100644 --- a/AriaFtpPlug/build.gradle +++ b/AriaFtpPlug/build.gradle @@ -11,4 +11,4 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -apply from: 'bintray-release.gradle' \ No newline at end of file +//apply from: 'bintray-release.gradle' \ No newline at end of file diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java index 63559d36..a609f284 100644 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java +++ b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java @@ -19,9 +19,12 @@ package aria.apache.commons.net.util; import java.security.GeneralSecurityException; import java.security.KeyStore; +import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; +import javax.net.ssl.KeyManager; +import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; @@ -92,7 +95,7 @@ public final class TrustManagerUtils { * Return the default TrustManager provided by the JVM. *

    * This should be the same as the default used by - * {@link javax.net.ssl.SSLContext#init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], * java.security.SecureRandom) + * {@link javax.net.ssl.SSLContext#init(KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)} * SSLContext#init(KeyManager[], TrustManager[], SecureRandom)} * when the TrustManager parameter is set to {@code null} * diff --git a/DEV_LOG.md b/DEV_LOG.md index 8abd2966..3357ff74 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -9,6 +9,11 @@ } ``` - fix bug https://github.com/AriaLyy/Aria/issues/322 + - 新增201 重定向支持 https://github.com/AriaLyy/Aria/issues/318 + - 修复使用`useServerFileName(true)`中含有`"`导致的文件后缀名错误问题 + - 优化logcat日志提示 + - 修改下载线程的优先级为`Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);` + - fix bug https://github.com/AriaLyy/Aria/issues/319 + v_3.5.1 - 优化`taskExists`方法 - 添加`post`参数请求支持 diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index dafd159b..8a4c583a 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -50,7 +50,8 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apks"; + //"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apks"; + //"http://120.55.95.61:8811/ghcg/zg/武义总规纲要成果.zip"; //"https://yizi-kejian.oss-cn-beijing.aliyuncs.com/qimeng/package1/qmtable11.zip"; //"http://rs.0.gaoshouyou.com/d/04/1e/400423a7551e1f3f0eb1812afa1f9b44.apk"; //"http://58.210.9.131/tpk/sipgt//TDLYZTGH.tpk"; //chunked 下载 @@ -60,6 +61,7 @@ public class SingleTaskActivity extends BaseActivity { //"http://apk500.bce.baidu-mgame.com/game/67000/67734/20170622040827_oem_5502845.apk?r=1"; //"https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //"http://9.9.9.59:5000/download/CentOS-7-x86_64-Minimal-1804.iso"; + "http://120.55.95.61:8811/ghcg/zg/武义总规纲要成果.zip"; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; @Bind(R.id.cancel) Button mCancel; @@ -249,7 +251,7 @@ public class SingleTaskActivity extends BaseActivity { private void startD() { //Aria.get(this).setLogLevel(ALog.LOG_CLOSE); //Aria.download(this).load("aaaa.apk"); - String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg10.apk"; + String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg11.apk"; //File file = new File(path); //if (file.exists()){ // file.delete(); @@ -261,9 +263,8 @@ public class SingleTaskActivity extends BaseActivity { //.addHeader("Accept-Encoding", "gzip, deflate") //.addHeader("DNT", "1") //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") - //.useServerFileName(true) - //.setRequestMode(RequestEnum.GET) - .setFilePath(path, false) + .useServerFileName(true) + .setFilePath(path, true) //.asPost().setParam("key", "value") //.setExtendField("{\n" // + "\"id\":\"你的样子\"\n< > " diff --git a/build.gradle b/build.gradle index 2b43b342..4aa10ef6 100644 --- a/build.gradle +++ b/build.gradle @@ -39,8 +39,8 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' -// publishVersion = '3.5.1' - publishVersion = '1.0.4' //FTP插件 + publishVersion = '3.5.2_dev' +// publishVersion = '1.0.4' //FTP插件 repoName='maven' desc = 'android 下载框架' website = 'https://github.com/AriaLyy/Aria' diff --git a/gradle.properties b/gradle.properties index 36ed63a9..2a4e2533 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ #org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 # gradle proxy https://chaosleong.github.io/2017/02/10/Configuring-Gradle-Proxy/ #systemProp.socksProxyHost=127.0.0.1 -#systemProp.socksProxyPort=60777 +#systemProp.socksProxyPort=1080 #systemprop.socksProxyVersion=5 \ No newline at end of file From 5c15ba41dc0fb27847fa66f74bbf3785f3e3dfa0 Mon Sep 17 00:00:00 2001 From: Bitter <534429149@qq.com> Date: Tue, 20 Nov 2018 16:58:27 +0800 Subject: [PATCH 27/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A8=A1=E7=B3=8A?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=B8=8B=E8=BD=BD=E4=BB=BB=E5=8A=A1=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/arialyy/aria/orm/DbEntity.java | 13 ++++++++++++ .../com/arialyy/aria/orm/DelegateFind.java | 20 +++++++++++++++++++ .../com/arialyy/aria/orm/DelegateWrapper.java | 7 +++++++ 3 files changed, 40 insertions(+) diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DbEntity.java b/Aria/src/main/java/com/arialyy/aria/orm/DbEntity.java index f6856acc..15b71db8 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DbEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DbEntity.java @@ -102,6 +102,19 @@ public abstract class DbEntity { return util.findData(clazz, expression); } + /** + * 模糊查询一组数据 + * + * DownloadEntity.findDatas(DownloadEntity.class, "downloadUrl like http://"); + * + * + * @return 没有数据返回null + */ + public static List findDataByFuzzy(Class clazz, String conditions) { + DelegateWrapper util = DelegateWrapper.getInstance(); + return util.findDataByFuzzy(clazz, conditions); + } + /** * 查询一行数据 * diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java b/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java index e292a67f..2eb8fff0 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DelegateFind.java @@ -355,6 +355,26 @@ class DelegateFind extends AbsDelegate { return data; } + /** + * 模糊查寻数据 + */ + List findDataByFuzzy(SQLiteDatabase db, Class clazz, String conditions) { + db = checkDb(db); + if(TextUtils.isEmpty(conditions)){ + throw new IllegalArgumentException("sql语句表达式不能为null或\"\""); + } + if(!conditions.toUpperCase().contains("LIKE")){ + throw new IllegalArgumentException("sql语句表达式未包含LIEK"); + } + String sql = + "SELECT rowid, * FROM " + CommonUtil.getClassName(clazz) + " WHERE "+conditions; + print(FIND_DATA, sql); + Cursor cursor = db.rawQuery(sql, null); + List data = cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null; + closeCursor(cursor); + close(db); + return data; + } /** * 查找表的所有数据 */ diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java b/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java index e87c5b9d..faa8fc25 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DelegateWrapper.java @@ -118,6 +118,13 @@ public class DelegateWrapper { return mDManager.getDelegate(DelegateFind.class).findData(mDb, clazz, expression); } + /** + * 模糊查寻数据 + */ + List findDataByFuzzy(Class clazz, String conditions) { + return mDManager.getDelegate(DelegateFind.class).findDataByFuzzy(mDb, clazz, conditions); + } + /** * 通过rowId判断数据是否存在 */ From 428edeacd791299dbc7dd1cd27ac9bd36ab2f4e0 Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Tue, 20 Nov 2018 20:18:08 +0800 Subject: [PATCH 28/28] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E5=B0=8F=E4=BA=8E0=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E5=9B=9E=E8=B0=83=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/common/AbsFileer.java | 2 +- .../aria/core/common/BaseListener.java | 1 + .../download/downloader/ConnectionHelp.java | 13 +++++++ .../downloader/HttpFileInfoThread.java | 34 +++++++++++++++---- .../downloader/SimpleDownloadUtil.java | 2 ++ .../arialyy/aria/core/inf/AbsTaskEntity.java | 14 ++++++++ .../simple/download/SingleTaskActivity.java | 19 ++++++----- 7 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index f6b6b3b7..33f8cf56 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -205,7 +205,7 @@ public abstract class AbsFileer 0) { + conn.setRequestProperty("Cookie", + TextUtils.join(";", store.getCookies())); + } + } + return conn; } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java index 049937aa..3cd5e123 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java @@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.downloader; import android.os.Process; import android.text.TextUtils; +import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; @@ -34,10 +35,15 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.HttpCookie; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Set; @@ -136,7 +142,7 @@ class HttpFileInfoThread implements Runnable { if (!TextUtils.isEmpty(str) && str.equals("chunked")) { isChunked = true; } - //Map> headers = conn.getHeaderFields(); + Map> headers = conn.getHeaderFields(); String disposition = conn.getHeaderField("Content-Disposition"); if (mTaskEntity.isUseServerFileName() && !TextUtils.isEmpty(disposition)) { mEntity.setDisposition(CommonUtil.encryptBASE64(disposition)); @@ -155,10 +161,24 @@ class HttpFileInfoThread implements Runnable { } } } + CookieManager msCookieManager = new CookieManager(); + List cookiesHeader = headers.get("Set-Cookie"); + + if (cookiesHeader != null) { + for (String cookie : cookiesHeader) { + msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); + } + mTaskEntity.setCookieManager(msCookieManager); + } mTaskEntity.setCode(code); if (code == HttpURLConnection.HTTP_PARTIAL) { if (!checkLen(len) && !isChunked) { + if (len < 0) { + failDownload( + new AriaIOException(TAG, String.format("任务下载失败,文件长度小于0, url: %s", mEntity.getUrl())), + false); + } return; } mEntity.setFileSize(len); @@ -181,6 +201,12 @@ class HttpFileInfoThread implements Runnable { handleUrlReTurn(conn, CommonUtil.getWindowReplaceUrl(sb.toString())); return; } else if (!checkLen(len) && !isChunked) { + if (len < 0) { + failDownload( + new AriaIOException(TAG, String.format("任务下载失败,文件长度小于0, url: %s", mEntity.getUrl())), + false); + } + ALog.d(TAG, "len < 0"); return; } mEntity.setFileSize(len); @@ -270,12 +296,6 @@ class HttpFileInfoThread implements Runnable { if (len != mEntity.getFileSize()) { mTaskEntity.setNewTask(true); } - if (len < 0) { - failDownload( - new AriaIOException(TAG, String.format("任务下载失败,文件长度小于0, url: %s", mEntity.getUrl())), - true); - return false; - } return true; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java index 9c6c0304..5015b211 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java @@ -127,6 +127,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable { @Override public void onFail(String url, BaseException e, boolean needRetry) { failDownload(e, needRetry); + mDownloader.closeTimer(); } }); case AbsTaskEntity.D_HTTP: @@ -137,6 +138,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable { @Override public void onFail(String url, BaseException e, boolean needRetry) { failDownload(e, needRetry); + mDownloader.closeTimer(); } }); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java index 3e7331aa..74616c0a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java @@ -19,8 +19,12 @@ import com.arialyy.aria.core.FtpUrlEntity; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.orm.annotation.Ignore; +import java.net.CookieManager; +import java.net.HttpCookie; import java.net.Proxy; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -55,6 +59,8 @@ public abstract class AbsTaskEntity extends DbEntity { */ public static final int U_FTP = 0xA2; + @Ignore private CookieManager cookieManager; + /** * 账号和密码 */ @@ -134,6 +140,14 @@ public abstract class AbsTaskEntity extends DbEntity { public abstract ENTITY getEntity(); + public CookieManager getCookieManager() { + return cookieManager; + } + + public void setCookieManager(CookieManager cookieManager) { + this.cookieManager = cookieManager; + } + /** * 获取任务下载状态 * diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 8a4c583a..deb06a53 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -61,7 +61,7 @@ public class SingleTaskActivity extends BaseActivity { //"http://apk500.bce.baidu-mgame.com/game/67000/67734/20170622040827_oem_5502845.apk?r=1"; //"https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //"http://9.9.9.59:5000/download/CentOS-7-x86_64-Minimal-1804.iso"; - "http://120.55.95.61:8811/ghcg/zg/武义总规纲要成果.zip"; + "https://firmwareapi.azurewebsites.net/firmware-overview?name=A19_Filament_W_IMG0038_00102411-encrypted.ota"; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; @Bind(R.id.cancel) Button mCancel; @@ -178,10 +178,11 @@ public class SingleTaskActivity extends BaseActivity { } } - @Download.onTaskFail void taskFail(DownloadTask task) { + @Download.onTaskFail void taskFail(DownloadTask task, Exception e) { if (task.getKey().equals(DOWNLOAD_URL)) { Toast.makeText(SingleTaskActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); setBtState(true); + //ALog.d(TAG, ALog.getExceptionString(e)); } } @@ -196,11 +197,11 @@ public class SingleTaskActivity extends BaseActivity { L.d(TAG, "path ==> " + task.getDownloadEntity().getDownloadPath()); L.d(TAG, "md5Code ==> " + CommonUtil.getFileMD5(new File(task.getDownloadPath()))); L.d(TAG, "data ==> " + Aria.download(this).getDownloadEntity(DOWNLOAD_URL)); - //Intent install = new Intent(Intent.ACTION_VIEW); - //install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - //File apkFile = new File(task.getDownloadPath()); - //install.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); - //startActivity(install); + Intent install = new Intent(Intent.ACTION_VIEW); + install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + File apkFile = new File(task.getDownloadPath()); + install.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); + startActivity(install); } } @@ -251,7 +252,7 @@ public class SingleTaskActivity extends BaseActivity { private void startD() { //Aria.get(this).setLogLevel(ALog.LOG_CLOSE); //Aria.download(this).load("aaaa.apk"); - String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg11.apk"; + String path = Environment.getExternalStorageDirectory().getPath() + "/ggsg11.ota"; //File file = new File(path); //if (file.exists()){ // file.delete(); @@ -260,7 +261,7 @@ public class SingleTaskActivity extends BaseActivity { Aria.download(SingleTaskActivity.this) .load(DOWNLOAD_URL) //.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8") - //.addHeader("Accept-Encoding", "gzip, deflate") + .addHeader("Accept-Encoding", "gzip, deflate") //.addHeader("DNT", "1") //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") .useServerFileName(true)