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.jorphan.logging.LoggingManager;
030: import org.apache.log.Logger;
031: import org.apache.log.Priority;
032:
033: /**
034: * Function to log a message
035: *
036: * Parameters: - string - log level (optional; defaults to INFO; or DEBUG if
037: * unrecognised) - throwable message (optional)
038: *
039: * Returns: - the input string
040: *
041: */
042: public class LogFunction extends AbstractFunction implements
043: Serializable {
044: private static Logger log = LoggingManager.getLoggerForClass();
045:
046: private static final List desc = new LinkedList();
047:
048: private static final String KEY = "__log"; //$NON-NLS-1$
049:
050: // Number of parameters expected - used to reject invalid calls
051: private static final int MIN_PARAMETER_COUNT = 1;
052:
053: private static final int MAX_PARAMETER_COUNT = 3;
054: static {
055: desc.add("String to be logged");
056: desc.add("Log level (default INFO)");
057: desc.add("Throwable text (optional)");
058: }
059:
060: private static final String DEFAULT_PRIORITY = "INFO"; //$NON-NLS-1$
061:
062: private Object[] values;
063:
064: public LogFunction() {
065: }
066:
067: public Object clone() throws CloneNotSupportedException {
068: return super .clone();
069: }
070:
071: public synchronized String execute(SampleResult previousResult,
072: Sampler currentSampler) throws InvalidVariableException {
073: String stringToLog = ((CompoundVariable) values[0]).execute();
074:
075: String priorityString;
076: if (values.length > 1) { // We have a default
077: priorityString = ((CompoundVariable) values[1]).execute();
078: if (priorityString.length() == 0)
079: priorityString = DEFAULT_PRIORITY;
080: } else {
081: priorityString = DEFAULT_PRIORITY;
082: }
083:
084: Throwable t = null;
085: if (values.length > 2) { // Throwable wanted
086: t = new Throwable(((CompoundVariable) values[2]).execute());
087: }
088:
089: logDetails(log, stringToLog, priorityString, t);
090:
091: return stringToLog;
092:
093: }
094:
095: // Common output function
096: private static void printDetails(java.io.PrintStream ps, String s,
097: Throwable t) {
098: String tn = Thread.currentThread().getName();
099: if (t != null) {
100: ps.print("Log: " + tn + " : " + s + " ");
101: t.printStackTrace(ps);
102: } else {
103: ps.println("Log: " + tn + " : " + s);
104: }
105: }
106:
107: // Routine to perform the output (also used by __logn() function)
108: static void logDetails(Logger l, String s, String prio, Throwable t) {
109: if (prio.equalsIgnoreCase("OUT")) //$NON-NLS-1
110: {
111: printDetails(System.out, s, t);
112: } else if (prio.equalsIgnoreCase("ERR")) //$NON-NLS-1
113: {
114: printDetails(System.err, s, t);
115: } else {
116: // N.B. if the string is not recognised, DEBUG is assumed
117: Priority p = Priority.getPriorityForName(prio);
118: if (log.isPriorityEnabled(p)) {// Thread method is potentially
119: // expensive
120: String tn = Thread.currentThread().getName();
121: log.log(p, tn + " " + s, t);
122: }
123: }
124:
125: }
126:
127: public synchronized void setParameters(Collection parameters)
128: throws InvalidVariableException {
129:
130: values = parameters.toArray();
131:
132: if ((values.length < MIN_PARAMETER_COUNT)
133: || (values.length > MAX_PARAMETER_COUNT)) {
134: throw new InvalidVariableException(
135: "Parameter Count not between "
136: + MIN_PARAMETER_COUNT + " & "
137: + MAX_PARAMETER_COUNT);
138: }
139:
140: }
141:
142: public String getReferenceKey() {
143: return KEY;
144: }
145:
146: public List getArgumentDesc() {
147: return desc;
148: }
149:
150: }
|