/******************************************************************************* * 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; } }