| /******************************************************************************* |
| * 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.validation.internal.facelet; |
| |
| import org.eclipse.core.runtime.preferences.IScopeContext; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel; |
| import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; |
| import org.eclipse.jst.jsf.validation.internal.Severity; |
| import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory; |
| |
| /** |
| * Model object for EL validation preferences |
| * |
| * @author cbateman |
| */ |
| public class FaceletValidationPreferences implements IJSFPreferenceModel |
| { |
| private int[] _severities; |
| |
| /** |
| * Loads the object from the preference store provided |
| * |
| * @param prefStore |
| */ |
| public void load(final IPreferenceStore prefStore) |
| { |
| loadSeverities(prefStore); |
| } |
| |
| private void loadSeverities(final IPreferenceStore prefStore) |
| { |
| final int severities[] = getSeverities(); |
| for (int i = 0; i < FaceletDiagnosticFactory.NUM_IDS; i++) |
| { |
| final String key = getKeyById(i); |
| if (!prefStore.contains(key)) |
| { |
| final int diagSeverity = getDefaultSeverity(i); |
| final Severity severity = mapDiagToSeverity(diagSeverity); |
| prefStore.setDefault(key, severity.toString()); |
| } |
| final String storedSeverity = prefStore.getString(key); |
| severities[i] = mapSeverityToDiag(storedSeverity); |
| } |
| } |
| |
| /** |
| * Copies the object into the preference store but DOES NOT SAVE IT |
| * |
| * @param prefStore |
| */ |
| public void commit(final IPreferenceStore prefStore) |
| { |
| commitSeverities(prefStore); |
| } |
| |
| private void commitSeverities(final IPreferenceStore prefStore) |
| { |
| final int severities[] = getSeverities(); |
| for (int i = 0; i < severities.length; i++) |
| { |
| final String key = getKeyById(i); |
| prefStore |
| .setValue(key, mapDiagToSeverity(severities[i]).toString()); |
| } |
| } |
| |
| /** |
| * Reverts the model to it's defaults. Does not commit to pref store. |
| */ |
| public void setDefaults() |
| { |
| setProblemSeverityDefaults(); |
| } |
| |
| private void setProblemSeverityDefaults() |
| { |
| final int[] severities = getSeverities(); |
| for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++) |
| { |
| severities[i] = getDefaultSeverity(i); |
| } |
| } |
| |
| public Object getValueByKey(final IScopeContext context, final String key) |
| { |
| // ignore context for now; will be used when we have project overrides |
| try |
| { |
| final Severity severity = getSeverity(key); |
| return severity.toString(); |
| } catch (final IllegalArgumentException e) |
| { |
| // getIdByKey will throw this exception if key is not a valid |
| // severity key. Ignore the exception here and fall-through |
| } |
| return null; // not found |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#getStoredValueByKey |
| * (org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String) |
| */ |
| public Object getStoredValueByKey(final IScopeContext context, final String key) |
| { |
| // ignore context for now; will be used when we have project overrides |
| try |
| { |
| return context |
| .getNode("org.eclipse.jst.jsf.core").get(key, mapDiagToSeverity(getDefaultSeverity(getIdByKey(key))).toString()); //$NON-NLS-1$ |
| } catch (final IllegalArgumentException e) |
| { |
| // getIdByKey will throw this exception if key is not a valid |
| // severity key. Ignore the exception here and fall-through |
| } |
| return null; // not found |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#setValueByKey(org |
| * .eclipse.core.runtime.preferences.IScopeContext, java.lang.String, |
| * java.lang.Object) |
| */ |
| public Object setValueByKey(final IScopeContext context, final String key, final Object value) |
| { |
| // ignore context for now; will be used when we have project overrides |
| final Severity oldValue = getSeverity(key); |
| setSeverity(key, (Severity) value); |
| return oldValue; |
| } |
| |
| /** |
| * @param key |
| * @return the severity |
| */ |
| public Severity getSeverity(final String key) |
| { |
| final int severityDiag = _severities[getIdByKey(key)]; |
| final Severity severity = mapDiagToSeverity(severityDiag); |
| return severity; |
| } |
| |
| /** |
| * @param key |
| * @param severity |
| */ |
| public void setSeverity(final String key, final Severity severity) |
| { |
| final int newSeverityDiag = mapSeverityToDiag(severity.toString()); |
| final int diagId = getIdByKey(key); |
| _severities[diagId] = newSeverityDiag; |
| } |
| |
| /** |
| * @param diagnosticId |
| * @return the severity as configured for diagnosticId. The value is |
| * relative to the Diagnostic class severity scheme |
| */ |
| public final int getDiagnosticSeverity(final int diagnosticId) |
| { |
| return getSeverities()[diagnosticId]; |
| } |
| |
| private int[] getSeverities() |
| { |
| if (_severities == null) |
| { |
| _severities = new int[FaceletDiagnosticFactory.NUM_IDS]; |
| } |
| return _severities; |
| } |
| |
| /** |
| * @param diagSeverity |
| * @return a Severity preference value for a diagnostic severity |
| */ |
| public static Severity mapDiagToSeverity(final int diagSeverity) |
| { |
| switch (diagSeverity) |
| { |
| case Diagnostic.ERROR: |
| return Severity.ERROR; |
| case Diagnostic.WARNING: |
| return Severity.WARNING; |
| default: |
| return Severity.IGNORE; |
| } |
| } |
| |
| /** |
| * @param severity |
| * @return a Diagnostic severity level for a severity pref string |
| */ |
| public static int mapSeverityToDiag(final String severity) |
| { |
| if ("error".equals(severity)) //$NON-NLS-1$ |
| { |
| return Diagnostic.ERROR; |
| } else if ("warning".equals(severity)) //$NON-NLS-1$ |
| { |
| return Diagnostic.WARNING; |
| } else if ("ignore".equals(severity)) //$NON-NLS-1$ |
| { |
| return Diagnostic.OK; |
| } else |
| { |
| throw new IllegalArgumentException("Invalid enum name: " + severity); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * @param diagnosticId |
| * @return the default severity of a diagnostic |
| */ |
| public static int getDefaultSeverity(final int diagnosticId) |
| { |
| switch (diagnosticId) |
| { |
| case FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID: |
| return Diagnostic.WARNING; |
| default: |
| throw new IllegalArgumentException( |
| "Diagnostic Id: " + diagnosticId + " is out of range"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| |
| /** |
| * @param diagnosticId |
| * @return the preference key for the corresponding diagnosticId in the el |
| * DiagnosticFactory |
| */ |
| public static String getKeyById(final int diagnosticId) |
| { |
| switch (diagnosticId) |
| { |
| case FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID: |
| return CANNOT_FIND_FACELET_TAGLIB; |
| default: |
| throw new IllegalArgumentException( |
| "Diagnostic Id: " + diagnosticId + " is out of range"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| |
| /** |
| * @param key |
| * @return the preference key for the corresponding diagnosticId in the el |
| * DiagnosticFactory |
| */ |
| public static int getIdByKey(final String key) |
| { |
| if (CANNOT_FIND_FACELET_TAGLIB.equals(key)) |
| { |
| return FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID; |
| } |
| throw new IllegalArgumentException("Severity Key: " + key); //$NON-NLS-1$ |
| } |
| |
| /** |
| * e.g. createQualifiedKeyName("foo") -> org.eclipse.jst.jsf.core.foo |
| * |
| * @param baseName |
| * @return a plugin qualified key given the baseName |
| * |
| */ |
| private static String createQualifiedKeyName(final String baseName) |
| { |
| return JSFCorePlugin.PLUGIN_ID + "." + baseName; //$NON-NLS-1$ |
| } |
| |
| /** |
| * preference key. Match to DiagnosticFactory constants |
| */ |
| public final static String CANNOT_FIND_FACELET_TAGLIB = createQualifiedKeyName("CANNOT_FIND_FACELET_TAGLIB"); //$NON-NLS-1$ |
| } |