diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/namingconvention/NovaServerNamingConventionGuideLineValidator.java')
1 files changed, 596 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/namingconvention/NovaServerNamingConventionGuideLineValidator.java b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/namingconvention/NovaServerNamingConventionGuideLineValidator.java new file mode 100644 index 0000000000..cf2751bef7 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/namingconvention/NovaServerNamingConventionGuideLineValidator.java @@ -0,0 +1,596 @@ +package org.openecomp.sdc.validation.impl.validators.namingconvention; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder; +import org.openecomp.core.validation.types.GlobalValidationContext; +import org.openecomp.sdc.common.errors.Messages; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.heat.datatypes.DefinedHeatParameterTypes; +import org.openecomp.sdc.heat.datatypes.model.Environment; +import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions; +import org.openecomp.sdc.heat.services.HeatStructureUtil; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; +import org.openecomp.sdc.validation.ResourceValidator; +import org.openecomp.sdc.validation.ValidationContext; +import org.openecomp.sdc.validation.type.NamingConventionValidationContext; +import org.openecomp.sdc.validation.util.ValidationUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; + +import static java.util.Objects.nonNull; + +/** + * Created by TALIO on 2/23/2017. + */ +public class NovaServerNamingConventionGuideLineValidator implements ResourceValidator { + private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + @Override + public void validate(String fileName, Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext, ValidationContext validationContext) { + + NamingConventionValidationContext namingConventionValidationContext = + (NamingConventionValidationContext)validationContext; + validateHeatNovaResource(fileName, namingConventionValidationContext.getEnvFileName(), + namingConventionValidationContext.getHeatOrchestrationTemplate(), + globalContext); + } + + private void validateHeatNovaResource(String fileName, String envFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + GlobalValidationContext globalContext) { + + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + Map<String, String> uniqueResourcePortNetworkRole = new HashMap<>(); + //if no resources exist return + if (MapUtils.isEmpty(heatOrchestrationTemplate.getResources())) { + return; + } + + heatOrchestrationTemplate + .getResources() + .entrySet() + .stream() + .filter(entry -> entry.getValue().getType() + .equals(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource())) + .forEach( entry -> validateNovaServerResourceType(entry.getKey(), fileName, envFileName, + entry, uniqueResourcePortNetworkRole, heatOrchestrationTemplate, globalContext)); + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private void validateNovaServerResourceType(String resourceId, String fileName, + String envFileName, + Map.Entry<String, Resource> resourceEntry, + Map<String, String> uniqueResourcePortNetworkRole, + HeatOrchestrationTemplate heatOrchestrationTemplate, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + validateNovaServerResourceMetaData(fileName, resourceId, + heatOrchestrationTemplate.getResources().get(resourceId), globalContext); + validateNovaServerResourceNetworkUniqueRole(fileName, resourceId, uniqueResourcePortNetworkRole, + heatOrchestrationTemplate, globalContext); + validateAvailabilityZoneName(fileName, resourceEntry, globalContext); + validateNovaServerNameImageAndFlavor(fileName, envFileName, resourceEntry, globalContext); + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + @SuppressWarnings("unchecked") + private void validateNovaServerResourceMetaData(String fileName, String resourceId, + Resource resource, + GlobalValidationContext globalValidationContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + Map<String, Object> novaServerProp = resource.getProperties(); + Object novaServerPropMetadata; + if (MapUtils.isNotEmpty(novaServerProp)) { + novaServerPropMetadata = novaServerProp.get("metadata"); + if (novaServerPropMetadata == null) { + globalValidationContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_NOVA_SERVER_METADATA.getErrorMessage(), + resourceId), + LoggerTragetServiceName.VALIDATE_NOVA_META_DATA_NAME, + LoggerErrorDescription.MISSING_NOVA_PROPERTIES); + } else if (novaServerPropMetadata instanceof Map) { + TreeMap<String, Object> propertyMap = new TreeMap(new Comparator<String>() { + + @Override + public int compare(String o1, String o2) { + return o1.compareToIgnoreCase(o2); + } + + @Override + public boolean equals(Object obj) { + return false; + } + }); + propertyMap.putAll((Map) novaServerPropMetadata); + if (!propertyMap.containsKey("vf_module_id")) { + globalValidationContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.MISSING_NOVA_SERVER_VF_MODULE_ID.getErrorMessage(), resourceId), + LoggerTragetServiceName.VALIDATE_NOVA_META_DATA_NAME, + LoggerErrorDescription.MISSING_NOVA_PROPERTIES); + } + if (!propertyMap.containsKey("vnf_id")) { + globalValidationContext.addMessage( + fileName, ErrorLevel.WARNING, + ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_NOVA_SERVER_VNF_ID.getErrorMessage(), + resourceId), + LoggerTragetServiceName.VALIDATE_NOVA_META_DATA_NAME, + LoggerErrorDescription.MISSING_NOVA_PROPERTIES); + } + } + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private void validateNovaServerResourceNetworkUniqueRole(String fileName, String resourceId, + Map<String, String> uniqueResourcePortNetworkRole, + HeatOrchestrationTemplate heatOrchestrationTemplate, + GlobalValidationContext globalValidationContext) { + + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + Object network; + String role = null; + + Object propertyNetworkValue = + heatOrchestrationTemplate.getResources().get(resourceId).getProperties().get("networks"); + if (propertyNetworkValue != null && propertyNetworkValue instanceof List) { + List<String> portResourceIdList = + getNovaNetworkPortResourceList(fileName, (List) propertyNetworkValue, + globalValidationContext); + for (String portResourceId : portResourceIdList) { + Resource portResource = heatOrchestrationTemplate.getResources().get(portResourceId); + if (portResource != null && portResource.getType() + .equals(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource())) { + Map portNetwork = + getPortNetwork(fileName, resourceId, portResource, globalValidationContext); + if (Objects.nonNull(portNetwork)) { + network = portNetwork.get("get_param"); + if (Objects.nonNull(network)) { + if (network instanceof String ){ + role = getNetworkRole((String)network); + }else if (network instanceof List){ + role = getNetworkRole((String)((List) network).get(0)); + } + if (role != null && uniqueResourcePortNetworkRole.containsKey(role)) { + globalValidationContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.RESOURCE_CONNECTED_TO_TWO_EXTERNAL_NETWORKS_WITH_SAME_ROLE + .getErrorMessage(), resourceId, role), + LoggerTragetServiceName.VALIDATE_RESOURCE_NETWORK_UNIQUE_ROLW, + LoggerErrorDescription.RESOURCE_UNIQUE_NETWORK_ROLE); + } else { + uniqueResourcePortNetworkRole.put(role, portResourceId); + } + } + } + } + } + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private List<String> getNovaNetworkPortResourceList(String filename, List propertyNetworkValue, + GlobalValidationContext globalContext) { + List<String> portResourceIdList = new ArrayList<>(); + for (Object propValue : propertyNetworkValue) { + Object portPropValue = ((Map) propValue).get("port"); + Collection<String> portResourceIds = HeatStructureUtil + .getReferencedValuesByFunctionName(filename, "get_resource", portPropValue, + globalContext); + if (portResourceIds != null) { + portResourceIdList.addAll(portResourceIds); + } + } + + return portResourceIdList; + } + + private String getNetworkRole(String network) { + if (network == null) { + return null; + } + if (network.contains("_net_id")) { + return network.substring(0, network.indexOf("_net_id")); + } else if (network.contains("net_name")) { + return network.substring(0, network.indexOf("_net_name")); + } else if (network.contains("net_fqdn")) { + return network.substring(0, network.indexOf("_net_fqdn")); + } + return null; + } + + private Map getPortNetwork(String fileName, String resourceId, Resource portResource, + GlobalValidationContext globalValidationContext) { + Object portNetwork = portResource.getProperties().get("network_id"); + if (portNetwork == null) { + portNetwork = portResource.getProperties().get("network"); + } + if (!(portNetwork instanceof Map)) { + globalValidationContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_GET_PARAM.getErrorMessage(), + "network or network_id", resourceId), + LoggerTragetServiceName.VALIDATE_RESOURCE_NETWORK_UNIQUE_ROLW, + LoggerErrorDescription.MISSING_GET_PARAM); + return null; + } + return (Map) portNetwork; + } + + private void validateAvailabilityZoneName(String fileName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + String[] regexList = new String[]{"availability_zone_(\\d+)"}; + + if (MapUtils.isEmpty(resourceEntry.getValue().getProperties())) { + mdcDataDebugMessage.debugExitMessage("file", fileName); + return; + } + + Object availabilityZoneMap = + resourceEntry.getValue().getProperties().containsKey("availability_zone") ? resourceEntry + .getValue().getProperties().get("availability_zone") : null; + + if (nonNull(availabilityZoneMap)) { + if (availabilityZoneMap instanceof Map) { + String availabilityZoneName = ValidationUtil.getWantedNameFromPropertyValueGetParam + (availabilityZoneMap); + + if (availabilityZoneName != null) { + if (!ValidationUtil.evalPattern(availabilityZoneName, regexList)) { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.PARAMETER_NAME_NOT_ALIGNED_WITH_GUIDELINES.getErrorMessage(), + ValidationUtil.getMessagePartAccordingToResourceType(resourceEntry), + "Availability Zone", + availabilityZoneName, resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_AVAILABILITY_ZONE_NAME, + LoggerErrorDescription.NAME_NOT_ALIGNED_WITH_GUIDELINES); + } + } + } else { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_GET_PARAM.getErrorMessage(), + "availability_zone", resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_AVAILABILITY_ZONE_NAME, + LoggerErrorDescription.MISSING_GET_PARAM); + } + } + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private void validateNovaServerNameImageAndFlavor(String fileName, String envFileName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + String novaName = + validateNovaServerNamingConvention(fileName, envFileName, resourceEntry, globalContext); + Map<String, String> legalNovaNamingConventionMap = + validateImageAndFlavorFromNovaServer(fileName, resourceEntry, globalContext); + + if (Objects.nonNull(novaName)) { + legalNovaNamingConventionMap.put("name", novaName); + } + + if (legalNovaNamingConventionMap.keySet().size() > 1) { + validateNovaServerNameImageAndFlavorSync(fileName, resourceEntry, + legalNovaNamingConventionMap, globalContext); + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private String validateNovaServerNamingConvention(String fileName, String envFileName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + if (MapUtils.isEmpty(resourceEntry.getValue().getProperties())) { + mdcDataDebugMessage.debugExitMessage("file", fileName); + return null; + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + return checkIfNovaNameByGuidelines(fileName, envFileName, resourceEntry, globalContext); + } + + private Map<String, String> validateImageAndFlavorFromNovaServer(String fileName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + if (MapUtils.isEmpty(resourceEntry.getValue().getProperties())) { + mdcDataDebugMessage.debugExitMessage("file", fileName); + return null; + } + + Pair<String, String> imagePair = new ImmutablePair<>("image", ".*_image_name"); + Pair<String, String> flavorPair = new ImmutablePair<>("flavor", ".*_flavor_name"); + List<Pair<String, String>> imageFlavorPairs = Arrays.asList(imagePair, flavorPair); + Map<String, Object> propertiesMap = resourceEntry.getValue().getProperties(); + Map<String, String> imageAndFlavorLegalNames = new HashMap<>(); + + for (Pair<String, String> imageOrFlavor : imageFlavorPairs) { + boolean isErrorInImageOrFlavor = + isErrorExistWhenValidatingImageOrFlavorNames(fileName, imageOrFlavor, resourceEntry, + propertiesMap, globalContext); + if (!isErrorInImageOrFlavor) { + Object nameValue = propertiesMap.get(imageOrFlavor.getKey()) == null ? null + : propertiesMap.get(imageOrFlavor.getKey()); + String imageOrFlavorName = ValidationUtil.getWantedNameFromPropertyValueGetParam(nameValue); + imageAndFlavorLegalNames.put(imageOrFlavor.getKey(), imageOrFlavorName); + } + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + return imageAndFlavorLegalNames; + } + + private String checkIfNovaNameByGuidelines(String fileName, String envFileName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + if (MapUtils.isEmpty(resourceEntry.getValue().getProperties())) { + return null; + } + Object novaNameGetParam = getNovaServerName(resourceEntry); + String novaName = null; + if (nonNull(novaNameGetParam)) { + novaName = + checkNovaNameGetParamValueMap(fileName, novaNameGetParam, resourceEntry, globalContext); + checkIfNovaNameParameterInEnvIsStringOrList(fileName, envFileName, resourceEntry, novaName, + globalContext); + } else { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_GET_PARAM.getErrorMessage(), + "nova server name", resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_NOVA_SERVER_NAME, + LoggerErrorDescription.MISSING_GET_PARAM); + } + + return novaName; + } + + private boolean isErrorExistWhenValidatingImageOrFlavorNames(String fileName, + Pair<String, String> propertyNameAndRegex, + Map.Entry<String, Resource> resourceEntry, + Map<String, Object> propertiesMap, + GlobalValidationContext globalContext) { + String propertyName = propertyNameAndRegex.getKey(); + Object nameValue = + propertiesMap.get(propertyName) == null ? null : propertiesMap.get(propertyName); + String[] regexList = new String[]{propertyNameAndRegex.getValue()}; + + if (nonNull(nameValue)) { + if (nameValue instanceof Map) { + if (ValidationUtil.validateMapPropertyValue(fileName, resourceEntry, globalContext, + propertyName, + nameValue, regexList)) { + return true; + } + } else { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, ErrorMessagesFormatBuilder + .getErrorWithParameters(Messages.MISSING_GET_PARAM.getErrorMessage(), propertyName, + resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_IMAGE_AND_FLAVOR_NAME, + LoggerErrorDescription.MISSING_GET_PARAM); + return true; + } + + return false; + } + return false; + } + + private Object getNovaServerName(Map.Entry<String, Resource> resourceEntry) { + Object novaServerName = resourceEntry.getValue().getProperties().get("name"); + Map novaNameMap; + if (nonNull(novaServerName)) { + if (novaServerName instanceof Map) { + novaNameMap = (Map) novaServerName; + return novaNameMap.get(ResourceReferenceFunctions.GET_PARAM.getFunction()) == null ? null + : novaNameMap.get(ResourceReferenceFunctions.GET_PARAM.getFunction()); + } + } + return null; + } + + @SuppressWarnings("unchecked") + private String checkNovaNameGetParamValueMap(String fileName, Object getParamValue, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + if (getParamValue instanceof List) { + List<Object> getParamNameList = (List) getParamValue; + String[] regexName = new String[]{".*_names"}; + return isNovaNameAsListLegal(fileName, getParamNameList, regexName, resourceEntry, + globalContext); + } else if (getParamValue instanceof String) { + String[] regexName = new String[]{".*_name_(\\d+)"}; + return isNovaNameAsStringLegal(fileName, (String) getParamValue, regexName, resourceEntry, + globalContext); + } + + return null; + } + + private void checkIfNovaNameParameterInEnvIsStringOrList(String fileName, String envFileName, + Map.Entry<String, Resource> resourceEntry, + String novaServerName, + GlobalValidationContext globalContext) { + if (nonNull(envFileName)) { + Environment environment = ValidationUtil.validateEnvContent(envFileName, globalContext); + + if (environment != null && MapUtils.isNotEmpty(environment.getParameters())) { + Object novaServerNameEnvValue = + environment.getParameters().containsKey(novaServerName) ? environment.getParameters() + .get(novaServerName) : null; + if (Objects.nonNull(novaServerNameEnvValue)) { + if (!DefinedHeatParameterTypes + .isNovaServerEnvValueIsFromRightType(novaServerNameEnvValue)) { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.PARAMETER_NAME_NOT_ALIGNED_WITH_GUIDELINES.getErrorMessage(), "Server", + "Name", novaServerNameEnvValue.toString(), resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_NOVA_SERVER_NAME, + LoggerErrorDescription.NAME_NOT_ALIGNED_WITH_GUIDELINES); + } + } + } + } + } + + private String isNovaNameAsListLegal(String fileName, List<Object> getParamNameList, + String[] regexName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + + if (getParamNameList.size() != 2 || !ValidationUtil.evalPattern(getParamNameList.get(0), + regexName)) { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.PARAMETER_NAME_NOT_ALIGNED_WITH_GUIDELINES.getErrorMessage(), "Server", + "name", getParamNameList.toString(), resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_NOVA_SERVER_NAME, + LoggerErrorDescription.NAME_NOT_ALIGNED_WITH_GUIDELINES); + return null; + } + + return (String) getParamNameList.get(0); + } + + private String isNovaNameAsStringLegal(String fileName, String novaName, String[] regexName, + Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext) { + if (!ValidationUtil.evalPattern(novaName, regexName)) { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.PARAMETER_NAME_NOT_ALIGNED_WITH_GUIDELINES.getErrorMessage(), "Server", + "name", novaName, resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_NOVA_SERVER_NAME, + LoggerErrorDescription.NAME_NOT_ALIGNED_WITH_GUIDELINES); + return null; + } + return novaName; + } + + private void validateNovaServerNameImageAndFlavorSync(String fileName, + Map.Entry<String, Resource> resourceEntry, + Map<String, String> legalNovaNamingConventionNames, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + List<String> vmNames = new LinkedList<>(); + + for (Map.Entry<String, String> nameEntry : legalNovaNamingConventionNames.entrySet()) { + vmNames.add(getVmName(nameEntry.getValue(), nameEntry.getKey())); + } + + vmNames.removeIf(VMName -> VMName == null); + + if (!isVmNameSync(vmNames)) { + globalContext.addMessage( + fileName, + ErrorLevel.WARNING, + ErrorMessagesFormatBuilder.getErrorWithParameters( + Messages.NOVA_NAME_IMAGE_FLAVOR_NOT_CONSISTENT.getErrorMessage(), + resourceEntry.getKey()), + LoggerTragetServiceName.VALIDATE_IMAGE_AND_FLAVOR_NAME, + LoggerErrorDescription.NAME_NOT_ALIGNED_WITH_GUIDELINES); + } + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private String getVmName(String nameToGetVmNameFrom, String stringToGetIndexOf) { + int vmIndex = + nameToGetVmNameFrom == null ? -1 : nameToGetVmNameFrom.indexOf(stringToGetIndexOf); + String vmName = vmIndex < 0 ? null + : trimNonAlphaNumericCharactersFromEndOfString(nameToGetVmNameFrom.substring(0, vmIndex)); + + return vmName; + + } + + private boolean isVmNameSync(List<String> namesToCompare) { + int size = namesToCompare.size(); + for (int i = 0; i < size - 1; i++) { + if (!namesToCompare.get(i).equals(namesToCompare.get(i + 1))) { + return false; + } + } + return true; + } + + private String trimNonAlphaNumericCharactersFromEndOfString(String toTrim) { + int stringSize = toTrim.length(); + int stringLength = stringSize - 1; + String[] regexList = new String[]{"[^a-zA-Z0-9]"}; + + while (stringLength >= 0) { + if (!ValidationUtil.evalPattern(String.valueOf(toTrim.charAt(stringLength)), regexList)) { + break; + } + stringLength--; + } + + return toTrim.substring(0, stringLength + 1); + } +} |