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

com.googlecode.openbox.xtools.emma.EmmaTool Maven / Gradle / Ivy

package com.googlecode.openbox.xtools.emma;

import com.googlecode.openbox.common.UtilsAPI;
import com.googlecode.openbox.server.Server;
import com.googlecode.openbox.server.ServerGroup;
import com.googlecode.openbox.server.ssh.SshUtils;
import com.googlecode.openbox.xtools.CodeCoverageTool;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * Created by jerrycai on 3/29/16.
 */
public class EmmaTool extends CodeCoverageTool {

    private static final Logger logger = LogManager.getLogger();

    private String emmaFilterParams;
    private String extraNeedMergeFileList;

    public interface Config {

        boolean isEnable();

        ServerGroup serverGroup();

        String appPath();

        String getExtraNeedMergeFileList();

        String emmaFilterParams();

        String getRunUserAndGroup();

        String getStartCommands();

        String getStopCommands();

        String getStopEnvironmentCommands();

        String getRecoverEnvironmentCommands();

        String getExtraEmmaParams();
    }

    private static EmmaTool newInstance(ServerGroup serverGroup, String appPath, boolean enable, String stopEnvironmentCommands, String recoverEnvironmentCommands, String startCommands, String stopCommands, String userAndGroup, String emmFilterParams, String extraEmmaParams, String extraNeedMergeFileList) {
        return new EmmaTool(serverGroup, appPath, enable, stopEnvironmentCommands, recoverEnvironmentCommands, startCommands, stopCommands, userAndGroup, emmFilterParams, extraEmmaParams, extraNeedMergeFileList);
    }

    public static EmmaTool newInstance(Config config) {
        return newInstance(config.serverGroup(), config.appPath(), config.isEnable(), config.getStopEnvironmentCommands(), config.getRecoverEnvironmentCommands(), config.getStartCommands(), config.getStopCommands(), config.getRunUserAndGroup(), config.emmaFilterParams(), config.getExtraEmmaParams(), config.getExtraNeedMergeFileList());
    }

    private EmmaTool(ServerGroup serverGroup, String appPath, boolean enable, String stopEnvironmentCommands, String recoverEnvironmentCommands, String startCommands, String stopCommands, String userAndGroup, String emmFilterParams, String extraEmmaParams, String extraNeedMergeFileList) {
        super(serverGroup, appPath, enable, stopEnvironmentCommands, recoverEnvironmentCommands, extraEmmaParams, startCommands, stopCommands, userAndGroup);
        this.emmaFilterParams = emmFilterParams;
        this.extraNeedMergeFileList = extraNeedMergeFileList;
    }

    @Override
    public String getToolName() {
        return "codecoverage_emma";
    }


    @Override
    public void install() {
        if (!isEnable()) {
            return;
        }
        execute(new ServerGroup.ServerHandler() {
            @Override
            public void execute(Server server) {
                //TODO need to change auto get after ssh2 support
                String javaHome = "JAVA_HOME";
                String javaHomeLocation = server.getSshClient().getVariableValue(javaHome);
                String remoteEmmaFile = javaHomeLocation + "/jre/lib/ext/emma.jar";
                boolean isEmmaInstalled = SshUtils.isFileExisted(server, remoteEmmaFile);
                if (isEmmaInstalled) {
                    logger.info("emma has been installed already , skip to install again!");
                    return;
                }
                SshUtils.uploadResourceLevelFileToServer(server, "emma/emma.jar", remoteEmmaFile);
                server.getSshClient().executeCommand(System.out, "chmod 777 " + remoteEmmaFile);
            }
        });

    }

    @Override
    public void start() {
        if (!isEnable()) {
            return;
        }
        String emFile = getEmmaEmFile();
//        final String rmOlder = "rm -rf " + emFile + " && ";
        final String rmOlder = "";
        String emmaInjectCommand =
                rmOlder + "java emma instr -m overwrite -cp " + getAppPath() + " -ix " + emmaFilterParams + " -Dmetadata.out.file=" + emFile;
        String command = emmaInjectCommand + getChownAndChmodCommands(getAppPath()) + getChownAndChmodCommands(emFile) + " && " + getStartCommands();
        executeCommands(command);
        try {
            TimeUnit.SECONDS.sleep(30);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private String getChownAndChmodCommands(String path) {
        return " && chown " + getRunUserAndGroup() + " " + path + " && chmod 777 " + path;
    }

    public void collectCoverageDataOnEachServer() {
        String ecFile = getEmmaECFile();
        String command = "rm -rf " + ecFile + " && java emma ctl -connect localhost:47653 -command coverage.get," + ecFile + " && " + getStopCommands();
        executeCommands(command);
    }


    @Override
    public void merageCoverageDataToFirstServer() {
        if (!isEnable()) {
            return;
        }

        final Server firstServer = getFirstServerAsMergedServer();
        //remove older merge file
        String localMergePath = getWorkLocation() + "/" + getDownloadEachEcFileName(firstServer);
        String mergedPath = getEmmaECFile();

        String commands = "rm -rf " + localMergePath + " && " + "mv " + mergedPath + " " + localMergePath;
        firstServer.getSshClient().executeCommand(System.out, commands);

        String mergeFileList = localMergePath;
        Server[] servers = getServers();
        for (int i = 1; i < servers.length; i++) {

            Server server = servers[i];
            String downloadLocation = getLocalRootLocation();
            String downloadFileName = getDownloadEachEcFileName(server);
            final String localFilePath = downloadLocation + File.separator + downloadFileName;
            //download to local
            SshUtils.downloadFileToServer(server, getEmmaECFile(), localFilePath);

            //remove remote older data
            final String mergeFilePath = getWorkLocation() + "/" + downloadFileName;
            String rmOlderCommand = "rm -rf " + mergeFilePath;
            firstServer.getSshClient().executeCommand(System.out, rmOlderCommand);
            //upload the download to first for merge
            SshUtils.uploadFileToServer(firstServer, localFilePath, mergeFilePath);
            //add to merge list for merge finally
            mergeFileList = mergeFileList + "," + mergeFilePath;
        }

        if (StringUtils.isNotBlank(extraNeedMergeFileList)) {
            mergeFileList = mergeFileList + "," + extraNeedMergeFileList;
        }

        mergeFileList = skipNonExistedFiles(firstServer,mergeFileList);
        String ecFile = getMergedEmmaEcFilePath();
        String command = "rm -rf " + getHtmlReportLocaltion() + " && mkdir " + getHtmlReportLocaltion() + " && " + "java emma merge -input " + mergeFileList + " -out " + ecFile;
        firstServer.getSshClient().executeCommand(System.out, command);
    }

    private String skipNonExistedFiles(Server firstServer, String fileList) {
        if (logger.isInfoEnabled()) {
            logger.info("wait to merge emma coverage file list [" + fileList + "]");
        }
        String[] files = fileList.split(",");
        StringBuilder result = new StringBuilder();
        boolean isFirst = true;
        for (String file : files) {
            try {
                if (SshUtils.isFileExisted(firstServer, file)) {
                    if (!isFirst) {
                        result.append(",");
                    }
                    result.append(file);
                    isFirst = false;
                } else {
                    logger.error("ignore non-existed emma coverage file or it is folder path as [" + file + "] on merge server [" + firstServer + "]");
                }
            } catch (Exception e) {
                logger.error("emma data file path [" + file + "] is wrong!", e);
            }
        }
        return result.toString();
    }

    @Override
    public void downloadReportToLocal() {
        final Server firstServer = getFirstServerAsMergedServer();
        String reportFolder = UtilsAPI.getParentPath(getReportHtmlFilePath(), "/");
        SshUtils.downloadFolderFromServer(firstServer, reportFolder, getLocalRootLocation());
    }

    private String getSourceLocation() {
        return getHtmlReportLocaltion() + "/sources";
    }

    private String getUnzipSourceCommand() {
        return "unzip -o '" + getWorkLocation() + "/*-sources.jar' -d " + getSourceLocation();
    }

    @Override
    public void generateHtmlMergedReportOnFirstServer() {
        if (!isEnable()) {
            return;
        }
        final Server firstServer = getFirstServerAsMergedServer();
        String command = getUnzipSourceCommand() + " && " + getEmmaReportCommand();
        firstServer.getSshClient().executeCommand(System.out, command);
    }

    private String getEmmaReportCommand() {
        return getEmmaReportCommandBy("html") + " && " + getEmmaReportCommandBy("xml") + " && " + getEmmaReportCommandBy("txt");
    }


    private String getEmmaReportCommandBy(String fileType) {
        String extraEmmaParas = "";
        if (StringUtils.isNotBlank(getExtraToolParams())) {
            extraEmmaParas = getExtraToolParams();
        }
        return "java emma report -r " + fileType + " -sp " + getSourceLocation() + " -in " + getEmmaEmFile() + "," + getMergedEmmaEcFilePath() + " " + extraEmmaParas + " -Dreport.out.encoding=UTF-8 -Dreport." + fileType + ".out.file=" + getReportFilePath(fileType);
    }


    private String getMergedEmmaEcFilePath() {
        return getHtmlReportLocaltion() + "/" + getToolName() + ".ec";
    }


    private String getDownloadEachEcFileName(Server server) {
        return getToolName() + "_" + server.getIp() + "_.ec";
    }

    private String getEmmaEmFile() {
        return getWorkLocation() + "/" + getToolName() + ".em";
    }

    private String getEmmaECFile() {
        return getWorkLocation() + "/" + getToolName() + ".ec";
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy