Java tutorial
/******************************************************************************* * Copyright (c) 2007, 2010 The Planets Project Partners. * * All rights reserved. This program and the accompanying * materials are made available under the terms of the * Apache License, Version 2.0 which accompanies * this distribution, and is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package eu.planets_project.tb.gui.backing.exp; import java.io.File; import java.net.URI; import java.text.FieldPosition; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.Vector; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.component.UIParameter; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.event.ValueChangeEvent; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.richfaces.component.html.HtmlDataTable; import eu.planets_project.ifr.core.wee.api.wsinterface.WftRegistryService; import eu.planets_project.services.PlanetsException; import eu.planets_project.tb.api.TestbedManager; import eu.planets_project.tb.api.data.util.DataHandler; import eu.planets_project.tb.api.model.BasicProperties; import eu.planets_project.tb.api.model.Experiment; import eu.planets_project.tb.api.model.ExperimentEvaluation; import eu.planets_project.tb.api.model.ExperimentExecutable; import eu.planets_project.tb.api.model.ExperimentResources; import eu.planets_project.tb.api.model.ExperimentSetup; import eu.planets_project.tb.api.model.benchmark.BenchmarkGoal; import eu.planets_project.tb.api.model.ontology.OntologyProperty; import eu.planets_project.tb.api.persistency.ExperimentPersistencyRemote; import eu.planets_project.tb.api.services.ServiceTemplateRegistry; import eu.planets_project.tb.api.services.TestbedServiceTemplate; import eu.planets_project.tb.api.services.TestbedServiceTemplate.ServiceOperation; import eu.planets_project.tb.api.services.tags.DefaultServiceTagHandler; import eu.planets_project.tb.api.services.tags.ServiceTag; import eu.planets_project.tb.api.system.batch.BatchProcessor; import eu.planets_project.tb.gui.UserBean; import eu.planets_project.tb.gui.backing.BenchmarkBean; import eu.planets_project.tb.gui.backing.ExperimentBean; import eu.planets_project.tb.gui.backing.FileUploadBean; import eu.planets_project.tb.gui.backing.Manager; import eu.planets_project.tb.gui.backing.PropertyDnDTreeBean; import eu.planets_project.tb.gui.backing.UploadManager; import eu.planets_project.tb.gui.backing.wf.EditWorkflowParameterInspector; import eu.planets_project.tb.gui.util.JSFUtil; import eu.planets_project.tb.impl.AdminManagerImpl; import eu.planets_project.tb.impl.TestbedManagerImpl; import eu.planets_project.tb.impl.data.util.DataHandlerImpl; import eu.planets_project.tb.impl.exceptions.InvalidInputException; import eu.planets_project.tb.impl.model.ExperimentEvaluationImpl; import eu.planets_project.tb.impl.model.ExperimentExecutableImpl; import eu.planets_project.tb.impl.model.ExperimentImpl; import eu.planets_project.tb.impl.model.ExperimentResourcesImpl; import eu.planets_project.tb.impl.model.PropertyEvaluationRecordImpl; import eu.planets_project.tb.impl.model.benchmark.BenchmarkGoalImpl; import eu.planets_project.tb.impl.model.benchmark.BenchmarkGoalsHandlerImpl; import eu.planets_project.tb.impl.model.exec.BatchExecutionRecordImpl; import eu.planets_project.tb.impl.model.exec.ExecutionRecordImpl; import eu.planets_project.tb.impl.model.exec.ExecutionStageRecordImpl; import eu.planets_project.tb.impl.model.finals.DigitalObjectTypesImpl; import eu.planets_project.tb.impl.model.measure.MeasurementImpl; import eu.planets_project.tb.impl.model.ontology.util.OntoPropertyUtil; import eu.planets_project.tb.impl.serialization.ExperimentViaJAXB; import eu.planets_project.tb.impl.serialization.SerialCloneUtil; import eu.planets_project.tb.impl.services.EvaluationTestbedServiceTemplateImpl; import eu.planets_project.tb.impl.services.ServiceTemplateRegistryImpl; import eu.planets_project.tb.impl.services.tags.DefaultServiceTagHandlerImpl; import eu.planets_project.tb.impl.services.util.wee.WeeRemoteUtil; import eu.planets_project.tb.impl.system.batch.TestbedBatchJob; import eu.planets_project.tb.impl.system.batch.TestbedBatchProcessorManager; public class NewExpWizardController { private static Log log = LogFactory.getLog(NewExpWizardController.class); public NewExpWizardController() { } /* * ------------------------------------------- * START methods for new_experiment wizard page */ public String updateBasicPropsAction() { // Flag to indicate validity of submission: boolean validForm = true; // Flag to indicate that the experiment definition is not valid and cannot be constructed boolean validExperiment = true; ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); log.info("ExpBean: " + expBean.getEname() + " : " + expBean.getEsummary()); // Get the Experiment description objects Experiment exp = expBean.getExperiment(); BasicProperties props = exp.getExperimentSetup().getBasicProperties(); log.info("Setting the experimental properties, " + props.getExperimentName() + " : " + props.getSummary()); // If the experiment already existed, check for valid name changes: try { props.setExperimentName(expBean.getEname()); } catch (InvalidInputException e1) { e1.printStackTrace(); } //set the experiment information props.setSummary(expBean.getEsummary()); props.setConsiderations(expBean.getEconsiderations()); props.setPurpose(expBean.getEpurpose()); props.setFocus(expBean.getEfocus()); props.setScope(expBean.getEscope()); props.setContact(expBean.getEcontactname(), expBean.getEcontactemail(), expBean.getEcontacttel(), expBean.getEcontactaddress()); props.setExperimentFormal(expBean.getFormality()); log.info("Set the experimental properties, " + props.getExperimentName() + " : " + props.getSummary()); String partpnts = expBean.getEparticipants(); String[] partpntlist = partpnts.split(","); for (int i = 0; i < partpntlist.length; i++) { partpntlist[i] = partpntlist[i].trim(); if (partpntlist[i] != "") { props.addInvolvedUser(partpntlist[i]); } } props.setExternalReferenceID(expBean.getExid()); ArrayList<String> litRefDesc = expBean.getLitRefDesc(); ArrayList<String> litRefURI = expBean.getLitRefURI(); ArrayList<String> litRefTitle = expBean.getLitRefTitle(); ArrayList<String> litRefAuthor = expBean.getLitRefAuthor(); if (litRefDesc != null && !litRefDesc.equals("")) { for (int i = 0; i < litRefDesc.size(); i++) { if (!"".equals(litRefDesc.get(i).trim()) && !"".equals(litRefURI.get(i).trim()))//author etc. can be empty props.addLiteratureReference(litRefDesc.get(i).trim(), litRefURI.get(i).trim(), litRefTitle.get(i).trim(), litRefAuthor.get(i).trim()); } } List<Long> refs = new ArrayList<Long>(); if (expBean.getEref() != null && !expBean.getEref().equals("")) { for (int i = 0; i < expBean.getEref().size(); i++) refs.add(Long.parseLong((expBean.getEref().get(i)))); } props.setExperimentReferences(refs); /* props.setDigiTypes(expBean.getDtype()); log.debug("Checking the experiment type."); // Set the experiment type: try { //check if the experiment type has changed. If yes we need to remove the already chosen log.info("Current type: '"+exp.getExperimentSetup().getExperimentTypeID()+"' versus '"+expBean.getEtype()+"'."); //selection from step2, to properly reload all available serivces + operations if(!exp.getExperimentSetup().getExperimentTypeID().equals(expBean.getEtype())){ //exp. type was reselected - remove all chosen template information expBean.removeSelectedServiceTemplate(); //set step2 to substep1 changeAlreadySelectedSerOps(); } // This is what throws the error: exp.getExperimentSetup().setExperimentType(expBean.getEtype()); } catch (InvalidInputException e) { FacesContext ctx = FacesContext.getCurrentInstance(); FacesMessage tfmsg = new FacesMessage(); tfmsg.setSummary("No experiment type specified!"); tfmsg.setDetail("You must select an experiment type."); tfmsg.setSeverity(FacesMessage.SEVERITY_ERROR); ctx.addMessage("etype",tfmsg); validForm = false; log.error("Got error on Etype: "+e); } */ // Exit with failure condition if no valid experiment could be constructed. if (!validForm && !validExperiment) { log.debug("Exiting with failure."); return "failure"; } // Exit with failure condition if the form submission was not valid. exp.getExperimentSetup().setState(Experiment.STATE_IN_PROGRESS); exp.getExperimentSetup().setSubStage(1); //testbedMan.updateExperiment(exp); if (validForm) { exp.getExperimentSetup().setSubStage(2); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTSETUP_2); log.debug("Exiting in success."); return "success"; } else { log.debug("Exiting in failure - invalid form."); return "failure"; } } public String addAnotherLitRefAction() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); expBean.addLitRefSpot(); return "success"; } public String updateBenchmarksAndSubmitAction() { if (this.updateBenchmarksAction() == "success") { return submitForApproval(); } else return null; } private String submitForApproval() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); exp.getExperimentSetup().setState(Experiment.STATE_COMPLETED); exp.getExperimentApproval().setState(Experiment.STATE_IN_PROGRESS); testbedMan.updateExperiment(exp); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTAPPROVAL); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("BenchmarkBeans"); // Attempt to approve the experiment, and forward appropriately if (!AdminManagerImpl.experimentRequiresApproval(exp)) { autoApproveExperiment(); NewExpWizardController.redirectToExpStage(expBean.getID(), 3); return "success"; } // Otherwise, await approval: AdminManagerImpl.requestExperimentApproval(exp); NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } public String unsubmitAndEdit() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); ExperimentImpl.resetToEditingStage(exp); testbedMan.updateExperiment(exp); NewExpWizardController.redirectToExpStage(expBean.getID(), 1); return "success"; } public String updateExperimentBeanState() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); testbedMan.updateExperiment(exp); return "success"; } /** * Adds the autoEval data to the benchmark goal and finally returns to step3 of the new experiment. * @return */ public String saveAutoEvalConfigData() { //set the bmb as selected, as otherwise its auto eval settings won't get stored AutoBMGoalEvalUserConfigBean autoEvalConfigBean = (AutoBMGoalEvalUserConfigBean) JSFUtil .getManagedObject("AutoEvalSerUserConfigBean"); this.setBenchmarkBeanSelected(autoEvalConfigBean.getBMGoalID(), true); //update the BenchmarkBean and all model elements updateBenchmarksAction(); return "return to exp_stage3"; } /** * Sets a given benchmark bean's selected state as true/false * @param bmGoalID * @param b */ @SuppressWarnings("unchecked") private void setBenchmarkBeanSelected(String bmGoalID, boolean b) { List<BenchmarkBean> bmbeans = (List<BenchmarkBean>) JSFUtil.getManagedObject("BenchmarkBeans"); for (BenchmarkBean bmb : bmbeans) { if (bmb.getID().equals(bmGoalID)) { bmb.setSelected(b); } } } /** * Takes the list of selected BenchmarkBeans, and creates BenchmarkGoal objects out if its provided * data which is stored as part of the experimentsetup overall BMGoals (not file bmgoals, not experimentevaluation phase). * Already added BenchmarkGoals get updated. * @return */ @SuppressWarnings("unchecked") public String updateBenchmarksAction() { /* FIXME ANJ Clean this up: try { */ // create bm-goals ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); // create Goal objects from Beans List<BenchmarkGoal> bmgoals = new ArrayList<BenchmarkGoal>(); List<BenchmarkBean> bmbeans = (List<BenchmarkBean>) JSFUtil.getManagedObject("BenchmarkBeans"); if (bmbeans != null) { Iterator<BenchmarkBean> iter = bmbeans.iterator(); //Iterator iter = expBean.getBenchmarks().values().iterator(); while (iter.hasNext()) { BenchmarkBean bmb = iter.next(); if (bmb.getSelected()) { //We're having an existing bmGoal object to modify BenchmarkGoal bmg = exp.getExperimentSetup().getBenchmarkGoal(bmb.getID()); if (bmg == null) { //We're adding a new BMGoal from the list //method to get a new instance of BenchmarkGoal bmg = BenchmarkGoalsHandlerImpl.getInstance().getBenchmarkGoal(bmb.getID()); } //update the bmg with the provided bean's data /* FIXME ANJ Clean this up helper_addBMBSettingsToBMGoal(bmb,bmg); */ bmgoals.add(bmg); // add to experimentbean benchmarks expBean.addBenchmarkBean(bmb); } else { expBean.deleteBenchmarkBean(bmb); } } } exp.getExperimentSetup().setBenchmarkGoals(bmgoals); ExperimentResources expRes = exp.getExperimentSetup().getExperimentResources(); if (expRes == null) expRes = new ExperimentResourcesImpl(); expRes.setIntensity(Integer.parseInt(expBean.getIntensity())); expRes.setNumberOfOutputFiles(Integer.parseInt(expBean.getNumberOfOutput())); exp.getExperimentSetup().setExperimentResources(expRes); //testbedMan.updateExperiment(exp); //the current stage is 3 as the'save' button is pressed expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTSETUP_3); exp.getExperimentSetup().setSubStage(ExperimentSetup.SUBSTAGE3); return "success"; /* FIXME ANJ Clean this up } catch (InvalidInputException e) { log.error(e.toString()); FacesMessage fmsg = new FacesMessage(); fmsg.setDetail("Problem saving data!"); fmsg.setSummary("Problem saving data!"); fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage(null,fmsg); return "failure"; } */ } /* FIXME ANJ Clean this up private BenchmarkGoal helper_addBMBSettingsToBMGoal(BenchmarkBean bmb, BenchmarkGoal bmg) throws InvalidInputException{ //get a new BMGoal object: BenchmarkGoal bmg = BenchmarkGoalsHandlerImpl.getInstance().getBenchmarkGoal(bmb.getID()); if (bmb.getSourceValue()!=null && (!(bmb.getSourceValue().equals("")))) bmg.setSourceValue(bmb.getSourceValue()); if (bmb.getTargetValue()!=null && (!(bmb.getTargetValue().equals("")))) bmg.setTargetValue(bmb.getTargetValue()); if (bmb.getEvaluationValue()!=null && (!(bmb.getEvaluationValue().equals("")))) bmg.setEvaluationValue(bmb.getEvaluationValue()); if (bmb.getWeight()!=null && (!(bmb.getWeight().equals("-1")))) bmg.setWeight(Integer.parseInt(bmb.getWeight())); //check and add auto evaluation configuration data this.addAutoEvalSettingsToBMGoal(bmb, bmg); return bmg; } */ /** * Fetches the provided AutoBMGoalEvalUserConfigBean, extracts its information * and stores it within the AutoEvaluationSettings backend object for a given BenchmarkGoal * The input BenchmarkGoal object is updated and returned. * @param bmb * @param bmg * @return */ /* FIXME ANJ Clean this up private BenchmarkGoal addAutoEvalSettingsToBMGoal(BenchmarkBean bmb, BenchmarkGoal bmg){ AutoBMGoalEvalUserConfigBean autoEvalConfigBean = (AutoBMGoalEvalUserConfigBean)JSFUtil.getManagedObject("AutoEvalSerUserConfigBean"); //check 1) if the bean was already configured and B) for which bmgoal the configuration was created: if(autoEvalConfigBean.getBMGoalID()==null) return bmg; if(!autoEvalConfigBean.getBMGoalID().equals(bmg.getID())){ //config not for this bean - return non-modified object return bmg; } if(bmb.getAutoEvalService()==null){ //config not set for this bean - return non-modified object return bmg; } AutoEvaluationSettingsImpl autoEvalConfig = new AutoEvaluationSettingsImpl(bmb.getAutoEvalService()); for(TBEvaluationTypes evalType: TBEvaluationTypes.values()){ //add the metric evaluation configuration for all types for(MetricBean mb:autoEvalConfigBean.getMetricConfigFor(evalType)){ //add all defined configurations for this type from the bean Metric m = new MetricImpl(mb.getName(), mb.getType(), mb.getDescription()); Config c = autoEvalConfig.new ConfigImpl(mb.getMathExpr(), mb.getEvalBoundary(), m); autoEvalConfig.addConfiguration(evalType, c); } } bmg.setAutoEvalSettings(autoEvalConfig); return bmg; } */ public String updateBMEvaluationAction() { log.debug("In updateEvaluationAction..."); try { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); Experiment exp = expBean.getExperiment(); // 1. Store the updated report: exp.getExperimentEvaluation().getExperimentReport().setHeader(expBean.getReportHeader()); exp.getExperimentEvaluation().getExperimentReport().setBodyText(expBean.getReportBody()); log.debug("updateEvaluation Report Header: " + exp.getExperimentEvaluation().getExperimentReport().getHeader()); // 2. update Experiment Overall BenchmarkGoals from Bean List<BenchmarkGoal> expBMgoals = new ArrayList<BenchmarkGoal>(); Iterator<BenchmarkBean> iter = expBean.getExperimentBenchmarkBeans().iterator(); log.debug("Found # of ExperimentOverall BMGS: " + expBean.getExperimentBenchmarkBeans().size()); boolean bError = false; while (iter.hasNext()) { BenchmarkBean bmb = iter.next(); BenchmarkGoal bmg; if (bmb.getSelected()) { // get the bmgoal from the evaluation data bmg = exp.getExperimentEvaluation().getEvaluatedExperimentBenchmarkGoal(bmb.getID()); expBMgoals.add(bmg); /* FIXME ANJ Clean this up: try { //update the bmg with the provided bean's data helper_addBMBSettingsToBMGoal(bmb,bmg); expBMgoals.add(bmg); log.debug("updating bmg's target:" + bmg.getTargetValue()); } catch (InvalidInputException e) { //create an ErrorMessage FacesMessage fmsg = new FacesMessage(); if(bmg!=null){ fmsg.setSummary("Validation of "+bmg.getName()+" failed"); fmsg.setDetail("Validation of "+bmg.getName()+" failed"); } else{ fmsg.setDetail("source/target value of a given file-Benchmarkgoal is not valid!"+e.toString()); fmsg.setSummary("source/target value of a given file-Benchmarkgoal is not valid!"); } fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("bmTable",fmsg); log.error(e.toString()); //set error true: all error messages are collected and then "failure" is returned bError = true; } */ } } //3. fill the file benchmark goals - used for evaluation of every input file boolean bError2 = false; Map<String, BenchmarkBean> mBMBs = expBean.getFileBenchmarkBeans(); Map<URI, List<BenchmarkGoal>> mFileBMGs = new HashMap<URI, List<BenchmarkGoal>>(); Iterator<String> itLocalInputFileRefs = expBean.getExperimentInputData().values().iterator(); DataHandler dh = new DataHandlerImpl(); //iterate over every input file and add update their evaluation BenchmarkGoal bmg = null; try { while (itLocalInputFileRefs.hasNext()) { String localInputFileRef = itLocalInputFileRefs.next(); URI inputURI = dh.get(localInputFileRef).getDownloadUri(); List<BenchmarkGoal> lbmgs = new ArrayList<BenchmarkGoal>(); for (BenchmarkBean b : mBMBs.values()) { bmg = exp.getExperimentEvaluation().getEvaluatedFileBenchmarkGoal(inputURI, b.getID()); //BenchmarkBean bmb = mBMBs.get(inputURI+b.getID()); lbmgs.add(bmg); /* FIXME ANJ Clean this up: try{ this.helper_addBMBSettingsToBMGoal(bmb, bmg); lbmgs.add(bmg); } catch(InvalidInputException e){ //create an ErrorMessage FacesMessage fmsg = new FacesMessage(); if(bmg!=null){ fmsg.setSummary("Validation of "+bmg.getName()+" failed"); fmsg.setDetail("Validation of "+bmg.getName()+" failed"); } else{ fmsg.setDetail("source/target value of a given file-Benchmarkgoal is not valid!"+e.toString()); fmsg.setSummary("source/target value of a given file-Benchmarkgoal is not valid!"); } fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("modelpanel_error",fmsg); log.error(e.toString()); bError2 = true; } */ } mFileBMGs.put(inputURI, lbmgs); } } catch (Exception e2) { //a system exception occurred: log.error("Failure within filling FileBenchmarkGoals"); return "failure"; } //if either overall bmgoal evaluation or file bmgoal evaluation caused a validation exception if ((bError) || (bError2)) { return "failure"; } //4. now write these changes back to the experiment Experiment e = expBean.getExperiment(); log.debug("Exp ID: " + exp.getEntityID() + " exp: " + e); exp.getExperimentEvaluation().setEvaluatedExperimentBenchmarkGoals(expBMgoals); exp.getExperimentEvaluation().setEvaluatedFileBenchmarkGoals(mFileBMGs); testbedMan.updateExperiment(exp); FacesMessage fmsg = new FacesMessage(); fmsg.setDetail("Evaluation Data saved successfully!"); fmsg.setSummary("Evaluation Data saved successfully!"); fmsg.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("bmTable", fmsg); return "success"; } catch (Exception e) { log.error("Exception when trying to create/update Evaluations: " + e.toString()); return "failure"; } } public String finalizeBMEvaluationAction() { // Finalise the experiment: ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); Experiment exp = expBean.getExperiment(); // First, catch any updates. updateBMEvaluationAction(); exp.getExperimentEvaluation().setState(Experiment.STATE_COMPLETED); log.debug("attempting to save finalized evaluation. " + exp.getExperimentEvaluation().getState()); testbedMan.updateExperiment(exp); log.debug("saved finalized evaluation. " + exp.getExperimentEvaluation().getState()); // And report: FacesMessage fmsg = new FacesMessage(); fmsg.setDetail("Evaluation Data finalised!"); fmsg.setSummary("Evaluation Data finalised!"); fmsg.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("bmTable", fmsg); return "success"; } /** * This action completes stage2. i.e. create an experiment's executable, store the * added files within, hand over the selected ServiceTemplate, etc. * @return */ public String commandSaveStep2Substep2Action() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); // modify the experiment's stage information exp.getExperimentSetup().setState(Experiment.STATE_IN_PROGRESS); exp.setState(Experiment.STATE_IN_PROGRESS); // testbedMan.updateExperiment(exp); // Default state, staying on this stage unless success is maintained: exp.getExperimentSetup().setSubStage(ExperimentSetup.SUBSTAGE2); String result = "success"; // Verify that there is at least on DO: log.info("Checking for digital objects..."); if (exp.getExperimentExecutable().getInputData().size() == 0) { FacesMessage fmsg = new FacesMessage(); fmsg.setSummary("No input files specified!"); fmsg.setDetail("You must specify at least one Digital Object to experiment upon."); fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("addedFileInfoPanel", fmsg); log.info("Not enough digital objects."); result = "failure"; } // Verify that the experiment type is set: log.info("Checking that the experiment type is set."); if (exp.getExperimentSetup().getExperimentTypeID() == null || "".equals(exp.getExperimentSetup().getExperimentTypeID())) { FacesMessage fmsg = new FacesMessage(); fmsg.setSummary("No experiment type set!"); fmsg.setDetail("Please choose an experiment type."); fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("etype", fmsg); log.info("Not set the type."); result = "failure"; } // Verify that the experiment is configured correctly... // Get the workflow, to force the workflow to be configured based on the parameters. String exType = exp.getExperimentSetup().getExperimentTypeID(); try { log.info("Setting experiment type to:" + exType); exp.getExperimentExecutable().setWorkflowType(exType); //Additional data for all workflows using the wee - store step2 wf_configuration here ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(exType); exptype.saveExpTypeBean_Step2_WorkflowConfiguration_ToDBModel(); exptype.checkExpTypeBean_Step2_WorkflowConfigurationOK(); } catch (Exception e) { FacesMessage fmsg = new FacesMessage(); fmsg.setSummary("There was an error when configuring your experiment workflow: " + e.getMessage()); fmsg.setDetail("ERROR: " + e); fmsg.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("etype", fmsg); result = "failed"; log.info("Experiment configuration error: " + e); e.printStackTrace(); } // Warn if experiment will require approval. if (AdminManagerImpl.experimentRequiresApproval(exp)) { FacesMessage fmsg = new FacesMessage(); fmsg.setSummary("Experiments this big require approval by an administrator."); fmsg.setDetail(fmsg.getSummary()); fmsg.setSeverity(FacesMessage.SEVERITY_WARN); FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage("etype", fmsg); } if ("success".equals(result)) { exp.getExperimentSetup().setSubStage(ExperimentSetup.SUBSTAGE3); } return result; } /** * In the process of selecting the proper TBServiceTemplate to work with * Reacts to changes within the selectOneMenu * @param ce */ public void changedSelTBServiceTemplateEvent(ValueChangeEvent ce) { log.debug("changedSelTBServiceTemplateEvent: setting to " + ce.getNewValue()); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); //also sets the beans selectedServiceTemplate (from the registry) expBean.setSelServiceTemplateID(ce.getNewValue().toString()); reloadOperations(); } /** * In the process of selecting the proper TBServiceTemplate to work with * Reacts to changes within the selectOneMenu * @param ce */ public void changedSelServiceOperationEvent(ValueChangeEvent ce) { if (ce.getNewValue() == null) return; log.debug("changedSelServiceOperationEvent: setting to " + ce.getNewValue().toString()); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); expBean.setSelectedServiceOperationName(ce.getNewValue().toString()); } /** * When the selected ServiceTemplate has changed - reload it's available * ServiceOperations and select the first one in the list */ private void reloadOperations() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); List<ServiceOperation> lOperations = new Vector<ServiceOperation>(); TestbedServiceTemplate template = expBean.getSelectedServiceTemplate(); if (expBean.getEtype().equals("experimentType.simpleMigration")) { //mapping between operationTypeID and experiment type ID lOperations = template.getAllServiceOperationsByType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_MIGRATION); } //simple characterisation experiment if (expBean.getEtype().equals("experimentType.simpleCharacterisation")) { lOperations = template.getAllServiceOperationsByType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_CHARACTERISATION); } if ((lOperations != null) && (lOperations.size() > 0)) { //sets the first operationname selected so that it gets displayed expBean.setSelectedServiceOperationName(lOperations.iterator().next().getName()); } else { expBean.setSelectedServiceOperationName(""); } } /** * A file has been slected for being uploaded and the add icon was pressed to add a reference * for this within the experiment bean * @return */ public String commandAddInputDataItem() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); //0) upload the specified data to the Testbed's file repository log.info("commandAddInputDataItem: Uploading file."); FileUploadBean uploadBean = UploadManager.uploadFile(true); if (uploadBean == null) { log.warn("commandAddInputDataItem: Uploaded file was null."); NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } String fileRef = uploadBean.getUniqueFileName(); if (!(new File(fileRef).canRead())) { log.error("Added file reference not correct or reachable by the VM " + fileRef); } //1) Add the file reference to the expBean log.info("Adding file to Experiment Bean."); String position = expBean.addExperimentInputData(fileRef); log.info("Adding file to Experiment Bean at position " + position); //reload stage2 and displaying the added data items log.info("commandAddInputDataItem DONE"); // Do a redirect, ensuring the Exp ID is carried through: NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } /** * A file has been slected for being uploaded in evaluate experiment * and the add icon was pressed to add a reference for this within the experiment bean * @return */ public String commandAddExternalEvaluationDataItem() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); //0) upload the specified data to the Testbed's file repository log.info("commandAddExternalEvaluationDataItem: Uploading file."); FileUploadBean uploadBean = UploadManager.uploadFile(true); if (uploadBean == null) { log.warn("commandAddExternalEvaluationDataItem: Uploaded file was null."); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } String fileRef = uploadBean.getUniqueFileName(); if (!(new File(fileRef).canRead())) { log.error("Added file reference not correct or reachable by the VM " + fileRef); } //1) Add the file reference to the expBean log.info("Adding file for evalaute experiment to Experiment Bean."); expBean.addEvaluationExternalDigoRef(fileRef); //reload stage2 and displaying the added data items log.info("commandAddExternalEvaluationDataItem DONE"); // Do a redirect, ensuring the Exp ID is carried through: NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } /** * The Stage 1-3 Save-Changes action, that just tries to save the current state. * * Attempts to store the data for each page, and redirects the user to the first page with errors. * * @return "success" upon success. */ private String commandSaveExperiment(int stage) { log.info("Attempting to save this experiment."); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); log.info("commandSaveExperiment: ExpBean: " + expBean.getEname() + " : " + expBean.getEsummary()); // Always ensure the session Experiment is in the DB: ExperimentBean.saveExperimentFromSession(expBean); // This saves the first three pages in turn, and redirects appropriately if there are any problems. String result = null; if (stage == 1) { // Page 1 result = this.updateBasicPropsAction(); } else if (stage == 2) { // Page 2 result = this.commandSaveStep2Substep2Action(); } else if (stage == 3) { // Page 3 result = this.updateBenchmarksAction(); } else { result = "success"; } // Now save any updates, if stage 1 was okay: if (stage != 1 || (stage == 1 && "success".equals(result))) { // Now save any updates. Experiment exp = expBean.getExperiment(); log.info("Saving the bean: " + exp.getExperimentSetup().getExperimentTypeID()); // Commit the changes: testbedMan.updateExperiment(exp); } else { log.warn("Did not save update."); } FacesContext ctx = FacesContext.getCurrentInstance(); // Add a message: FacesMessage fmsg = null; if ("success".equals(result)) { // Tell them it went well: fmsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Your data has been saved successfully.", "Saved."); log.info("Message: Edit Succeeded."); // Add a Global message: ctx.addMessage(null, fmsg); } else { fmsg = new FacesMessage(FacesMessage.SEVERITY_WARN, "There were problems with your experiment.", "Save failed."); log.info("Message: Edit Failed."); // Add a Global message: ctx.addMessage(null, fmsg); return "failure"; } // Pop to the destination: return result; } /** * Attempts to make a copy of the current experiment and return user to stage 1 * of the "new" experiment */ public static String commandSaveExperimentAs(ExperimentBean oldExpBean) { log.info("Attempting to save this experiment as a new experiment."); // Create a deep copy via the XML serialisation system: Experiment exp = ExperimentViaJAXB.deepCopy((ExperimentImpl) oldExpBean.getExperiment()); if (exp == null) return "failure"; // Modify Start Date and name exp.setStartDate(Calendar.getInstance()); try { exp.getExperimentSetup().getBasicProperties().setExperimentName( exp.getExperimentSetup().getBasicProperties().getExperimentName() + " (copy)"); } catch (InvalidInputException e) { e.printStackTrace(); } // Clear out the results: ExperimentExecutableImpl.clearExecutionRecords((ExperimentExecutableImpl) exp.getExperimentExecutable()); ExperimentEvaluationImpl .clearExperimentEvaluationRecords((ExperimentEvaluationImpl) exp.getExperimentEvaluation()); // Pair back to the 'editor' stage. ExperimentImpl.resetToApprovedStage(exp); ExperimentImpl.resetToEditingStage(exp); // Make the current user the owner: UserBean user = (UserBean) JSFUtil.getManagedObject("UserBean"); if (user != null) { BasicProperties props = exp.getExperimentSetup().getBasicProperties(); props.setExperimenter(user.getUserid()); props.setContact(user.getFullname(), user.getEmail(), user.getTelephone(), user.getAddress()); } // Place new experiment bean into session: ExperimentBean newExpBean = ExperimentInspector.putExperimentIntoRequestExperimentBean(exp); newExpBean.setUserData(user); long eid = newExpBean.persistExperiment(); log.info("commandSaveExperimentAs: ExpBean: " + oldExpBean.getEname() + " saved as " + newExpBean.getEname()); // Hard redirect: NewExpWizardController.redirectToExpStage(eid, 1); // Return generic result, to avoid JSF navigation taking over. return "success"; } /** * @param selectedExperiment * @return */ public static String commandSaveExperimentAs(Experiment selectedExperiment) { log.info("exp name: " + selectedExperiment.getExperimentSetup().getBasicProperties().getExperimentName()); ExperimentBean expBean = new ExperimentBean(); expBean.fill(selectedExperiment); return commandSaveExperimentAs(expBean); } /** * @param entityID * @param i */ public static void redirectToExpStage(long eid, int i) { if (i < 1 || i > 6) i = 1; JSFUtil.redirect("/exp/exp_stage" + i + ".faces?eid=" + eid); } public static void redirectToEditWFParams(long eid, String serviceURL, String serviceID) { //JSFUtil.redirect("/exp/exp_stage2.faces?eid="+eid+"&serURL="+serviceURL); FacesContext ctx = FacesContext.getCurrentInstance(); HashMap<String, String> editParamSerURLMap = null; if (!ctx.getExternalContext().getSessionMap() .containsKey(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERURL_MAP)) { //takes expId to serviceURL mapping editParamSerURLMap = new HashMap<String, String>(); ctx.getExternalContext().getSessionMap() .put(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERURL_MAP, editParamSerURLMap); } editParamSerURLMap = (HashMap<String, String>) ctx.getExternalContext().getSessionMap() .get(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERURL_MAP); editParamSerURLMap.put(eid + "", serviceURL); HashMap<String, String> editParamSerIDMap = null; if (!ctx.getExternalContext().getSessionMap() .containsKey(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERID_MAP)) { //takes expId to serviceID mapping editParamSerIDMap = new HashMap<String, String>(); ctx.getExternalContext().getSessionMap() .put(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERID_MAP, editParamSerIDMap); } editParamSerIDMap = (HashMap<String, String>) ctx.getExternalContext().getSessionMap() .get(EditWorkflowParameterInspector.EDIT_WORKFLOW_PARAM_SERID_MAP); editParamSerIDMap.put(eid + "", serviceID); } /** * * @param exp */ public static void redirectToCurrentStage(Experiment exp) { int i = exp.getCurrentPhaseIndex(); if (i == 6) i = 5; log.info("Issued re-direct to stage " + i + " for eid " + exp.getEntityID()); NewExpWizardController.redirectToExpStage(exp.getEntityID(), i); } private String commandSaveExperimentAndGoto(int stage, int destination) { String result = commandSaveExperiment(stage); log.info("Save: " + result); if ("success".equals(result)) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), destination); return "success"; } else { return result; } } /* private String commandSaveExperimentAs() { return null; } */ public String commandSaveAs() { // This only save-as-es the ExperimentBean in the session! When invoked from menu, it's different! ExperimentBean oldExpBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); return NewExpWizardController.commandSaveExperimentAs(oldExpBean); } public String commandSaveStage1() { return this.commandSaveExperiment(1); } public String commandSaveStage1AndGotoStage2() { return this.commandSaveExperimentAndGoto(1, 2); } public String commandSaveStage2() { return this.commandSaveExperiment(2); } public String commandSaveStage2AndGotoStage3() { return this.commandSaveExperimentAndGoto(2, 3); } public String commandSaveStage3() { return this.commandSaveExperiment(3); } /** * This one saves and attempts to submit. * @return */ public String commandSaveStage2AndSubmit() { String result = this.commandSaveExperiment(2); if ("success".equals(result)) { return submitForApproval(); } else { return result; } } public void commandShowEditWFParamScreen(ActionEvent evt) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); String etype = expBean.getEtype(); ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(etype); FacesContext context = FacesContext.getCurrentInstance(); Object o1 = context.getExternalContext().getRequestParameterMap().get("selServiceURL"); if (o1 == null) { return; } //the id does not always have to be set - e.g. in the migration expType id and url are the same Object o2 = context.getExternalContext().getRequestParameterMap().get("selServiceID"); String serID = null; if (o2 != null) { serID = (String) o2; } NewExpWizardController.redirectToEditWFParams(expBean.getID(), (String) o1, serID); } /** * checks for the max supported and min required number of input files and triggers * the file upload button rendered or not. * @return */ public boolean isAddFileButtonRendered() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); if ((expBean.getSelectedServiceTemplate() != null) && (expBean.getSelectedServiceOperationName() != "")) { ServiceOperation operation = expBean.getSelectedServiceTemplate() .getServiceOperation(expBean.getSelectedServiceOperationName()); int maxsupp = operation.getMaxSupportedInputFiles(); int current = expBean.getNumberOfInputFiles(); if ((current < maxsupp)) { return true; } } return false; } /** * May only proceed to the next step if the min. number of required input files * was provided * @return */ public boolean isMinReqNrOfFilesSelected() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); if ((expBean.getSelectedServiceTemplate() != null) && (expBean.getSelectedServiceOperationName() != "")) { try { ServiceOperation operation = expBean.getSelectedServiceTemplate() .getServiceOperation(expBean.getSelectedServiceOperationName()); int minrequ = operation.getMinRequiredInputFiles(); int current = expBean.getNumberOfInputFiles(); if (current >= minrequ) { return true; } } catch (Exception e) { //exception when re-initing wizard: then expBean.selectedOpName could not be contained //in the template as the first one is selected when filling the screen return false; } } return false; } public boolean isExecutionSuccess() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); if (exp.getExperimentExecutable() != null) { return exp.getExperimentExecutable().isExecutionSuccess(); } return false; } /** * Removes one selected file reference from the list of added file refs for Step3. * The specified file ref(s) are used as input data to invoke a given service operation. * @return */ public String commandRemoveAddedFileRef(ActionEvent event) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); try { //FacesContext facesContext = FacesContext.getCurrentInstance(); //1)get the passed Attribute "IDint", which is the counting number of the component String IDnr = event.getComponent().getAttributes().get("IDint").toString(); //2) Remove the data from the bean's variable expBean.removeExperimentInputData(IDnr + ""); //3) Remove the GUI elements from the panel UIComponent comp_link_remove = this.getComponent(expBean.getPanelAddedFiles(), "removeLink" + IDnr); UIComponent comp_link_src = this.getComponent(expBean.getPanelAddedFiles(), "fileRef" + IDnr); //UIComponent comp_link_src = this.getComponent("panelAddedFiles:fileRef"+IDnr); expBean.getPanelAddedFiles().getChildren().remove(comp_link_remove); //this.getComponentPanelStep3Add().getChildren().remove(comp_text); expBean.getPanelAddedFiles().getChildren().remove(comp_link_src); } catch (Exception e) { // TODO: handle exception } NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } /** * Undo the process of selecting service and operation to pick another one. * Note: this leads to losing already uploaded input data - warn the user * @return */ public String changeAlreadySelectedSerOps() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); Experiment exp = expBean.getExperiment(); //clear the already added data in the backing bean expBean.removeAllExperimentInputData(); expBean.setOpartionSelectionCompleted(false); //clear the already added data from the exp. executable if (exp.getExperimentExecutable() != null) { // exp.getExperimentExecutable().removeAllInputData(); //this has a constructor which requires the ServiceTemplate to be set. // exp.removeExperimentExecutable(); testbedMan.updateExperiment(exp); } NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } /** * Set the selected service and operation to final and continue to select input data * @return */ public String completeSerOpsSelection() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); expBean.setOpartionSelectionCompleted(true); NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } /** * Reacting to the "use" button, to make ServiceTemplate Selection final */ /*public void commandUseSelTBServiceTemplate(){ ExperimentBean expBean = (ExperimentBean)JSFUtil.getManagedObject("ExperimentBean"); //TODO: continue with implementation }*/ public void changedExpTypeEvent(ValueChangeEvent ce) { String id = ce.getNewValue().toString(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); expBean.setEtype(id); //updateExpTypeAction(); changedExpType(); } // when type is changed, remove workflow etc. from session public void changedExpType() { //reset workflow-display FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("Workflow"); } public Map<String, String> getAvailableExperimentTypes() { // for display with selectonemenu-component, we have to flip key and value of map Map<String, String> oriMap = AdminManagerImpl.getInstance().getExperimentTypeIDsandNames(); Map<String, String> expTypeMap = new HashMap<String, String>(); Iterator<String> iter = oriMap.keySet().iterator(); while (iter.hasNext()) { String key = iter.next(); expTypeMap.put((String) oriMap.get(key), key); } return expTypeMap; } public String getExperimentTypeName(String ID) { String name = AdminManagerImpl.getInstance().getExperimentTypeName(ID); return name; } /** * Queries the ServiceTemplateRegistry and returns a Map of all available Templates * with service name and it's UUID as key, which is then displayed in the GUI * Restriction: The list is restricted by the already chosen experiment type: * e.g. only fetch Migration/Characterisation templates * @return */ public Map<String, String> getAllAvailableTBServiceTemplates() { Map<String, String> ret = new TreeMap<String, String>(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); ServiceTemplateRegistry registry = ServiceTemplateRegistryImpl.getInstance(); Collection<TestbedServiceTemplate> templates = new Vector<TestbedServiceTemplate>(); //determine which typeID has been selected //simple migration experiment if (expBean.getEtype().equals("experimentType.simpleMigration")) { //mapping between service type ID and experiment type ID templates = registry.getAllServicesWithType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_MIGRATION); } //simple characterisation experiment if (expBean.getEtype().equals("experimentType.simpleCharacterisation")) { templates = registry.getAllServicesWithType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_CHARACTERISATION); } //test if at least one template exists if ((templates != null) && (templates.size() > 0)) { //add data for rendering Iterator<TestbedServiceTemplate> itTemplates = templates.iterator(); while (itTemplates.hasNext()) { TestbedServiceTemplate template = itTemplates.next(); //use the deployment date to extend the service name for selection String format = "yyyy-MM-dd HH:mm:ss"; String date = doFormat(format, template.getDeploymentDate()); ret.put(template.getName() + " - " + date + " - " + template.getDescription(), String.valueOf(template.getUUID())); } //only triggered for the first time if (expBean.getSelectedServiceTemplate() == null) { expBean.setSelServiceTemplateID(ret.values().iterator().next()); reloadOperations(); } } return ret; } /** * Formats a gregorian calendar according to a specified format input schema * @param format * @param gc * @return */ private String doFormat(String format, Calendar gc) { SimpleDateFormat sdf = new SimpleDateFormat(format); FieldPosition fpos = new FieldPosition(0); StringBuffer b = new StringBuffer(); StringBuffer sb = sdf.format(gc.getTime(), b, fpos); return sb.toString(); } /** * Returns a Map of all available serviceOperations for an already selected * ServiceTemplate * Restriction: The list is restricted by the already chosen experiment type: * e.g. only fetch Migration/Characterisation templates * @return */ public Map<String, String> getAllAvailableServiceOperations() { TreeMap<String, String> ret = new TreeMap<String, String>(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedServiceTemplate template = expBean.getSelectedServiceTemplate(); //log.debug("Looking up service operations for template: "+template); if (template != null) { log.debug("Looking for services of type: " + expBean.getEtype()); List<ServiceOperation> lOperations = null; //simple migration experiment if (expBean.getEtype().equals("experimentType.simpleMigration")) { //mapping between operationTypeID and experiment type ID lOperations = template.getAllServiceOperationsByType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_MIGRATION); } //simple characterisation experiment if (expBean.getEtype().equals("experimentType.simpleCharacterisation")) { lOperations = template.getAllServiceOperationsByType( TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_CHARACTERISATION); } if (lOperations != null) { //add data for rendering Iterator<ServiceOperation> itOperations = lOperations.iterator(); while (itOperations.hasNext()) { ServiceOperation operation = itOperations.next(); //Treevalue, key ret.put(operation.getName(), operation.getName()); } } } return ret; } /** * Gets a list of all default Service Annotation Tags using the default tag reader class * Service Annotation Tags are used to restrict the list of rendered services * @return */ public Collection<ServiceTag> getAllDefaultServiceAnnotationTags() { DefaultServiceTagHandler dth = DefaultServiceTagHandlerImpl.getInstance(); return dth.getAllTags(); } public Map<String, String> getAvailableEvaluationValues() { TreeMap<String, String> map = new TreeMap<String, String>(); ExperimentEvaluation ev = new ExperimentEvaluationImpl(); Iterator<String> iter = ev.getAllAcceptedEvaluationValues().iterator(); while (iter.hasNext()) { String v = iter.next(); map.put(v, v); } return map; } /** * Retrieves the available BenchmarkGoals and adds the data into a BenchmarkBean * BMBean contains information e.g. on if it's selected, if an auto evaluation service is available etc. * for backing the GUI elements. Finally a list of List<BenchmarkBean> is put into the session map as "BenchmarkBeans". * @return */ public String getRetrieveBenchmarkBeans() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); //the available BenchmarkGoals as BenchmarkBean (only from the selected category) Map<String, BenchmarkBean> availBenchmarks = new HashMap<String, BenchmarkBean>( expBean.getExperimentBenchmarks()); //get all BenchmarkGoals Iterator<BenchmarkGoal> iter = BenchmarkGoalsHandlerImpl.getInstance().getAllBenchmarkGoals().iterator(); //the information if a BMGoal can be used within an autoEvaluationService //Map<BMGoalID, EvaluationTestbedServiceTemplate> Map<String, TestbedServiceTemplate> mapAutoEvalSer = this.getSupportedAutoEvaluationBMGoals(); while (iter.hasNext()) { BenchmarkGoal bmg = iter.next(); Iterator<String> dtypeiter = expBean.getDtype().iterator(); while (dtypeiter.hasNext()) { String currentType = dtypeiter.next(); DigitalObjectTypesImpl dtypeImpl = new DigitalObjectTypesImpl(); currentType = dtypeImpl.getDtypeName(currentType); //only add the goals that match the already selected categories if (currentType.equalsIgnoreCase(bmg.getCategory())) { BenchmarkBean bmb = null; if (availBenchmarks.containsKey(bmg.getID())) { bmb = availBenchmarks.get(bmg.getID()); bmb.setSelected(true); } else { bmb = new BenchmarkBean(bmg); bmb.setSelected(false); availBenchmarks.put(bmg.getID(), bmb); } //add the autoEvaluationService Information for this goal if (mapAutoEvalSer.containsKey(bmg.getID())) { //note: currently every BMGoal only contains max. one autoEval services behind /* FIXME ANJ Clean this up: bmb.setAutoEvalService(mapAutoEvalSer.get(bmg.getID())); */ } } } } // create and put BenchmarkBeans into session List<BenchmarkBean> bmbeans = new ArrayList<BenchmarkBean>(availBenchmarks.values()); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("BenchmarkBeans", bmbeans); return ""; } private void autoApproveExperiment() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); // Approve the experiment, automatically: AdminManagerImpl.approveExperimentAutomatically(exp); // Update the Experiment Bean: testbedMan.updateExperiment(exp); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTEXECUTION); expBean.setApproved(true); } /** * * @return */ public void executeExperiment() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); // NOT if already running. if (exp.getExperimentExecutable().isExecutionRunning()) return; try { //call invocation on the experiment's executable testbedMan.executeExperiment(exp); } catch (Exception e) { log.error("Error when executing Experiment: " + e.toString()); if (log.isDebugEnabled()) e.printStackTrace(); } log.info("Status: Invoked = " + exp.getExperimentExecutable().isExecutableInvoked()); log.info("Status: Invoked = " + exp.getExperimentExecution().isExecutionInvoked()); exp.getExperimentExecutable().setExecutableInvoked(true); exp.getExperimentExecutable().setExecutionCompleted(false); // Store any changes: testbedMan.updateExperiment(exp); log.info("Status: Invoked = " + exp.getExperimentExecutable().isExecutableInvoked()); log.info("Status: Invoked = " + exp.getExperimentExecution().isExecutionInvoked()); log.info("Status: Queue = " + exp.getExperimentExecutable().getBatchExecutionIdentifier() + " " + exp.getExperimentExecutable().getBatchSystemIdentifier()); } public void executeExperimentStart() { this.executeExperiment(); } public boolean getExecuteExperimentIsRunning() { // Return: ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); boolean running = exp.getExperimentExecutable().isExecutionRunning(); return running; } public String getPositionInQueueStatusMessage() { String ret = ""; ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); refreshExperimentBean(); Experiment exp = expBean.getExperiment(); //get the batch processor that's responsible for this job BatchProcessor pb = TestbedBatchProcessorManager.getInstance() .getBatchProcessor(exp.getExperimentExecutable().getBatchSystemIdentifier()); String job_key = exp.getExperimentExecutable().getBatchExecutionIdentifier(); log.info("Looking for experiment position under job key: " + job_key + " : " + pb.getPositionInQueue(job_key)); ret += pb.getPositionInQueue(job_key); return ret; } public int getExecuteExperimentProgress() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); refreshExperimentBean(); Experiment exp = expBean.getExperiment(); if (exp.getExperimentExecutable() != null) { log.info("Looking for experiment status... " + exp.getExperimentExecutable().getBatchExecutionIdentifier()); } log.info("Invoked: " + exp.getExperimentExecutable().isExecutableInvoked()); log.info("Complete: " + exp.getExperimentExecutable().isExecutionCompleted()); // If this exp has never been run, return -1: if (exp.getExperimentExecutable().isExecutableInvoked() == false) return -1; // If this exp has been run, and is currently 'completed', return 101: if (exp.getExperimentExecutable().isExecutionCompleted()) return 101; log.info("Still looking for..." + exp.getExperimentExecutable().getBatchExecutionIdentifier()); //get the batch processor that's responsible for this job BatchProcessor pb = TestbedBatchProcessorManager.getInstance() .getBatchProcessor(exp.getExperimentExecutable().getBatchSystemIdentifier()); String job_key = exp.getExperimentExecutable().getBatchExecutionIdentifier(); log.info("Looking for experiment progress under job key: " + job_key + " : " + pb.getJobStatus(job_key)); if (pb.getJobStatus(job_key).equals(TestbedBatchJob.NO_SUCH_JOB)) { log.info("Got No Such Job for key: " + job_key); exp.getExperimentExecutable().setExecutionSuccess(false); exp.getExperimentExecutable().setExecutionCompleted(true); exp.getExperimentExecution().setState(Experiment.STATE_COMPLETED); exp.getExperimentEvaluation().setState(Experiment.STATE_IN_PROGRESS); testbedMan.updateExperiment(exp); return -1; } else if (pb.getJobStatus(job_key).equals(TestbedBatchJob.NOT_STARTED)) { log.info("Got NOT STARTED for key: " + job_key); return 0; } else if (pb.getJobStatus(job_key).equals(TestbedBatchJob.RUNNING)) { int percent = pb.getJobPercentComplete(job_key); // Return percentage: log.info("Got percent complete:" + percent + " for key: " + job_key); return percent; } else { log.info("Got job complete."); exp.getExperimentExecution().setState(Experiment.STATE_COMPLETED); exp.getExperimentEvaluation().setState(Experiment.STATE_IN_PROGRESS); testbedMan.updateExperiment(exp); // Appears to need to return a number greater that 100 in order to force the progress bar to refresh properly. return 101; } } public String getPositionInBatchProcessorQueue() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); refreshExperimentBean(); Experiment exp = expBean.getExperiment(); if (exp.getExperimentExecutable() != null) { log.info("Looking for position on the batch processor for... " + exp.getExperimentExecutable().getBatchExecutionIdentifier()); } else { return "not supported"; } //get the batch processor that's responsible for this job BatchProcessor pb = TestbedBatchProcessorManager.getInstance() .getBatchProcessor(exp.getExperimentExecutable().getBatchSystemIdentifier()); String job_key = exp.getExperimentExecutable().getBatchExecutionIdentifier(); log.info("Looking for current position on batch processor for job key: " + job_key + " : " + pb.getJobStatus(job_key)); if (pb.getJobStatus(job_key).equals(TestbedBatchJob.NO_SUCH_JOB)) { log.info("Got No Such Job."); return "not supported"; } else { String positionMessage = pb.getPositionInQueue(job_key); log.debug("Returning current position on batch processor for job key: " + job_key + " position: " + positionMessage); return positionMessage; } } public boolean isCurrentBatchJobQueued() { TestbedManager testbedMan = TestbedManagerImpl.getInstance(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); refreshExperimentBean(); Experiment exp = expBean.getExperiment(); if (exp.getExperimentExecutable() == null) { return false; } else { //get the batch processor that's responsible for this job BatchProcessor pb = TestbedBatchProcessorManager.getInstance() .getBatchProcessor(exp.getExperimentExecutable().getBatchSystemIdentifier()); String job_key = exp.getExperimentExecutable().getBatchExecutionIdentifier(); if (pb.getJobStatus(job_key).equals(TestbedBatchJob.NO_SUCH_JOB)) { log.info("Got No Such Job."); return false; } else { return pb.isQueued(job_key); } } } /** * Used to ensure that the ExperimentBean reflects changes made in the background. */ private void refreshExperimentBean() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); ExperimentPersistencyRemote epr = testbedMan.getExperimentPersistencyRemote(); Experiment exp = epr.findExperiment(expBean.getExperiment().getEntityID()); expBean.setExperiment(exp); // Only updates the exp itself, as only the BG data might have changed. //ExperimentInspector.putExperimentIntoSessionExperimentBean( exp ); } /* * This is a debug option, allowing experiments to be reset and re-run if they fail. */ public String commandResetAfterFailure() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); // Save these changes: Experiment exp = expBean.getExperiment(); ExperimentImpl.resetToApprovedStage(exp); testbedMan.updateExperiment(exp); return "success"; } public String commandPullInWFResultsAfterFailure() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); //get the batch processor that's responsible for this job BatchProcessor pb = TestbedBatchProcessorManager.getInstance() .getBatchProcessor(exp.getExperimentExecutable().getBatchSystemIdentifier()); String job_key = exp.getExperimentExecutable().getBatchExecutionIdentifier(); //clean out the old BatchExecutionRecords (as Measurements, etc.) Iterator<BatchExecutionRecordImpl> iter = exp.getExperimentExecutable().getBatchExecutionRecords() .iterator(); while (iter.hasNext()) { iter.next(); iter.remove(); } //FIXME: this isn't properly updated in the db and the old records don't get deleted //now call the notifyComplete to pull in the results pb.notifyComplete(job_key, pb.getJob(job_key)); return "success"; } /** * controller logic for handling the automated evaluation of an experiment * currently the workflow is hardcoded (Droid->XCDL) * @return */ public String executeAutoEvalWf() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); expBean.setExecuteAutoEvalWfRunning(true); //call invocation on the evaluation workflow testbedMan.executeAutoEvaluationWf(exp); //update the data testbedMan.updateExperiment(exp); expBean.setExecuteAutoEvalWfRunning(false); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } /** * Indicates if/not an autoEvaluation workflow is within execution * @return */ public boolean isExecuteAutoEvalWfRunning() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); return expBean.isExecuteAutoEvalWfRunning(); } public String getAutoEvalWFRunningSeconds() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); return expBean.getAutoEvalWFRunningSeconds(); } private String test = "A"; public String getTestHelper() { return test += "1"; } @Deprecated public String proceedToEvaluation() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); if (exp.getExperimentExecution().isExecutionCompleted()) { exp.getExperimentExecution().setState(Experiment.STATE_COMPLETED); exp.getExperimentEvaluation().setState(Experiment.STATE_IN_PROGRESS); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTEVALUATION); initEvaluationBenchmarks(exp); testbedMan.updateExperiment(exp); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } else return null; } public String proceedToStep6Evaluation() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); exp.getExperimentExecution().setState(Experiment.STATE_COMPLETED); exp.getExperimentEvaluation().setState(Experiment.STATE_IN_PROGRESS); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTEVALUATION); testbedMan.updateExperiment(exp); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } public String goToStage1() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 1); return "success"; } public String goToStage2() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } public String goToStage3() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 3); return "success"; } public String goToStage4() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 4); return "success"; } public String goToStage5() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 5); return "success"; } public String goToStage6() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } public String browseForData(ActionEvent evt) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); browseDataRememberStageId(evt); JSFUtil.redirect("/exp/browse_data.faces?eid=" + expBean.getID()); return "success"; } /** * When calling browseData - remember in which experiment stage we've called it */ private void browseDataRememberStageId(ActionEvent evt) { FacesContext context = FacesContext.getCurrentInstance(); for (UIComponent child : evt.getComponent().getChildren()) { if (child instanceof UIParameter) { UIParameter param = (UIParameter) child; if (param.getName().equals("stageName")) { if (param.getValue().equals("design experiment")) { context.getExternalContext().getSessionMap().put("browseData_comingFromStageID", 2); return; } if (param.getValue().equals("evaluate experiment")) { context.getExternalContext().getSessionMap().put("browseData_comingFromStageID", 6); return; } } } } //context.getExternalContext().getSessionMap().put("browseData_comingFromStageID",-1); } /** * Coming from the data browser - decide where to go within the experiment * @return */ public String goToExperimentFromDataBrowser() { if (getBrowseDataRememberedStageId() != -1) { if (getBrowseDataRememberedStageId() == 2) { return goToStage2(); } if (getBrowseDataRememberedStageId() == 6) { return goToStage6(); } } //the default value is design experiment return goToStage2(); } /** * remembered in which experiment stage we've called browse data. if not remembered properly -1 is returned * @return */ public static int getBrowseDataRememberedStageId() { FacesContext context = FacesContext.getCurrentInstance(); Object o = context.getExternalContext().getSessionMap().get("browseData_comingFromStageID"); int ret = -1; if (o != null) { ret = (Integer) o; } return ret; } public String editComment() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); JSFUtil.redirect("/edit_comment.faces?eid=" + expBean.getID()); return "success"; } /** * Takes the Benchmarks set within the Setup phase and adds them as * File Benchmarks for every input file and as experiment overall evaluation benchmarks */ public void initEvaluationBenchmarks(Experiment exp) { log.debug("In NewExpWizardControler.initEvaluationBenchmarks..."); try { List<BenchmarkGoal> lFileEvalBMgoals = new ArrayList<BenchmarkGoal>(); List<BenchmarkGoal> lExpOverallEvalBMgoals = new ArrayList<BenchmarkGoal>(); for (BenchmarkGoal bmg : exp.getExperimentSetup().getAllAddedBenchmarkGoals()) { BenchmarkGoal bmgEval = ((BenchmarkGoalImpl) bmg).clone(); lFileEvalBMgoals.add(bmgEval); BenchmarkGoal bmgEval2 = ((BenchmarkGoalImpl) bmg).clone(); lExpOverallEvalBMgoals.add(bmgEval2); } //fill the benchmark goals for every input file - used for evaluation Map<URI, Collection<BenchmarkGoal>> fileEvalBMGs = new HashMap<URI, Collection<BenchmarkGoal>>(); for (URI inputFileURI : exp.getExperimentExecutable().getAllInputHttpDataEntries()) { //iterate over every input file and add it's BM goals fileEvalBMGs.put(inputFileURI, lFileEvalBMgoals); } //fill the file bm goals exp.getExperimentEvaluation().setInputFileBenchmarkGoals(fileEvalBMGs); //fill the benchmark goals for experiment overall evaluation exp.getExperimentEvaluation().setInputExperimentBenchmarkGoals(lExpOverallEvalBMgoals); log.debug("Having set: # of " + exp.getExperimentEvaluation().getEvaluatedExperimentBenchmarkGoals().size() + " experiment evaluation BMGoals"); log.debug("Having set: # of " + exp.getExperimentEvaluation().getEvaluatedFileBenchmarkGoals() + " file evaluation BMGoals"); } catch (Exception e) { log.error("Exception when trying to init the experiment evaluation benchmark goals: " + e.toString()); } } /** * Please take care as this object is null within the first and second stage * @return */ public ExperimentExecutable getExperimentExecutable() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); return exp.getExperimentExecutable(); } public String saveEvaluation() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); //exp.getExperimentExecution().setState(Experiment.STATE_COMPLETED); //exp.getExperimentEvaluation().setState(Experiment.STATE_IN_PROGRESS); //exp.getExperimentEvaluation().setState(Experiment.STATE_COMPLETED); testbedMan.updateExperiment(exp); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } public String loadReaderStage2() { return "goToReaderStage2"; } public String loadReaderStage3() { return "goToReaderStage3"; } public String loadReaderStage4() { return "goToReaderStage4"; } public String loadReaderStage5() { return "goToReaderStage5"; } public String loadReaderStage6() { return "goToReaderStage6"; } public String finishReader() { return "goToBrowseExperiments"; } /** * The filter on stage3 for selecting which BMGoal category to display * Please note the selection is already pre-filtered by the * experiment digital object type from page 1. * @param vce */ public void processBMGoalCategoryFilterChange(ValueChangeEvent vce) { String sCatName = (String) vce.getNewValue(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); expBean.setBMGoalCategoryFilterValue(sCatName); } //TODO: Andrew DELETE OR CHECK IF USED public void processSelBMValueTicked(ValueChangeEvent e) { //System.out.println("Andrew to DELETE" +e.getNewValue()); //FacesContext context = FacesContext.getCurrentInstance(); //Object o1 = context.getExternalContext().getRequestParameterMap().get("bmGoalID2"); //Object o2 = context.getExternalContext().getRequestParameterMap().get("bmGoalID"); } public String command_configureAutoEvalService() { FacesContext context = FacesContext.getCurrentInstance(); Object o1 = context.getExternalContext().getRequestParameterMap().get("configBMGoalID"); Object o2 = context.getExternalContext().getRequestParameterMap().get("autoEvalSerUUID"); String BMGoalID = ""; String autoEvalSerUUID = ""; if ((o1 != null) && (o2 != null)) { BMGoalID = o1.toString(); autoEvalSerUUID = o2.toString(); } //save the current BMGoal selection String success = this.updateBenchmarksAction(); if ((success.equals("success")) && (!BMGoalID.equals("")) && (!autoEvalSerUUID.equals(""))) { //create the config gui backing bean AutoBMGoalEvalUserConfigBean evalConfBean = new AutoBMGoalEvalUserConfigBean(); //BenchmarkBean contains the BMGoal+EvaluationSerTemplate to configure evalConfBean.initBean(BMGoalID, autoEvalSerUUID); Manager manager_backing = (Manager) JSFUtil.getManagedObject("Manager_Backing"); //takes the bean and puts it into the session map manager_backing.reinitAutoBMGoalEvalUserConfigBean(evalConfBean); //load screen for configuring the autoEvalSerivce return "configAutoEvalSer"; } else { //an error has occured - display the page with error message return success; } } /** * Returns a map of ALL BenchmarkGoals that are registered within a * EvaluationServiceTemplate and therefore can be evaluated automatically * by using the corresponding EvaluationServiceTemplate * @return Map<BenchmarkGoalID, EvaluationTestbedServiceTemplateImpl> */ public Map<String, TestbedServiceTemplate> getSupportedAutoEvaluationBMGoals() { Map<String, TestbedServiceTemplate> ret = new HashMap<String, TestbedServiceTemplate>(); ServiceTemplateRegistry registry = ServiceTemplateRegistryImpl.getInstance(); Collection<TestbedServiceTemplate> evalSerTemplates = registry .getAllServicesWithType(TestbedServiceTemplate.ServiceOperation.SERVICE_OPERATION_TYPE_EVALUATION); if ((evalSerTemplates != null) && (evalSerTemplates.size() > 0)) { Iterator<TestbedServiceTemplate> itTemplates = evalSerTemplates.iterator(); //The template which registeres the BMGoal mapping EvaluationTestbedServiceTemplateImpl evalSerTemplate = (EvaluationTestbedServiceTemplateImpl) itTemplates .next(); //all supported BM goalsIDs of this ServiceTemplate Collection<String> lBMGoalIDs = evalSerTemplate.getAllMappedBenchmarkGoalIDs(); if ((lBMGoalIDs != null) && (lBMGoalIDs.size() > 0)) { Iterator<String> itBMGoalIDs = lBMGoalIDs.iterator(); while (itBMGoalIDs.hasNext()) { String bmGoalID = itBMGoalIDs.next(); //add the bmGoal and it's template ret.put(bmGoalID, evalSerTemplate); } } } return ret; } public String commandUploadWfXMLConfigFile() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); ExpTypeExecutablePP eTypeExecPP = (ExpTypeExecutablePP) ExpTypeBackingBean .getExpTypeBean(AdminManagerImpl.EXECUTABLEPP); eTypeExecPP.reInitBeanForWFXMLConfigUploaded(); //0) upload the specified WFconfig to the user's personal repository for storing it log.info("commandUploadWfXMLConfigFile: uploading an xml configuration for a WEE WF."); FileUploadBean uploadBean = UploadManager.uploadFile(true); if (uploadBean == null) { log.warn("commandUploadWfXMLConfigFile: Uploaded file was null."); NewExpWizardController.redirectToExpStage(expBean.getID(), 2); return "success"; } String fileRef = uploadBean.getUniqueFileName(); log.debug("Uploaded file: uniqueFileName: " + fileRef); eTypeExecPP.setXMLConfigFileProvided(true); //1) Check the configuration and parse the WorkflowConfig object try { eTypeExecPP.checkAndParseWorkflowConfigObject(fileRef); } catch (Exception e) { saveExpTypeBeanAndRedirectToExpStage(expBean.getID(), 2, eTypeExecPP); return "success"; } //2) check if the workflow is available on the WEE Template registry String wfClass = eTypeExecPP.getWeeXMLConfig().getTemplate().getClazz(); WftRegistryService wftRegistryService = WeeRemoteUtil.getInstance().getWeeRegistryService(); if (wftRegistryService.getAllSupportedQNames().contains(wfClass)) { eTypeExecPP.setTemplateAvailableInWftRegistry(true); } else { eTypeExecPP.setTemplateAvailableInWftRegistry(false); saveExpTypeBeanAndRedirectToExpStage(expBean.getID(), 2, eTypeExecPP); return "success"; } //3) populate the bean with servic specific information eTypeExecPP.populateServiceInformationFromWorkflowConfig(); //reload stage2 and display the further navigation options log.info("commandUploadWfXMLConfigFile DONE"); saveExpTypeBeanAndRedirectToExpStage(expBean.getID(), 2, eTypeExecPP); return "success"; } /** * Store the expType specific bean before calling redirect! Otherwise all non-persisted * information is lost! * @param expID * @param stage * @param eTypeExecPP */ private void saveExpTypeBeanAndRedirectToExpStage(long expID, int stage, ExpTypeExecutablePP eTypeExecPP) { HashMap<String, ExpTypeExecutablePP> expTypeSessMap = getExpTypeExecutableSessionMap(); if (expTypeSessMap.get(expID + "") == null) { expTypeSessMap.put(expID + "", SerialCloneUtil.clone(eTypeExecPP)); } else { expTypeSessMap.put(expID + "", eTypeExecPP); } //finally redirect: NewExpWizardController.redirectToExpStage(expID, 2); } /** * We're using a HashMap for dragging through the information on 'design experiment' * stage for the executablePP experiment type - due to the request scope we've now chosen. * @return */ private HashMap<String, ExpTypeExecutablePP> getExpTypeExecutableSessionMap() { FacesContext ctx = FacesContext.getCurrentInstance(); //TODO: als static String exponieren Object o = ctx.getExternalContext().getSessionMap().get(ExpTypeExecutablePP.EXP_TYPE_SESSION_MAP); if (o != null) { //get the map we're using to drag over temp. unsaved changes between the redirects return (HashMap<String, ExpTypeExecutablePP>) o; } else { //in this case no map available in the session HashMap<String, ExpTypeExecutablePP> expTypeSessMap = new HashMap<String, ExpTypeExecutablePP>(); ctx.getExternalContext().getSessionMap().put(ExpTypeExecutablePP.EXP_TYPE_SESSION_MAP, expTypeSessMap); return expTypeSessMap; } } /* * END methods for new_experiment wizard page * ------------------------------------------- */ /** * Imports and experiment from an uploaded file */ public String importUploadedExperiment() { FileUploadBean uploadBean = UploadManager.uploadFile(false); log.info("Looking for upload."); if (uploadBean == null) return "failure"; File uploaded = uploadBean.getTemporaryFile(); log.info("Found upload: " + uploaded); UploadManager upm = (UploadManager) JSFUtil.getManagedObject("UploadManager"); return upm.importExperiment(uploaded); } /** * Get the component from the JSF view model - it's id is registered withinin the page * @param panel if null then from the root * @param sID * @return */ private UIComponent getComponent(UIComponent panel, String sID) { FacesContext facesContext = FacesContext.getCurrentInstance(); if (panel == null) { //the ViewRoot contains all children starting from sub-level 0 panel = facesContext.getViewRoot(); } Iterator<UIComponent> it = panel.getChildren().iterator(); UIComponent returnComp = null; while (it.hasNext()) { UIComponent guiComponent = it.next().findComponent(sID); if (guiComponent != null) { returnComp = guiComponent; } } //changes on the object are directly reflected within the GUI return returnComp; } /* ------------------------------------------------------------------------------- */ public List<ExperimentStageBean> getStages() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(expBean.getEtype()); return exptype.getStageBeans(); } /* The observables list */ HtmlDataTable obsTable = new HtmlDataTable(); HtmlDataTable obsManualTable = new HtmlDataTable(); String obsEType = null; List<MeasurementBean> obs = null; List<MeasurementBean> obsManual = null; /** * @return the obsTable for automatically measured properties */ public HtmlDataTable getObsTable() { return obsTable; } /** * @param obsTable the obsTable to set for automatically measured properties */ public void setObsTable(HtmlDataTable obsTable) { this.obsTable = obsTable; } /** * @return the obsTable for manually measured properties */ public HtmlDataTable getManualObsTable() { return this.obsManualTable; } /** * @param obsTable the obsTable to set for manually measured properties */ public void setManualObsTable(HtmlDataTable manualobsTable) { this.obsManualTable = manualobsTable; } /** * @return The list of automatically measurable properties, depending on the experiment type. */ public List<MeasurementBean> getObservables() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); // Use the stage to narrow the list: String selectedStage = expBean.getSelectedStage().getName(); this.chooseObservablesForEtype(expBean.getEtype(), expBean.getExperiment(), selectedStage); return obs; } /** * @return The list of manually measurable properties, depending on the experiment type. */ public List<MeasurementBean> getManualObservables() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); // Use the stage to narrow the list: if (expBean.getSelectedStage() != null) { String selectedStage = expBean.getSelectedStage().getName(); this.chooseManualObservablesForEtype(expBean.getEtype(), expBean.getExperiment(), selectedStage); } return obsManual; } /** * FIXME check if required * Returns the list of all manually measurable properties grouped by the stageName * HashMap<StageName,List<MeasurementsBeans>> * @return */ public HashMap<ExperimentStageBean, List<MeasurementBean>> getManualObservablesPerStage() { HashMap<ExperimentStageBean, List<MeasurementBean>> ret = new HashMap<ExperimentStageBean, List<MeasurementBean>>(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); for (ExperimentStageBean stage : expBean.getStages()) { ret.put(stage, getObservablesForEtype(expBean.getEtype(), expBean.getExperiment(), stage.getName(), true)); } return ret; } private void chooseManualObservablesForEtype(String etype, Experiment exp, String stage) { this.obsManual = this.getObservablesForEtype(etype, exp, stage, true); } private void chooseObservablesForEtype(String etype, Experiment exp, String stage) { this.obs = this.getObservablesForEtype(etype, exp, stage, false); } /** * Returns a list of MeasurementBeans for a given experimentType and experiment instance and experiment stage * @param etype * @param exp * @param stage * @param manualObs flag if manual or automatically measurable properties are retrieved * @return */ private List<MeasurementBean> getObservablesForEtype(String etype, Experiment exp, String stage, boolean manualObs) { List<MeasurementBean> ret = new ArrayList<MeasurementBean>(); ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(etype); if (exptype != null) { if (manualObs) { ret = this.createMeasurementBeans(exptype.getManualObservables(), stage); } else { ret = this.createMeasurementBeans(exptype.getObservables(), stage); } } else { // For unrecognised experiment types return empty list: return ret; } // Determine 'selected' state for this observable: Vector<String> props = null; if (manualObs) { props = exp.getExperimentExecutable().getManualProperties(stage); } else { props = exp.getExperimentExecutable().getProperties(); } for (MeasurementBean m : ret) { if (props != null && m.getIdentifier() != null && props.contains(m.getIdentifier().toString())) { m.setSelected(true); } else { // FIXME This should remember properly, and set to false if necessary. //m.setSelected(false); m.setSelected(true); } } return ret; } /** * @param measurements * @return */ private List<MeasurementBean> createMeasurementBeans(HashMap<String, List<MeasurementImpl>> measurements, String selectedStage) { List<MeasurementBean> mbeans = new ArrayList<MeasurementBean>(); for (String stage : measurements.keySet()) { if (selectedStage == null || selectedStage.equals(stage)) { for (MeasurementImpl measurement : measurements.get(stage)) { MeasurementBean measurebean = new MeasurementBean(null, measurement); measurebean.setSelected(true); measurebean.setStage(stage); mbeans.add(measurebean); } } } return mbeans; } /** * * @param valueChangedEvent */ public void handleObsSelectChangeListener(ValueChangeEvent valueChangedEvent) { log.info("Handling event in handleObsSelectChangeListener."); MeasurementImpl targetBean = (MeasurementImpl) this.getObsTable().getRowData(); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Vector<String> props = expBean.getExperiment().getExperimentExecutable().getProperties(); if (props.contains(targetBean.getIdentifier().toString())) { props.remove(targetBean.getIdentifier().toString()); log.info("Removed: " + targetBean.getIdentifier()); } else { props.add(targetBean.getIdentifier().toString()); log.info("Added: " + targetBean.getIdentifier()); } } /** * * @param valueChangedEvent */ public void handleManualObsSelectChangeListener(ValueChangeEvent valueChangedEvent) { log.info("Handling event in handleManualObsSelectChangeListener."); //the measurement we're operating upon MeasurementBean targetBean = (MeasurementBean) this.getManualObsTable().getRowData(); //the experiment bean ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); String etype = expBean.getEtype(); //the experiment type backing bean ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(etype); //the model element Vector<String> props = expBean.getExperiment().getExperimentExecutable() .getManualProperties(targetBean.getStage()); // Use the stage to narrow the list: String stageName = expBean.getSelectedStage().getName(); if (props.contains(targetBean.getIdentifier().toString())) { //remove from the model expBean.getExperiment().getExperimentExecutable().removeManualProperty(stageName, targetBean.getIdentifier().toString()); //remove from the bean exptype.getManualObservables().get(stageName); MeasurementImpl removeMeasurement = null; for (MeasurementImpl m : exptype.getManualObservables().get(stageName)) { if (m.getIdentifier().toString().equals(targetBean.getIdentifier().toString())) { removeMeasurement = m; } } if (removeMeasurement != null) { exptype.getManualObservables().get(stageName).remove(removeMeasurement); } TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(expBean.getExperiment()); log.info("Removed: " + targetBean.getIdentifier()); } else { /*props.add(targetBean.getIdentifier().toString()); log.info("Added: "+targetBean.getIdentifier());*/ } } /** * Takes the properties from the OntologBrowser component and adds them * as Measurements on the current experiment. */ public String addOntoPropsToExp() { log.info("Adding properties from the ontology to the experiment"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); String etype = expBean.getEtype(); ExpTypeBackingBean exptype = ExpTypeBackingBean.getExpTypeBean(etype); if (etype.equals(AdminManagerImpl.IDENTIFY)) { exptype = (ExpTypeBackingBean) JSFUtil.getManagedObject("ExpTypeIdentify"); } else if (etype.equals(AdminManagerImpl.MIGRATE)) { exptype = (ExpTypeBackingBean) JSFUtil.getManagedObject("ExpTypeMigrate"); } else if (etype.equals(AdminManagerImpl.EMULATE)) { exptype = (ExpTypeBackingBean) JSFUtil.getManagedObject("ExpTypeViewer"); } else if (etype.equals(AdminManagerImpl.EXECUTABLEPP)) { exptype = (ExpTypeBackingBean) JSFUtil.getManagedObject("ExpTypeExecutablePP"); } else { // For unrecognised experiment types, set to NULL: log.error("unrecognised experiment type"); NewExpWizardController.redirectToExpStage(expBean.getID(), 3); return "success"; } //get the information from the ontology tree bean PropertyDnDTreeBean treeBean = expBean.getOntologyDnDBean(); if (treeBean == null) { // ontology tree bean has not been set log.error("ontology tree bean not set"); NewExpWizardController.redirectToExpStage(expBean.getID(), 3); return "success"; } //the bean's manual observables HashMap<String, List<MeasurementImpl>> props = exptype.getManualObservables(); //now iterate over all added properties Map<String, HashMap<String, String>> stagePropsSel = treeBean.getStageSelectedState(); List<OntologyProperty> selProps = treeBean.getSelectedOntologyProperties(); try { for (ExperimentStageBean stageb : exptype.getStageBeans()) { for (OntologyProperty prop : selProps) { String pURI = prop.getURI(); if (stagePropsSel.get(pURI) != null) { String val = stagePropsSel.get(pURI).get(stageb.getName()); if (val != null) { //create a MeasurementImpl from the OntologyProperty MeasurementImpl measurement = OntoPropertyUtil .createMeasurementFromOntologyProperty(prop); //check if this property was already added boolean bContained = false; MeasurementImpl measurementContained = null; List<MeasurementImpl> lExistingMeasurements = props.get(stageb.getName()); for (MeasurementImpl m : lExistingMeasurements) { if (m.getIdentifier().equals(measurement.getIdentifier())) { bContained = true; measurementContained = m; } } //add new if (val.equals("true")) { //add the Measurement to the experimentType's backing bean if (!bContained) { lExistingMeasurements.add(measurement); log.info("Added manual property: " + measurement.getIdentifier()); } //update the model's information expBean.getExperiment().getExperimentExecutable().addManualProperty( stageb.getName(), measurement.getIdentifier().toString()); } //remove existing if (val.equals("false")) { //remove the Measurement from the experimentType's backing bean if (bContained) { lExistingMeasurements.remove(measurementContained); log.info("Removed manual property: " + measurement.getIdentifier()); } //update the model's information expBean.getExperiment().getExperimentExecutable().removeManualProperty( stageb.getName(), measurement.getIdentifier().toString()); } } } } } //store the updated experiment TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(expBean.getExperiment()); } catch (Exception e) { log.debug("error building Measurement from OntologyProperty", e); } NewExpWizardController.redirectToExpStage(expBean.getID(), 3); return "success"; } /** * Processes a manual property value change in step5 of an experiment's property overview table and * updates the experiment with this value. */ public void processManualDataEntryChange(ValueChangeEvent vce) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); String value = (String) vce.getNewValue(); if (value.equals("")) return; FacesContext context = FacesContext.getCurrentInstance(); Object o1 = context.getExternalContext().getRequestParameterMap().get("propertyID"); Object o2 = context.getExternalContext().getRequestParameterMap().get("stageName"); Object o3 = context.getExternalContext().getRequestParameterMap().get("runDateMillis"); Object o4 = context.getExternalContext().getRequestParameterMap().get("inputDigoRef"); if ((o1 != null) && (o2 != null) && (o3 != null) && (o4 != null)) { //fetch the parameters from the requestParameterMap String manualpropID = (String) o1; String stageName = (String) o2; String expRunInMillis = (String) o3; String inputDigoRef = (String) o4; Calendar c = new GregorianCalendar(); c.setTimeInMillis(Long.parseLong(expRunInMillis)); //now create or update an MeasurementImpl record this.updateManualPropertyMeasurementRecord(manualpropID, inputDigoRef, stageName, c, value); //store the updated experiment TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(expBean.getExperiment()); } else { log.debug("not all required HtmlActionParameters we're sent along"); } } /** * Updates a measurement record within step5 of an experiment's data input table overview * @param propertyID http://www.semanticweb.org/ontologies/2008/7/XCLOntology1.5.owl#CCITTFaxDecode * @param digObjectRefCopy 54f8cff2-2f27-46f3-add1-541a00937653.tif * @param stageName Characterise Before Migration * @param runEndDate 4/2/09 2:54:42 PM * @param value */ private void updateManualPropertyMeasurementRecord(String propertyID, String digObjectRefCopy, String stageName, Calendar runEndDate, String value) { //TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); for (BatchExecutionRecordImpl batchRec : exp.getExperimentExecutable().getBatchExecutionRecords()) { //check if we've found the requested batch execution if (batchRec.getEndDate().equals(runEndDate)) { for (ExecutionRecordImpl execRec : batchRec.getRuns()) { //check if we're operating on the requested digital object if (execRec.getDigitalObjectReferenceCopy().equals(digObjectRefCopy)) { for (ExecutionStageRecordImpl execStageRec : execRec.getStages()) { //check if we're operating on the proper stage if (execStageRec.getStage().equals(stageName)) { //check if we're operating on the requested manual measurement ID boolean bFound = false; for (MeasurementImpl mRec : execStageRec.getManualMeasurements()) { if (mRec.getIdentifier().equals(propertyID)) { mRec.setValue(value); bFound = true; log.info("updating measurement for input: " + digObjectRefCopy + " time: " + runEndDate.getTimeInMillis() + " stage: " + stageName + " propID: " + propertyID + " value: " + value); } } if (!bFound) { //no MeasurementRecord exists -> create a new one MeasurementImpl mRec = new MeasurementImpl(URI.create(propertyID), value); execStageRec.addManualMeasurement(mRec); log.info("created new measurement for input: " + digObjectRefCopy + " time: " + runEndDate.getTimeInMillis() + " stage: " + stageName + " propID: " + propertyID + " value: " + value); } } } } } } } } /** * A convenience method in step5 (fill in manual results) to copy a value to all execution * runs. This method is made available through a 'right-click' context menu * @param event */ public void processCopyManualPropertyResultForAllExecutions(ActionEvent event) { //1)get the passed Attributes "propertyID", "value" etc., which are passed along FacesContext context = FacesContext.getCurrentInstance(); Object o1 = context.getExternalContext().getRequestParameterMap().get("propertyID"); Object o2 = context.getExternalContext().getRequestParameterMap().get("value"); Object o3 = context.getExternalContext().getRequestParameterMap().get("inputDigoRef"); Object o4 = context.getExternalContext().getRequestParameterMap().get("stageName"); if ((o1 != null) && (o2 != null) && (o3 != null) && (o4 != null)) { String sPropertyID = (String) o1; String sValue = (String) o2; String sInputDigoRef = (String) o3; String sStageName = (String) o4; if (sValue.equals("")) return; //2)iterate over all runDates and fill in the value ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); for (Calendar runDate : expBean.getAllRunDates()) { updateManualPropertyMeasurementRecord(sPropertyID, sInputDigoRef, sStageName, runDate, sValue); } log.info("completed copy manual property result for all run dates"); } else { log.debug( "copy manual proeprty results for all run dates failed - 1..n parameters were not properly sent along"); } } /** * Stage6 update a line evaluation record for a given property and a inputDigoRef * @param vce */ public void processLineEvalValChange(ValueChangeEvent vce) { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Integer value = (Integer) vce.getNewValue(); if (value < 1 || value > 4) return; FacesContext context = FacesContext.getCurrentInstance(); Object o1 = context.getExternalContext().getRequestParameterMap().get("propertyID"); Object o4 = context.getExternalContext().getRequestParameterMap().get("inputDigoRef"); if ((o1 != null) && (o4 != null)) { //fetch the parameters from the requestParameterMap String manualpropID = (String) o1; String inputDigoRef = (String) o4; //now create or update an EvaluationRecord this.updatePropertyEvaluationRecord(manualpropID, inputDigoRef, value); //store the updated experiment TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(expBean.getExperiment()); } else { log.debug("not all required HtmlActionParameters we're sent along"); } } /** * updates an evaluation record for a given property and input digitalObjectRef (line record not per run) * @param propertyID * @param digObjectRefCopy * @param evalValue */ private void updatePropertyEvaluationRecord(String propertyID, String digObjectRefCopy, Integer evalValue) { //TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); List<PropertyEvaluationRecordImpl> propEvalRecs = exp.getExperimentEvaluation() .getPropertyEvaluation(digObjectRefCopy); PropertyEvaluationRecordImpl propEvalRec = null; if (propEvalRecs != null) { boolean bIsUpdate = false; for (PropertyEvaluationRecordImpl propEvalR : propEvalRecs) { if (propEvalR.getPropertyID().equals(propertyID)) { propEvalRec = propEvalR; //update an existing evaluation record propEvalRec.setPropertyEvalValue(evalValue); bIsUpdate = true; } } //create a new evaluation record if (!bIsUpdate) { propEvalRec = new PropertyEvaluationRecordImpl(propertyID); propEvalRec.setPropertyEvalValue(evalValue); } exp.getExperimentEvaluation().addPropertyEvaluation(digObjectRefCopy, propEvalRec); } //TODO AL: not updating the evaluation records for every run - TBC } public String finalizeExperiment() { TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); exp.getExperimentEvaluation().setState(Experiment.STATE_COMPLETED); exp.setState(Experiment.STATE_COMPLETED); testbedMan.updateExperiment(exp); expBean.setCurrentStage(ExperimentBean.PHASE_EXPERIMENTFINALIZED); NewExpWizardController.redirectToExpStage(expBean.getID(), 6); return "success"; } public void saveExperiment() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(expBean.getExperiment()); } int countEvaluationItems = -1; int countNotEvaluationItems = -1; public int getCalculateOverallEvaluation() { countEvaluationItems = 0; int countWeights = 0; int countWeightEvaluationItems = 0; countNotEvaluationItems = 0; ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); //iterate over all inputDigitalObjects for (DigitalObjectBean inputDigo : expBean.getExperimentInputDataValues()) { for (EvaluationPropertyResultsBean evalPropResBean : expBean .getEvaluationPropertyResultsBeans(inputDigo.getDigitalObject())) { if (evalPropResBean.getPropertyEvalValue() != -1) { String propertyID = evalPropResBean.getMeasurementPropertyID(); //get the value Integer value = evalPropResBean.getPropertyEvalValue(); //now gather the property's weight - if none defined the average is used. int propertyWeight = -1; try { Object o = exp.getExperimentEvaluation().getOverallPropertyEvalWeights() .get(new URI(propertyID)); propertyWeight = Integer.valueOf((String) o); } catch (Exception e) { log.debug(e); } //also check for -1 if ((propertyWeight == -1)) { propertyWeight = 3; } //add information for calculation countEvaluationItems++; countWeights += propertyWeight; countWeightEvaluationItems += value * propertyWeight; } else { countNotEvaluationItems++; } } } if ((countWeightEvaluationItems != 0) && (countWeights != 0)) { log.info("calculated value: " + countWeightEvaluationItems + " " + countWeights + " = " + countWeightEvaluationItems / countWeights); return countWeightEvaluationItems / countWeights; } else { return -1; } } public int getNumberOfEvaluatedProperties() { return countEvaluationItems; } public int getNumberOfNotEvaluatedProperties() { return countNotEvaluationItems; } /** * Fetches the registered worfklow source file and extracts the Information that's located within the getDescription method for a given WFTemplate name * parses it and stores this information within the bean. */ public void getWFDescriptionForTemplate() { ExpTypeExecutablePP eTypeExecPP = (ExpTypeExecutablePP) ExpTypeBackingBean .getExpTypeBean(AdminManagerImpl.EXECUTABLEPP); WftRegistryService wftRegistryService = WeeRemoteUtil.getInstance().getWeeRegistryService(); try { byte[] bContent = wftRegistryService .getWFTemplate(eTypeExecPP.getWeeXMLConfig().getTemplate().getClazz()); if (bContent != null) { String wfTemplateContent = new String(bContent); String sDescription = eTypeExecPP.helperParseDescription(wfTemplateContent); eTypeExecPP.setWFDescription(sDescription); } } catch (PlanetsException e) { String err = "No workflow description available"; eTypeExecPP.setWFDescription(err); log.debug(err, e); } } private Double userRating = Double.valueOf(0); /** * takes a given experiment rating and stores it within the expeirment's user ratings */ public void handleUserExperimentRating() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); //get the current logged-in user UserBean user = (UserBean) JSFUtil.getManagedObject("UserBean"); exp.setUserRatingForExperiment(user.getUserid(), getUserExperimentRating()); Double rating = exp.getUserRatingOfExperiment(user.getUserid()); log.info("added community rating for the experiment: " + exp.getEntityID() + " from user: " + user.getUserid() + " name: " + user.getFullname() + " rating: " + rating); TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); testbedMan.updateExperiment(exp); //reset the rating userRating = Double.valueOf(0); } /** * Loads an existing experiment rating for the user at hand * @return */ public int getUserExpRatingFromDB() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); Experiment exp = expBean.getExperiment(); //get the current logged-in user UserBean user = (UserBean) JSFUtil.getManagedObject("UserBean"); return (int) Math.round(exp.getUserRatingOfExperiment(user.getUserid())); } public void setUserExpRatingFromDB(int i) { // } public Double getUserExperimentRating() { return userRating; } /** * users are able to rate the relevance of an experiment * @param rating1 */ public void setUserExperimentRating(Double rating) { this.userRating = rating; } public Experiment getExperimentAtHand() { ExperimentBean expBean = (ExperimentBean) JSFUtil.getManagedObject("ExperimentBean"); return expBean.getExperiment(); } }