From 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a Mon Sep 17 00:00:00 2001
From: xiejun <xiejun@vci-tech.com>
Date: 星期五, 01 十一月 2024 15:11:19 +0800
Subject: [PATCH] Revert "集成获取mdm分发通用数据格式接口集成"

---
 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.9.3