/*******************************************************************************
 * Copyright (c) 2009 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
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20091021   291954 ericdp@ca.ibm.com - Eric D. Peters, JAX-RS: Implement JAX-RS Facet
 *******************************************************************************/
package org.eclipse.jst.ws.jaxrs.core.jaxrslibraryregistry.internal;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jst.ws.jaxrs.core.internal.JAXRSCorePlugin;
import org.eclipse.jst.ws.jaxrs.core.internal.Messages;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.ArchiveFile;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.JAXRSLibrary;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.JAXRSLibraryRegistryFactory;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.PluginProvidedJAXRSLibrary;
import org.eclipse.osgi.util.NLS;

/**
 * Helper class used to create plugin-rovided JAXRS Libraries from the
 * <code>org.eclipse.jst.ws.jaxrs.core.pluginProvidedJaxrsLibraries</code>
 * extension-point. <br>
 * 
 */
public final class PluginProvidedJAXRSLibraryCreationHelper2 {
	private PluginProvidedJAXRSLibrary newLib;
	private IConfigurationElement config_element;
	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$

	/**
	 * Key of the 'name' attribute of the extension point.
	 */
	public final static String NAME = "name"; //$NON-NLS-1$
	/**
	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
	 */
	public final static String DELEGATE = "archiveFilesDelegate"; //$NON-NLS-1$
	/**
	 * Key of the 'label' attribute of the extension point.
	 */
	public final static String LABEL = "label"; //$NON-NLS-1$

	/**
	 * Creates an instance with the specified IConfigurationElement instance.
	 * 
	 * @param JAXRSLibrary
	 *            IConfigurationElement instance
	 */
	public PluginProvidedJAXRSLibraryCreationHelper2(
			IConfigurationElement JAXRSLibrary) {
		this.config_element = JAXRSLibrary;
	}

	/**
	 * Add a jar file to the library
	 * 
	 * @param pluginRootRelativePath
	 */
	@SuppressWarnings("unchecked")
	public void addArchiveFile(String pluginRootRelativePath) {
		ArchiveFile jar = createArchiveFile(pluginRootRelativePath);
		if (!newLib.containsArchiveFile(jar.getSourceLocation()))
			newLib.getArchiveFiles().add(jar);
	}

	/**
	 * Creates a new PluginProvidedJAXRSLibrary from the JAXRSLibrary extension
	 * point.
	 * 
	 * @return PluginProvidedJAXRSLibrary instance.
	 */
	public JAXRSLibrary create() {
		newLib = JAXRSLibraryRegistryFactory.eINSTANCE
				.createPluginProvidedJAXRSLibrary();
		newLib.setPluginID(getPluginID());
		newLib.setName(config_element.getAttribute(NAME));
		String label = config_element.getAttribute(LABEL);
		if (label != null && label.length() > 0) {
			newLib.setLabel(label);
		}

		try {
			addArchives();
			return newLib;
		} catch (Exception e) {
			JAXRSCorePlugin
					.log(
							e,
							NLS
									.bind(
											Messages.PluginProvidedJAXRSLibraryCreationHelper_ErrorCreating,
											newLib.getName()));
		}
		return null;
	}

	/**
	 * Adds ArchiveFile instances to the specified JAXRSLibrary instance.
	 * 
	 * @param newLib
	 *            JAXRSLibrary instance
	 * @throws CoreException
	 *             on core failure.
	 */
	private void addArchives() throws CoreException {
		PluginProvidedJAXRSLibraryArchiveFilesDelegate jarCol = null;

		jarCol = (PluginProvidedJAXRSLibraryArchiveFilesDelegate) config_element
				.createExecutableExtension(DELEGATE);
		if (jarCol != null) {
			jarCol.setCreationHelper(this);
			jarCol.getArchiveFiles();
		}
	}

	/**
	 * Returns ArchiveFile where the location is set relative to the plugin. As
	 * long as the ArchiveFile is on the local machine somewhere, it should be
	 * locatable.
	 * 
	 * @param relativePathFileName
	 *            Relative location of the ArchiveFile
	 * @return ArchiveFile instance.
	 */
	private ArchiveFile createArchiveFile(String pluginRootRelativePath) {
		ArchiveFile file = JAXRSLibraryRegistryFactory.eINSTANCE
				.createArchiveFile();
		file.setRelativeToWorkspace(false);
		file.setSourceLocation(pluginRootRelativePath);
		file.setRelativeDestLocation(relativeDestLocation);
		return file;
	}

	/**
	 * Returns the plugin's ID.
	 * 
	 * @return The plugin's ID
	 */
	private String getPluginID() {
		return config_element.getDeclaringExtension().getContributor()
				.getName();
	}

}