/**
* Copyright (c) 2015 Eclipse contributors and others.
* 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
*/
package org.eclipse.emf.ecore.xcore.ui.validation;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.xbase.ui.validation.ProjectAwareUniqueClassNameValidator;
/**
* Checks the genmodel property modelDir to identify types that are derived
* from the current resource.
*
* @author Sebastian Zarnekow
*/
public class XcoreUniqueClassNameValidator extends ProjectAwareUniqueClassNameValidator {
private static final String OUTPUT_DIR = "XcoreUniqueClassNameValidator.OUTPUT_DIR";
/*
* Store the configured model directory in the context map
* to make it available to #isDerived
*/
@Override
protected void doCheckUniqueName(JvmDeclaredType type) {
Map<Object, Object> currentContext = getContext();
if (currentContext != null && !currentContext.containsKey(OUTPUT_DIR)) {
Resource resource = type.eResource();
List<EObject> contents = resource.getContents();
if (contents.size() > 1) {
GenModel genmodel = (GenModel) contents.get(1);
String modelDirectory = genmodel.getModelDirectory();
currentContext.put(OUTPUT_DIR, new Path(modelDirectory));
}
}
super.doCheckUniqueName(type);
}
@Override
protected boolean isDerived(IResource resource) {
/*
* Since Xcore doesn't use an OutputConfigurationProvider but reads from the preferences
* directly to store the output directory in the genmodel, we use the path of the
* resource the check if it is contained in the output dir
*/
Map<Object, Object> currentContext = getContext();
IPath outputDir = (IPath) currentContext.get(OUTPUT_DIR);
if (outputDir != null && outputDir.isPrefixOf(resource.getFullPath())) {
return true;
}
return super.isDerived(resource);
}
}