Package eu.planets_project.pp.plato.action.workflow

Source Code of eu.planets_project.pp.plato.action.workflow.TransformMeasuredValuesAction

/*******************************************************************************
* 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.workflow;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

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.RaiseEvent;
import org.jboss.seam.annotations.Scope;

import eu.planets_project.pp.plato.action.interfaces.ISetImportanceFactorsAction;
import eu.planets_project.pp.plato.action.interfaces.ITransformMeasuredValues;
import eu.planets_project.pp.plato.action.interfaces.IWorkflowStep;
import eu.planets_project.pp.plato.model.PlanState;
import eu.planets_project.pp.plato.model.transform.NumericTransformer;
import eu.planets_project.pp.plato.model.transform.Transformer;
import eu.planets_project.pp.plato.model.tree.Leaf;
import eu.planets_project.pp.plato.model.tree.Node;
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.validators.ITreeValidator;
import eu.planets_project.pp.plato.validators.TreeValidator;

/**
* Implements actions for workflow step 'Transform Measured Values. The user can enter
* transformations for each leaf selected from the displayed objective tree.
*
* @author Hannes Kulovits
*/
@Stateful
@Scope(ScopeType.SESSION)
@Name("transform")
@Cache(org.jboss.ejb3.cache.NoPassivationCache.class)
public class TransformMeasuredValuesAction extends AbstractWorkflowStep implements ITransformMeasuredValues, INodeValidator {

    /**
     *
     */
    private static final long serialVersionUID = -4802766805202200359L;

    private static final Log log = PlatoLogger.getLogger(TransformMeasuredValuesAction.class);

    @In(create = true)
    private ISetImportanceFactorsAction importanceFactors;

    /**
     * sets (primitive) default values for all numeric and boolean transformers
     */
    public void calculateDefaultTransformers() {
       selectedPlan.calculateDefaultTransformers();
    }
  
    public TransformMeasuredValuesAction() {
        requiredPlanState = new Integer(PlanState.RESULTS_CAPTURED);
    }

    /**
     * @see AbstractWorkflowStep#getSuccessor()
     */
    protected IWorkflowStep getSuccessor() {
        return importanceFactors;
    }

    /**
     * @see AbstractWorkflowStep#init()
     */
    public void init() {
       initLeafLists();
      
       // initialising the values for free text transformers
       for (Leaf l:selectedPlan.getTree().getRoot().getAllLeaves()) {
           l.initTransformer();
       }

    }

    /**
     * Leaves displayed to the user.
     */
    @Out(required = false)
    @In(required=false)
    List<Leaf> leaves;

    /**
     * Leaves displayed to the user.
     */
    @Out(required = false)
    @In(required=false)
    List<Leaf> errorleaves;

    @Override
    public String save() {
        logTransformers();
        return super.save();
    }
   
    /**
     * Node/Leaf selected by the user from the objective tree. All leaves under that node
     * will be subsequently displayed to the user for input request.
     */
    public String select(Object ob) {
        initErrorLeaves();
        log.debug("Select Called with: " + ob.toString());

        if (ob instanceof Node) {
            log.debug("Setting all Leaves");
            leaves = ((Node) ob).getAllLeaves();
        }else if (ob instanceof Leaf) {
            log.debug("Setting leaf: " + ob.toString());
           
            leaves.clear();
            leaves.add((Leaf) ob);

        }
        logTransformers();
        return null;
    }

    /**
     * @param t
     */
    private void logTransformer(String sessionID, String leafName, Transformer t) {
        if (t == null) {
            log.error("TRANSFORMER NULL at "+leafName+" IN SESSION "+sessionID);
            return;
        }
        StringBuffer sb = new StringBuffer();
        sb.append(sessionID).append(":").append(leafName);
        if (t instanceof NumericTransformer) {
            NumericTransformer nt = (NumericTransformer) t;
            sb.append("::NUMERICTRANSFORMER:: ");
            sb.append(nt.getThreshold1()).append(" ")
              .append(nt.getThreshold2()).append(" ")
              .append(nt.getThreshold3()).append(" ")
              .append(nt.getThreshold4()).append(" ")
              .append(nt.getThreshold5());
            log.debug(sb.toString());
        }
    }

  

    /**
     * @see AbstractWorkflowStep#discard()
     */
    @Override
    @RaiseEvent("reload")
    public String discard() {
        logTransformers();
        String result = super.discard();
        logTransformers();
        init();
        return result;
    }

    private void logTransformers() {
        String id = "";
        try {
            id = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                    .getRequest()).getSession().getId();
        } catch (RuntimeException e) {
            log.debug("Couldn't get SessionID");
        }
        for (Leaf leaf : leaves) {
            logTransformer(id,leaf.getName(), leaf.getTransformer());
        }
        for (Leaf leaf : errorleaves) {
            logTransformer(id,leaf.getName(),leaf.getTransformer());
        }
    }

    /**
     * @see AbstractWorkflowStep#destroy()
     */
    @Destroy
    @Remove
    public void destroy() {
    }

    /**
     * @see eu.planets_project.pp.plato.action.workflow.AbstractWorkflowStep#validate()
     */
    public boolean validate(boolean showValidationErrors) {
        ITreeValidator validator = new TreeValidator();
        List<TreeNode> nodes = new ArrayList<TreeNode>();
        boolean validate = validator.validate(selectedPlan.getTree().getRoot(),
                this, nodes, showValidationErrors);
        if (!validate) {
            initLeafLists();
            //All non-validating leaves should be in the list nodes
            for (TreeNode node : nodes) {
                if (node.isLeaf()) {
                    this.errorleaves.add((Leaf) node);
                }
            }
        }
        return validate;
      
    }

    /**
     *
     */
    private void initLeafLists() {
        if(leaves == null){
            leaves = new ArrayList<Leaf>();
        } else {
            leaves.clear();
        }
        initErrorLeaves();
    }
   
    /**
     *
     */
    private void initErrorLeaves() {
        if(errorleaves == null){
            errorleaves = new ArrayList<Leaf>();
        } else  {
            errorleaves.clear();
        }
    }
    /**
     * @see eu.planets_project.pp.plato.util.INodeValidator#validateNode(eu.planets_project.pp.plato.model.TreeNode, java.util.List, java.util.List)
     */
    public boolean validateNode(TreeNode node, List<String> errormessages, List<TreeNode> nodes) {
        return node.isCompletelyTransformed(errormessages, nodes);
    }

    /**
     * @see AbstractWorkflowStep#getWorkflowstepName()
     */
    protected String getWorkflowstepName() {
        return "transform";
    }

    /**
     * Touches all leaves.
     *
     * @see eu.planets_project.pp.plato.model.values.Value#touch()
     */
    public void approve() {
        for (Leaf leaf : leaves) {
            //logTransformer(leaf.getName(),leaf.getTransformer());
            leaf.getTransformer().touch();
        }
        for (Leaf leaf : errorleaves) {
            //logTransformer(leaf.getName(),leaf.getTransformer());
            leaf.getTransformer().touch();
        }
        logTransformers();
    }
}
TOP

Related Classes of eu.planets_project.pp.plato.action.workflow.TransformMeasuredValuesAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.