diff --git a/README.md b/README.md index 9981931..8110511 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,6 @@ ~~~ -jackson版本:2.13.3 - -asm版本:5.2 - ### 串行化 通过本项目进行串行化的任务执行有两种方式: diff --git a/pom.xml b/pom.xml index 83bb1c2..91ac293 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.github.pizihao crow - 0.0.9.3 + 2.0.0 crow A black crow https://github.com/pizihao/crow @@ -12,22 +12,6 @@ 1.8 - - com.fasterxml.jackson.core - jackson-databind - 2.13.3 - provided - - - com.esotericsoftware - reflectasm - 1.11.9 - - - org.ow2.asm - asm-all - 5.2 - junit junit @@ -71,17 +55,26 @@ - org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + maven-compiler-plugin 3.8.1 1.8 1.8 + + + com.google.auto.service + auto-service + 1.0-rc7 + + - org.apache.maven.plugins maven-javadoc-plugin @@ -106,28 +99,15 @@ -Xmx1024m - - com.diffplug.spotless - spotless-maven-plugin - 1.20.0 - - - - src/**/java/**/*.java - - - 1.7 - - - - - - + + UTF-8 + + release @@ -185,11 +165,11 @@ oss https://s01.oss.sonatype.org/service/local/staging/deploy/maven2 + false - - UTF-8 - + + diff --git a/src/main/java/com/deep/crow/completable/Cof.java b/src/main/java/com/deep/crow/completable/Cof.java deleted file mode 100644 index e52471b..0000000 --- a/src/main/java/com/deep/crow/completable/Cof.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.deep.crow.completable; - -import com.deep.crow.util.Tuple; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.function.Predicate; -import java.util.function.Supplier; - -/** - * 基于{@link CompletableFuture}的扩展器 - * - *

其实现类应提供对应的容器存放需要执行的任务,任务的形式支持{@link CompletableFuture}所提供的几种形式: - * - *

- * - *

本类的实现者可根据需求使用{@link CompletableFuture#get()}或者{@link CompletableFuture#join()}方法获取结果 - * - *

注意执行器的适用范围,针对整个容器,针对一个任务或是不使用执行器 - * - *

说明: - * - *

- * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 10:08 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -public interface Cof { - - /** - * 执行容器中的任务 - * - * @return R - * @author liuwenhao - * @date 2021/11/26 10:15 - */ - default R exec() { - return exec(s -> true); - } - - /** - * 执行容器中的任务 - * - * @param p 过滤条件 - * @return R - * @author liuwenhao - * @date 2021/11/26 10:15 - */ - R exec(Predicate> p); - - // =============================任务注册器================================== - - /** - * 注册一个任务 - * - * @param e 任务实体 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 11:10 - */ - default Cof register(CofTask e) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一批任务 - * - * @param e 任务实体 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 11:10 - */ - default Cof registers(List> e) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofRun} - * - * @param r 任务 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Runnable r) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofRun} - * - *

执行时使用任务自带的执行器执行 - * - * @param r 任务 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Runnable r, ExecutorService e) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofSupplyMap} - * - *

执行时使用任务自带的执行器执行 - * - * @param s 任务 - * @param e 执行器 - * @param n 名,唯一标识 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Supplier s, ExecutorService e, String n) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofSupplyMap} - * - * @param s 任务 - * @param n 名,唯一标识 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Supplier s, String n) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofSupplyTuple} - * - *

执行时使用任务自带的执行器执行 - * - * @param s 任务 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Supplier s, ExecutorService e) { - throw new UnsupportedOperationException(); - } - - /** - * 注册一个任务,仅适用于{@link CofSupplyTuple} - * - * @param s 任务 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 15:44 - */ - default Cof register(Supplier s) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/com/deep/crow/completable/CofHelper.java b/src/main/java/com/deep/crow/completable/CofHelper.java deleted file mode 100644 index 1dca24b..0000000 --- a/src/main/java/com/deep/crow/completable/CofHelper.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.deep.crow.completable; - -import com.deep.crow.util.Tuple; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.function.Supplier; - -/** - * 构建Cof扩展器的工具类 建立Cof容器的工具类,详情可见: - * - *
    - *
  • {@link CofSupplyTuple} - *
  • {@link CofSupplyMap} - *
  • {@link CofRunAsync} - *
  • {@link CofRunBlock} - *
- * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 16:07 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -public class CofHelper { - private CofHelper() {} - - /** - * 创建一个{@link CofRunBlock} - * - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunBlock() { - return new CofRunBlock(); - } - - /** - * 创建一个{@link CofRunBlock} - * - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunBlock(ExecutorService e) { - return new CofRunBlock(e); - } - - /** - * 创建一个{@link CofRunBlock} - * - * @param r 任务集合 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunBlock(List> r, ExecutorService e) { - return new CofRunBlock(r, e); - } - - /** - * 创建一个{@link CofRunAsync} - * - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunAsync() { - return new CofRunAsync(); - } - - /** - * 创建一个{@link CofRunAsync} - * - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunAsync(ExecutorService e) { - return new CofRunAsync(e); - } - - /** - * 创建一个{@link CofRunAsync} - * - * @param r 任务集合 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof buildRunAsync(List> r, ExecutorService e) { - return new CofRunAsync(r, e); - } - - /** - * 创建一个{@link CofSupplyMap} - * - * @return cn.net.nova.trm.util.test.Com,java.util.Map> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Map> buildSupplyMap() { - return new CofSupplyMap(); - } - - /** - * 创建一个{@link CofSupplyMap} - * - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com,java.util.Map> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Map> buildSupplyMap(ExecutorService e) { - return new CofSupplyMap(e); - } - - /** - * 创建一个{@link CofSupplyMap} - * - * @param r 任务集合 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com,java.util.Map> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Map> buildSupplyMap( - List>> r, ExecutorService e) { - return new CofSupplyMap(r, e); - } - - /** - * 创建一个{@link CofSupplyTuple} - * - * @return cn.net.nova.trm.util.test.Com,cn.hutool.core.lang.Tuple> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Tuple> buildSupplyTuple() { - return new CofSupplyTuple(); - } - - /** - * 创建一个{@link CofSupplyTuple} - * - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com,cn.hutool.core.lang.Tuple> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Tuple> buildSupplyTuple(ExecutorService e) { - return new CofSupplyTuple(e); - } - - /** - * 创建一个{@link CofSupplyTuple} - * - * @param r 任务集合 - * @param e 执行器 - * @return cn.net.nova.trm.util.test.Com,cn.hutool.core.lang.Tuple> - * @author liuwenhao - * @date 2021/11/26 16:14 - */ - public static Cof, Tuple> buildSupplyTuple( - List>> r, ExecutorService e) { - return new CofSupplyTuple(r, e); - } -} diff --git a/src/main/java/com/deep/crow/completable/CofRun.java b/src/main/java/com/deep/crow/completable/CofRun.java deleted file mode 100644 index 85f9190..0000000 --- a/src/main/java/com/deep/crow/completable/CofRun.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.deep.crow.completable; - -import java.util.List; -import java.util.concurrent.ExecutorService; - -/** - * Runnable的实现 - * - *

{@link Runnable}本身无返回值,故定义整个容器中本次执行的任务个数为其返回值 - * - *

如果不在程序中进行等待则无法得知任务是否运行完成 - * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 11:18 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -abstract class CofRun implements Cof { - - protected List> runs; - - protected ExecutorService executorService; - - @Override - public Cof register(CofTask e) { - runs.add(e); - return this; - } - - @Override - public Cof registers(List> e) { - this.runs.addAll(e); - return this; - } - - @Override - public Cof register(Runnable r) { - runs.add(CofTask.buildRun().task(r)); - return this; - } - - @Override - public Cof register(Runnable r, ExecutorService e) { - runs.add(CofTask.buildRun().task(r).executorService(e)); - return this; - } -} diff --git a/src/main/java/com/deep/crow/completable/CofRunAsync.java b/src/main/java/com/deep/crow/completable/CofRunAsync.java deleted file mode 100644 index a2261d6..0000000 --- a/src/main/java/com/deep/crow/completable/CofRunAsync.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.deep.crow.completable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * 异步的方式执行任务 - * - *

直接通过异步化的方式执行任务,返回值为本次容器实际执行的任务数目,返回结果和实际任务的执行均为异步 - * - *

{@code
- *         System.out.println(123);
- *
- *         Integer exec = CofHelper.buildRunAsync()
- *             .register(() -> System.out.println(1))
- *             .register(() -> System.out.println(2))
- *             .exec(); // 2
- *
- *         System.out.println(456);
- * }
- * 其结果为:
- *  123
- *  456
- *  1
- *  2
- *  
- *  123
- *  456
- *  2
- *  1
- * 
- * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/12/21 9:42 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -class CofRunAsync extends CofRun { - - @Override - public Integer exec(Predicate> predicate) { - if (Objects.isNull(runs)) { - return 0; - } - List> list = runs.stream().filter(predicate).collect(Collectors.toList()); - list.forEach( - r -> { - if (Objects.nonNull(r.getExecutorService())) { - CompletableFuture.runAsync(r.getTask(), r.getExecutorService()); - } else if (Objects.nonNull(executorService)) { - CompletableFuture.runAsync(r.getTask(), executorService); - } else { - CompletableFuture.runAsync(r.getTask()); - } - }); - return list.size(); - } - - protected CofRunAsync() { - this.runs = new ArrayList<>(); - } - - protected CofRunAsync(ExecutorService executorService) { - this.runs = new ArrayList<>(); - this.executorService = executorService; - } - - protected CofRunAsync(List> runs, ExecutorService executorService) { - this.runs = Objects.nonNull(runs) ? runs : new ArrayList<>(); - this.executorService = executorService; - } -} diff --git a/src/main/java/com/deep/crow/completable/CofRunBlock.java b/src/main/java/com/deep/crow/completable/CofRunBlock.java deleted file mode 100644 index 3d578fd..0000000 --- a/src/main/java/com/deep/crow/completable/CofRunBlock.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.deep.crow.completable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ExecutorService; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * 阻塞的方式执行任务 - * - *

对于程序的整体执行是同步的,但是对于容器内部执行的各个任务来说是异步的 - * - *

{@code
- *        System.out.println(123);
- *
- *         Integer exec = CofHelper.buildRunBlock()
- *             .register(() -> System.out.println(1))
- *             .register(() -> System.out.println(2))
- *             .exec(); // 2
- *
- *         System.out.println(456);
- * }
- * 其结果为:
- *  123
- *  1
- *  2
- *  456
- *  
- *  123
- *  2
- *  1
- *  456
- * 
- * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/12/21 9:37 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -class CofRunBlock extends CofRun { - - @Override - public Integer exec(Predicate> predicate) { - if (Objects.isNull(runs)) { - return 0; - } - - CopyOnWriteArrayList> signatures = - runs.stream() - .filter(predicate) - .map( - r -> { - if (Objects.nonNull(r.getExecutorService())) { - return Signature.build( - r.getName(), - CompletableFuture.runAsync(r.getTask(), r.getExecutorService())); - } else if (Objects.nonNull(executorService)) { - return Signature.build( - r.getName(), CompletableFuture.runAsync(r.getTask(), executorService)); - } else { - return Signature.build(r.getName(), CompletableFuture.runAsync(r.getTask())); - } - }) - .collect(Collectors.toCollection(CopyOnWriteArrayList::new)); - - signatures.forEach(c -> c.getCompletableFuture().join()); - - return signatures.size(); - } - - protected CofRunBlock() { - this.runs = new ArrayList<>(); - } - - protected CofRunBlock(ExecutorService executorService) { - this.runs = new ArrayList<>(); - this.executorService = executorService; - } - - protected CofRunBlock(List> runs, ExecutorService executorService) { - this.runs = Objects.nonNull(runs) ? runs : new ArrayList<>(); - this.executorService = executorService; - } -} diff --git a/src/main/java/com/deep/crow/completable/CofSupply.java b/src/main/java/com/deep/crow/completable/CofSupply.java deleted file mode 100644 index 91f747f..0000000 --- a/src/main/java/com/deep/crow/completable/CofSupply.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.deep.crow.completable; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ExecutorService; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -/** - * Supplier的实现 - * - *

根据各个任务中执行的定义位置进行执行 - * - *

具体的返回类型任交由子类定义 - * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 11:24 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -abstract class CofSupply implements Cof, R> { - - protected List>> supplies; - - protected ExecutorService executorService; - - protected CopyOnWriteArrayList> perform( - Collection>> suppliers) { - return suppliers.stream() - .map( - r -> { - if (Objects.nonNull(r.getExecutorService())) { - return Signature.build( - r.getName(), - CompletableFuture.supplyAsync(r.getTask(), r.getExecutorService())); - } else if (Objects.nonNull(executorService)) { - return Signature.build( - r.getName(), CompletableFuture.supplyAsync(r.getTask(), executorService)); - } else { - return Signature.build(r.getName(), CompletableFuture.supplyAsync(r.getTask())); - } - }) - .collect(Collectors.toCollection(CopyOnWriteArrayList::new)); - } - - @Override - public Cof, R> register(CofTask> e) { - supplies.add(e); - return this; - } - - @Override - public Cof, R> registers(List>> e) { - supplies.addAll(e); - return this; - } -} diff --git a/src/main/java/com/deep/crow/completable/CofSupplyMap.java b/src/main/java/com/deep/crow/completable/CofSupplyMap.java deleted file mode 100644 index 3506f79..0000000 --- a/src/main/java/com/deep/crow/completable/CofSupplyMap.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.deep.crow.completable; - -import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -/** - * 返回值为Map的执行方式 - * - *

通过容器中的任务的name为唯一标识,或者最终需要执行的任务 - * - *

获取任务的结果时需通过装入任务时定义的name来获取执行结果 示例: - * - *

{@code
- * Map map = CofHelper.buildSupplyMap()
- *     .register(() -> 1,"one")
- *     .register(() -> "test","two")
- *     .register(ArrayList::new,"three")
- *     .exec();
- * Integer one = (Integer) map.get("one"); // 1
- * String two = (String) map.get("two"); // test
- * List three = (List) map.get("three"); // []
- * }
- * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 11:45 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -class CofSupplyMap extends CofSupply> { - - @Override - public Map exec(Predicate>> predicate) { - if (Objects.isNull(supplies) || supplies.isEmpty()) { - return new HashMap<>(); - } - // 去重 - Set>> supplyList = - supplies.stream() - .filter(predicate) - .filter(c -> c.getName() != null) - .collect(Collectors.toSet()); - // 获取结果 - return perform(supplyList).stream() - .collect( - Collectors.toMap( - Signature::getName, c -> c.getCompletableFuture().join(), (f, l) -> l)); - } - - protected CofSupplyMap() { - this.supplies = new ArrayList<>(); - } - - protected CofSupplyMap(ExecutorService executorService) { - this.supplies = new ArrayList<>(); - this.executorService = executorService; - } - - protected CofSupplyMap( - List>> supplies, ExecutorService executorService) { - this.supplies = Objects.nonNull(supplies) ? supplies : new ArrayList<>(); - this.executorService = executorService; - } - - @Override - public Cof, Map> register( - Supplier s, ExecutorService e, String n) { - supplies.add(CofTask.buildSupply().task(s).executorService(e).name(n)); - return this; - } - - @Override - public Cof, Map> register(Supplier s, String n) { - supplies.add(CofTask.buildSupply().task(s).name(n)); - return this; - } -} diff --git a/src/main/java/com/deep/crow/completable/CofSupplyTuple.java b/src/main/java/com/deep/crow/completable/CofSupplyTuple.java deleted file mode 100644 index d8c0cba..0000000 --- a/src/main/java/com/deep/crow/completable/CofSupplyTuple.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.deep.crow.completable; - -import com.deep.crow.util.Tuple; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ExecutorService; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -/** - * 返回值为Tuple的执行方式 - * - *

最终的返回值为{@link Tuple},其中的元素可以是不同的是数据类型 - * - *

不会针对name进行任务的去重处理,执行结果的顺序就是装入任务的顺序 示例: - * - *

{@code
- * Tuple tuple = CofHelper.buildSupplyTuple()
- *      .register(() -> 1)
- *      .register(() -> "test")
- *      .register((@NotNull Supplier) ArrayList::new)
- *      .exec();
- *  Integer one = tuple.get(0); // 1
- *  String two = tuple.get(1); // test
- *  List three = tuple.get(2); // []
- * }
- *
- * @deprecated {@link com.deep.crow.multi.Multi}
- * @author Create by liuwenhao on 2021/11/26 11:51
- */
-@Deprecated
-@SuppressWarnings("unused deprecated")
-class CofSupplyTuple extends CofSupply {
-
-  @Override
-  public Tuple exec(Predicate>> predicate) {
-    if (Objects.isNull(supplies) || supplies.isEmpty()) {
-      return new Tuple();
-    }
-    List>> list =
-        supplies.stream().filter(predicate).collect(Collectors.toList());
-    return new Tuple(perform(list).stream().map(c -> c.getCompletableFuture().join()).toArray());
-  }
-
-  protected CofSupplyTuple() {
-    this.supplies = new ArrayList<>();
-  }
-
-  protected CofSupplyTuple(ExecutorService executorService) {
-    this.supplies = new ArrayList<>();
-    this.executorService = executorService;
-  }
-
-  protected CofSupplyTuple(
-      List>> supplies, ExecutorService executorService) {
-    this.supplies = Objects.nonNull(supplies) ? supplies : new ArrayList<>();
-    this.executorService = executorService;
-  }
-
-  @Override
-  public Cof, Tuple> register(Supplier s, ExecutorService e) {
-    supplies.add(CofTask.buildSupply().task(s).executorService(e));
-    return this;
-  }
-
-  @Override
-  public Cof, Tuple> register(Supplier s) {
-    supplies.add(CofTask.buildSupply().task(s));
-    return this;
-  }
-}
diff --git a/src/main/java/com/deep/crow/completable/CofTask.java b/src/main/java/com/deep/crow/completable/CofTask.java
deleted file mode 100644
index b6f904f..0000000
--- a/src/main/java/com/deep/crow/completable/CofTask.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.deep.crow.completable;
-
-import java.util.concurrent.ExecutorService;
-import java.util.function.Supplier;
-
-/**
- * 任务实体
- *
- * 

将容器中的每一个元素封装为独立的任务个体,他们可以拥有已被定义好的name和执行器 - * - *

注意:同一个容器中任务的类型应保证相同 - * - *

name为各个任务的唯一标识 - * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/26 10:45 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -public final class CofTask { - - private T task; - - private ExecutorService executorService; - - private String name; - - private CofTask() {} - - public static CofTask buildRun() { - return new CofTask<>(); - } - - public static CofTask> buildSupply() { - return new CofTask<>(); - } - - public CofTask task(T task) { - this.task = task; - return this; - } - - public CofTask executorService(ExecutorService executorService) { - this.executorService = executorService; - return this; - } - - public CofTask name(String name) { - this.name = name; - return this; - } - - public T getTask() { - return task; - } - - public void setTask(T task) { - this.task = task; - } - - public ExecutorService getExecutorService() { - return executorService; - } - - public void setExecutorService(ExecutorService executorService) { - this.executorService = executorService; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public int hashCode() { - return this.name.hashCode(); - } - - @Override - @SuppressWarnings("unchecked") - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (obj instanceof CofTask) { - CofTask supply = (CofTask) obj; - return supply.name.equals(this.name); - } - return false; - } -} diff --git a/src/main/java/com/deep/crow/completable/Signature.java b/src/main/java/com/deep/crow/completable/Signature.java deleted file mode 100644 index 02c2ca4..0000000 --- a/src/main/java/com/deep/crow/completable/Signature.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.deep.crow.completable; - -import java.util.concurrent.CompletableFuture; - -/** - * Completable签名 建立任务名和completableFuture实例的关联关系 - * - * @deprecated {@link com.deep.crow.multi.Multi} - * @author Create by liuwenhao on 2021/11/11 11:05 - */ -@Deprecated -@SuppressWarnings("unused deprecated") -class Signature { - - private final String name; - - private final CompletableFuture completableFuture; - - public static Signature build(String name, CompletableFuture completableFuture) { - return new Signature<>(name, completableFuture); - } - - public Signature(String name, CompletableFuture completableFuture) { - this.name = name; - this.completableFuture = completableFuture; - } - - public String getName() { - return name; - } - - public CompletableFuture getCompletableFuture() { - return completableFuture; - } -} diff --git a/src/main/java/com/deep/crow/compress/AbstractCompress.java b/src/main/java/com/deep/crow/compress/AbstractCompress.java index 3812fea..9af6fcc 100644 --- a/src/main/java/com/deep/crow/compress/AbstractCompress.java +++ b/src/main/java/com/deep/crow/compress/AbstractCompress.java @@ -1,6 +1,5 @@ package com.deep.crow.compress; -import com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.Type; /** @@ -11,11 +10,9 @@ public abstract class AbstractCompress implements Compress { Object o; Type type; - ObjectMapper objectMapper; - AbstractCompress(Object o, Type type, ObjectMapper objectMapper) { + AbstractCompress(Object o, Type type) { this.o = o; this.type = type; - this.objectMapper = objectMapper; } } diff --git a/src/main/java/com/deep/crow/compress/CompressHelper.java b/src/main/java/com/deep/crow/compress/CompressHelper.java index 4dff303..6464a23 100644 --- a/src/main/java/com/deep/crow/compress/CompressHelper.java +++ b/src/main/java/com/deep/crow/compress/CompressHelper.java @@ -1,7 +1,7 @@ package com.deep.crow.compress; import com.deep.crow.exception.CrowException; -import com.fasterxml.jackson.databind.ObjectMapper; + import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -33,49 +33,47 @@ public class CompressHelper { * 通过类型获取一组压缩器 * * @param type 类型 - * @param o 需要判断的对象 - * @param objectMapper objectMapper + * @param o 需要判断的对象 * @return com.deep.crow.compress.Compress * @author liuwenhao * @date 2022/6/2 16:48 */ - public static Compress getType(Type type, Object o, ObjectMapper objectMapper) { + public static Compress getType(Type type, Object o) { return (type instanceof ParameterizedType) - ? get(o, type, objectMapper) - : new SimpleCompress(o, type, objectMapper); + ? get(o, type) + : new SimpleCompress(o, type); } /** * 通过类型获取一组压缩器 * * @param type 类型 - * @param o 需要判断的对象 - * @param objectMapper objectMapper + * @param o 需要判断的对象 * @return com.deep.crow.compress.Compress * @author liuwenhao * @date 2022/6/2 17:26 */ - private static Compress get(Object o, Type type, ObjectMapper objectMapper) { + private static Compress get(Object o, Type type) { for (Map.Entry, Class> entry : compressMap.entrySet()) { if (entry.getKey().isInstance(o)) { Class aClass = compressMap.get(entry.getKey()); try { Constructor constructor = - aClass.getConstructor(Object.class, Type.class, ObjectMapper.class); - return constructor.newInstance(o, type, objectMapper); + aClass.getConstructor(Object.class, Type.class); + return constructor.newInstance(o, type); } catch (Exception e) { throw CrowException.exception(e); } } } - return new DefaultCompress(o, type, objectMapper); + return new DefaultCompress(o, type); } /** * 添加一组压缩器映射 高级别的抽象会覆盖低级别的抽象
* 所以注册的压缩器不一定会生效 * - * @param key 键 + * @param key 键 * @param value 值 * @author liuwenhao * @date 2022/6/2 16:17 @@ -107,7 +105,7 @@ public synchronized void register(Class key, Class value) * 如果新指定的键类型抽象级别更高则会删除抽象级别更低的键
* 例如指定了 List Compress,则会覆盖 Iterable IteratorCompress,最终的结果为:Iterable Compress * - * @param key 键 + * @param key 键 * @param value 值 * @author liuwenhao * @date 2022/6/7 10:31 @@ -135,7 +133,7 @@ public synchronized void topLevelCover(Class key, Class v * 获取所有的值 * * @return java.util.Map,java.lang.Class> + * com.deep.crow.compress.Compress>> * @author liuwenhao * @date 2022/6/2 18:43 */ diff --git a/src/main/java/com/deep/crow/compress/DefaultCompress.java b/src/main/java/com/deep/crow/compress/DefaultCompress.java index e3ed5f5..6022e23 100644 --- a/src/main/java/com/deep/crow/compress/DefaultCompress.java +++ b/src/main/java/com/deep/crow/compress/DefaultCompress.java @@ -1,7 +1,7 @@ package com.deep.crow.compress; -import com.deep.crow.type.CrowTypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.deep.crow.util.JsonUtil; + import java.lang.reflect.Type; /** @@ -12,8 +12,8 @@ @SuppressWarnings("unchecked") public class DefaultCompress extends AbstractCompress { - public DefaultCompress(Object o, Type type, ObjectMapper objectMapper) { - super(o, type, objectMapper); + public DefaultCompress(Object o, Type type) { + super(o, type); } @Override @@ -24,8 +24,7 @@ public T compress() { @Override public boolean check() { try { - CrowTypeReference typeReference = CrowTypeReference.make(type); - objectMapper.convertValue(compress(), typeReference); + JsonUtil.objToString(compress(), type); return true; } catch (Exception e) { return false; diff --git a/src/main/java/com/deep/crow/compress/IteratorCompress.java b/src/main/java/com/deep/crow/compress/IteratorCompress.java index a4f1acc..d5fc5a5 100644 --- a/src/main/java/com/deep/crow/compress/IteratorCompress.java +++ b/src/main/java/com/deep/crow/compress/IteratorCompress.java @@ -1,8 +1,8 @@ package com.deep.crow.compress; -import com.deep.crow.type.CrowTypeReference; import com.deep.crow.util.ContainerUtil; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.deep.crow.util.JsonUtil; + import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -14,8 +14,8 @@ @SuppressWarnings("unchecked") public class IteratorCompress extends AbstractCompress { - public IteratorCompress(Object o, Type type, ObjectMapper objectMapper) { - super(o, type, objectMapper); + public IteratorCompress(Object o, Type type) { + super(o, type); } @Override @@ -31,9 +31,8 @@ public boolean check() { ParameterizedType parameterizedType = (ParameterizedType) type; Type argument = parameterizedType.getActualTypeArguments()[0]; Type rawType = parameterizedType.getRawType(); - CrowTypeReference typeReference = CrowTypeReference.make(argument); Object compress = compress(); - objectMapper.convertValue(compress, typeReference); + JsonUtil.objToString(compress, argument); return ((Class) argument).isAssignableFrom(compress.getClass()) && ((Class) rawType).isAssignableFrom(o.getClass()); } catch (Exception e) { diff --git a/src/main/java/com/deep/crow/compress/MapCompress.java b/src/main/java/com/deep/crow/compress/MapCompress.java index 5318e3d..9632b1d 100644 --- a/src/main/java/com/deep/crow/compress/MapCompress.java +++ b/src/main/java/com/deep/crow/compress/MapCompress.java @@ -1,8 +1,8 @@ package com.deep.crow.compress; -import com.deep.crow.type.CrowTypeReference; import com.deep.crow.util.ContainerUtil; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.deep.crow.util.JsonUtil; + import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map; @@ -15,8 +15,8 @@ @SuppressWarnings("unchecked") public class MapCompress extends AbstractCompress { - public MapCompress(Object o, Type type, ObjectMapper objectMapper) { - super(o, type, objectMapper); + public MapCompress(Object o, Type type) { + super(o, type); } @Override @@ -33,10 +33,8 @@ public boolean check() { Type keyArgument = parameterizedType.getActualTypeArguments()[0]; Type valueArgument = parameterizedType.getActualTypeArguments()[1]; Type rawType = parameterizedType.getRawType(); - CrowTypeReference keyTypeReference = CrowTypeReference.make(keyArgument); - CrowTypeReference valueTypeReference = CrowTypeReference.make(valueArgument); - objectMapper.convertValue(firstKeyValue.getKey(), keyTypeReference); - objectMapper.convertValue(firstKeyValue.getValue(), valueTypeReference); + JsonUtil.objToString(firstKeyValue.getKey(), keyArgument); + JsonUtil.objToString(firstKeyValue.getValue(), valueArgument); return ((Class) keyArgument).isAssignableFrom(firstKeyValue.getKey().getClass()) && ((Class) valueArgument).isAssignableFrom(firstKeyValue.getValue().getClass()) && ((Class) rawType).isAssignableFrom(o.getClass()); diff --git a/src/main/java/com/deep/crow/compress/SimpleCompress.java b/src/main/java/com/deep/crow/compress/SimpleCompress.java index fbd4b5f..7167711 100644 --- a/src/main/java/com/deep/crow/compress/SimpleCompress.java +++ b/src/main/java/com/deep/crow/compress/SimpleCompress.java @@ -1,6 +1,5 @@ package com.deep.crow.compress; -import com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.Type; /** @@ -11,8 +10,8 @@ @SuppressWarnings("unchecked") public class SimpleCompress extends AbstractCompress { - public SimpleCompress(Object o, Type type, ObjectMapper objectMapper) { - super(o, type, objectMapper); + public SimpleCompress(Object o, Type type) { + super(o, type); } @Override diff --git a/src/main/java/com/deep/crow/compress/TypeUtil.java b/src/main/java/com/deep/crow/compress/TypeUtil.java index fda74cb..0c23315 100644 --- a/src/main/java/com/deep/crow/compress/TypeUtil.java +++ b/src/main/java/com/deep/crow/compress/TypeUtil.java @@ -1,16 +1,14 @@ package com.deep.crow.compress; import com.deep.crow.exception.CrowException; -import com.deep.crow.jackson.ObjectMapperFactory; -import com.deep.crow.type.CrowTypeReference; import com.deep.crow.type.ParameterizedTypeImpl; +import com.deep.crow.util.ClassUtil; import com.deep.crow.util.ContainerUtil; -import com.esotericsoftware.reflectasm.ConstructorAccess; -import com.esotericsoftware.reflectasm.FieldAccess; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; +import com.deep.crow.util.JsonUtil; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.*; import java.util.*; /** @@ -21,13 +19,14 @@ @SuppressWarnings("unchecked,unused") public class TypeUtil { - private TypeUtil() {} + private TypeUtil() { + } /** * 筛选结果类型 在一个未知的结果集中匹配指定类型的项,匹配成功则直接返回
* 无匹配选项则抛出异常 * - * @param l 结果集 + * @param l 结果集 * @param clazz 目标类 * @return T * @author liuwenhao @@ -47,7 +46,7 @@ public static T screenClass(Iterable l, Class clazz) { * 筛选结果类型 在一个未知的结果集中匹配指定类型的项,得到所有可能匹配的结果
* 无匹配选项则获得空集合 * - * @param l 结果集 + * @param l 结果集 * @param clazz 目标类 * @return T * @author liuwenhao @@ -68,7 +67,7 @@ public static List screenClasses(Iterable l, Class clazz) { * 筛选结果类型 在一个未知的结果集中匹配指定类型的项
* 无匹配选项则抛出异常 * - * @param l 结果集 + * @param l 结果集 * @param clazz 目标类 * @param types 泛型 * @return T @@ -88,7 +87,7 @@ public static T screenType(Iterable l, Class clazz, Type... types) { * 筛选结果类型 在一个未知的结果集中匹配指定类型的项,得到所有可能匹配的结果
* 无匹配选项则返回空集合 * - * @param l 结果集 + * @param l 结果集 * @param clazz 目标类 * @param types 泛型 * @return T @@ -105,13 +104,19 @@ public static List screenTypes(Iterable l, Class clazz, Type... typ * 筛选结果类型 在一个未知的结果集中匹配指定类型的项
* 无匹配选项则抛出异常 * - * @param l 结果集 + * @param l 结果集 * @param type 检索的类型 * @return T * @author liuwenhao * @date 2022/4/24 16:27 */ public static T screenType(Iterable l, Type type) { + // 如果type的类型直接是class,则可以通过比较简单的方式去转化 + if (type instanceof Class) { + Class cls = (Class) type; + return (T) screenClass(l, cls); + } + /* * o及其泛型是否与parameterizedType兼容, * 1,通过API获取o被擦除的泛型类型,和传入的类型进行对比,相同则返回 @@ -119,14 +124,11 @@ public static T screenType(Iterable l, Type type) { * 其真实类型是未知的,所以并不支持这种获取方式。 * 2,通过序列化的方式,先通过参数指明类型进行序列化 * 如果成功,则说明类型兼容,反之不兼容 - * 这需要 Jackson 的支持 */ if (type instanceof ParameterizedType) { - CrowTypeReference typeReference = CrowTypeReference.make(type); - ObjectMapper objectMapper = ObjectMapperFactory.get(); for (Object o : l) { - boolean match = isMatch(typeReference, o, objectMapper); + boolean match = isMatch(type, o); if (match) { return (T) o; } @@ -139,7 +141,7 @@ public static T screenType(Iterable l, Type type) { * 筛选结果类型 在一个未知的结果集中匹配指定类型的项,得到所有可能匹配的结果
* 无匹配选项则返回空集合 * - * @param l 结果集 + * @param l 结果集 * @param type 检索的类型 * @return T * @author liuwenhao @@ -147,10 +149,8 @@ public static T screenType(Iterable l, Type type) { */ public static List screenTypes(Iterable l, Type type) { List tList = new ArrayList<>(); - CrowTypeReference typeReference = CrowTypeReference.make(type); - ObjectMapper objectMapper = ObjectMapperFactory.get(); for (Object o : l) { - boolean match = isMatch(typeReference, o, objectMapper); + boolean match = isMatch(type, o); if (match) { tList.add((T) o); } @@ -175,18 +175,18 @@ public static void fillInstance(Iterable l, T t) { * 根据类型填充属性 按照类型匹配的方式将结果集中的数据填充到实例对象中,对于相同类型的数据采用按顺序依次填充的策略
* 按对象的填充方式,在填充时不会影响到已有的数据在填充之前需要使用到反射获取属性类型
* - * @param l 结果集 - * @param t 需要填充的类对象 + * @param l 结果集 + * @param t 需要填充的类对象 * @param isCover 是否覆盖 * @author liuwenhao * @date 2022/4/26 9:02 */ public static void fillInstance(Iterable l, T t, boolean isCover) { - FieldAccess fieldAccess = FieldAccess.get(t.getClass()); - List fields = new ArrayList<>(Arrays.asList(fieldAccess.getFields())); + Class cls = t.getClass(); + List fields = ClassUtil.getFieldsByGetterAndSetter(cls); for (Object o : l) { - TypeMatching typeMatching = new TypeMatching(fields, o, fieldAccess, isCover); + TypeMatching typeMatching = new TypeMatching(fields, o, cls, isCover); Field matching = typeMatching.matching(t); if (matching != null) { fields.remove(matching); @@ -197,8 +197,8 @@ public static void fillInstance(Iterable l, T t, boolean isCover) { /** * 根据类型填充属性 批量处理的形式,针对单个对象的处理和{@link #fillInstance(Iterable, Object, boolean)}相同 * - * @param l 结果集 - * @param ts 需要填充的类对象集合 + * @param l 结果集 + * @param ts 需要填充的类对象集合 * @param isCover 是否覆盖 * @return java.util.Collection * @author liuwenhao @@ -209,11 +209,11 @@ public static Collection fillCollection(Iterable l, Collection ts, if (Objects.isNull(element)) { return ts; } - FieldAccess fieldAccess = FieldAccess.get(element.getClass()); - List fields = new ArrayList<>(Arrays.asList(fieldAccess.getFields())); + Class cls = element.getClass(); + List fields = ClassUtil.getFieldsByGetterAndSetter(cls); for (Object o : l) { - TypeMatching typeMatching = new TypeMatchingBatch<>(fields, o, fieldAccess, isCover, ts); + TypeMatching typeMatching = new TypeMatchingBatch<>(fields, o, cls, isCover, ts); Field matching = typeMatching.matching(element); if (matching != null) { fields.remove(matching); @@ -225,7 +225,7 @@ public static Collection fillCollection(Iterable l, Collection ts, /** * 根据类型填充属性 批量处理的形式,针对单个对象的处理和{@link #fillInstance(Iterable, Object, boolean)}相同 * - * @param l 结果集 + * @param l 结果集 * @param ts 需要填充的类对象集合 * @return java.util.Collection * @author liuwenhao @@ -239,7 +239,7 @@ public static Collection fillCollection(Iterable l, Collection ts) * 根据类型填充属性 按照类型匹配的方式将结果集中的数据填充到实例对象中,对于相同类型的数据采用按顺序依次填充的策略
* 这需要 reflections 的支持 * - * @param l 结果集 + * @param l 结果集 * @param clazz 需要填充的类 * @author liuwenhao * @date 2022/4/26 9:02 @@ -252,15 +252,14 @@ public static T fillClass(Iterable l, Class clazz) { * 根据类型填充属性 按照类型匹配的方式将结果集中的数据填充到实例对象中,对于相同类型的数据采用按顺序依次填充的策略
* 这需要 reflections 的支持 * - * @param l 结果集 - * @param clazz 需要填充的类 + * @param l 结果集 + * @param clazz 需要填充的类 * @param isCover 是否覆盖 * @author liuwenhao * @date 2022/4/26 9:02 */ public static T fillClass(Iterable l, Class clazz, boolean isCover) { - ConstructorAccess constructorAccess = ConstructorAccess.get(clazz); - T t = constructorAccess.newInstance(); + T t = ClassUtil.newInstance(clazz); fillInstance(l, t, isCover); return t; } @@ -268,17 +267,15 @@ public static T fillClass(Iterable l, Class clazz, boolean isCover) { /** * 验证类型是否匹配 * - * @param typeReference 类型 - * @param o 对象 - * @param objectMapper objectMapper + * @param type 类型 + * @param o 对象 * @return boolean * @author liuwenhao * @date 2022/4/26 11:24 */ - private static boolean isMatch( - CrowTypeReference typeReference, Object o, ObjectMapper objectMapper) { + private static boolean isMatch(Type type, Object o) { try { - objectMapper.convertValue(o, typeReference); + JsonUtil.objToString(o, type); return true; } catch (Exception e) { return false; @@ -292,27 +289,35 @@ private static boolean isMatch( */ static class TypeMatching { - /** 字段集 */ + /** + * 字段集 + */ List fields; - /** 实例对象 */ + /** + * 实例对象 + */ Object o; - /** 操作实例字段 */ - FieldAccess fieldAccess; + /** + * 实例类型 + */ + Class cls; - /** 是否覆盖 */ + /** + * 是否覆盖 + */ boolean isCover; - public TypeMatching(List fields, Object o, FieldAccess fieldAccess, boolean isCover) { + public TypeMatching(List fields, Object o, Class cls, boolean isCover) { this.fields = fields; this.o = o; + this.cls = cls; this.isCover = isCover; - this.fieldAccess = fieldAccess; } - public TypeMatching(List fields, Object o, FieldAccess fieldAccess) { - this(fields, o, fieldAccess, false); + public TypeMatching(List fields, Object o, Class cls) { + this(fields, o, cls, false); } /** @@ -325,16 +330,22 @@ public TypeMatching(List fields, Object o, FieldAccess fieldAccess) { * @date 2022/4/26 11:00 */ public Field matching(Object obj) { - ObjectMapper objectMapper = ObjectMapperFactory.get(); - for (Field field : fields) { - String property = field.getName(); - Object result = fieldAccess.get(obj, property); - if ((isCover || Objects.isNull(result)) && isAccordWith(field, o, objectMapper)) { - fieldAccess.set(obj, property, o); - return field; + try { + for (Field field : fields) { + String property = field.getName(); + PropertyDescriptor descriptor = new PropertyDescriptor(property, cls); + Method readMethod = descriptor.getReadMethod(); + Object result = readMethod.invoke(obj); + if ((isCover || Objects.isNull(result)) && isAccordWith(field, o)) { + Method writeMethod = descriptor.getWriteMethod(); + writeMethod.invoke(obj, o); + return field; + } } + return null; + } catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) { + throw CrowException.exception(e); } - return null; } } @@ -345,22 +356,24 @@ public Field matching(Object obj) { */ static class TypeMatchingBatch extends TypeMatching { - /** 需要填充的类对象集合 */ + /** + * 需要填充的类对象集合 + */ Collection collection; public TypeMatchingBatch( List fields, Object o, - FieldAccess fieldAccess, + Class cls, boolean isCover, Collection collection) { - super(fields, o, fieldAccess, isCover); + super(fields, o, cls, isCover); this.collection = collection; } public TypeMatchingBatch( - List fields, Object o, FieldAccess fieldAccess, Collection collection) { - super(fields, o, fieldAccess); + List fields, Object o, Class cls, Collection collection) { + super(fields, o, cls); this.collection = collection; } @@ -375,16 +388,24 @@ public TypeMatchingBatch( */ @Override public Field matching(Object obj) { - ObjectMapper objectMapper = ObjectMapperFactory.get(); - for (Field field : fields) { - String property = field.getName(); - Object result = fieldAccess.get(obj, property); - if ((isCover || Objects.isNull(result)) && isAccordWith(field, o, objectMapper)) { - collection.forEach(t -> fieldAccess.set(t, property, o)); - return field; + try { + for (Field field : fields) { + String property = field.getName(); + PropertyDescriptor descriptor = new PropertyDescriptor(property, cls); + Method readMethod = descriptor.getReadMethod(); + Object result = readMethod.invoke(obj); + if ((isCover || Objects.isNull(result)) && isAccordWith(field, o)) { + for (T t : collection) { + Method writeMethod = descriptor.getWriteMethod(); + writeMethod.invoke(t, o); + } + return field; + } } + return null; + } catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) { + throw CrowException.exception(e); } - return null; } } @@ -392,15 +413,14 @@ public Field matching(Object obj) { * 验证字段与实例对象是否可以兼容 * * @param field 字段属性 - * @param o 实例对象 - * @param objectMapper ObjectMapper + * @param o 实例对象 * @return boolean * @author liuwenhao * @date 2022/4/27 9:38 */ - private static boolean isAccordWith(Field field, Object o, ObjectMapper objectMapper) { + private static boolean isAccordWith(Field field, Object o) { Type type = field.getGenericType(); - Compress compress = CompressHelper.getType(type, o, objectMapper); + Compress compress = CompressHelper.getType(type, o); return compress.check(); } } diff --git a/src/main/java/com/deep/crow/exception/CrowException.java b/src/main/java/com/deep/crow/exception/CrowException.java index ce71761..82215ad 100644 --- a/src/main/java/com/deep/crow/exception/CrowException.java +++ b/src/main/java/com/deep/crow/exception/CrowException.java @@ -2,7 +2,9 @@ import com.deep.crow.util.StrUtil; -/** @author Create by liuwenhao on 2022/4/7 16:15 */ +/** + * @author Create by liuwenhao on 2022/4/7 16:15 + */ public class CrowException extends RuntimeException { private static final long serialVersionUID = 4220666905005394823L; @@ -23,6 +25,9 @@ public static CrowException exception(String message) { } public static CrowException exception(Throwable throwable) { + if (throwable instanceof CrowException) { + return new CrowException(throwable.getMessage()); + } return new CrowException(throwable); } diff --git a/src/main/java/com/deep/crow/jackson/ObjectMapperFactory.java b/src/main/java/com/deep/crow/jackson/ObjectMapperFactory.java deleted file mode 100644 index 92bf5d5..0000000 --- a/src/main/java/com/deep/crow/jackson/ObjectMapperFactory.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.deep.crow.jackson; - -import com.deep.crow.jackson.deserializer.*; -import com.deep.crow.jackson.serializer.*; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; -import com.fasterxml.jackson.databind.module.SimpleModule; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; - -/** - * 获取{@link ObjectMapper} - * - * @author Create by liuwenhao on 2022/4/24 13:28 - */ -public class ObjectMapperFactory { - - static ObjectMapper objectMapper; - - static { - objectMapper = new ObjectMapper(); - objectMapper.activateDefaultTyping( - LaissezFaireSubTypeValidator.instance, - ObjectMapper.DefaultTyping.NON_FINAL, - JsonTypeInfo.As.PROPERTY); - objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - DateTimeFormatter localDateTimePattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); - DateTimeFormatter localDatePattern = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - DateTimeFormatter localTime = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); - - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, new LongSerializer()); - simpleModule.addDeserializer(Long.class, new LongDeserializer()); - simpleModule.addSerializer(Integer.class, new IntegerSerializer()); - simpleModule.addDeserializer(Integer.class, new IntegerDeserializer()); - simpleModule.addSerializer(Double.class, new DoubleSerializer()); - simpleModule.addDeserializer(Double.class, new DoubleDeserializer()); - simpleModule.addSerializer(Float.class, new FloatSerializer()); - simpleModule.addDeserializer(Float.class, new FloatDeserializer()); - simpleModule.addSerializer(Short.class, new ShortSerializer()); - simpleModule.addDeserializer(Short.class, new ShortDeserializer()); - simpleModule.addSerializer(Byte.class, new ByteSerializer()); - simpleModule.addDeserializer(Byte.class, new ByteDeserializer()); - simpleModule.addSerializer(Character.class, new CharacterSerializer()); - simpleModule.addDeserializer(Character.class, new CharacterDeserializer()); - simpleModule.addSerializer(Boolean.class, new BooleanSerializer()); - simpleModule.addDeserializer(Boolean.class, new BooleanDeserializer()); - simpleModule.addSerializer(String.class, new StringSerializer()); - simpleModule.addDeserializer(String.class, new StringDeserializer()); - - simpleModule.addSerializer( - LocalDateTime.class, new LocalDateTimeSerializer(localDateTimePattern)); - simpleModule.addDeserializer( - LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimePattern)); - simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(localDatePattern)); - simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(localDatePattern)); - simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(localTime)); - simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(localTime)); - objectMapper.registerModule(simpleModule); - } - - private ObjectMapperFactory() {} - - public static void setObjectMapper(ObjectMapper objectMapper) { - ObjectMapperFactory.objectMapper = objectMapper; - } - - public static ObjectMapper get() { - return objectMapper; - } -} diff --git a/src/main/java/com/deep/crow/jackson/deserializer/StringDeserializer.java b/src/main/java/com/deep/crow/jackson/deserializer/StringDeserializer.java deleted file mode 100644 index 815d1a3..0000000 --- a/src/main/java/com/deep/crow/jackson/deserializer/StringDeserializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.deep.crow.jackson.deserializer; - -/** - * String 类型反序列化 - * - * @author Create by liuwenhao on 2022/5/10 16:33 - */ -public class StringDeserializer extends TypeDeserializer { - - String type = "java.lang.String"; - - @Override - public String getType() { - return type; - } - - @Override - public String getResult(String s) { - return s; - } -} diff --git a/src/main/java/com/deep/crow/jackson/serializer/StringSerializer.java b/src/main/java/com/deep/crow/jackson/serializer/StringSerializer.java deleted file mode 100644 index 779e33f..0000000 --- a/src/main/java/com/deep/crow/jackson/serializer/StringSerializer.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.deep.crow.jackson.serializer; - -/** - * Boolean 类型序列化 - * - * @author Create by liuwenhao on 2022/5/10 16:52 - */ -public class StringSerializer extends TypeSerializer { - - String str = "java.lang.String"; - - @Override - public String getStr() { - return str; - } -} diff --git a/src/main/java/com/deep/crow/jackson/serializer/TypeSerializer.java b/src/main/java/com/deep/crow/jackson/serializer/TypeSerializer.java deleted file mode 100644 index c28148b..0000000 --- a/src/main/java/com/deep/crow/jackson/serializer/TypeSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.deep.crow.jackson.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; - -/** - * 基本数据类型序列化 - * - * @author Create by liuwenhao on 2022/5/10 16:48 - */ -public abstract class TypeSerializer extends JsonSerializer { - - public abstract String getStr(); - - @Override - public void serialize(T value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { - gen.writeString(getStr() + value); - } - - @Override - public void serializeWithType( - T value, - JsonGenerator g, - SerializerProvider provider, - com.fasterxml.jackson.databind.jsontype.TypeSerializer typeSer) - throws IOException { - serialize(value, g, provider); - } -} diff --git a/src/main/java/com/deep/crow/json/Mapper.java b/src/main/java/com/deep/crow/json/Mapper.java new file mode 100644 index 0000000..08b9035 --- /dev/null +++ b/src/main/java/com/deep/crow/json/Mapper.java @@ -0,0 +1,217 @@ +package com.deep.crow.json; + +import com.deep.crow.json.deserializer.*; +import com.deep.crow.json.serializer.*; +import com.deep.crow.json.symbol.Symbol; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +public class Mapper implements Map { + + /** + * 自身的key + */ + private final String key; + + /** + * 自身的value + */ + private Object value; + + /** + * 前缀 + */ + private String prefix; + + /** + * 后缀 + */ + private String suffix; + + /** + * 表示map的key仅用作表示索引位置,没有具体的展示作用,这在集合和数组中会使用到 + */ + boolean isIndexKey; + + Map map = new HashMap<>(); + + public Mapper(String key, Object value, String prefix, String suffix, boolean isIndexKey) { + this.key = key; + this.value = value; + this.prefix = prefix; + this.suffix = suffix; + this.isIndexKey = isIndexKey; + } + + public Mapper(String key, Object value, boolean isIndexKey) { + this.key = key; + this.value = value; + this.isIndexKey = isIndexKey; + } + + public Object getValue() { + return value; + } + + public Object getParseValue() { + if (isEmpty()) { + return value; + } + StringBuilder builder = new StringBuilder(); + for (Mapper mapper : map.values()) { + builder.append(mapper.toString()).append(Symbol.COMMA); + } + builder.deleteCharAt(builder.length() - 1); + + if (suffix == null || prefix == null) { + return builder.toString(); + } + return prefix + builder + suffix; + } + + public void setValue(Object value) { + this.value = value; + } + + static Map, JsonSerializer> mapSerializer = new HashMap<>(); + + static Map, JsonDeserializer> mapDeserializer = new HashMap<>(); + + static { + mapSerializer.put(Boolean.class, new BooleanSerializer()); + mapSerializer.put(Byte.class, new ByteSerializer()); + mapSerializer.put(Character.class, new CharacterSerializer()); + mapSerializer.put(CharSequence.class, new CharSequenceSerializer()); + mapSerializer.put(Double.class, new DoubleSerializer()); + mapSerializer.put(Float.class, new FloatSerializer()); + mapSerializer.put(Integer.class, new IntegerSerializer()); + mapSerializer.put(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + mapSerializer.put(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); + mapSerializer.put(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss.SSS"))); + mapSerializer.put(Long.class, new LongSerializer()); + mapSerializer.put(Short.class, new ShortSerializer()); + mapDeserializer.put(Boolean.class, new BooleanDeserializer()); + mapDeserializer.put(Byte.class, new ByteDeserializer()); + mapDeserializer.put(Character.class, new CharacterDeserializer()); + mapDeserializer.put(CharSequence.class, new CharSequenceDeserializer()); + mapDeserializer.put(Double.class, new DoubleDeserializer()); + mapDeserializer.put(Float.class, new FloatDeserializer()); + mapDeserializer.put(Integer.class, new IntegerDeserializer()); + mapDeserializer.put(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + mapDeserializer.put(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); + mapDeserializer.put(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss.SSS"))); + mapDeserializer.put(Long.class, new LongDeserializer()); + mapDeserializer.put(Short.class, new ShortDeserializer()); + } + + @SuppressWarnings("unchecked") + public static JsonSerializer getSerializer(Class cls) { + return (JsonSerializer) get(cls, mapSerializer); + } + + @SuppressWarnings("unchecked") + public static JsonDeserializer getDeserializer(Class cls) { + return (JsonDeserializer) get(cls, mapDeserializer); + } + + private static Object get(Class cls, Map map) { + Object o = map.get(cls); + Class s = cls.getSuperclass(); + while (o == null && s != null && s.getSuperclass() != null) { + s = s.getSuperclass(); + o = map.get(s); + if (o != null) { + break; + } + } + + Class[] interfaces = cls.getInterfaces(); + while (o == null && interfaces.length > 0) { + for (Class i : interfaces) { + o = get(i, map); + if (o != null) { + break; + } + } + if (o != null) { + break; + } + } + return o; + } + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + @Override + public Mapper get(Object key) { + return map.get(key); + } + + @Override + public Mapper put(String key, Mapper value) { + return map.put(key, value); + } + + @Override + public Mapper remove(Object key) { + return map.remove(key); + } + + @Override + public void putAll(Map m) { + map.putAll(m); + } + + @Override + public void clear() { + map.clear(); + } + + @Override + public Set keySet() { + return map.keySet(); + } + + @Override + public Collection values() { + return map.values(); + } + + @Override + public Set> entrySet() { + return map.entrySet(); + } + + @Override + public String toString() { + String s; + if (key == null || isIndexKey) { + s = getParseValue().toString(); + } else { + s = Symbol.QUOTES + key + Symbol.QUOTES + Symbol.COLON + getParseValue(); + } + return s; + } +} diff --git a/src/main/java/com/deep/crow/jackson/deserializer/BooleanDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/BooleanDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/BooleanDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/BooleanDeserializer.java index 649e11a..e55b7c0 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/BooleanDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/BooleanDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Boolean 类型反序列化 diff --git a/src/main/java/com/deep/crow/jackson/deserializer/ByteDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/ByteDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/ByteDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/ByteDeserializer.java index ed49a0c..ee3d608 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/ByteDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/ByteDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Byte 类型反序列化 diff --git a/src/main/java/com/deep/crow/json/deserializer/CharSequenceDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/CharSequenceDeserializer.java new file mode 100644 index 0000000..d00d2d6 --- /dev/null +++ b/src/main/java/com/deep/crow/json/deserializer/CharSequenceDeserializer.java @@ -0,0 +1,27 @@ +package com.deep.crow.json.deserializer; + +/** + * String 类型反序列化 + * + * @author Create by liuwenhao on 2022/5/10 16:33 + */ +public class CharSequenceDeserializer extends TypeDeserializer { + + String type = "java.lang.CharSequence"; + + @Override + public String getType() { + return type; + } + + @Override + public String getResult(String s) { + return s; + } + + @Override + public CharSequence deserialize(String str) { + String text = str.substring(1, str.length() - 1); + return super.deserialize(text); + } +} diff --git a/src/main/java/com/deep/crow/jackson/deserializer/CharacterDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/CharacterDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/CharacterDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/CharacterDeserializer.java index c73bcc1..121d040 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/CharacterDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/CharacterDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Character 类型反序列化 diff --git a/src/main/java/com/deep/crow/jackson/deserializer/DoubleDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/DoubleDeserializer.java similarity index 81% rename from src/main/java/com/deep/crow/jackson/deserializer/DoubleDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/DoubleDeserializer.java index aa25a43..d652cc1 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/DoubleDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/DoubleDeserializer.java @@ -1,7 +1,7 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** - * Integer 类型序列化 + * Double 类型序列化 * * @author Create by liuwenhao on 2022/5/10 16:52 */ diff --git a/src/main/java/com/deep/crow/jackson/deserializer/FloatDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/FloatDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/FloatDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/FloatDeserializer.java index 33f1ca8..55187b1 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/FloatDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/FloatDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Float 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/deserializer/IntegerDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/IntegerDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/IntegerDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/IntegerDeserializer.java index 05d5c3e..7716859 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/IntegerDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/IntegerDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Integer 类型序列化 diff --git a/src/main/java/com/deep/crow/json/deserializer/JsonDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/JsonDeserializer.java new file mode 100644 index 0000000..ba8552c --- /dev/null +++ b/src/main/java/com/deep/crow/json/deserializer/JsonDeserializer.java @@ -0,0 +1,14 @@ +package com.deep.crow.json.deserializer; + +/** + * 反序列化器 + */ +public interface JsonDeserializer { + + /** + * 反序列化操作 + * + * @param str 读取数据 + */ + T deserialize(String str); +} diff --git a/src/main/java/com/deep/crow/jackson/deserializer/LocalDateDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/LocalDateDeserializer.java similarity index 93% rename from src/main/java/com/deep/crow/jackson/deserializer/LocalDateDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/LocalDateDeserializer.java index 314fc5d..30951e5 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/LocalDateDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/LocalDateDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; import java.time.LocalDate; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/com/deep/crow/jackson/deserializer/LocalDateTimeDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/LocalDateTimeDeserializer.java similarity index 93% rename from src/main/java/com/deep/crow/jackson/deserializer/LocalDateTimeDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/LocalDateTimeDeserializer.java index d087702..3b1c8ba 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/LocalDateTimeDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/LocalDateTimeDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/com/deep/crow/jackson/deserializer/LocalTimeDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/LocalTimeDeserializer.java similarity index 93% rename from src/main/java/com/deep/crow/jackson/deserializer/LocalTimeDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/LocalTimeDeserializer.java index 3530712..650d9c5 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/LocalTimeDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/LocalTimeDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; import java.time.LocalTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/com/deep/crow/jackson/deserializer/LongDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/LongDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/LongDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/LongDeserializer.java index 0a0800d..193f0f3 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/LongDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/LongDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Long类型反序列化 diff --git a/src/main/java/com/deep/crow/jackson/deserializer/ShortDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/ShortDeserializer.java similarity index 88% rename from src/main/java/com/deep/crow/jackson/deserializer/ShortDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/ShortDeserializer.java index 2cbf50e..ac9a6b1 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/ShortDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/ShortDeserializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; /** * Short 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/deserializer/TypeDeserializer.java b/src/main/java/com/deep/crow/json/deserializer/TypeDeserializer.java similarity index 53% rename from src/main/java/com/deep/crow/jackson/deserializer/TypeDeserializer.java rename to src/main/java/com/deep/crow/json/deserializer/TypeDeserializer.java index 91f2a13..c555d9e 100644 --- a/src/main/java/com/deep/crow/jackson/deserializer/TypeDeserializer.java +++ b/src/main/java/com/deep/crow/json/deserializer/TypeDeserializer.java @@ -1,10 +1,7 @@ -package com.deep.crow.jackson.deserializer; +package com.deep.crow.json.deserializer; import com.deep.crow.exception.CrowException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import java.io.IOException; + import java.time.format.DateTimeParseException; /** @@ -12,21 +9,20 @@ * * @author Create by liuwenhao on 2022/5/10 16:36 */ -public abstract class TypeDeserializer extends JsonDeserializer { +public abstract class TypeDeserializer implements JsonDeserializer { public abstract String getType(); public abstract T getResult(String s); @Override - public T deserialize(JsonParser p, DeserializationContext context) throws IOException { - String text = p.getText(); + public T deserialize(String str) { int length = getType().length(); - String type = text.substring(0, length); + String type = str.substring(0, length); if (!getType().equals(type)) { throw CrowException.exception("类型映射错误 -- {}", getType()); } - String value = text.substring(type.length()); + String value = str.substring(type.length()); try { return getResult(value); } catch (DateTimeParseException e) { diff --git a/src/main/java/com/deep/crow/json/element/ArrayElement.java b/src/main/java/com/deep/crow/json/element/ArrayElement.java new file mode 100644 index 0000000..d9a1d94 --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/ArrayElement.java @@ -0,0 +1,59 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; +import com.deep.crow.json.Mapper; +import com.deep.crow.json.symbol.Symbol; + +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; + +/** + * 解析数组类型 + */ +public class ArrayElement implements Element { + + @Override + public boolean isSupport(Type type) { + if (Objects.isNull(type) || type instanceof ParameterizedType) { + return false; + } + return getCls(type).isArray(); + } + + @Override + public Mapper serializer(Type type, Object o, String key, boolean isIndexKey) { + Object[] arr = (Object[]) o; + if (!(type instanceof GenericArrayType)) { + throw CrowException.exception("类型不匹配"); + } + GenericArrayType genericArrayType = (GenericArrayType) type; + Type componentType = genericArrayType.getGenericComponentType(); + Mapper mapper = new Mapper(key, o, Symbol.LEFT_BRACKET, Symbol.RIGHT_BRACKET, isIndexKey); + for (int i = 0; i < arr.length; i++) { + Object obj = arr[i]; + String s = String.valueOf(i); + Element element = Elements.getElement(obj.getClass()); + Mapper serializer = element.serializer(componentType, obj, s, true); + mapper.put(s, serializer); + } + return mapper; + } + + @Override + @SuppressWarnings("unchecked") + public T deserializer(Mapper mapper, Type type) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; + Element element = Elements.getElement(actualTypeArgument); + List values = new ArrayList<>(mapper.values()); + Object[] o = new Object[values.size()]; + for (int i = 0; i < values.size(); i++) { + Mapper m = values.get(i); + Object deserializer = element.deserializer(m, actualTypeArgument); + o[i] = deserializer; + } + return (T) o; + } +} diff --git a/src/main/java/com/deep/crow/json/element/Element.java b/src/main/java/com/deep/crow/json/element/Element.java new file mode 100644 index 0000000..f93aecb --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/Element.java @@ -0,0 +1,102 @@ +package com.deep.crow.json.element; + +import com.deep.crow.json.Mapper; +import com.deep.crow.type.ParameterizedTypeImpl; + +import java.lang.reflect.*; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 类型元素,代表Json中可解析的元素类型 + */ +public interface Element { + + /** + * 是否是可解析的类型 + * + * @param type 类型 + * @return 是否可以解析 + */ + boolean isSupport(Type type); + + /** + * 序列化 + * + * @param o 待序列化的对象 + * @param key key + */ + Mapper serializer(Type type, Object o, String key, boolean isIndexKey); + + /** + * 反序列化操作 + * + * @param mapper 可反序列化的映射对象 + * @param type 反序列化的目标类型 + * @return 序列化后的对象 + */ + T deserializer(Mapper mapper, Type type); + + default Class getCls(Type type) { + if (type instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Type ownerType = parameterizedType.getRawType(); + return (Class) ownerType; + } + + if (type instanceof TypeVariable) { + TypeVariable variable = (TypeVariable) type; + return (Class) variable.getGenericDeclaration(); + } + + return (Class) type; + } + + /** + * @param type 类的类型 + * @param field 类中字段的类型 + * @return 获取字段的实际类型 + */ + @SuppressWarnings("all") + default Type getFieldType(Type type, Field field) { + Type genericType = field.getGenericType(); + if (!(type instanceof ParameterizedType)) { + return genericType; + } + // 获取类的泛型 + ParameterizedType parameterizedType = (ParameterizedType) type; + Type[] arguments = parameterizedType.getActualTypeArguments(); + Class cls = getCls(type); + TypeVariable>[] parameters = cls.getTypeParameters(); + List typeNames = Arrays.stream(parameters).map(TypeVariable::getName).collect(Collectors.toList()); + // 获取字段的泛型 + // 如果字段本身是参数化类型 + if (genericType instanceof ParameterizedType) { + List types = new LinkedList<>(); + ParameterizedType fieldParameterizedType = (ParameterizedType) genericType; + Type[] fieldTypeArguments = fieldParameterizedType.getActualTypeArguments(); + Class rawType = (Class) fieldParameterizedType.getRawType(); + // fieldTypeArguments 的顺序就是字段中泛型的顺序 + for (Type typeArgument : fieldTypeArguments) { + String typeName = typeArgument.getTypeName(); + if (!typeNames.contains(typeName)) { + types.add(typeArgument); + } else { + int i = typeNames.indexOf(typeName); + types.add(arguments[i]); + } + } + return ParameterizedTypeImpl.make(rawType, types.toArray(new Type[0])); + } + // 如果字段本身就是泛型,但实际类型是class + String genericTypeTypeName = genericType.getTypeName(); + boolean contains = typeNames.contains(genericTypeTypeName); + if (contains) { + int i = typeNames.indexOf(genericTypeTypeName); + return arguments[i]; + } + return genericType; + } +} diff --git a/src/main/java/com/deep/crow/json/element/Elements.java b/src/main/java/com/deep/crow/json/element/Elements.java new file mode 100644 index 0000000..adafb14 --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/Elements.java @@ -0,0 +1,36 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; + +import java.lang.reflect.Type; +import java.util.LinkedList; +import java.util.List; + +/** + * + */ +public class Elements { + + static final List ELEMENT = new LinkedList<>(); + + private Elements() { + } + + static { + ELEMENT.add(new SimpleElement()); + ELEMENT.add(new ArrayElement()); + ELEMENT.add(new IterableElement()); + ELEMENT.add(new MapElement()); + ELEMENT.add(new ObjectElement()); + } + + public static Element getElement(Type type) { + for (Element e : ELEMENT) { + boolean support = e.isSupport(type); + if (support){ + return e; + } + } + throw new CrowException("不支持的类型"); + } +} diff --git a/src/main/java/com/deep/crow/json/element/IterableElement.java b/src/main/java/com/deep/crow/json/element/IterableElement.java new file mode 100644 index 0000000..ef2b808 --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/IterableElement.java @@ -0,0 +1,55 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; +import com.deep.crow.json.Mapper; +import com.deep.crow.json.symbol.Symbol; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; + +public class IterableElement implements Element { + + @Override + public boolean isSupport(Type type) { + if (Objects.isNull(type)) { + return false; + } + Class cls = getCls(type); + return Iterable.class.isAssignableFrom(cls); + } + + @Override + public Mapper serializer(Type type, Object o, String key, boolean isIndexKey) { + Iterable iterable = (Iterable) o; + if (!(type instanceof ParameterizedType)) { + throw CrowException.exception("类型不匹配"); + } + ParameterizedType parameterizedType = (ParameterizedType) type; + Type argument = parameterizedType.getActualTypeArguments()[0]; + Mapper mapper = new Mapper(key, o, Symbol.LEFT_BRACKET, Symbol.RIGHT_BRACKET, isIndexKey); + int i = 0; + for (Object obj : iterable) { + String s = String.valueOf(i); + Element element = Elements.getElement(obj.getClass()); + Mapper serializer = element.serializer(argument, obj, s, true); + mapper.put(s, serializer); + i++; + } + return mapper; + } + + @Override + @SuppressWarnings("unchecked") + public T deserializer(Mapper mapper, Type type) { + List list = new ArrayList<>(); + ParameterizedType parameterizedType = (ParameterizedType) type; + Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; + Element element = Elements.getElement(actualTypeArgument); + for (Mapper m : mapper.values()) { + Object deserializer = element.deserializer(m, actualTypeArgument); + list.add(deserializer); + } + return (T) list; + } +} diff --git a/src/main/java/com/deep/crow/json/element/MapElement.java b/src/main/java/com/deep/crow/json/element/MapElement.java new file mode 100644 index 0000000..2cf7a3e --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/MapElement.java @@ -0,0 +1,54 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; +import com.deep.crow.json.Mapper; +import com.deep.crow.json.symbol.Symbol; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +public class MapElement implements Element { + @Override + public boolean isSupport(Type type) { + Class cls = getCls(type); + return Map.class.isAssignableFrom(cls); + } + + @Override + public Mapper serializer(Type type, Object o, String key, boolean isIndexKey) { + Map map = (Map) o; + if (!(type instanceof ParameterizedType)) { + throw CrowException.exception("类型不匹配"); + } + ParameterizedType parameterizedType = (ParameterizedType) type; + Type argument = parameterizedType.getActualTypeArguments()[1]; + Mapper mapper = new Mapper(key, o, Symbol.LEFT_BRACES, Symbol.RIGHT_BRACES, isIndexKey); + for (Map.Entry entry : map.entrySet()) { + Object entryKey = entry.getKey(); + Object entryValue = entry.getValue(); + String s = String.valueOf(entryKey); + Element element = Elements.getElement(entryValue.getClass()); + Mapper serializer = element.serializer(argument, entryValue, s, false); + mapper.put(s, serializer); + } + return mapper; + } + + @Override + @SuppressWarnings("unchecked") + public T deserializer(Mapper mapper, Type type) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Type valueType = parameterizedType.getActualTypeArguments()[1]; + Map map = new HashMap<>(); + for (Map.Entry entry : mapper.entrySet()) { + String key = entry.getKey(); + Mapper value = entry.getValue(); + Element element = Elements.getElement(valueType); + Object deserializer = element.deserializer(value, valueType); + map.put(key, deserializer); + } + return (T) map; + } +} diff --git a/src/main/java/com/deep/crow/json/element/ObjectElement.java b/src/main/java/com/deep/crow/json/element/ObjectElement.java new file mode 100644 index 0000000..0edf831 --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/ObjectElement.java @@ -0,0 +1,85 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; +import com.deep.crow.json.Mapper; +import com.deep.crow.json.symbol.Symbol; +import com.deep.crow.util.ClassUtil; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.*; +import java.util.List; +import java.util.Objects; + +public class ObjectElement implements Element { + + @Override + public boolean isSupport(Type type) { + if (Objects.isNull(type)) { + return false; + } + Class cls = getCls(type); + return !(ClassUtil.isPrimitive(cls) || CharSequence.class.isAssignableFrom(cls)); + } + + @Override + public Mapper serializer(Type type, Object o, String key, boolean isIndexKey) { + Class cls = o.getClass(); + String typeName = type.getTypeName(); + if (type instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) type; + typeName = parameterizedType.getRawType().getTypeName(); + } + if (!typeName.equals(cls.getTypeName())) { + throw CrowException.exception("类型不匹配"); + } + List fields = ClassUtil.getFieldsByGetterAndSetter(cls); + if (fields.isEmpty()) { + return new Mapper(key, o, isIndexKey); + } + Mapper mapper = new Mapper(key, o, Symbol.LEFT_BRACES, Symbol.RIGHT_BRACES, isIndexKey); + try { + for (Field f : fields) { + String name = f.getName(); + PropertyDescriptor descriptor = new PropertyDescriptor(name, cls); + Method readMethod = descriptor.getReadMethod(); + Object invoke = readMethod.invoke(o); + Element element = Elements.getElement(invoke.getClass()); + Mapper serializer = element.serializer(getFieldType(type, f), invoke, name, false); + mapper.put(name, serializer); + } + return mapper; + } catch (Exception e) { + throw CrowException.exception(e); + } + } + + @Override + @SuppressWarnings("unchecked") + public T deserializer(Mapper mapper, Type type) { + Class cls = getCls(type); + List fields = ClassUtil.getFieldsByGetterAndSetter(cls); + T t; + try { + t = (T) cls.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw CrowException.exception(e); + } + if (!fields.isEmpty()) { + try { + for (Field f : fields) { + Mapper entryMapper = mapper.get(f.getName()); + Type fieldType = getFieldType(type, f); + Element element = Elements.getElement(fieldType); + Object o = element.deserializer(entryMapper, fieldType); + PropertyDescriptor descriptor = new PropertyDescriptor(f.getName(), cls); + Method writeMethod = descriptor.getWriteMethod(); + writeMethod.invoke(t, o); + } + } catch (Exception e) { + throw CrowException.exception(e); + } + } + return t; + } + +} diff --git a/src/main/java/com/deep/crow/json/element/SimpleElement.java b/src/main/java/com/deep/crow/json/element/SimpleElement.java new file mode 100644 index 0000000..9146597 --- /dev/null +++ b/src/main/java/com/deep/crow/json/element/SimpleElement.java @@ -0,0 +1,48 @@ +package com.deep.crow.json.element; + +import com.deep.crow.exception.CrowException; +import com.deep.crow.json.Mapper; +import com.deep.crow.json.deserializer.JsonDeserializer; +import com.deep.crow.json.serializer.JsonSerializer; +import com.deep.crow.util.ClassUtil; + +import java.lang.reflect.Type; +import java.util.Objects; + +/** + * 针对基本数据类型和串类型的序列化操作 + */ +public class SimpleElement implements Element { + + @Override + public boolean isSupport(Type type) { + if (Objects.isNull(type)) { + return false; + } + Class cls = getCls(type); + return ClassUtil.isPrimitive(cls) || CharSequence.class.isAssignableFrom(cls); + } + + @Override + public Mapper serializer(Type type, Object o, String key, boolean isIndexKey) { + Class cls = o.getClass(); + if (!cls.getTypeName().equals(type.getTypeName())) { + throw CrowException.exception("类型不匹配"); + } + JsonSerializer serializer = Mapper.getSerializer(cls); + StringBuilder builder = new StringBuilder(); + serializer.serialize(o, builder); + return new Mapper(key, builder.toString(), isIndexKey); + } + + @Override + @SuppressWarnings("unchecked") + public T deserializer(Mapper mapper, Type type) { + Object value = mapper.getValue(); + String s = String.valueOf(value); + Class cls = getCls(type); + JsonDeserializer deserializer = Mapper.getDeserializer(cls); + return (T) deserializer.deserialize(s); + } + +} diff --git a/src/main/java/com/deep/crow/jackson/serializer/BooleanSerializer.java b/src/main/java/com/deep/crow/json/serializer/BooleanSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/BooleanSerializer.java rename to src/main/java/com/deep/crow/json/serializer/BooleanSerializer.java index 21dd43b..7a309f4 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/BooleanSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/BooleanSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Boolean 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/serializer/ByteSerializer.java b/src/main/java/com/deep/crow/json/serializer/ByteSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/ByteSerializer.java rename to src/main/java/com/deep/crow/json/serializer/ByteSerializer.java index a0342f1..9eba48b 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/ByteSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/ByteSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Byte 类型序列化 diff --git a/src/main/java/com/deep/crow/json/serializer/CharSequenceSerializer.java b/src/main/java/com/deep/crow/json/serializer/CharSequenceSerializer.java new file mode 100644 index 0000000..c2df7f9 --- /dev/null +++ b/src/main/java/com/deep/crow/json/serializer/CharSequenceSerializer.java @@ -0,0 +1,25 @@ +package com.deep.crow.json.serializer; + +import com.deep.crow.json.symbol.Symbol; + +/** + * Boolean 类型序列化 + * + * @author Create by liuwenhao on 2022/5/10 16:52 + */ +public class CharSequenceSerializer extends TypeSerializer { + + String str = "java.lang.CharSequence"; + + @Override + public String getStr() { + return str; + } + + @Override + public void serialize(CharSequence value, StringBuilder builder) { + builder.append(Symbol.QUOTES); + super.serialize(value, builder); + builder.append(Symbol.QUOTES); + } +} diff --git a/src/main/java/com/deep/crow/jackson/serializer/CharacterSerializer.java b/src/main/java/com/deep/crow/json/serializer/CharacterSerializer.java similarity index 86% rename from src/main/java/com/deep/crow/jackson/serializer/CharacterSerializer.java rename to src/main/java/com/deep/crow/json/serializer/CharacterSerializer.java index de9a8ee..a5fc159 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/CharacterSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/CharacterSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Character 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/serializer/DoubleSerializer.java b/src/main/java/com/deep/crow/json/serializer/DoubleSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/DoubleSerializer.java rename to src/main/java/com/deep/crow/json/serializer/DoubleSerializer.java index 994ec53..0c51b78 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/DoubleSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/DoubleSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Double 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/serializer/FloatSerializer.java b/src/main/java/com/deep/crow/json/serializer/FloatSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/FloatSerializer.java rename to src/main/java/com/deep/crow/json/serializer/FloatSerializer.java index b0a8da5..c426b87 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/FloatSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/FloatSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Float 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/serializer/IntegerSerializer.java b/src/main/java/com/deep/crow/json/serializer/IntegerSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/IntegerSerializer.java rename to src/main/java/com/deep/crow/json/serializer/IntegerSerializer.java index 22b9324..6af1dfe 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/IntegerSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/IntegerSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Integer 类型序列化 diff --git a/src/main/java/com/deep/crow/json/serializer/JsonSerializer.java b/src/main/java/com/deep/crow/json/serializer/JsonSerializer.java new file mode 100644 index 0000000..e116493 --- /dev/null +++ b/src/main/java/com/deep/crow/json/serializer/JsonSerializer.java @@ -0,0 +1,15 @@ +package com.deep.crow.json.serializer; + +/** + * 序列化器 + */ +public interface JsonSerializer { + + /** + * 序列化操作 + * + * @param value 值 + * @param builder 存储序列化值的对象 + */ + void serialize(T value, StringBuilder builder); +} diff --git a/src/main/java/com/deep/crow/jackson/serializer/LocalDateSerializer.java b/src/main/java/com/deep/crow/json/serializer/LocalDateSerializer.java similarity index 62% rename from src/main/java/com/deep/crow/jackson/serializer/LocalDateSerializer.java rename to src/main/java/com/deep/crow/json/serializer/LocalDateSerializer.java index 6e9ee84..17a2d53 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/LocalDateSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/LocalDateSerializer.java @@ -1,8 +1,5 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -27,9 +24,8 @@ public String getStr() { } @Override - public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { + public void serialize(LocalDate value, StringBuilder builder) { String format = value.format(localDatePattern); - gen.writeString(getStr() + format); + builder.append(getStr()).append(format); } } diff --git a/src/main/java/com/deep/crow/jackson/serializer/LocalDateTimeSerializer.java b/src/main/java/com/deep/crow/json/serializer/LocalDateTimeSerializer.java similarity index 63% rename from src/main/java/com/deep/crow/jackson/serializer/LocalDateTimeSerializer.java rename to src/main/java/com/deep/crow/json/serializer/LocalDateTimeSerializer.java index 8cedde4..d530b7f 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/LocalDateTimeSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/LocalDateTimeSerializer.java @@ -1,8 +1,5 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -27,9 +24,8 @@ public String getStr() { } @Override - public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { + public void serialize(LocalDateTime value, StringBuilder builder) { String format = value.format(localDateTimePattern); - gen.writeString(getStr() + format); + builder.append(getStr()).append(format); } } diff --git a/src/main/java/com/deep/crow/jackson/serializer/LocalTimeSerializer.java b/src/main/java/com/deep/crow/json/serializer/LocalTimeSerializer.java similarity index 62% rename from src/main/java/com/deep/crow/jackson/serializer/LocalTimeSerializer.java rename to src/main/java/com/deep/crow/json/serializer/LocalTimeSerializer.java index 703b88d..8054ff4 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/LocalTimeSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/LocalTimeSerializer.java @@ -1,8 +1,5 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -27,9 +24,8 @@ public String getStr() { } @Override - public void serialize(LocalTime value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { + public void serialize(LocalTime value, StringBuilder builder) { String format = value.format(localTimePattern); - gen.writeString(getStr() + format); + builder.append(getStr()).append(format); } } diff --git a/src/main/java/com/deep/crow/jackson/serializer/LongSerializer.java b/src/main/java/com/deep/crow/json/serializer/LongSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/LongSerializer.java rename to src/main/java/com/deep/crow/json/serializer/LongSerializer.java index ecbccce..331cbd0 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/LongSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/LongSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Long 类型序列化 diff --git a/src/main/java/com/deep/crow/jackson/serializer/ShortSerializer.java b/src/main/java/com/deep/crow/json/serializer/ShortSerializer.java similarity index 85% rename from src/main/java/com/deep/crow/jackson/serializer/ShortSerializer.java rename to src/main/java/com/deep/crow/json/serializer/ShortSerializer.java index 3ec64f0..17d9e04 100644 --- a/src/main/java/com/deep/crow/jackson/serializer/ShortSerializer.java +++ b/src/main/java/com/deep/crow/json/serializer/ShortSerializer.java @@ -1,4 +1,4 @@ -package com.deep.crow.jackson.serializer; +package com.deep.crow.json.serializer; /** * Short 类型序列化 diff --git a/src/main/java/com/deep/crow/json/serializer/TypeSerializer.java b/src/main/java/com/deep/crow/json/serializer/TypeSerializer.java new file mode 100644 index 0000000..0d0f400 --- /dev/null +++ b/src/main/java/com/deep/crow/json/serializer/TypeSerializer.java @@ -0,0 +1,16 @@ +package com.deep.crow.json.serializer; + +/** + * 基本数据类型序列化 + * + * @author Create by liuwenhao on 2022/5/10 16:48 + */ +public abstract class TypeSerializer implements JsonSerializer { + + public abstract String getStr(); + + @Override + public void serialize(T value, StringBuilder builder) { + builder.append(getStr()).append(value); + } +} diff --git a/src/main/java/com/deep/crow/json/symbol/Symbol.java b/src/main/java/com/deep/crow/json/symbol/Symbol.java new file mode 100644 index 0000000..b776d51 --- /dev/null +++ b/src/main/java/com/deep/crow/json/symbol/Symbol.java @@ -0,0 +1,17 @@ +package com.deep.crow.json.symbol; + +/** + * 用于表示进行拼接的符号和执行拼接的操作 + */ +@SuppressWarnings("all") +public interface Symbol { + + String RIGHT_BRACKET = "]"; + String RIGHT_BRACES = "}"; + String QUOTES = "\""; + String LEFT_BRACKET = "["; + String LEFT_BRACES = "{"; + String COMMA = ","; + String COLON = ":"; + +} diff --git a/src/main/java/com/deep/crow/task/mix/MixTask.java b/src/main/java/com/deep/crow/task/mix/MixTask.java index 72b3c69..24cd31d 100644 --- a/src/main/java/com/deep/crow/task/mix/MixTask.java +++ b/src/main/java/com/deep/crow/task/mix/MixTask.java @@ -38,17 +38,6 @@ interface MixTask extends Task { */ void removePreName(String preName); - /** - * 是否是尾结点 - * - * @return boolean - * @author liuwenhao - * @date 2022/6/18 17:10 - * @deprecated when deprecated - */ - @Deprecated - boolean isTail(); - /** * 声明当前节点不再是尾结点 * diff --git a/src/main/java/com/deep/crow/task/mix/RunnableMixTask.java b/src/main/java/com/deep/crow/task/mix/RunnableMixTask.java index da28e6c..a8b29a2 100644 --- a/src/main/java/com/deep/crow/task/mix/RunnableMixTask.java +++ b/src/main/java/com/deep/crow/task/mix/RunnableMixTask.java @@ -36,11 +36,6 @@ public void removePreName(String preName) { this.preName.remove(preName); } - @Override - public boolean isTail() { - return isTail; - } - @Override public void cancelTail() { this.isTail = false; diff --git a/src/main/java/com/deep/crow/type/CrowTypeReference.java b/src/main/java/com/deep/crow/type/CrowTypeReference.java deleted file mode 100644 index a7309d6..0000000 --- a/src/main/java/com/deep/crow/type/CrowTypeReference.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.deep.crow.type; - -import com.fasterxml.jackson.core.type.TypeReference; -import java.lang.reflect.Type; - -/** - * 协助泛型检索 - * - * @author Create by liuwenhao on 2022/6/2 15:32 - */ -public class CrowTypeReference extends TypeReference { - Type type; - - private CrowTypeReference(Type type) { - super(); - this.type = type; - } - - public static CrowTypeReference make(Type type) { - return new CrowTypeReference<>(type); - } - - @Override - public Type getType() { - return type; - } -} diff --git a/src/main/java/com/deep/crow/util/ClassUtil.java b/src/main/java/com/deep/crow/util/ClassUtil.java new file mode 100644 index 0000000..9fa1a93 --- /dev/null +++ b/src/main/java/com/deep/crow/util/ClassUtil.java @@ -0,0 +1,91 @@ +package com.deep.crow.util; + +import com.deep.crow.exception.CrowException; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 操作类对象的相关工具类 + */ +public class ClassUtil { + + static List> simple = new LinkedList<>(); + + static { + simple.add(Integer.class); + simple.add(Float.class); + simple.add(Character.class); + simple.add(Long.class); + simple.add(Double.class); + simple.add(Short.class); + simple.add(Boolean.class); + simple.add(Byte.class); + } + + private ClassUtil() { + + } + + /** + * 判断类是否是基本数据类型或是其包装类型 + * + * @param cls 要判断的类型 + * @return 是否是基本数据类型 + */ + public static boolean isPrimitive(Class cls) { + return cls.isPrimitive() || simple.contains(cls); + } + + /** + * 获取类中带有get方和set方法的属性 + * + * @param cls 类型 + * @return 属性集合 + */ + public static List getFieldsByGetterAndSetter(Class cls) { + List fields = new LinkedList<>(); + List allField = getAllField(cls); + for (Field f : allField) { + try { + new PropertyDescriptor(f.getName(), cls); + fields.add(f); + } catch (Exception e) { + // non + } + } + return fields; + } + + /** + * 获取类中所有的属性,包括自身的和从父类继承的,还有各种权限的,但不包括静态的 + * + * @param cls 类 + * @return 属性集 合 + */ + public static List getAllField(Class cls) { + List allFields = new LinkedList<>(); + Class searchType = cls; + while (searchType != null) { + Field[] fields = searchType.getDeclaredFields(); + allFields.addAll(Arrays.asList(fields)); + searchType = searchType.getSuperclass(); + } + return allFields.stream() + .filter(f -> !Modifier.isStatic(f.getModifiers())) + .collect(Collectors.toList()); + } + + public static T newInstance(Class cls) { + try { + return cls.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw CrowException.exception(e); + } + } +} diff --git a/src/main/java/com/deep/crow/util/JsonUtil.java b/src/main/java/com/deep/crow/util/JsonUtil.java new file mode 100644 index 0000000..c2b80e2 --- /dev/null +++ b/src/main/java/com/deep/crow/util/JsonUtil.java @@ -0,0 +1,38 @@ +package com.deep.crow.util; + +import com.deep.crow.json.Mapper; +import com.deep.crow.json.element.Element; +import com.deep.crow.json.element.Elements; + +import java.lang.reflect.Type; + +public class JsonUtil { + + private JsonUtil() { + } + + /** + * 将某个对象转化为json + * + * @param o 要转化的对象 + * @param type o的具体类型 + * @return json串 + */ + public static Mapper objToString(Object o, Type type) { + Element element = Elements.getElement(type); + return element.serializer(type, o, null, false); + } + + /** + * 反序列haul操作 + * + * @param mapper json串 + * @param type 反序列化的类型 + * @return 结果对象 + */ + public static T jsonToObj(Mapper mapper, Type type) { + Element element = Elements.getElement(type); + return element.deserializer(mapper, type); + } + +} diff --git a/src/main/java/com/deep/crow/util/StrUtil.java b/src/main/java/com/deep/crow/util/StrUtil.java index 603a8af..ff9dcf1 100644 --- a/src/main/java/com/deep/crow/util/StrUtil.java +++ b/src/main/java/com/deep/crow/util/StrUtil.java @@ -5,6 +5,7 @@ * * @author Create by liuwenhao on 2022/4/11 18:18 */ +@SuppressWarnings("all") public class StrUtil { private StrUtil() {} diff --git a/src/main/java/com/deep/crow/util/Tuple.java b/src/main/java/com/deep/crow/util/Tuple.java index 2a18c31..3fcfc33 100644 --- a/src/main/java/com/deep/crow/util/Tuple.java +++ b/src/main/java/com/deep/crow/util/Tuple.java @@ -63,8 +63,7 @@ public final List toList() { * @date 2022/4/11 17:50 */ public int size() { - Object[] member = this.members; - Objects.requireNonNull(member); + Objects.requireNonNull(getMembers()); return members.length; } @@ -76,15 +75,14 @@ public int size() { * @date 2022/4/11 17:50 */ public boolean contains(Object value) { - Object[] member = this.members; - Objects.requireNonNull(member); + Objects.requireNonNull(getMembers()); return toList().contains(value); } @Override public int hashCode() { int result = 1; - result = 31 * result + Arrays.deepHashCode(members); + result = 31 * result + Arrays.deepHashCode(getMembers()); return result; } @@ -100,23 +98,23 @@ public boolean equals(Object obj) { return false; } Tuple other = (Tuple) obj; - return Arrays.deepEquals(members, other.members); + return Arrays.deepEquals(getMembers(), other.getMembers()); } @Override public String toString() { - return Arrays.toString(members); + return Arrays.toString(getMembers()); } @Override @SuppressWarnings("all") public Iterator iterator() { - return new TupleIter(this.members); + return new TupleIter(getMembers()); } @Override public final Spliterator spliterator() { - return Spliterators.spliterator(this.members, Spliterator.ORDERED); + return Spliterators.spliterator(getMembers(), Spliterator.ORDERED); } public static class TupleIter implements Iterable, Iterator { @@ -137,7 +135,7 @@ public TupleIter(Object array) { @Override public Iterator iterator() { - return this; + return new TupleIter<>(array); } @Override diff --git a/src/test/java/com/deep/crow/compress/IteratorCompressTest.java b/src/test/java/com/deep/crow/compress/IteratorCompressTest.java index 49a2f61..a0af480 100644 --- a/src/test/java/com/deep/crow/compress/IteratorCompressTest.java +++ b/src/test/java/com/deep/crow/compress/IteratorCompressTest.java @@ -3,7 +3,6 @@ import com.deep.crow.model.Cat; import com.deep.crow.model.User; import com.deep.crow.type.TypeBuilder; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; import org.junit.Assert; @@ -27,11 +26,10 @@ public class IteratorCompressTest { @Test public void testCompress() { - ObjectMapper objectMapper = new ObjectMapper(); IteratorCompress userCompress = - new IteratorCompress(users, TypeBuilder.list(User.class), objectMapper); + new IteratorCompress(users, TypeBuilder.list(User.class)); IteratorCompress catCompress = - new IteratorCompress(cats, TypeBuilder.list(Cat.class), objectMapper); + new IteratorCompress(cats, TypeBuilder.list(Cat.class)); User user = userCompress.compress(); Cat cat = catCompress.compress(); Assert.assertEquals("1", user.getName()); @@ -40,11 +38,10 @@ public void testCompress() { @Test public void testCheck() { - ObjectMapper objectMapper = new ObjectMapper(); IteratorCompress userCompress = - new IteratorCompress(users, TypeBuilder.list(User.class), objectMapper); + new IteratorCompress(users, TypeBuilder.list(User.class)); IteratorCompress catCompress = - new IteratorCompress(users, TypeBuilder.list(Cat.class), objectMapper); + new IteratorCompress(users, TypeBuilder.list(Cat.class)); boolean userCheck = userCompress.check(); boolean catCheck = catCompress.check(); Assert.assertTrue(userCheck); diff --git a/src/test/java/com/deep/crow/compress/MapCompressTest.java b/src/test/java/com/deep/crow/compress/MapCompressTest.java index 012457a..019ebfd 100644 --- a/src/test/java/com/deep/crow/compress/MapCompressTest.java +++ b/src/test/java/com/deep/crow/compress/MapCompressTest.java @@ -3,7 +3,6 @@ import com.deep.crow.model.Cat; import com.deep.crow.model.User; import com.deep.crow.type.TypeBuilder; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; import org.junit.Assert; @@ -28,11 +27,10 @@ public class MapCompressTest { @Test public void testCompress() { - ObjectMapper objectMapper = new ObjectMapper(); Compress userCompress = - new MapCompress(userMap, TypeBuilder.map(Integer.class, User.class), objectMapper); + new MapCompress(userMap, TypeBuilder.map(Integer.class, User.class)); Compress catCompress = - new MapCompress(catMap, TypeBuilder.map(String.class, Cat.class), objectMapper); + new MapCompress(catMap, TypeBuilder.map(String.class, Cat.class)); Map.Entry usersEntity = userCompress.compress(); Map.Entry catsEntity = catCompress.compress(); Assert.assertEquals(usersEntity.getKey(), Integer.valueOf(456)); @@ -43,11 +41,10 @@ public void testCompress() { @Test public void testCheck() { - ObjectMapper objectMapper = new ObjectMapper(); Compress userCompress = - new MapCompress(userMap, TypeBuilder.map(Integer.class, User.class), objectMapper); + new MapCompress(userMap, TypeBuilder.map(Integer.class, User.class)); Compress catCompress = - new MapCompress(catMap, TypeBuilder.map(Integer.class, Cat.class), objectMapper); + new MapCompress(catMap, TypeBuilder.map(Integer.class, Cat.class)); boolean userCheck = userCompress.check(); boolean catCheck = catCompress.check(); Assert.assertTrue(userCheck); diff --git a/src/test/java/com/deep/crow/jackson/ObjectMapperFactoryTest.java b/src/test/java/com/deep/crow/jackson/ObjectMapperFactoryTest.java deleted file mode 100644 index 9141530..0000000 --- a/src/test/java/com/deep/crow/jackson/ObjectMapperFactoryTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.deep.crow.jackson; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.time.LocalDate; -import org.junit.Assert; -import org.junit.Test; - -public class ObjectMapperFactoryTest { - - @Test - public void testIntSerialize() throws JsonProcessingException { - ObjectMapper objectMapper = ObjectMapperFactory.get(); - Integer i = 123; - String s = objectMapper.writeValueAsString(i); - Integer value = objectMapper.readValue(s, Integer.class); - Assert.assertEquals(value, i); - } - - @Test - public void testDoubleSerialize() throws JsonProcessingException { - ObjectMapper objectMapper = ObjectMapperFactory.get(); - Double i = 123.12; - String s = objectMapper.writeValueAsString(i); - Double value = objectMapper.readValue(s, Double.class); - Assert.assertEquals(value, i); - } - - @Test - public void testLocalDateSerialize() throws JsonProcessingException { - ObjectMapper objectMapper = ObjectMapperFactory.get(); - LocalDate localDate = LocalDate.now(); - String s = objectMapper.writeValueAsString(localDate); - LocalDate value = objectMapper.readValue(s, LocalDate.class); - Assert.assertEquals(value, localDate); - } - - // ... - -} diff --git a/src/test/java/com/deep/crow/json/IOPerson.java b/src/test/java/com/deep/crow/json/IOPerson.java new file mode 100644 index 0000000..a4add95 --- /dev/null +++ b/src/test/java/com/deep/crow/json/IOPerson.java @@ -0,0 +1,54 @@ +package com.deep.crow.json; + +import java.util.List; + +public class IOPerson { + + T t; + + String name; + + List list; + + public IOPerson(T t, String name, List list) { + this.t = t; + this.name = name; + this.list = list; + } + + public IOPerson() { + } + + public T getT() { + return t; + } + + public void setT(T t) { + this.t = t; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "IOPerson{" + + "t=" + t + + ", name='" + name + '\'' + + ", list=" + list + + '}'; + } +} diff --git a/src/test/java/com/deep/crow/json/IOSimpleObj.java b/src/test/java/com/deep/crow/json/IOSimpleObj.java new file mode 100644 index 0000000..9c920cc --- /dev/null +++ b/src/test/java/com/deep/crow/json/IOSimpleObj.java @@ -0,0 +1,81 @@ +package com.deep.crow.json; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +public class IOSimpleObj implements Serializable { + + String str; + + Integer integer; + + List strings; + + IOPerson ioPerson; + + Map map; + + public IOSimpleObj(String str, Integer integer, List strings, IOPerson ioPerson, Map map) { + this.str = str; + this.integer = integer; + this.strings = strings; + this.ioPerson = ioPerson; + this.map = map; + } + + public IOPerson getIoPerson() { + return ioPerson; + } + + public void setIoPerson(IOPerson ioPerson) { + this.ioPerson = ioPerson; + } + + public IOSimpleObj() { + } + + public String getStr() { + return str; + } + + public void setStr(String str) { + this.str = str; + } + + public Integer getInteger() { + return integer; + } + + public void setInteger(Integer integer) { + this.integer = integer; + } + + public List getStrings() { + return strings; + } + + public void setStrings(List strings) { + this.strings = strings; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + @Override + public String toString() { + return "IOSimpleObj{" + + "str='" + str + '\'' + + ", integer=" + integer + + ", strings=" + strings + + ", ioPerson=" + ioPerson + + ", map=" + map + + '}'; + } +} diff --git a/src/test/java/com/deep/crow/json/IOUser.java b/src/test/java/com/deep/crow/json/IOUser.java new file mode 100644 index 0000000..83ab4ad --- /dev/null +++ b/src/test/java/com/deep/crow/json/IOUser.java @@ -0,0 +1,28 @@ +package com.deep.crow.json; + +public class IOUser { + + String name; + + public IOUser(String name) { + this.name = name; + } + + public IOUser() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "IOUser{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/src/test/java/com/deep/crow/json/JsonTest.java b/src/test/java/com/deep/crow/json/JsonTest.java new file mode 100644 index 0000000..d0f7a7c --- /dev/null +++ b/src/test/java/com/deep/crow/json/JsonTest.java @@ -0,0 +1,40 @@ +package com.deep.crow.json; + +import com.deep.crow.json.element.Element; +import com.deep.crow.json.element.Elements; +import junit.framework.TestCase; + +import java.util.*; + +@SuppressWarnings("all") +public class JsonTest extends TestCase { + + public void testData() throws Exception { + + List strings = new ArrayList<>(); + strings.add(new IOUser("456")); + strings.add(new IOUser("75469")); + + List integers = new LinkedList<>(); + integers.add(5); + integers.add(7); + + IOPerson ioPerson = new IOPerson<>(13, "dhkf", integers); + + Map map = new HashMap<>(); + map.put("456", 32); + map.put("djkl", 6); + map.put("ssaa", 789); + + IOSimpleObj simpleObj = new IOSimpleObj("Str", 1527, strings, ioPerson, map); + Class objCls = simpleObj.getClass(); + Element element = Elements.getElement(objCls); + Mapper mapper = element.serializer(objCls, simpleObj, null, false); + String s = mapper.toString(); + System.out.println(s); + + IOSimpleObj o = element.deserializer(mapper, objCls); + System.out.println(o); + + } +} diff --git a/src/test/java/com/deep/crow/task/CompletionStageTest.java b/src/test/java/com/deep/crow/task/CompletionStageTest.java index 5c13a1d..1b03e98 100644 --- a/src/test/java/com/deep/crow/task/CompletionStageTest.java +++ b/src/test/java/com/deep/crow/task/CompletionStageTest.java @@ -9,6 +9,8 @@ * * @author Create by liuwenhao on 2022/4/2 16:08 */ + +@SuppressWarnings("all") public class CompletionStageTest extends TestCase { public void testCompletableFuture() throws InterruptedException { diff --git a/src/test/java/com/deep/crow/task/ThrowableTest.java b/src/test/java/com/deep/crow/task/ThrowableTest.java index a5b7984..320e531 100644 --- a/src/test/java/com/deep/crow/task/ThrowableTest.java +++ b/src/test/java/com/deep/crow/task/ThrowableTest.java @@ -7,6 +7,7 @@ import junit.framework.TestCase; /** @author Create by liuwenhao on 2022/4/7 16:09 */ +@SuppressWarnings("all") public class ThrowableTest extends TestCase { public void testThrowable() { diff --git a/src/test/java/com/deep/crow/task/mix/MixMultiTest.java b/src/test/java/com/deep/crow/task/mix/MixMultiTest.java index 6cc8183..5723383 100644 --- a/src/test/java/com/deep/crow/task/mix/MixMultiTest.java +++ b/src/test/java/com/deep/crow/task/mix/MixMultiTest.java @@ -7,6 +7,8 @@ import junit.framework.TestCase; /** graph LR A[开始] --> B --> D; A --> C; C --> D --> F; A --> E --> G; F --> G */ + +@SuppressWarnings("all") public class MixMultiTest extends TestCase { ExecutorService executorService; diff --git a/src/test/java/com/deep/crow/task/mix/RunnableMixTaskTest.java b/src/test/java/com/deep/crow/task/mix/RunnableMixTaskTest.java index 9b08e3d..fbd343d 100644 --- a/src/test/java/com/deep/crow/task/mix/RunnableMixTaskTest.java +++ b/src/test/java/com/deep/crow/task/mix/RunnableMixTaskTest.java @@ -7,6 +7,7 @@ import java.util.concurrent.TimeUnit; import junit.framework.TestCase; +@SuppressWarnings("all") public class RunnableMixTaskTest extends TestCase { public void testComplete() { diff --git a/src/test/java/com/deep/crow/task/parallel/ParallelMultiTest.java b/src/test/java/com/deep/crow/task/parallel/ParallelMultiTest.java index 0a7cfa7..da30d9b 100644 --- a/src/test/java/com/deep/crow/task/parallel/ParallelMultiTest.java +++ b/src/test/java/com/deep/crow/task/parallel/ParallelMultiTest.java @@ -1,11 +1,9 @@ package com.deep.crow.task.parallel; import com.deep.crow.MultiTools; -import com.deep.crow.exception.CrowException; import com.deep.crow.util.ThreadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; import org.junit.Assert; import org.junit.Test; @@ -14,6 +12,7 @@ * * @author Create by liuwenhao on 2022/4/2 16:08 */ +@SuppressWarnings("all") public class ParallelMultiTest { @Test @@ -29,11 +28,6 @@ public void testParallel() { System.out.println(throwable.getMessage()); return 6; }) - .add( - (Supplier) - () -> { - throw new CrowException("456"); - }) .add( () -> { try { @@ -78,7 +72,7 @@ public void testThrowable() { .add(() -> 2) .add(5, () -> 3) .add(() -> 4) - .add(() -> 5) + .add(() -> 5/0) .addThrowable( throwable -> { System.out.println(throwable.getMessage()); @@ -87,7 +81,7 @@ public void testThrowable() { 1, 5) .add(19, () -> 6) - .add(() -> 7) + .add(() -> 7/0) .add(() -> 8) .add(() -> 9) .addThrowable( diff --git a/src/test/java/com/deep/crow/task/serial/SerialMultiTest.java b/src/test/java/com/deep/crow/task/serial/SerialMultiTest.java index 05aefa1..4f08932 100644 --- a/src/test/java/com/deep/crow/task/serial/SerialMultiTest.java +++ b/src/test/java/com/deep/crow/task/serial/SerialMultiTest.java @@ -7,6 +7,7 @@ import org.junit.Assert; import org.junit.Test; +@SuppressWarnings("all") public class SerialMultiTest { @Test diff --git a/src/test/java/com/deep/crow/type/SeniorTypeUtilTest.java b/src/test/java/com/deep/crow/type/SeniorTypeUtilTest.java index 3e895a2..5f9bfda 100644 --- a/src/test/java/com/deep/crow/type/SeniorTypeUtilTest.java +++ b/src/test/java/com/deep/crow/type/SeniorTypeUtilTest.java @@ -8,6 +8,7 @@ import junit.framework.TestCase; /** @author Create by liuwenhao on 2022/4/28 10:33 */ +@SuppressWarnings("all") public class SeniorTypeUtilTest extends TestCase { public void testExample() { diff --git a/src/test/java/com/deep/crow/type/TypeBuilderTest.java b/src/test/java/com/deep/crow/type/TypeBuilderTest.java index e25620d..5694bca 100644 --- a/src/test/java/com/deep/crow/type/TypeBuilderTest.java +++ b/src/test/java/com/deep/crow/type/TypeBuilderTest.java @@ -7,6 +7,7 @@ import junit.framework.TestCase; /** @author Create by liuwenhao on 2022/4/24 12:49 */ +@SuppressWarnings("all") public class TypeBuilderTest extends TestCase { public void testBuilder() { diff --git a/src/test/java/com/deep/crow/type/TypeUtilTest.java b/src/test/java/com/deep/crow/type/TypeUtilTest.java index 23913ff..52bab51 100644 --- a/src/test/java/com/deep/crow/type/TypeUtilTest.java +++ b/src/test/java/com/deep/crow/type/TypeUtilTest.java @@ -11,7 +11,7 @@ import junit.framework.TestCase; /** @author Create by liuwenhao on 2022/4/24 12:49 */ -@SuppressWarnings("unchecked") +@SuppressWarnings("all") public class TypeUtilTest extends TestCase { public List fill() { List list1 = new ArrayList<>(); diff --git a/src/test/java/com/deep/crow/util/DateSerializeTest.java b/src/test/java/com/deep/crow/util/DateSerializeTest.java index 46da2b3..894395c 100644 --- a/src/test/java/com/deep/crow/util/DateSerializeTest.java +++ b/src/test/java/com/deep/crow/util/DateSerializeTest.java @@ -1,28 +1,30 @@ package com.deep.crow.util; -import com.deep.crow.jackson.ObjectMapperFactory; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.deep.crow.json.Mapper; +import com.deep.crow.type.TypeBuilder; + import java.util.ArrayList; import java.util.Date; import java.util.List; + import junit.framework.TestCase; -/** @author Create by liuwenhao on 2022/5/9 11:43 */ +/** + * @author Create by liuwenhao on 2022/5/9 11:43 + */ +@SuppressWarnings("all") public class DateSerializeTest extends TestCase { - public void testDateSerialize() throws JsonProcessingException { + public void testDateSerialize() { List localDateTimes = new ArrayList<>(); Date date1 = new Date(); localDateTimes.add(date1); Date date2 = new Date(); localDateTimes.add(date2); System.out.println(localDateTimes); - ObjectMapper objectMapper = ObjectMapperFactory.get(); - String valueAsString = objectMapper.writeValueAsString(localDateTimes); + Mapper valueAsString = JsonUtil.objToString(localDateTimes, TypeBuilder.list(Date.class)); System.out.println(valueAsString); List longList = - objectMapper.convertValue(localDateTimes, new TypeReference>() {}); + JsonUtil.jsonToObj(valueAsString, TypeBuilder.list(Date.class)); System.out.println(longList); } } diff --git a/src/test/java/com/deep/crow/util/SerializeTest.java b/src/test/java/com/deep/crow/util/SerializeTest.java deleted file mode 100644 index 125767e..0000000 --- a/src/test/java/com/deep/crow/util/SerializeTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.deep.crow.util; - -import com.deep.crow.jackson.ObjectMapperFactory; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.HashMap; -import java.util.Map; -import junit.framework.TestCase; - -/** @author Create by liuwenhao on 2022/5/9 11:43 */ -public class SerializeTest extends TestCase { - public void testSerialize() throws JsonProcessingException { - - Map map = new HashMap<>(); - map.put("liu", 123L); - map.put("45", 54878L); - ObjectMapper objectMapper = ObjectMapperFactory.get(); - String valueAsString = objectMapper.writeValueAsString(map); - System.out.println(valueAsString); - Map longList = - objectMapper.convertValue(map, new TypeReference>() {}); - System.out.println(longList); - } -} diff --git a/src/test/java/com/deep/crow/util/TypeUtilTest.java b/src/test/java/com/deep/crow/util/TypeUtilTest.java index ff956be..1327e3a 100644 --- a/src/test/java/com/deep/crow/util/TypeUtilTest.java +++ b/src/test/java/com/deep/crow/util/TypeUtilTest.java @@ -5,11 +5,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import junit.framework.TestCase; +import org.junit.Test; /** @author Create by liuwenhao on 2022/6/2 10:07 */ -public class TypeUtilTest extends TestCase { +@SuppressWarnings("all") +public class TypeUtilTest { + @Test public void testTypeFillSpeed() { List birds = new ArrayList<>(); List cats = new ArrayList<>(); @@ -46,6 +48,7 @@ public void testTypeFillSpeed() { System.out.println(t - l); } + @Test public void testTypeFillInstance() { Bird bird = new Bird(); bird.setName("鸟"); @@ -66,6 +69,7 @@ public void testTypeFillInstance() { System.out.println(animal); } + @Test public void testFillCollection() { List birds = new ArrayList<>(); List cats = new ArrayList<>();