Skip to content

Commit

Permalink
Fix serialization in native
Browse files Browse the repository at this point in the history
  • Loading branch information
AlbumenJ committed May 20, 2024
1 parent ca25163 commit af84e5b
Show file tree
Hide file tree
Showing 6 changed files with 197 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -89,6 +98,52 @@ private static List<TypeDescriber> getTypes() {
return typeDescribers;
}

private static List<ResourcePatternDescriber> getResourcePatternDescribers() {
List<ResourcePatternDescriber> resourcePatternDescribers = new ArrayList<>();
FrameworkModel.defaultModel()
.defaultApplication()
.getExtensionLoader(ResourceDescriberRegistrar.class)
.getSupportedExtensionInstances()
.forEach(reflectionTypeDescriberRegistrar -> {
List<ResourcePatternDescriber> 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<ResourceBundleDescriber> getResourceBundleDescribers() {
List<ResourceBundleDescriber> resourceBundleDescribers = new ArrayList<>();
FrameworkModel.defaultModel()
.defaultApplication()
.getExtensionLoader(ResourceDescriberRegistrar.class)
.getSupportedExtensionInstances()
.forEach(reflectionTypeDescriberRegistrar -> {
List<ResourceBundleDescriber> 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<JdkProxyDescriber> getProxyDescribers() {
List<JdkProxyDescriber> jdkProxyDescribers = new ArrayList<>();
FrameworkModel.defaultModel()
Expand Down
6 changes: 6 additions & 0 deletions dubbo-serialization/dubbo-serialization-hessian2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,11 @@ limitations under the License.
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-native</artifactId>
<version>${project.parent.version}</version>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -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<TypeDescriber> getTypeDescribers() {
List<TypeDescriber> 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<MemberCategory> 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<MemberCategory> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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<ResourcePatternDescriber> getResourcePatternDescribers() {
return Collections.singletonList(new ResourcePatternDescriber("DENY_CLASS", null));
}

@Override
public List<ResourceBundleDescriber> getResourceBundleDescribers() {
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianReflectionTypeDescriberRegistrar
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianResourceDescriberRegistrar

0 comments on commit af84e5b

Please sign in to comment.