/*
* 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.metamodels.xsd.validator;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.common.xsd.XsdHeader;
import org.teiid.designer.common.xsd.XsdHeaderReader;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.validation.ResourceValidationRule;
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.xsd.XsdPlugin;
/**
* @since 8.0
*/
public class XsdResourceValidationRule implements ResourceValidationRule {
/**
* @see org.teiid.designer.core.validation.ResourceValidationRule#validate(org.eclipse.emf.ecore.resource.Resource,
* org.teiid.designer.core.validation.ValidationContext)
* @since 4.2
*/
@Override
public void validate( final Resource resource,
final ValidationContext context ) {
CoreArgCheck.isNotNull(resource);
CoreArgCheck.isNotNull(context);
if (!(resource instanceof XSDResourceImpl)) {
return;
}
// Get the schema object to create the markers on
XSDSchema schema = ((XSDResourceImpl)resource).getSchema();
if (schema != null) {
final ValidationResult result = new ValidationResultImpl(schema);
// Attempt to read the "schemaLocation" values from the XSDSchemaDirective declarations in the file
final URI uri = resource.getURI();
if (uri.isFile()) {
final File f = new File(uri.toFileString());
if (f.exists()) {
try {
final XsdHeader header = XsdHeaderReader.readHeader(f);
final List declarations = new ArrayList();
if (header != null) {
declarations.addAll(Arrays.asList(header.getImportSchemaLocations()));
declarations.addAll(Arrays.asList(header.getIncludeSchemaLocations()));
for (Iterator i = declarations.iterator(); i.hasNext();) {
String location = (String)i.next();
if (CoreStringUtil.isEmpty(location) || location.startsWith("http")) { //$NON-NLS-1$
continue;
}
URI baseUri = URI.createFileURI(f.getAbsolutePath());
URI locationUri = URI.createURI(location);
if (baseUri.isHierarchical() && !baseUri.isRelative() && locationUri.isRelative()) {
locationUri = locationUri.resolve(baseUri);
}
String uriString = (locationUri.isFile() ? locationUri.toFileString() : URI.decode(locationUri.toString()));
File importFile = new File(uriString);
if (!importFile.exists()) {
final String msg = XsdPlugin.Util.getString("XsdResourceValidationRule.Schema_directive_resolves_to_nonexistent_file", location); //$NON-NLS-1$
final ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, msg);
result.addProblem(problem);
}
}
}
} catch (Throwable e) {
ModelerCore.Util.log(e);
}
}
}
if (result.hasProblems()) {
context.addResult(result);
}
}
}
}