From f5bfb8bd9e64de40b3eb7a20da933b9cc1dee01c Mon Sep 17 00:00:00 2001 From: hiparker Date: Thu, 8 Apr 2021 13:41:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=91=E7=8A=B6=E7=BB=93=E6=9E=84=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/factory/NameableThreadFactory.java | 61 -------- .../org/opsli/core/utils/TreeBuildUtil.java | 146 ++++++++++++++++++ 2 files changed, 146 insertions(+), 61 deletions(-) delete mode 100644 opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/factory/NameableThreadFactory.java create mode 100644 opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/factory/NameableThreadFactory.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/factory/NameableThreadFactory.java deleted file mode 100644 index 84c6b161..00000000 --- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/factory/NameableThreadFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.opsli.common.thread.factory; - -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Created Date by 2019/12/26 0026. - * 自定义线程池工厂 - * @author Parker - */ -public class NameableThreadFactory implements ThreadFactory{ - - private final AtomicInteger poolNumber = new AtomicInteger(1); - - private final ThreadGroup threadGroup; - - private final AtomicInteger threadNumber = new AtomicInteger(1); - - public final String namePrefix; - - public NameableThreadFactory(String name){ - SecurityManager s = System.getSecurityManager(); - threadGroup = (s != null) ? s.getThreadGroup() : - Thread.currentThread().getThreadGroup(); - if (null==name || "".equals(name.trim())){ - name = "pool"; - } - namePrefix = name +"-"+ - poolNumber.getAndIncrement() + - "-thread-"; - } - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(threadGroup, r, - namePrefix + threadNumber.getAndIncrement(), - 0); - if (t.isDaemon()){ - t.setDaemon(false); - } - if (t.getPriority() != Thread.NORM_PRIORITY){ - t.setPriority(Thread.NORM_PRIORITY); - } - return t; - } -} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java new file mode 100644 index 00000000..8e9b6c09 --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java @@ -0,0 +1,146 @@ +/** + * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.opsli.core.utils; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.util.List; +import java.util.Map; + +/** + * 树状结构工具类 + * + * 注:排序只支持 int 类型 + * + * @author Parker + + * @date 2017-05-20 14:41 + */ +public enum TreeBuildUtil { + + /** 实例 */ + INSTANCE; + + /** 默认父节点ID */ + public static final String DEF_PARENT_ID = "0"; + + /** 默认排除字段 */ + private static final List DEF_EXCLUDE_FIELDS; + static { + DEF_EXCLUDE_FIELDS = ListUtil.list(false); + DEF_EXCLUDE_FIELDS.add("izApi"); + DEF_EXCLUDE_FIELDS.add("izManual"); + } + + public List> build(List dataList){ + return this.build(dataList, DEF_PARENT_ID, null); + } + + public List> build(List dataList, String parentId){ + return this.build(dataList, parentId, null); + } + + public List> build(List dataList, TreeNodeConfig config){ + return this.build(dataList, DEF_PARENT_ID, config); + } + + public List> build(List dataList, String parentId, TreeNodeConfig config){ + if(CollUtil.isEmpty(dataList)){ + return ListUtil.empty(); + } + + boolean isMap = false; + + // 处理Map集合 + Object obj = dataList.get(0); + if(obj instanceof Map){ + isMap = true; + } + + if(!isMap){ + // 处理Bean 验证 + boolean isBean = BeanUtil.isBean(obj.getClass()); + if(!isBean){ + return ListUtil.empty(); + } + } + + // 默认值处理 + final String defParentId = ObjectUtil.defaultIfNull(parentId, DEF_PARENT_ID); + final TreeNodeConfig treeConfig = ObjectUtil.defaultIfNull(config, TreeNodeConfig.DEFAULT_CONFIG); + + List excludeFields = ListUtil.list(false); + excludeFields.addAll(DEF_EXCLUDE_FIELDS); + excludeFields.add(config.getIdKey()); + excludeFields.add(config.getParentIdKey()); + excludeFields.add(config.getWeightKey()); + + //转换器 + final boolean finalIsMap = isMap; + return TreeUtil.build(dataList, defParentId, treeConfig, + (treeNode, tree) -> { + // 非空校验 + if(ObjectUtil.isEmpty(treeNode)){ + return; + } + + // Bean 对象转 Map + Map beanMap; + if(finalIsMap){ + beanMap = Convert.toMap(String.class, Object.class, treeNode); + }else{ + beanMap = BeanUtil.beanToMap(treeNode); + } + + // 主要属性 + tree.setId(beanMap.get(config.getIdKey())); + tree.setParentId(beanMap.get(config.getParentIdKey())); + tree.setWeight( + cast( + beanMap.get(config.getWeightKey()))); + + // 扩展属性 ... + for (Map.Entry entry : beanMap.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + // 排除字段 + if(excludeFields.contains(key)){ + continue; + } + tree.putExtra(key, value); + } + }); + } + + + /** + * 欺骗编译器 强制转换 + * @param obj + * @param + * @return + */ + private Comparable cast(T obj){ + return (Comparable) Convert.toInt(obj); + } + +}