package com.intuit.tank.script.replace; /* * #%L * JSF Support Beans * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import com.intuit.tank.project.RequestData; import com.intuit.tank.project.ScriptStep; import com.intuit.tank.search.script.Section; import com.intuit.tank.vm.common.util.RegexUtil; public abstract class AbstractReplacement { private Section section; private String type; protected AbstractReplacement(Section section, String type) { this.section = section; this.type = type; } /** * @return the type */ public String getType() { return type; } /** * @param type * the type to set */ public void setType(String type) { this.type = type; } /** * @return the section */ public Section getSection() { return section; } /** * @param section * the section to set */ public void setSection(Section section) { this.section = section; } /** * @param searchQuery * The search query pattern * @param replaceString * The replacement string * @param value * @param type * @return */ protected List<ReplaceEntity> getReplacementInValue(String searchQuery, String replaceString, String value, String type) { return getReplacementInValue(searchQuery, replaceString, value, type, null); } /** * @param searchQuery * The search query pattern * @param replaceString * The replacement string * @param value * The value to be searched in. * * @param type * The type of the * @param key * The key to be set in the replace entity if a match was found. * @return */ protected List<ReplaceEntity> getReplacementInValue(String searchQuery, String replaceString, String value, String type, String key) { if (StringUtils.isEmpty(searchQuery) || StringUtils.isEmpty(value)) { return Collections.emptyList(); } if (!this.type.equals(type)) { return Collections.emptyList(); } List<ReplaceEntity> reList = new ArrayList<ReplaceEntity>(); if (isMatch(searchQuery, replaceString, value)) { ReplaceEntity re = new ReplaceEntity(); re.setValue(value); re.setAfter(replaceString); re.setSection(getSection()); re.setKey(key); reList.add(re); } return reList; } protected List<ReplaceEntity> getReplacementInKey(String searchQuery, String replaceString, String value, String type, String key) { if (StringUtils.isEmpty(searchQuery) || StringUtils.isEmpty(value)) { return Collections.emptyList(); } if (!this.type.equals(type)) { return Collections.emptyList(); } List<ReplaceEntity> reList = new ArrayList<ReplaceEntity>(); if (isMatch(searchQuery, replaceString, key)) { ReplaceEntity re = new ReplaceEntity(); re.setValue(value); re.setAfter(replaceString); re.setSection(getSection()); re.setKey(key); reList.add(re); } return reList; } /** * Finds the pattern in the value and returns how the replacement string would like to the user * * @param searchQuery * the search query * @param replaceString * The replacement string * @param value * The value to be searched in. * @return */ private boolean isMatch(String searchQuery, String replaceString, String value) { searchQuery = RegexUtil.wildcardToRegexp(searchQuery); Pattern p = Pattern.compile(searchQuery, Pattern.CASE_INSENSITIVE); return p.matcher(value).matches(); } /** * @param step * The step in which the search should be performed. * @param searchQuery * The search Query. * @param replaceString * The replacement string. * @param requestDatas * The set of RequestData where the replacements should be searched for. * @param searchMode * The search mode for the replacements * @return */ protected List<ReplaceEntity> getReplacementsInRequestData(ScriptStep step, String searchQuery, String replaceString, Set<RequestData> requestDatas, SearchMode searchMode) { List<ReplaceEntity> reList = new ArrayList<ReplaceEntity>(); for (RequestData requestData : requestDatas) { if (searchMode == SearchMode.all) { reList.addAll(getReplacementInValue(searchQuery, replaceString, requestData.getValue(), step.getType(), requestData.getKey())); reList.addAll(getReplacementInKey(searchQuery, replaceString, requestData.getValue(), step.getType(), requestData.getKey())); } else if (searchMode == SearchMode.keyOnly) { reList.addAll(getReplacementInKey(searchQuery, replaceString, requestData.getValue(), step.getType(), requestData.getKey())); } else if (searchMode == SearchMode.valueOnly) { reList.addAll(getReplacementInValue(searchQuery, replaceString, requestData.getValue(), step.getType(), requestData.getKey())); } } return reList; } /** * Replace the value in the replacement entity. * * @param requestDatas * The post datas * @param replaceString * The replacement string * @param key * TODO * @return */ protected void replaceInRequestDatas(Set<RequestData> requestDatas, String replaceString, String key) { for (RequestData requestData : requestDatas) { if (requestData.getKey().equals(key)) { requestData.setValue(replaceString); } } } /** * Replace the key in the replacement entity. * * @param requestDatas * The post datas * @param keyReplaceString * The replacement string * @param key * TODO * @return */ protected void replaceInRequestDatas(Set<RequestData> requestDatas, String replaceString, String key, ReplaceMode replaceMode) { for (RequestData requestData : requestDatas) { if (requestData.getKey().equals(key)) { if (replaceMode == ReplaceMode.KEY) { requestData.setKey(replaceString); } else { requestData.setValue(replaceString); } } } } /** * Gets the replacement. * * @param step * the step where the replacement is to be searched * @param searchQuery * The search Query. * @param replaceString * The replacement string which should be set within the replacements if replacements are identified * @param searchMode * The mode of the search. * @return */ public abstract List<ReplaceEntity> getReplacements(ScriptStep step, String searchQuery, String replaceString, SearchMode searchMode); /** * Replace the value in the step with replaceString * * @param step * the step in which the replacements is to be performed. * @param replaceString * the replacement string * @param key * TODO * @param replaceMode * the field to be replaced */ public abstract void replace(ScriptStep step, String replaceString, String key, ReplaceMode replaceMode); }