blob: d2a7d5bbd514f8a61d90e57ee8d80145e4badbf8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 Sonatype Inc. 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:
* Sonatype Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.core.ee;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.osgi.internal.framework.EquinoxConfiguration;
import org.eclipse.tycho.core.ee.shared.ExecutionEnvironment;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.Constants;
/**
* Creative copy&paste from org.eclipse.osgi.framework.internal.core.Framework
*
* @author eclipse.org
* @author igor
*/
public class ExecutionEnvironmentUtils {
private static Map<String, StandardExecutionEnvironment> executionEnvironmentsMap = fillEnvironmentsMap();
private static Map<String, StandardExecutionEnvironment> fillEnvironmentsMap() {
Properties listProps = readProperties(findInSystemBundle("profile.list"));
List<String> profileFiles = new ArrayList<>(Arrays.asList(listProps.getProperty("java.profiles").split(",")));
profileFiles.add("JavaSE-10.profile");
profileFiles.add("JavaSE-11.profile");
profileFiles.add("JavaSE-12.profile");
profileFiles.add("JavaSE-13.profile");
Map<String, StandardExecutionEnvironment> envMap = new LinkedHashMap<>();
for (String profileFile : profileFiles) {
Properties props = readProperties(findInSystemBundle(profileFile.trim()));
envMap.put(props.getProperty("osgi.java.profile.name").trim(), new StandardExecutionEnvironment(props));
}
return envMap;
}
private static Properties readProperties(final URL url) {
Properties listProps = new Properties();
InputStream stream = null;
try {
stream = url.openStream();
listProps.load(stream);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (stream != null) {
stream.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return listProps;
}
/**
* Get the execution environment for the specified OSGi profile name.
*
* @param profileName
* profile name value as specified for key "Bundle-RequiredExecutionEnvironment" in
* MANIFEST.MF
* @return the corresponding {@link ExecutionEnvironment}.
* @throws UnknownEnvironmentException
* if profileName is unknown.
*/
public static StandardExecutionEnvironment getExecutionEnvironment(String profileName)
throws UnknownEnvironmentException {
StandardExecutionEnvironment executionEnvironment = executionEnvironmentsMap.get(profileName);
if (executionEnvironment == null) {
throw new UnknownEnvironmentException(profileName);
}
return executionEnvironment;
}
public static List<String> getProfileNames() {
return new ArrayList<>(executionEnvironmentsMap.keySet());
}
public static void applyProfileProperties(Properties properties, Properties profileProps) {
String systemExports = properties.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES);
// set the system exports property using the vm profile; only if the property is not already set
if (systemExports == null) {
systemExports = profileProps.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES);
if (systemExports != null)
properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES, systemExports);
}
// set the org.osgi.framework.bootdelegation property according to the java profile
String type = properties.getProperty(EquinoxConfiguration.PROP_OSGI_JAVA_PROFILE_BOOTDELEGATION); // a null value means ignore
String profileBootDelegation = profileProps.getProperty(Constants.FRAMEWORK_BOOTDELEGATION);
if (EquinoxConfiguration.PROP_OSGI_BOOTDELEGATION_OVERRIDE.equals(type)) {
if (profileBootDelegation == null)
properties.remove(Constants.FRAMEWORK_BOOTDELEGATION); // override with a null value
else
properties.put(Constants.FRAMEWORK_BOOTDELEGATION, profileBootDelegation); // override with the profile value
} else if (EquinoxConfiguration.PROP_OSGI_BOOTDELEGATION_NONE.equals(type))
properties.remove(Constants.FRAMEWORK_BOOTDELEGATION); // remove the bootdelegation property in case it was set
// set the org.osgi.framework.executionenvironment property according to the java profile
if (properties.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT) == null) {
// get the ee from the java profile; if no ee is defined then try the java profile name
String ee = profileProps.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT,
profileProps.getProperty(EquinoxConfiguration.PROP_OSGI_JAVA_PROFILE_NAME));
if (ee != null)
properties.put(Constants.FRAMEWORK_EXECUTIONENVIRONMENT, ee);
}
if (properties.getProperty(Constants.FRAMEWORK_SYSTEMCAPABILITIES) == null) {
String systemCapabilities = profileProps.getProperty(Constants.FRAMEWORK_SYSTEMCAPABILITIES);
if (systemCapabilities != null)
properties.put(Constants.FRAMEWORK_SYSTEMCAPABILITIES, systemCapabilities);
}
}
private static URL findInSystemBundle(String entry) {
// Check the ClassLoader in case we're launched off the Java boot classpath
ClassLoader loader = BundleActivator.class.getClassLoader();
return loader == null ? ClassLoader.getSystemResource(entry) : loader.getResource(entry);
}
}