/******************************************************************************* * Copyright (c) 2010, 2015 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.help.internal.criteria; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.help.AbstractCriteriaDefinitionProvider; import org.eclipse.help.ICriteriaDefinitionContribution; import org.eclipse.help.internal.HelpPlugin; import org.eclipse.help.internal.util.ResourceLocator; import org.xml.sax.SAXParseException; /* * Provides criteria definition data from XML files to the help system. */ public class CriteriaDefinitionFileProvider extends AbstractCriteriaDefinitionProvider { private static final String ERROR_READING_HELP_CRITERIA_DEFINITION_FILE = "Error reading criteria definition file /\""; //$NON-NLS-1$ public static final String EXTENSION_POINT_ID_CRITERIA_DEFINITION = HelpPlugin.PLUGIN_ID + ".criteriaDefinition"; //$NON-NLS-1$ public static final String ELEMENT_NAME_CRITERIA = "criteriaDefinition"; //$NON-NLS-1$ public static final String ATTRIBUTE_NAME_FILE = "file"; //$NON-NLS-1$ /* (non-Javadoc) * @see org.eclipse.help.AbstractCriteriaDefinitionProvider#getCriteriaDefinitionContributions(java.lang.String) */ @Override public ICriteriaDefinitionContribution[] getCriteriaDefinitionContributions(String locale) { List<ICriteriaDefinitionContribution> contributions = new ArrayList<>(); CriteriaDefinitionFile[] criteriaDefinitionFiles = getCriteriaDefinitionFiles(locale); CriteriaDefinitionFileParser parser = new CriteriaDefinitionFileParser(); for (int i = 0; i < criteriaDefinitionFiles.length; ++i) { CriteriaDefinitionFile criteriaDefinitionFile = criteriaDefinitionFiles[i]; try { ICriteriaDefinitionContribution criteria = parser.parse(criteriaDefinitionFile); contributions.add(criteria); } catch (SAXParseException spe) { StringBuffer buffer = new StringBuffer(ERROR_READING_HELP_CRITERIA_DEFINITION_FILE); buffer.append(getCriteriaDefinitionFilePath(criteriaDefinitionFile)); buffer.append("\" at line "); //$NON-NLS-1$ buffer.append(spe.getLineNumber()); buffer.append(". "); //$NON-NLS-1$ buffer.append(spe.getMessage()); // Use the contained exception. Exception x = spe; if (spe.getException() != null) x = spe.getException(); HelpPlugin.logError(buffer.toString(), x); } catch (Throwable t) { String msg = ERROR_READING_HELP_CRITERIA_DEFINITION_FILE + getCriteriaDefinitionFilePath(criteriaDefinitionFile) + "\" (skipping file)"; //$NON-NLS-1$ HelpPlugin.logError(msg, t); } } return contributions.toArray(new ICriteriaDefinitionContribution[contributions.size()]); } private String getCriteriaDefinitionFilePath(CriteriaDefinitionFile criteriaDefinitionFile) { String pluginId = criteriaDefinitionFile.getPluginId(); String file = criteriaDefinitionFile.getFile(); return ResourceLocator.getErrorPath(pluginId, file, criteriaDefinitionFile.getLocale()); } /* * Returns all available CriteriaDefinitionFiles for the given locale. */ private CriteriaDefinitionFile[] getCriteriaDefinitionFiles(String locale) { List<CriteriaDefinitionFile> criteriaDefinitionFiles = new ArrayList<>(); IExtensionRegistry registry = Platform.getExtensionRegistry(); IConfigurationElement[] elements = registry.getConfigurationElementsFor(EXTENSION_POINT_ID_CRITERIA_DEFINITION); for (int i=0;i<elements.length;++i) { IConfigurationElement elem = elements[i]; String pluginId = elem.getContributor().getName(); if (elem.getName().equals(ELEMENT_NAME_CRITERIA)) { String file = elem.getAttribute(ATTRIBUTE_NAME_FILE); CriteriaDefinitionFile criteriaDefinitionFile = new CriteriaDefinitionFile(pluginId, file, locale); criteriaDefinitionFiles.add(criteriaDefinitionFile); } } return criteriaDefinitionFiles.toArray(new CriteriaDefinitionFile[criteriaDefinitionFiles.size()]); } }