gov.nih.nci.caintegrator.web.ajax.GenomicDataSourceAjaxUpdater.java Source code

Java tutorial

Introduction

Here is the source code for gov.nih.nci.caintegrator.web.ajax.GenomicDataSourceAjaxUpdater.java

Source

/**
 * Copyright 5AM Solutions Inc, ESAC, ScenPro & SAIC
 *
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.com/caintegrator/LICENSE.txt for details.
 */
package gov.nih.nci.caintegrator.web.ajax;

import gov.nih.nci.caintegrator.application.study.GenomicDataSourceConfiguration;
import gov.nih.nci.caintegrator.application.study.Status;
import gov.nih.nci.caintegrator.application.study.StudyConfiguration;
import gov.nih.nci.caintegrator.application.study.StudyManagementService;
import gov.nih.nci.caintegrator.web.DisplayableUserWorkspace;
import gov.nih.nci.caintegrator.web.SessionHelper;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.directwebremoting.proxy.dwr.Util;

/**
 * This is an object which is turned into an AJAX javascript file using the DWR framework.
 */
public class GenomicDataSourceAjaxUpdater extends AbstractDwrAjaxUpdater implements IGenomicDataSourceAjaxUpdater {

    private static final String STATUS_TABLE = "genomicSourceJobStatusTable";
    private static final String JOB_HOST_NAME = "genomicSourceHostName_";
    private static final String JOB_EXPERIMENT_IDENTIFIER = "genomicSourceExperimentId_";
    private static final String JOB_DATA_TYPE = "genomicSourceDataType_";
    private static final String JOB_DEPLOYMENT_STATUS = "genomicSourceStatus_";
    private static final String JOB_LAST_MODIFIED_DATE = "genomicSourceLastModifiedDate_";
    private static final String JOB_NEW_DATA_AVAILABLE = "genomicSourceNewDataAvailable_";
    private static final String JOB_EDIT_URL = "genomicSourceEditUrl_";
    private static final String JOB_MAP_SAMPLES_URL = "genomicSourceMapSamplesUrl_";
    private static final String JOB_CONFIGURE_SNP_URL = "genomicSourceConfigureSnpUrl_";
    private static final String JOB_CONFIGURE_COPY_NUMBER_URL = "genomicSourceConfigureCopyNumberUrl_";
    private static final String JOB_DELETE_URL = "genomicSourceDeleteUrl_";
    private static final String JOB_FILE_DESCRIPTION = "genomicSourceFileDescription_";
    private static final String JOB_ACTION_BAR1 = "genomicSourceActionBar1_";
    private static final String JOB_ACTION_BAR2 = "genomicSourceActionBar2_";
    private static final String GENOMIC_SOURCES_LOADER = "genomicSourceLoader";

    private StudyManagementService studyManagementService;

    /**
     * {@inheritDoc}
     */
    @Override
    protected void initializeDynamicTable(DisplayableUserWorkspace workspace) {
        String username = workspace.getUserWorkspace().getUsername();
        try {
            StudyConfiguration studyConfiguration = workspace.getCurrentStudyConfiguration();
            if (studyConfiguration != null && studyConfiguration.getId() != null) {
                studyConfiguration = studyManagementService.getRefreshedEntity(studyConfiguration);
                int counter = 0;
                for (GenomicDataSourceConfiguration genomicSource : studyConfiguration.getGenomicDataSources()) {
                    getDwrUtil(username).addRows(STATUS_TABLE, createRow(genomicSource),
                            retrieveRowOptions(counter));
                    updateJobStatus(username, genomicSource, false);
                    counter++;
                }
            }
        } finally {
            getDwrUtil(username).setValue(GENOMIC_SOURCES_LOADER, "");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void associateJobWithSession(DwrUtilFactory dwrUtilFactory, String username, Util util) {
        dwrUtilFactory.associateGenomicDataSourceWithSession(username, util);
    }

    private String[][] createRow(GenomicDataSourceConfiguration genomicSource) {
        String[][] rowString = new String[1][8];
        String id = genomicSource.getId().toString();
        String startSpan = "<span id=\"";
        String endSpan = "\"> </span>";
        rowString[0][0] = startSpan + JOB_HOST_NAME + id + endSpan;
        rowString[0][1] = startSpan + JOB_EXPERIMENT_IDENTIFIER + id + endSpan;
        rowString[0][2] = startSpan + JOB_FILE_DESCRIPTION + id + endSpan;
        rowString[0][3] = startSpan + JOB_DATA_TYPE + id + endSpan;
        rowString[0][4] = startSpan + JOB_DEPLOYMENT_STATUS + id + endSpan;
        rowString[0][5] = startSpan + JOB_LAST_MODIFIED_DATE + id + endSpan;
        rowString[0][6] = startSpan + JOB_NEW_DATA_AVAILABLE + id + endSpan;
        rowString[0][7] = startSpan + JOB_EDIT_URL + id + endSpan + startSpan + getMappingActionUrl(genomicSource)
                + id + endSpan + startSpan + JOB_DELETE_URL + id + endSpan;

        return rowString;
    }

    private String getMappingActionUrl(GenomicDataSourceConfiguration genomicSource) {
        if (genomicSource.isExpressionData()) {
            return JOB_MAP_SAMPLES_URL;
        } else if (genomicSource.isSnpData()) {
            return JOB_CONFIGURE_SNP_URL;
        } else {
            return JOB_CONFIGURE_COPY_NUMBER_URL;
        }
    }

    /**
     * {@inheritDoc}
     */
    public void runJob(Long genomicSourceId) {
        Thread genomicSourceRunner = new Thread(new GenomicDataSourceAjaxRunner(this, genomicSourceId));
        genomicSourceRunner.start();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected Util getDwrUtil(String username) {
        return getDwrUtilFactory().retrieveGenomicDataSourceUtil(username);
    }

    /**
     * Saves studyConfiguration to database, then updates the status to JSP.
     * @param username to update the status to.
     * @param genomicSource to save and update.
     */
    public void saveAndUpdateJobStatus(String username, GenomicDataSourceConfiguration genomicSource) {
        getStudyManagementService().daoSave(genomicSource);
        updateJobStatus(username, genomicSource, true);
    }

    /**
     * Updates studyConfiguration status.
     * @param username to update the status to.
     * @param genomicSource to update.
     * @param checkDeployButton determines whether to update the deploy button or not.
     */
    public void updateJobStatus(String username, GenomicDataSourceConfiguration genomicSource,
            boolean checkDeployButton) {
        Util utilThis = getDwrUtil(username);
        String genomicSourceId = genomicSource.getId().toString();
        utilThis.setValue(JOB_HOST_NAME + genomicSourceId, genomicSource.getServerProfile().getHostname());
        utilThis.setValue(JOB_EXPERIMENT_IDENTIFIER + genomicSourceId, genomicSource.getExperimentIdentifier());
        updateRowFileDescriptions(utilThis, genomicSource, genomicSourceId);
        utilThis.setValue(JOB_DATA_TYPE + genomicSourceId, genomicSource.getDataType().getValue());
        utilThis.setValue(JOB_DEPLOYMENT_STATUS + genomicSourceId, getStatusMessage(genomicSource.getStatus()));
        utilThis.setValue(JOB_LAST_MODIFIED_DATE + genomicSourceId, genomicSource.getDisplayableLastModifiedDate());
        utilThis.setValue(JOB_NEW_DATA_AVAILABLE + genomicSourceId,
                StringUtils.capitalize(BooleanUtils.toStringYesNo(genomicSource.isDataRefreshed())));
        updateRowActions(genomicSource, utilThis, genomicSourceId);
    }

    private void updateRowFileDescriptions(Util utilThis, GenomicDataSourceConfiguration genomicSource,
            String genomicSourceId) {
        StringBuffer fileDescriptionString = new StringBuffer();
        String brString = "<br>";
        if (genomicSource.isExpressionData()) {
            fileDescriptionString.append("<i>Mapping File: </i>");
            fileDescriptionString.append(genomicSource.getSampleMappingFileName());
            fileDescriptionString.append(brString);

            fileDescriptionString.append("<i>Control Sample Mapping File(s): </i>");
            for (String fileName : genomicSource.getControlSampleMappingFileNames()) {
                fileDescriptionString.append(fileName);
                fileDescriptionString.append(brString);
            }
        } else if (genomicSource.isCopyNumberData()) {
            fileDescriptionString.append("<i>Copy Number Mapping File: </i>");
            fileDescriptionString.append(genomicSource.getDnaAnalysisMappingFileName());
        } else if (genomicSource.isSnpData()) {
            fileDescriptionString.append("<i>SNP Mapping File: </i>");
            fileDescriptionString.append(genomicSource.getDnaAnalysisMappingFileName());
        }
        utilThis.setValue(JOB_FILE_DESCRIPTION + genomicSourceId, fileDescriptionString.toString());
    }

    private void updateRowActions(GenomicDataSourceConfiguration genomicSource, Util utilThis,
            String genomicSourceId) {
        if (!Status.PROCESSING.equals(genomicSource.getStatus())) { // Not processing gets actions
            addNonProcessingActions(genomicSource, utilThis, genomicSourceId);
        } else { // Processing has no actions.
            utilThis.setValue(JOB_EDIT_URL + genomicSourceId, "");
            utilThis.setValue(getMappingActionUrl(genomicSource) + genomicSourceId, "");
            utilThis.setValue(JOB_DELETE_URL + genomicSourceId, "");
            utilThis.setValue(JOB_ACTION_BAR1 + genomicSourceId, "");
            utilThis.setValue(JOB_ACTION_BAR2 + genomicSourceId, "");
        }
    }

    private void addNonProcessingActions(GenomicDataSourceConfiguration genomicSource, Util utilThis,
            String genomicSourceId) {
        String jobActionBarString = "&nbsp;";
        if (!Status.ERROR.equals(genomicSource.getStatus())) {
            addNonErrorActions(genomicSource, utilThis, genomicSourceId, jobActionBarString);
        }
        utilThis.setValue(JOB_EDIT_URL + genomicSourceId,
                retrieveUrl(genomicSource, "editGenomicSource", "Edit", "edit", false), false);
        utilThis.setValue(JOB_ACTION_BAR1 + genomicSourceId, jobActionBarString, false);
        utilThis.setValue(JOB_DELETE_URL + genomicSourceId,
                retrieveUrl(genomicSource, "deleteGenomicSource", "Delete", "delete", true), false);
    }

    private void addNonErrorActions(GenomicDataSourceConfiguration genomicSource, Util utilThis,
            String genomicSourceId, String jobActionBarString) {
        if (genomicSource.isExpressionData()) {
            utilThis.setValue(JOB_MAP_SAMPLES_URL + genomicSourceId,
                    retrieveUrl(genomicSource, "editSampleMapping", "Map Samples", "map", false), false);
        } else if (genomicSource.isSnpData()) {
            utilThis.setValue(JOB_CONFIGURE_SNP_URL + genomicSourceId, retrieveUrl(genomicSource,
                    "editDnaAnalysisDataConfiguration", "ConfigureSnpData", "configure", false), false);
        } else {
            utilThis.setValue(
                    JOB_CONFIGURE_COPY_NUMBER_URL + genomicSourceId, retrieveUrl(genomicSource,
                            "editDnaAnalysisDataConfiguration", "ConfigureCopyNumberData", "configure", false),
                    false);
        }
        utilThis.setValue(JOB_ACTION_BAR2 + genomicSourceId, jobActionBarString, false);
    }

    private String retrieveUrl(GenomicDataSourceConfiguration genomicSource, String actionName, String linkDisplay,
            String linkCssClass, boolean isDelete) {
        String deleteString = "", token = "", tokenName = "";

        try {
            token = SessionHelper.getInstance().getToken();
            tokenName = SessionHelper.getInstance().getTokenName();
        } catch (Exception e) {
            token = "";
        }

        if (isDelete) {
            StringBuffer messageString = new StringBuffer("The Genomic Data Source "
                    + genomicSource.getExperimentIdentifier() + " will be permanently deleted.");
            if (genomicSource.isCopyNumberData()) {
                messageString.append(
                        "  Any copy number analysis jobs associated with samples in this source will also be deleted.");
            }
            deleteString = "onclick=\"return confirm('" + messageString.toString() + "')\"";
        }

        return "<a style=\"margin: 0pt;\" class=\"btn\" " + "onclick=\"updateUrlTokenParameters(this)\" href=\""
                + actionName + ".action?studyConfiguration.id=" + genomicSource.getStudyConfiguration().getId()
                + "&genomicSource.id=" + genomicSource.getId() + "&struts.token.name=" + tokenName + "&token="
                + token + "\"" + deleteString + "><span class=\"btn_img\"><span class=\"" + linkCssClass + "\">"
                + linkDisplay + "</span></span></a>";

    }

    private String getStatusMessage(Status genomicSourceStatus) {
        if (Status.PROCESSING.equals(genomicSourceStatus)) {
            return AJAX_LOADING_GIF + " " + genomicSourceStatus.getValue();
        }
        return genomicSourceStatus.getValue();
    }

    /**
     * @return the studyManagementService
     */
    public StudyManagementService getStudyManagementService() {
        return studyManagementService;
    }

    /**
     * @param studyManagementService the studyManagementService to set
     */
    public void setStudyManagementService(StudyManagementService studyManagementService) {
        this.studyManagementService = studyManagementService;
    }

}