diff --git a/AriaAnnotations/src/main/java/com/arialyy/annotations/Test.java b/AriaAnnotations/src/main/java/com/arialyy/annotations/Test.java deleted file mode 100644 index 7b79963e..00000000 --- a/AriaAnnotations/src/main/java/com/arialyy/annotations/Test.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.arialyy.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by Aria.Lao on 2017/6/6. - */ -@Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface Test { -} diff --git a/AriaAnnotations/src/main/java/com/arialyy/annotations/Upload.java b/AriaAnnotations/src/main/java/com/arialyy/annotations/Upload.java new file mode 100644 index 00000000..fe136bb7 --- /dev/null +++ b/AriaAnnotations/src/main/java/com/arialyy/annotations/Upload.java @@ -0,0 +1,42 @@ +package com.arialyy.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Aria.Lao on 2017/6/6. + */ +@Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface Upload { + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onPre { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskPre { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskResume { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskStart { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskStop { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskCancel { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskFail { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskComplete { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface onTaskRunning { + } + + @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) + public @interface onNoSupportBreakPoint { + } +} diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/AriaProcessor.java b/AriaCompiler/src/main/java/com/arialyy/compiler/AriaProcessor.java index aedb6a51..9bcb0bec 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/AriaProcessor.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/AriaProcessor.java @@ -1,7 +1,7 @@ package com.arialyy.compiler; import com.arialyy.annotations.Download; -import com.arialyy.annotations.Test; +import com.arialyy.annotations.Upload; import com.google.auto.service.AutoService; import java.util.LinkedHashSet; import java.util.Set; @@ -37,7 +37,16 @@ import javax.lang.model.element.TypeElement; annotataions.add(Download.onTaskRunning.class.getCanonicalName()); annotataions.add(Download.onTaskStart.class.getCanonicalName()); annotataions.add(Download.onTaskStop.class.getCanonicalName()); - annotataions.add(Test.class.getCanonicalName()); + annotataions.add(Upload.onPre.class.getCanonicalName()); + annotataions.add(Upload.onNoSupportBreakPoint.class.getCanonicalName()); + annotataions.add(Upload.onTaskCancel.class.getCanonicalName()); + annotataions.add(Upload.onTaskComplete.class.getCanonicalName()); + annotataions.add(Upload.onTaskFail.class.getCanonicalName()); + annotataions.add(Upload.onTaskPre.class.getCanonicalName()); + annotataions.add(Upload.onTaskResume.class.getCanonicalName()); + annotataions.add(Upload.onTaskRunning.class.getCanonicalName()); + annotataions.add(Upload.onTaskStart.class.getCanonicalName()); + annotataions.add(Upload.onTaskStop.class.getCanonicalName()); return annotataions; } @@ -48,7 +57,9 @@ import javax.lang.model.element.TypeElement; @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { PrintLog.getInstance().info("开始扫描"); - mHandler.handle(roundEnv); + mHandler.clean(); + mHandler.handleDownload(roundEnv); + mHandler.handleUpload(roundEnv); return true; } } diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandle.java b/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandle.java index f332e057..4d662c48 100644 --- a/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandle.java +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandle.java @@ -1,6 +1,12 @@ package com.arialyy.compiler; import com.arialyy.annotations.Download; +import com.arialyy.annotations.Upload; +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import javax.annotation.processing.Filer; import javax.annotation.processing.RoundEnvironment; @@ -8,10 +14,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.TypeParameterElement; import javax.lang.model.element.VariableElement; -import javax.lang.model.type.TypeMirror; /** * Created by lyy on 2017/6/6. @@ -20,6 +23,7 @@ import javax.lang.model.type.TypeMirror; class ElementHandle { private Filer mFiler; + private Map> mMethods = new HashMap<>(); ElementHandle(Filer filer) { mFiler = filer; @@ -31,40 +35,86 @@ class ElementHandle { * TypeElement 一般代表代表类 * PackageElement 一般代表Package */ - void handle(RoundEnvironment roundEnv) { - handlePre(roundEnv); + void handleDownload(RoundEnvironment roundEnv) { + saveMethod(true, roundEnv, Download.onNoSupportBreakPoint.class); + saveMethod(true, roundEnv, Download.onPre.class); + saveMethod(true, roundEnv, Download.onTaskCancel.class); + saveMethod(true, roundEnv, Download.onTaskComplete.class); + saveMethod(true, roundEnv, Download.onTaskFail.class); + saveMethod(true, roundEnv, Download.onTaskPre.class); + saveMethod(true, roundEnv, Download.onTaskResume.class); + saveMethod(true, roundEnv, Download.onTaskRunning.class); + saveMethod(true, roundEnv, Download.onTaskStart.class); + saveMethod(true, roundEnv, Download.onTaskStop.class); + } + + void handleUpload(RoundEnvironment roundEnv) { + saveMethod(false, roundEnv, Upload.onNoSupportBreakPoint.class); + saveMethod(false, roundEnv, Upload.onPre.class); + saveMethod(false, roundEnv, Upload.onTaskCancel.class); + saveMethod(false, roundEnv, Upload.onTaskComplete.class); + saveMethod(false, roundEnv, Upload.onTaskFail.class); + saveMethod(false, roundEnv, Upload.onTaskPre.class); + saveMethod(false, roundEnv, Upload.onTaskResume.class); + saveMethod(false, roundEnv, Upload.onTaskRunning.class); + saveMethod(false, roundEnv, Upload.onTaskStart.class); + saveMethod(false, roundEnv, Upload.onTaskStop.class); + } + + void clean() { + mMethods.clear(); } /** - * 处理{@link Download.onTaskPre}注解 + * 查找并保存扫描到的方法 */ - private void handlePre(RoundEnvironment roundEnv) { - for (Element element : roundEnv.getElementsAnnotatedWith(Download.onPre.class)) { + private void saveMethod(boolean isDownload, RoundEnvironment roundEnv, + Class annotationClazz) { + for (Element element : roundEnv.getElementsAnnotatedWith(annotationClazz)) { ElementKind kind = element.getKind(); if (kind == ElementKind.METHOD) { ExecutableElement method = (ExecutableElement) element; + checkDownloadMethod(isDownload, method); String methodName = method.getSimpleName().toString(); String className = method.getEnclosingElement().toString(); - Set modifiers = method.getModifiers(); - if (modifiers.contains(Modifier.PRIVATE)){ - PrintLog.getInstance().info("私有方法"); - } - PrintLog.getInstance().info("注解的方法:" + methodName); - PrintLog.getInstance().info("所在类:" + className); - for (VariableElement te : method.getParameters()) { - TypeMirror paramType = te.asType(); - PrintLog.getInstance() - .info("参数名:" + te.getSimpleName().toString() + ",参数类型:" + paramType.toString()); + Set methods = mMethods.get(className); + if (methods == null) { + methods = new HashSet<>(); + mMethods.put(className, methods); } + methods.add(methodName); } } } - private void handleNoSupportBreakPoint(RoundEnvironment roundEnv) { - + /** + * 检查和下载相关的方法,如果被注解的方法为private或参数不合法,则抛异常 + */ + private void checkDownloadMethod(boolean isDownload, ExecutableElement method) { + 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方法"); + } + List params = (List) method.getParameters(); + if (params.size() > 1) { + throw new IllegalArgumentException( + className + "." + methodName + "参数错误, 参数只有一个,且参数必须是" + getCheckParams(isDownload)); + } + if (!params.get(0).asType().toString().equals(getCheckParams(isDownload))) { + throw new IllegalArgumentException(className + + "." + + methodName + + "参数【" + + params.get(0).getSimpleName() + + "】类型错误,参数必须是" + + getCheckParams(isDownload)); + } } - private void handleTaskCancel(RoundEnvironment roundEnv) { - + private String getCheckParams(boolean isDownload) { + return isDownload ? "com.arialyy.aria.core.download.DownloadTask" + : "com.arialyy.aria.core.upload.UploadTask"; } } diff --git a/AriaCompiler/src/main/java/com/arialyy/compiler/test.java b/AriaCompiler/src/main/java/com/arialyy/compiler/test.java new file mode 100644 index 00000000..05722241 --- /dev/null +++ b/AriaCompiler/src/main/java/com/arialyy/compiler/test.java @@ -0,0 +1,20 @@ +//package com.arialyy.compiler; +// +///** +// * Created by AriaL on 2017/6/6. +// */ +// +//public class test { +// Object obj; +// +// public void setObj(Object obj){ +// this.obj = obj; +// } +// +// public void onPre(DownloadTask task){ +// obj.method(task); +// } +// +// +// +//}