/*******************************************************************************
 * Copyright (c) 2002, 2006 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 - Initial API and implementation
 *   Jens Lukowski/Innoopract - initial renaming/restructuring
 *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
 *
 *******************************************************************************/
package org.eclipse.jst.jsf.contentmodel.annotation.internal;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.osgi.util.NLS;


/**
 * This class reads the Activator manifests and adds each specified grammar
 * annotation file to the CMAnnotationsRegistry.
 * 
 * @see CMAnnotationFileRegistry
 * @see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
 * @deprecated see common.metadata package
 */
public class CMAnnotationFileRegistryReader {
	protected static final String EXTENSION_POINT_ID = "annotationFiles"; //$NON-NLS-1$
	protected static final String TAG_NAME = "annotationFile"; //$NON-NLS-1$
	protected static final String ATT_URI = "uri"; //$NON-NLS-1$
	protected static final String ATT_LOCATION = "location"; //$NON-NLS-1$
	protected static final String ATT_LOCATOR = "locator"; //$NON-NLS-1$
	protected static final String ATT_PARSER = "parser"; //$NON-NLS-1$

	private CMAnnotationFileRegistry annotationFileRegistry;

	public CMAnnotationFileRegistryReader(CMAnnotationFileRegistry annotationFileRegistry) {
		this.annotationFileRegistry = annotationFileRegistry;
	}

	/**
	 * read the registery
	 */
	public void readRegistry() {
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
		if (point != null) {
			IConfigurationElement[] elements = point.getConfigurationElements();
			for (int i = 0; i < elements.length; i++) {
				readElement(elements[i]);
			}
		}
	}

	private void readElement(IConfigurationElement element) {
		if (element.getName().equals(TAG_NAME)) {
			String uri = element.getAttribute(ATT_URI);
			String location = element.getAttribute(ATT_LOCATION);
			String locator = element.getAttribute(ATT_LOCATOR);
			String parser = element.getAttribute(ATT_PARSER);
			String bundleId = null;
			if (uri != null && location != null) {
				try {
					bundleId = element.getContributor().getName();
					CMAnnotationFileInfo fileInfo = new CMAnnotationFileInfo(location, bundleId, parser, locator);
					annotationFileRegistry.addAnnotationFileInfo(uri, fileInfo);
				}
				catch (Exception e) {
					JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileRegistryReader_problem, new String[]{bundleId, uri, location})); 
				}
			}
		}
	}
}
