修复任务记录删除失败的问题

优化网络连接状态获取的逻辑
修复配置文件的某些配置失效的问题
新增m3u8切片状态注解`@M3U8.onPeerStart`,`@M3U8.onPeerComplete`,`@M3U8.onPeerFail`
新增动态指定m3u8协议视频的下载功能(边下边播)
This commit is contained in:
laoyuyu
2019-07-05 21:20:38 +08:00
parent 060b1f138e
commit b0818537f2
133 changed files with 2492 additions and 1199 deletions

View File

@@ -17,6 +17,7 @@ package com.arialyy.compiler;
import com.arialyy.annotations.Download;
import com.arialyy.annotations.DownloadGroup;
import com.arialyy.annotations.TaskEnum;
import com.arialyy.annotations.Upload;
import java.lang.annotation.Annotation;
import java.util.Collections;
@@ -41,20 +42,12 @@ import javax.lang.model.util.Elements;
*/
class ParamObtainUtil {
private Map<String, ProxyClassParam> mMethodParams = new HashMap<>();
private Map<String, Set<String>> mListenerClass = new HashMap<>();
private Elements mElementUtil;
ParamObtainUtil(Elements elements) {
mElementUtil = elements;
}
/**
* 获取需要创建的代理类参数
*/
Map<String, Set<String>> getListenerClass() {
return mListenerClass;
}
/**
* 获取搜索到的代理方法参数
*/
@@ -75,13 +68,17 @@ class ParamObtainUtil {
PackageElement packageElement = mElementUtil.getPackageOf(classElement);
String methodName = method.getSimpleName().toString();
String className = method.getEnclosingElement().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<VariableElement>) method.getParameters();
checkMethod(taskEnum, method, annotationClazz, methodInfo.params);
if (taskEnum == TaskEnum.M3U8_PEER) {
checkM3U8PeerMethod(method, methodInfo.params);
} else {
checkTaskMethod(taskEnum, method, annotationClazz, methodInfo.params);
}
if (proxyEntity == null) {
proxyEntity = new ProxyClassParam();
@@ -91,7 +88,7 @@ class ParamObtainUtil {
proxyEntity.proxyClassName = proxyEntity.className + taskEnum.proxySuffix;
proxyEntity.mainTaskEnum = taskEnum;
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB || taskEnum == TaskEnum.DOWNLOAD_GROUP) {
proxyEntity.subTaskEnum = TaskEnum.DOWNLOAD_ENTITY;
proxyEntity.subTaskEnum = EntityInfo.DOWNLOAD;
}
mMethodParams.put(key, proxyEntity);
}
@@ -110,49 +107,52 @@ class ParamObtainUtil {
* 获取注解的内容
*/
private Set<String> getValues(TaskEnum taskEnum, ExecutableElement method, int annotationType) {
String clsName = method.getEnclosingElement().toString();
String[] keys = null;
switch (taskEnum) {
case DOWNLOAD:
keys = ValuesUtil.getDownloadValues(method, annotationType);
addListenerMapping(clsName, ProxyConstance.COUNT_DOWNLOAD);
break;
case UPLOAD:
keys = ValuesUtil.getUploadValues(method, annotationType);
addListenerMapping(clsName, ProxyConstance.COUNT_UPLOAD);
break;
case DOWNLOAD_GROUP:
keys = ValuesUtil.getDownloadGroupValues(method, annotationType);
addListenerMapping(clsName, ProxyConstance.COUNT_DOWNLOAD_GROUP);
break;
case DOWNLOAD_GROUP_SUB:
keys = ValuesUtil.getDownloadGroupSubValues(method, annotationType);
addListenerMapping(clsName, ProxyConstance.COUNT_DOWNLOAD_GROUP_SUB);
break;
case M3U8_PEER:
keys = ValuesUtil.getM3U8PeerValues(method, annotationType);
break;
}
return keys == null ? null : convertSet(keys);
}
/**
* 添加方法映射
*
* @param clsName 注解事件的类
* @param key {@link ProxyConstance#COUNT_DOWNLOAD}、{@link ProxyConstance#COUNT_UPLOAD}、{@link
* ProxyConstance#COUNT_DOWNLOAD_GROUP}、{@link ProxyConstance#COUNT_DOWNLOAD_GROUP_SUB}
* 检查m3u8注解方法参数
*/
void addListenerMapping(String clsName, String key) {
Set<String> cls = mListenerClass.get(key);
if (cls == null) {
cls = new HashSet<>();
mListenerClass.put(key, cls);
private void checkM3U8PeerMethod(ExecutableElement method, List<VariableElement> params) {
String methodName = method.getSimpleName().toString();
String className = method.getEnclosingElement().toString();
Set<Modifier> modifiers = method.getModifiers();
if (modifiers.contains(Modifier.PRIVATE)) {
throw new IllegalAccessError(String.format("%s.%s, 不能为private方法", className, methodName));
}
if (params.size() != 3
|| !params.get(0).asType().toString().equals(String.class.getName())
|| !params.get(1).asType().toString().equals(String.class.getName())
|| !params.get(2).asType().toString().equals("int")) {
throw new IllegalArgumentException(
String.format("%s.%s 的参数错误该方法需要的参数为String, String, int", className,
methodName));
}
cls.add(clsName);
}
/**
* 检查和下载相关的方法如果被注解的方法为private或参数不合法,则抛异常
* 检查任务注解的相关参数如果被注解的方法为private或参数不合法或参数错误,停止任务
*/
private void checkMethod(TaskEnum taskEnum, ExecutableElement method,
private void checkTaskMethod(TaskEnum taskEnum, ExecutableElement method,
Class<? extends Annotation> annotationClazz, List<VariableElement> params) {
String methodName = method.getSimpleName().toString();
String className = method.getEnclosingElement().toString();
@@ -162,7 +162,28 @@ class ParamObtainUtil {
}
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) {
if (isFailAnnotation(annotationClazz)) {
if (params.size() != 3 && params.size() != 2) {
if (params.size() < 2 || params.size() > 3) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能是两个或三个,第一个参数是:%s第二个参数是%s第三个参数可选%s", className,
methodName,
getCheckParams(taskEnum), getCheckSubParams(taskEnum),
Exception.class.getSimpleName()));
}
if (params.size() == 2
&& (!params.get(0).asType().toString().equals(getCheckParams(taskEnum))
|| !params.get(1).asType().toString().equals(getCheckSubParams(taskEnum)))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能是两个或三个,第一个参数是:%s第二个参数是%s第三个参数可选%s", className,
methodName,
getCheckParams(taskEnum), getCheckSubParams(taskEnum),
Exception.class.getSimpleName()));
}
if (params.size() == 3
&& (!params.get(0).asType().toString().equals(getCheckParams(taskEnum))
|| !params.get(1).asType().toString().equals(getCheckSubParams(taskEnum))
|| !params.get(2).asType().toString().equals(Exception.class.getName()))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能是两个或三个,第一个参数是:%s第二个参数是%s第三个参数可选%s", className,
methodName,
@@ -170,39 +191,46 @@ class ParamObtainUtil {
Exception.class.getSimpleName()));
}
} else {
if (params.size() != 2) {
if (params.size() == 2
&& (!params.get(0).asType().toString().equals(getCheckParams(taskEnum))
|| !params.get(1).asType().toString().equals(getCheckSubParams(taskEnum)))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能是两个,第一个参数是:%s第二个参数是%s", className, methodName,
String.format("%s.%s参数错误, 参数只能是两个或三个,第一个参数是:%s第二个参数是%s", className,
methodName,
getCheckParams(taskEnum), getCheckSubParams(taskEnum)));
}
}
} else {
if (isFailAnnotation(annotationClazz)) {
if (params.size() != 1 && params.size() != 2) {
if (params.size() < 1 || params.size() > 2) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能有一个或两个,第一个参数是:%s第二个参可选是:%s", className, methodName,
String.format("%s.%s参数错误, 参数只能有一个或两个,第一个参数是:%s第二个参(可选)是:%s", className, methodName,
getCheckParams(taskEnum), Exception.class.getSimpleName()));
}
if (params.size() == 1
&& (!params.get(0).asType().toString().equals(getCheckParams(taskEnum)))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能有一个或两个,第一个参数是:%s第二个参数可选%s", className, methodName,
getCheckParams(taskEnum), Exception.class.getSimpleName()));
}
if (params.size() == 2
&& (!params.get(0).asType().toString().equals(getCheckParams(taskEnum))
|| !params.get(1).asType().toString().equals(Exception.class.getName()))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能有一个或两个,第一个参数是:%s第二个参数可选%s", className, methodName,
getCheckParams(taskEnum), Exception.class.getSimpleName()));
}
} else {
if (params.size() != 1) {
if (params.size() != 1
&& !params.get(0).asType().toString().equals(getCheckParams(taskEnum))) {
throw new IllegalArgumentException(
String.format("%s.%s参数错误, 参数只能有一个,且参数必须是:%s", className, methodName,
getCheckParams(taskEnum)));
}
}
}
if (!params.get(0).asType().toString().equals(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(
String.format("%s.%s参数【%s】类型错误参数必须是%s", className, methodName,
params.get(0).getSimpleName(), getCheckSubParams(taskEnum)));
}
}
}
/**
@@ -241,7 +269,7 @@ class ParamObtainUtil {
*/
private String getCheckSubParams(TaskEnum taskEnum) {
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) {
return TaskEnum.DOWNLOAD_ENTITY.pkg + "." + TaskEnum.DOWNLOAD_ENTITY.className;
return EntityInfo.DOWNLOAD.pkg + "." + EntityInfo.DOWNLOAD.className;
}
return "";
}