/*******************************************************************************
 * Copyright (c) 2000, 2017 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.team.internal.core;

import java.util.*;

import org.eclipse.core.runtime.*;
import org.eclipse.team.core.Team;

/**
 *
 */
public class PluginStringMappings {

    private final String fExtensionID;
    private final String fAttributeName;

    private SortedMap<String, Integer> fMappings;

    public PluginStringMappings(String extensionID, String stringAttributeName) {
        fExtensionID= extensionID;
        fAttributeName= stringAttributeName;
    }

    /**
     * Load all the extension patterns contributed by plugins.
     * @return a map with the patterns
     */
    private SortedMap<String, Integer> loadPluginPatterns() {

        final SortedMap<String, Integer> result= new TreeMap<>();

        final TeamPlugin plugin = TeamPlugin.getPlugin();
        if (plugin == null)
            return result;

        final IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(TeamPlugin.ID, fExtensionID);//TeamPlugin.FILE_TYPES_EXTENSION);
        if (extension == null)
            return result;

        final IExtension[] extensions =  extension.getExtensions();

        for (int i = 0; i < extensions.length; i++) {
            IConfigurationElement[] configElements = extensions[i].getConfigurationElements();

            for (int j = 0; j < configElements.length; j++) {

                final String ext = configElements[j].getAttribute(fAttributeName);//"extension");
                final String type = configElements[j].getAttribute("type"); //$NON-NLS-1$
                if (ext == null || type == null)
                    continue;

                if (type.equals("text")) { //$NON-NLS-1$
                    result.put(ext, new Integer(Team.TEXT));
                } else if (type.equals("binary")) { //$NON-NLS-1$
                    result.put(ext, new Integer(Team.BINARY));
                }
            }
        }
        return result;
    }

    public Map<String, Integer> referenceMap() {
        if (fMappings == null) {
            fMappings= loadPluginPatterns();
        }
        return fMappings;
    }

    public int getType(String filename) {
        final Map<String, Integer> mappings= referenceMap();
        return mappings.containsKey(filename) ? mappings.get(filename).intValue() : Team.UNKNOWN;
    }
}
