All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tibco.flogo.maven.coverage.AppParser Maven / Gradle / Ivy

Go to download

Plugin Code for Apache Maven and TIBCO Flogo. This is the Maven Plugin for Flogo Build.

The newest version!
package com.tibco.flogo.maven.coverage;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tibco.flogo.maven.coverage.dto.*;
import com.tibco.flogo.maven.coverage.dto.Link;
import com.tibco.flogo.maven.test.dto.*;
import com.tibco.flogo.maven.utils.FileHelper;
import com.tibco.flogo.maven.utils.Utils;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;

public class AppParser {

    AppCoverage coverage = new AppCoverage();
    AppCoverageStatistics appCoverageStatistics;
    public void parse(String appPath, Root root) throws Exception {


        populateAppData(appPath, coverage);
        populateExecutedData( coverage, root);

        appCoverageStatistics = new AppCoverageStatistics(coverage);
        appCoverageStatistics.generate();

    }

    private void populateExecutedData( AppCoverage coverage, Root root ) throws Exception {

        for ( int i =0; i < root.report.suites.size(); i++ ) {
           Suite suite = root.report.suites.get(i);
            TestSuiteIOCoverage testSuiteCoverage = new TestSuiteIOCoverage();
            coverage.getTestIOMap().put(suite.suiteName, testSuiteCoverage);

           for ( int j =0 ; j < suite.testCases.size(); j++ ) {
               TestCase testCase = suite.testCases.get(j);
               FlowCoverage flowCoverage = null;
               if (coverage.getFlowMap().containsKey(testCase.flowName)) {
                   flowCoverage = coverage.getFlowMap().get(testCase.flowName);
                   flowCoverage.setFlowExecuted( true);
               } else {
                   throw new Exception( "Flow not found in the flow map");
               }
               TestIOCoverage testIOCoverage = new TestIOCoverage();
               testSuiteCoverage.getTestIOCoverageMap().put(testCase.testName, testIOCoverage);

               FlowIOCoverage flowIOCoverage = new FlowIOCoverage();
               flowIOCoverage.setStartingFlow( true);
               testIOCoverage.getFlowIOCoverageMap().put(testCase.flowName, flowIOCoverage);

               addActivitiesExecuted( flowCoverage, testCase.activities, flowIOCoverage);
               addActivitiesErrorHandlerExecuted( flowCoverage, testCase.errorHandler.activities, flowIOCoverage);
               addExecutedLinks( flowCoverage, testCase.links);
               addExecutedErrorHandlerLinks( flowCoverage, testCase.errorHandler.links);

               if (testCase.subFlow != null && !testCase.subFlow.isEmpty()) {
                   for (Map.Entry entry : testCase.subFlow.entrySet()) {
                        TestCase subTestCase = entry.getValue();
                        processSubFlowData( coverage, subTestCase , testIOCoverage);
                   }
               }
           }

        }

    }

    private void processSubFlowData( AppCoverage coverage, TestCase testCase, TestIOCoverage testIOCoverage) throws Exception {
        FlowCoverage flowCoverage = null;
        if (coverage.getFlowMap().containsKey(testCase.flowName)) {
            flowCoverage = coverage.getFlowMap().get(testCase.flowName);
            flowCoverage.setFlowExecuted( true);
        } else {
            throw new Exception( "Flow not found in the flow map");
        }
        FlowIOCoverage flowIOCoverage = new FlowIOCoverage();
        testIOCoverage.getFlowIOCoverageMap().put(testCase.flowName, flowIOCoverage);
        addActivitiesExecuted( flowCoverage, testCase.activities, flowIOCoverage);

        addActivitiesErrorHandlerExecuted( flowCoverage, testCase.errorHandler.activities, flowIOCoverage);
        addExecutedLinks( flowCoverage, testCase.links);
        addExecutedErrorHandlerLinks( flowCoverage, testCase.errorHandler.links);

        if (testCase.subFlow != null && !testCase.subFlow.isEmpty()) {
            for (Map.Entry entry : testCase.subFlow.entrySet()) {
                TestCase subTestCase = entry.getValue();
                processSubFlowData( coverage, subTestCase, testIOCoverage);
            }
        }
    }

    private void populateAppData(String appPath, AppCoverage coverage) throws IOException {
        String app = FileHelper.readFile(appPath, Charset.defaultCharset() );
        ObjectMapper mapper = new ObjectMapper();
        App root = mapper.readValue(app, App.class);


        for( int i =0; i < root.resources.size(); i++ ) {
            Data resource = root.resources.get(i).data;
            FlowCoverage flowCoverage = null;
            if (coverage.getFlowMap().containsKey(resource.name)) {
                flowCoverage = coverage.getFlowMap().get(resource.name);
            } else {
                flowCoverage = new FlowCoverage();
                flowCoverage.setFlowName( resource.name);
                flowCoverage.setHasErrorHandler((resource.errorHandler != null && resource.errorHandler.tasks.size() > 0));
                coverage.getFlowMap().put(resource.name, flowCoverage);
            }
            addLinks(flowCoverage, resource.links);
            if ( resource.errorHandler != null  && resource.errorHandler.links != null ) {
                addLinksErrorHandler(flowCoverage, resource.errorHandler.links);

            }
            addActivities( flowCoverage, resource.tasks);
            if ( resource.errorHandler != null  && resource.errorHandler.tasks != null ) {
                addActivitiesErrorHandler( flowCoverage, resource.errorHandler.tasks);
            }
        }
    }


    private void addExecutedLinks(FlowCoverage coverage, List links) {
        if ( links == null ) {
            return;
        }
        for ( int i =0; i < links.size(); i++ ) {
            com.tibco.flogo.maven.test.dto.Link link = links.get(i);
            coverage.getTransitionExec().add( link.linkName);
        }
    }

    private void addExecutedErrorHandlerLinks(FlowCoverage coverage, List links) {
        if ( links == null ) {
            return;
        }
        for ( int i =0; i < links.size(); i++ ) {
            com.tibco.flogo.maven.test.dto.Link link = links.get(i);
            coverage.getErrorHandlerTransitionExec().add( link.linkName);
        }
    }

    private void addActivitiesExecuted( FlowCoverage coverage, List activities , FlowIOCoverage flowIOCoverage) throws Exception {
        if (activities == null) {
            return;
        }
        for ( int i =0; i < activities.size(); i++ ) {
            Activity activity = activities.get(i);
            coverage.getActivitiesExec().add( activity.name);
            String input = new ObjectMapper().writeValueAsString( activity.input);
            String output = new ObjectMapper().writeValueAsString( activity.output);
            String error = new ObjectMapper().writeValueAsString( activity.error);
            flowIOCoverage.getActivityList().add( new ActivityIO( activity.name, input, output, error ));
        }
    }

    private void addActivitiesErrorHandlerExecuted( FlowCoverage coverage, List activities , FlowIOCoverage flowIOCoverage) throws Exception {
        if (activities == null) {
            return;
        }
        for ( int i =0; i < activities.size(); i++ ) {
            Activity activity = activities.get(i);
            coverage.getErrorHandlerActivitiesExec().add( activity.name);
            String input = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString( activity.input);
            String output = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString( activity.output);
            String error = new ObjectMapper().writeValueAsString( activity.error);
            flowIOCoverage.getActivityErrorList().add( new ActivityIO( activity.name, input, output, error ));
        }
    }

    private void addLinks( FlowCoverage coverage, List links) {
        for ( int i =0; i < links.size(); i++ ) {
            Link link = links.get(i);
            coverage.getTransitions().add( link.label);
        }
    }

    private void addLinksErrorHandler( FlowCoverage coverage, List links) {
        for ( int i =0; i < links.size(); i++ ) {
            Link link = links.get(i);
            coverage.getErrorHandlerTransitions().add( link.label);
        }
    }

    private void addActivities( FlowCoverage coverage, List activities) {
        for ( int i =0; i < activities.size(); i++ ) {
            Task activity = activities.get(i);
            coverage.getActivities().add( activity.name);
        }
    }

    private void addActivitiesErrorHandler( FlowCoverage coverage, List activities) {
        for ( int i =0; i < activities.size(); i++ ) {
            Task activity = activities.get(i);
            coverage.getErrorHandlerActivities().add( activity.name);
        }
    }

    public AppCoverage getCoverage() {
        return coverage;
    }

    public AppCoverageStatistics getAppCoverageStatistics() {
        return appCoverageStatistics;
    }

    public void setAppCoverageStatistics(AppCoverageStatistics appCoverageStatistics) {
        this.appCoverageStatistics = appCoverageStatistics;
    }


    public class AppCoverageStatistics {

        AppCoverage appCoverage;
        Map map = new HashMap<>();
        public AppCoverageStatistics( AppCoverage coverage) {
            this.appCoverage = coverage;
        }

        public void generate() throws Exception {
            for (Map.Entry entry : appCoverage.getFlowMap().entrySet()) {
                FlowStats flowStats = new FlowStats();
                if (entry.getValue() == null ) {
                    throw new Exception( "No statistics found for flow " +  entry.getKey() );
                }
                flowStats.generateFlowStats( entry.getValue() );
                map.put( entry.getKey(), flowStats );
            }
        }

        public List getFlows() {
            List flows = new ArrayList<>( this.appCoverage.getFlowMap().keySet() );
            Collections.sort(flows, String.CASE_INSENSITIVE_ORDER);
            return flows;
        }

        public String getAppFlowStats() {
            int total = 0;
            int nonExecuted = 0;
            for ( FlowStats flowStats : map.values() ) {
                total++;
                if  (!flowStats.executed ) {
                    nonExecuted++;
                }
            }

            return Utils.getPercentage( total, nonExecuted );
        }

        public String getNonExecutedFlows() {
            List nonExecFlows = new ArrayList<>();
            for ( FlowStats flowStats : map.values() ) {
                if  (!flowStats.executed ) {
                    nonExecFlows.add( flowStats.flowName);
                }
            }
            return String.join( "," , nonExecFlows );
        }

        public String getAppFlowActivityStats() {
                int total = 0;
                int nonExecuted = 0;
                for ( FlowStats flowStats : map.values() ) {
                    total += ( flowStats.totalMainActivities + flowStats.totalErrorActivities);
                    nonExecuted += ( (flowStats.totalMainActivities - flowStats.executedMainActivities) + (flowStats.totalErrorActivities - flowStats.executedErrorActivities));
                }
                return Utils.getPercentage( total, nonExecuted );
        }

        public String getAppFlowLinkStats() {
            int total = 0;
            int nonExecuted = 0;
            for ( FlowStats flowStats : map.values() ) {
                total += ( flowStats.totalMainLinks + flowStats.totalErrorLinks);
                nonExecuted += ( (flowStats.totalMainLinks - flowStats.executedMainLinks) + (flowStats.totalErrorLinks - flowStats.executedErrorLinks));
            }
            return Utils.getPercentage( total, nonExecuted );
        }


        public FlowStats getFlowStatistics( String flowName) throws Exception {
            return map.get( flowName);
        }
    }

    public class FlowStats {
        public String flowName;
        public int totalMainActivities;
        public int executedMainActivities;
        public int totalMainLinks;
        public int executedMainLinks;
        public int totalErrorActivities;
        public int executedErrorActivities;
        public int totalErrorLinks;
        public int executedErrorLinks;
        public String totalMainActivitiesList;
        public String nonExecutedMainActivitiesList;
        public String totalMainLinksList;
        public String nonExecutedMainLinksList;
        public String totalErrorActivitiesList;
        public String nonExecutedErrorActivitiesList;
        public String totalErrorLinksList;
        public String nonExecutedErrorLinksList;
        public boolean executed;
        public boolean hasErrorHandler;

        public void generateFlowStats( FlowCoverage coverage) {

            flowName = coverage.getFlowName();
            executed = coverage.isFlowExecuted();

            hasErrorHandler = coverage.isHasErrorHandler();

            totalMainActivities = coverage.getActivities().size();
            executedMainActivities = coverage.getActivitiesExec().size();

            totalMainLinks = coverage.getTransitions().size();
            executedMainLinks = coverage.getTransitionExec().size();

            totalErrorActivities = coverage.getErrorHandlerActivities().size();
            executedErrorActivities = coverage.getErrorHandlerActivitiesExec().size();

            totalErrorLinks = coverage.getErrorHandlerTransitions().size();
            executedErrorLinks = coverage.getErrorHandlerTransitionExec().size();

            Set nonExecSet = new TreeSet<>( coverage.getActivities());
            totalMainActivitiesList = String.join( ",", nonExecSet);
            nonExecSet.removeAll( coverage.getActivitiesExec());
            if (nonExecSet.size() > 0) {
                nonExecutedMainActivitiesList = String.join( ",", nonExecSet);
            } else  {
                nonExecutedMainActivitiesList = "N/A";
            }


            Set nonExecLinkSet = new TreeSet<>( coverage.getTransitions());
            totalMainLinksList = String.join( "," , nonExecLinkSet);

            nonExecLinkSet.removeAll( coverage.getTransitionExec());
            if (nonExecLinkSet.size() > 0) {
                nonExecutedMainLinksList = String.join( ",", nonExecLinkSet);
            } else  {
                nonExecutedMainLinksList = "N/A";
            }

            Set nonExecErrorSet = new TreeSet<>( coverage.getErrorHandlerActivities());
            totalErrorActivitiesList = String.join( "," , nonExecErrorSet);
            nonExecErrorSet.removeAll( coverage.getErrorHandlerActivitiesExec());
            if (nonExecErrorSet.size() > 0) {
                nonExecutedErrorActivitiesList = String.join( ",", nonExecErrorSet);
            } else {
                nonExecutedErrorActivitiesList = "N/A";
            }

            Set nonExecLinkErrorSet = new TreeSet<>( coverage.getErrorHandlerTransitions());
            totalErrorLinksList = String.join( "," , nonExecLinkErrorSet);
            nonExecLinkErrorSet.removeAll( coverage.getErrorHandlerTransitionExec());
            if (nonExecLinkErrorSet.size() > 0) {
                nonExecutedErrorLinksList = String.join( ",", nonExecLinkErrorSet);
            } else  {
                nonExecutedErrorLinksList = "N/A";
            }


        }



        public String getMainFlowActivityPercentage() {
            if ( !executed ) {
                return "N/A";
            }
            return Utils.getPercentage( totalMainActivities, totalMainActivities - executedMainActivities) ;
        }
        public String getMainFlowLinkPercentage() {
            if ( !executed ) {
                return "N/A";
            }
            return Utils.getPercentage( totalMainLinks, totalMainLinks - executedMainLinks) ;
        }
        public String getErrorFlowActivityPercentage() {
            return Utils.getPercentage( totalErrorActivities, totalErrorActivities - executedErrorActivities) ;
        }
        public String getErrorFlowLinkPercentage() {
            return Utils.getPercentage( totalErrorLinks, totalErrorLinks - executedErrorLinks) ;
        }

        public boolean hasErrorHandler() {
            return hasErrorHandler;
        }

    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy