| /******************************************************************************* |
| * Copyright (c) 2006 Oracle Corporation. |
| * 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 |
| * |
| * Contributors: |
| * Cameron Bateman/Oracle - initial API and implementation |
| * |
| ********************************************************************************/ |
| package org.eclipse.jst.jsf.ui.internal.validation; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.jst.jsf.common.internal.types.TypeComparatorDiagnosticFactory; |
| import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences; |
| import org.eclipse.jst.jsf.validation.internal.JSFTypeComparatorPreferences; |
| import org.eclipse.jst.jsf.validation.internal.ValidationPreferences; |
| import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory; |
| import org.eclipse.jst.jsf.validation.internal.facelet.FaceletDiagnosticFactory; |
| import org.eclipse.jst.jsf.validation.internal.facelet.FaceletValidationPreferences; |
| import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; |
| import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; |
| import org.eclipse.wst.validation.internal.core.Message; |
| import org.eclipse.wst.validation.internal.provisional.core.IMessage; |
| |
| /** |
| * Creates configured validation Message objects. |
| * |
| * @author cbateman |
| * |
| */ |
| public final class ValidationMessageFactory |
| { |
| private final Map<String, SeverityOverrideStrategy> _strategies; |
| private IStructuredModel _model = null; |
| |
| /** |
| * @param prefs |
| * @param model |
| */ |
| public ValidationMessageFactory(final ValidationPreferences prefs, |
| final IStructuredModel model) |
| { |
| _model = model; |
| _strategies = new HashMap<String, SeverityOverrideStrategy>(); |
| _strategies.put(DiagnosticFactory.SOURCE_ID, |
| new ELSeverityOverrideStrategy(prefs)); |
| _strategies.put(TypeComparatorDiagnosticFactory.SOURCE_IDENTIFIER, |
| new TypeComparatorOverrideStrategy(prefs)); |
| _strategies.put(FaceletDiagnosticFactory.SOURCE_ID, |
| new FaceletSeverityOverrideStrategy(prefs)); |
| } |
| |
| /** |
| * @param diagnostic |
| * @param offset |
| * @param length |
| * @param file |
| * @return a configured message |
| */ |
| public Message createFromDiagnostic(final Diagnostic diagnostic, |
| final int offset, final int length, final IFile file) |
| { |
| int severity = diagnostic.getSeverity(); |
| final String sourceId = diagnostic.getSource(); |
| final SeverityOverrideStrategy strategy = _strategies.get(sourceId); |
| // only override if there's a strategy to do so |
| if (strategy != null) |
| { |
| final Integer value = strategy.override(diagnostic); |
| if (value != null) |
| { |
| severity = value.intValue(); |
| } |
| } |
| final Message message = new MyLocalizedMessage( |
| convertSeverity(severity), diagnostic.getMessage(), file, |
| diagnostic.getCode()); |
| message.setOffset(offset); |
| message.setLength(length); |
| if (this._model != null) |
| { |
| IStructuredDocument flatModel = this._model.getStructuredDocument(); |
| if (flatModel != null) |
| { |
| int line = flatModel.getLineOfOffset(message.getOffset()); |
| if (line >= 0) |
| message.setLineNo(line + 1); |
| } |
| } |
| return message; |
| } |
| |
| /** |
| * @param severity |
| * @return a Message severity equivilent to diagnostic.getSeverity() |
| */ |
| private int convertSeverity(final int severity) |
| { |
| switch (severity) |
| { |
| case Diagnostic.ERROR: |
| return IMessage.HIGH_SEVERITY; |
| case Diagnostic.WARNING: |
| return IMessage.NORMAL_SEVERITY; |
| case Diagnostic.INFO: |
| return IMessage.LOW_SEVERITY; |
| case Diagnostic.OK: |
| default: |
| // no bits set |
| return 0; |
| } |
| } |
| |
| private static class ELSeverityOverrideStrategy extends |
| SeverityOverrideStrategy |
| { |
| private final ValidationPreferences _prefs; |
| |
| public ELSeverityOverrideStrategy(final ValidationPreferences prefs) |
| { |
| super(DiagnosticFactory.SOURCE_ID); |
| _prefs = prefs; |
| } |
| |
| @Override |
| public Integer override(final Diagnostic diagnostic) |
| { |
| final int code = diagnostic.getCode(); |
| final ELValidationPreferences elPrefs = _prefs.getElPrefs(); |
| return Integer.valueOf(elPrefs.getDiagnosticSeverity(code)); |
| } |
| |
| @Override |
| public String getDisplayName() |
| { |
| return Messages.ValidationMessageFactory_DefaultElSeverityDisplayName; |
| } |
| } |
| |
| private static class TypeComparatorOverrideStrategy extends |
| SeverityOverrideStrategy |
| { |
| private final ValidationPreferences _prefs; |
| |
| public TypeComparatorOverrideStrategy(final ValidationPreferences prefs) |
| { |
| super(TypeComparatorDiagnosticFactory.SOURCE_IDENTIFIER); |
| _prefs = prefs; |
| } |
| |
| @Override |
| public Integer override(final Diagnostic diagnostic) |
| { |
| final int code = diagnostic.getCode(); |
| final JSFTypeComparatorPreferences jsfTypeCompPrefs = _prefs |
| .getTypeComparatorPrefs(); |
| return Integer |
| .valueOf(jsfTypeCompPrefs.getDiagnosticSeverity(code)); |
| } |
| |
| @Override |
| public String getDisplayName() |
| { |
| return Messages.ValidationMessageFactory_DefaultTypeComparatorDisplayName; |
| } |
| } |
| |
| private static class FaceletSeverityOverrideStrategy extends |
| SeverityOverrideStrategy |
| { |
| private final ValidationPreferences _prefs; |
| |
| public FaceletSeverityOverrideStrategy(final ValidationPreferences prefs) |
| { |
| super(FaceletDiagnosticFactory.SOURCE_ID); |
| _prefs = prefs; |
| } |
| |
| @Override |
| public Integer override(final Diagnostic diagnostic) |
| { |
| final int code = diagnostic.getCode(); |
| final FaceletValidationPreferences faceletPrefs = _prefs |
| .getFaceletValidationPrefs(); |
| return Integer.valueOf(faceletPrefs.getDiagnosticSeverity(code)); |
| } |
| |
| @Override |
| public String getDisplayName() |
| { |
| return Messages.ValidationMessageFactory_DefaultFaceletSeverityDisplayName; |
| } |
| } |
| } |