use of com.alipay.sofa.ark.spi.model.Plugin in project sofa-ark by sofastack.
the class HandleArchiveStage method process.
@Override
public void process(PipelineContext pipelineContext) throws ArkRuntimeException {
try {
if (ArkConfigs.isEmbedEnable()) {
processEmbed(pipelineContext);
return;
}
ExecutableArchive executableArchive = pipelineContext.getExecutableArchive();
List<BizArchive> bizArchives = executableArchive.getBizArchives();
List<PluginArchive> pluginArchives = executableArchive.getPluginArchives();
if (useDynamicConfig()) {
AssertUtils.isFalse(StringUtils.isEmpty(ArkConfigs.getStringValue(Constants.MASTER_BIZ)), "Master biz should be configured when using dynamic config.");
}
int bizCount = 0;
for (BizArchive bizArchive : bizArchives) {
Biz biz = bizFactoryService.createBiz(bizArchive);
if (bizArchive instanceof DirectoryBizArchive) {
if (!((DirectoryBizArchive) bizArchive).isTestMode()) {
bizManagerService.registerBiz(biz);
bizCount += 1;
}
} else if (useDynamicConfig()) {
if (biz.getBizName().equals(ArkConfigs.getStringValue(Constants.MASTER_BIZ))) {
bizManagerService.registerBiz(biz);
bizCount += 1;
} else {
LOGGER.warn("The biz of {} is ignored when using dynamic config.", biz.getIdentity());
}
} else {
if (!isBizExcluded(biz)) {
bizManagerService.registerBiz(biz);
bizCount += 1;
} else {
LOGGER.warn(String.format("The biz of %s is excluded.", biz.getIdentity()));
}
}
}
// master biz should be specified when deploy multi biz, otherwise the only biz would be token as master biz
if (bizCount > 1) {
AssertUtils.isFalse(StringUtils.isEmpty(ArkConfigs.getStringValue(Constants.MASTER_BIZ)), "Master biz should be configured when deploy multi biz.");
String masterBizName = ArkConfigs.getStringValue(Constants.MASTER_BIZ);
for (Biz biz : bizManagerService.getBizInOrder()) {
if (masterBizName.equals(biz.getBizName())) {
ArkClient.setMasterBiz(biz);
}
}
} else {
List<Biz> bizList = bizManagerService.getBizInOrder();
if (!bizList.isEmpty() && StringUtils.isEmpty(ArkConfigs.getStringValue(Constants.MASTER_BIZ))) {
ArkConfigs.putStringValue(Constants.MASTER_BIZ, bizList.get(0).getBizName());
ArkClient.setMasterBiz(bizList.get(0));
}
}
URL[] exportUrls = null;
Set<String> exportPackages = new HashSet<>();
Biz masterBiz = ArkClient.getMasterBiz();
for (BizArchive bizArchive : bizArchives) {
Attributes mainAttributes = bizArchive.getManifest().getMainAttributes();
String bizName = mainAttributes.getValue(ARK_BIZ_NAME);
// extension from master biz
if (bizArchive instanceof JarBizArchive && masterBiz.getBizName().equalsIgnoreCase(bizName)) {
String exportPackageStr = mainAttributes.getValue(INJECT_EXPORT_PACKAGES);
exportPackages.addAll(StringUtils.strToSet(exportPackageStr, MANIFEST_VALUE_SPLIT));
exportUrls = ((JarBizArchive) bizArchive).getExportUrls();
}
}
for (PluginArchive pluginArchive : pluginArchives) {
Plugin plugin = pluginFactoryService.createPlugin(pluginArchive, exportUrls, exportPackages);
if (!isPluginExcluded(plugin)) {
pluginManagerService.registerPlugin(plugin);
} else {
LOGGER.warn(String.format("The plugin of %s is excluded.", plugin.getPluginName()));
}
}
} catch (Throwable ex) {
throw new ArkRuntimeException(ex.getMessage(), ex);
}
}
use of com.alipay.sofa.ark.spi.model.Plugin in project sofa-ark by sofastack.
the class BizFactoryServiceTest method test.
@Test
public void test() throws Throwable {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL samplePlugin = cl.getResource("sample-plugin.jar");
Plugin plugin = pluginFactoryService.createPlugin(new File(samplePlugin.getFile()));
pluginManagerService.registerPlugin(plugin);
URL sampleBiz = cl.getResource("sample-biz.jar");
Biz biz = bizFactoryService.createBiz(new File(sampleBiz.getFile()));
bizManagerService.registerBiz(biz);
Assert.assertNotNull(biz);
Assert.assertNotNull(biz.getBizClassLoader().getResource(Constants.ARK_PLUGIN_MARK_ENTRY));
}
use of com.alipay.sofa.ark.spi.model.Plugin in project sofa-ark by sofastack.
the class ClassLoaderServiceTest method testIsClassImport.
@Test
public void testIsClassImport() {
Plugin plugin = new PluginModel().setPluginName("mockPlugin").setImportClasses(null).setImportPackages("a.c,a.b.c.*,a.b.c");
pluginManagerService.registerPlugin(plugin);
Assert.assertTrue(classloaderService.isClassInImport("mockPlugin", "a.c.e"));
Assert.assertFalse(classloaderService.isClassInImport("mockPlugin", "a.c"));
Assert.assertFalse(classloaderService.isClassInImport("mockPlugin", "a.c.e.f"));
Assert.assertFalse(classloaderService.isClassInImport("mockPlugin", "a.b.c"));
Assert.assertTrue(classloaderService.isClassInImport("mockPlugin", "a.b.c.e"));
Assert.assertTrue(classloaderService.isClassInImport("mockPlugin", "a.b.c.e.f"));
}
use of com.alipay.sofa.ark.spi.model.Plugin in project sofa-ark by sofastack.
the class ClassLoaderServiceTest method testFindExportClass.
@Test
public void testFindExportClass() {
PluginClassLoader pluginClassLoader = new PluginClassLoader("mockPlugin", new URL[] {});
Plugin plugin = new PluginModel().setPluginName("mockPlugin").setExportPackages("a.b.*,a.f,a.b.f").setExportClasses("a.e.f.G").setPluginClassLoader(pluginClassLoader).setExportResources("");
pluginManagerService.registerPlugin(plugin);
classloaderService.prepareExportClassAndResourceCache();
Assert.assertNull(classloaderService.findExportClassLoader("a.b"));
Assert.assertTrue(pluginClassLoader.equals(classloaderService.findExportClassLoader("a.b.e.f")));
Assert.assertTrue(pluginClassLoader.equals(classloaderService.findExportClassLoader("a.f.g")));
Assert.assertTrue(pluginClassLoader.equals(classloaderService.findExportClassLoader("a.e.f.G")));
Assert.assertTrue(pluginClassLoader.equals(classloaderService.findExportClassLoader("a.b.f.m")));
Assert.assertTrue(pluginClassLoader.equals(classloaderService.findExportClassLoader("a.b.f.m.g")));
Assert.assertNull(classloaderService.findExportClassLoader("a.f.h.m"));
Assert.assertNull(classloaderService.findExportClassLoader("a"));
pluginManagerService.getPluginsInOrder().remove(plugin);
}
use of com.alipay.sofa.ark.spi.model.Plugin in project sofa-ark by sofastack.
the class BaseTest method registerMockPlugin.
protected void registerMockPlugin() {
if (arkContainer == null) {
String[] args = new String[] { "-Ajar=" + jarURL.toExternalForm() };
arkContainer = (ArkContainer) ArkContainer.main(args);
}
PluginManagerService pluginManagerService = ArkServiceContainerHolder.getContainer().getService(PluginManagerService.class);
Plugin plugin = new PluginModel().setPluginName("mock").setPluginClassLoader(this.getClass().getClassLoader()).setImportClasses("").setImportPackages("").setImportResources("");
pluginManagerService.registerPlugin(plugin);
}
Aggregations