/*******************************************************************************
* Copyright 2006 - 2012 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.wf;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateful;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import org.slf4j.Logger;
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.PlanState;
import eu.scape_project.planning.model.SampleObject;
import eu.scape_project.planning.model.aggregators.WeightedSum;
import eu.scape_project.planning.model.beans.ResultNode;
import eu.scape_project.planning.model.sensitivity.OrderChangeCountTest;
import eu.scape_project.planning.model.sensitivity.SimpleIterativeWeightModifier;
import eu.scape_project.planning.model.tree.Leaf;
import eu.scape_project.planning.plato.wfview.beans.ReportLeaf;
/**
* Class containing business logic for workflow-step AnalyseResults.
*
* @author Markus Hamm, Michael Kraxner
*/
@Stateful
@ConversationScoped
public class AnalyseResults extends AbstractWorkflowStep {
private static final int MAX_SENSITIVITY_ANALYSIS_LEAVES = 40;
private static final long serialVersionUID = -756737838773396705L;
@Inject
private Logger log;
/**
* Constructs a new object.
*/
public AnalyseResults() {
this.requiredPlanState = PlanState.WEIGHTS_SET;
this.correspondingPlanState = PlanState.ANALYSED;
}
@Override
protected void saveStepSpecific() {
prepareChangesForPersist.prepare(plan);
saveEntity(plan.getRecommendation());
saveEntity(plan.getExecutablePlanDefinition());
}
/**
* Method responsible for retrieving a copy of a previously uploaded sample
* object including its data.
*
* @param sampleObject
* SampleObject(=extended DigitalObject) stored in file system
* for which the data should be retrieved.
* @return Copy of the given SampleObject(as DigitalObject) including its
* data.
* @throws StorageException
* is thrown if any error occurs at retrieving the result file.
*/
public DigitalObject fetchSampleObject(SampleObject sampleObject) throws StorageException {
return digitalObjectManager.getCopyOfDataFilledDigitalObject(sampleObject);
}
/**
* Method responsible for constructing report leaves for the plans tree.
*
* @return List of plans report-leaves.
*/
public List<ReportLeaf> constructPlanReportLeaves() {
List<ReportLeaf> leafBeans = new ArrayList<ReportLeaf>();
for (Leaf l : plan.getTree().getRoot().getAllLeaves()) {
leafBeans.add(new ReportLeaf(l, plan.getAlternativesDefinition().getConsideredAlternatives()));
// TODO: Check if this statement can be removed
l.initTransformer();
}
return leafBeans;
}
/**
* Method responsible for performing sensitivity analysis on the given
* result-tree.
*
* @param rootNode
* Root ResultNode of the tree to analyze.
* @param alternatives
* Alternatives to include in the analysis.
*/
public void analyseSensitivity(ResultNode rootNode, List<Alternative> alternatives) {
long start = System.currentTimeMillis();
// FIXME HK reintroduce SENSITIVITY analysis for large trees - Plato 3.1
if (plan.getTree().getRoot().getAllLeaves().size() < MAX_SENSITIVITY_ANALYSIS_LEAVES) {
log.debug("Starting sensitivity analysis ... ");
rootNode.analyseSensitivity(new SimpleIterativeWeightModifier(), new OrderChangeCountTest(plan.getTree()
.getRoot(), new WeightedSum(), alternatives));
log.debug("Sensitivity analysis took: " + (System.currentTimeMillis() - start) + "ms.");
} else {
log.debug("Sensitivity analysis NOT CONDUCTED: Too many leaves.");
}
}
/**
* Method responsible for setting the recommended alternative.
*
* @param recommendedAlternative
* Recommended alternative.
*/
public void recommendAlternative(Alternative recommendedAlternative) {
plan.getRecommendation().setAlternative(recommendedAlternative);
DigitalObject executablePlan = plan.getExecutablePlanDefinition().getT2flowExecutablePlan();
if (executablePlan != null) {
plan.getExecutablePlanDefinition().setT2flowExecutablePlan(null);
bytestreamsToRemove.add(executablePlan.getPid());
}
plan.getRecommendation().touch();
}
}