/** * */ package org.goko.core.common.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.goko.core.common.exception.GkException; /** * @author PsyKo * @date 8 f�vr. 2016 */ public class UniqueCacheByCode<T extends ICodeBean> extends CacheByCode<T> { /** (inheritDoc) * @see org.goko.core.common.utils.CacheByCode#add(org.goko.core.common.utils.ICodeBean) */ @Override public void add(T element) throws GkException { if(exist(element.getCode())){ element.setCode(generateUniqueCode(element.getCode())); } super.add(element); } /** * Generate a unique code using the given code as a base * @param code the current code * @return the newly created code * @throws GkException GkException */ private String generateUniqueCode(String code) throws GkException { String generatedCode = StringUtils.defaultString(code); Pattern pattern = Pattern.compile("(.*)\\((.*)\\)"); Matcher matcher = pattern.matcher(generatedCode); // We check if we have a number at the end if(!matcher.find()){ generatedCode += "(1)"; } int copy = 1; matcher = pattern.matcher(generatedCode); while(exist(generatedCode) && copy < 100){ copy++; StringBuffer sb = new StringBuffer(); matcher.find(); matcher.appendReplacement(sb, "$1("+String.valueOf(copy)+")"); matcher.appendTail(sb); generatedCode = sb.toString(); matcher = pattern.matcher(generatedCode); } return generatedCode; } }