/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.jmeter.samplers; import java.io.Serializable; import java.util.Arrays; import org.apache.jmeter.threads.JMeterVariables; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.util.JMeterError; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Packages information regarding the target of a sample event, such as the * result from that event and the thread group it ran in. */ public class SampleEvent implements Serializable { private static final Logger log = LoggerFactory.getLogger(SampleEvent.class); private static final long serialVersionUID = 233L; /** The property {@value} is used to define additional variables to be saved */ public static final String SAMPLE_VARIABLES = "sample_variables"; // $NON-NLS-1$ public static final String HOSTNAME; // List of variable names to be saved in JTL files private static volatile String[] variableNames = new String[0]; // The values. Entries may be null, but there will be the correct number. private final String[] values; // The hostname cannot change during a run, so safe to cache it just once static { HOSTNAME=JMeterUtils.getLocalHostName(); initSampleVariables(); } /** * Set up the additional variable names to be saved * from the value in the {@link #SAMPLE_VARIABLES} property */ public static void initSampleVariables() { String vars = JMeterUtils.getProperty(SAMPLE_VARIABLES); variableNames=vars != null ? vars.split(",") : new String[0]; if (log.isInfoEnabled()) { log.info("List of sample_variables: {}", Arrays.toString(variableNames)); } } private final SampleResult result; private final String threadGroup; // TODO appears to duplicate the threadName field in SampleResult private final String hostname; private final boolean isTransactionSampleEvent; /** * Constructor used for Unit tests only. Uses <code>null</code> for the * associated {@link SampleResult} and the <code>threadGroup</code>-name. */ public SampleEvent() { this(null, null); } /** * Creates SampleEvent without saving any variables. * <p> * Use by {@link org.apache.jmeter.protocol.http.proxy.ProxyControl * ProxyControl} and {@link StatisticalSampleSender}. * * @param result * The SampleResult to be associated with this event * @param threadGroup * The name of the thread, the {@link SampleResult} was recorded */ public SampleEvent(SampleResult result, String threadGroup) { this(result, threadGroup, HOSTNAME, false); } /** * Constructor used for normal samples, saves variable values if any are * defined. * * @param result * The SampleResult to be associated with this event * @param threadGroup * The name of the thread, the {@link SampleResult} was recorded * @param jmvars * the {@link JMeterVariables} of the thread, the * {@link SampleResult} was recorded */ public SampleEvent(SampleResult result, String threadGroup, JMeterVariables jmvars) { this(result, threadGroup, jmvars, false); } /** * Only intended for use when loading results from a file. * * @param result * The SampleResult to be associated with this event * @param threadGroup * The name of the thread, the {@link SampleResult} was recorded * @param hostname * The name of the host, for which the {@link SampleResult} was * recorded */ public SampleEvent(SampleResult result, String threadGroup, String hostname) { this(result, threadGroup, hostname, false); } private SampleEvent(SampleResult result, String threadGroup, String hostname, boolean isTransactionSampleEvent) { this.result = result; this.threadGroup = threadGroup; this.hostname = hostname; this.values = new String[variableNames.length]; this.isTransactionSampleEvent = isTransactionSampleEvent; } /** * @param result * The SampleResult to be associated with this event * @param threadGroup * The name of the thread, the {@link SampleResult} was recorded * @param jmvars * the {@link JMeterVariables} of the thread, the * {@link SampleResult} was recorded * @param isTransactionSampleEvent * Flag whether this event is an transaction sample event */ public SampleEvent(SampleResult result, String threadGroup, JMeterVariables jmvars, boolean isTransactionSampleEvent) { this(result, threadGroup, HOSTNAME, isTransactionSampleEvent); saveVars(jmvars); } private void saveVars(JMeterVariables vars){ for(int i = 0; i < variableNames.length; i++){ values[i] = vars.get(variableNames[i]); } } /** * Get the number of defined variables * * @return the number of variables defined */ public static int getVarCount(){ return variableNames.length; } /** * Get the nth variable name (zero-based) * * @param i * specifies which variable name should be returned (zero-based) * @return the variable name of the nth variable */ public static String getVarName(int i){ return variableNames[i]; } /** * Get the nth variable value (zero-based) * * @param i * specifies which variable value should be returned (zero-based) * @return the value of the nth variable * @throws JMeterError * when an invalid index <code>i</code> was given */ public String getVarValue(int i){ try { return values[i]; } catch (ArrayIndexOutOfBoundsException e) { throw new JMeterError("Check the sample_variable settings!", e); } } /** * Get the {@link SampleResult} associated with this event * * @return the associated {@link SampleResult} */ public SampleResult getResult() { return result; } /** * Get the name of the thread group for which this event was recorded * * @return the name of the thread group */ public String getThreadGroup() { return threadGroup; } /** * Get the name of the host for which this event was recorded * * @return the name of the host */ public String getHostname() { return hostname; } /** * @return the isTransactionSampleEvent */ public boolean isTransactionSampleEvent() { return isTransactionSampleEvent; } }