/*******************************************************************************
 * Copyright (c) 2007 BEA Systems, Inc
 * 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:
 *     rfrost@bea.com - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.classpathdep;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.common.internal.modulecore.IClasspathDependencyComponent;
import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualArchiveComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;

/**
 * Subclass of J2EEModuleVirtualArchiveComponent that represents the component references computed from Java classpath entries that
 * have been marked as publish/export dependencies. In most cases, the classpath entries will resolve into archive dependencies, 
 * however, class folder dependencies are also possible and those are represented as a reference to an VirtualComponent using this
 * class as well.
 */
public class ClasspathDependencyVirtualComponent extends J2EEModuleVirtualArchiveComponent implements IClasspathDependencyComponent {

	final private boolean isClassFolder;
	
	public ClasspathDependencyVirtualComponent(IProject aComponentProject, String location, boolean isClassFolder) {
		super(aComponentProject, location, null);
		this.isClassFolder = isClassFolder;
	}

	/**
	 * Returns true if this component represents a library class folder entry.
	 * @return True for class folders.
	 */
	public boolean isClassFolder() {
		return isClassFolder;
	}
	
	/**
	 * Returns the container for the specified class folder or null if does not represent a class folder.
	 * @return IContainer for the class folder or null if this reference does not match class folder.
	 */
	public IContainer getClassFolder() {
		if (!isClassFolder) {
			return null;
		}
		final IPath path = new Path(getName().substring(4));
		final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		final IContainer[] allContainers = root.findContainersForLocation(path);
		if (allContainers == null || allContainers.length == 0 || allContainers[0].getType() == IResource.ROOT) {
			return null;
		} 
		// return first matching container
		return allContainers[0];
	}
	
	@Override
	public IVirtualReference[] getReferences() {
		if (isClassFolder) {
			return NO_REFERENCES;
		}
		return super.getReferences();
	}

	@Override
	public String[] getManifestClasspath() {
		if (isClassFolder) {
			return new String[0];
		}
		return super.getManifestClasspath();
	}
	
	@Override
	public Object getAdapter(Class clazz) {
		if( isClassFolder && clazz.equals(IPath.class)) 
			return getClassFolder().getLocation();
		return super.getAdapter(clazz);
	}
}
