/**
 *                                                                            
 * 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 v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.entitymock.validation

import org.eclipse.emf.common.util.EList
import org.eclipse.osbp.xtext.entitymock.EntityMock
import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage
import org.eclipse.osbp.xtext.entitymock.EntityMockPackage
import org.eclipse.xtext.validation.Check

/**
 * Custom validation rules. 
 *
 * see http://www.eclipse.org/Xtext/documentation.html#validation
 */
class EntityMockDSLValidator extends AbstractEntityMockDSLValidator {

	@Check
	def void checkDuplicateElementId(EntityMock mock){ 
		var eObj = mock.eContainer()
		while (!(eObj instanceof EntityMockPackage)) {
			eObj = eObj.eContainer
		}
		if (eObj!==null){
			var mockPackage = eObj as EntityMockPackage;
			if (findDuplicateChartNames(mockPackage.mocks, mock.getName()) !== null){
				error("Duplicate name '".concat(mock.getName()).concat("'!"), EntityMockDSLPackage.Literals.ENTITY_MOCK__NAME)
			}
		}
	}
		
	def private EntityMock findDuplicateChartNames(
			EList<EntityMock> mocks, String mockName) {
		var tempSet = <String>newHashSet()
		for (EntityMock mock : mocks){
		   if (!tempSet.add(mock.name) && (mock.name.equals(mockName))){
			   return mock
		   }
		}
		return null
	}
}
