001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.jmeter.functions;
020:
021: import java.io.Serializable;
022: import java.util.Collection;
023: import java.util.LinkedList;
024: import java.util.List;
025:
026: import org.apache.jmeter.engine.util.CompoundVariable;
027: import org.apache.jmeter.samplers.SampleResult;
028: import org.apache.jmeter.samplers.Sampler;
029: import org.apache.jmeter.util.JMeterUtils;
030: import org.apache.jorphan.logging.LoggingManager;
031: import org.apache.log.Logger;
032:
033: // @see org.apache.jmeter.functions.PackageTest for unit tests
034:
035: /**
036: * The function represented by this class allows data to be read from XML files.
037: * Syntax is similar to the CVSRead function. The function allows the test to
038: * line-thru the nodes in the XML file - one node per each test. E.g. inserting
039: * the following in the test scripts :
040: *
041: * ${_XPath(c:/BOF/abcd.xml,/xpath/)} // match the (first) node
042: * ${_XPath(c:/BOF/abcd.xml,/xpath/)} // Go to next match of '/xpath/' expression
043: *
044: * NOTE: A single instance of each different file/expression combination
045: * is opened and used for all threads.
046: *
047: */
048: public class XPath extends AbstractFunction implements Serializable {
049: private static final Logger log = LoggingManager
050: .getLoggerForClass();
051:
052: // static {
053: // LoggingManager.setPriority("DEBUG","jmeter");
054: // LoggingManager.setTarget(new java.io.PrintWriter(System.out));
055: // }
056: private static final String KEY = "__XPath"; // Function name //$NON-NLS-1$
057:
058: private static final List desc = new LinkedList();
059:
060: private Object[] values; // Parameter list
061:
062: static {
063: desc.add(JMeterUtils.getResString("xpath_file_file_name")); //$NON-NLS-1$
064: desc.add(JMeterUtils.getResString("xpath_expression")); //$NON-NLS-1$
065: }
066:
067: public XPath() {
068: }
069:
070: public Object clone() throws CloneNotSupportedException {
071: return super .clone();
072: }
073:
074: /**
075: * @see org.apache.jmeter.functions.Function#execute(SampleResult, Sampler)
076: */
077: public synchronized String execute(SampleResult previousResult,
078: Sampler currentSampler) throws InvalidVariableException {
079: String myValue = ""; //$NON-NLS-1$
080:
081: String fileName = ((org.apache.jmeter.engine.util.CompoundVariable) values[0])
082: .execute();
083: String xpathString = ((org.apache.jmeter.engine.util.CompoundVariable) values[1])
084: .execute();
085:
086: if (log.isDebugEnabled()) {
087: log.debug("execute (" + fileName + " " + xpathString
088: + ") ");
089: }
090:
091: myValue = XPathWrapper.getXPathString(fileName, xpathString);
092:
093: if (log.isDebugEnabled()) {
094: log.debug("execute value: " + myValue);
095: }
096:
097: return myValue;
098: }
099:
100: /**
101: * @see org.apache.jmeter.functions.Function#getArgumentDesc()
102: */
103: public List getArgumentDesc() {
104: return desc;
105: }
106:
107: /**
108: * @see org.apache.jmeter.functions.Function#getReferenceKey()
109: */
110: public String getReferenceKey() {
111: return KEY;
112: }
113:
114: /**
115: * @see org.apache.jmeter.functions.Function#setParameters(Collection)
116: */
117: public synchronized void setParameters(Collection parameters)
118: throws InvalidVariableException {
119: log
120: .debug("setParameter - Collection.size="
121: + parameters.size());
122:
123: values = parameters.toArray();
124:
125: if (log.isDebugEnabled()) {
126: for (int i = 0; i < parameters.size(); i++) {
127: log.debug("i:"
128: + ((CompoundVariable) values[i]).execute());
129: }
130: }
131:
132: if (values.length != 2) {
133: throw new InvalidVariableException(
134: "Wrong number of parameters; 2 != " + values.length);
135: }
136:
137: /*
138: * Need to reset the containers for repeated runs; about the only way
139: * for functions to detect that a run is starting seems to be the
140: * setParameters() call.
141: */
142: XPathWrapper.clearAll();// TODO only clear the relevant entry - if possible...
143:
144: }
145: }
|