This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/master by this push: new 7234078 [Enhancement] Adding the overriding rule for ExtensionLoader (#6068) 7234078 is described below commit 7234078e8cf49f4ee0231b6cd0237fb730446dd1 Author: Mercy Ma <mercybl...@gmail.com> AuthorDate: Wed Apr 29 09:14:25 2020 +0800 [Enhancement] Adding the overriding rule for ExtensionLoader (#6068) --- dubbo-all/pom.xml | 10 +++ ...tegy.java => DubboInternalLoadingStrategy.java} | 18 +++-- ...dingStrategy.java => DubboLoadingStrategy.java} | 25 +++++-- .../dubbo/common/extension/ExtensionLoader.java | 84 +++++++++++++--------- .../dubbo/common/extension/LoadingStrategy.java | 15 +++- ...gStrategy.java => ServicesLoadingStrategy.java} | 24 +++++-- ...g.apache.dubbo.common.extension.LoadingStrategy | 3 + .../extension/DubboExternalLoadingStrategy.java} | 23 ++++-- .../common/extension/ExtensionLoaderTest.java | 64 +++++++++++++++++ .../convert/String2BooleanConverter.java} | 19 +++-- .../extension/convert/String2DoubleConverter.java} | 21 +++--- .../convert/String2IntegerConverter.java} | 19 +++-- .../org.apache.dubbo.common.convert.Converter | 2 + .../org.apache.dubbo.common.convert.Converter | 3 + ...g.apache.dubbo.common.extension.LoadingStrategy | 1 + .../remoting/http/servlet/ServletHttpBinder.java | 68 +++++++++--------- 16 files changed, 277 insertions(+), 122 deletions(-) diff --git a/dubbo-all/pom.xml b/dubbo-all/pom.xml index 677b8ef..872fc30 100644 --- a/dubbo-all/pom.xml +++ b/dubbo-all/pom.xml @@ -967,6 +967,16 @@ </resource> </transformer> + <!-- @since 2.7.7 --> + + <!-- 'dubbo-common' module --> + <transformer + implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> + <resource> + META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy + </resource> + </transformer> + </transformers> <filters> <filter> diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java similarity index 73% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java index 2de3f2e..841679f 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java @@ -16,14 +16,20 @@ */ package org.apache.dubbo.common.extension; -public interface LoadingStrategy { - String directory(); +/** + * Dubbo internal {@link LoadingStrategy} + * + * @since 2.7.7 + */ +public class DubboInternalLoadingStrategy implements LoadingStrategy { - default boolean preferExtensionClassLoader() { - return false; + @Override + public String directory() { + return "META-INF/dubbo/internal/"; } - default String[] excludedPackages() { - return null; + @Override + public int getPriority() { + return MAX_PRIORITY; } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboLoadingStrategy.java similarity index 70% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboLoadingStrategy.java index 2de3f2e..0a74969 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DubboLoadingStrategy.java @@ -16,14 +16,27 @@ */ package org.apache.dubbo.common.extension; -public interface LoadingStrategy { - String directory(); +/** + * Dubbo {@link LoadingStrategy} + * + * @since 2.7.7 + */ +public class DubboLoadingStrategy implements LoadingStrategy { + + @Override + public String directory() { + return "META-INF/dubbo/"; + } - default boolean preferExtensionClassLoader() { - return false; + @Override + public boolean overridden() { + return true; } - default String[] excludedPackages() { - return null; + @Override + public int getPriority() { + return NORMAL_PRIORITY; } + + } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index 844b51b..cf34202 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -45,24 +45,27 @@ import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.regex.Pattern; +import static java.util.Arrays.asList; import static java.util.Collections.sort; +import static java.util.ServiceLoader.load; +import static java.util.stream.StreamSupport.stream; import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY; import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX; /** - * * {@link org.apache.dubbo.rpc.model.ApplicationModel}, {@code DubboBootstrap} and this class are * at present designed to be singleton or static (by itself totally static or uses some static fields). * So the instances returned from them are of process or classloader scope. If you want to support * multiple dubbo servers in a single process, you may need to refactor these three classes. - * + * <p> * Load dubbo extensions * <ul> * <li>auto inject dependency extension </li> @@ -79,12 +82,6 @@ public class ExtensionLoader<T> { private static final Logger logger = LoggerFactory.getLogger(ExtensionLoader.class); - private static final String SERVICES_DIRECTORY = "META-INF/services/"; - - private static final String DUBBO_DIRECTORY = "META-INF/dubbo/"; - - private static final String DUBBO_INTERNAL_DIRECTORY = DUBBO_DIRECTORY + "internal/"; - private static final Pattern NAME_SEPARATOR = Pattern.compile("\\s*[,]+\\s*"); private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>(64); @@ -110,14 +107,36 @@ public class ExtensionLoader<T> { private Map<String, IllegalStateException> exceptions = new ConcurrentHashMap<>(); - private static LoadingStrategy DUBBO_INTERNAL_STRATEGY = () -> DUBBO_INTERNAL_DIRECTORY; - private static LoadingStrategy DUBBO_STRATEGY = () -> DUBBO_DIRECTORY; - private static LoadingStrategy SERVICES_STRATEGY = () -> SERVICES_DIRECTORY; - - private static LoadingStrategy[] strategies = new LoadingStrategy[] { DUBBO_INTERNAL_STRATEGY, DUBBO_STRATEGY, SERVICES_STRATEGY }; + private static volatile LoadingStrategy[] strategies = loadLoadingStrategies(); public static void setLoadingStrategies(LoadingStrategy... strategies) { - ExtensionLoader.strategies = strategies; + if (ArrayUtils.isNotEmpty(strategies)) { + ExtensionLoader.strategies = strategies; + } + } + + /** + * Load all {@link Prioritized prioritized} {@link LoadingStrategy Loading Strategies} via {@link ServiceLoader} + * + * @return non-null + * @since 2.7.7 + */ + private static LoadingStrategy[] loadLoadingStrategies() { + return stream(load(LoadingStrategy.class).spliterator(), false) + .sorted() + .toArray(LoadingStrategy[]::new); + } + + /** + * Get all {@link LoadingStrategy Loading Strategies} + * + * @return non-null + * @see LoadingStrategy + * @see Prioritized + * @since 2.7.7 + */ + public static List<LoadingStrategy> getLoadingStrategies() { + return asList(strategies); } private ExtensionLoader(Class<?> type) { @@ -239,7 +258,7 @@ public class ExtensionLoader<T> { */ public List<T> getActivateExtension(URL url, String[] values, String group) { List<T> activateExtensions = new ArrayList<>(); - List<String> names = values == null ? new ArrayList<>(0) : Arrays.asList(values); + List<String> names = values == null ? new ArrayList<>(0) : asList(values); if (!names.contains(REMOVE_VALUE_PREFIX + DEFAULT_KEY)) { getExtensionClasses(); for (Map.Entry<String, Object> entry : cachedActivates.entrySet()) { @@ -417,7 +436,7 @@ public class ExtensionLoader<T> { * @return non-null */ public T getOrDefaultExtension(String name) { - return containsExtension(name) ? getExtension(name) : getDefaultExtension(); + return containsExtension(name) ? getExtension(name) : getDefaultExtension(); } /** @@ -727,15 +746,15 @@ public class ExtensionLoader<T> { /** * synchronized in getExtensionClasses - * */ + */ private Map<String, Class<?>> loadExtensionClasses() { cacheDefaultExtensionName(); Map<String, Class<?>> extensionClasses = new HashMap<>(); for (LoadingStrategy strategy : strategies) { - loadDirectory(extensionClasses, strategy.directory(), type.getName(), strategy.preferExtensionClassLoader(), strategy.excludedPackages()); - loadDirectory(extensionClasses, strategy.directory(), type.getName().replace("org.apache", "com.alibaba"), strategy.preferExtensionClassLoader(), strategy.excludedPackages()); + loadDirectory(extensionClasses, strategy.directory(), type.getName(), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages()); + loadDirectory(extensionClasses, strategy.directory(), type.getName().replace("org.apache", "com.alibaba"), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages()); } return extensionClasses; @@ -764,11 +783,11 @@ public class ExtensionLoader<T> { } private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type) { - loadDirectory(extensionClasses, dir, type, false); + loadDirectory(extensionClasses, dir, type, false, false); } private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type, - boolean extensionLoaderClassLoaderFirst, String... excludedPackages) { + boolean extensionLoaderClassLoaderFirst, boolean overridden, String... excludedPackages) { String fileName = dir + type; try { Enumeration<java.net.URL> urls = null; @@ -782,7 +801,7 @@ public class ExtensionLoader<T> { } } - if(urls == null || !urls.hasMoreElements()) { + if (urls == null || !urls.hasMoreElements()) { if (classLoader != null) { urls = classLoader.getResources(fileName); } else { @@ -793,7 +812,7 @@ public class ExtensionLoader<T> { if (urls != null) { while (urls.hasMoreElements()) { java.net.URL resourceURL = urls.nextElement(); - loadResource(extensionClasses, classLoader, resourceURL, excludedPackages); + loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages); } } } catch (Throwable t) { @@ -803,7 +822,7 @@ public class ExtensionLoader<T> { } private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader, - java.net.URL resourceURL, String... excludedPackages) { + java.net.URL resourceURL, boolean overridden, String... excludedPackages) { try { try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) { String line; @@ -822,7 +841,7 @@ public class ExtensionLoader<T> { line = line.substring(i + 1).trim(); } if (line.length() > 0 && !isExcluded(line, excludedPackages)) { - loadClass(extensionClasses, resourceURL, Class.forName(line, true, classLoader), name); + loadClass(extensionClasses, resourceURL, Class.forName(line, true, classLoader), name, overridden); } } catch (Throwable t) { IllegalStateException e = new IllegalStateException("Failed to load extension class (interface: " + type + ", class line: " + line + ") in " + resourceURL + ", cause: " + t.getMessage(), t); @@ -848,14 +867,15 @@ public class ExtensionLoader<T> { return false; } - private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name) throws NoSuchMethodException { + private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name, + boolean overridden) throws NoSuchMethodException { if (!type.isAssignableFrom(clazz)) { throw new IllegalStateException("Error occurred when loading extension class (interface: " + type + ", class line: " + clazz.getName() + "), class " + clazz.getName() + " is not subtype of interface."); } if (clazz.isAnnotationPresent(Adaptive.class)) { - cacheAdaptiveClass(clazz); + cacheAdaptiveClass(clazz, overridden); } else if (isWrapperClass(clazz)) { cacheWrapperClass(clazz); } else { @@ -872,7 +892,7 @@ public class ExtensionLoader<T> { cacheActivateClass(clazz, names[0]); for (String n : names) { cacheName(clazz, n); - saveInExtensionClass(extensionClasses, clazz, n); + saveInExtensionClass(extensionClasses, clazz, n, overridden); } } } @@ -890,9 +910,9 @@ public class ExtensionLoader<T> { /** * put clazz in extensionClasses */ - private void saveInExtensionClass(Map<String, Class<?>> extensionClasses, Class<?> clazz, String name) { + private void saveInExtensionClass(Map<String, Class<?>> extensionClasses, Class<?> clazz, String name, boolean overridden) { Class<?> c = extensionClasses.get(name); - if (c == null) { + if (c == null || overridden) { extensionClasses.put(name, clazz); } else if (c != clazz) { String duplicateMsg = "Duplicate extension " + type.getName() + " name " + name + " on " + c.getName() + " and " + clazz.getName(); @@ -922,8 +942,8 @@ public class ExtensionLoader<T> { /** * cache Adaptive class which is annotated with <code>Adaptive</code> */ - private void cacheAdaptiveClass(Class<?> clazz) { - if (cachedAdaptiveClass == null) { + private void cacheAdaptiveClass(Class<?> clazz, boolean overridden) { + if (cachedAdaptiveClass == null || overridden) { cachedAdaptiveClass = clazz; } else if (!cachedAdaptiveClass.equals(clazz)) { throw new IllegalStateException("More than 1 adaptive class found: " diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java index 2de3f2e..2d4faf5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java @@ -16,7 +16,10 @@ */ package org.apache.dubbo.common.extension; -public interface LoadingStrategy { +import org.apache.dubbo.common.lang.Prioritized; + +public interface LoadingStrategy extends Prioritized { + String directory(); default boolean preferExtensionClassLoader() { @@ -26,4 +29,14 @@ public interface LoadingStrategy { default String[] excludedPackages() { return null; } + + /** + * Indicates current {@link LoadingStrategy} supports overriding other lower prioritized instances or not. + * + * @return if supports, return <code>true</code>, or <code>false</code> + * @since 2.7.7 + */ + default boolean overridden() { + return false; + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ServicesLoadingStrategy.java similarity index 70% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/main/java/org/apache/dubbo/common/extension/ServicesLoadingStrategy.java index 2de3f2e..779d0aa 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ServicesLoadingStrategy.java @@ -16,14 +16,26 @@ */ package org.apache.dubbo.common.extension; -public interface LoadingStrategy { - String directory(); +/** + * Services {@link LoadingStrategy} + * + * @since 2.7.7 + */ +public class ServicesLoadingStrategy implements LoadingStrategy { - default boolean preferExtensionClassLoader() { - return false; + @Override + public String directory() { + return "META-INF/services/"; } - default String[] excludedPackages() { - return null; + @Override + public boolean overridden() { + return true; } + + @Override + public int getPriority() { + return MIN_PRIORITY; + } + } diff --git a/dubbo-common/src/main/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy b/dubbo-common/src/main/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy new file mode 100644 index 0000000..358696e --- /dev/null +++ b/dubbo-common/src/main/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy @@ -0,0 +1,3 @@ +org.apache.dubbo.common.extension.DubboInternalLoadingStrategy +org.apache.dubbo.common.extension.DubboLoadingStrategy +org.apache.dubbo.common.extension.ServicesLoadingStrategy \ No newline at end of file diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/DubboExternalLoadingStrategy.java similarity index 68% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/test/java/org/apache/dubbo/common/extension/DubboExternalLoadingStrategy.java index 2de3f2e..9ae2678 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/DubboExternalLoadingStrategy.java @@ -16,14 +16,25 @@ */ package org.apache.dubbo.common.extension; -public interface LoadingStrategy { - String directory(); +/** + * Dubbo external {@link LoadingStrategy} for testing + * + * @since 2.7.7 + */ +public class DubboExternalLoadingStrategy implements LoadingStrategy { + + @Override + public String directory() { + return "META-INF/dubbo/external/"; + } - default boolean preferExtensionClassLoader() { - return false; + @Override + public boolean overridden() { + return true; } - default String[] excludedPackages() { - return null; + @Override + public int getPriority() { + return MAX_PRIORITY + 1; } } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java index 393ae3a..a1a534a 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java @@ -17,6 +17,10 @@ package org.apache.dubbo.common.extension; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.convert.Converter; +import org.apache.dubbo.common.convert.StringToBooleanConverter; +import org.apache.dubbo.common.convert.StringToDoubleConverter; +import org.apache.dubbo.common.convert.StringToIntegerConverter; import org.apache.dubbo.common.extension.activate.ActivateExt1; import org.apache.dubbo.common.extension.activate.impl.ActivateExt1Impl1; import org.apache.dubbo.common.extension.activate.impl.GroupActivateExtImpl; @@ -25,6 +29,9 @@ import org.apache.dubbo.common.extension.activate.impl.OldActivateExt1Impl3; import org.apache.dubbo.common.extension.activate.impl.OrderActivateExtImpl1; import org.apache.dubbo.common.extension.activate.impl.OrderActivateExtImpl2; import org.apache.dubbo.common.extension.activate.impl.ValueActivateExtImpl; +import org.apache.dubbo.common.extension.convert.String2BooleanConverter; +import org.apache.dubbo.common.extension.convert.String2DoubleConverter; +import org.apache.dubbo.common.extension.convert.String2IntegerConverter; import org.apache.dubbo.common.extension.ext1.SimpleExt; import org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl1; import org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl2; @@ -49,6 +56,7 @@ import org.apache.dubbo.common.extension.ext9_empty.Ext9Empty; import org.apache.dubbo.common.extension.ext9_empty.impl.Ext9EmptyImpl; import org.apache.dubbo.common.extension.injection.InjectExt; import org.apache.dubbo.common.extension.injection.impl.InjectExtImpl; +import org.apache.dubbo.common.lang.Prioritized; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -60,6 +68,7 @@ import java.util.Set; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; +import static org.apache.dubbo.common.extension.ExtensionLoader.getLoadingStrategies; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.instanceOf; @@ -466,4 +475,59 @@ public class ExtensionLoaderTest { assertEquals(1, loader.getSupportedExtensions().size()); assertEquals(Collections.singleton("injection"), loader.getSupportedExtensions()); } + + /** + * @since 2.7.7 + */ + @Test + public void testOverridden() { + ExtensionLoader<Converter> loader = getExtensionLoader(Converter.class); + + Converter converter = loader.getExtension("string-to-boolean"); + assertEquals(String2BooleanConverter.class, converter.getClass()); + + converter = loader.getExtension("string-to-double"); + assertEquals(String2DoubleConverter.class, converter.getClass()); + + converter = loader.getExtension("string-to-integer"); + assertEquals(String2IntegerConverter.class, converter.getClass()); + + assertEquals("string-to-boolean", loader.getExtensionName(String2BooleanConverter.class)); + assertEquals("string-to-boolean", loader.getExtensionName(StringToBooleanConverter.class)); + + assertEquals("string-to-double", loader.getExtensionName(String2DoubleConverter.class)); + assertEquals("string-to-double", loader.getExtensionName(StringToDoubleConverter.class)); + + assertEquals("string-to-integer", loader.getExtensionName(String2IntegerConverter.class)); + assertEquals("string-to-integer", loader.getExtensionName(StringToIntegerConverter.class)); + } + + /** + * @since 2.7.7 + */ + @Test + public void testGetLoadingStrategies() { + List<LoadingStrategy> strategies = getLoadingStrategies(); + + assertEquals(4, strategies.size()); + + int i = 0; + + LoadingStrategy loadingStrategy = strategies.get(i++); + assertEquals(DubboInternalLoadingStrategy.class, loadingStrategy.getClass()); + assertEquals(Prioritized.MAX_PRIORITY, loadingStrategy.getPriority()); + + loadingStrategy = strategies.get(i++); + assertEquals(DubboExternalLoadingStrategy.class, loadingStrategy.getClass()); + assertEquals(Prioritized.MAX_PRIORITY + 1, loadingStrategy.getPriority()); + + + loadingStrategy = strategies.get(i++); + assertEquals(DubboLoadingStrategy.class, loadingStrategy.getClass()); + assertEquals(Prioritized.NORMAL_PRIORITY, loadingStrategy.getPriority()); + + loadingStrategy = strategies.get(i++); + assertEquals(ServicesLoadingStrategy.class, loadingStrategy.getClass()); + assertEquals(Prioritized.MIN_PRIORITY, loadingStrategy.getPriority()); + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2BooleanConverter.java similarity index 70% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2BooleanConverter.java index 2de3f2e..399822a 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2BooleanConverter.java @@ -14,16 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.common.extension; +package org.apache.dubbo.common.extension.convert; -public interface LoadingStrategy { - String directory(); +import org.apache.dubbo.common.convert.Converter; +import org.apache.dubbo.common.convert.StringToBooleanConverter; - default boolean preferExtensionClassLoader() { - return false; - } - - default String[] excludedPackages() { - return null; - } +/** + * A {@link Converter} implementation of {@linkg String} to {@link Boolean} + * + * @since 2.7.7 + */ +public class String2BooleanConverter extends StringToBooleanConverter { } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2DoubleConverter.java similarity index 70% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2DoubleConverter.java index 2de3f2e..3cb2786 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2DoubleConverter.java @@ -14,16 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.common.extension; +package org.apache.dubbo.common.extension.convert; -public interface LoadingStrategy { - String directory(); +import org.apache.dubbo.common.convert.Converter; +import org.apache.dubbo.common.convert.StringToDoubleConverter; - default boolean preferExtensionClassLoader() { - return false; - } - - default String[] excludedPackages() { - return null; - } -} +/** + * A {@link Converter} implementation of {@linkg String} to {@link Double} + * + * @since 2.7.7 + */ +public class String2DoubleConverter extends StringToDoubleConverter { +} \ No newline at end of file diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2IntegerConverter.java similarity index 70% copy from dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java copy to dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2IntegerConverter.java index 2de3f2e..85f51ab 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/LoadingStrategy.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/convert/String2IntegerConverter.java @@ -14,16 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.common.extension; +package org.apache.dubbo.common.extension.convert; -public interface LoadingStrategy { - String directory(); +import org.apache.dubbo.common.convert.Converter; +import org.apache.dubbo.common.convert.StringToIntegerConverter; - default boolean preferExtensionClassLoader() { - return false; - } - - default String[] excludedPackages() { - return null; - } +/** + * A {@link Converter} implementation of {@linkg String} to {@link Integer} + * + * @since 2.7.7 + */ +public class String2IntegerConverter extends StringToIntegerConverter { } diff --git a/dubbo-common/src/test/resources/META-INF/dubbo/external/org.apache.dubbo.common.convert.Converter b/dubbo-common/src/test/resources/META-INF/dubbo/external/org.apache.dubbo.common.convert.Converter new file mode 100644 index 0000000..917db37 --- /dev/null +++ b/dubbo-common/src/test/resources/META-INF/dubbo/external/org.apache.dubbo.common.convert.Converter @@ -0,0 +1,2 @@ +# org.apache.dubbo.common.convert.Converter +string-to-boolean=org.apache.dubbo.common.extension.convert.String2BooleanConverter \ No newline at end of file diff --git a/dubbo-common/src/test/resources/META-INF/dubbo/org.apache.dubbo.common.convert.Converter b/dubbo-common/src/test/resources/META-INF/dubbo/org.apache.dubbo.common.convert.Converter new file mode 100644 index 0000000..4fddebc --- /dev/null +++ b/dubbo-common/src/test/resources/META-INF/dubbo/org.apache.dubbo.common.convert.Converter @@ -0,0 +1,3 @@ +# org.apache.dubbo.common.convert.Converter +string-to-double=org.apache.dubbo.common.extension.convert.String2DoubleConverter +string-to-integer=org.apache.dubbo.common.extension.convert.String2IntegerConverter \ No newline at end of file diff --git a/dubbo-common/src/test/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy b/dubbo-common/src/test/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy new file mode 100644 index 0000000..ebae30a --- /dev/null +++ b/dubbo-common/src/test/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy @@ -0,0 +1 @@ +org.apache.dubbo.common.extension.DubboExternalLoadingStrategy \ No newline at end of file diff --git a/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/servlet/ServletHttpBinder.java b/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/servlet/ServletHttpBinder.java index cb015b7..447ea4e 100644 --- a/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/servlet/ServletHttpBinder.java +++ b/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/servlet/ServletHttpBinder.java @@ -1,34 +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.remoting.http.servlet; - -import org.apache.dubbo.common.URL; -import org.apache.dubbo.remoting.http.HttpBinder; -import org.apache.dubbo.remoting.http.HttpHandler; -import org.apache.dubbo.remoting.http.HttpServer; - -/** - * ServletHttpTransporter - */ -public class ServletHttpBinder implements HttpBinder { - - @Override - public HttpServer bind(URL url, HttpHandler handler) { - return new ServletHttpServer(url, handler); - } - -} +/* + * 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.remoting.http.servlet; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.remoting.http.HttpBinder; +import org.apache.dubbo.remoting.http.HttpHandler; +import org.apache.dubbo.remoting.http.HttpServer; + +/** + * ServletHttpTransporter + */ +public class ServletHttpBinder implements HttpBinder { + + @Override + public HttpServer bind(URL url, HttpHandler handler) { + return new ServletHttpServer(url, handler); + } + +}