blob: 7ce9fb47b71579e258f70988399ec81b9ed58f1b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 SAP AG 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.core.ee;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.osgi.internal.framework.EquinoxConfiguration;
import org.eclipse.tycho.core.ee.shared.ExecutionEnvironment;
import org.eclipse.tycho.core.ee.shared.SystemCapability;
import org.eclipse.tycho.core.ee.shared.SystemCapability.Type;
import org.osgi.framework.Constants;
public class CustomExecutionEnvironment implements ExecutionEnvironment {
private static final Pattern VERSION_NUMBER_DOT_NUMBER_DOT_ZERO_PATTERN = Pattern.compile("(\\d+\\.\\d+)\\.0");
private static final Pattern JAVA_SECOND_EDITION_VERSIONS_PATTERN = Pattern.compile("(1\\.[0-5])");
private final String profileName;
private final Set<String> systemPackages = new LinkedHashSet<>();
private final Properties properties = new Properties();
// BEGIN construction
public CustomExecutionEnvironment(String profileName, List<SystemCapability> systemCapabilities) {
this.profileName = profileName;
setSystemPackages(systemCapabilities);
setExecutionEnvironmentProperties(systemCapabilities);
setOsgiSystemCapabilities(systemCapabilities);
// osgi.java.profile.name is not needed at runtime AFAIK but let's make it explicit that this is a custom profile
properties.setProperty(EquinoxConfiguration.PROP_OSGI_JAVA_PROFILE_NAME, profileName);
}
private void setSystemPackages(List<SystemCapability> systemCapabilities) {
StringBuilder systemPackagesProperty = new StringBuilder();
for (SystemCapability capability : systemCapabilities) {
if (capability.getType() == Type.JAVA_PACKAGE) {
final String packageName = capability.getName();
systemPackages.add(packageName);
append(systemPackagesProperty, toPackageSpecifier(packageName, capability.getVersion()));
}
}
setPropertyIfNotEmpty(Constants.FRAMEWORK_SYSTEMPACKAGES, systemPackagesProperty);
}
private void setExecutionEnvironmentProperties(List<SystemCapability> systemCapabilities) {
StringBuilder executionEnvironmentProperty = new StringBuilder();
for (SystemCapability capability : systemCapabilities) {
if (capability.getType() == Type.OSGI_EE) {
String environmentName = capability.getName();
String version = normalizeVersion(capability.getVersion());
append(executionEnvironmentProperty, toExecutionEnvironment(environmentName, version));
}
}
setPropertyIfNotEmpty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT, executionEnvironmentProperty);
}
private static final class MultipleVersionsCapability {
final String name;
int count = 0;
final StringBuilder versions = new StringBuilder();
public MultipleVersionsCapability(String environmentName, String version) {
name = environmentName;
addVersion(version);
}
private void addVersion(String version) {
if (count > 0) {
versions.append(", ");
}
versions.append(version);
count++;
}
@Override
public String toString() {
final StringBuilder result = new StringBuilder();
result.append("osgi.ee; osgi.ee=\"" + name + "\"; ");
if (count <= 1) {
result.append("version:Version=\"");
} else {
result.append("version:List<Version>=\"");
}
result.append(versions);
result.append("\"");
return result.toString();
}
}
private void setOsgiSystemCapabilities(List<SystemCapability> systemCapabilities) {
Map<String, MultipleVersionsCapability> capabilityMap = new LinkedHashMap<>();
for (SystemCapability capability : systemCapabilities) {
if (capability.getType() == Type.OSGI_EE) {
String environmentName = capability.getName();
String version = normalizeVersion(capability.getVersion());
if (capabilityMap.containsKey(environmentName)) {
capabilityMap.get(environmentName).addVersion(version);
} else {
capabilityMap.put(environmentName, new MultipleVersionsCapability(environmentName, version));
}
}
}
StringBuilder systemCapabilitesProperty = new StringBuilder();
for (MultipleVersionsCapability capability : capabilityMap.values()) {
append(systemCapabilitesProperty, capability.toString());
}
setPropertyIfNotEmpty(Constants.FRAMEWORK_SYSTEMCAPABILITIES, systemCapabilitesProperty);
}
private void setPropertyIfNotEmpty(String key, StringBuilder value) {
if (value.length() > 0) {
properties.setProperty(key, value.toString());
}
}
private static void append(StringBuilder propertyValue, final String value) {
if (propertyValue.length() > 0) {
propertyValue.append(",");
}
propertyValue.append(value);
}
private String normalizeVersion(String version) {
final Matcher matcher = VERSION_NUMBER_DOT_NUMBER_DOT_ZERO_PATTERN.matcher(version);
if (matcher.matches()) {
return matcher.group(1);
}
return version;
}
private String toExecutionEnvironment(String environmentName, String version) {
if ("JavaSE".equals(environmentName)) {
if (JAVA_SECOND_EDITION_VERSIONS_PATTERN.matcher(version).matches()) {
return appendVersion("J2SE", version);
}
}
if ("CDC/Foundation".equals(environmentName)) {
return appendVersion("CDC", version) + "/" + appendVersion("Foundation", version);
}
return appendVersion(environmentName, version);
}
private String appendVersion(String value, String version) {
return value + "-" + version;
}
private String toPackageSpecifier(String packageName, String packageVersion) {
if (packageVersion != null) {
return packageName + ";version=\"" + packageVersion + "\"";
} else {
return packageName;
}
}
// END construction
@Override
public String getProfileName() {
return profileName;
}
@Override
public Properties getProfileProperties() {
return properties;
}
@Override
public Set<String> getSystemPackages() {
return systemPackages;
}
@Override
public String getCompilerSourceLevelDefault() {
// unknown
return null;
}
@Override
public String getCompilerTargetLevelDefault() {
// unknown
return null;
}
@Override
public boolean isCompatibleCompilerTargetLevel(String target) {
// unknown, so give safe answer
return true;
}
// for debug purposes
@Override
public String toString() {
return "custom OSGi profile '" + getProfileName() + "'";
}
}