From 80acc241da3dd50f4eb66cc1b8ae7e2a88d9fe2c Mon Sep 17 00:00:00 2001 From: cvictory Date: Mon, 29 Jun 2020 14:42:23 +0800 Subject: [PATCH] fix #6306. support TypeBuilder sort (#6365) * fix #6306. support TypeBuilder sort * fix #6306. support TypeBuilder sort * fix #6306. support TypeBuilder sort * remove unused import * add license for test file --- .../definition/TypeDefinitionBuilder.java | 10 ++--- .../definition/builder/TypeBuilder.java | 3 +- .../metadata/definition/Test3TypeBuilder.java | 43 +++++++++++++++++++ .../metadata/definition/TestTypeBuilder.java | 43 +++++++++++++++++++ .../definition/TypeDefinitionBuilderTest.java | 34 +++++++++++++++ ...bo.metadata.definition.builder.TypeBuilder | 2 + 6 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java create mode 100644 dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java create mode 100644 dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java create mode 100644 dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java index d1275e749d6..fe99d2e32a4 100755 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import static org.apache.dubbo.common.utils.ClassUtils.isSimpleType; @@ -36,15 +37,12 @@ */ public class TypeDefinitionBuilder { private static final Logger logger = LoggerFactory.getLogger(TypeDefinitionBuilder.class); - private static final List BUILDERS; + static final List BUILDERS; static { - List builders = new ArrayList<>(); ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(TypeBuilder.class); - for (String extensionName : extensionLoader.getSupportedExtensions()) { - builders.add(extensionLoader.getExtension(extensionName)); - } - BUILDERS = builders; + Set tbs = extensionLoader.getSupportedExtensionInstances(); + BUILDERS = new ArrayList<>(tbs); } public static TypeDefinition build(Type type, Class clazz, Map, TypeDefinition> typeCache) { diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java index d7022bd9555..57673fe5983 100755 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java @@ -17,6 +17,7 @@ package org.apache.dubbo.metadata.definition.builder; import org.apache.dubbo.common.extension.SPI; +import org.apache.dubbo.common.lang.Prioritized; import org.apache.dubbo.metadata.definition.model.TypeDefinition; import java.lang.reflect.Type; @@ -26,7 +27,7 @@ * 2015/1/27. */ @SPI -public interface TypeBuilder { +public interface TypeBuilder extends Prioritized { /** * Whether the build accept the type or class passed in. diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java new file mode 100644 index 00000000000..075a69e8140 --- /dev/null +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java @@ -0,0 +1,43 @@ +/* + * 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.metadata.definition; + +import org.apache.dubbo.metadata.definition.builder.TypeBuilder; +import org.apache.dubbo.metadata.definition.model.TypeDefinition; + +import java.lang.reflect.Type; +import java.util.Map; + +/** + * test for sort + */ +public class Test3TypeBuilder implements TypeBuilder { + // it is smaller than the implements of TypeBuilder + public int getPriority(){ + return 10; + } + + @Override + public boolean accept(Type type, Class clazz) { + return false; + } + + @Override + public TypeDefinition build(Type type, Class clazz, Map, TypeDefinition> typeCache) { + return null; + } +} diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java new file mode 100644 index 00000000000..bf7e9c6076c --- /dev/null +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java @@ -0,0 +1,43 @@ +/* + * 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.metadata.definition; + +import org.apache.dubbo.metadata.definition.builder.TypeBuilder; +import org.apache.dubbo.metadata.definition.model.TypeDefinition; + +import java.lang.reflect.Type; +import java.util.Map; + +/** + * test for sort + */ +public class TestTypeBuilder implements TypeBuilder { + // it is smaller than the implements of TypeBuilder + public int getPriority(){ + return -3; + } + + @Override + public boolean accept(Type type, Class clazz) { + return false; + } + + @Override + public TypeDefinition build(Type type, Class clazz, Map, TypeDefinition> typeCache) { + return null; + } +} diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java new file mode 100644 index 00000000000..11d03a15ad1 --- /dev/null +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java @@ -0,0 +1,34 @@ +/* + * 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.metadata.definition; + +import org.apache.dubbo.metadata.definition.builder.TypeBuilder; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TypeDefinitionBuilderTest { + + @Test + public void testSortTypeBuilder(){ + TypeBuilder tb = TypeDefinitionBuilder.BUILDERS.get(0); + Assertions.assertTrue(tb instanceof TestTypeBuilder); + + tb = TypeDefinitionBuilder.BUILDERS.get(TypeDefinitionBuilder.BUILDERS.size()-1); + Assertions.assertTrue(tb instanceof Test3TypeBuilder); + } +} diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder b/dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder new file mode 100644 index 00000000000..1b1b7d2b5b6 --- /dev/null +++ b/dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder @@ -0,0 +1,2 @@ +test=org.apache.dubbo.metadata.definition.TestTypeBuilder +test3=org.apache.dubbo.metadata.definition.Test3TypeBuilder