/*******************************************************************************
 * 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 java.util.Collection;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.ArchiveFile;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.JAXRSLibraryRegistryFactory;
import org.osgi.framework.Bundle;

/**
 * Abstract delegate class used by jaxrsLibraries ext-pt to return collection of
 * ArchiveFiles to PluginProvidedJAXRSLibraryCreationHelper.
 * 
 * Caller must first setConfigurationElement(IConfigurationElement element)
 * before a call to getArchiveFiles().
 * 
 * <p>
 * <b>Provisional API - subject to change</b>
 * </p>
 * 
 * @deprecated along with the jaxrslibraries extension-point
 */
public abstract class JAXRSLibraryArchiveFilesDelegate {
	private IConfigurationElement extPtElement;
	private String libID = null;
	private IPath pluginPath = null;
	private String pluginID;
	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$

	/**
	 * Returns a Collection of
	 * <code>org.eclipse.jst.ws.jaxrs.core.internal.JAXRSLibraryregistry.ArchiveFile</code>
	 * instances.
	 * 
	 * @return A Collection of
	 *         <code>org.eclipse.jst.ws.jaxrs.core.internal.JAXRSLibraryregistry.ArchiveFile</code>
	 *         instances
	 */
	@SuppressWarnings("unchecked")
	public abstract Collection getArchiveFiles();

	/**
	 * Sets the IConfigurationElement instance to be subsequently used to get
	 * the plugin ID and the name defined for the JAXRS Library.
	 * 
	 * @param extPtElement
	 *            IConfigurationElement instance
	 */
	public final void setConfigurationElement(IConfigurationElement extPtElement) {
		this.extPtElement = extPtElement;
	}

	/**
	 * Constructs an instance.
	 */
	public JAXRSLibraryArchiveFilesDelegate() {
		super();
	}

	/**
	 * Sets the relative destination location subsequently used to set the
	 * corresponding property on each created ArchiveFile.
	 * 
	 * @param relPath
	 *            Relative destination location for ArchiveFile instances
	 */
	protected void setRelativeDestinationLocation(String relPath) {
		relativeDestLocation = relPath;
	}

	/**
	 * 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.
	 */
	protected ArchiveFile createArchiveFile(String relativePathFileName) {
		ArchiveFile file = JAXRSLibraryRegistryFactory.eINSTANCE
				.createArchiveFile();
		file.setRelativeToWorkspace(false);
		file.setSourceLocation(relativePathFileName);
		file.setRelativeDestLocation(relativeDestLocation);
		return file;
	}

	/**
	 * Returns the JAXRSLibrary ID as set on the extension point.
	 * 
	 * @return JAXRSLibrary ID
	 */
	protected String getLibID() {
		if (libID == null) {
			StringBuffer buf = new StringBuffer(getPluginID());
			buf
					.append("/").append(extPtElement.getAttribute(PluginProvidedJAXRSLibraryCreationHelper.NAME)); //$NON-NLS-1$
			libID = buf.toString();
		}
		return libID;
	}

	/**
	 * Returns the plugin's path.
	 * 
	 * @return The plugin's path.
	 */
	protected IPath getPluginPath() {
		if (pluginPath == null) {
			Bundle bundle = Platform.getBundle(getPluginID());
			pluginPath = new Path(bundle.getLocation());
		}
		return pluginPath;
	}

	/**
	 * Returns the plugin's ID.
	 * 
	 * @return The plugin's ID.
	 */
	private String getPluginID() {
		if (pluginID == null) {
			pluginID = extPtElement.getDeclaringExtension().getContributor()
					.getName();
		}
		return pluginID;
	}

}
