This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 225c208 [3.0] Optimize Converter to cache (#9861)
225c208 is described below
commit 225c2089a1f1b96209e99af7523d068dc2f4bba7
Author: Albumen Kevin <[email protected]>
AuthorDate: Thu Mar 31 09:49:13 2022 +0800
[3.0] Optimize Converter to cache (#9861)
* [3.0] Optimized Converter to cache
* add asf header
* fix compile
---
.../dubbo/common/CommonScopeModelInitializer.java | 2 +
.../src/main/java/org/apache/dubbo/common/URL.java | 4 +-
.../org/apache/dubbo/common/convert/Converter.java | 36 -----------
.../apache/dubbo/common/convert/ConverterUtil.java | 70 ++++++++++++++++++++++
.../convert/multiple/StringToArrayConverter.java | 9 ++-
.../multiple/StringToBlockingDequeConverter.java | 5 ++
.../multiple/StringToBlockingQueueConverter.java | 5 ++
.../multiple/StringToCollectionConverter.java | 5 ++
.../convert/multiple/StringToDequeConverter.java | 5 ++
.../multiple/StringToIterableConverter.java | 13 +++-
.../convert/multiple/StringToListConverter.java | 5 ++
.../multiple/StringToNavigableSetConverter.java | 5 ++
.../convert/multiple/StringToQueueConverter.java | 5 ++
.../convert/multiple/StringToSetConverter.java | 5 ++
.../multiple/StringToSortedSetConverter.java | 5 ++
.../multiple/StringToTransferQueueConverter.java | 5 ++
.../org/apache/dubbo/common/utils/ClassUtils.java | 9 ++-
.../org/apache/dubbo/config/AbstractConfig.java | 3 +-
.../java/org/apache/dubbo/config/MethodConfig.java | 3 +-
.../apache/dubbo/common/convert/ConverterTest.java | 26 ++++++--
.../multiple/StringToArrayConverterTest.java | 4 +-
.../multiple/StringToQueueConverterTest.java | 3 +-
.../convert/multiple/StringToSetConverterTest.java | 3 +-
.../rest/DefaultServiceRestMetadataResolver.java | 5 +-
24 files changed, 183 insertions(+), 57 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
index 1831347..29f242f 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.common;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.common.config.ConfigurationCache;
+import org.apache.dubbo.common.convert.ConverterUtil;
import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
import org.apache.dubbo.common.status.reporter.FrameworkStatusReportService;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
@@ -31,6 +32,7 @@ public class CommonScopeModelInitializer implements
ScopeModelInitializer {
public void initializeFrameworkModel(FrameworkModel frameworkModel) {
ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
beanFactory.registerBean(FrameworkExecutorRepository.class);
+ beanFactory.registerBean(ConverterUtil.class);
}
@Override
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
index 9d15743..c807843 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.config.Configuration;
import org.apache.dubbo.common.config.InmemoryConfiguration;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.constants.RemotingConstants;
+import org.apache.dubbo.common.convert.ConverterUtil;
import org.apache.dubbo.common.url.component.PathURLAddress;
import org.apache.dubbo.common.url.component.ServiceConfigURL;
import org.apache.dubbo.common.url.component.URLAddress;
@@ -76,7 +77,6 @@ import static
org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;
-import static org.apache.dubbo.common.convert.Converter.convertIfPossible;
import static org.apache.dubbo.common.utils.StringUtils.isBlank;
/**
@@ -590,7 +590,7 @@ class URL implements Serializable {
String value = getParameter(key);
T result = null;
if (!isBlank(value)) {
- result = convertIfPossible(value, valueType);
+ result =
getOrDefaultFrameworkModel().getBeanFactory().getBean(ConverterUtil.class).convertIfPossible(value,
valueType);
}
if (result == null) {
result = defaultValue;
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
index ec7c1da..9cad017 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
@@ -16,12 +16,10 @@
*/
package org.apache.dubbo.common.convert;
-import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.extension.ExtensionScope;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.common.lang.Prioritized;
-import static
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;
import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;
@@ -72,38 +70,4 @@ public interface Converter<S, T> extends Prioritized {
default Class<T> getTargetType() {
return findActualTypeArgument(getClass(), Converter.class, 1);
}
-
- /**
- * Get the Converter instance from {@link ExtensionLoader} with the
specified source and target type
- *
- * @param sourceType the source type
- * @param targetType the target type
- * @return
- * @see ExtensionLoader#getSupportedExtensionInstances()
- */
- static Converter<?, ?> getConverter(Class<?> sourceType, Class<?>
targetType) {
- return getExtensionLoader(Converter.class)
- .getSupportedExtensionInstances()
- .stream()
- .filter(converter -> converter.accept(sourceType, targetType))
- .findFirst()
- .orElse(null);
- }
-
- /**
- * Convert the value of source to target-type value if possible
- *
- * @param source the value of source
- * @param targetType the target type
- * @param <T> the target type
- * @return <code>null</code> if can't be converted
- * @since 2.7.8
- */
- static <T> T convertIfPossible(Object source, Class<T> targetType) {
- Converter converter = getConverter(source.getClass(), targetType);
- if (converter != null) {
- return (T) converter.convert(source);
- }
- return null;
- }
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
new file mode 100644
index 0000000..260c980
--- /dev/null
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
@@ -0,0 +1,70 @@
+/*
+ * 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.convert;
+
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+public class ConverterUtil {
+ private final FrameworkModel frameworkModel;
+ private final Map<Class<?>, Map<Class<?>, List<Converter>>> converterCache
= new ConcurrentHashMap<>();
+
+ public ConverterUtil(FrameworkModel frameworkModel) {
+ this.frameworkModel = frameworkModel;
+ }
+
+ /**
+ * Get the Converter instance from {@link ExtensionLoader} with the
specified source and target type
+ *
+ * @param sourceType the source type
+ * @param targetType the target type
+ * @return
+ * @see ExtensionLoader#getSupportedExtensionInstances()
+ */
+ public Converter<?, ?> getConverter(Class<?> sourceType, Class<?>
targetType) {
+ Map<Class<?>, List<Converter>> toTargetMap =
converterCache.computeIfAbsent(sourceType, (k) -> new ConcurrentHashMap<>());
+ List<Converter> converters = toTargetMap.computeIfAbsent(targetType,
(k) -> frameworkModel.getExtensionLoader(Converter.class)
+ .getSupportedExtensionInstances()
+ .stream()
+ .filter(converter -> converter.accept(sourceType, targetType))
+ .collect(Collectors.toList()));
+
+ return converters.size() > 0 ? converters.get(0) : null;
+ }
+
+ /**
+ * Convert the value of source to target-type value if possible
+ *
+ * @param source the value of source
+ * @param targetType the target type
+ * @param <T> the target type
+ * @return <code>null</code> if can't be converted
+ * @since 2.7.8
+ */
+ public <T> T convertIfPossible(Object source, Class<T> targetType) {
+ Converter converter = getConverter(source.getClass(), targetType);
+ if (converter != null) {
+ return (T) converter.convert(source);
+ }
+ return null;
+ }
+}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java
index 32490cd..aab20fa 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java
@@ -17,6 +17,8 @@
package org.apache.dubbo.common.convert.multiple;
import org.apache.dubbo.common.convert.Converter;
+import org.apache.dubbo.common.convert.ConverterUtil;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import java.lang.reflect.Array;
@@ -28,6 +30,11 @@ import static java.lang.reflect.Array.newInstance;
* @since 2.7.6
*/
public class StringToArrayConverter implements StringToMultiValueConverter {
+ private ConverterUtil converterUtil;
+
+ public StringToArrayConverter(FrameworkModel frameworkModel) {
+ converterUtil =
frameworkModel.getBeanFactory().getBean(ConverterUtil.class);
+ }
public boolean accept(Class<String> type, Class<?> multiValueType) {
if (multiValueType != null && multiValueType.isArray()) {
@@ -41,7 +48,7 @@ public class StringToArrayConverter implements
StringToMultiValueConverter {
Class<?> componentType = targetType.getComponentType();
- Converter converter = Converter.getConverter(String.class,
componentType);
+ Converter converter = converterUtil.getConverter(String.class,
componentType);
Object array = newInstance(componentType, size);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java
index 61e0a7d..9fe7d09 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
@@ -25,6 +27,9 @@ import java.util.concurrent.LinkedBlockingDeque;
* @since 2.7.6
*/
public class StringToBlockingDequeConverter extends
StringToIterableConverter<BlockingDeque> {
+ public StringToBlockingDequeConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected BlockingDeque createMultiValue(int size, Class<?>
multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java
index f099e84..4e5ef45 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
@@ -26,6 +28,9 @@ import java.util.concurrent.BlockingQueue;
* @since 2.7.6
*/
public class StringToBlockingQueueConverter extends
StringToIterableConverter<BlockingQueue> {
+ public StringToBlockingQueueConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected BlockingQueue createMultiValue(int size, Class<?>
multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java
index 478447e..5839f4b 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.ArrayList;
import java.util.Collection;
@@ -25,6 +27,9 @@ import java.util.Collection;
* @since 2.7.6
*/
public class StringToCollectionConverter extends
StringToIterableConverter<Collection> {
+ public StringToCollectionConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected Collection createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java
index 19bdc33..ea9fab2 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.ArrayDeque;
import java.util.Deque;
@@ -25,6 +27,9 @@ import java.util.Deque;
* @since 2.7.6
*/
public class StringToDequeConverter extends StringToIterableConverter<Deque> {
+ public StringToDequeConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected Deque createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java
index f84b360..ad9fec9 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java
@@ -16,12 +16,13 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.common.convert.ConverterUtil;
import org.apache.dubbo.common.convert.StringConverter;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import java.util.Collection;
import java.util.Optional;
-import static org.apache.dubbo.common.convert.Converter.getConverter;
import static org.apache.dubbo.common.utils.ClassUtils.getAllInterfaces;
import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;
import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;
@@ -32,6 +33,12 @@ import static
org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;
* @since 2.7.6
*/
public abstract class StringToIterableConverter<T extends Iterable> implements
StringToMultiValueConverter {
+ private ConverterUtil converterUtil;
+
+ public StringToIterableConverter(FrameworkModel frameworkModel) {
+ converterUtil =
frameworkModel.getBeanFactory().getBean(ConverterUtil.class);
+ }
+
public boolean accept(Class<String> type, Class<?> multiValueType) {
return isAssignableFrom(getSupportedType(), multiValueType);
@@ -63,7 +70,7 @@ public abstract class StringToIterableConverter<T extends
Iterable> implements S
protected abstract T createMultiValue(int size, Class<?> multiValueType);
protected Optional<StringConverter> getStringConverter(Class<?>
elementType) {
- StringConverter converter = (StringConverter)
getConverter(String.class, elementType);
+ StringConverter converter = (StringConverter)
converterUtil.getConverter(String.class, elementType);
return Optional.ofNullable(converter);
}
@@ -74,7 +81,7 @@ public abstract class StringToIterableConverter<T extends
Iterable> implements S
@Override
public final int getPriority() {
int level = getAllInterfaces(getSupportedType(), type ->
- isAssignableFrom(Iterable.class, type)).size();
+ isAssignableFrom(Iterable.class, type)).size();
return MIN_PRIORITY - level;
}
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToListConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToListConverter.java
index 111a3a7..40696da 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToListConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToListConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.ArrayList;
import java.util.List;
@@ -25,6 +27,9 @@ import java.util.List;
* @since 2.7.6
*/
public class StringToListConverter extends StringToIterableConverter<List> {
+ public StringToListConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected List createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java
index ccd692e..17fce68 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.NavigableSet;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -26,6 +28,9 @@ import java.util.TreeSet;
* @since 2.7.6
*/
public class StringToNavigableSetConverter extends
StringToIterableConverter<NavigableSet> {
+ public StringToNavigableSetConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected NavigableSet createMultiValue(int size, Class<?> multiValueType)
{
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java
index 3bd7eed..05f3f20 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Queue;
@@ -26,6 +28,9 @@ import java.util.Queue;
* @since 2.7.6
*/
public class StringToQueueConverter extends StringToIterableConverter<Queue> {
+ public StringToQueueConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected Queue createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSetConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSetConverter.java
index dfffead..b14b9e0 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSetConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSetConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.HashSet;
import java.util.Set;
@@ -25,6 +27,9 @@ import java.util.Set;
* @since 2.7.6
*/
public class StringToSetConverter extends StringToIterableConverter<Set> {
+ public StringToSetConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected Set createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java
index 12b48d6..6bcd9c7 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.SortedSet;
import java.util.TreeSet;
@@ -25,6 +27,9 @@ import java.util.TreeSet;
* @since 2.7.6
*/
public class StringToSortedSetConverter extends
StringToIterableConverter<SortedSet> {
+ public StringToSortedSetConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected SortedSet createMultiValue(int size, Class<?> multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java
index 32ca09f..d8f269d 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
@@ -25,6 +27,9 @@ import java.util.concurrent.TransferQueue;
* @since 2.7.6
*/
public class StringToTransferQueueConverter extends
StringToIterableConverter<TransferQueue> {
+ public StringToTransferQueueConverter(FrameworkModel frameworkModel) {
+ super(frameworkModel);
+ }
@Override
protected TransferQueue createMultiValue(int size, Class<?>
multiValueType) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassUtils.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassUtils.java
index e3db2a9..f5fad30 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ClassUtils.java
@@ -17,7 +17,8 @@
package org.apache.dubbo.common.utils;
-import org.apache.dubbo.common.convert.Converter;
+import org.apache.dubbo.common.convert.ConverterUtil;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
@@ -324,13 +325,17 @@ public class ClassUtils {
}
public static Object convertPrimitive(Class<?> type, String value) {
+ return convertPrimitive(FrameworkModel.defaultModel(), type, value);
+ }
+
+ public static Object convertPrimitive(FrameworkModel frameworkModel,
Class<?> type, String value) {
if (isEmpty(value)) {
return null;
}
Class<?> wrapperType = WRAPPER_PRIMITIVE_TYPE_MAP.getOrDefault(type,
type);
Object result = null;
try {
- result = Converter.convertIfPossible(value, wrapperType);
+ result =
frameworkModel.getBeanFactory().getBean(ConverterUtil.class).convertIfPossible(value,
wrapperType);
} catch (Exception e) {
// ignore exception
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 563b56d..bef96fa 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -37,6 +37,7 @@ import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModel;
+import org.apache.dubbo.rpc.model.ScopeModelUtil;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
@@ -726,7 +727,7 @@ public abstract class AbstractConfig implements
Serializable {
&&
ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)
&& !isIgnoredAttribute(obj.getClass(), propertyName)) {
value = environment.resolvePlaceholders(value);
- method.invoke(obj,
ClassUtils.convertPrimitive(method.getParameterTypes()[0], value));
+ method.invoke(obj,
ClassUtils.convertPrimitive(ScopeModelUtil.getFrameworkModel(getScopeModel()),
method.getParameterTypes()[0], value));
}
} catch (Exception e) {
logger.info("Failed to override the property " +
method.getName() + " in " +
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java
index c735bc4..80020e2 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/MethodConfig.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.rpc.model.AsyncMethodInfo;
import org.apache.dubbo.rpc.model.ModuleModel;
+import org.apache.dubbo.rpc.model.ScopeModelUtil;
import java.util.ArrayList;
import java.util.Collections;
@@ -253,7 +254,7 @@ public class MethodConfig extends AbstractMethodConfig {
String value =
StringUtils.trim(subPropsConfiguration.getString(kebabPropertyName));
if (StringUtils.hasText(value) &&
ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)) {
value = environment.resolvePlaceholders(value);
- method.invoke(argument,
ClassUtils.convertPrimitive(method.getParameterTypes()[0], value));
+ method.invoke(argument,
ClassUtils.convertPrimitive(ScopeModelUtil.getFrameworkModel(getScopeModel()),
method.getParameterTypes()[0], value));
}
} catch (Exception e) {
logger.info("Failed to override the property " +
method.getName() + " in " +
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/ConverterTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/ConverterTest.java
index 1f5a36c..ab40833 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/ConverterTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/ConverterTest.java
@@ -16,10 +16,12 @@
*/
package org.apache.dubbo.common.convert;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import static org.apache.dubbo.common.convert.Converter.convertIfPossible;
-import static org.apache.dubbo.common.convert.Converter.getConverter;
import static
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
@@ -31,19 +33,31 @@ import static org.junit.jupiter.api.Assertions.assertSame;
*/
public class ConverterTest {
+ private ConverterUtil converterUtil;
+
+ @BeforeEach
+ public void setup() {
+ converterUtil =
FrameworkModel.defaultModel().getBeanFactory().getBean(ConverterUtil.class);
+ }
+
+ @AfterEach
+ public void tearDown() {
+ FrameworkModel.destroyAll();
+ }
+
@Test
public void testGetConverter() {
getExtensionLoader(Converter.class)
.getSupportedExtensionInstances()
.forEach(converter -> {
- assertSame(converter,
getConverter(converter.getSourceType(), converter.getTargetType()));
+ assertSame(converter,
converterUtil.getConverter(converter.getSourceType(),
converter.getTargetType()));
});
}
@Test
public void testConvertIfPossible() {
- assertEquals(Integer.valueOf(2), convertIfPossible("2",
Integer.class));
- assertEquals(Boolean.FALSE, convertIfPossible("false", Boolean.class));
- assertEquals(Double.valueOf(1), convertIfPossible("1", Double.class));
+ assertEquals(Integer.valueOf(2), converterUtil.convertIfPossible("2",
Integer.class));
+ assertEquals(Boolean.FALSE, converterUtil.convertIfPossible("false",
Boolean.class));
+ assertEquals(Double.valueOf(1), converterUtil.convertIfPossible("1",
Double.class));
}
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverterTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverterTest.java
index 8279e07..79bfac3 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverterTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToArrayConverterTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.convert.multiple;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -36,7 +38,7 @@ public class StringToArrayConverterTest {
@BeforeEach
public void init() {
- converter = new StringToArrayConverter();
+ converter = new StringToArrayConverter(FrameworkModel.defaultModel());
}
@Test
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverterTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverterTest.java
index 2933d04..864b472 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverterTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToQueueConverterTest.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.common.convert.multiple;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -55,7 +56,7 @@ public class StringToQueueConverterTest {
@BeforeEach
public void init() {
- converter = new StringToQueueConverter();
+ converter = new StringToQueueConverter(FrameworkModel.defaultModel());
}
@Test
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToSetConverterTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToSetConverterTest.java
index 5925cec..4cc85e1 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToSetConverterTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/convert/multiple/StringToSetConverterTest.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.common.convert.multiple;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -55,7 +56,7 @@ public class StringToSetConverterTest {
@BeforeEach
public void init() {
- converter = new StringToSetConverter();
+ converter = new StringToSetConverter(FrameworkModel.defaultModel());
}
@Test
diff --git
a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/DefaultServiceRestMetadataResolver.java
b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/DefaultServiceRestMetadataResolver.java
index 698b58a..2128967 100644
---
a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/DefaultServiceRestMetadataResolver.java
+++
b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/DefaultServiceRestMetadataResolver.java
@@ -17,8 +17,10 @@
package org.apache.dubbo.metadata.annotation.processing.rest;
import org.apache.dubbo.common.convert.Converter;
+import org.apache.dubbo.common.convert.ConverterUtil;
import
org.apache.dubbo.metadata.annotation.processing.rest.jaxrs.JAXRSServiceRestMetadataResolver;
import
org.apache.dubbo.metadata.annotation.processing.rest.springmvc.SpringMvcServiceRestMetadataResolver;
+import org.apache.dubbo.rpc.model.FrameworkModel;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
@@ -32,7 +34,6 @@ import java.util.Set;
import static java.lang.String.valueOf;
import static java.util.Arrays.asList;
-import static org.apache.dubbo.common.convert.Converter.getConverter;
import static org.apache.dubbo.common.utils.ClassUtils.forName;
import static org.apache.dubbo.common.utils.StringUtils.SLASH_CHAR;
import static
org.apache.dubbo.metadata.annotation.processing.util.LoggerUtils.warn;
@@ -146,7 +147,7 @@ public class DefaultServiceRestMetadataResolver extends
AbstractServiceRestMetad
boolean supported;
try {
Class<?> targetType = forName(className, classLoader);
- supported = getConverter(String.class, targetType) != null;
+ supported =
FrameworkModel.defaultModel().getBeanFactory().getBean(ConverterUtil.class).getConverter(String.class,
targetType) != null;
} catch (ClassNotFoundException e) {
supported = false;
}