Let API tests run without report_portal_integration, using dynamic loading

- Removed @Step annotations, as pointcut is hardcoded in com.att->
  .automation.common.report_portal_integration.aspects.StepAspects

- Introduced ReportPortalListenerDelegator that loads com.att->
  .automation.common.report_portal_integration if available

- Optimized and organized dependencies

- Upgrade maven-assembly-plugin to resolve "Java heap space" error.

Issue-ID: VID-378

Change-Id: Iaf9279a48a1474d0ef6d0f514259dd383f6f5dbf
Signed-off-by: Ittay Stern <ittay.stern@att.com>
diff --git a/pom.xml b/pom.xml
index b91431a..e2e911a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -133,7 +133,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.3.2</version>
+                <version>3.5.1</version>
 
                 <configuration>
                     <debug>true</debug>
diff --git a/vid-automation/pom.xml b/vid-automation/pom.xml
index c00f799..a6ca977 100644
--- a/vid-automation/pom.xml
+++ b/vid-automation/pom.xml
@@ -8,10 +8,10 @@
     <properties>
         <springframework.version>5.1.6.RELEASE</springframework.version>
         <jersey.version>2.28</jersey.version>
-        <jackson.version>2.9.7</jackson.version>
+        <jackson.version>2.9.9</jackson.version>
         <aspectj.version>1.8.10</aspectj.version>
         <selenium.version>3.6.0</selenium.version>
-        <log4j.version>2.9.1</log4j.version>
+        <log4j.version>2.12.0</log4j.version>
         <apachehttp.version>4.4.1</apachehttp.version>
 
     </properties>
@@ -33,14 +33,9 @@
             <version>${log4j.version}</version>
         </dependency>
         <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>1.2.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-            <version>6.14.3</version>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-1.2-api</artifactId>
+            <version>${log4j.version}</version>
         </dependency>
         <dependency>
             <groupId>javax.ws.rs</groupId>
@@ -49,31 +44,10 @@
         </dependency>
 
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>RELEASE</version>
-        </dependency>
-        <dependency>
             <groupId>com.aventstack</groupId>
             <artifactId>extentreports</artifactId>
             <version>3.0.7</version>
         </dependency>
-        <dependency>
-            <groupId>org.seleniumhq.selenium</groupId>
-            <artifactId>selenium-java</artifactId>
-            <version>${selenium.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.seleniumhq.selenium</groupId>
-            <artifactId>selenium-server</artifactId>
-            <version>${selenium.version}</version>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.seleniumhq.selenium</groupId>
-            <artifactId>selenium-api</artifactId>
-            <version>${selenium.version}</version>
-        </dependency>
 
         <dependency>
             <groupId>ch.qos.logback</groupId>
@@ -121,11 +95,38 @@
             <version>2.1.4</version>
         </dependency>
         <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.seleniumhq.selenium</groupId>
+            <artifactId>selenium-java</artifactId>
+            <version>${selenium.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.seleniumhq.selenium</groupId>
+            <artifactId>selenium-server</artifactId>
+            <version>${selenium.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.seleniumhq.selenium</groupId>
+            <artifactId>selenium-api</artifactId>
+            <version>${selenium.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.functionaljava</groupId>
             <artifactId>functionaljava</artifactId>
             <version>RELEASE</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>6.14.3</version>
+        </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.core</groupId>
             <artifactId>jersey-common</artifactId>
@@ -169,22 +170,6 @@
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
-            <artifactId>spring-aop</artifactId>
-            <version>${springframework.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <version>${springframework.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>
             <version>${springframework.version}</version>
         </dependency>
@@ -194,11 +179,6 @@
             <version>1.5.0</version>
         </dependency>
         <dependency>
-            <groupId>com.google.collections</groupId>
-            <artifactId>google-collections</artifactId>
-            <version>1.0</version>
-        </dependency>
-        <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <version>2.5</version>
@@ -224,15 +204,16 @@
             <version>3.6</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-proxy</artifactId>
+            <version>1.0</version>
+        </dependency>
+
+        <dependency>
             <groupId>net.javacrumbs.json-unit</groupId>
             <artifactId>json-unit</artifactId>
             <version>2.2.0</version>
         </dependency>
-        <!--<dependency>-->
-            <!--<groupId>org.openecomp.vid</groupId>-->
-            <!--<artifactId>vid-ext-services-simulator-preset-gen</artifactId>-->
-            <!--<version>1.1.0-SNAPSHOT</version>-->
-        <!--</dependency>-->
         <dependency>
             <groupId>org.togglz</groupId>
             <artifactId>togglz-spring-core</artifactId>
@@ -260,6 +241,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.5.1</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -270,7 +252,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.5.5</version>
+                <version>3.1.1</version>
                 <executions>
                     <execution>
                         <id>create.jar.with.dependencies</id>
diff --git a/vid-automation/src/main/java/org/onap/vid/api/BaseApiTest.java b/vid-automation/src/main/java/org/onap/vid/api/BaseApiTest.java
index 7ce2944..3778e4b 100644
--- a/vid-automation/src/main/java/org/onap/vid/api/BaseApiTest.java
+++ b/vid-automation/src/main/java/org/onap/vid/api/BaseApiTest.java
@@ -35,11 +35,12 @@
 import org.springframework.web.client.RestTemplate;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Listeners;
+import vid.automation.reportportal.ReportPortalListenerDelegator;
 import vid.automation.test.infra.FeaturesTogglingConfiguration;
 import vid.automation.test.services.UsersService;
 import vid.automation.test.utils.CookieAndJsonHttpHeadersInterceptor;
 
-//@Listeners(ReportPortalListener.class)
+@Listeners(ReportPortalListenerDelegator.class)
 public class BaseApiTest {
     protected static final Logger LOGGER = LogManager.getLogger(BaseApiTest.class);
 
diff --git a/vid-automation/src/main/java/vid/automation/reportportal/ReportPortalListenerDelegator.java b/vid-automation/src/main/java/vid/automation/reportportal/ReportPortalListenerDelegator.java
new file mode 100644
index 0000000..6daa6d6
--- /dev/null
+++ b/vid-automation/src/main/java/vid/automation/reportportal/ReportPortalListenerDelegator.java
@@ -0,0 +1,147 @@
+package vid.automation.reportportal;
+
+import static org.apache.commons.beanutils.MethodUtils.invokeStaticMethod;
+
+import org.apache.commons.proxy.ProxyFactory;
+import org.apache.commons.proxy.factory.javassist.JavassistProxyFactory;
+import org.apache.commons.proxy.invoker.NullInvoker;
+import org.openqa.selenium.WebDriver;
+import org.testng.IExecutionListener;
+import org.testng.ISuite;
+import org.testng.ISuiteListener;
+import org.testng.ITestContext;
+import org.testng.ITestResult;
+import org.testng.internal.IResultListener2;
+
+/**
+ * Loads and delegates to ReportPortalListener. When class not found -- yields no-op object, and no side-effect.
+ */
+public class ReportPortalListenerDelegator implements IExecutionListener, ISuiteListener, IResultListener2 {
+
+    private static final String CLASSNAME_REPORT_PORTAL_LISTENER = "com.att.automation.common.report_portal_integration.listeners.ReportPortalListener";
+    private static final String CLASSNAME_WEB_DRIVER_SCREENSHOTS_PROVIDER = "com.att.automation.common.report_portal_integration.screenshots.WebDriverScreenshotsProvider";
+
+    private static final Object instance = createReportPortalListener();
+
+    private final IExecutionListener iExecutionListener;
+    private final ISuiteListener iSuiteListener;
+    private final IResultListener2 iResultListener2;
+
+    public ReportPortalListenerDelegator() {
+        iExecutionListener = ((IExecutionListener) instance);
+        iSuiteListener = ((ISuiteListener) instance);
+        iResultListener2 = ((IResultListener2) instance);
+    }
+
+    public static void setScreenShotsWebDriver(WebDriver driver) {
+        try {
+            invokeStaticMethod(instance.getClass(), "setScreenShotsProvider", createScreenshotsProvider(driver));
+        } catch (ClassNotFoundException e) {
+            // if class not found, don't bother
+        } catch (ReflectiveOperationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Override
+    public void beforeConfiguration(ITestResult tr) {
+        iResultListener2.beforeConfiguration(tr);
+    }
+
+    @Override
+    public void onConfigurationSuccess(ITestResult itr) {
+        iResultListener2.onConfigurationSuccess(itr);
+    }
+
+    @Override
+    public void onConfigurationFailure(ITestResult itr) {
+        iResultListener2.onConfigurationFailure(itr);
+    }
+
+    @Override
+    public void onConfigurationSkip(ITestResult itr) {
+        iResultListener2.onConfigurationSkip(itr);
+    }
+
+    @Override
+    public void onExecutionStart() {
+        iExecutionListener.onExecutionStart();
+    }
+
+    @Override
+    public void onExecutionFinish() {
+        iExecutionListener.onExecutionFinish();
+    }
+
+    @Override
+    public void onStart(ISuite suite) {
+        iSuiteListener.onStart(suite);
+
+    }
+
+    @Override
+    public void onFinish(ISuite suite) {
+        iSuiteListener.onFinish(suite);
+    }
+
+    @Override
+    public void onTestStart(ITestResult result) {
+        iResultListener2.onTestStart(result);
+    }
+
+    @Override
+    public void onTestSuccess(ITestResult result) {
+        iResultListener2.onTestSuccess(result);
+    }
+
+    @Override
+    public void onTestFailure(ITestResult result) {
+        iResultListener2.onTestFailure(result);
+    }
+
+    @Override
+    public void onTestSkipped(ITestResult result) {
+        iResultListener2.onTestSkipped(result);
+    }
+
+    @Override
+    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
+        iResultListener2.onTestFailedButWithinSuccessPercentage(result);
+    }
+
+    @Override
+    public void onStart(ITestContext context) {
+        iResultListener2.onStart(context);
+    }
+
+    @Override
+    public void onFinish(ITestContext context) {
+        iResultListener2.onFinish(context);
+    }
+
+
+    private static Object createReportPortalListener() {
+        try {
+            final Class<?> classToLoad = Class.forName(CLASSNAME_REPORT_PORTAL_LISTENER,
+                true, ReportPortalListenerDelegator.class.getClassLoader());
+            return classToLoad.getConstructor().newInstance();
+        } catch (ClassNotFoundException e) {
+            // Fallback to NullInvoker
+            final Class[] classes = {IExecutionListener.class, ISuiteListener.class, IResultListener2.class};
+            final ProxyFactory proxyFactory = new JavassistProxyFactory();
+
+            return proxyFactory.createInvokerProxy(new NullInvoker(), classes);
+        } catch (ReflectiveOperationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static Object createScreenshotsProvider(WebDriver driver) throws ReflectiveOperationException {
+        Class<?> classToLoad = Class.forName(CLASSNAME_WEB_DRIVER_SCREENSHOTS_PROVIDER,
+            true, driver.getClass().getClassLoader());
+
+        return classToLoad.getDeclaredConstructor(WebDriver.class).newInstance(driver);
+    }
+
+}
diff --git a/vid-automation/src/main/java/vid/automation/test/test/VidBaseTestCase.java b/vid-automation/src/main/java/vid/automation/test/test/VidBaseTestCase.java
index ced874e..a45f258 100644
--- a/vid-automation/src/main/java/vid/automation/test/test/VidBaseTestCase.java
+++ b/vid-automation/src/main/java/vid/automation/test/test/VidBaseTestCase.java
@@ -33,6 +33,7 @@
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Listeners;
 import org.testng.annotations.Test;
+import vid.automation.reportportal.ReportPortalListenerDelegator;
 import vid.automation.test.Constants;
 import vid.automation.test.Constants.ViewEdit;
 import vid.automation.test.infra.*;
@@ -70,7 +71,7 @@
 import static vid.automation.test.utils.TestHelper.GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS;
 import static vid.automation.test.utils.TestHelper.GET_TENANTS;
 
-//@Listeners(com.automation.common.report_portal_integration.listeners.ReportPortalListener.class)
+@Listeners(ReportPortalListenerDelegator.class)
 public class VidBaseTestCase extends SetupCDTest{
 
     protected final UsersService usersService = new UsersService();
@@ -153,7 +154,7 @@
     @BeforeSuite(alwaysRun = true)
     public void screenShotsForReportPortal(){
         try {
-            //ReportPortalListener.setScreenShotsProvider(new WebDriverScreenshotsProvider(getDriver()));
+            ReportPortalListenerDelegator.setScreenShotsWebDriver(getDriver());
             System.out.println("Called to ReportPortalListener to set ScreenShotsProvider");
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/vid-automation/src/main/resources/reportportal.properties b/vid-automation/src/main/resources/reportportal.properties
deleted file mode 100644
index ba8c260..0000000
--- a/vid-automation/src/main/resources/reportportal.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-rp.endpoint = http://reportportal.intl.att.com:8080
-rp.uuid=441fc8fa-84f9-468c-9c55-02b28c480770
-rp.project=VID
-rp.mode=DEBUG
-rp.enable=false
-rp.launch=VID_UI
-rp.skipped.issue = FALSE
\ No newline at end of file