/*******************************************************************************
* 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.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jubula.client.core.model.INodePO;
import org.eclipse.jubula.client.ui.rcp.search.data.FieldName;
import org.eclipse.jubula.client.ui.rcp.search.data.SearchOptions;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
/**
* Keyword search query for names of nodes in Test Suite Browser or
* Test Case Browsers.
* @author BREDEX GmbH
* @created Aug 9, 2010
*/
public class KeywordQuery extends AbstractTraverserQuery {
/**
* @param searchData The search data to use for this query.
*/
public KeywordQuery(SearchOptions searchData) {
super(searchData, null);
}
/**
* Search in the whole project or in selected nodes for keywords using the
* {@link TextFinder} depending on the {@link SearchOptions} given
* to the constructor.
* {@inheritDoc}
*/
public IStatus run(IProgressMonitor monitor) {
setMonitor(monitor);
traverse();
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
* the name contains the search string.
* {@inheritDoc}
*/
protected boolean operate(INodePO node) {
FieldName[] searchableFieldNames = getSearchOptions()
.getSearchableFieldNames();
if (matchingSearchType(node)) {
for (FieldName field : searchableFieldNames) {
if (field.isSelected()) {
try {
String fieldValue = StringUtils.defaultString(
BeanUtils.getProperty(node, field.getName()),
StringConstants.EMPTY);
if (matchSearchString(fieldValue)) {
// found node with keyword and correct type
add(node);
}
} catch (IllegalAccessException | InvocationTargetException
| NoSuchMethodException e) {
// ignore and continue
}
}
}
}
return true;
}
}