/*******************************************************************************
* 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.ui.controllers.propertysources;
import java.text.NumberFormat;
import java.util.Date;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jubula.client.core.model.IAbstractContainerPO;
import org.eclipse.jubula.client.core.model.ICapPO;
import org.eclipse.jubula.client.core.model.ICommentPO;
import org.eclipse.jubula.client.core.model.ICondStructPO;
import org.eclipse.jubula.client.core.model.IConditionalStatementPO;
import org.eclipse.jubula.client.core.model.IEventExecTestCasePO;
import org.eclipse.jubula.client.core.model.IExecTestCasePO;
import org.eclipse.jubula.client.core.model.INodePO;
import org.eclipse.jubula.client.core.model.ITestSuitePO;
import org.eclipse.jubula.client.core.model.TestResultNode;
import org.eclipse.jubula.client.core.model.TestResultParameter;
import org.eclipse.jubula.client.ui.constants.IconConstants;
import org.eclipse.jubula.client.ui.i18n.Messages;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.i18n.I18n;
import org.eclipse.jubula.tools.internal.objects.event.TestErrorEvent;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.views.properties.PropertyDescriptor;
/**
* @author BREDEX GmbH
* @created 22.11.2011
*/
@SuppressWarnings("synthetic-access")
public class TestResultNodePropertySource extends AbstractPropertySource {
/** Constant for Category Component */
public static final String P_TESTSTEP_CAT =
Messages.TestResultNodePropertySourceResultStep;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_STEPNAME =
Messages.TestResultNodePropertySourceStepName;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_STEPTYPE =
Messages.TestResultNodePropertySourceStepType;
/** Constant for Category Component */
public static final String P_TESTRESULT_CAT =
Messages.TestResultNodePropertySourceTestResult;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_TIMESTAMP =
Messages.TestResultNodePropertySourceTimeStamp;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_STEPSTATUS =
Messages.TestResultNodePropertySourceStepStatus;
/** Constant for Category Component */
public static final String P_TESTERROR_CAT =
Messages.TestResultNodePropertySourceErrorDetail;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_ERRORTYPE =
Messages.TestResultNodePropertySourceErrorType;
/** Constant for Category Test Data */
public static final String P_DATA_CAT =
Messages.TestResultNodePropertySourceDataCat;
// CAP Details
/** Constant for Category Component */
public static final String P_CAP_CAT =
Messages.TestResultNodePropertySourceCapDetail;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_CAPCOMMENT =
Messages.TestResultNodePropertySourceComment;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_COMPNAME =
Messages.CapGUIPropertySourceComponentName;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_ACTIONTYPE =
Messages.CapGUIPropertySourceActionType;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_COMP_MATCH =
Messages.CapGUIPropertySourceCompMatch;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_COMPTYPE =
Messages.CapGUIPropertySourceCompType;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_PARAMETERNAME =
Messages.CapGUIPropertySourceParamName;
/** Property m_text on display */
public static final String P_ELEMENT_DISPLAY_PARAMETERVALUE =
Messages.CapGUIPropertySourceParamValue;
/** the node to display the properties for */
private TestResultNode m_node;
/**
* Constructor
* @param node
* TestResultNodeGUI
*/
public TestResultNodePropertySource(TestResultNode node) {
this.m_node = node;
initPropDescriptor();
}
/**
* Inits the PropertyDescriptors
*/
protected void initPropDescriptor() {
clearPropertyDescriptors();
final INodePO node = m_node.getNode();
if (node instanceof ICommentPO) {
initCommentPropDescriptor();
return;
}
initCommonPropDescriptors(node);
initResultDetailsPropDesc();
if (node instanceof IEventExecTestCasePO) {
initEventTestCasePropDescriptor(node);
}
if (m_node.getStatus() != TestResultNode.NOT_YET_TESTED) {
if (node instanceof ICondStructPO) {
initCondStructPropDescriptor((ICondStructPO) node);
}
}
if (m_node.getEvent() != null) {
initErrorEventPropDescriptor();
}
initComponentNameDetailsPropDescriptor(m_node);
initActionDetailsPropDescriptor(m_node);
initParameterDescriptor(m_node);
}
/**
* inits property descriptors for a comment
*/
private void initCommentPropDescriptor() {
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
final TestResultNode cap = m_node;
return m_node.getName();
}
}, P_ELEMENT_DISPLAY_CAPCOMMENT);
addPropertyDescriptor(propDes);
}
/**
* inits common property descriptors for a node
* @param node the node
*/
private void initCommonPropDescriptors(final INodePO node) {
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
final TestResultNode cap = m_node;
Date time = cap.getTimeStamp();
if (time != null) {
String timeStamp = time.toString();
return timeStamp;
}
return StringConstants.EMPTY;
}
}, P_ELEMENT_DISPLAY_TIMESTAMP);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return m_node.getName();
}
}, P_ELEMENT_DISPLAY_STEPNAME);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
propDes = new PropertyDescriptor(new PropertyController() {
public Object getProperty() {
return m_node.getTypeOfNode();
}
public Image getImage() {
return getImageForNode(node);
}
}, P_ELEMENT_DISPLAY_STEPTYPE);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
if (StringUtils.isNotBlank(node.getComment())) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return node.getComment();
}
}, P_ELEMENT_DISPLAY_CAPCOMMENT);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
}
if (StringUtils.isNotBlank(m_node.getTaskId())) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return m_node.getTaskId();
}
}, Messages.AbstractGuiNodePropertySourceTaskId);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
}
}
/**
*
* @param testResult The Test Result for which to display the Parameters.
*/
private void initParameterDescriptor(TestResultNode testResult) {
if (testResult.getNode() instanceof ICondStructPO) {
// CondStructPO's store their Negated flag as a fake Parameter
return;
}
for (final TestResultParameter parameter : testResult.getParameters()) {
PropertyDescriptor propDesc = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return parameter.getValue();
}
},
NLS.bind(
Messages.TestResultNodePropertySourceDataParameter,
parameter.getName()));
propDesc.setCategory(P_DATA_CAT);
addPropertyDescriptor(propDesc);
}
}
/**
* retrieves the Image for NodePO
* @param node
* NodePO
* @return
* Image
*/
private Image getImageForNode(final INodePO node) {
Image image = null;
if (node instanceof ITestSuitePO) {
image = IconConstants.TS_IMAGE;
}
if (node instanceof IExecTestCasePO) {
if (node instanceof IEventExecTestCasePO) {
image = IconConstants.RESULT_EH_IMAGE;
} else {
image = IconConstants.TC_IMAGE;
}
}
if (node instanceof ICapPO) {
TestResultNode parent = m_node.getParent();
if (parent.getNode() instanceof IEventExecTestCasePO) {
image = IconConstants.EH_CAP_IMAGE;
} else {
image = IconConstants.CAP_IMAGE;
}
}
if (node instanceof IConditionalStatementPO) {
image = IconConstants.CONDITION;
}
if (node instanceof IAbstractContainerPO) {
image = IconConstants.CAP_IMAGE;
}
return image;
}
/**
*/
private void initResultDetailsPropDesc() {
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return m_node.getStatusString();
}
public Image getImage() {
int status = m_node.getStatus();
switch (status) {
case TestResultNode.SUCCESS:
return IconConstants.STEP_OK_IMAGE;
case TestResultNode.ERROR:
case TestResultNode.ERROR_IN_CHILD:
case TestResultNode.CONDITION_FAILED:
case TestResultNode.INFINITE_LOOP:
return IconConstants.STEP_NOT_OK_IMAGE;
case TestResultNode.RETRYING:
return IconConstants.STEP_RETRY_IMAGE;
case TestResultNode.SUCCESS_RETRY:
return IconConstants.STEP_RETRY_OK_IMAGE;
case TestResultNode.ABORT:
return IconConstants.STEP_NOT_OK_IMAGE;
case TestResultNode.NOT_YET_TESTED:
case TestResultNode.NOT_TESTED:
case TestResultNode.TESTING:
case TestResultNode.NO_VERIFY:
default:
return null;
}
}
}, P_ELEMENT_DISPLAY_STEPSTATUS);
propDes.setCategory(P_TESTRESULT_CAT);
addPropertyDescriptor(propDes);
}
/**
*
* @param testResult The Test Result for which to display the
* Component Name information.
*/
private void initComponentNameDetailsPropDescriptor(
TestResultNode testResult) {
PropertyDescriptor propDes;
final String componentName = testResult.getComponentName();
if (componentName != null) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return componentName;
}
}, P_ELEMENT_DISPLAY_COMPNAME);
propDes.setCategory(P_CAP_CAT);
addPropertyDescriptor(propDes);
}
final String componentType = testResult.getComponentType();
if (componentType != null) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return componentType;
}
}, P_ELEMENT_DISPLAY_COMPTYPE);
propDes.setCategory(P_CAP_CAT);
addPropertyDescriptor(propDes);
}
final double match = testResult.getOmHeuristicEquivalence();
if (match >= 0) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return NumberFormat
.getPercentInstance().format(match);
}
}, P_ELEMENT_DISPLAY_COMP_MATCH);
propDes.setCategory(P_CAP_CAT);
addPropertyDescriptor(propDes);
}
}
/**
* @param testResult The Test Result for which to display the Action
* details.
*/
private void initActionDetailsPropDescriptor(TestResultNode testResult) {
PropertyDescriptor propDes;
final String actionName = testResult.getActionName();
if (actionName != null) {
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return actionName;
}
}, P_ELEMENT_DISPLAY_ACTIONTYPE);
propDes.setCategory(P_CAP_CAT);
addPropertyDescriptor(propDes);
}
}
/**
*
*/
private void initErrorEventPropDescriptor() {
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return I18n.getString(m_node
.getEvent().getId());
}
}, P_ELEMENT_DISPLAY_ERRORTYPE);
propDes.setCategory(P_TESTERROR_CAT);
addPropertyDescriptor(propDes);
final TestErrorEvent event = m_node.getEvent();
if (event.getId().equals(TestErrorEvent.ID.VERIFY_FAILED)) {
Set keys = event.getProps().keySet();
for (final Object key : keys) {
propDes = new PropertyDescriptor(new PropertyController() {
public Object getProperty() {
return event.getProps().get(key);
}
}, I18n.getString((String)key));
propDes.setCategory(P_TESTERROR_CAT);
addPropertyDescriptor(propDes);
}
} else if (event.getProps().keySet().contains(
TestErrorEvent.Property.DESCRIPTION_KEY)) {
propDes = new PropertyDescriptor(new PropertyController() {
public Object getProperty() {
String key = (String)event.getProps().get(
TestErrorEvent.Property.DESCRIPTION_KEY);
Object[] args = (Object[])event.getProps().get(
TestErrorEvent.Property.PARAMETER_KEY);
/*
* Ugly solution for an old problem: TestErrorEvents store their description as
* DESCRIPTION_KEY: I18nKEY, PARAMETER_KEY: parameters
* However, the TestResultViewer.generateTestErrorEvent method puts the
* I18n VALUE instead of the KEY into the DESCRIPTION_KEY field
* Until a fix is found (which might involve a lot of changes), to avoid filling the log with junk,
* I turned off logging here
* This is also necessary because the saved TestResultPO's are beyond repair, and they will
* keep generating error at this point...
*/
if (args != null) {
return I18n.getStringWithoutErrorReport(key, args);
}
return I18n.getStringWithoutErrorReport(key, true);
}
}, I18n.getString(TestErrorEvent.Property.DESCRIPTION_KEY));
propDes.setCategory(P_TESTERROR_CAT);
addPropertyDescriptor(propDes);
}
}
/**
* @param node
* NodePO
*/
private void initEventTestCasePropDescriptor(final INodePO node) {
final IEventExecTestCasePO tc = (IEventExecTestCasePO) node;
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return I18n.getString(tc.getEventType());
}
}, Messages.TestResultNodePropertySourceErrorType);
propDes.setCategory(
Messages.TestResultNodeGUIPropertySourceEventhandler);
addPropertyDescriptor(propDes);
propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return tc.getReentryProp();
}
}, Messages.TestResultNodeGUIPropertySourceReentry);
propDes.setCategory(
Messages.TestResultNodeGUIPropertySourceEventhandler);
addPropertyDescriptor(propDes);
}
/**
* @param node the Cond Struct
*/
private void initCondStructPropDescriptor(final ICondStructPO node) {
PropertyDescriptor propDes = new PropertyDescriptor(
new PropertyController() {
public Object getProperty() {
return node.isNegate();
}
}, Messages.TestResultNodeGUIPropertySourceNegated);
propDes.setCategory(P_TESTSTEP_CAT);
addPropertyDescriptor(propDes);
}
/**
* Base class to control properties
*
* @author BREDEX GmbH
* @created 07.01.2005
*/
private abstract class PropertyController implements IPropertyController {
/** {@inheritDoc} */
public boolean setProperty(Object value) {
return true; // readonly
}
/** {@inheritDoc} */
public abstract Object getProperty();
/** {@inheritDoc} */
public Image getImage() {
return null;
}
}
/** {@inheritDoc} */
public Object getEditableValue() {
return "noEditableValues"; //$NON-NLS-1$
}
/** {@inheritDoc} */
public boolean isPropertySet(Object arg0) {
// Do nothing
return false;
}
/** {@inheritDoc} */
public void resetPropertyValue(Object arg0) {
// Do nothing
}
/**
* {@inheritDoc}
*/
public void setPropertyValue(Object arg0, Object arg1) {
// Do nothing
}
}