package org.eclipse.jst.jsf.facelet.ui.internal.validation;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.jst.jsf.ui.internal.validation.ValidationMessageFactory;
import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator;
import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
import org.eclipse.jst.jsf.validation.internal.strategy.DiagnosticFactory;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;

/*package*/class ValidationReporter implements
        IJSFViewValidator.IValidationReporter
{
    private final IValidator            _validator;
    private final IReporter             _reporter;
    private final IFile                 _file;
    private final ValidationMessageFactory  _factory;


    public ValidationReporter(final IValidator validator,
            final IReporter reporter, final IFile file,
            final ValidationPreferences prefs, 
            final IStructuredModel model)
    {
        _validator = validator;
        _reporter = reporter;
        _file = file;
        _factory = new ValidationMessageFactory(prefs, model);
    }

    public void report(final Diagnostic problem, final int start,
            final int length)
    {
    	if (shouldReportProblem(problem.getCode())) {
	        final IMessage message = _factory.createFromDiagnostic(
	                problem, start, length, _file);
	
	        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
	        {	        	
	        	_reporter.addMessage(_validator, message);
	        }
    	}
    }

    /**
     * @param problemCode
     * @return filters out problems to be reported by code
     */
    private boolean shouldReportProblem(final int problemCode) {
    	switch (problemCode) {
    		case DiagnosticFactory.CONTAINMENT_ERROR_MISSING_VIEW:
    			return false;
    		default:
    			return true;
    	}
	}

	public void report(IMessage message)
    {
		//not capable of filtering problems by code...   should not be used
        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
        {
            _reporter.addMessage(_validator, message);
        }
    }
}
