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