Allow plugging-in any provided LoginStrategy 50/94250/3
authorIttay Stern <ittay.stern@att.com>
Sun, 25 Aug 2019 10:02:27 +0000 (13:02 +0300)
committerIttay Stern <ittay.stern@att.com>
Sun, 25 Aug 2019 10:59:16 +0000 (13:59 +0300)
Support dynamic loading of provided implementations of PORTAL SDK's 
`org.onap.portalsdk.core.auth.LoginStrategy` interface.

VID will load the class defined by `login.strategy.classname`
configuration parameter. Default will keep current ONAP's dev login.

Change-Id: I956a1f3376455211398769f3193703129b779871
Issue-ID: VID-594
Signed-off-by: Ittay Stern <ittay.stern@att.com>
epsdk-app-onap/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java
epsdk-app-onap/src/test/java/org/onap/portalapp/conf/ExternalAppConfigTest.java

index b4dcd34..d9b0f09 100644 (file)
@@ -37,6 +37,8 @@
  */
 package org.onap.portalapp.conf;
 
+import static org.apache.commons.lang3.StringUtils.isNotEmpty;
+
 import java.util.ArrayList;
 import java.util.List;
 import javax.sql.DataSource;
@@ -50,6 +52,7 @@ import org.onap.portalsdk.core.objectcache.AbstractCacheManager;
 import org.onap.portalsdk.core.service.DataAccessService;
 import org.onap.portalsdk.core.util.CacheManager;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
@@ -164,8 +167,15 @@ public class ExternalAppConfig extends AppConfig implements Configurable {
        }
 
        @Bean
-       public LoginStrategy loginStrategy() {
-               return new LoginStrategyImpl();
+       public LoginStrategy loginStrategy(@Value("${login.strategy.classname:}") String classname) throws ReflectiveOperationException {
+               return isNotEmpty(classname) ?
+                       newLoginStrategyInstance(classname) : new LoginStrategyImpl();
+       }
+
+       private LoginStrategy newLoginStrategyInstance(String loginStrategyClassname) throws ReflectiveOperationException {
+               return (LoginStrategy) Class.forName(loginStrategyClassname)
+                       .getConstructor()
+                       .newInstance();
        }
 
        @Bean
index 1bdf463..f065268 100644 (file)
  */
 package org.onap.portalapp.conf;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 import java.util.List;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.Assert;
 import org.junit.Test;
+import org.onap.portalapp.login.LoginStrategyImpl;
 import org.onap.portalapp.scheduler.RegistryAdapter;
 import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.onboarding.exception.PortalAPIException;
 import org.onap.portalsdk.core.service.DataAccessService;
-import org.springframework.jdbc.datasource.init.DataSourceInitializer;
-import org.springframework.jdbc.datasource.init.DatabasePopulator;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ViewResolver;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 
 public class ExternalAppConfigTest {
 
@@ -112,12 +117,39 @@ public class ExternalAppConfigTest {
     }
 
     @Test
-    public void testLoginStrategy() throws Exception {
-        ExternalAppConfig testSubject;
-        LoginStrategy result;
+    public void loginStrategy_givenEmptyString_yieldDefault() throws Exception {
+        assertThat(new ExternalAppConfig().loginStrategy(""),
+            is(instanceOf(LoginStrategyImpl.class)));
+    }
 
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.loginStrategy();
+    @Test
+    public void loginStrategy_givenNullString_yieldDefault() throws Exception {
+        assertThat(new ExternalAppConfig().loginStrategy(null),
+            is(instanceOf(LoginStrategyImpl.class)));
+    }
+
+    public static class DummyLoginStrategy extends LoginStrategy {
+        @Override
+        public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) {
+            return null;
+        }
+
+        @Override
+        public String getUserId(HttpServletRequest request) {
+            return null;
+        }
+    }
+
+    @Test
+    public void loginStrategy_givenClassname_yieldClassInstance() throws Exception {
+        assertThat(
+            new ExternalAppConfig().loginStrategy("org.onap.portalapp.conf.ExternalAppConfigTest$DummyLoginStrategy"),
+            is(instanceOf(DummyLoginStrategy.class)));
+    }
+
+    @Test(expected = ClassNotFoundException.class)
+    public void loginStrategy_givenMissingClassname_throwsException() throws Exception {
+        new ExternalAppConfig().loginStrategy("no.real.classname");
+        Assert.fail("should throw");
     }
-}
\ No newline at end of file
+}