/*******************************************************************************
 * Copyright (c) 2009, 2010 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
 * 20100420   309846 ericdp@ca.ibm.com - Eric D. Peters, Remove dead code related to e.p. pluginProvidedJaxrsLibraries
 *******************************************************************************/
package org.eclipse.jst.ws.jaxrs.core.jaxrslibraryconfiguration.internal;

import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrsibraryregistry.PluginProvidedJAXRSLibrary;
import org.eclipse.jst.ws.jaxrs.core.internal.jaxrslibraryconfig.JAXRSLibraryRegistryUtil;

/**
 * Factory for producing facade objects for references to the internal EMF JAXRS
 * Library classes
 * 
 * @deprecated
 * 
 * <p>
 * <b>Provisional API - subject to change - do not use</b>
 * </p>
 */
public class JAXRSLibraryReferenceFacadeFactory {
	/**
	 * Returns a JAXRSLibraryReferenceUserSpecified (or
	 * JAXRSLibraryReferenceUserDefined}) or JAXRSLibraryReferencePluginProvided
	 * instance. Will not create a JAXRSLibraryReferenceServerSupplied as there
	 * is no cp entry. Use createServerSuppliedJAXRSLibRef instead.
	 * 
	 * @param classpathEntry
	 * @return an instance of JAXRSLibraryInternalReference. Null will be
	 *         returned if the cpEntry is not a JAXRS Library reference.
	 */
	public static JAXRSLibraryReference create(
			final IClasspathEntry classpathEntry) {
		if (JAXRSLibraryConfigurationHelper
				.isJAXRSLibraryContainer(classpathEntry)) {
			return createReference(classpathEntry);
		}
		return null;
	}

	/**
	 * @param classpathEntry
	 * @return {@link JAXRSLibraryReference}
	 */
	private static JAXRSLibraryReference createReference(
			final IClasspathEntry classpathEntry) {

		String libID = classpathEntry.getPath().segment(1);
		org.eclipse.jst.ws.jaxrs.core.internal.jaxrslibraryconfig.JAXRSLibraryInternalReference libRef = JAXRSLibraryRegistryUtil
				.getInstance().getJAXRSLibraryReferencebyID(libID);
		if (libRef != null) {
			boolean isDeployed = getJ2EEModuleDependency(classpathEntry);
			if (libRef.getLibrary() instanceof PluginProvidedJAXRSLibrary)
				return new JAXRSLibraryReferencePluginProvidedImpl(libRef,
						isDeployed);

			return new JAXRSLibraryReferenceUserSpecifiedImpl(libRef,
					isDeployed);
		}
		return null;
	}

	private static boolean getJ2EEModuleDependency(
			IClasspathEntry classpathEntry) {
		IClasspathAttribute[] attrs = classpathEntry.getExtraAttributes();
		for (int i = 0; i < attrs.length; i++) {
			IClasspathAttribute attr = attrs[i];
			if (attr
					.getName()
					.equals(
							IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY)) {
				return true;
			}
		}
		return false;
	}
}
