This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 0225711  Check duplicate providers in bootstrap (#2976)
0225711 is described below

commit 0225711e267a9cdd6ca94366d59c2c7c8bae7543
Author: 吴晟 Wu Sheng <[email protected]>
AuthorDate: Mon Jul 1 15:54:12 2019 +0800

    Check duplicate providers in bootstrap (#2976)
    
    * Enhance module manager
---
 .../core/storage/StorageInstallerTestCase.java     | 13 ++---
 .../oap/server/library/module/BootstrapFlow.java   | 10 ++--
 .../oap/server/library/module/ModuleDefine.java    | 56 +++++++++-------------
 3 files changed, 37 insertions(+), 42 deletions(-)

diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/StorageInstallerTestCase.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/StorageInstallerTestCase.java
index 73c4c76..1baa2c0 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/StorageInstallerTestCase.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/StorageInstallerTestCase.java
@@ -18,12 +18,14 @@
 
 package org.apache.skywalking.oap.server.core.storage;
 
-import java.util.LinkedList;
-import org.apache.skywalking.oap.server.core.*;
+import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.CoreModuleProvider;
 import org.apache.skywalking.oap.server.core.remote.define.StreamDataMapping;
-import org.apache.skywalking.oap.server.core.storage.model.*;
+import org.apache.skywalking.oap.server.core.storage.model.Model;
+import org.apache.skywalking.oap.server.core.storage.model.ModelInstaller;
 import org.apache.skywalking.oap.server.library.client.Client;
-import org.apache.skywalking.oap.server.library.module.*;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import 
org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.powermock.reflect.Whitebox;
@@ -40,8 +42,7 @@ public class StorageInstallerTestCase {
         CoreModule moduleDefine = Mockito.spy(CoreModule.class);
         ModuleManager moduleManager = Mockito.mock(ModuleManager.class);
 
-        LinkedList<ModuleProvider> moduleProviders = 
Whitebox.getInternalState(moduleDefine, "loadedProviders");
-        moduleProviders.add(moduleProvider);
+        Whitebox.setInternalState(moduleDefine, "loadedProvider", 
moduleProvider);
 
         
Mockito.when(moduleManager.find(CoreModule.NAME)).thenReturn(moduleDefine);
         
Mockito.when(moduleProvider.getService(StreamDataMapping.class)).thenReturn(streamDataMapping);
diff --git 
a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
 
b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
index 80187dd..e24192c 100644
--- 
a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
+++ 
b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
@@ -18,9 +18,13 @@
 
 package org.apache.skywalking.oap.server.library.module;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
-import org.slf4j.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author wu-sheng, peng-yongsheng
@@ -66,7 +70,7 @@ class BootstrapFlow {
 
     private void makeSequence() throws CycleDependencyException {
         List<ModuleProvider> allProviders = new ArrayList<>();
-        loadedModules.forEach((moduleName, module) -> 
allProviders.addAll(module.providers()));
+        loadedModules.forEach((moduleName, module) -> 
allProviders.add(module.provider()));
 
         do {
             int numOfToBeSequenced = allProviders.size();
diff --git 
a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
 
b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
index 8aaa75c..0f95a2b 100644
--- 
a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
+++ 
b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
@@ -19,8 +19,11 @@
 package org.apache.skywalking.oap.server.library.module;
 
 import java.lang.reflect.Field;
-import java.util.*;
-import org.slf4j.*;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.ServiceLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A module definition.
@@ -31,7 +34,7 @@ public abstract class ModuleDefine implements 
ModuleProviderHolder {
 
     private static final Logger logger = 
LoggerFactory.getLogger(ModuleDefine.class);
 
-    private final LinkedList<ModuleProvider> loadedProviders = new 
LinkedList<>();
+    private ModuleProvider loadedProvider = null;
 
     private final String name;
 
@@ -60,39 +63,35 @@ public abstract class ModuleDefine implements 
ModuleProviderHolder {
      */
     void prepare(ModuleManager moduleManager, 
ApplicationConfiguration.ModuleConfiguration configuration,
         ServiceLoader<ModuleProvider> moduleProviderLoader) throws 
ProviderNotFoundException, ServiceNotProvidedException, ModuleConfigException, 
ModuleStartException {
-        boolean providerExist = false;
         for (ModuleProvider provider : moduleProviderLoader) {
             if (!configuration.has(provider.name())) {
                 continue;
             }
 
-            providerExist = true;
             if (provider.module().equals(getClass())) {
-                ModuleProvider newProvider;
-                try {
-                    newProvider = provider.getClass().newInstance();
-                } catch (InstantiationException | IllegalAccessException e) {
-                    throw new ProviderNotFoundException(e);
+                if (loadedProvider == null) {
+                    loadedProvider = provider;
+                    loadedProvider.setManager(moduleManager);
+                    loadedProvider.setModuleDefine(this);
+                } else {
+                    throw new DuplicateProviderException(this.name() + " 
module has one " + loadedProvider.name() + "[" + 
loadedProvider.getClass().getName() + "] provider already, "
+                        + provider.name() + "[" + 
provider.getClass().getName() + "] is defined as 2nd provider.");
                 }
-                newProvider.setManager(moduleManager);
-                newProvider.setModuleDefine(this);
-                loadedProviders.add(newProvider);
             }
+
         }
 
-        if (!providerExist) {
+        if (loadedProvider == null) {
             throw new ProviderNotFoundException(this.name() + " module no 
provider exists.");
         }
 
-        for (ModuleProvider moduleProvider : loadedProviders) {
-            logger.info("Prepare the {} provider in {} module.", 
moduleProvider.name(), this.name());
-            try {
-                copyProperties(moduleProvider.createConfigBeanIfAbsent(), 
configuration.getProviderConfiguration(moduleProvider.name()), this.name(), 
moduleProvider.name());
-            } catch (IllegalAccessException e) {
-                throw new ModuleConfigException(this.name() + " module config 
transport to config bean failure.", e);
-            }
-            moduleProvider.prepare();
+        logger.info("Prepare the {} provider in {} module.", 
loadedProvider.name(), this.name());
+        try {
+            copyProperties(loadedProvider.createConfigBeanIfAbsent(), 
configuration.getProviderConfiguration(loadedProvider.name()), this.name(), 
loadedProvider.name());
+        } catch (IllegalAccessException e) {
+            throw new ModuleConfigException(this.name() + " module config 
transport to config bean failure.", e);
         }
+        loadedProvider.prepare();
     }
 
     private void copyProperties(ModuleConfig dest, Properties src, String 
moduleName,
@@ -129,20 +128,11 @@ public abstract class ModuleDefine implements 
ModuleProviderHolder {
         throw new NoSuchFieldException();
     }
 
-    /**
-     * @return providers of this module
-     */
-    final List<ModuleProvider> providers() {
-        return loadedProviders;
-    }
-
     @Override public final ModuleProvider provider() throws 
DuplicateProviderException, ProviderNotFoundException {
-        if (loadedProviders.size() > 1) {
-            throw new DuplicateProviderException(this.name() + " module exist 
" + loadedProviders.size() + " providers");
-        } else if (loadedProviders.size() == 0) {
+        if (loadedProvider == null) {
             throw new ProviderNotFoundException("There is no module provider 
in " + this.name() + " module!");
         }
 
-        return loadedProviders.getFirst();
+        return loadedProvider;
     }
 }

Reply via email to