You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2013/06/29 22:08:15 UTC

svn commit: r1498018 - in /jmeter/trunk: bin/ bin/templates/ src/core/org/apache/jmeter/gui/action/ src/core/org/apache/jmeter/gui/action/template/ src/core/org/apache/jmeter/gui/util/ src/core/org/apache/jmeter/resources/ xdocs/

Author: pmouawad
Date: Sat Jun 29 20:08:15 2013
New Revision: 1498018

URL: http://svn.apache.org/r1498018
Log:
Bug 55085 - UX Improvement : Ability to create New Test Plan from Templates
Bugzilla Id: 55085

Added:
    jmeter/trunk/bin/templates/
    jmeter/trunk/bin/templates/jdbc.jmx
    jmeter/trunk/bin/templates/recording.jmx
    jmeter/trunk/bin/templates/templates.xml   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java   (with props)
Modified:
    jmeter/trunk/bin/jmeter.properties
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java
    jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
    jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/bin/jmeter.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/bin/jmeter.properties (original)
+++ jmeter/trunk/bin/jmeter.properties Sat Jun 29 20:08:15 2013
@@ -935,4 +935,8 @@ user.properties=user.properties
 
 # Should JMeter automatically load additional system properties?
 # File name to look for (comment to disable)
-system.properties=system.properties
\ No newline at end of file
+system.properties=system.properties
+
+# Comma separated list of files that contain reference to templates and their description
+# Path must be relative to jmeter root folder
+#template.files=/bin/templates/templates.xml
\ No newline at end of file

Added: jmeter/trunk/bin/templates/jdbc.jmx
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/templates/jdbc.jmx?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/bin/templates/jdbc.jmx (added)
+++ jmeter/trunk/bin/templates/jdbc.jmx Sat Jun 29 20:08:15 2013
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jmeterTestPlan version="1.2" properties="2.5" jmeter="2.10-SNAPSHOT.20130609">
+  <hashTree>
+    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
+      <stringProp name="TestPlan.comments"></stringProp>
+      <boolProp name="TestPlan.functional_mode">false</boolProp>
+      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
+      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+        <collectionProp name="Arguments.arguments"/>
+      </elementProp>
+      <stringProp name="TestPlan.user_define_classpath"></stringProp>
+    </TestPlan>
+    <hashTree>
+      <JDBCDataSource guiclass="TestBeanGUI" testclass="JDBCDataSource" testname="JDBC Connection Configuration" enabled="true">
+        <boolProp name="autocommit">true</boolProp>
+        <stringProp name="checkQuery">Select 1</stringProp>
+        <stringProp name="connectionAge">5000</stringProp>
+        <stringProp name="dataSource">jdbcConfig</stringProp>
+        <stringProp name="dbUrl">jdbc:postgresql://hostname:port/dbname</stringProp>
+        <stringProp name="driver">org.postgresql.Driver</stringProp>
+        <boolProp name="keepAlive">true</boolProp>
+        <stringProp name="password">password</stringProp>
+        <stringProp name="poolMax">10</stringProp>
+        <stringProp name="timeout">10000</stringProp>
+        <stringProp name="transactionIsolation">DEFAULT</stringProp>
+        <stringProp name="trimInterval">60000</stringProp>
+        <stringProp name="username">username</stringProp>
+      </JDBCDataSource>
+      <hashTree/>
+      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
+        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">false</boolProp>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">1</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+        <longProp name="ThreadGroup.start_time">1370729701000</longProp>
+        <longProp name="ThreadGroup.end_time">1370729701000</longProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <JDBCSampler guiclass="TestBeanGUI" testclass="JDBCSampler" testname="JDBC Request" enabled="true">
+          <stringProp name="dataSource">jdbcConfig</stringProp>
+          <stringProp name="query">select column1 from table</stringProp>
+          <stringProp name="queryArguments"></stringProp>
+          <stringProp name="queryArgumentsTypes"></stringProp>
+          <stringProp name="queryType">Select Statement</stringProp>
+          <stringProp name="resultVariable"></stringProp>
+          <stringProp name="variableNames">col1</stringProp>
+        </JDBCSampler>
+        <hashTree/>
+      </hashTree>
+      <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
+        <boolProp name="ResultCollector.error_logging">false</boolProp>
+        <objProp>
+          <name>saveConfig</name>
+          <value class="SampleSaveConfiguration">
+            <time>true</time>
+            <latency>true</latency>
+            <timestamp>true</timestamp>
+            <success>true</success>
+            <label>true</label>
+            <code>true</code>
+            <message>true</message>
+            <threadName>true</threadName>
+            <dataType>false</dataType>
+            <encoding>false</encoding>
+            <assertions>true</assertions>
+            <subresults>false</subresults>
+            <responseData>false</responseData>
+            <samplerData>false</samplerData>
+            <xml>false</xml>
+            <fieldNames>true</fieldNames>
+            <responseHeaders>false</responseHeaders>
+            <requestHeaders>false</requestHeaders>
+            <responseDataOnError>true</responseDataOnError>
+            <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+            <assertionsResultsToSave>0</assertionsResultsToSave>
+            <bytes>true</bytes>
+            <hostname>true</hostname>
+            <threadCounts>true</threadCounts>
+            <sampleCount>true</sampleCount>
+          </value>
+        </objProp>
+        <stringProp name="filename"></stringProp>
+      </ResultCollector>
+      <hashTree/>
+    </hashTree>
+  </hashTree>
+</jmeterTestPlan>

Added: jmeter/trunk/bin/templates/recording.jmx
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/templates/recording.jmx?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/bin/templates/recording.jmx (added)
+++ jmeter/trunk/bin/templates/recording.jmx Sat Jun 29 20:08:15 2013
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jmeterTestPlan version="1.2" properties="2.5" jmeter="2.10-SNAPSHOT.20130608">
+  <hashTree>
+    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
+      <stringProp name="TestPlan.comments"></stringProp>
+      <boolProp name="TestPlan.functional_mode">false</boolProp>
+      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
+      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+        <collectionProp name="Arguments.arguments"/>
+      </elementProp>
+      <stringProp name="TestPlan.user_define_classpath"></stringProp>
+    </TestPlan>
+    <hashTree>
+      <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+        <collectionProp name="Arguments.arguments"/>
+      </Arguments>
+      <hashTree/>
+      <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
+        <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+          <collectionProp name="Arguments.arguments"/>
+        </elementProp>
+        <stringProp name="HTTPSampler.domain"></stringProp>
+        <stringProp name="HTTPSampler.port"></stringProp>
+        <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+        <stringProp name="HTTPSampler.response_timeout"></stringProp>
+        <stringProp name="HTTPSampler.protocol"></stringProp>
+        <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+        <stringProp name="HTTPSampler.path"></stringProp>
+        <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
+      </ConfigTestElement>
+      <hashTree/>
+      <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
+        <collectionProp name="CookieManager.cookies"/>
+        <boolProp name="CookieManager.clearEachIteration">true</boolProp>
+      </CookieManager>
+      <hashTree/>
+      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
+        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">false</boolProp>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">1</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+        <longProp name="ThreadGroup.start_time">1370726934000</longProp>
+        <longProp name="ThreadGroup.end_time">1370726934000</longProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <RecordingController guiclass="RecordController" testclass="RecordingController" testname="Recording Controller" enabled="true"/>
+        <hashTree/>
+      </hashTree>
+      <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
+        <boolProp name="ResultCollector.error_logging">false</boolProp>
+        <objProp>
+          <name>saveConfig</name>
+          <value class="SampleSaveConfiguration">
+            <time>true</time>
+            <latency>true</latency>
+            <timestamp>true</timestamp>
+            <success>true</success>
+            <label>true</label>
+            <code>true</code>
+            <message>true</message>
+            <threadName>true</threadName>
+            <dataType>false</dataType>
+            <encoding>false</encoding>
+            <assertions>true</assertions>
+            <subresults>false</subresults>
+            <responseData>false</responseData>
+            <samplerData>false</samplerData>
+            <xml>false</xml>
+            <fieldNames>true</fieldNames>
+            <responseHeaders>false</responseHeaders>
+            <requestHeaders>false</requestHeaders>
+            <responseDataOnError>true</responseDataOnError>
+            <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+            <assertionsResultsToSave>0</assertionsResultsToSave>
+            <bytes>true</bytes>
+            <hostname>true</hostname>
+            <threadCounts>true</threadCounts>
+            <sampleCount>true</sampleCount>
+          </value>
+        </objProp>
+        <stringProp name="filename"></stringProp>
+      </ResultCollector>
+      <hashTree/>
+    </hashTree>
+    <WorkBench guiclass="WorkBenchGui" testclass="WorkBench" testname="WorkBench" enabled="true">
+      <boolProp name="WorkBench.save">true</boolProp>
+    </WorkBench>
+    <hashTree>
+      <ProxyControl guiclass="ProxyControlGui" testclass="ProxyControl" testname="HTTP Proxy Server" enabled="true">
+        <stringProp name="ProxyControlGui.port">8888</stringProp>
+        <collectionProp name="ProxyControlGui.exclude_list">
+          <stringProp name="-835639533">.*\.jpg</stringProp>
+          <stringProp name="1358517207">.*\.js</stringProp>
+          <stringProp name="-835633829">.*\.png</stringProp>
+          <stringProp name="-835642634">.*\.gif</stringProp>
+          <stringProp name="-835647305">.*\.bmp</stringProp>
+          <stringProp name="-835630668">.*\.swf</stringProp>
+          <stringProp name="-835646155">.*\.css</stringProp>
+        </collectionProp>
+        <collectionProp name="ProxyControlGui.include_list"/>
+        <boolProp name="ProxyControlGui.capture_http_headers">true</boolProp>
+        <intProp name="ProxyControlGui.grouping_mode">4</intProp>
+        <boolProp name="ProxyControlGui.add_assertion">false</boolProp>
+        <stringProp name="ProxyControlGui.sampler_type_name"></stringProp>
+        <boolProp name="ProxyControlGui.sampler_redirect_automatically">false</boolProp>
+        <boolProp name="ProxyControlGui.sampler_follow_redirects">true</boolProp>
+        <boolProp name="ProxyControlGui.use_keepalive">true</boolProp>
+        <boolProp name="ProxyControlGui.sampler_download_images">false</boolProp>
+        <boolProp name="ProxyControlGui.regex_match">true</boolProp>
+        <stringProp name="ProxyControlGui.content_type_include"></stringProp>
+        <stringProp name="ProxyControlGui.content_type_exclude"></stringProp>
+      </ProxyControl>
+      <hashTree>
+        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
+          <boolProp name="ResultCollector.error_logging">false</boolProp>
+          <objProp>
+            <name>saveConfig</name>
+            <value class="SampleSaveConfiguration">
+              <time>true</time>
+              <latency>true</latency>
+              <timestamp>true</timestamp>
+              <success>true</success>
+              <label>true</label>
+              <code>true</code>
+              <message>true</message>
+              <threadName>true</threadName>
+              <dataType>false</dataType>
+              <encoding>false</encoding>
+              <assertions>true</assertions>
+              <subresults>false</subresults>
+              <responseData>false</responseData>
+              <samplerData>false</samplerData>
+              <xml>false</xml>
+              <fieldNames>true</fieldNames>
+              <responseHeaders>false</responseHeaders>
+              <requestHeaders>false</requestHeaders>
+              <responseDataOnError>true</responseDataOnError>
+              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+              <assertionsResultsToSave>0</assertionsResultsToSave>
+              <bytes>true</bytes>
+              <hostname>true</hostname>
+              <threadCounts>true</threadCounts>
+              <sampleCount>true</sampleCount>
+            </value>
+          </objProp>
+          <stringProp name="filename"></stringProp>
+        </ResultCollector>
+        <hashTree/>
+      </hashTree>
+    </hashTree>
+  </hashTree>
+</jmeterTestPlan>

Added: jmeter/trunk/bin/templates/templates.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/templates/templates.xml?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/bin/templates/templates.xml (added)
+++ jmeter/trunk/bin/templates/templates.xml Sat Jun 29 20:08:15 2013
@@ -0,0 +1,53 @@
+<templates>
+    <template>
+        <name>Recording</name>
+        <fileName>/bin/templates/recording.jmx</fileName>
+        <description><![CDATA[
+        <h1>Template showing how to record</h1>
+        <h2>JMeter Configuration</h2>
+        <p>
+            <ul>
+                <li>JMeter Server Proxy port is set to 8888, you may want to change
+                
+            </ul>
+        </p>
+        <h2>Browser Configuration</h2>
+        <p>Configure your browser so that is uses the JMeter proxy, set:
+            <ul>
+                <li>the host of the machine that runs JMeter</li>
+                <li>the port you setup in JMeter Server Proxy</li>
+            </ul>
+        </p>
+        <h2>Useful links</h2>
+        <p>
+            <ul>
+                <li><a href="http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf" >http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf</a></li>
+                <li><a href="http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Proxy_Server" >http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Proxy_Server</a></li>
+            </ul>
+        </p>
+        
+        ]]></description>
+    </template>
+    <template>
+        <name>JDBC Load Test</name>
+        <fileName>/bin/templates/jdbc.jmx</fileName>
+        <description>
+        <![CDATA[<h1>Template showing how to Load Test an SQL query on Database</h1>
+        <h2>JMeter Configuration</h2>
+        <p>
+            <ul>
+                <li>Add the database driver to jmeter/lib folder</li>
+                <li>Configure the host, port, username and password in JDBC Configuration</li>
+                <li>Modify the SQL query to match your query</li>
+            </ul>
+        </p>
+        <h2>Useful links</h2>
+        <p>
+            <ul>
+                <li><a href="http://jmeter.apache.org/usermanual/build-db-test-plan.html" >http://jmeter.apache.org/usermanual/build-db-test-plan.html</a></li>
+            </ul>
+        </p>
+        
+        ]]></description>
+    </template>
+</templates>
\ No newline at end of file

Propchange: jmeter/trunk/bin/templates/templates.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java Sat Jun 29 20:08:15 2013
@@ -62,6 +62,7 @@ public final class ActionNames {
     public static final String MERGE            = "merge"; // $NON-NLS-1$
     public static final String OPEN             = "open"; // $NON-NLS-1$
     public static final String OPEN_RECENT      = "open_recent"; // $NON-NLS-1$
+    public static final String CREATE_FROM_TEMPLATE      = "create_from_template"; // $NON-NLS-1$
     public static final String PASTE            = "Paste"; // $NON-NLS-1$
     public static final String REMOTE_EXIT      = "remote_exit"; // $NON-NLS-1$
     public static final String REMOTE_EXIT_ALL  = "remote_exit_all"; // $NON-NLS-1$

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java Sat Jun 29 20:08:15 2013
@@ -0,0 +1,222 @@
+/*
+ * 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.gui.action;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Set;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JRootPane;
+import javax.swing.JScrollPane;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.jmeter.gui.action.template.Template;
+import org.apache.jmeter.gui.action.template.TemplateManager;
+import org.apache.jmeter.swing.HtmlPane;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.ComponentUtil;
+import org.apache.jorphan.gui.JLabeledChoice;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+
+/**
+ * Dialog used for Templates selection
+ * @since 2.10
+ */
+public class SelectTemplateDialog extends JDialog implements ChangeListener, ActionListener {
+    /**
+     *
+     */
+    private static final long serialVersionUID = -4436834972710248247L;
+
+    private static final Logger log = LoggingManager.getLoggerForClass();
+
+    private JLabeledChoice templateList;
+
+    private HtmlPane helpDoc = new HtmlPane();
+
+    private JButton createFromTemplateButton;
+
+    private JButton cancelButton;
+    
+    private JScrollPane scroller = new JScrollPane(helpDoc);
+
+    public SelectTemplateDialog() {
+        super((JFrame) null, JMeterUtils.getResString("template_title"), true); //$NON-NLS-1$
+        init();
+    }
+
+    @Override
+    protected JRootPane createRootPane() {
+        JRootPane rootPane = new JRootPane();
+        // Hide Window on ESC
+        Action escapeAction = new AbstractAction("ESCAPE") { //$NON-NLS-1$
+            /**
+             *
+             */
+            private static final long serialVersionUID = -6543764044868772971L;
+
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                setVisible(false);
+            }
+        };
+        // Do search on Enter
+        Action enterAction = new AbstractAction("ENTER") { //$NON-NLS-1$
+            /**
+             *
+             */
+            private static final long serialVersionUID = -3661361497864527363L;
+
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                doOpen(actionEvent);
+            }
+        };
+        ActionMap actionMap = rootPane.getActionMap();
+        actionMap.put(escapeAction.getValue(Action.NAME), escapeAction);
+        actionMap.put(enterAction.getValue(Action.NAME), enterAction);
+        InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+        inputMap.put(KeyStrokes.ESC, escapeAction.getValue(Action.NAME));
+        inputMap.put(KeyStrokes.ENTER, enterAction.getValue(Action.NAME));
+
+        return rootPane;
+    }
+
+    private void init() {
+        initializeTemplateList();
+        this.getContentPane().setLayout(new BorderLayout(10, 10));
+        JPanel comboPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+        comboPanel.add(templateList);
+        this.getContentPane().add(comboPanel, BorderLayout.NORTH);
+        helpDoc.setContentType("text/html"); //$NON-NLS-1$
+        helpDoc.setEditable(false);
+        fillDescription();
+        JPanel jPanel = new JPanel(new GridLayout(1,1));
+        scroller.setPreferredSize(new Dimension(300, 400));
+        jPanel.setPreferredSize(new Dimension(310, 410));
+        jPanel.add(scroller);
+        this.getContentPane().add(jPanel, BorderLayout.CENTER);
+
+        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+
+        createFromTemplateButton = new JButton(JMeterUtils.getResString("template_create_from")); //$NON-NLS-1$
+        createFromTemplateButton.addActionListener(this);
+
+        cancelButton = new JButton(JMeterUtils.getResString("cancel")); //$NON-NLS-1$
+        cancelButton.addActionListener(this);
+        buttonsPanel.add(createFromTemplateButton);
+        buttonsPanel.add(cancelButton);
+        this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
+
+        this.pack();
+        ComponentUtil.centerComponentInWindow(this);
+    }
+    
+    private void initializeTemplateList() {
+        Set<String> templatesAsSet = TemplateManager.getInstance().getTemplateNames();
+        String[] templateNames =  templatesAsSet.toArray(new String[templatesAsSet.size()]);
+        Arrays.sort(templateNames, new Comparator<String>() {
+            @Override
+            public int compare(String o1, String o2) {
+                return o1.compareToIgnoreCase(o2);
+            }
+        });
+        templateList = new JLabeledChoice(JMeterUtils.getResString("template_choose"), templateNames); //$NON-NLS-1$
+        templateList.addChangeListener(this);
+    }
+
+    /**
+     * Do search
+     * @param e {@link ActionEvent}
+     */
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if(e.getSource()==cancelButton) {
+            this.setVisible(false);
+            return;
+        }
+        doOpen(e);
+    }
+    
+    @Override
+    public void stateChanged(ChangeEvent event) {
+        fillDescription();
+    }
+
+    /**
+     * 
+     */
+    protected void fillDescription() {
+        String selectedTemplate = templateList.getText();
+        Template template = TemplateManager.getInstance().getTemplateByName(selectedTemplate);
+        helpDoc.setText(template.getDescription());
+    }
+
+    /**
+     * @param e {@link ActionEvent}
+     */
+    private void doOpen(ActionEvent e) {
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            String selectedTemplate = templateList.getText();
+            Template template = TemplateManager.getInstance().getTemplateByName(selectedTemplate);   
+            File fileToCopy = new File(JMeterUtils.getJMeterHome(), template.getFileName());
+            File targetFile = new File( System.getProperty("user.dir"), 
+                    template.getFileName().substring(template.getFileName().lastIndexOf("/")));
+            inputStream = new BufferedInputStream(new FileInputStream(fileToCopy));
+            outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));
+            IOUtils.copy(inputStream, outputStream);
+            outputStream.close();
+            Load.loadProjectFile(e, targetFile, false); 
+            this.setVisible(false);
+        } catch (Exception e1) {
+            throw new Error(e1);
+        } finally {
+            JOrphanUtils.closeQuietly(inputStream);
+            JOrphanUtils.closeQuietly(outputStream);
+        }
+    }
+}
\ No newline at end of file

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/SelectTemplateDialog.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java Sat Jun 29 20:08:15 2013
@@ -0,0 +1,54 @@
+/*
+ * 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.gui.action;
+
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Open Templates 
+ * @since 2.10
+ */
+public class TemplateCommand extends AbstractAction {
+
+    private static final Set<String> commands = new HashSet<String>();
+
+    static {
+        commands.add(ActionNames.CREATE_FROM_TEMPLATE);
+    }
+
+    private SelectTemplateDialog dialog = new SelectTemplateDialog();
+    /**
+     * @see Command#doAction(ActionEvent)
+     */
+    @Override
+    public void doAction(ActionEvent e) {
+        dialog.setVisible(true);
+    }
+
+
+    /**
+     * @see Command#getActionNames()
+     */
+    @Override
+    public Set<String> getActionNames() {
+        return commands;
+    }
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/TemplateCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java Sat Jun 29 20:08:15 2013
@@ -0,0 +1,65 @@
+/*
+ * 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.gui.action.template;
+
+/**
+ * Template Bean
+ * @since 2.10
+ */
+public class Template {
+    private String name;
+    private String fileName;
+    private String description;
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+    /**
+     * @return the relativeFileName
+     */
+    public String getFileName() {
+        return fileName;
+    }
+    /**
+     * @param relativeFileName the relativeFileName to set
+     */
+    public void setFileName(String relativeFileName) {
+        fileName = relativeFileName;
+    }
+    /**
+     * @return the description
+     */
+    public String getDescription() {
+        return description;
+    }
+    /**
+     * @param description the description to set
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
\ No newline at end of file

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/Template.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java?rev=1498018&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java Sat Jun 29 20:08:15 2013
@@ -0,0 +1,140 @@
+/*
+ * 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.gui.action.template;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+/**
+ * Manages Test Plan templates
+ * @since 2.10
+ */
+public class TemplateManager {
+    private class Templates {
+        private Map<String, Template> templates = new HashMap<String, Template>();
+    }
+    private static final String TEMPLATE_FILES = JMeterUtils.getPropDefault("template.files", // $NON-NLS-1$
+            "/bin/templates/templates.xml");
+
+    private static final Logger log = LoggingManager.getLoggerForClass();
+    
+    private static final TemplateManager SINGLETON = new TemplateManager();
+    
+    private Map<String, Template> templates = new HashMap<String, Template>();
+
+    private XStream xstream = initXStream();
+
+    /**
+     * 
+     * @return
+     */
+    public static final TemplateManager getInstance() {
+        return SINGLETON;
+    }
+    
+    private TemplateManager()  {
+        try {
+            templates = readTemplates();            
+        } catch(IOException e) {
+            log.error("Error loading templates from files referenced in templates.files property:"+
+                    TEMPLATE_FILES, e);
+        }
+    }
+    
+    private XStream initXStream() {
+        XStream xstream = new XStream(new DomDriver());
+        xstream.alias("template", Template.class);
+        xstream.alias("templates", Templates.class);
+        
+        // templates i
+        xstream.addImplicitMap(Templates.class, 
+                // field TemplateManager#templates 
+                "templates", // $NON-NLS-1$
+                Template.class,     
+                // field Template#name 
+                "name" // $NON-NLS-1$
+                );
+                
+        return xstream;
+    }
+
+    public void addTemplate(Template template) {
+        templates.put(template.getName(), template);
+    }
+
+    /**
+     * @return Set<String> the templates names
+     */
+    public Set<String> getTemplateNames() {
+        return templates.keySet();
+    }
+
+
+    private Map<String, Template> readTemplates() throws FileNotFoundException {
+        Map<String, Template> templates = new HashMap<String, Template>();
+       
+        String[] templateFiles = TEMPLATE_FILES.split(",");
+        for (int i = 0; i < templateFiles.length; i++) {
+            if(!StringUtils.isEmpty(templateFiles[i])) {
+                InputStream inputStream = null;
+                File f = new File(JMeterUtils.getJMeterHome(),
+                        templateFiles[i]); 
+                try {
+                    if(f.exists() && f.canRead()) {
+                        log.info("Reading templates from:"+f.getAbsolutePath());
+                        inputStream = new BufferedInputStream(new FileInputStream(f)); 
+                                
+                        templates.putAll(((Templates) xstream.fromXML(inputStream)).templates);
+                    } else {
+                        log.warn("Ignoring template file:'"+f.getAbsolutePath()+"' as it does not exist or is not readable");
+                    }
+                } catch(Exception ex) {                    
+                    log.warn("Ignoring template file:'"+f.getAbsolutePath()+"', an error occured parsing the file", ex);
+                } finally {
+                    JOrphanUtils.closeQuietly(inputStream);
+                } 
+            }
+        }
+        return templates;
+    }
+
+    /**
+     * @param selectedTemplate Template name
+     * @return {@link Template}
+     */
+    public Template getTemplateByName(String selectedTemplate) {
+        return templates.get(selectedTemplate);
+    }
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/template/TemplateManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java Sat Jun 29 20:08:15 2013
@@ -66,6 +66,8 @@ public class JMeterMenuBar extends JMenu
 
     private JMenuItem file_load;
 
+    private JMenuItem create_from_template;
+
     private List<JComponent> file_load_recent_files;
 
     private JMenuItem file_merge;
@@ -460,6 +462,9 @@ public class JMeterMenuBar extends JMenu
         // is selected is ROOT, which does not allow items to be inserted.
         file_load.setEnabled(false);
 
+        create_from_template = makeMenuItemRes("create_from_template", 'T', ActionNames.CREATE_FROM_TEMPLATE); //$NON-NLS-1$
+        create_from_template.setEnabled(true);
+
         file_close = makeMenuItemRes("menu_close", 'C', ActionNames.CLOSE, KeyStrokes.CLOSE); //$NON-NLS-1$
 
         file_exit = makeMenuItemRes("exit", 'X', ActionNames.EXIT, KeyStrokes.EXIT); //$NON-NLS-1$
@@ -473,6 +478,7 @@ public class JMeterMenuBar extends JMenu
 
         fileMenu.add(file_close);
         fileMenu.add(file_load);
+        fileMenu.add(create_from_template);
         fileMenu.add(file_merge);
         fileMenu.addSeparator();
         fileMenu.add(file_save);

Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Sat Jun 29 20:08:15 2013
@@ -206,6 +206,7 @@ counter_config_title=Counter
 counter_per_user=Track counter independently for each user
 counter_reset_per_tg_iteration=Reset counter on each Thread Group Iteration
 countlim=Size limit
+create_from_template=New from templates
 csvread_file_file_name=CSV file to get values from | *alias
 cut=Cut
 cut_paste_function=Copy and paste function string
@@ -1042,7 +1043,10 @@ tcp_request_data=Text to send
 tcp_sample_title=TCP Sampler
 tcp_timeout=Timeout (milliseconds)\:
 teardown_on_shutdown=Run tearDown Thread Groups after shutdown of main threads
+template_choose=Select Template
+template_create_from=Create
 template_field=Template\:
+template_title=Create from Template
 test=Test
 test_action_action=Action
 test_action_duration=Duration (milliseconds)

Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Sat Jun 29 20:08:15 2013
@@ -194,6 +194,7 @@ counter_config_title=Compteur
 counter_per_user=Suivre le compteur ind\u00E9pendamment pour chaque unit\u00E9 de test
 counter_reset_per_tg_iteration=R\u00E9initialiser le compteur \u00E0 chaque it\u00E9ration du groupe d'unit\u00E9s
 countlim=Limiter le nombre d'\u00E9l\u00E9ments retourn\u00E9s \u00E0
+create_from_template=Mod\u00E8les
 cssjquery_attribute=Attribut
 cssjquery_impl=Impl\u00E9mentation CSS/JQuery\:
 cssjquery_render_no_text=Les donn\u00E9es de r\u00E9ponse ne sont pas du texte.
@@ -1035,7 +1036,10 @@ tcp_request_data=Texte \u00E0 envoyer \:
 tcp_sample_title=Requ\u00EAte TCP
 tcp_timeout=Expiration (millisecondes) \:
 teardown_on_shutdown=Ex\u00E9cuter le Groupe d'unit\u00E9s de fin m\u00EAme apr\u00E8s un arr\u00EAt manuel des Groupes d'unit\u00E9s principaux
+template_choose=Choisir le mod\u00E8le
+template_create_from=Cr\u00E9er
 template_field=Canevas \:
+template_title=Cr\u00E9er \u00E0 partir du mod\u00E8le
 test=Test
 test_action_action=Action \:
 test_action_duration=Dur\u00E9e (millisecondes) \:

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1498018&r1=1498017&r2=1498018&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Sat Jun 29 20:08:15 2013
@@ -217,6 +217,7 @@ Transaction Controller now sets Response
 <li><bugzilla>54864</bugzilla> - Enable multi selection drag &amp; drop in the tree without having to start dragging before releasing Shift or Control </li>
 <li><bugzilla>54945</bugzilla> - Add Shutdown Hook to enable trapping kill or CTRL+C signals</li>
 <li><bugzilla>54990</bugzilla> - Download large files avoiding outOfMemory</li>
+<li><bugzilla>55085</bugzilla> - UX Improvement : Ability to create New Test Plan from Templates</li>
 </ul>
 
 <h2>Non-functional changes</h2>