/*******************************************************************************
 * Copyright (c) 2000, 2005 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.ui.internal.ide.registry;

import java.util.ArrayList;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;

/**
 * This class is used to read marker help context ids and 
 * resolutions from the platform registry.
 */
public class MarkerHelpRegistryReader extends IDERegistryReader {
    private MarkerHelpRegistry markerHelpRegistry;

    private ArrayList currentAttributeNames;

    private ArrayList currentAttributeValues;

    private static final String TAG_HELP = "markerHelp";//$NON-NLS-1$

    private static final String TAG_RESOLUTION_GENERATOR = "markerResolutionGenerator";//$NON-NLS-1$

    private static final String TAG_ATTRIBUTE = "attribute";//$NON-NLS-1$ 

    private static final String ATT_TYPE = "markerType";//$NON-NLS-1$

    private static final String ATT_NAME = "name";//$NON-NLS-1$

    private static final String ATT_VALUE = "value";//$NON-NLS-1$

    /**
     * Get the marker help that is defined in the plugin registry
     * and add it to the given marker help registry.
     * <p>
     * Warning:
     * The marker help registry must be passed in because this 
     * method is called during the process of setting up the 
     * marker help registry and at this time it has not been
     * safely setup with the plugin.
     * </p>
     */
    public void addHelp(MarkerHelpRegistry registry) {
        IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
        markerHelpRegistry = registry;
        readRegistry(extensionRegistry, IDEWorkbenchPlugin.IDE_WORKBENCH,
                IDEWorkbenchPlugin.PL_MARKER_HELP);
        readRegistry(extensionRegistry, IDEWorkbenchPlugin.IDE_WORKBENCH,
                IDEWorkbenchPlugin.PL_MARKER_RESOLUTION);
    }

    /**
     * Processes one configuration element or child element.
     */
    protected boolean readElement(IConfigurationElement element) {
        if (element.getName().equals(TAG_HELP)) {
            readHelpElement(element);
            return true;
        }
        if (element.getName().equals(TAG_RESOLUTION_GENERATOR)) {
            readResolutionElement(element);
            return true;
        }
        if (element.getName().equals(TAG_ATTRIBUTE)) {
            readAttributeElement(element);
            return true;
        }
        return false;
    }

    /**
     * Processes a help configuration element.
     */
    private void readHelpElement(IConfigurationElement element) {
        // read type
        String type = element.getAttribute(ATT_TYPE);

        // read attributes and values
        currentAttributeNames = new ArrayList();
        currentAttributeValues = new ArrayList();
        readElementChildren(element);
        String[] attributeNames = (String[]) currentAttributeNames
                .toArray(new String[currentAttributeNames.size()]);
        String[] attributeValues = (String[]) currentAttributeValues
                .toArray(new String[currentAttributeValues.size()]);

        // add query to the registry
        MarkerQuery query = new MarkerQuery(type, attributeNames);
        MarkerQueryResult result = new MarkerQueryResult(attributeValues);
        markerHelpRegistry.addHelpQuery(query, result, element);
    }

    /**
     * Processes a resolution configuration element.
     */
    private void readResolutionElement(IConfigurationElement element) {
        // read type
        String type = element.getAttribute(ATT_TYPE);

        // read attributes and values
        currentAttributeNames = new ArrayList();
        currentAttributeValues = new ArrayList();
        readElementChildren(element);
        String[] attributeNames = (String[]) currentAttributeNames
                .toArray(new String[currentAttributeNames.size()]);
        String[] attributeValues = (String[]) currentAttributeValues
                .toArray(new String[currentAttributeValues.size()]);

        // add query to the registry
        MarkerQuery query = new MarkerQuery(type, attributeNames);
        MarkerQueryResult result = new MarkerQueryResult(attributeValues);
        markerHelpRegistry.addResolutionQuery(query, result, element);
    }

    /**
     * Processes an attribute sub element.
     */
    private void readAttributeElement(IConfigurationElement element) {
        String name = element.getAttribute(ATT_NAME);
        String value = element.getAttribute(ATT_VALUE);
        if (name != null && value != null) {
            currentAttributeNames.add(name);
            currentAttributeValues.add(value);
        }
    }
}

