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.threads.JMeterVariables;
030: import org.apache.jorphan.logging.LoggingManager;
031: import org.apache.jorphan.util.JOrphanUtils;
032: import org.apache.log.Logger;
033:
034: // @see org.apache.jmeter.functions.PackageTest for unit tests
035:
036: /**
037: * Function to log a message
038: *
039: * Parameters: - string - log level (optional; defaults to INFO; or DEBUG if
040: * unrecognised) - throwable message (optional)
041: *
042: * Returns: - the input string
043: *
044: * @version $Revision: 539775 $ Updated: $Date: 2007-05-19 18:01:40 +0100 (Sat, 19 May 2007) $
045: */
046: public class SplitFunction extends AbstractFunction implements
047: Serializable {
048: private static Logger log = LoggingManager.getLoggerForClass();
049:
050: private static final List desc = new LinkedList();
051:
052: private static final String KEY = "__split";// $NON-NLS-1$
053:
054: // Number of parameters expected - used to reject invalid calls
055: private static final int MIN_PARAMETER_COUNT = 2;
056:
057: private static final int MAX_PARAMETER_COUNT = 3;
058: static {
059: desc.add("String to split");
060: desc.add("Variable name");
061: desc.add("Split character (omit for ',')");
062: }
063:
064: private Object[] values;
065:
066: public SplitFunction() {
067: }
068:
069: public Object clone() throws CloneNotSupportedException {
070: return super .clone();
071: }
072:
073: public synchronized String execute(SampleResult previousResult,
074: Sampler currentSampler) throws InvalidVariableException {
075: JMeterVariables vars = getVariables();
076:
077: String stringToSplit = ((CompoundVariable) values[0]).execute();
078: String varNamePrefix = ((CompoundVariable) values[1]).execute();
079: String splitString = ",";
080:
081: if (values.length > 2) { // Split string provided
082: splitString = ((CompoundVariable) values[2]).execute();
083: }
084: if (log.isDebugEnabled()) {
085: log.debug("Split " + stringToSplit + " using "
086: + splitString + " into " + varNamePrefix);
087: }
088: String parts[] = JOrphanUtils.split(stringToSplit, splitString,
089: "?");// $NON-NLS-1$
090:
091: vars.put(varNamePrefix, stringToSplit);
092: vars.put(varNamePrefix + "_n", "" + parts.length);// $NON-NLS-1$ // $NON-NLS-2$
093: for (int i = 1; i <= parts.length; i++) {
094: if (log.isDebugEnabled()) {
095: log.debug(parts[i - 1]);
096: }
097: vars.put(varNamePrefix + "_" + i, parts[i - 1]);// $NON-NLS-1$
098: }
099: vars.remove(varNamePrefix + "_" + (parts.length + 1));
100: return stringToSplit;
101:
102: }
103:
104: public synchronized void setParameters(Collection parameters)
105: throws InvalidVariableException {
106:
107: values = parameters.toArray();
108:
109: if ((values.length < MIN_PARAMETER_COUNT)
110: || (values.length > MAX_PARAMETER_COUNT)) {
111: throw new InvalidVariableException(
112: "Parameter Count not between "
113: + MIN_PARAMETER_COUNT + " & "
114: + MAX_PARAMETER_COUNT);
115: }
116:
117: }
118:
119: public String getReferenceKey() {
120: return KEY;
121: }
122:
123: public List getArgumentDesc() {
124: return desc;
125: }
126:
127: }
|