/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core.validation.rules; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.validation.ValidationContext; import org.teiid.designer.core.validation.ValidationProblem; import org.teiid.designer.core.validation.ValidationProblemImpl; import org.teiid.designer.core.validation.ValidationResult; import org.teiid.designer.core.validation.ValidationResultImpl; /** * CoreValidationRulesUtil * * @since 8.0 */ public class CoreValidationRulesUtil { /** * Validate the given string against a maximum length and create any problems. * @param maxLength * @param stringToValidate * @param ValidationResult to add problems for */ public static void validateStringLength(final ValidationResult result, final int maxLength, final String stringToValidate) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final StringNameValidator validator = new StringNameValidator(maxLength); final String reasonInvalid = validator.checkNameLength(stringToValidate); if ( reasonInvalid != null ) { // create validation problem and add it to the result ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reasonInvalid); result.addProblem(problem); } } /** * Validate the given string against a maximum length and create any problems. * @param maxLength * @param stringToValidate * @param ValidationResult to add problems for */ public static void validateStringLength(final ValidationResult result, final String stringToValidate) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final StringNameValidator validator = new StringNameValidator(); final String reasonInvalid = validator.checkNameLength(stringToValidate); if ( reasonInvalid != null ) { // create validation problem and add it to the result ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reasonInvalid); result.addProblem(problem); } } /** * Validate the given string against a maximum length and create any problems. * @param ValidationResult to add problems for * @param stringToValidate * @param any invalid characters to check for * @param invalidCharacterSeverity the severity to use if there are invalid characters; must be * one of the {@link IStatus} severity codes. */ public static void validateStringNameChars(final ValidationResult result, final String stringToValidate, final char[] validChars, final int invalidCharacterSeverity) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final StringNameValidator validator = new StringNameValidator(validChars); validateStringNameChars(result, stringToValidate, validator, invalidCharacterSeverity); } /** * Validate the given string against a maximum length and create any problems. * @param ValidationResult to add problems for * @param stringToValidate * @param a string validator * @param invalidCharacterSeverity the severity to use if there are invalid characters; must be * one of the {@link IStatus} severity codes. */ public static void validateStringNameChars(final ValidationResult result, final String stringToValidate, StringNameValidator validator, final int invalidCharacterSeverity) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final String reasonInvalid = validator.checkNameCharacters(stringToValidate); if ( reasonInvalid != null ) { // create validation problem and add it to the result int severity = invalidCharacterSeverity; if ( severity != IStatus.ERROR && severity != IStatus.INFO && severity != IStatus.OK && severity != IStatus.WARNING ) { severity = IStatus.ERROR; } ValidationProblem problem = new ValidationProblemImpl(0, severity, reasonInvalid); result.addProblem(problem); } } /** * Validate the given string against a maximum length and create any problems. * @param stringToValidate * @param any invalid characters to check for * @param ValidationResult to add problems for */ public static void validateStringNameChars(final ValidationResult result, final String stringToValidate, final char[] validChars) { validateStringNameChars(result,stringToValidate,validChars,IStatus.ERROR); } /** * Validate the given string against a maximum length and create any problems. * @param stringToValidate * @param any invalid characters to check for * @param ValidationResult to add problems for */ public static void validateStringName(final ValidationResult result, final int maxLength, final String stringToValidate, final char[] invalidChars) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); final StringNameValidator validator = new StringNameValidator(maxLength, invalidChars); final String reasonInvalid = validator.checkValidName(stringToValidate); if ( reasonInvalid != null ) { // create validation problem and add it to the result ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reasonInvalid); result.addProblem(problem); } } /** * Recursively check the names of the siblings against each other names and create * validation errors if we find siblings with same case insensitive name. * @param context The validation context to which we add results * @param siblings The siblings EObjects * @param nameFeatureID the ID of the feature that represents the name feature */ public static void validateUniqueness(final ValidationContext context, final List siblings, final int nameFeatureID) { final StringNameValidator validator = new StringNameValidator(); validateUniqueness(context, validator, siblings, nameFeatureID); } public static void validateUniqueness(final ValidationContext context, final StringNameValidator validator, final List siblings, final int nameFeatureID) { Map objectCountMap = validator.getDuplicateNamesMap(siblings,nameFeatureID); // if there is at least one match, create a problem if(objectCountMap.size() > 0) { Iterator keyIter = objectCountMap.keySet().iterator(); while(keyIter.hasNext()) { EObject eObject = (EObject) keyIter.next(); final EStructuralFeature eFeature = eObject.eClass().getEStructuralFeature(nameFeatureID); final String name = (String) eObject.eGet(eFeature); Integer count = (Integer)objectCountMap.get(eObject); ValidationResult result = new ValidationResultImpl(eObject); String msg = (validator.isCaseSensitive() ? ModelerCore.Util.getString("StringNameValidator.sameNameCaseSensitive", name, count) //$NON-NLS-1$ : ModelerCore.Util.getString("StringNameValidator.The_name_{0}_is_the_same_as_{1}_other_objects_under_the_same_parent",name, count)); //$NON-NLS-1$ ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, msg); result.addProblem(problem); context.addResult(result); } } } /** * Recursively check the names of the features against each other names and return * statuses containing errors. * @param features The list of {@link org.eclipse.emf.ecore.EStructuralFeature} objects */ public static Collection validateUniqueness(final List features) { final StringNameValidator validator = new StringNameValidator(); Map objectCountMap = validator.getDuplicateNamesMap(features); // if there is at least one match, create a status if(objectCountMap.size() > 0) { Collection statusList = new ArrayList(objectCountMap.size()); Iterator keyIter = objectCountMap.keySet().iterator(); while(keyIter.hasNext()) { EObject eObject = (EObject) keyIter.next(); final String name = ModelerCore.getModelEditor().getName(eObject); Integer count = (Integer)objectCountMap.get(eObject); // create a new status and update the list IStatus status = new Status(IStatus.ERROR, ModelerCore.PLUGIN_ID, 0, ModelerCore.Util.getString("CoreValidationRulesUtil.The_name_of_feature_{0}_is_the_same_as_name_of_{1}_other_features._1", name, count), null); //$NON-NLS-1$ statusList.add(status); } return statusList; } return Collections.EMPTY_LIST; } /** * Get the valid name for the given string, all invalid chars are replaced with an '_' * character, if there is an invalid character at the beginning it is removed from the string. If the * name is not unique among its siblings integers are added to the end of the name until it is unique. * @param name The name that should be unique within its container * @param any invalid character to check for, in addition to the default invalid chars * @param maximum length of the valid string * @return a valid string for this invalid string. */ public static String getValidString(final String name, final char[] invalidChars, final int maxLength) { final StringNameValidator validator = new StringNameValidator(maxLength,invalidChars); return validator.createValidName(name); } /** * Validate for non-quoted delimiter string (i.e. Table name = partssupplier.supplier) * * @param ValidationResult to add problems for * @param stringToValidate */ public static void validateForNonQuotedNameWithDelimeter(final ValidationResult result, final String stringToValidate) { CoreArgCheck.isNotNull(stringToValidate); CoreArgCheck.isNotNull(result); if( stringToValidate.contains(CoreStringUtil.Constants.DOT_STR) && !CoreStringUtil.isDoubleQuoted(stringToValidate) ) { // create validation problem and add it to the result String reasonInvalid = ModelerCore.Util.getString("StringNameValidator.unquotedNameWithDelimiter", stringToValidate); //$NON-NLS-1$ ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, reasonInvalid); result.addProblem(problem); } } // // private static String getUniqueString(String name, Collection siblingNames) { // Iterator siblingIter = siblingNames.iterator(); // while(siblingIter.hasNext()) { // String sibName = (String) siblingIter.next(); // if(sibName.equalsIgnoreCase(name)) { // char lastChar = name.charAt(name.length()-1); // int intValue = 0; // if(Character.isDigit(lastChar)) { // intValue = Character.getNumericValue(lastChar); // name = name.substring(0, name.length()-1) + intValue; // } else { // intValue++; // name = name + intValue; // } // name = getUniqueString(name, siblingNames); // } // } // // return name; // } }