Am 20. November 2017 20:50:51 MEZ schrieb pmoua...@apache.org:
>Author: pmouawad
>Date: Mon Nov 20 19:50:51 2017
>New Revision: 1815838
>
>URL: http://svn.apache.org/viewvc?rev=1815838&view=rev
>Log:
>Bug 61759 - New __changeCase function
>Contributed by Orimarko
>Bugzilla Id: 61759
>
>Added:
>jmeter/trunk/src/functions/org/apache/jmeter/functions/ChangeCase.java 
> (with props)
>jmeter/trunk/test/src/org/apache/jmeter/functions/TestChangeCase.java  
>(with props)
>Modified:
>    jmeter/trunk/xdocs/changes.xml
>    jmeter/trunk/xdocs/usermanual/functions.xml
>
>Added:
>jmeter/trunk/src/functions/org/apache/jmeter/functions/ChangeCase.java
>URL:
>http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/ChangeCase.java?rev=1815838&view=auto
>==============================================================================
>---
>jmeter/trunk/src/functions/org/apache/jmeter/functions/ChangeCase.java
>(added)
>+++
>jmeter/trunk/src/functions/org/apache/jmeter/functions/ChangeCase.java
>Mon Nov 20 19:50:51 2017
>@@ -0,0 +1,175 @@
>+/*
>+ * 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.functions;
>+
>+import java.util.Collection;
>+import java.util.EnumSet;
>+import java.util.LinkedList;
>+import java.util.List;
>+import java.util.regex.Pattern;
>+
>+import org.apache.commons.lang3.StringUtils;
>+import org.apache.jmeter.engine.util.CompoundVariable;
>+import org.apache.jmeter.samplers.SampleResult;
>+import org.apache.jmeter.samplers.Sampler;
>+import org.apache.jmeter.util.JMeterUtils;
>+import org.slf4j.Logger;
>+import org.slf4j.LoggerFactory;
>+
>+/**
>+ * Change Case Function
>+ * 
>+ * Support String manipulations of:
>+ * <ul>
>+ * <li>upper case</li>
>+ * <li>lower case</li>
>+ * <li>capitalize</li>
>+ * <li>camel cases</li>
>+ * <li></li>
>+ * 
>+ * 
>+ * @since 4.0
>+ *
>+ */
>+public class ChangeCase extends AbstractFunction {
>+
>+    private static final Pattern NOT_ALPHANUMERIC_REGEX = 
>+            Pattern.compile("[^a-zA-Z]");

The regex doesn't include numeric, so it probably should be called not alpha.

Would not it be better to allow groups of non wanted characters by adding a +? 

But it might be nicer to split on non word chars. That would be \W+. 

>+    private static final Logger LOGGER =
>LoggerFactory.getLogger(ChangeCase.class);
>+    private static final List<String> DESC = new LinkedList<>();
>+    private static final String KEY = "__changeCase";
>+
>+    private static final int MIN_PARAMETER_COUNT = 1;
>+    private static final int MAX_PARAMETER_COUNT = 3;
>+
>+    static {
>+        DESC.add(JMeterUtils.getResString("change_case_string"));
>+        DESC.add(JMeterUtils.getResString("change_case_mode"));
>+        DESC.add(JMeterUtils.getResString("function_name_paropt"));
>+    }
>+
>+    private CompoundVariable[] values;
>+
>+    @Override
>+    public String execute(SampleResult previousResult, Sampler
>currentSampler) throws InvalidVariableException {
>+        String originalString = values[0].execute();
>+        String mode = ChangeCaseMode.UPPER.getName(); // default
>+        if (values.length > 1) {
>+            mode = values[1].execute();
>+        }
>+        String targetString = changeCase(originalString, mode);
>+        addVariableValue(targetString, values, 2);
>+        return targetString;
>+    }
>+
>+    protected String changeCase(String originalString, String mode) {
>+        String targetString = originalString;
>+        // mode is case insensitive, allow upper for example
>+        ChangeCaseMode changeCaseMode =
>ChangeCaseMode.typeOf(mode.toUpperCase());
>+        if (changeCaseMode != null) {
>+            switch (changeCaseMode) {
>+            case UPPER:
>+                targetString = StringUtils.upperCase(originalString);
>+                break;
>+            case LOWER:
>+                targetString = StringUtils.lowerCase(originalString);
>+                break;
>+            case CAPITALIZE:
>+                targetString = StringUtils.capitalize(originalString);
>+                break;
>+            case CAMEL_CASE:
>+                targetString = camel(originalString, false);
>+                break;
>+            case CAMEL_CASE_FIRST_LOWER:
>+                targetString = camel(originalString, true);
>+                break;
>+            default:
>+                // default not doing nothing to string
>+            }
>+        } else {
>+            LOGGER.error("Unknown mode {}, returning {} unchanged",

A strange char seems to have crept in. Probably a white space on Mac. 

>mode, targetString);
>+        }
>+        return targetString;
>+    }
>+
>+    @Override
>+    public void setParameters(Collection<CompoundVariable> parameters)
>throws InvalidVariableException {
>+        checkParameterCount(parameters, MIN_PARAMETER_COUNT,
>MAX_PARAMETER_COUNT);
>+        values = parameters.toArray(new
>CompoundVariable[parameters.size()]);
>+    }
>+
>+    @Override
>+    public String getReferenceKey() {
>+        return KEY;
>+    }
>+
>+    @Override
>+    public List<String> getArgumentDesc() {
>+        return DESC;
>+    }
>+
>+    private static String camel(String str, boolean
>isFirstCapitalized) {
>+        StringBuilder builder = new StringBuilder(str.length());
>+        String[] tokens = NOT_ALPHANUMERIC_REGEX.split(str);
>+        for (int i = 0; i < tokens.length; i++) {
>+            if(i == 0) {
>+                builder.append(isFirstCapitalized ? tokens[0]:

I am surprised by the value of isFirstCapitalized, as it means to me - what is 
the current state.

I think it would be better named upperCaseFirstChar or something along that 
line. 

>+                    StringUtils.capitalize(tokens[i]));
>+            } else {
>+                builder.append(StringUtils.capitalize(tokens[i]));
>+            }
>+        }
>+        return builder.toString();
>+    }
>+
>+    /**
>+     * ChangeCase Modes
>+     * 
>+     * Modes for different cases
>+     *
>+     */
>+    public enum ChangeCaseMode {
>+        UPPER("UPPER"), LOWER("LOWER"), CAPITALIZE("CAPITALIZE"),
>CAMEL_CASE("CAMEL_CASE"), CAMEL_CASE_FIRST_LOWER(
>+                "CAMEL_CASE_FIRST_LOWER");
>+        private String mode;
>+
>+        private ChangeCaseMode(String mode) {
>+            this.mode = mode;
>+        }
>+
>+        public String getName() {
>+            return this.mode;
>+        }
>+
>+        /**
>+         * Get ChangeCaseMode by mode
>+         * 
>+         * @param mode
>+         * @return relevant ChangeCaseMode
>+         */
>+        public static ChangeCaseMode typeOf(String mode) {
>+            EnumSet<ChangeCaseMode> allOf =
>EnumSet.allOf(ChangeCaseMode.class);
>+            for (ChangeCaseMode zs : allOf)

Why is this variable named zs? 

Regards
 Felix 

Reply via email to