Skip to content

Commit

Permalink
Add ClassLoader Binding for ScopeModel (#8766)
Browse files Browse the repository at this point in the history
* Add ClassLoader Binding for ScopeModel

* Fix UT

* Fix UT

* Fix UT

* Fix API

* Fix UT

* remove ExtensionLoader reload

* Fix cl

* Fix cl

* Fix NPE

* Fix override method
  • Loading branch information
AlbumenJ committed Sep 11, 2021
1 parent d173d16 commit 2bd54ae
Show file tree
Hide file tree
Showing 26 changed files with 320 additions and 216 deletions.
Expand Up @@ -95,7 +95,7 @@ private void loadMigrationRule() {
path = CommonConstants.DEFAULT_DUBBO_MIGRATION_FILE;
}
}
this.localMigrationRule = ConfigUtils.loadMigrationRule(path);
this.localMigrationRule = ConfigUtils.loadMigrationRule(applicationModel.getClassLoaders(), path);
}

@Deprecated
Expand Down Expand Up @@ -313,4 +313,9 @@ public String getLocalMigrationRule() {
return localMigrationRule;
}

public void refreshClassLoaders() {
propertiesConfiguration.refresh();
loadMigrationRule();
}

}
Expand Up @@ -31,7 +31,17 @@
*/
public class PropertiesConfiguration implements Configuration {

private Properties properties;
private final ApplicationModel applicationModel;

public PropertiesConfiguration(ApplicationModel applicationModel) {
this.applicationModel = applicationModel;
refresh();
}

public void refresh() {
//load the default properties
properties = ConfigUtils.getProperties(applicationModel.getClassLoaders());

ExtensionLoader<OrderedPropertiesProvider> propertiesProviderExtensionLoader = applicationModel.getExtensionLoader(OrderedPropertiesProvider.class);
Set<String> propertiesProviderNames = propertiesProviderExtensionLoader.getSupportedExtensions();
Expand All @@ -48,23 +58,38 @@ public PropertiesConfiguration(ApplicationModel applicationModel) {
return b.priority() - a.priority();
});

//load the default properties
Properties properties = ConfigUtils.getProperties();

//override the properties.
for (OrderedPropertiesProvider orderedPropertiesProvider :
orderedPropertiesProviders) {
orderedPropertiesProviders) {
properties.putAll(orderedPropertiesProvider.initProperties());
}
}

@Override
public String getProperty(String key) {
return properties.getProperty(key);
}

@Override
public Object getInternalProperty(String key) {
return ConfigUtils.getProperty(key);
return properties.getProperty(key);
}

public void setProperty(String key, String value) {
properties.setProperty(key, value);
}

public String remove(String key) {
return (String) properties.remove(key);
}

@Deprecated
public void setProperties(Properties properties) {
this.properties = properties;
}

public Map<String, String> getProperties() {
return (Map) ConfigUtils.getProperties();
return (Map) properties;
}
}
Expand Up @@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.extension;

import org.apache.dubbo.rpc.model.ScopeModel;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
Expand All @@ -34,10 +36,12 @@ public class ExtensionDirector implements ExtensionAccessor {
private ExtensionDirector parent;
private final ExtensionScope scope;
private List<ExtensionPostProcessor> extensionPostProcessors = new ArrayList<>();
private ScopeModel scopeModel;

public ExtensionDirector(ExtensionDirector parent, ExtensionScope scope) {
public ExtensionDirector(ExtensionDirector parent, ExtensionScope scope, ScopeModel scopeModel) {
this.parent = parent;
this.scope = scope;
this.scopeModel = scopeModel;
}

public void addExtensionPostProcessor(ExtensionPostProcessor processor) {
Expand Down Expand Up @@ -107,7 +111,7 @@ private <T> ExtensionLoader<T> createExtensionLoader(Class<T> type) {

private <T> ExtensionLoader<T> createExtensionLoader0(Class<T> type) {
ExtensionLoader<T> loader;
extensionLoadersMap.putIfAbsent(type, new ExtensionLoader<T>(type, this));
extensionLoadersMap.putIfAbsent(type, new ExtensionLoader<T>(type, this, scopeModel));
loader = (ExtensionLoader<T>) extensionLoadersMap.get(type);
return loader;
}
Expand All @@ -124,4 +128,8 @@ private static boolean withExtensionAnnotation(Class<?> type) {
public ExtensionDirector getParent() {
return parent;
}

public void removeAllCachedLoader() {
// extensionLoadersMap.clear();
}
}
Expand Up @@ -37,6 +37,7 @@
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModel;
import org.apache.dubbo.rpc.model.ScopeModelAccessor;

import java.io.BufferedReader;
Expand Down Expand Up @@ -130,6 +131,7 @@ public class ExtensionLoader<T> {
private InstantiationStrategy instantiationStrategy;
private Environment environment;
private ActivateComparator activateComparator;
private ScopeModel scopeModel;

public static void setLoadingStrategies(LoadingStrategy... strategies) {
if (ArrayUtils.isNotEmpty(strategies)) {
Expand Down Expand Up @@ -161,14 +163,15 @@ public static List<LoadingStrategy> getLoadingStrategies() {
return asList(strategies);
}

ExtensionLoader(Class<?> type, ExtensionDirector extensionDirector) {
ExtensionLoader(Class<?> type, ExtensionDirector extensionDirector, ScopeModel scopeModel) {
this.type = type;
this.extensionDirector = extensionDirector;
this.extensionPostProcessors = extensionDirector.getExtensionPostProcessors();
initInstantiationStrategy();
this.injector = (type == ExtensionInjector.class ? null : extensionDirector.getExtensionLoader(ExtensionInjector.class)
.getAdaptiveExtension());
this.activateComparator = new ActivateComparator(extensionDirector);
this.scopeModel = scopeModel;
}

private void initInstantiationStrategy() {
Expand Down Expand Up @@ -917,29 +920,28 @@ private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, S
boolean extensionLoaderClassLoaderFirst, boolean overridden, String... excludedPackages) {
String fileName = dir + type;
try {
Enumeration<java.net.URL> urls = null;
ClassLoader classLoader = findClassLoader();

Enumeration<java.net.URL> urls;

// try to load from ExtensionLoader's ClassLoader first
if (extensionLoaderClassLoaderFirst) {
ClassLoader extensionLoaderClassLoader = ExtensionLoader.class.getClassLoader();
if (ClassLoader.getSystemClassLoader() != extensionLoaderClassLoader) {
urls = extensionLoaderClassLoader.getResources(fileName);
loadFromClass(extensionClasses, overridden, urls, extensionLoaderClassLoader, excludedPackages);
}
}

if (urls == null || !urls.hasMoreElements()) {
if (classLoader != null) {
urls = classLoader.getResources(fileName);
} else {
urls = ClassLoader.getSystemResources(fileName);
}
}
// load from scope model
Set<ClassLoader> classLoaders = scopeModel.getClassLoaders();

if (urls != null) {
while (urls.hasMoreElements()) {
java.net.URL resourceURL = urls.nextElement();
loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages);
if (CollectionUtils.isEmpty(classLoaders)) {
urls = ClassLoader.getSystemResources(fileName);
loadFromClass(extensionClasses, overridden, urls, null, excludedPackages);
} else {
for (ClassLoader classLoader : classLoaders) {
urls = classLoader.getResources(fileName);
loadFromClass(extensionClasses, overridden, urls, classLoader, excludedPackages);
}
}
} catch (Throwable t) {
Expand All @@ -948,6 +950,15 @@ private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, S
}
}

private void loadFromClass(Map<String, Class<?>> extensionClasses, boolean overridden, Enumeration<java.net.URL> urls, ClassLoader classLoader, String[] excludedPackages) {
if (urls != null) {
while (urls.hasMoreElements()) {
java.net.URL resourceURL = urls.nextElement();
loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages);
}
}
}

private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader,
java.net.URL resourceURL, boolean overridden, String... excludedPackages) {
try {
Expand Down

0 comments on commit 2bd54ae

Please sign in to comment.