org.eclipse.jubula.client.core.model.ResultTreeTracker.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.client.core.model.ResultTreeTracker.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 BREDEX GmbH.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.client.core.model;

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

import org.apache.commons.lang.StringUtils;
import org.eclipse.jubula.client.core.businessprocess.ExternalTestDataBP;
import org.eclipse.jubula.client.core.businessprocess.TestExecution;
import org.eclipse.jubula.client.core.i18n.Messages;
import org.eclipse.jubula.client.core.persistence.Persistor;
import org.eclipse.jubula.client.core.utils.ExecObject;
import org.eclipse.jubula.client.core.utils.ModelParamValueConverter;
import org.eclipse.jubula.client.core.utils.ParamValueConverter;
import org.eclipse.jubula.tools.constants.StringConstants;
import org.eclipse.jubula.tools.exception.InvalidDataException;
import org.eclipse.jubula.tools.exception.JBException;
import org.eclipse.jubula.tools.i18n.CompSystemI18n;
import org.eclipse.jubula.tools.messagehandling.MessageIDs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * class for tracking of result tree for display of test results
 * @author BREDEX GmbH
 * @created 14.04.2005
 */
public class ResultTreeTracker implements IExecStackModificationListener {

    /** the logger */
    private static Logger log = LoggerFactory.getLogger(ResultTreeTracker.class);

    /**
     * <code>m_endNode</code> last result node in resultTree, which is associated 
     * with last execTestCase or with the testsuite
     */
    private TestResultNode m_endNode;

    /**
     * <code>m_lastCap</code> resultNode to actual executed cap
     */
    private TestResultNode m_lastNonCap;

    /**
     * here is saved how much extra hierarchy lvl we have caused by event
     * handler
     */
    private int m_eventHierarchy = 0;

    /** business process for retrieving test data */
    private ExternalTestDataBP m_externalTestDataBP;

    /**
     * @param root traverser for associated testexecution tree
     * @param externalTestDataBP business process for retrieving test data
     */
    public ResultTreeTracker(TestResultNode root, ExternalTestDataBP externalTestDataBP) {
        m_endNode = root;
        m_lastNonCap = root;
        m_externalTestDataBP = externalTestDataBP;
    }

    /** 
     * {@inheritDoc}
     */
    public void stackIncremented(INodePO node) {
        if (m_lastNonCap.getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_lastNonCap.setResult(TestResultNode.TESTING, null);
        }
        if (Persistor.isPoSubclass(node, IEventExecTestCasePO.class) || m_eventHierarchy > 0) {
            m_eventHierarchy++;
        }

        if (m_eventHierarchy > 0) {
            int nextIndex = m_lastNonCap.getNextChildIndex();
            m_lastNonCap = new TestResultNode(node, m_lastNonCap, nextIndex);
            m_lastNonCap.getParent().updateResultNode(nextIndex, m_lastNonCap);
        } else {
            TestResultNode nextNonCap = m_lastNonCap.getResultNodeList().get(m_lastNonCap.getNextChildIndex());
            while (nextNonCap.getNode() != node) {
                nextNonCap = m_lastNonCap.getResultNodeList().get(m_lastNonCap.getNextChildIndex());
            }
            m_lastNonCap = nextNonCap;
        }
        m_endNode = m_lastNonCap;
        if (m_lastNonCap.getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_lastNonCap.setResult(TestResultNode.TESTING, null);
            if (node instanceof IParamNodePO) {
                addParameters((IParamNodePO) node, m_lastNonCap);
            }
        }
        if (m_lastNonCap.getParent().getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_lastNonCap.getParent().setResult(TestResultNode.TESTING, null);
        }

    }

    /** 
     * {@inheritDoc}
     */
    public void stackDecremented() {
        if (m_eventHierarchy > 0) {
            m_eventHierarchy--;
        }
        if (m_lastNonCap.getStatus() == TestResultNode.NOT_YET_TESTED
                || m_lastNonCap.getStatus() == TestResultNode.TESTING) {

            m_lastNonCap.setResult(TestResultNode.SUCCESS, null);

            if (m_endNode.getStatus() == TestResultNode.NOT_YET_TESTED
                    || m_endNode.getStatus() == TestResultNode.TESTING) {

                m_endNode.setResult(TestResultNode.SUCCESS, null);
            }
        }
        m_lastNonCap = m_lastNonCap.getParent();
        m_endNode = m_lastNonCap;
    }

    /** 
     * {@inheritDoc}
     */
    public void nextDataSetIteration() {
        if (m_lastNonCap.getStatus() == TestResultNode.NOT_YET_TESTED
                || m_lastNonCap.getStatus() == TestResultNode.TESTING) {

            m_lastNonCap.setResult(TestResultNode.SUCCESS, null);

            if (m_endNode.getStatus() == TestResultNode.NOT_YET_TESTED
                    || m_endNode.getStatus() == TestResultNode.TESTING) {

                m_endNode.setResult(TestResultNode.SUCCESS, null);
            }
        }
        int nextIndex = m_lastNonCap.getParent().getNextChildIndex();
        if (m_eventHierarchy > 0) {
            m_lastNonCap = new TestResultNode(m_lastNonCap.getNode(), m_lastNonCap.getParent(), nextIndex);
            m_lastNonCap.getParent().updateResultNode(nextIndex, m_lastNonCap);
        } else {
            m_lastNonCap = m_lastNonCap.getParent().getResultNodeList().get(nextIndex);
        }
        if (m_lastNonCap.getStatus() == TestResultNode.NOT_YET_TESTED) {
            INodePO node = m_lastNonCap.getNode();
            if (node instanceof IParamNodePO) {
                addParameters((IParamNodePO) node, m_lastNonCap);
            }
            m_lastNonCap.setResult(TestResultNode.TESTING, null);
        }
        if (m_lastNonCap.getParent().getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_lastNonCap.getParent().setResult(TestResultNode.TESTING, null);
        }

    }

    /** 
     * {@inheritDoc}
     */
    public void nextCap(ICapPO cap) {
        int nextIndex = m_lastNonCap.getNextChildIndex();

        if (m_eventHierarchy > 0) {
            m_endNode = new TestResultNode(cap, m_lastNonCap);
            m_endNode.getParent().updateResultNode(nextIndex, m_endNode);
            m_endNode.setActionName(CompSystemI18n.getString(cap.getActionName()));
            m_endNode.setComponentType(CompSystemI18n.getString(cap.getComponentType()));
        } else {
            m_endNode = m_lastNonCap.getResultNodeList().get(nextIndex);
            while (m_endNode.getNode() != cap) {
                nextIndex = m_lastNonCap.getNextChildIndex();
                m_endNode = m_lastNonCap.getResultNodeList().get(nextIndex);
            }
        }
        if (m_endNode.getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_endNode.setResult(TestResultNode.TESTING, null);
        }
        addParameters(cap, m_endNode);
    }

    /**
     * Adds the parameters from the given cap to the given result node.
     * 
     * @param paramNode The node from which to copy the parameter info.
     * @param resultNode The result node to which the parameter info will
     *                   be copied.
     */
    private void addParameters(IParamNodePO paramNode, TestResultNode resultNode) {

        List<IParamDescriptionPO> parameterList = paramNode.getParameterList();
        for (IParamDescriptionPO desc : parameterList) {

            List<ExecObject> execList = TestExecution.getInstance().getTrav().getExecStackAsList();
            ExecObject currentExecObj = execList.get(execList.size() - 1);

            resultNode
                    .addParameter(new TestResultParameter(desc.getName(), CompSystemI18n.getString(desc.getType()),
                            currentExecObj.getParameterValue(desc.getUniqueId())));
        }
    }

    /**
     * Adds the parameters from the given Test Step to the given result node.
     * 
     * @param testStep The Test Step from which to copy the parameter info.
     * @param resultNode The result node to which the parameter info will
     *                   be copied.
     */
    private void addParameters(ICapPO testStep, TestResultNode resultNode) {

        List<IParamDescriptionPO> parameterList = testStep.getParameterList();
        String value = null;
        for (IParamDescriptionPO desc : parameterList) {
            ITDManager tdManager = null;
            try {
                tdManager = m_externalTestDataBP.getExternalCheckedTDManager(testStep);
            } catch (JBException e) {
                log.error(Messages.TestDataNotAvailable + StringConstants.DOT, e);
            }
            TestExecution te = TestExecution.getInstance();

            List<ExecObject> stackList = new ArrayList<ExecObject>(te.getTrav().getExecStackAsList());

            // Special handling for Test Steps. Their test data manager has 
            // information about multiple Data Sets, but we are only interested 
            // in the first one.
            int dataSetIndex = 0;

            if (tdManager.findColumnForParam(desc.getUniqueId()) == -1) {
                IParameterInterfacePO referencedDataCube = testStep.getReferencedDataCube();
                if (referencedDataCube != null) {
                    desc = referencedDataCube.getParameterForName(desc.getName());
                }
            }
            ITestDataPO date = tdManager.getCell(dataSetIndex, desc);
            ParamValueConverter conv = new ModelParamValueConverter(date.getValue(te.getLocale()), testStep,
                    te.getLocale(), desc);
            try {
                value = conv.getExecutionString(stackList, te.getLocale());
            } catch (InvalidDataException e) {
                log.error(e.getMessage());
                value = MessageIDs.getMessageObject(e.getErrorId())
                        .getMessage(new String[] { e.getLocalizedMessage() });
            }

            resultNode.addParameter(new TestResultParameter(CompSystemI18n.getString(desc.getUniqueId()),
                    CompSystemI18n.getString(desc.getType()), StringUtils.defaultString(value)));
        }
    }

    /**
     * @return Returns the endNode.
     */
    public TestResultNode getEndNode() {
        return m_endNode;
    }

    /**
     * {@inheritDoc}
     */
    public void retryCap(ICapPO cap) {
        int nextIndex = m_lastNonCap.getNextChildIndex();
        m_endNode = new TestResultNode(cap, m_lastNonCap, nextIndex);
        if (m_endNode.getStatus() == TestResultNode.NOT_YET_TESTED) {
            m_endNode.setResult(TestResultNode.TESTING, null);
        }
        m_endNode.getParent().updateResultNode(nextIndex, m_endNode);

        addParameters(cap, m_endNode);
    }
}