index) {
- this.index = index;
- }
-
- public boolean isWhiteWord() {
- return isWhiteWord;
- }
-
- public void setWhiteWord(boolean whiteWord) {
- isWhiteWord = whiteWord;
- }
-}
diff --git a/schisandra-cloud-storage-share/schisandra-cloud-storage-share-application/schisandra-cloud-storage-share-application-controller/src/main/java/com/schisandra/share/application/sensitive/WordContext.java b/schisandra-cloud-storage-share/schisandra-cloud-storage-share-application/schisandra-cloud-storage-share-application-controller/src/main/java/com/schisandra/share/application/sensitive/WordContext.java
deleted file mode 100644
index 831c0b3..0000000
--- a/schisandra-cloud-storage-share/schisandra-cloud-storage-share-application/schisandra-cloud-storage-share-application-controller/src/main/java/com/schisandra/share/application/sensitive/WordContext.java
+++ /dev/null
@@ -1,276 +0,0 @@
-package com.schisandra.share.application.sensitive;
-
-import com.alibaba.fastjson.JSON;
-
-import com.mybatisflex.core.query.QueryWrapper;
-import com.mybatisflex.core.util.CollectionUtil;
-import com.schisandra.share.common.enums.IsDeletedFlagEnum;
-import com.schisandra.share.infra.basic.dao.SchisandraShareSensitiveWordsDao;
-import com.schisandra.share.infra.basic.entity.SchisandraShareSensitiveWords;
-import com.schisandra.share.infra.basic.entity.table.SchisandraShareSensitiveWordsTableDef;
-import com.schisandra.share.infra.basic.service.SchisandraShareSensitiveWordsService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.CollectionUtils;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-/**
- * 词库上下文环境
- *
- * 初始化敏感词库,将敏感词加入到HashMap中,构建DFA算法模型
- *
- * @author minghu.zhang
- */
-@SuppressWarnings({"rawtypes", "unchecked"})
-@Slf4j
-public class WordContext {
-
- /**
- * 敏感词字典
- */
- private final Map wordMap = new HashMap(1024);
-
- /**
- * 是否已初始化
- */
- private boolean init;
-
- private long addLastId;
-
- @Resource
- private SchisandraShareSensitiveWordsDao schisandraShareSensitiveWordsDao;
-
- public WordContext(boolean autoLoad) {
- clearDelData();
- Set black = new HashSet<>();
- Set white = new HashSet<>();
-
- QueryWrapper query = new QueryWrapper();
- query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.UN_DELETED.getCode()));
- List list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
-
- for (SchisandraShareSensitiveWords words : list) {
- if (words.getType() == 1) {
- black.add(words.getWords());
- } else {
- white.add(words.getWords());
- }
- }
- if (CollectionUtil.isNotEmpty(list)) {
- this.addLastId = Long.parseLong(list.get(list.size() - 1).getId());
- }
- initKeyWord(black, white);
- if (autoLoad) {
- reloadWord();
- }
- }
-
- private void clearDelData() {
- QueryWrapper query = new QueryWrapper();
- query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.DELETED.getCode()));
- List list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
- schisandraShareSensitiveWordsDao.deleteBatchByIds(list.stream().map(SchisandraShareSensitiveWords::getId).collect(Collectors.toList()));
-
- }
-
- private void reloadWord() {
-
- // 创建一个单线程的定时线程池
- ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
- // 创建一个Runnable任务
- Runnable task = () -> {
- try {
- addNewWords();
- removeDelWords();
- } catch (Exception e) {
- log.error("Sensitive words task error", e);
- }
- };
- // 定时执行任务,初始延迟0,之后每分钟执行一次
- scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.MINUTES);
-
- }
-
- private void removeDelWords() {
- QueryWrapper query = new QueryWrapper();
- query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.DELETED.getCode()));
- List list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
-
- if (CollectionUtil.isNotEmpty(list)) {
- log.info("removeDelWords {}", JSON.toJSON(list));
- Set black = new HashSet<>();
- Set white = new HashSet<>();
- for (SchisandraShareSensitiveWords words : list) {
- if (words.getType() == 1) {
- black.add(words.getWords());
- } else {
- white.add(words.getWords());
- }
- }
- removeWord(black, WordType.BLACK);
- removeWord(white, WordType.WHITE);
- }
- }
-
- private void addNewWords() {
- QueryWrapper query = new QueryWrapper();
- query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.ID.gt(addLastId).and(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.UN_DELETED.getCode())));
- List list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
-
- if (CollectionUtil.isNotEmpty(list)) {
- log.info("addNewWords {}", JSON.toJSON(list));
- this.addLastId = Long.parseLong(list.get(list.size() - 1).getId());
- Set black = new HashSet<>();
- Set white = new HashSet<>();
- for (SchisandraShareSensitiveWords words : list) {
- if (words.getType() == 1) {
- black.add(words.getWords());
- } else {
- white.add(words.getWords());
- }
- }
- addWord(black, WordType.BLACK);
- addWord(white, WordType.WHITE);
- }
- }
-
- /**
- * 获取初始化的敏感词列表
- *
- * @return 敏感词列表
- */
- public Map getWordMap() {
- return wordMap;
- }
-
- /**
- * 初始化
- */
- private synchronized void initKeyWord(Set black, Set white) {
- try {
- if (!init) {
- // 将敏感词库加入到HashMap中
- addWord(black, WordType.BLACK);
- // 将非敏感词库也加入到HashMap中
- addWord(white, WordType.WHITE);
- }
- init = true;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:
- * 中 = { isEnd = 0 国 = {
- * isEnd = 1 人 = {isEnd = 0 民 = {isEnd = 1} } 男 = { isEnd = 0 人 = { isEnd = 1 }
- * } } } 五 = { isEnd = 0 星 = { isEnd = 0 红 = { isEnd = 0 旗 = { isEnd = 1 } } } }
- */
- public void addWord(Collection wordList, WordType wordType) {
- if (CollectionUtils.isEmpty(wordList)) {
- return;
- }
- Map nowMap;
- Map newWorMap;
- // 迭代keyWordSet
- for (String key : wordList) {
- nowMap = wordMap;
- for (int i = 0; i < key.length(); i++) {
- // 转换成char型
- char keyChar = key.charAt(i);
- // 获取
- Object wordMap = nowMap.get(keyChar);
- // 如果存在该key,直接赋值
- if (wordMap != null) {
- nowMap = (Map) wordMap;
- } else {
- // 不存在则构建一个map,同时将isEnd设置为0,因为他不是最后一个
- newWorMap = new HashMap<>(4);
- // 不是最后一个
- newWorMap.put("isEnd", String.valueOf(EndType.HAS_NEXT.ordinal()));
- nowMap.put(keyChar, newWorMap);
- nowMap = newWorMap;
- }
-
- if (i == key.length() - 1) {
- // 最后一个
- nowMap.put("isEnd", String.valueOf(EndType.IS_END.ordinal()));
- nowMap.put("isWhiteWord", String.valueOf(wordType.ordinal()));
- }
- }
- }
- }
-
- /**
- * 在线删除敏感词
- *
- * @param wordList 敏感词列表
- * @param wordType 黑名单 BLACk,白名单WHITE
- */
- public void removeWord(Collection wordList, WordType wordType) {
- if (CollectionUtils.isEmpty(wordList)) {
- return;
- }
- Map nowMap;
- for (String key : wordList) {
- List