/******************************************************************************* * 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.rcp.search.query; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jubula.client.core.businessprocess.TestDataCubeBP; import org.eclipse.jubula.client.core.model.IDataSetPO; import org.eclipse.jubula.client.core.model.INodePO; import org.eclipse.jubula.client.core.model.IParamDescriptionPO; import org.eclipse.jubula.client.core.model.IParamNodePO; import org.eclipse.jubula.client.core.model.IParameterInterfacePO; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.core.model.ITDManager; import org.eclipse.jubula.client.core.model.ITestDataCubePO; import org.eclipse.jubula.client.core.persistence.GeneralStorage; import org.eclipse.jubula.client.core.utils.ModelParamValueConverter; import org.eclipse.jubula.client.ui.constants.Constants; import org.eclipse.jubula.client.ui.rcp.search.data.SearchOptions; import org.eclipse.jubula.client.ui.rcp.search.data.TypeName; /** * Test data value search query for values of nodes in Test Suite Browser or * Test Case Browsers including the central test data. * @author BREDEX GmbH * @created Apr 29, 2013 */ public class TestDataQuery extends AbstractTraverserQuery { /** * @param searchData The search data to use for this query. */ public TestDataQuery(SearchOptions searchData) { super(searchData, Constants.JB_DATASET_VIEW_ID); } /** * Search in the whole project or in selected nodes for test data using the * {@link TextFinder} depending on the {@link SearchOptions} given * to the constructor. * {@inheritDoc} */ public IStatus run(IProgressMonitor monitor) { setMonitor(monitor); // search in nodes traverse(); // calls operate() if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } // search in central test data searchInCentralTestData(collectCentralTestData()); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } finished(); return Status.OK_STATUS; } /** * Add the given node to the result, if it has the matching type and * one or more test data values contain the search string. * {@inheritDoc} */ protected boolean operate(INodePO node) { if (node instanceof IParamNodePO) { // found node with parameters if (matchingSearchType(node)) { // found node with matching type IParamNodePO paramNode = (IParamNodePO) node; if (containsTestDataValue(paramNode)) { // found node with test data value, which contains search string add((INodePO) paramNode); // add node to result list } } } return true; } /** * Collect central test data. * @return The collected set of central test data. */ private Set<IParameterInterfacePO> collectCentralTestData() { List<TypeName> types = getSearchOptions() .getSelectedSearchableTypes(); IProgressMonitor monitor = getMonitor(); monitor.beginTask( "Collecting central test data elements...", types.size()); //$NON-NLS-1$ Set<IParameterInterfacePO> centralTestData = new HashSet<IParameterInterfacePO>(); for (TypeName type : types) { Class searchType = type.getType(); if (!INodePO.class.isAssignableFrom(searchType) && ITestDataCubePO.class.isAssignableFrom(searchType)) { IProjectPO cProject = GeneralStorage.getInstance().getProject(); centralTestData.addAll(Arrays.asList( TestDataCubeBP.getAllTestDataCubesFor(cProject))); } monitor.worked(1); if (monitor.isCanceled()) { break; } } return centralTestData; } /** * Search in central test data. * @param centralTestData The set of central test data. */ private void searchInCentralTestData( Set<IParameterInterfacePO> centralTestData) { IProgressMonitor monitor = getMonitor(); for (IParameterInterfacePO testDataCube : centralTestData) { if (containsTestDataValue(testDataCube)) { add(testDataCube); } monitor.worked(1); if (monitor.isCanceled()) { return; } } } /** * @param paramObj * the param obj to search the test data value in * @return true if value has been found for this node; false otherwise */ private boolean containsTestDataValue(IParameterInterfacePO paramObj) { List<IParamDescriptionPO> usedParameters = paramObj.getParameterList(); IParameterInterfacePO refDataCube = paramObj.getReferencedDataCube(); ITDManager testDataManager = paramObj.getDataManager(); for (IDataSetPO dataSet : testDataManager.getDataSets()) { for (IParamDescriptionPO paramDesc : usedParameters) { int column = testDataManager.findColumnForParam(paramDesc .getUniqueId()); if (refDataCube != null) { IParamDescriptionPO dataCubeParam = refDataCube .getParameterForName(paramDesc.getName()); if (dataCubeParam != null) { column = testDataManager .findColumnForParam( dataCubeParam.getUniqueId()); } } if (column != -1 && column < dataSet.getColumnCount()) { String testData = dataSet.getValueAt(column); if (testData != null) { ModelParamValueConverter converter = new ModelParamValueConverter( testData, paramObj, null); String value = converter.getGuiString(); if (value != null && matchSearchString(value)) { return true; } } } } } return false; } }