blob: dc297cfc46c4d937ec8b1de2e2d1894f205c3b42 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2010 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.runtime.core;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URI;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.launching.JREContainer;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager;
import org.eclipse.virgo.ide.manifest.core.BundleManifestCorePlugin;
import org.eclipse.virgo.ide.manifest.core.dependencies.IDependencyLocator;
import org.eclipse.virgo.ide.manifest.core.dependencies.IDependencyLocator.JavaVersion;
import org.eclipse.virgo.ide.runtime.internal.core.Server;
import org.eclipse.virgo.ide.runtime.internal.core.ServerBehaviour;
import org.eclipse.virgo.ide.runtime.internal.core.ServerRuntimeUtils;
import org.eclipse.virgo.ide.runtime.internal.core.VirgoServerRuntime;
import org.eclipse.virgo.ide.runtime.internal.core.utils.StatusUtil;
import org.eclipse.virgo.kernel.osgi.provisioning.tools.DependencyLocator;
import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.util.PublishUtil;
import org.osgi.framework.Constants;
/**
* @author Christian Dupuis
* @since 1.0.0
*/
@SuppressWarnings("restriction")
public class ServerUtils {
/** Path of the JRE container */
private static final String JRE_CONTAINER_STRING = "org.eclipse.jdt.launching.JRE_CONTAINER";
/** {@link Path} of the JRE classpath container */
private static final Path JRE_CONTAINER_PATH = new Path(JRE_CONTAINER_STRING);
private static final String[] NO_ADDITIONAL_SEARCH_PATHS = new String[0];
public static final String CACHE_LOCATION_PREFIX = "repository-cache";
public static final String REPOSITORY_DOWNLOADS_PREFIX = "repository-downloads";
private static final AtomicLong REPOSITORY_COUNTER = new AtomicLong();
/**
* Location of the bundle resolution cache used by the {@link DependencyLocator}
*/
public static final String CACHE_LOCATION = ServerCorePlugin.getDefault().getStateLocation().toFile() + "/" + CACHE_LOCATION_PREFIX + "-"
+ System.currentTimeMillis();
/** Source jar file suffix */
private static final String SOURCES_SUFFIX = "-sources";
/** Mapping of execution environment ids to {@link JavaVersion} */
private static final Map<String, JavaVersion> JAVA_VERSION_MAPPING;
static {
JAVA_VERSION_MAPPING = new HashMap<String, JavaVersion>();
JAVA_VERSION_MAPPING.put("J2SE-1.5", JavaVersion.Java5);
JAVA_VERSION_MAPPING.put("JavaSE-1.6", JavaVersion.Java6);
}
/**
* Returns the root of the installation directory.
*
* @param targetedServerRuntimes the targeted servers of this project
* @return path to server.profile file
*/
public static String getServerHome(IRuntime... targetedServerRuntimes) {
for (org.eclipse.wst.server.core.IRuntime serverRuntime : targetedServerRuntimes) {
VirgoServerRuntime sRuntime = (VirgoServerRuntime) serverRuntime.loadAdapter(VirgoServerRuntime.class, new NullProgressMonitor());
if (sRuntime != null) {
return serverRuntime.getLocation().toString();
}
}
return null;
}
/**
* Returns the targeted runtimes of the given project
*
* @param project the project to return the target runtimes for
*/
public static IRuntime[] getTargettedRuntimes(IProject project) {
final Set<org.eclipse.wst.server.core.IRuntime> targetedServerRuntimes = new LinkedHashSet<org.eclipse.wst.server.core.IRuntime>();
ServerRuntimeUtils.execute(project, new ServerRuntimeUtils.ServerRuntimeCallback() {
public boolean doWithRuntime(VirgoServerRuntime runtime) {
targetedServerRuntimes.add(runtime.getRuntime());
return true;
}
});
return targetedServerRuntimes.toArray(new IRuntime[targetedServerRuntimes.size()]);
}
/**
* Creates a {@link DependencyLocator} instance suitable for the given project.
*
* @param project the project
* @param additionalSearchPaths any additional search paths.
*/
public static IDependencyLocator createDependencyLocator(IProject project, String[] additionalSearchPaths) {
try {
IRuntime[] serverRuntimes = getTargettedRuntimes(project);
if (serverRuntimes == null || serverRuntimes.length == 0) {
return null;
}
return createDependencyLocator(serverRuntimes[0], getServerHome(serverRuntimes), additionalSearchPaths, getCacheDirectoryPath(),
getJavaVersion(project));
} catch (IOException e) {
StatusUtil.error("An IO Exception occurred.", e);
}
return null;
}
/**
* Creates a {@link DependencyLocator} instance suitable for the given runtime.
*
* @param project the project
* @param additionalSearchPaths any additional search paths.
*/
public static IDependencyLocator createDependencyLocator(IRuntime serverRuntime) {
if (serverRuntime == null) {
return null;
}
try {
// Create DependencyLocator with path to server.config and
// server.profile
return createDependencyLocator(serverRuntime, getServerHome(serverRuntime), NO_ADDITIONAL_SEARCH_PATHS, getCacheDirectoryPath(), null);
} catch (IOException e) {
StatusUtil.error(e);
}
return null;
}
private static IDependencyLocator createDependencyLocator(IRuntime runtime, String serverHomePath, String[] additionalSearchPaths,
String indexDirectoryPath, JavaVersion javaVersion) throws IOException {
IServerRuntimeWorkingCopy serverRuntime = (IServerRuntimeWorkingCopy) runtime.loadAdapter(IServerRuntimeWorkingCopy.class, null);
if (serverRuntime != null) {
IServerRuntimeProvider versionHandler = serverRuntime.getVirgoVersion();
if (versionHandler != null) {
return versionHandler.createDependencyLocator(runtime, serverHomePath, additionalSearchPaths, indexDirectoryPath, javaVersion);
}
}
return null;
}
/**
* Returns the cache directory to be used by the {@link DependencyLocator}
*/
private static String getCacheDirectoryPath() {
// trying to generated a thread unique directory name
File cacheDirectoryPath = new File(new StringBuilder(CACHE_LOCATION).append("-").append(REPOSITORY_COUNTER.getAndIncrement()).toString());
if (!cacheDirectoryPath.exists()) {
cacheDirectoryPath.mkdirs();
}
return cacheDirectoryPath.toString();
}
/**
* Returns the name of the source jar following the BRITS conventions
*/
public static File getSourceFile(URI uri) {
File file = new File(uri);
StringBuilder builder = new StringBuilder(file.getName());
int ix = builder.lastIndexOf("-");
if (ix > 0) {
builder.insert(ix, SOURCES_SUFFIX);
File sourceFile = new File(file.getParentFile(), builder.toString());
return sourceFile;
}
return null;
}
public static void clearCacheDirectory() {
File stateLocation = ServerCorePlugin.getDefault().getStateLocation().toFile();
for (File folder : stateLocation.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith(CACHE_LOCATION_PREFIX) || name.startsWith(REPOSITORY_DOWNLOADS_PREFIX);
}
})) {
PublishUtil.deleteDirectory(folder, new NullProgressMonitor());
}
}
/**
* Returns the {@link JavaVersion} of the given {@link IJavaProject}
*/
public static JavaVersion getJavaVersion(IProject project) {
IJavaProject javaProject = JavaCore.create(project);
if (javaProject != null) {
// first check the manifest for that
// Bundle-RequiredExecutionEnvironment
BundleManifest bundleManifest = BundleManifestCorePlugin.getBundleManifestManager().getBundleManifest(javaProject);
Dictionary<String, String> manifest = bundleManifest.toDictionary();
if (manifest != null && manifest.get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT) != null) {
String javaVersion = manifest.get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
return JAVA_VERSION_MAPPING.get(javaVersion);
}
// second check the project for a matching jvm
try {
IClasspathContainer container = JavaCore.getClasspathContainer(JRE_CONTAINER_PATH, javaProject);
if (container != null && container instanceof JREContainer) {
// reflection hack to get the internal jvm install
Field field = JREContainer.class.getDeclaredField("fVMInstall");
field.setAccessible(true);
IVMInstall vm = (IVMInstall) field.get(container);
IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
// check for strict match
for (IExecutionEnvironment executionEnvironment : manager.getExecutionEnvironments()) {
if (executionEnvironment.isStrictlyCompatible(vm)) {
return JAVA_VERSION_MAPPING.get(executionEnvironment.getId());
}
}
// check for default
for (IExecutionEnvironment executionEnvironment : manager.getExecutionEnvironments()) {
if (executionEnvironment.getDefaultVM() != null && executionEnvironment.getDefaultVM().equals(vm)) {
return JAVA_VERSION_MAPPING.get(executionEnvironment.getId());
}
}
// check for compatibility
for (IExecutionEnvironment executionEnvironment : manager.getExecutionEnvironments()) {
if (Arrays.asList(executionEnvironment.getCompatibleVMs()).contains(vm)) {
return JAVA_VERSION_MAPPING.get(executionEnvironment.getId());
}
}
}
} catch (Exception e) {
StatusUtil.error(e);
}
}
return null;
}
public static Server getServer(IServerBehaviour server) {
if (server instanceof ServerBehaviour) {
return (Server) ((ServerBehaviour) server).getServer().loadAdapter(Server.class, null);
}
return null;
}
public static VirgoServerRuntime getServerRuntime(IServerBehaviour server) {
if (server instanceof ServerBehaviour) {
if (((ServerBehaviour) server).getServer().getRuntime() == null) {
return null;
}
return (VirgoServerRuntime) ((ServerBehaviour) server).getServer().getRuntime().loadAdapter(VirgoServerRuntime.class, null);
}
return null;
}
}