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

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

/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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

import org.slf4j.Logger;

import eu.scape_project.planning.exception.PlanningException;
import eu.scape_project.planning.manager.StorageException;
import eu.scape_project.planning.model.Alternative;
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.model.measurement.Measure;
import eu.scape_project.planning.model.tree.Leaf;
import eu.scape_project.planning.model.tree.Node;
import eu.scape_project.planning.model.tree.TreeNode;
import eu.scape_project.planning.plato.bean.TreeHelperBean;
import eu.scape_project.planning.plato.wf.AbstractWorkflowStep;
import eu.scape_project.planning.plato.wf.EvaluateExperiments;
import eu.scape_project.planning.plato.wfview.AbstractView;
import eu.scape_project.planning.utils.CharacterisationReportGenerator;
import eu.scape_project.planning.utils.Downloader;
import eu.scape_project.planning.utils.FacesMessages;
import eu.scape_project.planning.validation.ValidationError;

/**
* Class used as backing bean for view step Evaluate Experiments. i.e. enable
* the user to enter the evaluation result per alternative and sample object.
* The user has to enter evaluation result for all leaves in the objective tree.
*
* @author Michael Kraxner, Markus Hamm
*/
@Named("evalexperiments")
@ConversationScoped
public class EvaluateExperimentsView extends AbstractView {
    private static final long serialVersionUID = 2879369643201412418L;

    @Inject
    private Logger log;

    @Inject
    private EvaluateExperiments evaluateExperiments;

    @Inject
    private FacesMessages facesMessages;

    @Inject
    private Downloader downloader;

    @Inject
    private TreeHelperBean treeHelper;

    /**
     * List of all leaves for which the evaluation settings shall be displayed
     * to the user.
     */
    private List<Leaf> leaves;

    /**
     * This is a pseudo list which only contains the tree's root node.
     */
    private List<TreeNode> treeRoot;

    /**
     * We want to display the measurableProperties of the plan as these are
     * aggregated from the requirements tree, we have to cache them.
     */
    private List<Measure> measures;

    private boolean autoEvaluationAvailable;

    private String sampleCharacterisationReportAsHTML;
    private String resultCharacterisationReportAsHTML;

    /**
     * Constructs a new object.
     */
    public EvaluateExperimentsView() {
        currentPlanState = PlanState.EXPERIMENT_PERFORMED;
        name = "Evaluate Experiments";
        viewUrl = "/plan/evalexperiments.jsf";
        group = "menu.evaluateAlternatives";

        leaves = new ArrayList<Leaf>();
        measures = new ArrayList<Measure>();
    }

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

        initLeafLists();

        autoEvaluationAvailable = evaluateExperiments.isAutoEvaluationAvailable();
        refreshMeasures();

        treeRoot = new ArrayList<TreeNode>();
        treeRoot.add(plan.getTree().getRoot());

        treeHelper.resetAllNodes();
    }

    @Override
    public boolean tryProceed(List<ValidationError> errors) {
        if (!super.tryProceed(errors)) {
            // this is from the legacy code - why do we clear this list only,
            // when there are errors?
            leaves.clear();
            for (ValidationError error : errors) {
                if (error.getInvalidObject() instanceof Leaf) {
                    Leaf leaf = (Leaf) error.getInvalidObject();
                    leaves.add(leaf);
                    treeHelper.expandNode(leaf);
                }
            }
            return false;
        }
        return true;
    }

    /**
     * Evaluates all leaves.
     */
    public void evaluateAll() {
        try {
            evaluateExperiments.evaluateLeaves(plan.getTree().getRoot().getAllLeaves());
        } catch (PlanningException e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * Evaluates the provided {@code leaf}.
     *
     * @param leaf
     *            the leaf to evaluate
     */
    public void evaluate(Leaf leaf) {
        try {
            evaluateExperiments.evaluateLeaves(Arrays.asList(leaf));
        } catch (PlanningException e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * Select a node or leaf from the tree. If a node is selected, all its
     * children are selected too.
     *
     * @param node
     *            the node to select
     */
    public void select(TreeNode node) {
        initLeafLists();
        if (node instanceof Node) {
            leaves = node.getAllLeaves();
        } else if (node instanceof Leaf) {
            leaves.add((Leaf) node);
        }
    }

    /**
     * @see {@link EvaluateExperiments#approveAllValues() }
     */
    public void approve() {
        evaluateExperiments.approveAllValues();
    }

    /**
     * Initialises the leaf lists.
     */
    private void initLeafLists() {
        leaves.clear();
    }

    private void refreshMeasures() {
        measures.clear();
        // FIXME see Plan.getMeasuredMeasures

        // measures.addAll(plan.getMeasuredMeasures());
        for (Measure m : measures) {
            log.debug("prop:: " + m.getName());
        }
    }

    public List<Measure> getMeasurableProperties() {
        return measures;
    }

    /**
     * Starts the download of a result file.
     *
     * @param alternative
     *            Alternative of the requested result file
     * @param sampleObject
     *            SampleObject of the requested result file
     */
    public void downloadResultFile(Alternative alternative, SampleObject sampleObject) {
        try {
            DigitalObject resultFile = evaluateExperiments.fetchResultFile(alternative, sampleObject);
            if (resultFile != null) {
                downloader.download(resultFile);
            } else {
                log.debug("No result file exists for alternative " + alternative.getName() + " and sample "
                    + sampleObject.getFullname());
            }
        } catch (StorageException e) {
            log.error("Exception at trying to fetch result file for alternative " + alternative.getName()
                + "and sample " + sampleObject.getFullname() + ": " + e.getMessage(), e);
            facesMessages.addError("Unable to fetch result-file");
        }
    }

    /**
     * Starts the download for the given sample object.
     *
     * @param object
     *            the object to download
     */
    public void downloadSampleObject(SampleObject object) {
        if (object == null) {
            log.debug("No sample object provided.");
            return;
        }
        try {
            DigitalObject sampleObject = evaluateExperiments.fetchDigitalObject(object);
            if (sampleObject != null) {
                downloader.download(sampleObject);
            } else {
                log.debug("Sample object not found");
            }
        } catch (StorageException e) {
            log.error("Failed to fetch sample object " + object.getFullname(), e);
            facesMessages.addError("Unable to fetch sample object");
        }
    }

    /**
     * Generates characterisation reports of the provided {@code sample} and the
     * result of the {@code alternative}.
     *
     * @param sample
     *            the sample to use
     * @param alternative
     *            alternative to use
     */
    public void generateCharacterisationReports(SampleObject sample, Alternative alternative) {
        CharacterisationReportGenerator reportGen = new CharacterisationReportGenerator();

        sampleCharacterisationReportAsHTML = reportGen.generateHTMLReport(sample);

        DigitalObject resultObject = alternative.getExperiment().getResults().get(sample);
        resultCharacterisationReportAsHTML = reportGen.generateHTMLReport(resultObject);
    }

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

    // ---------- getter/setter ----------
    public TreeHelperBean getTreeHelper() {
        return treeHelper;
    }

    public List<Leaf> getLeaves() {
        return leaves;
    }

    public List<TreeNode> getTreeRoot() {
        return treeRoot;
    }

    public boolean isAutoEvaluationAvailable() {
        return autoEvaluationAvailable;
    }

    public String getSampleCharacterisationReportAsHTML() {
        return sampleCharacterisationReportAsHTML;
    }

    public String getResultCharacterisationReportAsHTML() {
        return resultCharacterisationReportAsHTML;
    }
}
TOP

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

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.