On 11 June 2017 at 21:57, <[email protected]> wrote:
> Author: pmouawad
> Date: Sun Jun 11 20:57:38 2017
> New Revision: 1798405
>
> URL: http://svn.apache.org/viewvc?rev=1798405&view=rev
> Log:
> Allow to use variables ( from User Defined Variables only ) in all listeners
> in slave mode
> Try to secure exposed JMeterVariables
> Bugzilla Id: 57962
>
> Added:
>
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> (with props)
> Modified:
> jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
> jmeter/trunk/src/core/org/apache/jmeter/engine/PreCompiler.java
> jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java
> jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContextService.java
>
> Modified:
> jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
> URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java?rev=1798405&r1=1798404&r2=1798405&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
> (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
> Sun Jun 11 20:57:38 2017
> @@ -112,7 +112,9 @@ public class ClientJMeterEngine implemen
> HashTree testTree = test;
>
> synchronized(testTree) {
> - testTree.traverse(new PreCompiler(true)); // limit the changes
> to client only test elements
> + PreCompiler compiler = new PreCompiler(true);
> + testTree.traverse(compiler); // limit the changes to client
> only test elements
> +
> JMeterContextService.initClientSideVariables(compiler.getClientSideVariables());
> testTree.traverse(new TurnElementsOn());
> testTree.traverse(new ConvertListeners());
> }
>
> Modified: jmeter/trunk/src/core/org/apache/jmeter/engine/PreCompiler.java
> URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/engine/PreCompiler.java?rev=1798405&r1=1798404&r2=1798405&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/engine/PreCompiler.java (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/engine/PreCompiler.java Sun Jun
> 11 20:57:38 2017
> @@ -48,6 +48,8 @@ public class PreCompiler implements Hash
> // as only these are relevant to the client, and updating
> // other elements causes all sorts of problems.
> private final boolean isClientSide; // skip certain processing for
> remote tests
> +
> + private JMeterVariables clientSideVariables;
>
> public PreCompiler() {
> replacer = new ValueReplacer();
> @@ -72,15 +74,13 @@ public class PreCompiler implements Hash
> }
>
> if (node instanceof TestPlan) {
> - JMeterVariables vars = createVars((TestPlan)node);
> - // Don't store variable of test plan in the context for
> client side
> - JMeterContextService.setClientVariables(vars);
> + this.clientSideVariables = createVars((TestPlan)node);
> }
>
> if (node instanceof Arguments) {
> // Don't store User Defined Variables in the context for
> client side
> Map<String, String> args = createArgumentsMap((Arguments)
> node);
> - JMeterContextService.getClientVariables().putAll(args);
> + clientSideVariables.putAll(args);
> }
>
> } else {
> @@ -139,4 +139,11 @@ public class PreCompiler implements Hash
> @Override
> public void processPath() {
> }
> +
> + /**
> + * @return the clientSideVariables
> + */
> + public JMeterVariables getClientSideVariables() {
> + return clientSideVariables;
> + }
> }
>
> Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java
> URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java?rev=1798405&r1=1798404&r2=1798405&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java
> (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java Sun
> Jun 11 20:57:38 2017
> @@ -80,7 +80,9 @@ public class JMeterContext {
> */
> public JMeterVariables getVariables() {
> // If context variable is null ( Client side ) return client
> variables
> - return (variables == null) ?
> JMeterContextService.getClientVariables() : variables;
> + return (variables != null) ?
> + variables :
> + JMeterContextService.getClientSideVariables();
> }
>
> public void setVariables(JMeterVariables vars) {
>
> Modified:
> jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContextService.java
> URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContextService.java?rev=1798405&r1=1798404&r2=1798405&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContextService.java
> (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContextService.java
> Sun Jun 11 20:57:38 2017
> @@ -47,7 +47,7 @@ public final class JMeterContextService
> //@GuardedGy("this")
> private static int totalThreads = 0;
>
> - private static JMeterVariables variables = null;
> + private static UnmodifiableJMeterVariables variables;
>
>
> /**
> @@ -169,19 +169,12 @@ public final class JMeterContextService
> /**
> * Get all variables accessible for JMeter client in a distributed test
> * (only test plan and user defined variables)
> + * Note this is a read-only collection
> * @return {@link JMeterVariables} available for JMeter client
> */
> - public static JMeterVariables getClientVariables() {
> + public static JMeterVariables getClientSideVariables() {
> return variables;
> }
> -
> - /**
> - * Set variables for JMeter client in a distributed test
> - * @param var {@link JMeterVariables}
> - */
> - public static void setClientVariables(JMeterVariables var) {
> - variables = var;
> - }
>
> public static class ThreadCounts {
>
> @@ -197,4 +190,12 @@ public final class JMeterContextService
> finishedThreads = finished;
> }
> }
> +
> + /**
> + * Set variables for JMeter client in a distributed test (INTERNAL API)
> + * @param clientSideVariables {@link JMeterVariables}
> + */
> + public static void initClientSideVariables(JMeterVariables
> clientSideVariables) {
> + JMeterContextService.variables = new
> UnmodifiableJMeterVariables(clientSideVariables);
> + }
> }
>
> Added:
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java?rev=1798405&view=auto
> ==============================================================================
> ---
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> (added)
> +++
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> Sun Jun 11 20:57:38 2017
> @@ -0,0 +1,150 @@
> +/*
> + * 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.threads;
> +
> +import java.util.Iterator;
> +import java.util.Map;
> +import java.util.Map.Entry;
> +import java.util.Set;
> +
> +/**
> + * Readonly wrapper around {@link JMeterVariables}
> + * @since 3.3
> + */
> +class UnmodifiableJMeterVariables extends JMeterVariables {
This is a bit fragile.
If the parent class adds a new method that allows the variables to be
mutated, then it will have to be overridden here.
That's easy to overlook.
It might be better to use Composition.
> + private JMeterVariables variables;
> + /**
> + *
> + */
> + public UnmodifiableJMeterVariables(JMeterVariables variables) {
> + this.variables = variables;
> + }
> + /**
> + * @return
> + * @see java.lang.Object#hashCode()
> + */
> + public int hashCode() {
> + return variables.hashCode();
> + }
> + /**
> + * @return
> + * @see org.apache.jmeter.threads.JMeterVariables#getThreadName()
> + */
> + public String getThreadName() {
> + return variables.getThreadName();
> + }
> + /**
> + * @return
> + * @see org.apache.jmeter.threads.JMeterVariables#getIteration()
> + */
> + public int getIteration() {
> + return variables.getIteration();
> + }
> + /**
> + *
> + * @see org.apache.jmeter.threads.JMeterVariables#incIteration()
> + */
> + public void incIteration() {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param key
> + * @return
> + * @see
> org.apache.jmeter.threads.JMeterVariables#remove(java.lang.String)
> + */
> + public Object remove(String key) {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param key
> + * @param value
> + * @see org.apache.jmeter.threads.JMeterVariables#put(java.lang.String,
> java.lang.String)
> + */
> + public void put(String key, String value) {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param key
> + * @param value
> + * @see
> org.apache.jmeter.threads.JMeterVariables#putObject(java.lang.String,
> java.lang.Object)
> + */
> + public void putObject(String key, Object value) {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param vars
> + * @see org.apache.jmeter.threads.JMeterVariables#putAll(java.util.Map)
> + */
> + public void putAll(Map<String, ?> vars) {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param vars
> + * @see
> org.apache.jmeter.threads.JMeterVariables#putAll(org.apache.jmeter.threads.JMeterVariables)
> + */
> + public void putAll(JMeterVariables vars) {
> + throw new UnsupportedOperationException();
> + }
> + /**
> + * @param key
> + * @return
> + * @see org.apache.jmeter.threads.JMeterVariables#get(java.lang.String)
> + */
> + public String get(String key) {
> + return variables.get(key);
> + }
> + /**
> + * @param obj
> + * @return
> + * @see java.lang.Object#equals(java.lang.Object)
> + */
> + public boolean equals(Object obj) {
> + return variables.equals(obj);
> + }
> + /**
> + * @param key
> + * @return
> + * @see
> org.apache.jmeter.threads.JMeterVariables#getObject(java.lang.String)
> + */
> + public Object getObject(String key) {
> + return variables.getObject(key);
> + }
> + /**
> + * @return
> + * @see org.apache.jmeter.threads.JMeterVariables#getIterator()
> + */
> + public Iterator<Entry<String, Object>> getIterator() {
> + return variables.getIterator();
> + }
> + /**
> + * @return
> + * @see org.apache.jmeter.threads.JMeterVariables#entrySet()
> + */
> + public Set<Entry<String, Object>> entrySet() {
> + return variables.entrySet();
> + }
> + /**
> + * @return
> + * @see java.lang.Object#toString()
> + */
> + public String toString() {
> + return variables.toString();
> + }
> +
> +}
>
> Propchange:
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange:
> jmeter/trunk/src/core/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java
> ------------------------------------------------------------------------------
> svn:mime-type = text/plain
>
>