/*******************************************************************************
 * Copyright (c) 2003, 2008 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.server.core.internal;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jst.server.core.IEnterpriseApplication;
import org.eclipse.jst.server.core.IJ2EEModule;
import org.eclipse.jst.server.core.IWebModule;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.ServerUtil;
/**
 * Utility class for dealing with J2EE modules.
 */
public class J2EEUtil {
	private static final String EAR_MODULE = "jst.ear";
	private static final String WEB_MODULE = "jst.web";

	private static final IModule[] EMPTY_LIST = new IModule[0];
	private static Map<IModule, List<IModule>> earCache;
	private static Map<IJ2EEModule, List<IModule>> earCache2;
	private static Map<IModule, List<IModule>> webCache;
	protected static String cache;

	/**
	 * Returns the enterprise applications that the module is contained within.
	 * 
	 * @param module a J2EE module
	 * @param monitor a progress monitor, or <code>null</code> if progress
	 *    reporting and cancellation are not desired
	 * @return a possibly empty array of enterprise applications
	 */
	public static IModule[] getEnterpriseApplications(IJ2EEModule module, IProgressMonitor monitor) {
		if (shouldUseCache()) {
			List<IModule> list = earCache2.get(module);
			if (list == null)
				return EMPTY_LIST;
			return list.toArray(new IModule[list.size()]); 
		}
		
		List<IModule> list = new ArrayList<IModule>();
		IModule[] modules = ServerUtil.getModules(EAR_MODULE);
		if (modules != null) {
			for (IModule module2 : modules) {
				IEnterpriseApplication ear = (IEnterpriseApplication) module2.loadAdapter(IEnterpriseApplication.class, monitor);
				if (ear != null) {
					IModule[] modules2 = ear.getModules();
					if (modules2 != null) {
						for (IModule m : modules2) {
							if (module.equals(m.loadAdapter(IJ2EEModule.class, monitor)))
								list.add(module2);
						}
					}
				}
			}
		}
		
		return list.toArray(new IModule[list.size()]);
	}

	/**
	 * Returns the enterprise applications that the module is contained within.
	 * 
	 * @param module a J2EE module or utility module
	 * @param monitor a progress monitor, or <code>null</code> if progress
	 *    reporting and cancellation are not desired
	 * @return a possibly empty array of enterprise applications
	 */
	public static IModule[] getEnterpriseApplications(IModule module, IProgressMonitor monitor) {
		if (shouldUseCache()) {
			List<IModule> list = earCache.get(module);
			if (list == null)
				return EMPTY_LIST;
			return list.toArray(new IModule[list.size()]); 
		}
		
		List<IModule> list = new ArrayList<IModule>();
		IModule[] modules = ServerUtil.getModules(EAR_MODULE);
		if (modules != null) {
			for (IModule module2 : modules) {
				IEnterpriseApplication ear = (IEnterpriseApplication) module2.loadAdapter(IEnterpriseApplication.class, monitor);
				if (ear != null) {
					IModule[] modules2 = ear.getModules();
					if (modules2 != null) {
						for (IModule m : modules2) {
							if (module.equals(m))
								list.add(module2);
						}
					}
				}
			}
		}
		
		return list.toArray(new IModule[list.size()]);
	}

	/**
	 * Returns the web modules that the utility module is contained within.
	 * 
	 * @param module a utility module
	 * @param monitor a progress monitor, or <code>null</code> if progress
	 *    reporting and cancellation are not desired
	 * @return a possibly empty array of web modules
	 */
	public static IModule[] getWebModules(IModule module, IProgressMonitor monitor) {
		if (shouldUseCache()) {
			List<IModule> list = webCache.get(module);
			if (list == null)
				return EMPTY_LIST;
			return list.toArray(new IModule[list.size()]);
		}
		
		List<IModule> list = new ArrayList<IModule>();
		IModule[] modules = ServerUtil.getModules(WEB_MODULE);
		if (modules != null) {
			for (IModule module2 : modules) {
				IWebModule web = (IWebModule) module2.loadAdapter(IWebModule.class, monitor);
				if (web != null) {
					IModule[] modules2 = web.getModules();
					if (modules2 != null) {
						for (IModule m : modules2) {
							if (module.equals(m))
								list.add(module2);
						}
					}
				}
			}
		}
		
		return list.toArray(new IModule[list.size()]);
	}

	private static void fillCache(IProgressMonitor monitor) {
		earCache = new HashMap<IModule, List<IModule>>();
		earCache2 = new HashMap<IJ2EEModule, List<IModule>>();
		webCache = new HashMap<IModule, List<IModule>>();
		
		IModule[] modules = ServerUtil.getModules(EAR_MODULE);
		if (modules != null) {
			for (IModule module2 : modules) {
				IEnterpriseApplication ear = (IEnterpriseApplication) module2.loadAdapter(IEnterpriseApplication.class, monitor);
				if (ear != null) {
					IModule[] modules2 = ear.getModules();
					if (modules2 != null) {
						for (IModule mm : modules2) {
							List<IModule> m = earCache.get(mm);
							if (m == null) {
								m = new ArrayList<IModule>(2);
								earCache.put(mm, m);
							}
							m.add(module2);
							
							IJ2EEModule mod = (IJ2EEModule) mm.loadAdapter(IJ2EEModule.class, monitor);
							if (mod != null) {
								m = earCache2.get(mod);
								if (m == null) {
									m = new ArrayList<IModule>(2);
									earCache2.put(mod, m);
								}
								m.add(module2);
							}
						}
					}
				}
			}
		}
		
		modules = ServerUtil.getModules(WEB_MODULE);
		if (modules != null) {
			for (IModule module2 : modules) {
				IWebModule web = (IWebModule) module2.loadAdapter(IWebModule.class, monitor);
				if (web != null) {
					IModule[] modules2 = web.getModules();
					if (modules2 != null) {
						for (IModule mm : modules2) {
							List<IModule> m = webCache.get(mm);
							if (m == null) {
								m = new ArrayList<IModule>(2);
								webCache.put(mm, m);
							}
							m.add(module2);
						}
					}
				}
			}
		}
	}

	private static boolean shouldUseCache() {
		String s = System.getProperty("J2EEcache");
		if (s == null || "".equals(s) || "false".equals(s)) {
			webCache = null;
			earCache = null;
			return false;
		}
		if (cache == null || !cache.equals(s)) {
			cache = s;
			fillCache(null);
		}
		return true;
	}
}