From af84e5bea3d65e017beca14688dd4b7c987932ed Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Mon, 20 May 2024 17:57:46 +0800 Subject: [PATCH] Fix serialization in native --- .../dubbo/aot/generate/AotProcessor.java | 55 +++++++++++ .../dubbo-serialization-hessian2/pom.xml | 6 ++ ...ssianReflectionTypeDescriberRegistrar.java | 98 +++++++++++++++++++ .../HessianResourceDescriberRegistrar.java | 36 +++++++ ...o.aot.api.ReflectionTypeDescriberRegistrar | 1 + ...e.dubbo.aot.api.ResourceDescriberRegistrar | 1 + 6 files changed, 197 insertions(+) create mode 100644 dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java create mode 100644 dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java create mode 100644 dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar create mode 100644 dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar diff --git a/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java b/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java index f924e4a714b..d1bb9bc931c 100644 --- a/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java +++ b/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java @@ -19,6 +19,9 @@ import org.apache.dubbo.aot.api.JdkProxyDescriber; import org.apache.dubbo.aot.api.ProxyDescriberRegistrar; import org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar; +import org.apache.dubbo.aot.api.ResourceBundleDescriber; +import org.apache.dubbo.aot.api.ResourceDescriberRegistrar; +import org.apache.dubbo.aot.api.ResourcePatternDescriber; import org.apache.dubbo.aot.api.TypeDescriber; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.rpc.model.FrameworkModel; @@ -46,6 +49,12 @@ public static void main(String[] args) { ResourceScanner.INSTANCE.distinctSpiResource().toArray(new String[] {})); resourceRepository.registerIncludesPatterns( ResourceScanner.INSTANCE.distinctSecurityResource().toArray(new String[] {})); + for (ResourcePatternDescriber resourcePatternDescriber : getResourcePatternDescribers()) { + resourceRepository.registerIncludesPattern(resourcePatternDescriber); + } + for (ResourceBundleDescriber resourceBundleDescriber : getResourceBundleDescribers()) { + resourceRepository.registerBundles(resourceBundleDescriber); + } writer.writeResourceConfig(resourceRepository); ReflectConfigMetadataRepository reflectRepository = new ReflectConfigMetadataRepository(); @@ -89,6 +98,52 @@ private static List getTypes() { return typeDescribers; } + private static List getResourcePatternDescribers() { + List resourcePatternDescribers = new ArrayList<>(); + FrameworkModel.defaultModel() + .defaultApplication() + .getExtensionLoader(ResourceDescriberRegistrar.class) + .getSupportedExtensionInstances() + .forEach(reflectionTypeDescriberRegistrar -> { + List describers = new ArrayList<>(); + try { + describers = reflectionTypeDescriberRegistrar.getResourcePatternDescribers(); + } catch (Throwable e) { + // The ResourceDescriberRegistrar implementation classes are shaded, causing some unused + // classes to be loaded. + // When loading a dependent class may appear that cannot be found, it does not affect. + // ignore + } + + resourcePatternDescribers.addAll(describers); + }); + + return resourcePatternDescribers; + } + + private static List getResourceBundleDescribers() { + List resourceBundleDescribers = new ArrayList<>(); + FrameworkModel.defaultModel() + .defaultApplication() + .getExtensionLoader(ResourceDescriberRegistrar.class) + .getSupportedExtensionInstances() + .forEach(reflectionTypeDescriberRegistrar -> { + List describers = new ArrayList<>(); + try { + describers = reflectionTypeDescriberRegistrar.getResourceBundleDescribers(); + } catch (Throwable e) { + // The ResourceDescriberRegistrar implementation classes are shaded, causing some unused + // classes to be loaded. + // When loading a dependent class may appear that cannot be found, it does not affect. + // ignore + } + + resourceBundleDescribers.addAll(describers); + }); + + return resourceBundleDescribers; + } + private static List getProxyDescribers() { List jdkProxyDescribers = new ArrayList<>(); FrameworkModel.defaultModel() diff --git a/dubbo-serialization/dubbo-serialization-hessian2/pom.xml b/dubbo-serialization/dubbo-serialization-hessian2/pom.xml index 50dc13ff3d4..0342a5e766a 100644 --- a/dubbo-serialization/dubbo-serialization-hessian2/pom.xml +++ b/dubbo-serialization/dubbo-serialization-hessian2/pom.xml @@ -45,5 +45,11 @@ limitations under the License. log4j-slf4j-impl test + + org.apache.dubbo + dubbo-native + ${project.parent.version} + + diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java new file mode 100644 index 00000000000..57bd5a966e5 --- /dev/null +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.common.serialize.hessian2.aot; + +import org.apache.dubbo.aot.api.MemberCategory; +import org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar; +import org.apache.dubbo.aot.api.TypeDescriber; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.alibaba.com.caucho.hessian.io.BigDecimalDeserializer; +import com.alibaba.com.caucho.hessian.io.FileDeserializer; +import com.alibaba.com.caucho.hessian.io.HessianRemote; +import com.alibaba.com.caucho.hessian.io.LocaleSerializer; +import com.alibaba.com.caucho.hessian.io.ObjectNameDeserializer; +import com.alibaba.com.caucho.hessian.io.StringValueSerializer; +import com.alibaba.com.caucho.hessian.io.java8.DurationSerializer; +import com.alibaba.com.caucho.hessian.io.java8.InstantSerializer; +import com.alibaba.com.caucho.hessian.io.java8.LocalDateSerializer; +import com.alibaba.com.caucho.hessian.io.java8.LocalDateTimeSerializer; +import com.alibaba.com.caucho.hessian.io.java8.LocalTimeSerializer; +import com.alibaba.com.caucho.hessian.io.java8.MonthDaySerializer; +import com.alibaba.com.caucho.hessian.io.java8.OffsetDateTimeSerializer; +import com.alibaba.com.caucho.hessian.io.java8.OffsetTimeSerializer; +import com.alibaba.com.caucho.hessian.io.java8.PeriodSerializer; +import com.alibaba.com.caucho.hessian.io.java8.YearMonthSerializer; +import com.alibaba.com.caucho.hessian.io.java8.YearSerializer; +import com.alibaba.com.caucho.hessian.io.java8.ZoneIdSerializer; +import com.alibaba.com.caucho.hessian.io.java8.ZoneOffsetSerializer; +import com.alibaba.com.caucho.hessian.io.java8.ZonedDateTimeSerializer; + +public class HessianReflectionTypeDescriberRegistrar implements ReflectionTypeDescriberRegistrar { + + @Override + public List getTypeDescribers() { + List typeDescribers = new ArrayList<>(); + typeDescribers.add(buildTypeDescriberWithDeclared(BigDecimalDeserializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(FileDeserializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(HessianRemote.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(LocaleSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(ObjectNameDeserializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(StringValueSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(DurationSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(InstantSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(LocalDateSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(LocalDateTimeSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(LocalTimeSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(MonthDaySerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(OffsetDateTimeSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(OffsetTimeSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(PeriodSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(YearMonthSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(YearSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(ZoneIdSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(ZoneOffsetSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(ZonedDateTimeSerializer.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(Object.class)); + typeDescribers.add(buildTypeDescriberWithDeclared(StackTraceElement.class)); + typeDescribers.add(buildTypeDescriberWithDeclared("sun.misc.Unsafe")); + + return typeDescribers; + } + + private TypeDescriber buildTypeDescriberWithDeclared(Class cl) { + Set memberCategories = new HashSet<>(); + memberCategories.add(MemberCategory.INVOKE_DECLARED_METHODS); + memberCategories.add(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); + memberCategories.add(MemberCategory.DECLARED_FIELDS); + return new TypeDescriber( + cl.getName(), null, new HashSet<>(), new HashSet<>(), new HashSet<>(), memberCategories); + } + + private TypeDescriber buildTypeDescriberWithDeclared(String cl) { + Set memberCategories = new HashSet<>(); + memberCategories.add(MemberCategory.INVOKE_DECLARED_METHODS); + memberCategories.add(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); + memberCategories.add(MemberCategory.DECLARED_FIELDS); + return new TypeDescriber( + cl, null, new HashSet<>(), new HashSet<>(), new HashSet<>(), memberCategories); + } +} diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java new file mode 100644 index 00000000000..daae432f501 --- /dev/null +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.common.serialize.hessian2.aot; + +import org.apache.dubbo.aot.api.ResourceBundleDescriber; +import org.apache.dubbo.aot.api.ResourceDescriberRegistrar; +import org.apache.dubbo.aot.api.ResourcePatternDescriber; + +import java.util.Collections; +import java.util.List; + +public class HessianResourceDescriberRegistrar implements ResourceDescriberRegistrar { + @Override + public List getResourcePatternDescribers() { + return Collections.singletonList(new ResourcePatternDescriber("DENY_CLASS", null)); + } + + @Override + public List getResourceBundleDescribers() { + return Collections.emptyList(); + } +} diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar new file mode 100644 index 00000000000..bd5df8a4d7c --- /dev/null +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar @@ -0,0 +1 @@ +hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianReflectionTypeDescriberRegistrar diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar new file mode 100644 index 00000000000..b0c728b6dbf --- /dev/null +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar @@ -0,0 +1 @@ +hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianResourceDescriberRegistrar