01: package com.canoo.webtest.extension.applet;
02:
03: import java.util.ArrayList;
04: import java.util.Iterator;
05: import java.util.List;
06: import java.util.regex.Matcher;
07: import java.util.regex.Pattern;
08:
09: import org.apache.commons.collections.MapIterator;
10: import org.apache.commons.collections.iterators.EntrySetMapIterator;
11:
12: import com.canoo.webtest.steps.Step;
13:
14: /**
15: * @author Denis N. Antonioli
16: */
17: public class ParameterSet {
18: public static final Pattern PATTERN_SLASH_DIGITS;
19:
20: private final List fParameters = new ArrayList();
21:
22: static {
23: PATTERN_SLASH_DIGITS = Pattern.compile("\\\\\\d+");
24: }
25:
26: public void expandProperties(final Step step) {
27: final List expandedParam = new ArrayList();
28: for (Iterator iterator = fParameters.iterator(); iterator
29: .hasNext();) {
30: final Object obj = iterator.next();
31: if (obj instanceof Parameter) {
32: final Parameter param = (Parameter) obj;
33: param.setName(step.getProject().replaceProperties(
34: param.getName()));
35: param.setValue(step.getProject().replaceProperties(
36: param.getValue()));
37: } else {
38: iterator.remove();
39: final ParameterRef param = (ParameterRef) obj;
40: param.setName(step.getProject().replaceProperties(
41: param.getName()));
42: param.setRegex(step.getProject().replaceProperties(
43: param.getRegex()));
44: expandedParam.addAll(addMatchedParameters(step, param));
45: }
46: }
47: // add here, so as not to expand the matched properties?
48: fParameters.addAll(expandedParam);
49: }
50:
51: static List addMatchedParameters(final Step step,
52: final ParameterRef paramRef) {
53: final List expandedParam = new ArrayList();
54: final Pattern pattern = Pattern.compile(paramRef.getRegex());
55: for (MapIterator iterator = new EntrySetMapIterator(step
56: .getWebtestProperties(paramRef.getPropertyType())); iterator
57: .hasNext();) {
58: final Matcher matcher = pattern.matcher((String) iterator
59: .next());
60: if (matcher.matches()) {
61: expandedParam.add(new Parameter(replaceGroups(paramRef
62: .getName(), matcher), (String) iterator
63: .getValue()));
64: }
65: }
66: return expandedParam;
67: }
68:
69: static String replaceGroups(final String name,
70: final Matcher allSubstitutions) {
71: final StringBuffer sb = new StringBuffer();
72:
73: final Matcher nameMatcher = PATTERN_SLASH_DIGITS.matcher(name);
74: while (nameMatcher.find()) {
75: final String matched = nameMatcher.group();
76: final int i = Integer.parseInt(matched.substring(1));
77: nameMatcher.appendReplacement(sb, i > allSubstitutions
78: .groupCount() ? ("\\" + matched) : allSubstitutions
79: .group(i));
80: }
81: nameMatcher.appendTail(sb);
82:
83: return sb.toString();
84: }
85:
86: public void add(final Parameter param) {
87: fParameters.add(param);
88: }
89:
90: public void add(final ParameterRef param) {
91: fParameters.add(param);
92: }
93:
94: public Iterator iterator() {
95: return fParameters.iterator();
96: }
97: }
|