blob: 71de0df37bc08eaae3cbb777212468e01b6bdc9c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2018 IBM Corporation and others.
*
* 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.pde.internal.build;
import java.io.*;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.publisher.QuotedTokenizer;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
import org.eclipse.equinox.p2.publisher.eclipse.FeatureEntry;
import org.eclipse.equinox.simpleconfigurator.manipulator.SimpleConfiguratorManipulator;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.VersionRange;
import org.eclipse.pde.internal.build.site.*;
import org.osgi.framework.Filter;
import org.osgi.framework.Version;
public class ProductGenerator extends AbstractScriptGenerator {
private static final String SIMPLE_CONFIGURATOR_CONFIG_URL = "org.eclipse.equinox.simpleconfigurator.configUrl"; //$NON-NLS-1$
private static final String START_LEVEL_1 = "@1:start"; //$NON-NLS-1$
private static final String START_LEVEL_2 = "@2:start"; //$NON-NLS-1$
private static final String START = "@start"; //$NON-NLS-1$
private static final String INSTALL_INSTRUCTION = "installBundle(bundle:${artifact});"; //$NON-NLS-1$
private static final String UNINSTALL_INSTRUCTION = "uninstallBundle(bundle:${artifact});"; //$NON-NLS-1$
private static final String P2_INF_APPEND = "org.eclipse.pde.build.append"; //$NON-NLS-1$
private static final String P2_INF_START_LEVELS = "org.eclipse.pde.build.append.startlevels"; //$NON-NLS-1$
private static final String P2_INF_LAUNCHERS = "org.eclipse.pde.build.append.launchers"; //$NON-NLS-1$
private static final byte CONFIG_STYLE_ORIGINAL = 1;
private static final byte CONFIG_STYLE_REFACTORED = 2;
private static final byte CONFIG_STYLE_SIMPLE = 4;
private static final byte CONFIG_STYLE_UPDATE = 8;
private static final byte CONFIG_INCLUDES_DS = 16;
private String product = null;
private String featureId = null;
private ProductFile productFile = null;
private String root = null;
private Properties buildProperties;
private AssemblyInformation assembly = null;
@Override
public void generate() throws CoreException {
initialize();
if (productFile == null)
return;
String location = null, fileList = null;
for (Iterator<Config> iter = getConfigInfos().iterator(); iter.hasNext();) {
Config config = iter.next();
location = DEFAULT_PRODUCT_ROOT_FILES_DIR + '/' + config.toStringReplacingAny(".", ANY_STRING); //$NON-NLS-1$
String rootLocation = root + location;
File rootDir = new File(rootLocation);
if ((!rootDir.exists() && !rootDir.mkdirs()) || rootDir.isFile())
continue; //we will fail trying to create the files, TODO log warning/error
//add generated root files to build.properties
if (buildProperties != null) {
fileList = buildProperties.getProperty(ROOT_PREFIX + config.toString("."), ""); //$NON-NLS-1$ //$NON-NLS-2$
fileList += (fileList.length() > 0) ? ',' + location : location;
buildProperties.put(ROOT_PREFIX + config.toString("."), fileList); //$NON-NLS-1$
}
//configuration/config.ini
String custom = findConfigFile(productFile, config.getOs());
if (custom != null) {
try {
Utils.copyFile(custom, rootLocation + "/configuration/config.ini"); //$NON-NLS-1$
} catch (IOException e) {
//ignore
}
} else {
createConfigIni(config, rootLocation);
}
//only the config.ini makes sense in the any config
if (config.getOs().equals(Config.ANY))
continue;
//.eclipseproduct
createEclipseProductFile(rootLocation);
//eclipse.ini
createLauncherIniFile(rootLocation, config.getOs());
}
}
public void generateEclipseProduct() throws CoreException {
initialize();
if (productFile == null)
return;
String location = DEFAULT_PRODUCT_ROOT_FILES_DIR + "/ANY.ANY.ANY"; //$NON-NLS-1$
String rootLocation = root + location;
File rootDir = new File(rootLocation);
if ((!rootDir.exists() && !rootDir.mkdirs()) || rootDir.isFile())
return; //we will fail trying to create the files,
if (buildProperties == null)
buildProperties = new Properties();
String fileList = buildProperties.getProperty(ROOT, ""); //$NON-NLS-1$
fileList += (fileList.length() > 0) ? ',' + location : location;
buildProperties.put(ROOT, fileList);
//need to actually write the property changes out to disk
try {
Utils.writeProperties(buildProperties, new File(root, IPDEBuildConstants.PROPERTIES_FILE), ""); //$NON-NLS-1$
} catch (IOException e) {
return;
}
createEclipseProductFile(rootLocation);
}
public boolean generateP2Info() throws CoreException {
initialize();
int startIndex = 1;
boolean cus = true;
boolean launchers = true;
File initialInf = new File(productFile.getLocation().getParent(), "p2.inf"); //$NON-NLS-1$
if (initialInf.exists()) {
Properties properties = readProperties(initialInf.getParent(), "p2.inf", IStatus.OK); //$NON-NLS-1$
if (!Boolean.valueOf(properties.getProperty(P2_INF_APPEND, TRUE)).booleanValue())
return false;
cus = Boolean.valueOf(properties.getProperty(P2_INF_START_LEVELS, TRUE)).booleanValue();
launchers = Boolean.valueOf(properties.getProperty(P2_INF_LAUNCHERS, TRUE)).booleanValue();
startIndex = properties.size() + 1;
}
//only do start level cus if the .product said nothing
if (productFile.getConfigurationInfo().size() > 0 || productFile.haveCustomConfig())
cus = false;
StringBuffer buffer = new StringBuffer();
if (initialInf.exists()) {
//copy over initial contents
try {
StringBuffer inf = Utils.readFile(initialInf);
buffer.append(inf);
buffer.append('\n');
} catch (IOException e) {
return false;
}
}
generateP2InfCUs(buffer, startIndex, cus, launchers);
try {
File p2Inf = new File(root, "p2.inf"); //$NON-NLS-1$
Utils.writeBuffer(buffer, p2Inf);
} catch (IOException e) {
return false;
}
return true;
}
private BundleInfo[] getDefaultStartInfo() {
//TODO merge this with config.ini generation
//for now just set p2.inf values, implying refactored runtime and simpleconfigurator
BundleInfo[] defaults = new BundleInfo[6];
defaults[0] = new BundleInfo(BUNDLE_SIMPLE_CONFIGURATOR, null, null, 1, true);
defaults[1] = new BundleInfo(BUNDLE_EQUINOX_COMMON, null, null, 2, true);
defaults[2] = new BundleInfo(BUNDLE_OSGI, null, null, -1, true);
defaults[3] = new BundleInfo(BUNDLE_CORE_RUNTIME, null, null, 4, true);
defaults[4] = new BundleInfo(BUNDLE_DS, null, null, 2, true);
return defaults;
}
private void generateP2InfCUs(StringBuffer buffer, int startIndex, boolean cus, boolean launchers) {
int index = startIndex;
String productVersionString = productFile.getVersion();
String productRangeString = null;
if (productVersionString.endsWith(PROPERTY_QUALIFIER)) {
Version productVersion = new Version(productVersionString);
productVersionString = productVersion.getMajor() + "." + productVersion.getMinor() + "." + productVersion.getMicro() + ".$qualifier$"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
productRangeString = "[" + productVersionString + "," + productVersionString + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else {
productRangeString = new VersionRange(new Version(productVersionString), true, new Version(productVersionString), true).toString();
}
if (cus) {
BundleInfo[] infos = getDefaultStartInfo();
for (int i = 0; i < infos.length && infos[i] != null; i++) {
BundleDescription bundle = assembly.getPlugin(infos[i].getSymbolicName(), infos[i].getVersion());
if (bundle == null)
continue;
String[] instructions = new String[4];
instructions[P2InfUtils.INSTRUCTION_INSTALL] = INSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_UNINSTALL] = UNINSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_CONFIGURE] = "setStartLevel(startLevel:" + infos[i].getStartLevel() + ");markStarted(started:" + Boolean.toString(infos[i].isMarkedAsStarted()) + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
instructions[P2InfUtils.INSTRUCTION_UNCONFIGURE] = "setStartLevel(startLevel:-1);markStarted(started:false);"; //$NON-NLS-1$
if (!GENERIC_VERSION_NUMBER.equals(productVersionString))
P2InfUtils.printBundleCU(buffer, index++, bundle.getSymbolicName(), productVersionString, bundle.getVersion(), bundle.getPlatformFilter(), instructions);
else
P2InfUtils.printBundleCU(buffer, index++, bundle.getSymbolicName(), bundle.getVersion(), bundle.getPlatformFilter(), instructions);
}
}
try {
index = generateExtraRequirements(buffer, index);
} catch (CoreException e) {
//ignore
}
BundleDescription launcher = assembly.getPlugin(BUNDLE_EQUINOX_LAUNCHER, null);
if (launcher != null && launchers) {
VersionRange launcherRange = new VersionRange(launcher.getVersion(), true, launcher.getVersion(), true);
// include the launcher jar
P2InfUtils.printRequires(buffer, null, index++, P2InfUtils.NAMESPACE_IU, BUNDLE_EQUINOX_LAUNCHER, launcherRange, launcher.getPlatformFilter(), true);
// include a CU for the launcher jar
String[] instructions = new String[4];
instructions[P2InfUtils.INSTRUCTION_INSTALL] = INSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_UNINSTALL] = UNINSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_CONFIGURE] = "addProgramArg(programArg:-startup);addProgramArg(programArg:@artifact);"; //$NON-NLS-1$
instructions[P2InfUtils.INSTRUCTION_UNCONFIGURE] = "removeProgramArg(programArg:-startup);removeProgramArg(programArg:@artifact);"; //$NON-NLS-1$
P2InfUtils.printBundleCU(buffer, index++, BUNDLE_EQUINOX_LAUNCHER, launcher.getVersion(), null, instructions);
String brandedRange = productRangeString;
BuildTimeFeature executableFeature = assembly.getRootProvider(FEATURE_EQUINOX_EXECUTABLE, null);
if (executableFeature == null && havePDEUIState())
executableFeature = assembly.getRootProvider("org.eclipse.pde.container.feature", null); //$NON-NLS-1$
//in case of no version on the product, the branding defaults to the version of the launcher provider
if (executableFeature != null && productVersionString.equals(Version.emptyVersion.toString())) {
String brandedVersion = executableFeature.getVersion();
brandedRange = new VersionRange(new Version(brandedVersion), true, new Version(brandedVersion), true).toString();
}
List<Config> configs = getConfigInfos();
for (int i = 0; i < configs.size(); i++) {
Config config = configs.get(i);
if (config.equals(Config.genericConfig()))
continue;
String fragmentName = BUNDLE_EQUINOX_LAUNCHER + '.' + config.getWs() + '.' + config.getOs();
if (config.getOs().compareToIgnoreCase("macosx") != 0 || config.getArch().equals("x86_64")) //$NON-NLS-1$ //$NON-NLS-2$
fragmentName += '.' + config.getArch();
BundleDescription fragment = assembly.getPlugin(fragmentName, null);
if (fragment != null) {
VersionRange fragmentRange = new VersionRange(fragment.getVersion(), true, fragment.getVersion(), true);
//include the launcher fragment
P2InfUtils.printRequires(buffer, null, index++, P2InfUtils.NAMESPACE_IU, fragmentName, fragmentRange, fragment.getPlatformFilter(), true);
//include a CU for the launcher fragment
instructions = new String[4];
instructions[P2InfUtils.INSTRUCTION_INSTALL] = INSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_UNINSTALL] = UNINSTALL_INSTRUCTION;
instructions[P2InfUtils.INSTRUCTION_CONFIGURE] = "addProgramArg(programArg:--launcher.library);addProgramArg(programArg:@artifact);"; //$NON-NLS-1$
instructions[P2InfUtils.INSTRUCTION_UNCONFIGURE] = "removeProgramArg(programArg:--launcher.library);removeProgramArg(programArg:@artifact);"; //$NON-NLS-1$
//launcher CU gets same version as launcher
P2InfUtils.printBundleCU(buffer, index++, fragment.getSymbolicName(), fragment.getVersion(), fragment.getPlatformFilter(), instructions);
if (executableFeature != null) {
//include the branded executable
String brandedIU = productFile.getId() + "_root." + config.getWs() + '.' + config.getOs() + '.' + config.getArch(); //$NON-NLS-1$
P2InfUtils.printRequires(buffer, null, index++, P2InfUtils.NAMESPACE_IU, brandedIU, brandedRange, config.getPlatformFilter(), true);
//include a CU for the branded exe
instructions = new String[4];
String launcherName = getLauncherName(executableFeature);
instructions[P2InfUtils.INSTRUCTION_CONFIGURE] = "setLauncherName(name:" + launcherName + ")"; //$NON-NLS-1$ //$NON-NLS-2$
instructions[P2InfUtils.INSTRUCTION_UNCONFIGURE] = "setLauncherName()"; //$NON-NLS-1$
P2InfUtils.printIU(buffer, index++, brandedIU, productVersionString, config.getPlatformFilter(), instructions);
}
}
}
}
}
private int generateExtraRequirements(StringBuffer buffer, int index) throws CoreException {
BuildTimeFeature rootFeature = getSite(false).findFeature(featureId, null, false);
if (rootFeature == null)
return index;
Properties properties = AbstractScriptGenerator.readProperties(new Path(rootFeature.getRootLocation()).toOSString(), PROPERTIES_FILE, IStatus.OK);
String[] extraEntries = Utils.getArrayFromString(properties.getProperty(PRODUCT_PREFIX + productFile.getId()));
for (int i = 0; i < extraEntries.length; i++) {
Map<String, Object> entry = Utils.parseExtraBundlesString(extraEntries[i], true);
String id = (String) entry.get(Utils.EXTRA_ID);
Version version = (Version) entry.get(Utils.EXTRA_VERSION);
boolean feature = extraEntries[i].startsWith("feature@");//$NON-NLS-1$
VersionRange range = null;
String versionString = version.toString();
if (feature) {
BuildTimeFeature requiredFeature = getSite(false).findFeature(id, version.toString(), false);
if (requiredFeature != null)
versionString = requiredFeature.getVersion();
} else {
BundleDescription bundle = getSite(false).getRegistry().getResolvedBundle(id, version.toString());
if (bundle != null)
versionString = bundle.getVersion().toString();
}
range = Utils.createVersionRange(versionString);
P2InfUtils.printRequires(buffer, null, index++, P2InfUtils.NAMESPACE_IU, id + (feature ? ".feature.group" : ""), range, null, true); //$NON-NLS-1$ //$NON-NLS-2$
}
return index;
}
private String getLauncherName(BuildTimeFeature executableProvider) {
String name = productFile.getLauncherName();
if (name != null)
return name;
return "eclipse"; //$NON-NLS-1$
}
private void initialize() throws CoreException {
productFile = loadProduct(product);
}
private byte determineConfigStyle(Config config) {
byte result = 0;
if (assembly.getPlugin(BUNDLE_SIMPLE_CONFIGURATOR, null) != null) {
result |= CONFIG_STYLE_SIMPLE;
}
if (assembly.getPlugin(BUNDLE_DS, null) != null)
result |= CONFIG_INCLUDES_DS;
if (assembly.getPlugin(BUNDLE_EQUINOX_COMMON, null) != null)
return (byte) (result | CONFIG_STYLE_REFACTORED);
return (byte) (result | CONFIG_STYLE_ORIGINAL);
}
private List<BundleDescription> getBundlesFromProductFile(Config config) {
BundleHelper helper = BundleHelper.getDefault();
Dictionary<String, String> environment = new Hashtable<>(3);
environment.put("osgi.os", config.getOs()); //$NON-NLS-1$
environment.put("osgi.ws", config.getWs()); //$NON-NLS-1$
environment.put("osgi.arch", config.getArch()); //$NON-NLS-1$
List<FeatureEntry> pluginList = productFile.getProductEntries();
List<BundleDescription> results = new ArrayList<>(pluginList.size());
for (Iterator<FeatureEntry> iter = pluginList.iterator(); iter.hasNext();) {
FeatureEntry entry = iter.next();
if (!entry.isPlugin())
continue;
BundleDescription bundle = assembly.getPlugin(entry.getId(), entry.getVersion());
if (bundle != null) {
Filter filter = helper.getFilter(bundle);
if (filter == null || filter.match(environment))
results.add(bundle);
}
}
return results;
}
private void printSimpleBundles(StringBuffer buffer, Config config, File configDir, byte style) {
buffer.append("osgi.bundles="); //$NON-NLS-1$
buffer.append(BUNDLE_SIMPLE_CONFIGURATOR);
buffer.append(START_LEVEL_1);
buffer.append("\n"); //$NON-NLS-1$
Collection<BundleDescription> plugins = null;
if (productFile.useFeatures())
plugins = assembly.getPlugins(config);
else
plugins = getBundlesFromProductFile(config);
File bundlesTxt = P2Utils.writeBundlesTxt(plugins, configDir, productFile, (style & CONFIG_STYLE_REFACTORED) > 0);
if (bundlesTxt != null) {
buffer.append(SIMPLE_CONFIGURATOR_CONFIG_URL);
buffer.append("=file:"); //$NON-NLS-1$
buffer.append(SimpleConfiguratorManipulator.BUNDLES_INFO_PATH);
buffer.append("\n"); //$NON-NLS-1$
}
}
private void printBundleInfo(StringBuffer buffer, BundleInfo info) {
buffer.append(info.getSymbolicName());
if (info.getStartLevel() != BundleInfo.NO_LEVEL || info.isMarkedAsStarted())
buffer.append('@');
if (info.getStartLevel() > 0) {
buffer.append(info.getStartLevel());
if (info.isMarkedAsStarted())
buffer.append(':');
}
if (info.isMarkedAsStarted())
buffer.append("start"); //$NON-NLS-1$
}
private void printUpdateBundles(StringBuffer buffer, int style) {
Map<String, BundleInfo> infos = productFile.getConfigurationInfo();
buffer.append("osgi.bundles="); //$NON-NLS-1$
if (infos.size() > 0) {
//user specified
for (Iterator<BundleInfo> iterator = infos.values().iterator(); iterator.hasNext();) {
BundleInfo info = iterator.next();
printBundleInfo(buffer, info);
if (iterator.hasNext())
buffer.append(',');
}
} else {
if ((style & CONFIG_STYLE_REFACTORED) > 0) {
//start levels for eclipse 3.2
//org.eclipse.equinox.common@2:start,
buffer.append(BUNDLE_EQUINOX_COMMON);
buffer.append(START_LEVEL_2);
buffer.append(',');
if ((style & CONFIG_INCLUDES_DS) > 0) {
//org.eclipse.equinox.ds@1:start
buffer.append(BUNDLE_DS);
buffer.append(START_LEVEL_2);
buffer.append(',');
}
//org.eclipse.core.runtime
buffer.append(BUNDLE_CORE_RUNTIME);
buffer.append(START);
} else {
//start level for 3.1 and 3.0
buffer.append(BUNDLE_CORE_RUNTIME);
buffer.append(START_LEVEL_2);
}
}
buffer.append('\n');
}
private void printAllBundles(StringBuffer buffer, Config config, byte style) {
String newline = "win32".equals(config.getOs()) ? "\r\n" : "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
buffer.append("osgi.bundles="); //$NON-NLS-1$
//When the plugins are all listed.
Dictionary<String, String> environment = new Hashtable<>(3);
environment.put("osgi.os", config.getOs()); //$NON-NLS-1$
environment.put("osgi.ws", config.getWs()); //$NON-NLS-1$
environment.put("osgi.arch", config.getArch()); //$NON-NLS-1$
Collection<BundleDescription> bundles = null;
if (productFile.useFeatures())
bundles = assembly.getPlugins(config);
else
bundles = getBundlesFromProductFile(config);
BundleHelper helper = BundleHelper.getDefault();
Map<String, BundleInfo> infos = productFile.getConfigurationInfo();
boolean first = true;
for (Iterator<BundleDescription> iter = bundles.iterator(); iter.hasNext();) {
BundleDescription bundle = iter.next();
String id = bundle.getSymbolicName();
if (BUNDLE_OSGI.equals(id) || BUNDLE_EQUINOX_LAUNCHER.equals(id))
continue;
Filter filter = helper.getFilter(bundle);
if (filter == null || filter.match(environment)) {
if (first)
first = false;
else
buffer.append(",\\" + newline + " "); //$NON-NLS-1$ //$NON-NLS-2$
if (infos.size() > 0) {
if (infos.containsKey(id))
printBundleInfo(buffer, infos.get(id));
else
buffer.append(bundle.getSymbolicName());
} else {
buffer.append(bundle.getSymbolicName());
if (BUNDLE_EQUINOX_COMMON.equals(id)) {
buffer.append(START_LEVEL_2);
} else if (BUNDLE_DS.equals(id)) {
buffer.append(START_LEVEL_2);
} else if (BUNDLE_CORE_RUNTIME.equals(id)) {
if ((style & CONFIG_STYLE_REFACTORED) > 0) {
buffer.append(START);
} else {
buffer.append(START_LEVEL_2);
}
}
}
}
}
buffer.append('\n');
}
private void createConfigIni(Config config, String location) throws CoreException {
File configDir = new File(location + "/configuration"); //$NON-NLS-1$
if ((!configDir.exists() && !configDir.mkdirs()) || configDir.isFile())
return; //we will fail trying to create the file, TODO log warning/error
byte configStyle = determineConfigStyle(config);
StringBuffer buffer = new StringBuffer();
buffer.append("#Product Runtime Configuration File\n"); //$NON-NLS-1$
Properties properties = productFile.getConfigProperties();
String splash = getSplashLocation(config);
if (splash != null)
properties.put("osgi.splashPath", splash); //$NON-NLS-1$
String application = productFile.getApplication();
if (application != null)
properties.put("eclipse.application", application); //$NON-NLS-1$
String productId = productFile.getProductId();
if (productId != null)
properties.put("eclipse.product", productId); //$NON-NLS-1$
if (!properties.containsKey("osgi.bundles.defaultStartLevel")) //$NON-NLS-1$
properties.put("osgi.bundles.defaultStartLevel", "4"); //$NON-NLS-1$ //$NON-NLS-2$
for (Iterator<Object> iterator = properties.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
buffer.append(key);
buffer.append('=');
buffer.append(properties.getProperty(key));
buffer.append('\n');
}
if ((configStyle & CONFIG_STYLE_SIMPLE) > 0) {
printSimpleBundles(buffer, config, configDir, configStyle);
} else {
//When update configurator is present or when feature based product
if ((configStyle & CONFIG_STYLE_UPDATE) > 0) {
printUpdateBundles(buffer, configStyle);
} else {
printAllBundles(buffer, config, configStyle);
}
}
try (FileWriter writer = new FileWriter(new File(configDir, "config.ini"))) { //$NON-NLS-1$
writer.write(buffer.toString());
} catch (IOException e) {
//nothing
}
}
private void createEclipseProductFile(String directory) throws CoreException {
File dir = new File(directory);
if ((!dir.exists() && !dir.mkdirs()) || dir.isFile())
return; //we will fail trying to create the file, TODO log warning/error
Properties properties = new Properties();
if (productFile.getProductName() != null)
properties.put("name", productFile.getProductName()); //$NON-NLS-1$
if (productFile.getProductId() != null)
properties.put(ID, productFile.getProductId());
if (properties.size() == 0)
return;
String branding = getBrandingPlugin();
if (branding != null) {
BundleDescription bundle = getSite(false).getRegistry().getResolvedBundle(branding);
if (bundle != null)
properties.put(VERSION, bundle.getVersion().toString());
}
File file = new File(dir, ".eclipseproduct"); //$NON-NLS-1$
try (OutputStream stream = new BufferedOutputStream(new FileOutputStream(file));) {
properties.store(stream, "Eclipse Product File"); //$NON-NLS-1$
stream.flush();
} catch (IOException e) {
//nothing
}
}
private String getBrandingPlugin() {
String id = productFile.getProductId();
if (id == null)
return null;
int dot = id.lastIndexOf('.');
return (dot != -1) ? id.substring(0, dot) : null;
}
private String getSplashLocation(Config config) throws CoreException {
String plugin = productFile.getSplashLocation();
if (plugin == null) {
plugin = getBrandingPlugin();
}
if (plugin == null)
return null;
StringBuffer buffer = new StringBuffer("platform:/base/plugins/"); //$NON-NLS-1$
buffer.append(plugin);
Dictionary<String, String> environment = new Hashtable<>(4);
environment.put("osgi.os", config.getOs()); //$NON-NLS-1$
environment.put("osgi.ws", config.getWs()); //$NON-NLS-1$
environment.put("osgi.arch", config.getArch()); //$NON-NLS-1$
PDEState state = getSite(false).getRegistry();
BundleHelper helper = BundleHelper.getDefault();
BundleDescription bundle = state.getResolvedBundle(plugin);
if (bundle != null) {
BundleDescription[] fragments = bundle.getFragments();
for (int i = 0; i < fragments.length; i++) {
Filter filter = helper.getFilter(fragments[i]);
if (filter == null || filter.match(environment)) {
String fragmentId = fragments[i].getSymbolicName();
if (productFile.containsPlugin(fragmentId)) {
buffer.append(",platform:/base/plugins/"); //$NON-NLS-1$
buffer.append(fragmentId);
}
}
}
}
return buffer.toString();
}
private void createLauncherIniFile(String directory, String os) {
String launcher = getLauncherName();
if (os.equals(Platform.OS_MACOSX)) {
directory += "/" + launcher + ".app/Contents/MacOS"; //$NON-NLS-1$//$NON-NLS-2$
}
File dir = new File(directory);
if ((!dir.exists() && !dir.mkdirs()) || dir.isFile())
return; //we will fail trying to create the file TODO log warning/error
String programArgs = productFile.getProgramArguments(os);
String vmArgs = productFile.getVMArguments(os);
if ((programArgs == null || programArgs.length() == 0) && (vmArgs == null || vmArgs.length() == 0))
return;
String lineDelimiter = Platform.OS_WIN32.equals(os) ? "\r\n" : "\n"; //$NON-NLS-1$ //$NON-NLS-2$
try (PrintWriter writer = new PrintWriter(new FileWriter(new File(dir, launcher + ".ini")))) { //$NON-NLS-1$
if (programArgs != null && programArgs.length() > 0) {
QuotedTokenizer tokenizer = new QuotedTokenizer(programArgs);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
if (!token.equals("")) { //$NON-NLS-1$
writer.print(token);
writer.print(lineDelimiter);
}
}
}
if (vmArgs != null && vmArgs.length() > 0) {
writer.print("-vmargs"); //$NON-NLS-1$
writer.print(lineDelimiter);
QuotedTokenizer tokenizer = new QuotedTokenizer(vmArgs);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
if (!token.equals("")) { //$NON-NLS-1$
writer.print(token);
writer.print(lineDelimiter);
}
}
}
} catch (IOException e) {
//nothing
}
}
private String getLauncherName() {
String name = productFile.getLauncherName();
if (name != null && name.length() > 0) {
name = name.trim();
if (name.endsWith(".exe")) //$NON-NLS-1$
name = name.substring(0, name.length() - 4);
return name;
}
return "eclipse"; //$NON-NLS-1$
}
public void setProduct(String product) {
this.product = product;
}
public void setRoot(String root) {
this.root = root;
}
public void setBuildProperties(Properties buildProperties) {
this.buildProperties = buildProperties;
}
public void setAssemblyInfo(AssemblyInformation info) {
this.assembly = info;
}
public void setFeatureId(String featureId) {
this.featureId = featureId;
}
}