blob: 2bbf8e9752d420e477bbade598042804f0d5f4b2 [file] [log] [blame]
/*******************************************************************************
* 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 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.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;
}
}