blob: 401b109497f5d63a7290cd8c6bccffe32ab3229e [file] [log] [blame]
/*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.netbeans.jemmy.util;
import java.util.StringTokenizer;
import org.netbeans.jemmy.operators.Operator.DefaultStringComparator;
import org.netbeans.jemmy.operators.Operator.StringComparator;
/**
*
* Implementation of org.netbeans.jemmy.ComponentChooser interface. Class can be
* used to find component by its field/methods values converted to String.<br>
*
* Example:
* <pre>
* JLabel label = JLabelOperator.findJLabel(frm0, new StringPropChooser("getText=JLabel",
* false, true));
* </pre>
*
* @author Alexandre Iline (alexandre.iline@oracle.com)
*/
public class StringPropChooser extends PropChooser {
private StringComparator comparator;
/**
* Constructs a StringPropChooser object.
*
* @param propNames Names of methods/fields
* @param params Parameters values for methods. <BR>
* @param classes Parameters classes.
* @param results Objects to compare converted to String method/field values
* to.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String[] propNames,
Object[][] params,
Class<?>[][] classes,
String[] results,
StringComparator comparator) {
super(propNames, params, classes, results);
this.comparator = comparator;
}
/**
* Constructs a StringPropChooser object.
*
* @param propNames Names of methods/fields
* @param params Parameters values for methods. <BR>
* @param classes Parameters classes.
* @param results Objects to compare converted to String method/field values
* to.
* @param ce Compare exactly.<BR>
* If true, compare exactly (<value>.toString().equals(<result>)) <BR>
* If false, compare as substring (<value>.toString().indexOf(<result>) !=
* -1)
* @param ccs Compare case sensitive. <BR>
* if false convert both <value>.toString() and <result> to uppercase before
* comparison.
*/
public StringPropChooser(String[] propNames,
Object[][] params,
Class<?>[][] classes,
String[] results,
boolean ce,
boolean ccs) {
this(propNames, params, classes, results, new DefaultStringComparator(ce, ccs));
}
/**
* Constructs a StringPropChooser object.
*
* @param propNames Names of methods/fields
* @param results Objects to compare converted to String method/field values
* to.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String[] propNames,
String[] results,
StringComparator comparator) {
this(propNames, (Object[][]) null, (Class<?>[][]) null, results, comparator);
}
/**
* Constructs a StringPropChooser object.
*
* @param propNames Names of methods/fields
* @param results Objects to compare converted to String method/field values
* to.
* @param ce Compare exactly.
* @param ccs Compare case sensitive.
* @deprecated Use constructors with {@code StringComparator}
* parameters.
*/
@Deprecated
public StringPropChooser(String[] propNames,
String[] results,
boolean ce,
boolean ccs) {
this(propNames, (Object[][]) null, (Class<?>[][]) null, results, ce, ccs);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values <BR>
* Like "getText=button;isVisible=true"
* @param semicolonChar Method(field) names separator.
* @param equalChar Method(field) name - expected value separator.
* @param params Parameters values for methods.
* @param classes Parameters classes.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String props,
String semicolonChar,
String equalChar,
Object[][] params,
Class<?>[][] classes,
StringComparator comparator) {
this(cutToArray(props, semicolonChar, equalChar, true), params, classes,
cutToArray(props, semicolonChar, equalChar, false), comparator);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values <BR>
* Like "getText=button;isVisible=true"
* @param semicolonChar Method(field) names separator.
* @param equalChar Method(field) name - expected value separator.
* @param params Parameters values for methods.
* @param classes Parameters classes.
* @param ce Compare exactly.
* @param ccs Compare case sensitive.
* @deprecated Use constructors with {@code StringComparator}
* parameters.
*/
@Deprecated
public StringPropChooser(String props,
String semicolonChar,
String equalChar,
Object[][] params,
Class<?>[][] classes,
boolean ce,
boolean ccs) {
this(cutToArray(props, semicolonChar, equalChar, true), params, classes,
cutToArray(props, semicolonChar, equalChar, false), ce, ccs);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values
* @param semicolonChar Method(field) names separator.
* @param equalChar Method(field) name - expected value separator.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String props,
String semicolonChar,
String equalChar,
StringComparator comparator) {
this(props, semicolonChar, equalChar, (Object[][]) null, (Class<?>[][]) null, comparator);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values
* @param semicolonChar Method(field) names separator.
* @param equalChar Method(field) name - expected value separator.
* @param ce Compare exactly.
* @param ccs Compare case sensitive.
* @deprecated Use constructors with {@code StringComparator}
* parameters.
*/
@Deprecated
public StringPropChooser(String props,
String semicolonChar,
String equalChar,
boolean ce,
boolean ccs) {
this(props, semicolonChar, equalChar, (Object[][]) null, (Class<?>[][]) null, ce, ccs);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values <BR>
* ";" is used as a method(field) names separator. <BR>
* "=" is used as a method(field) name - expected value separator.
* @param params Parameters values for methods.
* @param classes Parameters classes.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String props,
Object[][] params,
Class<?>[][] classes,
StringComparator comparator) {
this(props, ";", "=", params, classes, comparator);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values <BR>
* ";" is used as a method(field) names separator. <BR>
* "=" is used as a method(field) name - expected value separator.
* @param params Parameters values for methods.
* @param classes Parameters classes.
* @param ce Compare exactly.
* @param ccs Compare case sensitive.
* @deprecated Use constructors with {@code StringComparator}
* parameters.
*/
@Deprecated
public StringPropChooser(String props,
Object[][] params,
Class<?>[][] classes,
boolean ce,
boolean ccs) {
this(props, ";", "=", params, classes, ce, ccs);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values ";" is used as a method(field)
* names separator. <BR>
* "=" is used as a method(field) name - expected value separator.
* @param comparator Defines string comparision criteria.
*/
public StringPropChooser(String props,
StringComparator comparator) {
this(props, (Object[][]) null, (Class<?>[][]) null, comparator);
}
/**
* Constructs a StringPropChooser object.
*
* @param props Method/field names && values ";" is used as a method(field)
* names separator. <BR>
* "=" is used as a method(field) name - expected value separator.
* @param ce Compare exactly.
* @param ccs Compare case sensitive.
* @deprecated Use constructors with {@code StringComparator}
* parameters.
*/
@Deprecated
public StringPropChooser(String props,
boolean ce,
boolean ccs) {
this(props, (Object[][]) null, (Class<?>[][]) null, ce, ccs);
}
/**
* @see org.netbeans.jemmy.ComponentChooser
*/
@Override
public String getDescription() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < propNames.length; i++) {
if (result.length() > 0) {
result.append(';');
}
result.append(propNames[i]).append('=').append((String) results[i]);
}
return "Component by properties array\n : " + result;
}
@Override
public String toString() {
return "StringPropChooser{description = " + getDescription() + ", comparator=" + comparator + '}';
}
/**
* Method to check property. Compares "value".toString() to (String)etalon
* according ce and ccs constructor parameters.
*
* @param value Method/field value
* @param etalon Object to compare to.
* @return true if the value matches the etalon.
*/
@Override
protected boolean checkProperty(Object value, Object etalon) {
return comparator.equals(value.toString(), (String) etalon);
}
/*split string to array*/
private static String[] cutToArray(String resources, String semicolon, String equal, boolean names) {
StringTokenizer token = new StringTokenizer(resources, semicolon);
String[] props = new String[token.countTokens()];
String nextProp;
int ind = 0;
while (token.hasMoreTokens()) {
nextProp = token.nextToken();
StringTokenizer subtoken = new StringTokenizer(nextProp, equal);
if (subtoken.countTokens() == 2) {
props[ind] = subtoken.nextToken();
if (!names) {
props[ind] = subtoken.nextToken();
}
} else {
props[ind] = null;
}
ind++;
}
return props;
}
}