Skip to content

Commit

Permalink
增加PluginManagerTest
Browse files Browse the repository at this point in the history
  • Loading branch information
codefollower committed Jan 15, 2023
1 parent d7ac089 commit bc3726d
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 8 deletions.
27 changes: 19 additions & 8 deletions lealone-common/src/main/java/org/lealone/db/PluginManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package org.lealone.db;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -48,7 +49,7 @@ public void registerPlugin(T plugin, String... alias) {

public void deregisterPlugin(T plugin, String... alias) {
plugins.remove(plugin.getName().toUpperCase());
plugins.remove(plugin.getClass().getName().toUpperCase().toUpperCase());
plugins.remove(plugin.getClass().getName().toUpperCase());
if (alias != null) {
for (String a : alias)
plugins.remove(a.toUpperCase());
Expand All @@ -58,15 +59,17 @@ public void deregisterPlugin(T plugin, String... alias) {
private synchronized void loadPlugins() {
if (loaded)
return;
try {
// 执行next时ServiceLoader内部会自动为每一个实现Plugin接口的类生成一个新实例
// 所以Plugin接口的实现类必需有一个public的无参数构造函数
for (T p : ServiceLoader.load(pluginClass)) {
Iterator<T> iterator = ServiceLoader.load(pluginClass).iterator();
while (iterator.hasNext()) {
try {
// 执行next时ServiceLoader内部会自动为每一个实现Plugin接口的类生成一个新实例
// 所以Plugin接口的实现类必需有一个public的无参数构造函数
T p = iterator.next();
registerPlugin(p);
} catch (Throwable t) {
// 只是发出警告
logger.warn("Failed to load plugin: " + pluginClass.getName(), t);
}
} catch (Throwable t) {
// 只是发出警告
logger.warn("Failed to load plugin: " + pluginClass.getName(), t);
}
// 注意在load完之后再设为true,否则其他线程可能会因为不用等待load完成从而得到一个NPE
loaded = true;
Expand Down Expand Up @@ -104,7 +107,15 @@ public static <P extends Plugin> void register(P plugin, String... alias) {
getInstance(plugin).registerPlugin(plugin, alias);
}

public static <P extends Plugin> void register(Class<P> pluginClass, P plugin, String... alias) {
getInstance(pluginClass).registerPlugin(plugin, alias);
}

public static <P extends Plugin> void deregister(P plugin, String... alias) {
getInstance(plugin).deregisterPlugin(plugin, alias);
}

public static <P extends Plugin> void deregister(Class<P> pluginClass, P plugin, String... alias) {
getInstance(pluginClass).deregisterPlugin(plugin, alias);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright Lealone Database Group.
* Licensed under the Server Side Public License, v 1.
* Initial Developer: zhh
*/
package org.lealone.test.misc;

import org.junit.Test;
import org.lealone.db.PluginManager;
import org.lealone.storage.StorageEngine;
import org.lealone.storage.aose.AOStorageEngine;
import org.lealone.test.TestBase;

public class PluginManagerTest extends TestBase {
@Test
public void run() {
StorageEngine se = PluginManager.getPlugin(StorageEngine.class, AOStorageEngine.NAME);
StorageEngine old = se;
assertTrue(se instanceof AOStorageEngine);

// 默认是用StorageEngine.class为key,所以用AOStorageEngine.class时找不到
se = PluginManager.getPlugin(AOStorageEngine.class, AOStorageEngine.NAME);
assertNull(se);

PluginManager.deregister(StorageEngine.class, old);
se = PluginManager.getPlugin(StorageEngine.class, AOStorageEngine.NAME);
assertNull(se);

se = new AOStorageEngine();
PluginManager.register(se, "myaose");
se = PluginManager.getPlugin(AOStorageEngine.class, "myaose");
assertNotNull(se);

// 重新注册回去,避免集成测试时影响其他测试用例
PluginManager.register(StorageEngine.class, old);
se = PluginManager.getPlugin(StorageEngine.class, AOStorageEngine.NAME);
assertNotNull(se);
}
}

0 comments on commit bc3726d

Please sign in to comment.