/*************************************************************************************
 * Copyright (c) 2013 Red Hat, Inc. 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:
 *     Fred Bricon (Red Hat, Inc.) - initial API and implementation
 ************************************************************************************/
package org.eclipse.m2e.wtp.facets;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.m2e.wtp.internal.Messages;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * Extension reader used to instanciate {@link AbstractFacetDetector}s from plugin.xml extensions
 * 
 * @author Fred Bricon
 * @since 0.18.0
 */
/* package */ class FacetDetectorExtensionReader {

  private static final Logger LOG = LoggerFactory.getLogger(FacetDetectorExtensionReader.class);

  private static final String EXTENSION_FACET_DETECTORS = "org.eclipse.m2e.wtp.facetDetectors"; //$NON-NLS-1$

  private static final Object ELEMENT_FACET_DETECTOR = "facetDetector"; //$NON-NLS-1$

  public static synchronized Map<String, List<AbstractFacetDetector>> readFacetDetectorExtensions() {
    
    Map<String, List<AbstractFacetDetector>> map = new HashMap<String, List<AbstractFacetDetector>>();

    IExtensionRegistry registry = Platform.getExtensionRegistry();
    IExtensionPoint configuratorsExtensionPoint = registry.getExtensionPoint(EXTENSION_FACET_DETECTORS);
    if(configuratorsExtensionPoint != null) {
      IExtension[] configuratorExtensions = configuratorsExtensionPoint.getExtensions();
      for(IExtension extension : configuratorExtensions) {
        IConfigurationElement[] elements = extension.getConfigurationElements();
        for(IConfigurationElement element : elements) {
          if(element.getName().equals(ELEMENT_FACET_DETECTOR)) {
            try {
              String facetId = element.getAttribute(AbstractFacetDetector.ATTR_FACET_ID);
              Object o = element.createExecutableExtension(AbstractFacetDetector.ATTR_CLASS);
              AbstractFacetDetector facetDetector = (AbstractFacetDetector) o;
              List<AbstractFacetDetector> detectors = map.get(facetId);
              if (detectors == null){
                detectors = new ArrayList<>();
                map.put(facetId, detectors);
              }
              detectors.add(facetDetector);
            } catch(CoreException ex) {
              LOG.error(Messages.FacetDetectorExtensionReader_Error_Configuring_Facet_Detector, ex);
            }
          }
        }
      }
    }
    //Sort each detector list
    for ( List<AbstractFacetDetector> detectors : map.values()) {
      Collections.sort(detectors);
    }
    return map;
  }
}
