/* * 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.builder; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.core.designer.ModelerCoreException; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.core.validation.ValidationContext; import org.teiid.designer.core.validation.ValidationProblem; import org.teiid.designer.core.validation.ValidationResult; import org.teiid.designer.core.validation.Validator; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.core.workspace.ModelWorkspace; /** * XmiResourceValidator * * @since 8.0 */ public class XmiResourceValidator implements ResourceValidator { //================================================================================== // I N T E R F A C E M E T H O D S //================================================================================== /** * @see org.teiid.designer.core.builder.ResourceValidator#isValidatorForObject(java.lang.Object) * @since 4.2 */ @Override public boolean isValidatorForObject(final Object obj) { if (obj instanceof IResource) { return this.isValidatorForResource((IResource)obj); } else if (obj instanceof EmfResource) { return true; } return false; } /** * @see org.teiid.designer.core.builder.ResourceValidator#validate(org.eclipse.core.runtime.IProgressMonitor, java.lang.Object, org.teiid.designer.core.validation.ValidationContext) * @since 4.2 */ @Override public void validate(final IProgressMonitor monitor, final Object obj, final ValidationContext context) throws ModelerCoreException { if(!isValidatorForObject(obj) ){ final Object[] params = new Object[] {this.getClass().getName(),(obj != null ? obj.getClass().getName() : null)}; final String msg = ModelerCore.Util.getString("XmiResourceValidator.validator_cannot_be_used_to_validate_the_object",params); //$NON-NLS-1$ throw new ModelerCoreException(msg); } final IProgressMonitor progressMonitor = (monitor != null ? monitor : new NullProgressMonitor()); if (obj instanceof IResource) { final IResource iResource = (IResource)obj; final ModelWorkspace workspace = ModelerCore.getModelWorkspace(); final ModelResource mResource = workspace.findModelResource(iResource); if (mResource != null) { final Resource eResource = mResource.getEmfResource(); this.validate(progressMonitor, eResource, iResource, context); } } else if (obj instanceof EmfResource) { final EmfResource eResource = (EmfResource)obj; if (eResource.isLoaded()) { try { Validator.validate(monitor, eResource, context); } catch (Throwable e) { final String msg = ModelerCore.Util.getString("ModelBuilder.Error_validating_model_resource_2",eResource); //$NON-NLS-1$ ModelerCore.Util.log(IStatus.ERROR,e,msg); } } } } /** * @see org.teiid.designer.core.builder.ResourceValidator#addMarkers(org.teiid.designer.core.validation.ValidationContext, org.eclipse.core.resources.IResource) * @since 4.2 */ @Override public void addMarkers(final ValidationContext context, final IResource iResource) throws ModelerCoreException { if (context != null && context.hasResults()) { final List results = context.getValidationResults(); try { for (final Iterator iter = results.iterator(); iter.hasNext();) { final ValidationResult result = (ValidationResult)iter.next(); if (result != null && result.hasProblems()) { // defect 18922 - not jumping to the right entry in a mapping doc, // and showing what are apparently duplicates. ValidationProblem[] problems = result.getProblems(); String rsltLocationPath = result.getLocationPath(); String rsltLocationUri = result.getLocationUri(); String targetUri = result.getTargetUri(); for (int probCnt=0; probCnt < problems.length; probCnt++) { String probLocPath = problems[probCnt].getLocation(); if (probLocPath == null) { // problem's location path not specified; use result's: probLocPath = rsltLocationPath; } // endif String probURI = problems[probCnt].getURI(); if (probURI == null) { // problem's location URI not specified; use result's: probURI = rsltLocationUri; } // endif createProblemMarker(probLocPath, probURI, targetUri, problems[probCnt], iResource); } if(result.isFatalResource()) { return; } } } } catch (CoreException err) { throw new ModelerCoreException(err); } } } /** * @see org.teiid.designer.core.builder.ResourceValidator#isValidatorForResource(org.eclipse.core.resources.IResource) */ @Override public boolean isValidatorForResource(IResource iResource) { return (ModelUtil.isModelFile(iResource) && !ModelUtil.isXsdFile(iResource) ); } /** * @see org.teiid.designer.core.builder.ResourceValidator#validate(org.eclipse.emf.ecore.resource.Resource, org.eclipse.core.resources.IResource, org.teiid.designer.core.validation.ValidationContext) */ @Override public void validate(final IProgressMonitor progressMonitor, final Resource resource, final IResource iResource, final ValidationContext context) throws ModelerCoreException { final IProgressMonitor monitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor(); if( !(resource instanceof EmfResource) ){ final String msg = ModelerCore.Util.getString("XmiResourceValidator.XmiResourceValidator_may_only_be_used_to_validate_instances_of_EmfResource_1"); //$NON-NLS-1$ throw new ModelerCoreException(msg); } if(iResource == null){ final String msg = ModelerCore.Util.getString("XmiResourceValidator.IResource_may_not_be_null_during_validation_2"); //$NON-NLS-1$ throw new ModelerCoreException(msg); } if(!isValidatorForResource(iResource) ){ final String msg = ModelerCore.Util.getString("XmiResourceValidator.Unexpected_IResource_type_encountered_during_EMF_Resource_Validation_1"); //$NON-NLS-1$ throw new ModelerCoreException(msg); } final EmfResource emfResource = (EmfResource)resource; if (emfResource.isLoaded()) { try { Validator.validate(monitor, emfResource, context); } catch (Throwable e) { final String msg = ModelerCore.Util.getString("ModelBuilder.Error_validating_model_resource_2",emfResource); //$NON-NLS-1$ ModelerCore.Util.log(IStatus.ERROR,e,msg); } } } /** * @see org.teiid.designer.core.builder.ResourceValidator#validationStarted(java.util.Collection, org.teiid.designer.core.validation.ValidationContext) * @since 4.3 */ @Override public void validationStarted(final Collection resources, final ValidationContext context) { } /** * @see org.teiid.designer.core.builder.ResourceValidator#validationEnded(org.teiid.designer.core.validation.ValidationContext) * @since 4.3 */ @Override public void validationEnded(final ValidationContext context) { } // ================================================================================== // P R I V A T E M E T H O D S // ================================================================================== /** * Create a marker given a validationProblem */ private void createProblemMarker(final String locationPath, final String locationUri, final String targetUri, final ValidationProblem problem, final IResource resource) throws CoreException { IMarker marker = resource.createMarker(IMarker.PROBLEM); marker.setAttribute(IMarker.LOCATION, locationPath); marker.setAttribute(ModelerCore.MARKER_URI_PROPERTY, locationUri); marker.setAttribute(ModelerCore.TARGET_MARKER_URI_PROPERTY, targetUri); marker.setAttribute(IMarker.MESSAGE, problem.getMessage()); setMarkerSeverity(marker, problem); } /** * Get the set the severity on the marker given the validation problem. */ private void setMarkerSeverity(final IMarker marker, final ValidationProblem problem) throws CoreException { switch(problem.getSeverity()) { case IStatus.ERROR: marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); break; case IStatus.WARNING: marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING); break; case IStatus.INFO: marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO); break; default: return; } } }