Package eu.scape_project.planning.plato.wfview.full

Source Code of eu.scape_project.planning.plato.wfview.full.RunExperimentsView

/*******************************************************************************
* Copyright 2006 - 2014 Vienna University of Technology,
* Department of Software Technology and Interactive Systems, IFS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package eu.scape_project.planning.plato.wfview.full;

import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;
import org.slf4j.Logger;

import eu.scape_project.planning.manager.StorageException;
import eu.scape_project.planning.model.Alternative;
import eu.scape_project.planning.model.DetailedExperimentInfo;
import eu.scape_project.planning.model.DigitalObject;
import eu.scape_project.planning.model.Plan;
import eu.scape_project.planning.model.PlanState;
import eu.scape_project.planning.model.SampleObject;
import eu.scape_project.planning.plato.bean.ExperimentStatus;
import eu.scape_project.planning.plato.wf.AbstractWorkflowStep;
import eu.scape_project.planning.plato.wf.RunExperiments;
import eu.scape_project.planning.plato.wfview.AbstractView;
import eu.scape_project.planning.utils.Downloader;

/**
* Bean for the viewWorkflow step 'Run Experiments'.
*/
@Named("runExperiments")
@ConversationScoped
public class RunExperimentsView extends AbstractView {
    private static final long serialVersionUID = 1L;

    @Inject
    private Logger log;

    @Inject
    private RunExperiments runExperiments;

    @Inject
    private Downloader downloader;

    /**
     * DetailedExperimentInfo selected in the UI for editing purposes.
     */
    private DetailedExperimentInfo selectedDetailedExperimentInfo;

    private boolean hasExecutableExperiments;

    /**
     * Alternative for the next upload.
     */
    private Alternative alternativeForNextUpload;

    /**
     * Sample Object for the next upload.
     */
    private SampleObject sampleObjectForNextUpload;

    private ExperimentStatus experimentStatus = new ExperimentStatus();

    /**
     * Construct a new object.
     */
    public RunExperimentsView() {
        currentPlanState = PlanState.EXPERIMENT_DEFINED;
        name = "Run Experiments";
        viewUrl = "/plan/runexperiments.jsf";
        group = "menu.evaluateAlternatives";
    }

    @Override
    public void init(Plan plan) {
        super.init(plan);

        // TODO: Maybe it is better to have this method in some previous BL-step
        // (after Alternatives and Sample definition)?
        // Here it seems a little bit too symptomatic to me.
        plan.initializeExperimentInfos();

        hasExecutableExperiments = false;
        for (Alternative alt : plan.getAlternativesDefinition().getAlternatives()) {
            if (alt.isExecutable()) {
                hasExecutableExperiments = true;
            }
        }
    }

    @Override
    protected AbstractWorkflowStep getWfStep() {
        return runExperiments;
    }

    /**
     * Sets up experiments for the provided {@code alternative} for later
     * execution.
     *
     * @param alternative
     *            The alternative to run the experiment for.
     *
     * @see #startExperiments()
     */
    public void setupExperiment(Alternative alternative) {
        experimentStatus = runExperiments.setupExperiment(alternative);
    }

    /**
     * Set up experiments for all alternatives for later execution.
     *
     * @see #startExperiments()
     */
    public void setupAllExperiments() {
        experimentStatus = runExperiments.setupAllExperiments();
    }

    /**
     * Starts set up experiments.
     *
     * @see #setupExperiment(Alternative)
     * @see #setupAllExperiments()
     */
    public void startExperiments() {
        experimentStatus.setStarted(true);
        runExperiments.startExperiments();
        log.info("Experiment started...");
    }

    public ExperimentStatus getExperimentStatus() {
        return experimentStatus;
    }

    /**
     * Method responsible for updating the selected experiment info based on
     * user interaction.
     *
     * @param alt
     *            Experiment alternative.
     * @param sampleObj
     *            Experiment sample object.
     */
    public void updateSelectedDetailedExperimentInfo(Object alt, Object sampleObj) {
        Alternative alternative = (Alternative) alt;
        SampleObject sampleObject = (SampleObject) sampleObj;

        selectedDetailedExperimentInfo = alternative.getExperiment().getDetailedInfo().get(sampleObject);
    }

    /**
     * Method responsible for setting the appropriate Alternative and
     * SampleObject for the next file-upload.
     *
     * @param alt
     *            Alternative corresponding to the next file-upload.
     * @param sampleObj
     *            SampleObject corresponding to the next file-upload.
     */
    public void updateDataForNextUpload(Object alt, Object sampleObj) {
        Alternative alternative = (Alternative) alt;
        SampleObject sampleObject = (SampleObject) sampleObj;

        alternativeForNextUpload = alternative;
        sampleObjectForNextUpload = sampleObject;
    }

    /**
     * Method responsible for uploading result files for the set up alternative
     * and sample object.
     *
     * @param event
     *            Richfaces FileUploadEvent class.
     * @see #updateDataForNextUpload(Object, Object)
     */
    public void uploadResultFile(FileUploadEvent event) {
        UploadedFile file = event.getUploadedFile();

        // Put file-data into a digital object
        DigitalObject digitalObject = new DigitalObject();
        digitalObject.setFullname(file.getName());
        digitalObject.getData().setData(file.getData());
        digitalObject.setContentType(file.getContentType());

        try {
            runExperiments.uploadResultFile(digitalObject, alternativeForNextUpload, sampleObjectForNextUpload);
        } catch (StorageException e) {
            log.error("Exception at trying to upload result file.", e);
            facesMessages.addError("Unable to upload result file for alternative. Please try again.");
        }
    }

    /**
     * Method responsible for starting the download of a given result file.
     *
     * @param alt
     *            Alternative of the wanted result file.
     * @param sampleObj
     *            SampleObject of the wanted result file.
     */
    public void downloadResultFile(Object alt, Object sampleObj) {
        Alternative alternative = (Alternative) alt;
        SampleObject sampleObject = (SampleObject) sampleObj;

        DigitalObject resultFile = null;

        try {
            resultFile = runExperiments.fetchResultFile(alternative, sampleObject);
        } catch (StorageException e) {
            log.error("Exception at trying to fetch result file for alternative " + alternative.getName()
                + "and sample " + sampleObject.getFullname(), e);
            facesMessages.addError("Unable to fetch result file. Please try again.");
        }

        if (resultFile != null) {
            downloader.download(resultFile);
        } else {
            log.debug("No result file exists for alternative " + alternative.getName() + " and sample "
                + sampleObject.getFullname() + ".");
        }
    }

    /**
     * Removes a previously uploaded result file.
     *
     * @param alt
     *            Alternative the file was uploaded for.
     * @param sampleObj
     *            Sample the file was uploaded for.
     */
    public void removeResultFile(Object alt, Object sampleObj) {
        Alternative alternative = (Alternative) alt;
        SampleObject sampleObject = (SampleObject) sampleObj;

        runExperiments.removeResultFile(alternative, sampleObject);
    }

    // --------------- getter/setter ---------------

    public DetailedExperimentInfo getSelectedDetailedExperimentInfo() {
        return selectedDetailedExperimentInfo;
    }

    public void setSelectedDetailedExperimentInfo(DetailedExperimentInfo selectedDetailedExperimentInfo) {
        this.selectedDetailedExperimentInfo = selectedDetailedExperimentInfo;
    }

    public boolean isHasExecutableExperiments() {
        return hasExecutableExperiments;
    }

    public void setHasExecutableExperiments(boolean hasExecutableExperiments) {
        this.hasExecutableExperiments = hasExecutableExperiments;
    }

    public Alternative getAlternativeForNextUpload() {
        return alternativeForNextUpload;
    }

    public void setAlternativeForNextUpload(Alternative alternativeForNextUpload) {
        this.alternativeForNextUpload = alternativeForNextUpload;
    }

    public SampleObject getSampleObjectForNextUpload() {
        return sampleObjectForNextUpload;
    }

    public void setSampleObjectForNextUpload(SampleObject sampleObjectForNextUpload) {
        this.sampleObjectForNextUpload = sampleObjectForNextUpload;
    }
}
TOP

Related Classes of eu.scape_project.planning.plato.wfview.full.RunExperimentsView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.