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

ncole pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 0c8286a  [AMBARI-25036] Update Stack Classloader Loading Pattern 
(#2716)
0c8286a is described below

commit 0c8286a5d39c95022c1857090b175efb5e81098a
Author: ncole <nc...@hortonworks.com>
AuthorDate: Tue Dec 11 16:35:22 2018 -0500

    [AMBARI-25036] Update Stack Classloader Loading Pattern (#2716)
---
 .../ambari/server/checks/UpgradeCheckRegistry.java |  7 +--
 .../upgrades/PluginUpgradeServerAction.java        |  6 +--
 .../stack/upgrade/orchestrate/UpgradeContext.java  |  5 +-
 .../org/apache/ambari/server/state/StackInfo.java  | 53 ++++++++++++++++++----
 .../PreUpgradeCheckResourceProviderTest.java       |  6 +--
 .../upgrades/PluginUpgradeServerActionTest.java    |  5 +-
 6 files changed, 52 insertions(+), 30 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
index b529f28..2e36f36 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
@@ -178,7 +178,6 @@ public class UpgradeCheckRegistry {
    * @param pluginChecks
    *          the collection to popoulate.
    */
-  @SuppressWarnings("unchecked")
   private void loadPluginUpgradeChecksFromStack(UpgradePack upgradePack,
       PluginUpgradeChecks pluginChecks) throws AmbariException {
     List<String> pluginCheckClassNames = upgradePack.getPrerequisiteChecks();
@@ -189,13 +188,11 @@ public class UpgradeCheckRegistry {
     if (null != classLoader) {
       for (String pluginCheckClassName : pluginCheckClassNames) {
         try {
-          Class<? extends UpgradeCheck> upgradeCheckClass = (Class<? extends 
UpgradeCheck>) classLoader.loadClass(
-              pluginCheckClassName);
+          UpgradeCheck upgradeCheck = stackInfo.getLibraryInstance(m_injector, 
pluginCheckClassName);
 
-          UpgradeCheck upgradeCheck = 
m_injector.getInstance(upgradeCheckClass);
           pluginChecks.m_loadedChecks.add(upgradeCheck);
 
-          LOG.info("Registered pre-upgrade check {} for stack {}", 
upgradeCheckClass, ownerStackId);
+          LOG.info("Registered pre-upgrade check {} for stack {}", 
pluginCheckClassName, ownerStackId);
         } catch (Exception exception) {
           LOG.error("Unable to load the upgrade check {}", 
pluginCheckClassName, exception);
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java
index 154352e..7be983d 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerAction.java
@@ -83,11 +83,7 @@ public class PluginUpgradeServerAction extends 
AbstractUpgradeServerAction {
     final String pluginClassName = getActionClassName();
 
     try {
-      @SuppressWarnings("unchecked")
-      Class<? extends UpgradeAction> upgradeActionClass = (Class<? extends 
UpgradeAction>) pluginClassLoader.loadClass(
-          pluginClassName);
-
-      upgradeAction = upgradeActionClass.newInstance();
+      upgradeAction = stackInfo.getLibraryInstance(pluginClassName);
     } catch (Exception exception) {
       LOG.error("Unable to load the upgrade action {}", pluginClassName, 
exception);
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
index 56094c0..546ec30 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
@@ -1545,12 +1545,9 @@ public class UpgradeContext {
 
     try {
       StackInfo stack = metaInfo.getStack(stackId);
-      ClassLoader cl = stack.getLibraryClassLoader();
 
-      Class<?> clazz = (null == cl) ? Class.forName(className) :
-        cl.loadClass(className);
+      return stack.getLibraryInstance(className);
 
-      return (OrchestrationOptions) clazz.newInstance();
     } catch (Exception e) {
       LOG.error(String.format("Could not load orchestration options for stack 
{}: {}",
           stackId, e.getMessage()));
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
index b4911cb..99b2d3b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
@@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 import com.google.common.io.Files;
+import com.google.inject.Injector;
 
 public class StackInfo implements Comparable<StackInfo>, Validable {
   private static final Logger LOG = LoggerFactory.getLogger(StackInfo.class);
@@ -654,17 +655,8 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
   public StackReleaseVersion getReleaseVersion() {
 
     if (StringUtils.isNotEmpty(releaseVersionClass)) {
-
       try {
-        Class<?> clazz = null;
-
-        if (null != libraryClassLoader) {
-          clazz = libraryClassLoader.loadClass(releaseVersionClass);
-        } else {
-          clazz = Class.forName(releaseVersionClass);
-        }
-
-        return (StackReleaseVersion) clazz.newInstance();
+        return getLibraryInstance(releaseVersionClass);
       } catch (Exception e) {
         LOG.error("Could not create stack release instance.  Using default. 
{}", e.getMessage());
         return new DefaultStackVersion();
@@ -695,4 +687,45 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
   public void setLibraryClassLoader(ClassLoader libraryClassLoader) {
     this.libraryClassLoader = libraryClassLoader;
   }
+
+  /**
+   * Loads an instance of the class from the stack classloader, if available.
+   *
+   * @param className
+   *          the name of the class to get an instance
+   * @return
+   *          the instance of the class
+   * @throws Exception
+   *          when the class cannot be loaded or instantiated
+   */
+  public <T> T getLibraryInstance(String className) throws Exception {
+    return getLibraryInstance(null, className);
+  }
+
+  /**
+   * Loads an instance of the class from the stack classloader, if available.
+   *
+   * @param injector
+   *          the injector to use, or {@code null} to invoke the default, 
no-arg
+   *          constructor
+   * @param className
+   *          the name of the class to get an instance
+   * @return
+   *          the instance of the class
+   * @throws Exception
+   *          when the class cannot be loaded or instantiated
+   */
+  @SuppressWarnings("unchecked")
+  public <T> T getLibraryInstance(Injector injector, String className) throws 
Exception {
+    Class<? extends T> clazz;
+
+    if (null != libraryClassLoader) {
+      clazz = (Class<? extends T>) libraryClassLoader.loadClass(className);
+    } else {
+      clazz = (Class<? extends T>) Class.forName(className);
+    }
+
+    return (null == injector) ? clazz.newInstance() : 
injector.getInstance(clazz);
+  }
+
 }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
index feff55a..2e0c5d6 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
@@ -102,6 +102,7 @@ import org.apache.ambari.spi.upgrade.UpgradeCheckStatus;
 import org.apache.ambari.spi.upgrade.UpgradeCheckType;
 import org.apache.ambari.spi.upgrade.UpgradeType;
 import org.apache.commons.lang3.StringUtils;
+import org.easymock.EasyMock;
 import org.easymock.EasyMockSupport;
 import org.junit.Assert;
 import org.junit.Test;
@@ -214,12 +215,11 @@ public class PreUpgradeCheckResourceProviderTest extends 
EasyMockSupport {
     expect(serviceInfo.getChecksFolder()).andReturn(new File(checks));
 
     ClassLoader classLoader = createNiceMock(ClassLoader.class);
-    Class clazz = SampleServiceCheck.class;
-    
expect(classLoader.loadClass(TEST_SERVICE_CHECK_CLASS_NAME)).andReturn(clazz).atLeastOnce();
-
     StackInfo stackInfo = createNiceMock(StackInfo.class);
     
expect(ambariMetaInfo.getStack(targetStackId)).andReturn(stackInfo).atLeastOnce();
     
expect(stackInfo.getLibraryClassLoader()).andReturn(classLoader).atLeastOnce();
+    expect(stackInfo.getLibraryInstance(EasyMock.anyObject(), 
EasyMock.eq(TEST_SERVICE_CHECK_CLASS_NAME)))
+      .andReturn(new SampleServiceCheck()).atLeastOnce();
 
     // replay
     replayAll();
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java
index cd88ff9..6e4b17b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/PluginUpgradeServerActionTest.java
@@ -49,6 +49,7 @@ import org.apache.ambari.spi.upgrade.UpgradeAction;
 import org.apache.ambari.spi.upgrade.UpgradeActionOperations;
 import 
org.apache.ambari.spi.upgrade.UpgradeActionOperations.ConfigurationChanges;
 import org.apache.ambari.spi.upgrade.UpgradeInformation;
+import org.easymock.EasyMock;
 import org.easymock.EasyMockSupport;
 import org.junit.After;
 import org.junit.Before;
@@ -128,13 +129,11 @@ public class PluginUpgradeServerActionTest extends 
EasyMockSupport {
     
expect(m_mockUpgradePack.getOwnerStackId()).andReturn(m_stackId).atLeastOnce();
     
expect(m_mockMetaInfo.getStack(m_stackId)).andReturn(m_mockStackInfo).atLeastOnce();
     
expect(m_mockStackInfo.getLibraryClassLoader()).andReturn(m_mockClassLoader).atLeastOnce();
+    
expect(m_mockStackInfo.getLibraryInstance(EasyMock.anyString())).andReturn(new 
MockUpgradeAction()).atLeastOnce();
 
     expect(m_action.getClusters()).andReturn(m_mockClusters).anyTimes();
     
expect(m_action.getUpgradeContext(m_mockCluster)).andReturn(m_mockUpgradeContext).once();
 
-    Class clazz = MockUpgradeAction.class;
-    
expect(m_mockClassLoader.loadClass(CLASS_NAME)).andReturn(clazz).atLeastOnce();
-
     m_action.agentConfigsHolder = m_mockAgentConfigsHolder;
 
     m_commandParams.put("clusterName", CLUSTER_NAME);

Reply via email to