/*
 * 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.sampler;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.testbeans.TestBean;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;

/**
 * This TestBean is just an example about how to write testbeans. The intent is
 * to demonstrate usage of the TestBean features to podential TestBean
 * developers. Note that only the class's introspector view matters: the methods
 * do nothing -- nothing useful, in any case.
 */
public class DebugSampler extends AbstractSampler implements TestBean {
    
	private boolean displayJMeterVariables;
	
	private boolean displayJMeterProperties;
	
	private boolean displaySystemProperties;
	
	public SampleResult sample(Entry e) {
        SampleResult res = new SampleResult();
        res.setSampleLabel(getName());
        res.sampleStart();
        StringBuffer sb = new StringBuffer(100);
        StringBuffer rd = new StringBuffer(20); // for request Data
        if (isDisplayJMeterVariables()){
        	rd.append("JMeterVariables\n");
        	sb.append("JMeterVariables:\n");
	        JMeterVariables vars = JMeterContextService.getContext().getVariables();
	        Iterator i = vars.getIterator();
	        while(i.hasNext())
	        {
	          Map.Entry me = (Map.Entry) i.next();
	           if(String.class.equals(me.getValue().getClass())){
	                 sb.append(me.toString()).append("\n");
	           }
	        }
	        sb.append("\n");
        }
        
        if (isDisplayJMeterProperties()){
        	rd.append("JMeterProperties\n");
        	sb.append("JMeterProperties:\n");
   		    formatProperties(sb, JMeterUtils.getJMeterProperties());        	
	        sb.append("\n");
        }
        
        if (isDisplaySystemProperties()){
        	rd.append("SystemProperties\n");
        	sb.append("SystemProperties:\n");
   		    formatProperties(sb, System.getProperties());        	        	
	        sb.append("\n");
        }
        
        res.setResponseData(sb.toString().getBytes());
        res.setDataType(SampleResult.TEXT);
        res.setSamplerData(rd.toString());
        res.setSuccessful(true);
        res.sampleEnd();
        return res;
	}

	private void formatProperties(StringBuffer sb, Properties p) {
		Set s = p.entrySet();
		ArrayList al = new ArrayList(s);
		Collections.sort(al, new Comparator(){
			public int compare(Object o1, Object o2) {
				String m1,m2;
				m1=(String)((Map.Entry)o1).getKey();
				m2=(String)((Map.Entry)o2).getKey();
				return m1.compareTo(m2);
			}
		});
		Iterator i = al.iterator();
		while(i.hasNext()){
			Map.Entry me = (Map.Entry) i.next();
			sb.append(me.getKey());
			sb.append("=");
			sb.append(me.getValue());
			sb.append("\n");
		}
	}

	public boolean isDisplayJMeterVariables() {
		return displayJMeterVariables;
	}

	public void setDisplayJMeterVariables(boolean displayJMeterVariables) {
		this.displayJMeterVariables = displayJMeterVariables;
	}

	public boolean isDisplayJMeterProperties() {
		return displayJMeterProperties;
	}

	public void setDisplayJMeterProperties(boolean displayJMeterPropterties) {
		this.displayJMeterProperties = displayJMeterPropterties;
	}

	public boolean isDisplaySystemProperties() {
		return displaySystemProperties;
	}

	public void setDisplaySystemProperties(boolean displaySystemProperties) {
		this.displaySystemProperties = displaySystemProperties;
	}
}

@@ -974,37 +974,8 @@
 ap;%0A
-import java.util.Properties;%0A
 impo
@@ -1262,358 +1262,138 @@
 ter.
-threads.JMeterVariables;%0Aimport org.apache.jmeter.util.JMeterUtils;%0A%0A/**%0A * This TestBean is just an example about how to write testbeans. The intent is%0A * to demonstrate usage of the TestBean features to podential TestBean%0A * developers. Note that only the class's int
+util.JMeterUtils;%0A%0A/**%0A * The Debug Sampler can be used to %22sample%22 JMeter variables, JMeter properties and System P
 ro
-s
 pe
-ctor view matters: the methods%0A * do nothing -- nothing useful, in any case.
+rties.%0A * 
 %0A */
@@ -1470,16 +1470,76 @@
  %7B%0A    %0A
+    private static final long serialVersionUID = 232L;%0A    %0A
 %09private
@@ -2054,25 +2054,24 @@
 s:%5Cn%22);%0A
-%09
         
 JMeterVa
@@ -2066,30 +2066,22 @@
     
-JMeterVariables vars =
+%09formatSet(sb,
  JMe
@@ -2129,283 +2129,21 @@
 es()
-;%0A%09        Iterator i = vars.getIterator();%0A%09        while(i.hasNext())%0A%09        %7B%0A%09          Map.Entry me = (Map.Entry) i.next();%0A%09           if(String.class.equals(me.getValue().getClass()))%7B%0A%09                 sb.append(me.toString()).append(%22%5Cn%22);%0A%09           %7D%0A%09        %7D
+.entrySet());
 %0A%09  
@@ -2314,38 +2314,31 @@
 n%22);%0A   
-%09%09
+ 
     
+%09
 format
-Properties
+Set
 (sb, JMe
@@ -2359,32 +2359,43 @@
 eterProperties()
+.entrySet()
 );        %09%0A%09   
@@ -2569,30 +2569,23 @@
 %0A   
-%09%09
+ 
     
+%09
 format
-Properties
+Set
 (sb,
@@ -2607,16 +2607,27 @@
 erties()
+.entrySet()
 );      
@@ -2928,26 +2928,19 @@
 d format
-Properties
+Set
 (StringB
@@ -2953,47 +2953,16 @@
 sb, 
-Properties p) %7B%0A%09%09Set s = p.entrySet();
+Set s) %7B
 %0A%09%09A
@@ -3411,25 +3411,28 @@
 %22);%0A%09%09%7D%0A%09%7D%0A%0A
-%09
+    
 public boole

Sort the JMeter variables