Java tutorial
/******************************************************************************* * Copyright (c) 2006-2010 Vienna University of Technology, * Department of Software Technology and Interactive Systems * * 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.pp.plato.action.fte; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.faces.application.FacesMessage; import javax.persistence.EntityManager; import org.apache.commons.logging.Log; import org.jboss.annotation.ejb.cache.Cache; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import org.jboss.seam.faces.FacesMessages; import org.xml.sax.SAXException; import eu.planets_project.pp.plato.action.interfaces.IDefineSampleRecords; import eu.planets_project.pp.plato.action.interfaces.IFastTrackDefineRequirements; import eu.planets_project.pp.plato.action.interfaces.IFastTrackEvaluateAlternatives; import eu.planets_project.pp.plato.action.interfaces.IIdentifyRequirements; import eu.planets_project.pp.plato.action.interfaces.IProjectImport; import eu.planets_project.pp.plato.action.interfaces.IWorkflowStep; import eu.planets_project.pp.plato.action.project.LoadPlanAction; import eu.planets_project.pp.plato.action.workflow.AbstractWorkflowStep; import eu.planets_project.pp.plato.bean.FastTrackTemplate; import eu.planets_project.pp.plato.bean.FastTrackTemplates; import eu.planets_project.pp.plato.bean.TreeHelperBean; import eu.planets_project.pp.plato.evaluation.MiniRED; import eu.planets_project.pp.plato.model.PlanState; import eu.planets_project.pp.plato.model.SampleObject; import eu.planets_project.pp.plato.model.User; import eu.planets_project.pp.plato.model.tree.Leaf; import eu.planets_project.pp.plato.model.tree.ObjectiveTree; import eu.planets_project.pp.plato.model.tree.TemplateTree; import eu.planets_project.pp.plato.model.tree.TreeNode; import eu.planets_project.pp.plato.util.PlatoLogger; import eu.planets_project.pp.plato.validators.INodeValidator; import eu.planets_project.pp.plato.xml.TreeLoader; /** * Action handler for the first step of Fast-track evaluation: Define requirements * @author cbu */ @Stateful @Scope(ScopeType.SESSION) @Name("FTrequirements") @Cache(org.jboss.ejb3.cache.NoPassivationCache.class) public class DefineRequirementsFastTrack extends AbstractWorkflowStep implements IFastTrackDefineRequirements { private static final long serialVersionUID = -5840252761666399020L; private static final Log log = PlatoLogger.getLogger(DefineRequirementsFastTrack.class); @In EntityManager em; @In(create = true) private LoadPlanAction loadPlan; @In(create = true) IFastTrackEvaluateAlternatives FTevaluate; @In(create = true) IIdentifyRequirements identifyRequirements; @In(create = true) IDefineSampleRecords defineSampleRecords; @In(required = false) private User user; @Out(required = false) private List<FastTrackTemplate> fastTrackTemplateList = new ArrayList<FastTrackTemplate>();; @In(create = true) private FastTrackTemplates fastTrackTemplates; public DefineRequirementsFastTrack() { requiredPlanState = new Integer(PlanState.FTE_INITIALISED); } @Override protected void init() { defineSampleRecords.init(); fastTrackTemplates.init(); } public void startFastTrackEvaluation() { } /** * @see AbstractWorkflowStep#getWorkflowstepName() */ @Override protected String getWorkflowstepName() { return "FTrequirements"; } /** * @see AbstractWorkflowStep#getSuccessor() */ @Override protected IWorkflowStep getSuccessor() { return FTevaluate; } @Override protected void doClearEm() { super.doClearEm(); } @Override public String save() { log.debug("Persisting plan " + selectedPlan.getPlanProperties().getName()); selectedPlan.touch(); selectedPlan.getPlanProperties().setOpenHandle(1); // we have to set the plan properties id so 'Close Plan' can do an unlock loadPlan.setPlanPropertiesID(selectedPlan.getPlanProperties().getId()); for (Leaf leaf : selectedPlan.getTree().getRoot().getAllLeaves()) { leaf.resetValues(selectedPlan.getAlternativesDefinition().getConsideredAlternatives()); } defineSampleRecords.save(); super.save(); changed = ""; return null; } @Destroy @Remove public void destroy() { } @In(create = true) @Out private TreeHelperBean treeHelper; private List<TreeNode> nodesToDelete = new ArrayList<TreeNode>(); private void resetTransformers() { TreeNode root = this.selectedPlan.getTree().getRoot(); for (Leaf leaf : root.getAllLeaves()) { /* * maybe the scaletype is not set yet * -> leaf.setDefaultTransformer has to handle null-values itself */ if ((leaf.getScale() == null) || (leaf.getScale().isDirty())) { leaf.setDefaultTransformer(); } } } /** * @see INodeValidator#validateNode(TreeNode, List, List) */ public boolean validateNode(TreeNode node, List<String> errorMessages, List<TreeNode> nodes) { boolean isValid = node.isCompletelySpecified(errorMessages); if (!isValid) { nodes.add(node); } return isValid; } @In(create = true) private IProjectImport projectImport; public void useFastTrackTemplate() { if (fastTrackTemplates.getFastTrackTemplate() != null) { log.info(fastTrackTemplates.getFastTrackTemplate().getAbsolutePath()); } File file = new File(fastTrackTemplates.getFastTrackTemplate().getAbsolutePath()); List<TemplateTree> templates = null; try { FileInputStream fis; fis = new FileInputStream(file); byte[] data = new byte[(int) file.length()]; fis.read(data); fis.close(); templates = projectImport.importTemplates(data); if (templates.size() != 1) { FacesMessages.instance().add(FacesMessage.SEVERITY_ERROR, "Unable to load template."); return; } TreeNode newRoot = ((TreeNode) templates.get(0).getRoot()).clone(); newRoot.touchAll(user.getUsername()); //newtree.adjustScalesToMeasurements(MiniRED.getInstance().getMeasurementsDescriptor()); newRoot.initWeights(); nodesToDelete.add(selectedPlan.getTree().getRoot()); selectedPlan.getTree().setRoot(newRoot); // setWeightsInitialized must be called so that initWeights does its work selectedPlan.getTree().setWeightsInitialized(false); // initWeights *must* be called because it amongst other things // sets the weight of the root node to 1.0. if that doesn't happed // the whole evaluation doesn't work. selectedPlan.getTree().initWeights(); changed = "true"; } catch (FileNotFoundException e) { log.error(e.getMessage(), e); FacesMessages.instance().add(FacesMessage.SEVERITY_ERROR, e.getMessage()); return; } catch (IOException e) { log.error(e.getMessage(), e); FacesMessages.instance().add(FacesMessage.SEVERITY_ERROR, e.getMessage()); return; } catch (SAXException e) { log.error(e.getMessage(), e); } } public boolean validate(boolean showValidationErrors) { boolean valid = defineSampleRecords.validate(showValidationErrors); return valid && identifyRequirements.validate(showValidationErrors); } }