Hi Felix, I've taken into account your first remarks. I let you fix the remaining ones.
Thanks for your feedback! Regards On Wed, Nov 22, 2017 at 7:36 AM, Felix Schumacher < felix.schumac...@internetallee.de> wrote: > > > 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. > yes > > Would not it be better to allow groups of non wanted characters by adding > a +? > Yes > > 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. > Changed this after taking into account your first remarks > > I think it would be better named upperCaseFirstChar or something along > that line. > yes > > >+ 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? > Fixed > > Regards > Felix > > -- Cordialement. Philippe Mouawad.