package org.jenkinsci.plugins.parameterizedschedular; import hudson.model.ParametersDefinitionProperty; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.google.common.base.Splitter; import com.google.common.collect.Maps; public class ParameterParser { /** * if ever changed, documentation and messages will need to be updated as well */ private static final String PARAMETER_SEPARATOR = "%"; private static final String NAME_VALUE_SEPARATOR = "="; private static final String PAIR_SEPARATOR = ";"; /** * * @param nameValuePairFormattedString of name=value;other=value name value pairs * @return */ public Map<String, String> parse(String nameValuePairFormattedString) { if (StringUtils.isBlank(nameValuePairFormattedString)) { return Maps.<String, String> newHashMap(); } String clean = nameValuePairFormattedString.trim(); if (nameValuePairFormattedString.endsWith(PAIR_SEPARATOR)) { //the default splitter message in this scenario is not user friendly, so snip a trailing semicolon clean = clean.substring(0, clean.length() - 1); } return Splitter.on(PAIR_SEPARATOR).withKeyValueSeparator(NAME_VALUE_SEPARATOR).split(clean); } public String checkSanity(String cronTabSpec, ParametersDefinitionProperty parametersDefinitionProperty) { String[] split = cronTabSpec.split(PARAMETER_SEPARATOR); if (split.length < 2) { return null; } if (split.length > 2) { return Messages.ParameterizedTimerTrigger_MoreThanOnePercent(); } try { Map<String, String> parsedParameters = parse(split[1]); List<String> parameterDefinitionNames = parametersDefinitionProperty.getParameterDefinitionNames(); List<String> parsedKeySet = new ArrayList<String>(parsedParameters.keySet()); parsedKeySet.removeAll(parameterDefinitionNames); if (!parsedKeySet.isEmpty()) { return Messages.ParameterizedTimerTrigger_UndefinedParameter(parsedKeySet, parameterDefinitionNames); } } catch (IllegalArgumentException e) { return e.getMessage(); } return null; } }