/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.ui.internal.navigator.ear;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.javaee.application.Application;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;

/**
 * @author gormov
 *
 */
public abstract class AbstractEarNode {

	public final static String EAR_DEFAULT_LIB = "lib"; //$NON-NLS-1$

	public static int MODULES_TYPE = 0;    
	public static int LIBS_TYPE = 1;

	protected int type;

	protected static List implicitUtilityReferenceTypes =
		Arrays.asList(new String[] {  
				IModuleConstants.JST_APPCLIENT_MODULE,
				IModuleConstants.JST_WEB_MODULE,
				IModuleConstants.JST_EJB_MODULE,
				IModuleConstants.JST_CONNECTOR_MODULE});

	private IProject earProject;

	public AbstractEarNode(IProject earProject) {
		this.earProject = earProject;
	}

	public IProject getEarProject() {
		return earProject;
	}

	public abstract List getModules();


	public int getType() {
		return type;
	}

	public abstract String getText();

	protected List getComponentReferencesAsList(List componentTypes, IVirtualComponent virtualComponent, IPath runtimePath) {
		List components = new ArrayList();
		IVirtualComponent earComponent = virtualComponent;
		if (earComponent != null ) {
			IVirtualReference[] refComponents = earComponent.getReferences();
			for (int i = 0; i < refComponents.length; i++) {
				IVirtualComponent module = refComponents[i].getReferencedComponent();
				if (module == null) continue;
				// if component types passed in is null then return all components
				if (componentTypes == null || componentTypes.size() == 0) {
					components.add(refComponents[i]);
				} else {
					IPath runtimePath2 = getRealRuntimePath(refComponents[i]);
					if (runtimePath2.equals(runtimePath) && componentTypes.contains(JavaEEProjectUtilities.getJ2EEComponentType(module))) {
						components.add(refComponents[i]);
					}
				}
			}
		}
		return components;
	}

	/**
	 * This method will return complete list of the binaries contained in the lib dir.
	 * 
	 * @param virtualComponent
	 * @param runtimePath
	 * @return
	 */
	protected List getBinariesInLibDir(IVirtualComponent virtualComponent, IPath runtimePath, List componentTypes) {
		List components = new ArrayList();
		IVirtualComponent earComponent = virtualComponent;
		if (earComponent != null ) {
			IVirtualReference[] refComponents = earComponent.getReferences();
			for (int i = 0; i < refComponents.length; i++) {
				IVirtualComponent module = refComponents[i].getReferencedComponent();
				if (module == null) continue;
				// if component types passed in is null then return all components
				if (module.isBinary() && getRealRuntimePath(refComponents[i]).equals(runtimePath)) {
					if (componentTypes != null && !componentTypes.contains(JavaEEProjectUtilities.getJ2EEComponentType(module)) ) {
						if (!runtimePath.equals(new Path("/"))){//$NON-NLS-1$
							components.add(refComponents[i]);
						}
					} else {
						components.add(refComponents[i]);
					}


				} 
			}
		}
		return components;
	}
	
	
	/**
	 * This method will return all the binaries contained in the lib dir.
	 * It will not consider modules in lib dir as libraries for that use 
	 * getBinariesInLibDir(IVirtualComponent virtualComponent, IPath runtimePath, List componentTypes)
	 * 
	 * @param virtualComponent
	 * @param runtimePath
	 * @return
	 * @deprecated since it is not returning the complete list of libraries
	 *  use: getBinariesInLibDir(IVirtualComponent virtualComponent, IPath runtimePath, List componentTypes)
	 */
	protected List getBinariesInLibDir(IVirtualComponent virtualComponent, IPath runtimePath) {
		return getBinariesInLibDir(virtualComponent, runtimePath, null);
	}

	protected String recomputeLibFolder(IProject project){
		IModelProvider modelProvider = ModelProviderManager.getModelProvider(project);
		Object modelObject = modelProvider.getModelObject();
		if (Application.class.isInstance(modelObject)){
			String libraryDirectory = ((Application)modelObject).getLibraryDirectory();
			return libraryDirectory != null && libraryDirectory.length()>0 ? libraryDirectory : EAR_DEFAULT_LIB;
		}
		return EAR_DEFAULT_LIB;
	}

	protected IPath getRealRuntimePath(IVirtualReference vr){
		IPath runtimePath2 = vr.getRuntimePath();
		if(vr.getArchiveName() != null){
			IPath namePath = new Path (vr.getArchiveName());
			if (namePath.segmentCount()>1 && runtimePath2.segmentCount()==0){
				runtimePath2 = new Path("/"+namePath.removeLastSegments(1).toPortableString()); //$NON-NLS-1$
			}
		}
		return runtimePath2;
	}


}
