| /** |
| * |
| * 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()); |
| } |
| } |
| } |