From 9b4433fddf5b401edb0aace8a404ac733b122702 Mon Sep 17 00:00:00 2001
From: 田源 <tianyuan@vci-tech.com>
Date: 星期四, 03 四月 2025 14:35:02 +0800
Subject: [PATCH] 添加非密字段显示
---
Source/BladeX-Tool/blade-core-auto/src/main/java/org/springblade/core/auto/factories/AutoFactoriesProcessor.java | 199 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 199 insertions(+), 0 deletions(-)
diff --git a/Source/BladeX-Tool/blade-core-auto/src/main/java/org/springblade/core/auto/factories/AutoFactoriesProcessor.java b/Source/BladeX-Tool/blade-core-auto/src/main/java/org/springblade/core/auto/factories/AutoFactoriesProcessor.java
new file mode 100644
index 0000000..5c963e7
--- /dev/null
+++ b/Source/BladeX-Tool/blade-core-auto/src/main/java/org/springblade/core/auto/factories/AutoFactoriesProcessor.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package org.springblade.core.auto.factories;
+
+import org.springblade.core.auto.annotation.AutoIgnore;
+import org.springblade.core.auto.common.AbstractBladeProcessor;
+import org.springblade.core.auto.common.BootAutoType;
+import org.springblade.core.auto.common.MultiSetMap;
+import org.springblade.core.auto.service.AutoService;
+
+import javax.annotation.processing.*;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.Elements;
+import javax.tools.FileObject;
+import javax.tools.StandardLocation;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * spring boot 鑷姩閰嶇疆澶勭悊鍣�
+ *
+ * @author L.cm
+ */
+@AutoService(Processor.class)
+@SupportedAnnotationTypes("*")
+@SupportedOptions("debug")
+public class AutoFactoriesProcessor extends AbstractBladeProcessor {
+ /**
+ * 澶勭悊鐨勬敞瑙� @FeignClient
+ */
+ private static final String FEIGN_CLIENT_ANNOTATION = "org.springframework.cloud.openfeign.FeignClient";
+ /**
+ * Feign 鑷姩閰嶇疆
+ */
+ private static final String FEIGN_AUTO_CONFIGURE_KEY = "org.springblade.core.cloud.feign.BladeFeignAutoConfiguration";
+ /**
+ * The location to look for factories.
+ * <p>Can be present in multiple JAR files.
+ */
+ private static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
+ /**
+ * devtools锛屾湁 Configuration 娉ㄨВ鐨� jar 涓�鑸渶瑕� devtools 閰嶇疆鏂囦欢
+ */
+ private static final String DEVTOOLS_RESOURCE_LOCATION = "META-INF/spring-devtools.properties";
+ /**
+ * 鏁版嵁鎵胯浇
+ */
+ private final MultiSetMap<String, String> factories = new MultiSetMap<>();
+ /**
+ * 鍏冪礌杈呭姪绫�
+ */
+ private Elements elementUtils;
+
+ @Override
+ public synchronized void init(ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ elementUtils = processingEnv.getElementUtils();
+ }
+
+ @Override
+ protected boolean processImpl(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ if (roundEnv.processingOver()) {
+ generateFactoriesFiles();
+ } else {
+ processAnnotations(annotations, roundEnv);
+ }
+ return false;
+ }
+
+ private void processAnnotations(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ // 鏃ュ織 鎵撳嵃淇℃伅 gradle build --debug
+ log(annotations.toString());
+ Set<? extends Element> elementSet = roundEnv.getRootElements();
+ log("All Element set: " + elementSet.toString());
+
+ // 杩囨护 TypeElement
+ Set<TypeElement> typeElementSet = elementSet.stream()
+ .filter(this::isClassOrInterface)
+ .filter(e -> e instanceof TypeElement)
+ .map(e -> (TypeElement) e)
+ .collect(Collectors.toSet());
+ // 濡傛灉涓虹┖鐩存帴璺冲嚭
+ if (typeElementSet.isEmpty()) {
+ log("Annotations elementSet is isEmpty");
+ return;
+ }
+
+ for (TypeElement typeElement : typeElementSet) {
+ if (isAnnotation(elementUtils, typeElement, AutoIgnore.class.getName())) {
+ log("Found @AutoIgnore annotation锛宨gnore Element: " + typeElement.toString());
+ } else if (isAnnotation(elementUtils, typeElement, FEIGN_CLIENT_ANNOTATION)) {
+ log("Found @FeignClient Element: " + typeElement.toString());
+
+ ElementKind elementKind = typeElement.getKind();
+ // Feign Client 鍙鐞� 鎺ュ彛
+ if (ElementKind.INTERFACE != elementKind) {
+ fatalError("@FeignClient Element " + typeElement.toString() + " 涓嶆槸鎺ュ彛銆�");
+ continue;
+ }
+
+ String factoryName = typeElement.getQualifiedName().toString();
+ if (factories.containsVal(factoryName)) {
+ continue;
+ }
+
+ log("璇诲彇鍒版柊閰嶇疆 spring.factories factoryName锛�" + factoryName);
+ factories.put(FEIGN_AUTO_CONFIGURE_KEY, factoryName);
+ } else {
+ for (BootAutoType autoType : BootAutoType.values()) {
+ String annotation = autoType.getAnnotationName();
+ if (isAnnotation(elementUtils, typeElement, annotation)) {
+ log("Found @" + annotation + " Element: " + typeElement.toString());
+
+ String factoryName = typeElement.getQualifiedName().toString();
+ if (factories.containsVal(factoryName)) {
+ continue;
+ }
+
+ log("璇诲彇鍒版柊閰嶇疆 spring.factories factoryName锛�" + factoryName);
+ factories.put(autoType.getConfigureKey(), factoryName);
+ }
+ }
+ }
+ }
+ }
+
+ private void generateFactoriesFiles() {
+ if (factories.isEmpty()) {
+ return;
+ }
+ Filer filer = processingEnv.getFiler();
+ try {
+ // 1. spring.factories
+ FileObject factoriesFile = filer.createResource(StandardLocation.CLASS_OUTPUT, "", FACTORIES_RESOURCE_LOCATION);
+ FactoriesFiles.writeFactoriesFile(factories, factoriesFile.openOutputStream());
+ String classesPath = factoriesFile.toUri().toString().split("classes")[0];
+ Path projectPath = Paths.get(new URI(classesPath)).getParent();
+ // 2. devtools 閰嶇疆锛屽洜涓烘湁 @Configuration 娉ㄨВ鐨勯渶瑕� devtools
+ String projectName = projectPath.getFileName().toString();
+ FileObject devToolsFile = filer.createResource(StandardLocation.CLASS_OUTPUT, "", DEVTOOLS_RESOURCE_LOCATION);
+ FactoriesFiles.writeDevToolsFile(projectName, devToolsFile.openOutputStream());
+ } catch (IOException | URISyntaxException e) {
+ fatalError(e);
+ }
+ }
+
+ private boolean isClassOrInterface(Element e) {
+ ElementKind kind = e.getKind();
+ return kind == ElementKind.CLASS || kind == ElementKind.INTERFACE;
+ }
+
+ private boolean isAnnotation(Elements elementUtils, Element e, String annotationFullName) {
+ List<? extends AnnotationMirror> annotationList = elementUtils.getAllAnnotationMirrors(e);
+ for (AnnotationMirror annotation : annotationList) {
+ // 濡傛灉鏄浜庣殑娉ㄨВ
+ if (isAnnotation(annotationFullName, annotation)) {
+ return true;
+ }
+ // 澶勭悊缁勫悎娉ㄨВ
+ Element element = annotation.getAnnotationType().asElement();
+ // 濡傛灉鏄� java 鍏冩敞瑙o紝缁х画寰幆
+ if (element.toString().startsWith("java.lang")) {
+ continue;
+ }
+ // 閫掑綊澶勭悊 缁勫悎娉ㄨВ
+ if (isAnnotation(elementUtils, element, annotationFullName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isAnnotation(String annotationFullName, AnnotationMirror annotation) {
+ return annotationFullName.equals(annotation.getAnnotationType().toString());
+ }
+}
--
Gitblit v1.10.0