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