/*
* 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.metamodel.aspect.core.aspects.validation.rules;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.container.Container;
import org.teiid.designer.core.container.ResourceFinder;
import org.teiid.designer.core.validation.ObjectValidationRule;
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;
import org.teiid.designer.metamodels.core.ModelImport;
/**
* ForeignKeyColumnsRule
*
* @since 8.0
*/
public class UnresolvedModelImportRule implements ObjectValidationRule {
/*
* @See org.teiid.designer.core.validation.ObjectValidationRule#validate(org.eclipse.emf.ecore.EObject, org.teiid.designer.core.validation.ValidationContext)
*/
@Override
public void validate( EObject eObject,
ValidationContext context ) {
CoreArgCheck.isInstanceOf(ModelImport.class, eObject);
final ModelImport modelImport = (ModelImport)eObject;
final String location = modelImport.getModelLocation();
final Resource resource = eObject.eResource();
if (resource == null || location == null) {
ValidationResult result = new ValidationResultImpl(eObject, resource);
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR,
ModelerCore.Util.getString("UnresolvedModelImportRule.0"), //$NON-NLS-1$
getLocationPath(modelImport), getURIString(modelImport));
result.addProblem(problem);
context.addResult(result);
return;
}
// Find the EMF Resource referenced by the model import ...
final Container container = context.getResourceContainer();
if (container != null) {
final ResourceFinder finder = container.getResourceFinder();
// Check to see if the import is to the Teiid Designer built-in datatypes
// resource or to one of the Emf XMLSchema resources
URI uri = URI.createURI(location);
if (finder.isBuiltInResource(uri)) {
return;
}
// Attempt to find the resource referenced by the ModelImport in the container
Resource importResource = finder.findByImport(modelImport, true);
if (importResource == null) {
ValidationResult result = new ValidationResultImpl(eObject, eObject.eResource());
String msg = ModelerCore.Util.getString("UnresolvedModelImportRule.The_model_import_cannot_be_resolved", location); //$NON-NLS-1$
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, msg, getLocationPath(modelImport),
getURIString(modelImport));
result.addProblem(problem);
context.addResult(result);
// jh fix for Defect 23067: added missing 'return'
return;
}
// If the model location value found in the ModelImport is different than the
// computed relative location, then the resource may have been moved or renamed
URI resourceURI = resource.getURI();
URI importURI = importResource.getURI();
if (resourceURI.isFile() && importURI.isFile()) {
boolean deresolve = (!resourceURI.isRelative() && resourceURI.isHierarchical());
if (deresolve && !importURI.isRelative()) {
URI deresolvedURI = importURI.deresolve(resourceURI, true, true, false);
if (deresolvedURI.hasRelativePath()) {
importURI = deresolvedURI;
}
}
if (!location.equals(URI.decode(importURI.toString()))) {
ValidationResult result = new ValidationResultImpl(eObject, eObject.eResource());
String msg = ModelerCore.Util.getString("UnresolvedModelImportRule.The_model_import_cannot_be_resolved", location); //$NON-NLS-1$
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, msg, getLocationPath(modelImport),
getURIString(modelImport));
result.addProblem(problem);
context.addResult(result);
}
}
// final boolean containerIsModelContainer = isModelContainer(container);
// if ( !containerIsModelContainer ) {
// final URI uriFromImport = URI.createURI(path);
// final Resource refedResource = container.getResource(uriFromImport, false);
// if ( refedResource == null ) {
// // Can't find referenced resource ...
// ValidationResult result = new ValidationResultImpl(eObject,eObject.eResource());
// Object[] params = new Object[]{path};
// String msg = ModelerCore.Util.getString("UnresolvedModelImportRule.The_model_import_cannot_be_resolved",params); //$NON-NLS-1$
// ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR ,msg);
// result.addProblem(problem);
// context.addResult(result);
// }
// return;
// }
}
// // There either was no container or it was the model container, so check the workspace ...
// IResource iResource = WorkspaceResourceFinderUtil.findIResource(path);
// if (iResource == null && !path.startsWith("http")) { //$NON-NLS-1$
// ValidationResult result = new ValidationResultImpl(eObject,eObject.eResource());
// Object[] params = new Object[]{path};
// String msg = ModelerCore.Util.getString("UnresolvedModelImportRule.The_model_import_cannot_be_resolved_in_the_workspace_1",params); //$NON-NLS-1$
// ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR ,msg);
// result.addProblem(problem);
// context.addResult(result);
// }
}
private static String getURIString( EObject eoj ) {
return ModelerCore.getModelEditor().getUri(eoj).toString();
}
private static String getLocationPath( EObject eoj ) {
return ModelerCore.getModelEditor().getModelRelativePath(eoj).toString();
}
// protected boolean isModelContainer( final Container container ) {
// final Container modelContainer;
// try {
// modelContainer = ModelerCore.getModelContainer();
// } catch (CoreException err) {
// ModelerCore.Util.log(err);
// return false;
// }
// return container == modelContainer;
// }
}