diff --git a/designer-base/src/main/java/com/fr/env/detect/base/DetectorBridge.java b/designer-base/src/main/java/com/fr/env/detect/base/DetectorBridge.java index 798e0ae04..d5291bb7f 100644 --- a/designer-base/src/main/java/com/fr/env/detect/base/DetectorBridge.java +++ b/designer-base/src/main/java/com/fr/env/detect/base/DetectorBridge.java @@ -2,6 +2,7 @@ package com.fr.env.detect.base; import com.fr.env.detect.bean.DetectorResult; import com.fr.env.detect.bean.DetectorType; +import com.fr.env.detect.impl.DetectorChain; import com.fr.env.detect.impl.FineDbDirtyDetector; import com.fr.env.detect.impl.FineDbLockedDetector; import com.fr.env.detect.impl.FineDbPermissionDetector; @@ -41,10 +42,12 @@ public class DetectorBridge { protected @NotNull DetectorManager compute() { DetectorManager manager = new DetectorManager(); - - manager.register(new FineDbDirtyDetector()); - manager.register(new FineDbPermissionDetector()); - manager.register(new FineDbLockedDetector()); + + // 按照顺序构造检测链 + manager.register(DetectorChain.construct( + new FineDbLockedDetector(), + new FineDbPermissionDetector(), + new FineDbDirtyDetector())); manager.register(new JarInconsistentDetector()); manager.register(new JarLackDetector()); diff --git a/designer-base/src/main/java/com/fr/env/detect/base/DetectorManager.java b/designer-base/src/main/java/com/fr/env/detect/base/DetectorManager.java index bc65870da..2ebbf331e 100644 --- a/designer-base/src/main/java/com/fr/env/detect/base/DetectorManager.java +++ b/designer-base/src/main/java/com/fr/env/detect/base/DetectorManager.java @@ -2,8 +2,10 @@ package com.fr.env.detect.base; import com.fr.env.detect.bean.DetectorResult; import com.fr.env.detect.bean.DetectorType; +import com.fr.env.detect.impl.DetectorChain; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -17,8 +19,23 @@ import java.util.stream.Stream; **/ class DetectorManager { + /** + * 检测链的列表 + */ + private List chains = new ArrayList<>(); + + /** + * 单纯的检测器的列表 + */ private List detectors = new ArrayList<>(); + public void register(DetectorChain chain) { + + if (chain != null) { + chains.add(chain); + } + } + public void register(ExceptionDetector detector) { if (detector != null) { @@ -32,7 +49,13 @@ class DetectorManager { .map(ExceptionDetector::detect) .filter(Objects::nonNull); - List resultList = results.collect(Collectors.toList()); + Stream chainResults = chains.stream() + .map(DetectorChain::detect) + .filter(Objects::nonNull); + + List resultList = Stream.concat(results, chainResults) + .collect(Collectors.toList()); + resultList.forEach(DetectorResult::log); return resultList.stream(); @@ -40,7 +63,13 @@ class DetectorManager { public DetectorResult detect(DetectorType type) { - Optional result = detectors.stream() + Stream chainDetectors = chains.stream() + .map(DetectorChain::getDetectors) + .flatMap(Collection::stream); + + Stream allDetectors = Stream.concat(detectors.stream(), chainDetectors); + + Optional result = allDetectors .filter((detector -> type == detector.type())) .findFirst() .map(ExceptionDetector::detect); diff --git a/designer-base/src/main/java/com/fr/env/detect/impl/DetectorChain.java b/designer-base/src/main/java/com/fr/env/detect/impl/DetectorChain.java new file mode 100644 index 000000000..352e72c6b --- /dev/null +++ b/designer-base/src/main/java/com/fr/env/detect/impl/DetectorChain.java @@ -0,0 +1,46 @@ +package com.fr.env.detect.impl; + +import com.fr.env.detect.base.ExceptionDetector; +import com.fr.env.detect.bean.DetectorResult; +import com.fr.env.detect.bean.DetectorStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 检测链 + * 责任链模式, 有先后顺序,哪一个先获得,哪一个先终止。 + * + * created by Harrison on 2022/06/16 + **/ +public class DetectorChain { + + private List detectors = new ArrayList<>(); + + public static DetectorChain construct(ExceptionDetector... detectors) { + + DetectorChain detectorChain = new DetectorChain(); + detectorChain.detectors = Arrays.stream(detectors).collect(Collectors.toList()); + return detectorChain; + } + + @Nullable + public DetectorResult detect() { + + for (ExceptionDetector detector : detectors) { + DetectorResult result = detector.detect(); + if (result != null && result.getStatus() == DetectorStatus.EXCEPTION) { + return result; + } + } + return null; + } + + public List getDetectors() { + + return this.detectors; + } +} diff --git a/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbLockedConverter.java b/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbLockedConverter.java index 8a5e74f0b..2b627a7b2 100644 --- a/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbLockedConverter.java +++ b/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbLockedConverter.java @@ -7,6 +7,7 @@ import com.fr.env.detect.bean.DetectorType; import com.fr.env.detect.thowable.ThrowableConverter; import com.fr.third.org.apache.commons.lang3.StringUtils; import com.fr.third.org.hsqldb.HsqlException; +import com.fr.workspace.WorkContext; /** * created by Harrison on 2022/05/24 @@ -36,12 +37,21 @@ public class FineDbLockedConverter implements ThrowableConverter { */ @Override public DetectorResult convert(Throwable throwable) { + + // 远程不执行 + if (!WorkContext.getCurrent().isLocal()) { + return null; + } Throwable sign = throwable; - while (sign.getClass() != HsqlException.class) { + while (sign != null && sign.getClass() != HsqlException.class) { sign = sign.getCause(); } + if (sign == null) { + return null; + } + DetectorType type = DetectorType.FINE_DB_LOCKED; String message = sign.getMessage(); diff --git a/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbPermissionConverter.java b/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbPermissionConverter.java index dd350abdf..d34e7c245 100644 --- a/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbPermissionConverter.java +++ b/designer-base/src/main/java/com/fr/env/detect/impl/converter/FineDbPermissionConverter.java @@ -5,17 +5,24 @@ import com.fr.env.detect.base.DetectorConstants; import com.fr.env.detect.bean.DetectorResult; import com.fr.env.detect.bean.DetectorType; import com.fr.env.detect.thowable.ThrowableConverter; -import com.fr.third.org.apache.commons.lang3.StringUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.third.org.apache.commons.io.FileUtils; import com.fr.third.org.hsqldb.HsqlException; +import com.fr.workspace.WorkContext; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.RandomAccessFile; +import java.util.Collection; /** * HSQL 下的权限检测 - * + *

* created by Harrison on 2022/05/24 **/ public class FineDbPermissionConverter implements ThrowableConverter { - public static final String PERMISSION = "permission"; + public static final String EMBED_DB_NAME = "finedb"; @Override public boolean accept(Throwable throwable) { @@ -33,15 +40,37 @@ public class FineDbPermissionConverter implements ThrowableConverter { @Override public DetectorResult convert(Throwable throwable) { + // 远程不执行 + if (!WorkContext.getCurrent().isLocal()) { + return null; + } + Throwable sign = throwable; - while (sign.getClass() != HsqlException.class) { + while (sign != null && sign.getClass() != HsqlException.class) { sign = sign.getCause(); } + + if (sign == null) { + return null; + } - DetectorType type = DetectorType.FINE_DB_PERMISSION; - String message = sign.getMessage(); - if (StringUtils.containsIgnoreCase(message, PERMISSION)) { - + String fineDbDirectory = WorkContext.getCurrent().getPath() + File.separator + ProjectConstants.EMBED_DB_DIRECTORY + File.separator + EMBED_DB_NAME; + Collection files = FileUtils.listFiles(new File(fineDbDirectory), null, true); + Boolean isPermitted = files.stream() + .map((file -> { + try { + // 进行权限判断 + new RandomAccessFile(file, "rw"); + return true; + } catch (FileNotFoundException e) { + return false; + } + })) + .reduce((a, b) -> a & b) + .orElse(Boolean.FALSE); + + if (!isPermitted) { + DetectorType type = DetectorType.FINE_DB_PERMISSION; return DetectorResult.builder() .withType(type) .withTips(Toolkit.i18nText(type.getTipsLocale()))