blob: f04350f3621017270abf69122865356ae1a62d0a [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*/
package org.eclipse.osbp.xtext.basic.validation;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;
import com.google.common.collect.Maps;
public class NamesAreUniqueValidationHelper extends org.eclipse.xtext.validation.NamesAreUniqueValidationHelper implements INamesAreUniqueValidationHelper {
protected final INamesAreUniqueValidationClassComparator classComparator;
public NamesAreUniqueValidationHelper(INamesAreUniqueValidationClassComparator classComparator) {
this.classComparator = classComparator;
}
@Override
protected void checkDescriptionForDuplicatedName(
IEObjectDescription description,
Map<EClass, Map<QualifiedName, IEObjectDescription>> clusterTypeToName,
ValidationMessageAcceptor acceptor) {
EObject object = description.getEObjectOrProxy();
EClass eClass = object.eClass();
QualifiedName qualifiedName = description.getName();
EClass clusterType = getAssociatedClusterType(eClass);
Map<QualifiedName, IEObjectDescription> nameToDescription = clusterTypeToName.get(clusterType);
if (nameToDescription == null) {
nameToDescription = Maps.newHashMap();
nameToDescription.put(qualifiedName, description);
clusterTypeToName.put(clusterType, nameToDescription);
} else {
if (nameToDescription.containsKey(qualifiedName)) {
IEObjectDescription prevDescription = nameToDescription.get(qualifiedName);
// !!! only if the description is not equal vvv
if (!description.equals(prevDescription)) {
// ^^^ only if the description is not equal !!!
if (prevDescription != null) {
EObject prevObject = prevDescription.getEObjectOrProxy();
if (classComparator.areOfEqualClass(object, prevObject)) {
createDuplicateNameError(prevDescription, clusterType, acceptor);
nameToDescription.put(qualifiedName, null);
createDuplicateNameError(description, clusterType, acceptor);
}
}
}
} else {
nameToDescription.put(qualifiedName, description);
}
}
}
@Override
protected void createDuplicateNameError(IEObjectDescription description, EClass clusterType, ValidationMessageAcceptor acceptor) {
EObject object = description.getEObjectOrProxy();
EStructuralFeature feature = getNameFeature(object);
// !!! only if a feature is available vvv
if (feature != null) {
// ^^^ only if a feature is available !!!
acceptor.acceptError(
getDuplicateNameErrorMessage(description, clusterType, feature),
object,
feature,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
getErrorCode());
}
}
}