/***************************************************************************************************
 * Copyright (c) 2003, 2004 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
 **************************************************************************************************/
package org.eclipse.jst.j2ee.internal.earcreation;


import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
import org.eclipse.jst.j2ee.internal.earcreation.modulemap.EARProjectMap;
import org.eclipse.jst.j2ee.internal.earcreation.modulemap.ModuleMapping;
import org.eclipse.jst.j2ee.internal.earcreation.modulemap.UtilityJARMapping;

import com.ibm.wtp.common.logger.proxy.Logger;

public class ModuleMapHelper {

	/**
	 * Constructor for ModuleMapHelper.
	 */
	protected ModuleMapHelper() {
		super();
	}

	public static ModuleMapping getModuleMapping(Module module, EARProjectMap projectMap) {
		if (module == null)
			return null;
		List maps = getModuleMappings(projectMap);
		for (int i = 0; i < maps.size(); i++) {
			ModuleMapping map = (ModuleMapping) maps.get(i);
			if (module.equals(map.getModule()))
				return map;
		}
		return null;
	}

	public static List getModuleMappings(EARProjectMap map) {
		if (map == null)
			return java.util.Collections.EMPTY_LIST;
		return map.getMappings();
	}

	public static UtilityJARMapping getUtilityJARMapping(String uri, EARProjectMap projectMap) {
		if (uri == null || projectMap == null)
			return null;
		List maps = getUtilityJARMappings(projectMap);
		for (int i = 0; i < maps.size(); i++) {
			UtilityJARMapping map = (UtilityJARMapping) maps.get(i);
			if (uri.equals(map.getUri()))
				return map;
		}
		return null;
	}

	public static List getUtilityJARMappings(EARProjectMap map) {
		if (map == null)
			return java.util.Collections.EMPTY_LIST;
		return map.getUtilityJARMappings();
	}

	public static EARProjectMap getEARProjectMap(Resource res) {
		if (res == null || res.getContents().isEmpty())
			return null;
		return (EARProjectMap) res.getContents().get(0);
	}

	public static List getAllMappedJARs(EARFile ear) {
		if (ear == null)
			return Collections.EMPTY_LIST;
		Resource res = null;
		try {
			res = ear.getMofResource(EAREditModel.MODULE_MAP_URI);
		} catch (Exception ex) {
			Logger.getLogger().logError(ex);
			return Collections.EMPTY_LIST;
		}
		EARProjectMap map = getEARProjectMap(res);
		if (map == null)
			return Collections.EMPTY_LIST;

		List result = new ArrayList();
		List moduleMaps = getModuleMappings(map);
		for (int i = 0; i < moduleMaps.size(); i++) {
			ModuleMapping mMap = (ModuleMapping) moduleMaps.get(i);
			Module m = mMap.getModule();
			if (m == null)
				continue;
			addArchiveIfNotNull(result, m.getUri(), ear);
		}
		List utilMaps = getUtilityJARMappings(map);
		for (int i = 0; i < utilMaps.size(); i++) {
			UtilityJARMapping uMap = (UtilityJARMapping) utilMaps.get(i);
			addArchiveIfNotNull(result, uMap.getUri(), ear);
		}
		return result;
	}

	protected static void addArchiveIfNotNull(List result, String uri, EARFile ear) {
		Archive anArchive = getArchive(uri, ear);
		if (anArchive != null)
			result.add(anArchive);
	}

	protected static Archive getArchive(String uri, EARFile ear) {
		if (uri == null || uri.trim().length() == 0)
			return null;
		try {
			return (Archive) ear.getFile(uri);
		} catch (FileNotFoundException ex) {
			Logger.getLogger().logError(ex);
		} catch (ClassCastException ex2) {
			Logger.getLogger().logError(ex2);
		}
		return null;
	}

	public static IProject getProject(String uri, EARFile ear) {
		if (uri == null || uri.length() == 0 || ear == null)
			return null;
		Resource res = null;
		try {
			res = ear.getMofResource(EAREditModel.MODULE_MAP_URI);
		} catch (Exception ex) {
			return null;
		}
		EARProjectMap map = getEARProjectMap(res);
		if (map == null)
			return null;

		String projectName = null;
		UtilityJARMapping uMap = getUtilityJARMapping(uri, map);
		if (uMap != null)
			projectName = uMap.getProjectName();
		else {
			Module m = ear.getDeploymentDescriptor().getFirstModule(uri);
			if (m != null) {
				ModuleMapping mMap = getModuleMapping(m, map);
				if (mMap != null)
					projectName = mMap.getProjectName();
			}
		}
		if (projectName != null && projectName.trim().length() > 0)
			return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName.trim());
		return null;
	}



}