Java tutorial
package project.combiner; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Comparator; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; import project.Feature; import project.Feature.Import; import project.Plugin; import project.Snapshot; import utils.lists.ArrayList; import utils.lists.Arrays; import utils.lists.Files; import utils.lists.HashMap; import utils.lists.List; import utils.lists.Map; import utils.lists.Paths; import utils.lists.Set; import utils.streams2.IOStream; import utils.streams2.IntStream; import utils.streams2.Streams; class P2ProfileGenerator { private static final Charset UTF8 = StandardCharsets.UTF_8; private static Snapshot snapshot; public static void main(String[] args) throws IOException { Path officialVersion = Paths.get(System.getProperty("user.home", ""), "evening"); Path currentVersion = Paths.get("").toAbsolutePath().resolve("target/ide-1"); List<String> version1 = readLastProfile(officialVersion); version1 = Files.readAllLines(Paths.get("").toAbsolutePath().resolve("1411396396819-eve.profile")).toList(); List<String> version2 = readLastProfile(currentVersion); MainBuildIDE.initializeFromSnapshot(); version2 = readNewProfile( "p2/org.eclipse.equinox.p2.engine/profileRegistry/ECLIPSE_PROFILE_ID.profile/PROFILE_TIME.profile.gz/PROFILE_TIME.profile"); Files.write(Paths.get("1411396396819-gen.profile"), version2, UTF8); compare(version1, version2); } static byte[] profileGz(Snapshot currentSnapshot, String timestamp, String profileID, String productID) throws IOException { snapshot = currentSnapshot; String ECLIPSE_PROFILE_ID = profileID; String ECLIPSE_PRODUCT_ID = productID; String INSTALL_FOLDER = "/jobs/genie.technology.packaging/mars.epp-tycho-build/workspace/org.eclipse.epp.packages/packages/" + ECLIPSE_PRODUCT_ID + "/target/products/" + ECLIPSE_PROFILE_ID + "/win32/win32/x86_64/eclipse"; INSTALL_FOLDER = "D:\\evening"; String cache = "/jobs/genie.technology.packaging/mars.epp-tycho-build/workspace/org.eclipse.epp.packages/packages/" + ECLIPSE_PRODUCT_ID + "/target/products/" + ECLIPSE_PROFILE_ID + "/win32/win32/x86_64/eclipse"; cache = "D:\\evening"; String cacheRoot = cache.replace('\\', '/'); String cacheExtensions = "file:/" + cacheRoot + "/.eclipseextension|file:/" + cacheRoot + "/configuration/org.eclipse.osgi/118/data/listener_1925729951/"; ArrayList<String> lines = ArrayList.of("<?xml version='1.0' encoding='UTF-8'?>", "<?profile version='1.0.0'?>", "<profile id='" + ECLIPSE_PROFILE_ID + "' timestamp='" + timestamp + "'>", " <properties size='7'>", " <property name='org.eclipse.equinox.p2.installFolder' value='" + INSTALL_FOLDER + "'/>", " <property name='org.eclipse.equinox.p2.cache' value='" + cache + "'/>", " <property name='org.eclipse.update.install.features' value='true'/>", " <property name='org.eclipse.equinox.p2.roaming' value='true'/>", " <property name='org.eclipse.equinox.p2.environments' value='osgi.nl=en_US,osgi.ws=win32,osgi.arch=x86_64,osgi.os=win32'/>", " <property name='eclipse.touchpoint.launcherName' value='eclipse'/>", " <property name='org.eclipse.equinox.p2.cache.extensions' value='" + cacheExtensions + "'/>", " </properties>"); HashMap<Path, HashMap<String, String>> pluginToManifest = MainBuildIDE.getPluginToManifest(); HashMap<Path, Map<String, String>> pluginToProperties = getPluginToProperties(); HashMap<Path, Map<String, String>> pluginToP2Inf = getPluginToP2Inf(); Path configJrePluginPath = fromZipPath("plugins/config.a.jre.javase"); Path jrePluginPath = fromZipPath("plugins/a.jre.javase"); Path platform_rootPluginPath = fromZipPath("plugins/org.eclipse.platform_root"); Path platformIDEPath = fromZipPath("features/org.eclipse.platform.ide"); Path platformIDEExecutablePath = fromZipPath( "features/org.eclipse.platform.ide.executable.win32.win32.x86_64"); Path platformIDEExecutableEclipsePath = fromZipPath( "features/org.eclipse.platform.ide.executable.win32.win32.x86_64.eclipse"); Path rcpConfiguration_rootPluginPath = fromZipPath( "plugins/org.eclipse.rcp.configuration_root.win32.win32.x86_64"); Path rcp_rootPluginPath = fromZipPath("plugins/org.eclipse.rcp_root"); Path platformPath = fromZipPath("features/org.eclipse.platform.feature.group"); HashMap<Path, Feature> originalFeatures = getFeatures(); HashMap<Path, Plugin> plugins = getPlugins(); ArrayList<Path> pluginPaths = pluginToManifest.keySet().toArrayList(); HashMap<String, String> versionsStore = new HashMap<>(); for (Path pluginPath : pluginPaths) { versionsStore.put(pluginPath.getFileName().toString().replace(".jar", ""), extractVersion(pluginPath, pluginToManifest)); } pluginPaths.addAll(configJrePluginPath, jrePluginPath, platform_rootPluginPath, platformIDEPath, platformIDEExecutablePath, platformIDEExecutableEclipsePath, rcp_rootPluginPath, rcpConfiguration_rootPluginPath); pluginPaths.addAll(tooling.keySet()); for (Tooling tool : Tooling.values()) { Path path = fromZipPath("features/" + tool.name); pluginPaths.add(path); Path versionSource = fromZipPath("plugins/" + tool.versionSource); String version = extractVersion(versionSource, pluginToManifest); versionsStore.put(tool.name, version); } HashMap<Path, Feature> features = new HashMap<>(originalFeatures.size() * 2); for (HashMap.Entry<Path, Feature> entry : originalFeatures) { Feature feature = entry.rhs; Path group = entry.lhs.resolveSibling(feature.id + ".feature.group"); pluginPaths.add(group); features.put(group, feature); Path jar = entry.lhs.resolveSibling(feature.id + ".feature.jar"); pluginPaths.add(jar); features.put(jar, feature); features.put(entry.lhs, feature); } pluginPaths.sort(Comparator.comparing((Path p) -> extractName(p, pluginToManifest)) .thenComparing(p -> extractVersion(p, pluginToManifest))); Feature p2UserUIFeature = features.get(fromZipPath("features/org.eclipse.equinox.p2.user.ui")); Feature rcpConfigurationFeature = features.get(fromZipPath("features/org.eclipse.rcp.configuration")); Feature platformFeature = features.get(platformPath); Plugin platformPlugin = plugins.get(fromZipPath("plugins/org.eclipse.platform")); Plugin rcpPlugin = plugins.get(fromZipPath("plugins/org.eclipse.rcp.jar")); Plugin equinoxLauncherPlugin = plugins.get(fromZipPath("plugins/org.eclipse.equinox.launcher.jar")); Plugin equinoxCommonPlugin = plugins.get(fromZipPath("plugins/org.eclipse.equinox.common.jar")); Plugin equinoxDSPlugin = plugins.get(fromZipPath("plugins/org.eclipse.equinox.ds.jar")); Plugin equinoxEventPlugin = plugins.get(fromZipPath("plugins/org.eclipse.equinox.event.jar")); Plugin equinoxSimpleconfiguratorPlugin = plugins .get(fromZipPath("plugins/org.eclipse.equinox.simpleconfigurator.jar")); Plugin updateConfiguratorPlugin = plugins.get(fromZipPath("plugins/org.eclipse.update.configurator.jar")); Plugin equinoxP2ReconcilerDropinsPlugin = plugins .get(fromZipPath("plugins/org.eclipse.equinox.p2.reconciler.dropins.jar")); unitsOpen(lines, pluginPaths.size()); for (Path pluginPath : pluginPaths) { if (pluginPath == configJrePluginPath) { addConfigJreUnit(lines); } else if (pluginPath == jrePluginPath) { addJreUnit(lines); } else if (pluginPath == platformIDEPath) { addPlatformIDE(lines, platformFeature, p2UserUIFeature, rcpConfigurationFeature); } else if (pluginPath == platformIDEExecutablePath) { addPlatformIDEExecutable(lines, platformFeature); } else if (pluginPath == platformIDEExecutableEclipsePath) { addPlatformIDEExecutableEclipse(lines, platformFeature); } else if (pluginPath == rcpConfiguration_rootPluginPath) { addRcpConfigurationUnit(lines, rcpConfigurationFeature); } else if (pluginPath == platform_rootPluginPath) { addBinary_RootUnit(lines, platformPlugin); } else if (pluginPath == rcp_rootPluginPath) { addBinary_RootUnit(lines, rcpPlugin); } else if (Tooling.has(pluginPath)) { performTooling(lines, Tooling.get(pluginPath), features, versionsStore, equinoxLauncherPlugin); } else if (tooling.containsKey(pluginPath)) { lines.addAll(replaceVersions(pluginPath, equinoxLauncherPlugin, equinoxCommonPlugin, equinoxDSPlugin, equinoxEventPlugin, equinoxP2ReconcilerDropinsPlugin, equinoxSimpleconfiguratorPlugin, updateConfiguratorPlugin)); } else if (features.containsKey(pluginPath)) { addFeatureUnit(lines, features.get(pluginPath), pluginPath.getFileName().toString()); } else { HashMap<String, String> manifest = pluginToManifest.get(pluginPath); Map<String, String> props = pluginToProperties.get(pluginPath); Map<String, String> p2Inf = pluginToP2Inf.get(pluginPath); addPluginUnit(pluginPath, lines, props, p2Inf, manifest); } } unitsClose(lines); iusPropertiesOpen(lines, pluginPaths.size()); for (Path plugin : pluginPaths) { String s1 = plugin.getFileName().toString(); String s2 = s1.replace(".feature.group", ""); String s3 = s2.replace(".feature.jar", ""); String replaceAll = s3.replaceFirst("(_[0-9&&[^6]][^_4][^_]+\\.?j?a?r?$)|(\\.jar$)", ""); switch (replaceAll) { case "com.ibm.icu": case "com.jcraft.jsch": case "com.sun.el": case "javax.annotation": case "javax.el": case "javax.inject": case "javax.servlet.jsp": case "javax.servlet": case "javax.xml": case "org.apache.ant": case "org.apache.batik.css": case "org.apache.batik.util.gui": case "org.apache.batik.util": case "org.apache.commons.codec": case "org.apache.commons.logging": case "org.apache.felix.gogo.command": case "org.apache.felix.gogo.runtime": case "org.apache.felix.gogo.shell": case "org.apache.httpcomponents.httpclient": case "org.apache.httpcomponents.httpcore": case "org.apache.jasper.glassfish": // case "org.apache.log4j": case "org.apache.lucene.analysis": case "org.apache.lucene.core": // case "org.apache.ws.commons.util": // case "org.apache.xerces": // case "org.apache.xml.resolver": // case "org.apache.xml.serializer": // case "org.apache.xmlrpc": case "org.eclipse.ant.core": // case "org.eclipse.ant.launching": // case "org.eclipse.ant.ui": case "org.eclipse.compare.core": case "org.eclipse.compare.win32": case "org.eclipse.compare": case "org.eclipse.core.commands": case "org.eclipse.core.contenttype": case "org.eclipse.core.databinding.beans": case "org.eclipse.core.databinding.observable": case "org.eclipse.core.databinding.property": case "org.eclipse.core.databinding": case "org.eclipse.core.expressions": case "org.eclipse.core.externaltools": case "org.eclipse.core.filebuffers": case "org.eclipse.core.filesystem.java7": case "org.eclipse.core.filesystem.win32.x86_64": case "org.eclipse.core.filesystem": case "org.eclipse.core.jobs": case "org.eclipse.core.net.win32.x86_64": case "org.eclipse.core.net": case "org.eclipse.core.resources.win32.x86_64": case "org.eclipse.core.resources": case "org.eclipse.core.runtime.compatibility.registry": case "org.eclipse.core.runtime.compatibility": case "org.eclipse.core.runtime": case "org.eclipse.core.variables": // case "org.eclipse.cvs": case "org.eclipse.debug.core": case "org.eclipse.debug.ui": case "org.eclipse.e4.core.commands": case "org.eclipse.e4.core.contexts": case "org.eclipse.e4.core.di.extensions": case "org.eclipse.e4.core.di": case "org.eclipse.e4.core.services": case "org.eclipse.e4.rcp": // case "org.eclipse.e4.tools.css.spy": // case "org.eclipse.e4.tools.spy": case "org.eclipse.e4.ui.bindings": case "org.eclipse.e4.ui.css.core": case "org.eclipse.e4.ui.css.swt.theme": case "org.eclipse.e4.ui.css.swt": case "org.eclipse.e4.ui.di": case "org.eclipse.e4.ui.model.workbench": case "org.eclipse.e4.ui.services": case "org.eclipse.e4.ui.widgets": case "org.eclipse.e4.ui.workbench.addons.swt": case "org.eclipse.e4.ui.workbench.renderers.swt": case "org.eclipse.e4.ui.workbench.swt": case "org.eclipse.e4.ui.workbench3": case "org.eclipse.e4.ui.workbench": case "org.eclipse.ecf": case "org.eclipse.ecf.core.feature": case "org.eclipse.ecf.core.ssl.feature": case "org.eclipse.ecf.filetransfer": case "org.eclipse.ecf.filetransfer.feature": case "org.eclipse.ecf.filetransfer.httpclient4.feature": case "org.eclipse.ecf.filetransfer.httpclient4.ssl.feature": case "org.eclipse.ecf.filetransfer.ssl.feature": case "org.eclipse.ecf.identity": case "org.eclipse.ecf.provider.filetransfer": case "org.eclipse.ecf.provider.filetransfer.httpclient4": case "org.eclipse.ecf.provider.filetransfer.httpclient4.ssl": case "org.eclipse.ecf.provider.filetransfer.ssl": case "org.eclipse.ecf.ssl": // case "org.eclipse.egit": // case "org.eclipse.egit.core": // case "org.eclipse.egit.doc": // case "org.eclipse.egit.ui": case "org.eclipse.emf.common": case "org.eclipse.emf.ecore.change": // case "org.eclipse.emf.ecore.edit": case "org.eclipse.emf.ecore.xmi": case "org.eclipse.emf.ecore": // case "org.eclipse.emf.edit": // case "org.eclipse.epp.mpc.core": // case "org.eclipse.epp.mpc.help.ui": // case "org.eclipse.epp.mpc.ui": case "org.eclipse.equinox.app": case "org.eclipse.equinox.bidi": case "org.eclipse.equinox.common": case "org.eclipse.equinox.concurrent": case "org.eclipse.equinox.console": case "org.eclipse.equinox.ds": case "org.eclipse.equinox.event": case "org.eclipse.equinox.frameworkadmin.equinox": case "org.eclipse.equinox.frameworkadmin": case "org.eclipse.equinox.http.jetty": case "org.eclipse.equinox.http.registry": case "org.eclipse.equinox.http.servlet": case "org.eclipse.equinox.jsp.jasper.registry": case "org.eclipse.equinox.jsp.jasper": case "org.eclipse.equinox.launcher.win32.win32.x86_64": case "org.eclipse.equinox.launcher": case "org.eclipse.equinox.p2.artifact.repository": case "org.eclipse.equinox.p2.console": case "org.eclipse.equinox.p2.core": case "org.eclipse.equinox.p2.core.feature": case "org.eclipse.equinox.p2.director.app": case "org.eclipse.equinox.p2.directorywatcher": case "org.eclipse.equinox.p2.director": // case "org.eclipse.equinox.p2.discovery": // case "org.eclipse.equinox.p2.discovery.compatibility": case "org.eclipse.equinox.p2.engine": case "org.eclipse.equinox.p2.extensionlocation": case "org.eclipse.equinox.p2.extras.feature": case "org.eclipse.equinox.p2.garbagecollector": case "org.eclipse.equinox.p2.jarprocessor": case "org.eclipse.equinox.p2.metadata.repository": case "org.eclipse.equinox.p2.metadata": case "org.eclipse.equinox.p2.operations": case "org.eclipse.equinox.p2.publisher.eclipse": case "org.eclipse.equinox.p2.publisher": case "org.eclipse.equinox.p2.ql": case "org.eclipse.equinox.p2.reconciler.dropins": case "org.eclipse.equinox.p2.repository.tools": case "org.eclipse.equinox.p2.repository": case "org.eclipse.equinox.p2.rcp.feature": case "org.eclipse.equinox.p2.touchpoint.eclipse": case "org.eclipse.equinox.p2.touchpoint.natives": case "org.eclipse.equinox.p2.transport.ecf": case "org.eclipse.equinox.p2.ui": // case "org.eclipse.equinox.p2.ui.discovery": case "org.eclipse.equinox.p2.ui.importexport": case "org.eclipse.equinox.p2.ui.sdk": case "org.eclipse.equinox.p2.ui.sdk.scheduler": case "org.eclipse.equinox.p2.updatechecker": case "org.eclipse.equinox.p2.updatesite": case "org.eclipse.equinox.p2.user.ui": case "org.eclipse.equinox.preferences": case "org.eclipse.equinox.registry": case "org.eclipse.equinox.security.ui": case "org.eclipse.equinox.security.win32.x86_64": case "org.eclipse.equinox.security": case "org.eclipse.equinox.simpleconfigurator.manipulator": case "org.eclipse.equinox.simpleconfigurator": case "org.eclipse.equinox.util": case "org.eclipse.help.base": case "org.eclipse.help.ui": case "org.eclipse.help.webapp": case "org.eclipse.help": // case "org.eclipse.jdt": // case "org.eclipse.jdt.annotation": // case "org.eclipse.jdt.apt.core": // case "org.eclipse.jdt.apt.pluggable.core": // case "org.eclipse.jdt.apt.ui": // case "org.eclipse.jdt.compiler.apt": // case "org.eclipse.jdt.compiler.tool": // case "org.eclipse.jdt.core.manipulation": // case "org.eclipse.jdt.core": // case "org.eclipse.jdt.debug.ui": // case "org.eclipse.jdt.debug": // case "org.eclipse.jdt.doc.isv": // case "org.eclipse.jdt.doc.user": // case "org.eclipse.jdt.junit.core": // case "org.eclipse.jdt.junit.runtime": // case "org.eclipse.jdt.junit4.runtime": // case "org.eclipse.jdt.junit": // case "org.eclipse.jdt.launching": // case "org.eclipse.jdt.ui": // case "org.eclipse.jem.util": case "org.eclipse.jetty.continuation": case "org.eclipse.jetty.http": case "org.eclipse.jetty.io": case "org.eclipse.jetty.security": case "org.eclipse.jetty.server": case "org.eclipse.jetty.servlet": case "org.eclipse.jetty.util": case "org.eclipse.jface.databinding": case "org.eclipse.jface.text": case "org.eclipse.jface": // case "org.eclipse.jgit.archive": // case "org.eclipse.jgit": case "org.eclipse.jsch.core": case "org.eclipse.jsch.ui": case "org.eclipse.ltk.core.refactoring": case "org.eclipse.ltk.ui.refactoring": // case "org.eclipse.m2e.archetype.common": // case "org.eclipse.m2e.core.ui": // case "org.eclipse.m2e.core": // case "org.eclipse.m2e.discovery": // case "org.eclipse.m2e.editor.xml": // case "org.eclipse.m2e.editor": // case "org.eclipse.m2e.jdt.ui": // case "org.eclipse.m2e.jdt": // case "org.eclipse.m2e.launching": // case "org.eclipse.m2e.lifecyclemapping.defaults": // case "org.eclipse.m2e.logback.appender": // case "org.eclipse.m2e.logback.configuration": // case "org.eclipse.m2e.maven.indexer": // case "org.eclipse.m2e.maven.runtime.slf4j.simple": // case "org.eclipse.m2e.maven.runtime": // case "org.eclipse.m2e.model.edit": // case "org.eclipse.m2e.profiles.core": // case "org.eclipse.m2e.profiles.ui": // case "org.eclipse.m2e.refactoring": // case "org.eclipse.m2e.scm": // case "org.eclipse.mylyn.bugzilla.core": // case "org.eclipse.mylyn.bugzilla.ide": // case "org.eclipse.mylyn.bugzilla.ui": // case "org.eclipse.mylyn.commons.core": // case "org.eclipse.mylyn.commons.identity.core": // case "org.eclipse.mylyn.commons.net": // case "org.eclipse.mylyn.commons.notifications.core": // case "org.eclipse.mylyn.commons.notifications.feed": // case "org.eclipse.mylyn.commons.notifications.ui": // case "org.eclipse.mylyn.commons.repositories.core": // case "org.eclipse.mylyn.commons.repositories.ui": // case "org.eclipse.mylyn.commons.screenshots": // case "org.eclipse.mylyn.commons.ui": // case "org.eclipse.mylyn.commons.workbench": // case "org.eclipse.mylyn.commons.xmlrpc": // case "org.eclipse.mylyn.context.core": // case "org.eclipse.mylyn.context.tasks.ui": // case "org.eclipse.mylyn.context.ui": // case "org.eclipse.mylyn.discovery.core": // case "org.eclipse.mylyn.discovery.ui": // case "org.eclipse.mylyn.help.ui": // case "org.eclipse.mylyn.ide.ui": // case "org.eclipse.mylyn.monitor.core": // case "org.eclipse.mylyn.monitor.ui": // case "org.eclipse.mylyn.resources.ui": // case "org.eclipse.mylyn.tasks.bugs": // case "org.eclipse.mylyn.tasks.core": // case "org.eclipse.mylyn.tasks.index.core": // case "org.eclipse.mylyn.tasks.index.ui": // case "org.eclipse.mylyn.tasks.search": // case "org.eclipse.mylyn.tasks.ui": // case "org.eclipse.mylyn.team.cvs": // case "org.eclipse.mylyn.team.ui": case "org.eclipse.osgi.compatibility.state": case "org.eclipse.osgi.services": case "org.eclipse.osgi.util": case "org.eclipse.osgi": // case "org.eclipse.pde": // case "org.eclipse.pde.api.tools.annotations": // case "org.eclipse.pde.api.tools.ui": // case "org.eclipse.pde.api.tools": // case "org.eclipse.pde.build": // case "org.eclipse.pde.core": // case "org.eclipse.pde.doc.user": // case "org.eclipse.pde.ds.core": // case "org.eclipse.pde.ds.ui": // case "org.eclipse.pde.junit.runtime": // case "org.eclipse.pde.launching": // case "org.eclipse.pde.runtime": // case "org.eclipse.pde.ua.core": // case "org.eclipse.pde.ua.ui": // case "org.eclipse.pde.ui": // case "org.eclipse.pde.ui.templates": // case "org.eclipse.platform.doc.isv": case "org.eclipse.platform.doc.user": case "org.eclipse.platform": case "org.eclipse.rcp": case "org.eclipse.rcp.configuration": case "org.eclipse.search": case "org.eclipse.swt.win32.win32.x86_64": case "org.eclipse.swt": case "org.eclipse.team.core": // case "org.eclipse.team.cvs.core": // case "org.eclipse.team.cvs.ssh2": // case "org.eclipse.team.cvs.ui": case "org.eclipse.team.ui": case "org.eclipse.text": case "org.eclipse.ui.browser": case "org.eclipse.ui.cheatsheets": case "org.eclipse.ui.console": case "org.eclipse.ui.editors": case "org.eclipse.ui.externaltools": case "org.eclipse.ui.forms": case "org.eclipse.ui.ide.application": case "org.eclipse.ui.ide": case "org.eclipse.ui.intro.universal": case "org.eclipse.ui.intro": case "org.eclipse.ui.navigator.resources": case "org.eclipse.ui.navigator": case "org.eclipse.ui.net": case "org.eclipse.ui.themes": // case "org.eclipse.ui.trace": // case "org.eclipse.ui.views.log": case "org.eclipse.ui.views.properties.tabbed": case "org.eclipse.ui.views": case "org.eclipse.ui.win32": case "org.eclipse.ui.workbench.texteditor": case "org.eclipse.ui.workbench": case "org.eclipse.ui": case "org.eclipse.update.configurator": // case "org.eclipse.wst.common.core": // case "org.eclipse.wst.common.emf": // case "org.eclipse.wst.common.environment": // case "org.eclipse.wst.common.frameworks.ui": // case "org.eclipse.wst.common.frameworks": // case "org.eclipse.wst.common.project.facet.core": // case "org.eclipse.wst.common.ui": // case "org.eclipse.wst.common.uriresolver": // case "org.eclipse.wst.sse.core": // case "org.eclipse.wst.sse.ui": // case "org.eclipse.wst.validation.ui": // case "org.eclipse.wst.validation": // case "org.eclipse.wst.xml.core": // case "org.eclipse.wst.xml.ui": // case "org.eclipse.wst.xsd.core": // case "org.eclipse.xsd": // case "org.hamcrest.core": // case "org.junit": // case "org.nodeclipse.pluginslist.core": // case "org.objectweb.asm.tree": // case "org.objectweb.asm": case "org.sat4j.core": case "org.sat4j.pb": // case "org.slf4j.api": // case "org.springsource.ide.eclipse.commons.core": // case "org.springsource.ide.eclipse.commons.frameworks.core": // case "org.springsource.ide.eclipse.commons.livexp": // case "org.springsource.ide.eclipse.commons.quicksearch": case "org.w3c.css.sac": case "org.w3c.dom.events": case "org.w3c.dom.smil": case "org.w3c.dom.svg": // case "winterwell.markdown": continue; default: } if (plugin == configJrePluginPath) { //addConfigJreUnit(lines); } else if (plugin == jrePluginPath) { //addJreUnit(lines); } else if (plugin == platformIDEPath) { iuPropertiesOpen(lines, replaceAll, platformFeature.version); propertiesOpen(lines, 2); property(lines, "org.eclipse.equinox.p2.internal.inclusion.rules", "STRICT"); property(lines, "org.eclipse.equinox.p2.type.root", "true"); propertiesClose(lines); iuPropertiesClose(lines); } else if (plugin == platformIDEExecutablePath) { Feature feature2 = platformFeature; iuPropertiesOpen(lines, replaceAll, feature2.version); propertiesOpen(lines, 1); String key = "unzipped|" + "@artifact|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse"; String value = "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/eclipse.exe|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/eclipsec.exe|"; property(lines, key, value); propertiesClose(lines); iuPropertiesClose(lines); } else if (plugin == platformIDEExecutableEclipsePath) { // Feature feature = features.get(plugin.resolveSibling("org.eclipse.platform.feature.group")); // addPlatformIDEExecutableEclipse(lines, feature); } else if (plugin == rcpConfiguration_rootPluginPath) { iuPropertiesOpen(lines, replaceAll, platformFeature.version); propertiesOpen(lines, 1); String key = "unzipped|" + "@artifact|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse"; String value = "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/eclipse.exe|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/eclipsec.exe|"; property(lines, key, value); propertiesClose(lines); iuPropertiesClose(lines); } else if (plugin == platform_rootPluginPath) { iuPropertiesOpen(lines, replaceAll, platformFeature.version); propertiesOpen(lines, 1); String key = "unzipped|" + "@artifact|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse"; String value = "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/notice.html|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/.eclipseproduct|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/epl-v10.html|"; property(lines, key, value); propertiesClose(lines); iuPropertiesClose(lines); } else if (plugin == rcp_rootPluginPath) { iuPropertiesOpen(lines, replaceAll, platformFeature.version); propertiesOpen(lines, 1); String key = "unzipped|" + "@artifact|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse"; String value = "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/readme|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/readme/readme_eclipse.html|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/epl-v10.html|" + "/opt/public/eclipse/builds/4I/gitCache/eclipse.platform.releng.aggregator/" + "eclipse.platform.releng.tychoeclipsebuilder/platform/target/products/" + "org.eclipse.platform.ide/win32/win32/x86_64/eclipse" + "/notice.html|"; property(lines, key, value); propertiesClose(lines); iuPropertiesClose(lines); } else if (Tooling.has(plugin)) { //performTooling(lines, Tooling.get(plugin), features, versionsStore); } else if (tooling.containsKey(plugin)) { //lines.addAll(tooling.get(plugin)); } else if (features.containsKey(plugin)) { Feature someFeature = features.get(plugin); iuPropertiesOpen(lines, someFeature.id, someFeature.version); propertiesOpen(lines, 2); property(lines, "org.eclipse.equinox.p2.internal.inclusion.rules", "STRICT"); property(lines, "org.eclipse.equinox.p2.type.root", "true"); propertiesClose(lines); iuPropertiesClose(lines); } else { HashMap<String, String> manifest = pluginToManifest.get(plugin); String bsn = manifest.get("Bundle-SymbolicName"); String id = bsn.split(";")[0].trim(); String version = manifest.get("Bundle-Version"); iuPropertiesOpen(lines, id, version); propertiesOpen(lines, 2); property(lines, "org.eclipse.equinox.p2.internal.inclusion.rules", "STRICT"); property(lines, "org.eclipse.equinox.p2.type.root", "true"); propertiesClose(lines); iuPropertiesClose(lines); } } iusPropertiesClose(lines); lines.addAll("</profile>", ""); String profileGz = String.join("\n", lines); return profileGz.getBytes(UTF8); } private static List<String> replaceVersions(Path pluginPath, Plugin equinoxLauncherPlugin, Plugin equinoxCommonPlugin, Plugin equinoxDSPlugin, Plugin equinoxEventPlugin, Plugin equinoxP2ReconcilerDropinsPlugin, Plugin equinoxSimpleconfiguratorPlugin, Plugin updateConfiguratorPlugin) { List<String> list = tooling.get(pluginPath) .replaceAll(s -> s.replace("1.3.0.v20140415-2008", equinoxLauncherPlugin.version) .replace("1.3.100.v20140115-1647", equinoxEventPlugin.version) .replace("1.1.200.v20140603-1326", "1.1.200.qualifier") .replace("1.1.200.v20131119-0908", equinoxP2ReconcilerDropinsPlugin.version) .replace("1.1.0.v20131217-1203", equinoxSimpleconfiguratorPlugin.version) .replace("3.3.300.v20140518-1928", updateConfiguratorPlugin.version) .replace("3.6.200.v20140819-0835", equinoxCommonPlugin.version) .replace("1.4.200.v20131126-2331", equinoxDSPlugin.version)); for (String string : list) { if (string.contains(".v20")) { throw new IllegalStateException("Placeholder " + string + " still in " + pluginPath); } } return list; } private static void iuPropertiesClose(ArrayList<String> lines) { lines.add(" </iuProperties>"); } private static void iuPropertiesOpen(ArrayList<String> lines, String id, String version) { lines.add(" <iuProperties id='" + id + "' version='" + version + "'>"); } private static void iusPropertiesClose(ArrayList<String> lines) { lines.add(" </iusProperties>"); } private static void iusPropertiesOpen(ArrayList<String> lines, int size) { lines.add(" <iusProperties size='" + size + "'>"); } private static void unitsClose(ArrayList<String> lines) { lines.add(" </units>"); } private static void unitsOpen(ArrayList<String> lines, int size) { lines.add(" <units size='" + size + "'>"); } private static enum Tooling { TOOLING_ORG_ECLIPSE_UPDATE("tooling.org.eclipse.update", "org.eclipse.update"), TOOLINGORG_ECLIPSE_PLATFORM_IDE_APPLICATION( "toolingorg.eclipse.platform.ide.application", "org.eclipse.platform"), TOOLINGORG_ECLIPSE_PLATFORM_IDE_CONFIG_WIN32_WIN32_X86_64( "toolingorg.eclipse.platform.ide.config.win32.win32.x86_64", "org.eclipse.platform"), TOOLINGORG_ECLIPSE_PLATFORM_IDE_CONFIGURATION( "toolingorg.eclipse.platform.ide.configuration", "org.eclipse.platform"), TOOLINGORG_ECLIPSE_PLATFORM_IDE_EXECUTABLE_WIN32_WIN32_X86_64( "toolingorg.eclipse.platform.ide.executable.win32.win32.x86_64", "org.eclipse.platform"), TOOLINGORG_ECLIPSE_PLATFORM_IDE_INI_WIN32_WIN32_X86_64( "toolingorg.eclipse.platform.ide.ini.win32.win32.x86_64", "org.eclipse.platform"), TOOLINGWIN32_WIN32_X86_64ORG_ECLIPSE_CORE_RUNTIME( "toolingwin32.win32.x86_64org.eclipse.core.runtime", "org.eclipse.platform"), TOOLINGORG_ECLIPSE_PLATFORM_CONFIGURATION( "toolingorg.eclipse.platform.configuration", "org.eclipse.platform"); Tooling(String name, String source) { this.name = name; versionSource = source; } public static Tooling get(Path plugin) { for (Tooling tool : values()) { if (tool.name.equals(plugin.getFileName().toString())) { return tool; } } return null; } public static boolean has(Path plugin) { return get(plugin) != null; } String name; String versionSource; } private static void performTooling(ArrayList<String> lines, Tooling tool, HashMap<Path, Feature> features, HashMap<String, String> versionsStore, Plugin equinoxLauncherPlugin) { Path path = fromZipPath("features/org.eclipse.platform.feature.group"); Feature feature = features.get(path); tooling(lines, tool, feature, versionsStore, equinoxLauncherPlugin); } private static void tooling(ArrayList<String> lines, Tooling tool, Feature platformFeature, HashMap<String, String> versions, Plugin equinoxLauncherPlugin) { String version = platformFeature.version; String range = inclusive(version); switch (tool) { case TOOLING_ORG_ECLIPSE_UPDATE: unitOpen(lines, "tooling.org.eclipse.update.feature.default", "1.0.0", false); hostRequirementsOpen(lines, 1); required(lines, "org.eclipse.equinox.p2.eclipse.type", "feature", "0.0.0", true, false, true); hostRequirementsClose(lines); propertiesOpen(lines, 1); property(lines, "org.eclipse.equinox.p2.type.fragment", "true"); propertiesClose(lines); providesOpen(lines, 2); provided(lines, "org.eclipse.equinox.p2.iu", "tooling.org.eclipse.update.feature.default", "1.0.0"); provided(lines, "org.eclipse.equinox.p2.flavor", "tooling", "1.0.0"); providesClose(lines); requiresOpen(lines, 1); required(lines, "org.eclipse.equinox.p2.eclipse.type", "feature", "0.0.0", true, false, true); requiresClose(lines); filter(lines, "(org.eclipse.update.install.features=true)"); touchpoint(lines, "null", "0.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "install", "installFeature(feature:${artifact},featureId:default,featureVersion:default)"); instruction(lines, "uninstall", "uninstallFeature(feature:${artifact},featureId:default,featureVersion:default)"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_CONFIGURATION: unitOpen(lines, "toolingorg.eclipse.platform.configuration", "1.0.0", false); providesOpen(lines, 1); provided(lines, "toolingorg.eclipse.platform.configuration", "1.0.0"); providesClose(lines); filter(lines, "(!(osgi.os=macosx))"); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "unconfigure", "setProgramProperty(propName:osgi.instance.area.default,propValue:);remove(targetDir:${installFolder},linkName:eclipse);"); instruction(lines, "configure", "setProgramProperty(propName:osgi.instance.area.default,propValue:@user.home/workspace);"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_IDE_APPLICATION: unitOpen(lines, "toolingorg.eclipse.platform.ide.application", version); providesOpen(lines, 1); provided(lines, "toolingorg.eclipse.platform.ide.application", version); providesClose(lines); requiresOpen(lines, 62); writeRequires(lines, platformFeature, equinoxLauncherPlugin); requiresClose(lines); touchpoint(lines, "null", "0.0.0"); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_IDE_CONFIG_WIN32_WIN32_X86_64: unitOpen(lines, "toolingorg.eclipse.platform.ide.config.win32.win32.x86_64", version, false); providesOpen(lines, 2); provided(lines, "org.eclipse.equinox.p2.iu", "toolingorg.eclipse.platform.ide.config.win32.win32.x86_64", version); provided(lines, "toolingorg.eclipse.platform.ide", "org.eclipse.platform.ide.config", version); providesClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "unconfigure", "setProgramProperty(propName:eclipse.buildId,propValue:);setProgramProperty(propName:osgi.splashPath,propValue:);setProgramProperty(propName:eclipse.application,propValue:);setProgramProperty(propName:eclipse.product,propValue:);setProgramProperty(propName:osgi.bundles.defaultStartLevel,propValue:);"); instruction(lines, "configure", "setProgramProperty(propName:eclipse.buildId,propValue:" + version + ");setProgramProperty(propName:osgi.splashPath,propValue:platform${#58}/base/plugins/org.eclipse.platform);setProgramProperty(propName:eclipse.application,propValue:org.eclipse.ui.ide.workbench);setProgramProperty(propName:eclipse.product,propValue:org.eclipse.platform.ide);setProgramProperty(propName:osgi.bundles.defaultStartLevel,propValue:4);"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_IDE_CONFIGURATION: unitOpen(lines, "toolingorg.eclipse.platform.ide.configuration", version); providesOpen(lines, 1); provided(lines, "toolingorg.eclipse.platform.ide.configuration", version); providesClose(lines); requiresOpen(lines, 135); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.equinox.common"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.update.configurator"); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.core.runtime"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.core.runtime"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.equinox.common"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.equinox.common"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.equinox.event"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "x86_64", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "ppc64le", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ppc", "aix", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "x86", "win32", "win32", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.equinox.event"); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.equinox.simpleconfigurator"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "ppc", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.core.runtime"); toolingRequires(lines, range, "ppc64", "aix", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "s390", "linux", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "sparc", "solaris", "gtk", "org.eclipse.equinox.common"); toolingRequires(lines, range, "s390x", "linux", "gtk", "org.eclipse.equinox.p2.reconciler.dropins"); toolingRequires(lines, range, "ia64", "hpux", "gtk", "org.eclipse.equinox.ds"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "x86", "solaris", "gtk", "org.eclipse.update.configurator"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.platform.ide.config."); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "macosx", "cocoa", "org.eclipse.platform.ide.ini."); toolingRequires(lines, range, "x86_64", "win32", "win32", "org.eclipse.core.runtime"); toolingRequires(lines, range, "x86", "linux", "gtk", "org.eclipse.equinox.event"); toolingRequires(lines, range, "ppc64", "linux", "gtk", "org.eclipse.equinox.ds"); requiresClose(lines); touchpoint(lines, "null", "0.0.0"); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_IDE_EXECUTABLE_WIN32_WIN32_X86_64: unitOpen(lines, "toolingorg.eclipse.platform.ide.executable.win32.win32.x86_64", version, false); hostRequirementsOpen(lines, 1); required(lines, "org.eclipse.platform.ide.executable.win32.win32.x86_64", range); hostRequirementsClose(lines); propertiesOpen(lines, 1); property(lines, "org.eclipse.equinox.p2.type.fragment", "true"); propertiesClose(lines); providesOpen(lines, 1); provided(lines, "toolingorg.eclipse.platform.ide.executable.win32.win32.x86_64", version); providesClose(lines); requiresOpen(lines, 1); required(lines, "org.eclipse.platform.ide.executable.win32.win32.x86_64", range); requiresClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); touchpoint(lines, "org.eclipse.equinox.p2.native", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "install", "unzip(source:@artifact, target:${installFolder});"); instruction(lines, "uninstall", "cleanupzip(source:@artifact, target:${installFolder});"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; case TOOLINGORG_ECLIPSE_PLATFORM_IDE_INI_WIN32_WIN32_X86_64: unitOpen(lines, "toolingorg.eclipse.platform.ide.ini.win32.win32.x86_64", version, false); providesOpen(lines, 2); provided(lines, "toolingorg.eclipse.platform.ide.ini.win32.win32.x86_64", version); provided(lines, "toolingorg.eclipse.platform.ide", "org.eclipse.platform.ide.ini", version); providesClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "unconfigure", "removeJvmArg(jvmArg:-Xms40m);removeJvmArg(jvmArg:-Xmx512m);removeProgramArg(programArg:-showsplash);removeProgramArg(programArg:org.eclipse.platform);removeProgramArg(programArg:--launcher.XXMaxPermSize);removeProgramArg(programArg:256m);removeProgramArg(programArg:--launcher.defaultAction);removeProgramArg(programArg:openFile);removeProgramArg(programArg:--launcher.appendVmargs);"); instruction(lines, "configure", "addJvmArg(jvmArg:-Xms40m);addJvmArg(jvmArg:-Xmx512m);addProgramArg(programArg:-showsplash);addProgramArg(programArg:org.eclipse.platform);addProgramArg(programArg:--launcher.XXMaxPermSize);addProgramArg(programArg:256m);addProgramArg(programArg:--launcher.defaultAction);addProgramArg(programArg:openFile);addProgramArg(programArg:--launcher.appendVmargs);"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; case TOOLINGWIN32_WIN32_X86_64ORG_ECLIPSE_CORE_RUNTIME: unitOpen(lines, "toolingwin32.win32.x86_64org.eclipse.core.runtime", version, false); hostRequirementsOpen(lines, 2); required(lines, "osgi.bundle", "org.eclipse.core.runtime", versions.get("org.eclipse.core.runtime"), false, true); required(lines, "org.eclipse.equinox.p2.eclipse.type", "bundle", "[1.0.0,2.0.0)", false, false); hostRequirementsClose(lines); propertiesOpen(lines, 1); property(lines, "org.eclipse.equinox.p2.type.fragment", "true"); propertiesClose(lines); providesOpen(lines, 2); provided(lines, "org.eclipse.equinox.p2.iu", "toolingwin32.win32.x86_64org.eclipse.core.runtime", version); provided(lines, "org.eclipse.equinox.p2.flavor", "toolingwin32.win32.x86_64", "1.0.0"); providesClose(lines); requiresOpen(lines, 2); required(lines, "osgi.bundle", "org.eclipse.core.runtime", versions.get("org.eclipse.core.runtime"), false, true); required(lines, "org.eclipse.equinox.p2.eclipse.type", "bundle", "[1.0.0,2.0.0)", false, false); requiresClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); touchpoint(lines, "null", "0.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 4); instruction(lines, "install", "installBundle(bundle:${artifact})"); instruction(lines, "uninstall", "uninstallBundle(bundle:${artifact})"); instruction(lines, "unconfigure", "markStarted(started: false);"); instruction(lines, "configure", "markStarted(started: true);"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); break; default: lines.add(""); lines.add(""); break; } } private static void toolingRequires(ArrayList<String> lines, String range, String arch, String os, String ws, String id) { String filter = "(&(osgi.arch=" + arch + ")(osgi.os=" + os + ")(osgi.ws=" + ws + "))"; if (id.endsWith("ini.") || id.endsWith("config.")) { required(lines, "tooling" + id + ws + "." + os + "." + arch, range, filter); } else { required(lines, "tooling" + ws + "." + os + "." + arch + id, range, filter); } } private static void writeRequires(ArrayList<String> lines, Feature platform, Plugin launcher) { String platformID = platform.id; String platformV = platform.version; String launcherV102 = "1.0.200.qualifier"; String launcherID = launcher.id; String launcherV112 = "1.1.200.qualifier"; String launcherV111 = "1.1.100.qualifier"; String launcherV101 = "1.0.100.qualifier"; String toolingPlatformExecutable = "tooling" + platformID + ".ide.executable"; String toolingLaucher = "tooling" + launcherID; String platformExecutable = platformID + ".ide.executable"; require2(lines, "gtk", "linux", "ppc64le", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "ppc64le", toolingLaucher, "", launcherV102); require2(lines, "gtk", "hpux", "ia64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "linux", "s390", toolingLaucher, "", launcherV112); require2(lines, "gtk", "aix", "ppc", toolingLaucher, "", launcherV111); require2(lines, "gtk", "linux", "x86_64", platformExecutable, "", platformV); require2(lines, "gtk", "aix", "ppc", toolingPlatformExecutable, "", platformV); required(lines, MAC_BUNDLED_EXE, inclusive(platformV), MAC_BUNDLED_FILTER); require2(lines, "gtk", "linux", "ppc", platformExecutable, "", platformV); require2(lines, "gtk", "linux", "ppc64le", platformExecutable, "", platformV); require2(lines, "cocoa", "macosx", "x86_64", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "s390x", platformExecutable, "", platformV); require2(lines, "gtk", "linux", "s390x", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "x86_64", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "ppc", toolingLaucher, "", launcherV112); require2(lines, "win32", "win32", "x86_64", platformExecutable, "", platformV); require2(lines, "win32", "win32", "x86", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "s390x", platformExecutable, ".eclipse", platformV); required(lines, "tooling" + launcherID, inclusive(launcher.version)); require2(lines, "win32", "win32", "x86", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "aix", "ppc", platformExecutable, "", platformV); require2(lines, "gtk", "aix", "ppc", platformExecutable, ".eclipse", platformV); require2(lines, "win32", "win32", "x86", platformExecutable, "", platformV); require2(lines, "gtk", "hpux", "ia64", toolingLaucher, "", launcherV101); require2(lines, "win32", "win32", "x86_64", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "ppc64", toolingLaucher, "", launcherV102); require2(lines, "gtk", "solaris", "sparc", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "aix", "ppc64", toolingLaucher, "", launcherV111); require2(lines, "gtk", "linux", "x86_64", toolingPlatformExecutable, "", platformV); require2(lines, "cocoa", "macosx", "x86_64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "linux", "ppc", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "hpux", "ia64", platformExecutable, "", platformV); require2(lines, "gtk", "linux", "s390", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "solaris", "sparc", toolingLaucher, "", launcherV112); require2(lines, "win32", "win32", "x86_64", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "s390", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "aix", "ppc64", platformExecutable, "", platformV); require2(lines, "gtk", "linux", "x86", platformExecutable, "", platformV); require2(lines, "gtk", "linux", "ppc", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "solaris", "x86", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "x86_64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "solaris", "sparc", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "ppc64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "aix", "ppc64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "linux", "ppc64le", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "solaris", "x86", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "ppc64", toolingPlatformExecutable, "", platformV); require2(lines, "win32", "win32", "x86_64", platformExecutable, ".eclipse", platformV); require2(lines, "gtk", "linux", "x86", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "s390", platformExecutable, "", platformV); require2(lines, "gtk", "aix", "ppc64", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "x86", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "linux", "x86", platformExecutable, ".eclipse", platformV); require2(lines, "win32", "win32", "x86", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "hpux", "ia64", toolingPlatformExecutable, "", platformV); require2(lines, "gtk", "solaris", "x86", platformExecutable, ".eclipse", platformV); required(lines, MAC_UNBUNDLED_EXE, inclusive(platformV), MAC_UNBUNDLED_FILTER); require2(lines, "gtk", "linux", "s390x", toolingLaucher, "", launcherV112); require2(lines, "gtk", "linux", "ppc64", platformExecutable, "", platformV); require2(lines, "cocoa", "macosx", "x86_64", platformExecutable, "", platformV); require2(lines, "gtk", "solaris", "x86", platformExecutable, "", platformV); require2(lines, "gtk", "solaris", "sparc", platformExecutable, "", platformV); } private static void require2(ArrayList<String> lines, String ws, String os, String arch, String id, String suffix, String ver) { required(lines, id + "." + ws + "." + os + "." + arch + suffix, inclusive(ver), "(&(osgi.arch=" + arch + ")(osgi.os=" + os + ")(osgi.ws=" + ws + "))"); } private static void hostRequirementsClose(ArrayList<String> lines) { lines.add(" </hostRequirements>"); } private static void hostRequirementsOpen(ArrayList<String> lines, int size) { lines.add(" <hostRequirements size='" + size + "'>"); } private static void addPlatformIDEExecutableEclipse(ArrayList<String> lines, Feature feature) { String ver = feature.version; String id = "org.eclipse.platform.ide.executable.win32.win32.x86_64.eclipse"; unitOpen(lines, id, ver, false); providesOpen(lines, 1); provided(lines, id, ver); providesClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "unconfigure", "setLauncherName()"); instruction(lines, "configure", "setLauncherName(name:eclipse)"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); } private static void unitOpen(ArrayList<String> lines, String id, String version, boolean singleton) { lines.add(" <unit id='" + id + "' version='" + version + "'" + (!singleton ? " singleton='false'" : "") + ">"); } private static void addPlatformIDEExecutable(ArrayList<String> lines, Feature feature) { String ver = feature.version; String id = "org.eclipse.platform.ide.executable.win32.win32.x86_64"; String filter = "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"; unitOpen(lines, id, ver); providesOpen(lines, 2); provided(lines, "org.eclipse.equinox.p2.iu", id, ver); provided(lines, "toolingorg.eclipse.platform.ide", "org.eclipse.platform.ide.executable", ver); providesClose(lines); requiresOpen(lines, 1); required(lines, "org.eclipse.equinox.launcher.win32.win32.x86_64", "0.0.0", filter); requiresClose(lines); filter(lines, filter); artifactsOpen(lines, 1); artifact(lines, "binary", id, ver); artifactsClose(lines); touchpoint(lines, "org.eclipse.equinox.p2.native", "1.0.0"); unitClose(lines); } private static void filter(ArrayList<String> lines, String filter) { lines.add(" <filter>"); lines.add(" " + filter); lines.add(" </filter>"); } private static void provided(ArrayList<String> lines, String namespace, String name, String version) { lines.add( " <provided namespace='" + namespace + "' name='" + name + "' version='" + version + "'/>"); } private static void artifact(ArrayList<String> lines, String classifier, String id, String version) { lines.add(" <artifact classifier='" + classifier + "' id='" + id + "' version='" + version + "'/>"); } private static void artifactsClose(ArrayList<String> lines) { lines.add(" </artifacts>"); } private static void artifactsOpen(ArrayList<String> lines, int size) { lines.add(" <artifacts size='" + size + "'>"); } private static void addPlatformIDE(ArrayList<String> lines, Feature platformIDE, Feature p2UserUI, Feature rcpConfiguration) { String ver = platformIDE.version; String license = platformIDE.properties.getOrDefault(platformIDE.license.replace("%", ""), platformIDE.license); String id = "org.eclipse.platform.ide"; unitOpen(lines, id, ver); update(lines, id, exclusive("4.0.0", ver), "An update for 4.x generation Eclipse SDK."); propertiesOpen(lines, 3); property(lines, "org.eclipse.equinox.p2.name", "Eclipse Platform"); property(lines, "org.eclipse.equinox.p2.type.product", "true"); property(lines, "org.eclipse.equinox.p2.type.group", "true"); propertiesClose(lines); providesOpen(lines, 1); provided(lines, id, ver); providesClose(lines); requiresOpen(lines, 13); required(lines, "tooling" + id + ".application", inclusive(ver)); required(lines, "config.a.jre.javase", inclusive("1.6.0")); required(lines, "toolingorg.eclipse.platform.configuration", inclusive("1.0.0"), "(!(osgi.os=macosx))"); required(lines, "toolingorg.eclipse.platform.configuration.gtk.linux.x86_64", inclusive("1.0.0"), "(&(osgi.arch=x86_64)(osgi.os=linux)(osgi.ws=gtk))"); required(lines, "tooling.org.eclipse.update.feature.default", inclusive("1.0.0"), "(org.eclipse.update.install.features=true)"); required(lines, "org.eclipse.rcp.configuration.feature.group", inclusive(rcpConfiguration.version)); required(lines, "tooling" + id + ".configuration", inclusive(ver)); required(lines, "org.eclipse.platform.feature.group", inclusive(ver)); required(lines, "toolingorg.eclipse.platform.configuration.macosx", inclusive("1.0.0"), "(osgi.os=macosx)"); required(lines, "a.jre.javase", inclusive("1.6.0")); required(lines, "tooling.source.default", inclusive("1.0.0")); required(lines, "org.eclipse.equinox.p2.user.ui.feature.group", inclusive(p2UserUI.version)); required(lines, "tooling.osgi.bundle.default", inclusive("1.0.0")); requiresClose(lines); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 1); instruction(lines, "configure", "addRepository(type:0,location:http${#58}//download.eclipse.org/eclipse/updates/4.5,name:The Eclipse Project Updates);addRepository(type:1,location:http${#58}//download.eclipse.org/eclipse/updates/4.5,name:The Eclipse Project Updates);addRepository(type:0,location:http${#58}//download.eclipse.org/releases/mars,name:Mars);addRepository(type:1,location:http${#58}//download.eclipse.org/releases/mars,name:Mars);mkdir(path:${installFolder}/dropins);"); instructionsClose(lines); touchpointDataClose(lines); licensesOpen(lines, 1); license(lines, "http://eclipse.org/legal/epl/notice.php", license); licensesClose(lines); unitClose(lines); } private static String inclusive(String s2) { return "[" + s2 + "," + s2 + "]"; } private static void licensesClose(ArrayList<String> lines) { lines.add(" </licenses>"); } private static void licensesOpen(ArrayList<String> lines, int size) { lines.add(" <licenses size='" + size + "'>"); } private static void instruction(ArrayList<String> lines, String key, String action) { lines.add(" <instruction key='" + key + "'>"); lines.add(" " + action); lines.add(" </instruction>"); } private static void instructionsClose(ArrayList<String> lines) { lines.add(" </instructions>"); } private static void touchpointDataClose(ArrayList<String> lines) { lines.add(" </touchpointData>"); } private static void instructionsOpen(ArrayList<String> lines, int size) { lines.add(" <instructions size='" + size + "'>"); } private static void touchpointDataOpen(ArrayList<String> lines, int size) { lines.add(" <touchpointData size='" + size + "'>"); } private static void touchpoint(ArrayList<String> lines, String id, String version) { lines.add(" <touchpoint id='" + id + "' version='" + version + "'/>"); } private static void required(ArrayList<String> lines, String name, String range) { lines.add(" <required namespace='org.eclipse.equinox.p2.iu' name='" + name + "' range='" + range + "'/>"); } private static void required(ArrayList<String> lines, String name, String range, String filter) { lines.add(" <required namespace='org.eclipse.equinox.p2.iu' name='" + name + "' range='" + range + "'>"); lines.add(" <filter>"); lines.add(" " + filter); lines.add(" </filter>"); lines.add(" </required>"); } private static void requiresClose(ArrayList<String> lines) { lines.add(" </requires>"); } private static void requiresOpen(ArrayList<String> lines, int size) { lines.add(" <requires size='" + size + "'>"); } private static void provided(ArrayList<String> lines, String id, String version) { lines.add(" <provided namespace='org.eclipse.equinox.p2.iu' name='" + id + "' version='" + version + "'/>"); } private static void providesClose(ArrayList<String> lines) { lines.add(" </provides>"); } private static void providesOpen(ArrayList<String> lines, int size) { lines.add(" <provides size='" + size + "'>"); } private static void property(ArrayList<String> lines, String key, String value) { lines.add(featureProperty(key, value)); } private static void propertiesClose(ArrayList<String> lines) { lines.add(" </properties>"); } private static void propertiesOpen(ArrayList<String> lines, int size) { lines.add(" <properties size='" + size + "'>"); } private static void update(ArrayList<String> lines, String id, String range, String description) { lines.add(" <update id='" + id + "' range='" + range + "' severity='0' description='" + description + "'/>"); } private static void update(ArrayList<String> lines, String id, String range) { lines.add(" <update id='" + id + "' range='" + range + "' severity='0'/>"); } private static String exclusive(String v1, String v2) { return "[" + v1 + "," + v2 + ")"; } private static void unitClose(ArrayList<String> lines) { lines.add(" </unit>"); } private static void unitOpen(ArrayList<String> lines, String id, String version) { lines.add(" <unit id='" + id + "' version='" + version + "'>"); } private static void addFeatureUnit(ArrayList<String> lines, Feature feature, String fileName) { boolean isGroup = fileName.endsWith(".feature.group"); String suffix = isGroup ? ".feature.group" : ".feature.jar"; String version = feature.version; String id = feature.id; if (isGroup) { unitOpen(lines, id + suffix, version, false); update(lines, id + suffix, "[0.0.0," + version + ")"); } else { unitOpen(lines, id + suffix, version); } addFeatureUnitProperties(lines, feature, isGroup); providesOpen(lines, 2); provided(lines, id + suffix, version); if (isGroup) { provided(lines, "org.eclipse.equinox.p2.localization", "df_LT", "1.0.0"); } else { provided(lines, "org.eclipse.equinox.p2.eclipse.type", "feature", "1.0.0"); provided(lines, "org.eclipse.update.feature", id, version); } providesClose(lines); if (isGroup) { addFeatureUnitRequires(lines, feature); touchpoint(lines, "null", "0.0.0"); } else { filter(lines, "(org.eclipse.update.install.features=true)"); artifactsOpen(lines, 1); artifact(lines, "org.eclipse.update.feature", id, version); artifactsClose(lines); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 1); instruction(lines, "zipped", "true"); instructionsClose(lines); touchpointDataClose(lines); } licensesOpen(lines, 1); license(lines, feature.licenseURL, feature.license); licensesClose(lines); copyright(lines, feature.copyright, feature.copyrightURL); unitClose(lines); } private static void license(ArrayList<String> lines, String url, String license) { if (url.startsWith("%")) { url = "%25" + url.substring(1); } lines.add(" <license uri='" + url + "' url='" + url + "'>"); lines.add(" " + wrap(license)); lines.add(" </license>"); } private static void copyright(ArrayList<String> lines, String copyright, String url) { if (url != null) { lines.add(" <copyright uri='" + wrap(url) + "' url='" + wrap(url) + "'>"); lines.add(" " + wrap(copyright)); lines.add(" </copyright>"); } else { copyright(lines, copyright); } } private static void copyright(ArrayList<String> lines, String copyright) { lines.add(" <copyright>"); lines.add(" " + wrap(copyright)); lines.add(" </copyright>"); } private static void addFeatureUnitRequires(ArrayList<String> lines, Feature feature) { boolean needsPlatformRoot = "org.eclipse.platform".equals(feature.id); boolean needsRCPRoot = "org.eclipse.rcp".equals(feature.id); boolean needsConfigurationRoots = "org.eclipse.rcp.configuration".equals(feature.id); int size = feature.plugins.size() + feature.includes.size() + feature.requiresImports.size() + 1; if (needsRCPRoot) { size++; } if (needsPlatformRoot) { size++; } if (needsConfigurationRoots) { size += 14; } requiresOpen(lines, size); for (Import required : feature.requiresImports) { String name = required.feature != null ? required.feature + ".feature.group" : required.plugin; String version = required.version; int nextMajor = Integer.parseInt(version.split("\\.")[0]) + 1; required(lines, name, "[" + version + "," + nextMajor + ".0.0)"); } for (Feature.Plugin include : feature.includes) { addFeatureUnitRequired(lines, include); } for (Feature.Plugin plugin : feature.plugins) { addFeatureUnitRequired(lines, plugin); } String featureJar = feature.id + ".feature.jar"; String range = inclusive(feature.version); required(lines, featureJar, range, "(org.eclipse.update.install.features=true)"); if (needsConfigurationRoots) { required_root(lines, "cocoa", "macosx", "x86_64", range); required_root(lines, "gtk", "aix", "ppc64", range); required_root(lines, "gtk", "linux", "s390", range); required_root(lines, "gtk", "linux", "x86", range); required_root(lines, "gtk", "linux", "ppc64", range); required_root(lines, "gtk", "solaris", "x86", range); required_root(lines, "win32", "win32", "x86_64", range); required_root(lines, "win32", "win32", "x86", range); required_root(lines, "gtk", "linux", "x86_64", range); required_root(lines, "gtk", "aix", "ppc", range); required_root(lines, "gtk", "linux", "s390x", range); required_root(lines, "gtk", "solaris", "sparc", range); required_root(lines, "gtk", "linux", "ppc", range); required_root(lines, "gtk", "hpux", "ia64", range); } if (needsPlatformRoot || needsRCPRoot) { String rootID = feature.id + "_root"; required(lines, rootID, range); } requiresClose(lines); } private static void required_root(ArrayList<String> lines, String ws, String os, String arch, String range) { String id = "org.eclipse.rcp.configuration_root." + ws + "." + os + "." + arch; String filter = "(&(osgi.arch=" + arch + ")(osgi.os=" + os + ")(osgi.ws=" + ws + "))"; required(lines, id, range, filter); } private static void addFeatureUnitRequired(ArrayList<String> lines, Feature.Plugin plugin) { String filter = ""; int count = 0; if (plugin.arch != null) { filter += "(osgi.arch=" + plugin.arch + ")"; count++; } if (plugin.os != null) { filter += "(osgi.os=" + plugin.os + ")"; count++; } if (plugin.ws != null) { filter += "(osgi.ws=" + plugin.ws + ")"; count++; } if (count > 1) { filter = "(&" + filter + ")"; } String required = String.format( " <required namespace='org.eclipse.equinox.p2.iu' name='%1$s' range='[%2$s,%2$s]'", plugin.id + (plugin.fragment ? ".feature.group" : ""), plugin.version); if (count == 0) { lines.add(required + "/>"); } else { lines.add(required + ">"); lines.add(" <filter>"); lines.add(" " + wrap(filter)); lines.add(" </filter>"); lines.add(" </required>"); } } private static void addFeatureUnitProperties(ArrayList<String> lines, Feature feature, boolean isGroup) { ArrayList<String> added = new ArrayList<>(); added.add(featurePropertyP2("name", feature.label)); added.add(featurePropertyP2("description", feature.description)); added.add(featurePropertyP2("description.url", feature.descriptionURL)); added.add(featurePropertyP2("provider", feature.providerName)); if (isGroup) { added.add(featurePropertyP2("type.group", "true")); } else { added.add(featureProperty("org.eclipse.update.feature.plugin", feature.plugin)); } if (feature.id.equals("org.eclipse.e4.rcp") || feature.id.equals("org.eclipse.equinox.p2.core.feature") || feature.id.equals("org.eclipse.equinox.p2.extras.feature") || feature.id.equals("org.eclipse.equinox.p2.rcp.feature") || feature.id.equals("org.eclipse.equinox.p2.user.ui") || feature.id.equals("org.eclipse.help") || feature.id.equals("org.eclipse.platform") || feature.id.equals("org.eclipse.help") || feature.id.equals("org.eclipse.rcp") || feature.id.equals("org.eclipse.rcp.configuration")) { added.add(featurePropertyMaven("groupId", feature.mavenGroupID())); added.add(featurePropertyMaven("artifactId", feature.id)); added.add(featurePropertyMaven("version", feature.mavenVersion())); } added.add(featurePropertyLT(feature, feature.label)); added.add(featurePropertyLT(feature, feature.providerName)); added.add(featurePropertyLT(feature, feature.description)); added.add(featurePropertyLT(feature, feature.copyright)); added.add(featurePropertyLT(feature, feature.license)); added.removeIf(s -> s == null); int size = added.size(); propertiesOpen(lines, size); lines.addAll(added); propertiesClose(lines); } private static String featurePropertyLT(Feature feature, String label) { if (label == null || label.startsWith("%") == false) { return null; } String key = label.substring(1); String value = feature.properties.get(key); if (value == null) { return null; } return String.format(" <property name='df_LT.%s' value='%s'/>", wrap(key), wrap(value.trim())); } private static String featureProperty(String key, String value) { if (value == null) { return null; } return String.format(" <property name='%s' value='%s'/>", wrap(key), wrap(value)); } private static String featurePropertyP2(String key, String value) { if (value == null) { return null; } return String.format(" <property name='org.eclipse.equinox.p2.%s' value='%s'/>", wrap(key), wrap(value)); } private static String featurePropertyMaven(String key, String value) { if (value == null) { return null; } return String.format(" <property name='maven-%s' value='%s'/>", wrap(key), wrap(value)); } private static void addRcpConfigurationUnit(ArrayList<String> lines, Feature rcpConfiguration) { unitOpen(lines, "org.eclipse.rcp.configuration_root.win32.win32.x86_64", rcpConfiguration.version); providesOpen(lines, 1); provided(lines, "org.eclipse.rcp.configuration_root.win32.win32.x86_64", rcpConfiguration.version); providesClose(lines); filter(lines, "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"); artifactsOpen(lines, 1); artifact(lines, "binary", "org.eclipse.rcp.configuration_root.win32.win32.x86_64", rcpConfiguration.version); artifactsClose(lines); touchpoint(lines, "org.eclipse.equinox.p2.native", "1.0.0"); touchpointDataOpen(lines, 2); instructionsOpen(lines, 2); instruction(lines, "install", "unzip(source:@artifact, target:${installFolder});"); instruction(lines, "uninstall", "cleanupzip(source:@artifact, target:${installFolder});"); instructionsClose(lines); instructionsOpen(lines, 1); instruction(lines, "install", "chmod(targetDir:${installFolder}, targetFile:eclipse.exe, permissions:755);"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); } private static void addBinary_RootUnit(ArrayList<String> lines, Plugin plugin) { String id = plugin.id + "_root"; unitOpen(lines, id, plugin.version); providesOpen(lines, 1); provided(lines, id, plugin.version); providesClose(lines); artifactsOpen(lines, 1); artifact(lines, "binary", id, plugin.version); artifactsClose(lines); touchpoint(lines, "org.eclipse.equinox.p2.native", "1.0.0"); touchpointDataOpen(lines, 1); instructionsOpen(lines, 2); instruction(lines, "install", "(source:@artifact, target:${installFolder});"); instruction(lines, "uninstall", "cleanupzip(source:@artifact, target:${installFolder});"); instructionsClose(lines); touchpointDataClose(lines); unitClose(lines); } private static String extractName(Path p, HashMap<Path, HashMap<String, String>> pluginToManifest) { HashMap<String, String> manifest = pluginToManifest.get(p); if (manifest == null) { return p.getFileName().toString(); } String bsn = manifest.get("Bundle-SymbolicName"); String id = bsn.split(";")[0].trim(); return id; } private static String extractVersion(Path p, HashMap<Path, HashMap<String, String>> pluginToManifest) { HashMap<String, String> manifest = pluginToManifest.get(p); if (manifest == null) { return "0.0.0"; } return manifest.get("Bundle-Version"); } private static void addPluginUnit(Path plugin, ArrayList<String> lines, Map<String, String> props, Map<String, String> p2Inf, HashMap<String, String> manifest) { String bsn = manifest.get("Bundle-SymbolicName"); String id = bsn.split(";")[0].trim(); String version = manifest.get("Bundle-Version"); boolean singleton = bsn.contains("singleton:=true"); unitOpen(lines, id, version, singleton); update(lines, id, "[0.0.0," + version + ")"); addUnitProperties(lines, props, manifest); addUnitProvides(lines, id, version, props, manifest, p2Inf); addUnitRequires(lines, manifest, p2Inf); addUnitFilter(lines, manifest); addUnitArtifacts(lines, id, version); touchpoint(lines, "org.eclipse.equinox.p2.osgi", "1.0.0"); addUnitTouchpointData(plugin, manifest, lines, id, p2Inf); unitClose(lines); } private static void addUnitFilter(ArrayList<String> lines, HashMap<String, String> manifest) { String filter = manifest.get("Eclipse-PlatformFilter"); if (filter != null) { String s = filter.trim().replace(" ", ""); switch (s) { case "(&(osgi.os=win32)(osgi.arch=x86_64))": s = "(&(osgi.arch=x86_64)(osgi.os=win32))"; break; case "(&(osgi.ws=win32)(osgi.os=win32)(osgi.arch=x86_64))": case "(&(osgi.os=win32)(osgi.ws=win32)(osgi.arch=x86_64))": case "(&(osgi.ws=win32)(osgi.arch=x86_64)(osgi.os=win32))": case "(&(osgi.os=win32)(osgi.arch=x86_64)(osgi.ws=win32))": case "(&(osgi.arch=x86_64)(osgi.ws=win32)(osgi.os=win32))": s = "(&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))"; break; } lines.add(" <filter>"); lines.add(" " + wrap(s)); lines.add(" </filter>"); } } private static void addUnitTouchpointData(Path plugin, HashMap<String, String> manifest, ArrayList<String> lines, String id, Map<String, String> p2Inf) { boolean dirShape = plugin.getFileName().toString().endsWith(".jar") == false; List<String> instructions; if (dirShape && id.startsWith("nu.")) { instructions = List.of("Bundle-RequiredExecutionEnvironment", "Bundle-Name", "Bundle-Activator", "Manifest-Version", "Bundle-Vendor", "Bundle-ClassPath", "Bundle-SymbolicName", "Bundle-ManifestVersion", "Eclipse-LazyStart", "Bundle-Version", "Bundle-Localization", "Export-Package", "Require-Bundle"); } else { instructions = List.of("Bundle-SymbolicName", "Bundle-Version", "Fragment-Host"); } instructions = instructions.filter(s -> manifest.get(s) != null) .replaceAll(s -> s + ": " + wrap(manifest.get(s))); String instruction = " " + String.join("
", instructions); int size = 1; if (dirShape) { size++; } if (p2Inf != null && p2Inf.containsKey("instructions.unconfigure")) { size++; } if (p2Inf != null && p2Inf.containsKey("instructions.configure")) { size++; } lines.add(" <touchpointData size='1'>"); instructionsOpen(lines, size); lines.add(" <instruction key='manifest'>"); lines.add(instruction); lines.add(" </instruction>"); if (dirShape) { lines.add(" <instruction key='zipped'>"); lines.add(" true"); lines.add(" </instruction>"); } if (p2Inf != null) { if (p2Inf.containsKey("instructions.unconfigure")) { lines.add(" <instruction key='unconfigure'>"); lines.add(" " + p2Inf.get("instructions.unconfigure")); lines.add(" </instruction>"); } if (p2Inf.containsKey("instructions.configure")) { lines.add(" <instruction key='configure'>"); lines.add(" " + p2Inf.get("instructions.configure")); lines.add(" </instruction>"); } } instructionsClose(lines); touchpointDataClose(lines); } private static void addUnitArtifacts(ArrayList<String> lines, String id, String version) { lines.add(" <artifacts size='1'>"); lines.add(" <artifact classifier='osgi.bundle' id='" + id + "' version='" + version + "'/>"); artifactsClose(lines); } private static void addUnitRequires(ArrayList<String> lines, HashMap<String, String> manifest, Map<String, String> p2Inf) { int size = 0; Matcher fragmentMatcher = matcherForValue(manifest, "Fragment-Host"); Matcher requireMatcher = matcherForValue(manifest, "Require-Bundle"); Matcher importMatcher = matcherForValue(manifest, "Import-Package"); ArrayList<String> fragmentLines = collectRequired(fragmentMatcher, " <required namespace='osgi.bundle' name='%s' range='%s'%s/>"); ArrayList<String> requireLines = collectRequired(requireMatcher, " <required namespace='osgi.bundle' name='%s' range='%s'%s/>"); ArrayList<String> importLines = collectRequired(importMatcher, " <required namespace='java.package' name='%s' range='%s'%s/>"); size = fragmentLines.size() + requireLines.size() + importLines.size(); boolean addWin32 = "(osgi.os=win32)".equals(manifest.get("Eclipse-PlatformFilter")); if (addWin32) { size += 2; } int[] indexes = p2Inf.keySet().filter(s -> s.endsWith(".range") && s.startsWith("requires.")) .mapToInt(s -> Integer.parseInt(s.replace("requires.", "").replace(".range", ""))); Arrays.sort(indexes); size += indexes.length; if (size == 0) { return; } requiresOpen(lines, size); for (int index : indexes) { String namespace = p2Inf.getOrDefault("requires." + index + ".namespace", "java.package"); String name = p2Inf.get("requires." + index + ".name"); String optional = p2Inf.getOrDefault("requires." + index + ".optional", "false"); String greedy = p2Inf.getOrDefault("requires." + index + ".greedy", "true"); String range = p2Inf.getOrDefault("requires." + index + ".range", "0.0.0"); required(lines, namespace, name, range, Boolean.parseBoolean(optional), Boolean.parseBoolean(greedy)); } if (addWin32) { String x86 = "org.eclipse.swt.win32.win32.x86"; String part1 = "(&(osgi.arch=x86"; String part2 = ")(osgi.os=win32)(osgi.ws=win32))"; required(lines, x86, "0.0.0", part1 + part2); required(lines, x86 + "_64", "0.0.0", part1 + "_64" + part2); } lines.addAll(fragmentLines); lines.addAll(requireLines); lines.addAll(importLines); requiresClose(lines); } private static void required(ArrayList<String> lines, String namespace, String name, String range, boolean optional, boolean greedy) { //String opt = optional ? greedy ? " optional='true'" : " optional='true' greedy='false'" : ""; lines.add(" <required namespace='" + namespace + "' name='" + name + "' range='" + range + "'" + (optional ? " optional='true'" : "") + (!greedy ? " greedy='false'" : "") + "/>"); } private static void required(ArrayList<String> lines, String namespace, String name, String range, boolean optional, boolean greedy, boolean multiple) { lines.add(" <required namespace='" + namespace + "' name='" + name + "' range='" + range + "'" + (optional ? " optional='true'" : "") + (multiple ? " multiple='true'" : "") + (!greedy ? " greedy='false'" : "") + "/>"); } private static Matcher matcherForValue(HashMap<String, String> manifest, String name) { String requireBundle = manifest.get(name); if (requireBundle == null) { requireBundle = ""; } Matcher requireMatcher = EXPORTED_PACKAGE_PATTERN.matcher(requireBundle); return requireMatcher; } private static ArrayList<String> collectRequired(Matcher matcher, String format) { ArrayList<String> lines = new ArrayList<>(); while (matcher.find()) { String group = matcher.group(); String name = matcher.group(1); if (name.equals("system.bundle")) { name = "org.eclipse.osgi"; } String ver = findVersion(group); String opt = group.contains("resolution:=optional") ? group.contains("x-installation:=greedy") ? " optional='true'" : " optional='true' greedy='false'" : ""; String line = String.format(format, name, ver, opt); lines.add(line); } return lines; } private static void addUnitProvides(ArrayList<String> lines, String id, String version, Map<String, String> props, HashMap<String, String> manifest, Map<String, String> p2Inf) { String exportPackage = manifest.get("Export-Package"); if (exportPackage == null) { exportPackage = ""; } int size = 3; if (props.notEmpty()) { size++; } String fragment = null; if (manifest.get("Fragment-Host") != null) { Matcher matcher = EXPORTED_PACKAGE_PATTERN.matcher(manifest.get("Fragment-Host")); if (matcher.find()) { size++; String name = matcher.group(1); fragment = " <provided namespace='osgi.fragment' name='" + name + "' version='" + version + "'/>"; } } Matcher matcher = EXPORTED_PACKAGE_PATTERN.matcher(exportPackage); while (matcher.find()) { size++; } matcher.reset(); for (int i = 0;; i++) { if (p2Inf.containsKey("provides." + i + ".name") == false) { break; } size++; } providesOpen(lines, size); lines.add(String.format(" <provided namespace='org.eclipse.equinox.p2.iu' name='%s' version='%s'/>", id, version)); for (int i = 0;; i++) { String p2InfName = p2Inf.get("provides." + i + ".name"); if (p2InfName == null) { break; } String p2InfNamespace = p2Inf.getOrDefault("provides." + i + ".namespace", "org.eclipse.equinox.p2.iu"); String p2InfVersion = p2Inf.getOrDefault("provides." + i + ".version", "0.0.0"); lines.add(String.format(" <provided namespace='%s' name='%s' version='%s'/>", p2InfNamespace, p2InfName, p2InfVersion.replace("$version$", version))); } lines.add(String.format(" <provided namespace='osgi.bundle' name='%s' version='%s'/>", id, version)); while (matcher.find()) { String group = matcher.group(); String name = matcher.group(1); String ver = findVersion(group); lines.add(String.format(" <provided namespace='java.package' name='%s' version='%s'/>", name, ver)); } lines.add( " <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>"); if (fragment != null) { lines.add(fragment); } if (MAVEN_PROPERTIES.containsAll(props.keySet()) == false) { lines.add( " <provided namespace='org.eclipse.equinox.p2.localization' name='df_LT' version='1.0.0'/>"); } providesClose(lines); } private static String findVersion(String group) { Matcher versionMatcher = EXPORTED_PACKAGE_VERSION_PATTERN.matcher(group); String ver = versionMatcher.find() ? versionMatcher.group(1) : "0.0.0"; if (ver.contains(",")) { String leftLimit = ver.substring(0, 1); String rightLimit = ver.substring(ver.length() - 1, ver.length()); String lower = ver.substring(1, ver.indexOf(',')); String upper = ver.substring(ver.indexOf(',') + 1, ver.length() - 1); return leftLimit + pad(lower) + "," + pad(upper) + rightLimit; } return pad(ver); } private static String pad(String version) { int count = (int) IntStream.from(version).filter(c -> c == '.').count(); switch (count) { case 0: return version + ".0.0"; case 1: return version + ".0"; default: return version; } } private static final boolean OK = true; private static final boolean NO = false; private static final Pattern EXPORTED_PACKAGE_VERSION_PATTERN = Pattern .compile(";\\s*b?u?n?d?l?e?-?version=\"([a-zA-Z0-9.,\\s\\[\\)]+)\""); private static final Pattern EXPORTED_PACKAGE_PATTERN = Pattern.compile( "([-a-zA-Z0-9.]+)(?:;\\s*[-.a-z]+:?=(?:(?:[a-zA-Z0-9.]+)|(?:\"[a-zA-Z0-9.,\\s\\[\\]\\(\\)]+\")))*"); private static enum UnitProperty { LT_VENDOR(" Bundle-Vendor", OK, " <property name='df_LT.%2$s' value='%3$s'/>"), LT_NAME( " Bundle-Name", OK, " <property name='df_LT.%2$s' value='%3$s'/>"), LT_DESCRIPTION(" Bundle-Description", OK, " <property name='df_LT.%2$s' value='%3$s'/>"), P2_NAME( " Bundle-Name", NO, " <property name='org.eclipse.equinox.p2.name' value='%1$s'/>"), P2_DESCRIPTION( " Bundle-Description", NO, " <property name='org.eclipse.equinox.p2.description' value='%1$s'/>"), P2_PROVIDER( " Bundle-Vendor", NO, " <property name='org.eclipse.equinox.p2.provider' value='%1$s'/>"), P2_CONTACT( " Bundle-ContactAddress", NO, " <property name='org.eclipse.equinox.p2.contact' value='%1$s'/>"), P2_DOC_URL_1( " Bundle-DocURL", NO, " <property name='org.eclipse.equinox.p2.doc.url' value='%1$s'/>"), P2_DOC_URL_2( " Bundle-DocUrl", NO, " <property name='org.eclipse.equinox.p2.doc.url' value='%1$s'/>"), P2_LOCALIZATION( "Bundle-Localization", NO, " <property name='org.eclipse.equinox.p2.bundle.localization' value='%1$s'/>"), POM_GROUP_ID( " groupId", NO, " <property name='maven-groupId' value='%1$s'/>"), POM_ARTIFACT_ID( " artifactId", NO, " <property name='maven-artifactId' value='%1$s'/>"), POM_VERSION( " version", NO, " <property name='maven-version' value='%1$s'/>"), MVN_GROUP_ID( " Bundle-SymbolicName", NO, " <property name='maven-groupId' value='%1$s'/>"), MVN_ARTIFACT_ID( "Bundle-SymbolicName", NO, " <property name='maven-artifactId' value='%1$s'/>"), MVN_VERSION( " Bundle-Version", NO, " <property name='maven-version' value='%1$s-SNAPSHOT'/>"); boolean needsProp; String manifestKey; String format; UnitProperty(String manifestKey, boolean needsProp, String format) { this.needsProp = needsProp; this.manifestKey = manifestKey.trim(); this.format = format; } boolean found(Map<String, String> props, HashMap<String, String> manifest) { switch (this) { case POM_GROUP_ID: case POM_ARTIFACT_ID: case POM_VERSION: { String group = props.get(POM_GROUP_ID.manifestKey); return props.containsKey(POM_ARTIFACT_ID.manifestKey) && props.containsKey(POM_VERSION.manifestKey) && group != null /*&& group.startsWith("org.eclipse.") && !group.startsWith("org.eclipse.ecf") && !group.startsWith("org.eclipse.emf") && !group.startsWith("org.eclipse.jem") && !group.startsWith("org.eclipse.jetty") && !group.startsWith("org.eclipse.mylyn") && !group.startsWith("org.eclipse.wst") && !group.startsWith("org.eclipse.xsd")*/ ; } default: } String value = manifest.get(manifestKey); if (value != null) { switch (this) { case MVN_GROUP_ID: case MVN_ARTIFACT_ID: case MVN_VERSION: { String group = manifest.get(MVN_GROUP_ID.manifestKey); return props.get(POM_GROUP_ID.manifestKey) == null && group != null && group.startsWith("org.eclipse.") && !group.startsWith("org.eclipse.ecf") && !group.startsWith("org.eclipse.emf") && !group.startsWith("org.eclipse.jem") && !group.startsWith("org.eclipse.jetty") && !group.startsWith("org.eclipse.mylyn") && !group.startsWith("org.eclipse.wst") && !group.startsWith("org.eclipse.xsd"); } case LT_DESCRIPTION: if (value.equals(manifest.get(LT_NAME.manifestKey))) { return false; } default: } String value2 = value.replace("%", ""); if (needsProp == false || props.containsKey(value2)) { return true; } } return false; } String format(Map<String, String> props, HashMap<String, String> manifest) { switch (this) { case POM_GROUP_ID: case POM_ARTIFACT_ID: case POM_VERSION: return String.format(format, props.get(manifestKey)); default: } String value = manifest.get(manifestKey); if (value != null) { switch (this) { case MVN_GROUP_ID: { String trim = value.split(";")[0].trim(); if (trim.startsWith("org.eclipse.epp.mpc")) { return String.format(format, "org.eclipse.epp.mpc"); } return String.format(format, String.join(".", List.of(trim.split("\\.")).subList(0, 3))); } case MVN_ARTIFACT_ID: return String.format(format, value.split(";")[0].trim()); case MVN_VERSION: return String.format(format, String.join(".", List.of(value.split("\\.")).subList(0, 3))); default: } String value2 = value.replace("%", ""); String prop = props.getOrDefault(value2, "MISS-" + value2); if (needsProp == false || props.containsKey(value2)) { return String.format(format, wrap(value), wrap(value2), wrap(prop)); } } throw new IllegalStateException("value not found for " + manifestKey); } } private static void addUnitProperties(ArrayList<String> lines, Map<String, String> props, HashMap<String, String> manifest) { List<UnitProperty> found = List.of(UnitProperty.values()).filter(u -> u.found(props, manifest)); int size = found.size(); propertiesOpen(lines, size); for (UnitProperty unitProperty : found) { lines.add(unitProperty.format(props, manifest)); } propertiesClose(lines); } private static void addConfigJreUnit(ArrayList<String> lines) { lines.addAll(" <unit id='config.a.jre.javase' version='1.6.0' singleton='false'>", " <hostRequirements size='1'>", " <required namespace='org.eclipse.equinox.p2.iu' name='a.jre.javase' range='1.6.0'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='1'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='config.a.jre.javase' version='1.6.0'/>", " </provides>", " <requires size='1'>", " <required namespace='org.eclipse.equinox.p2.iu' name='a.jre.javase' range='1.6.0'/>", " </requires>", " <touchpoint id='org.eclipse.equinox.p2.native' version='1.0.0'/>", " <touchpointData size='1'>", " <instructions size='1'>", " <instruction key='install'>", "", " </instruction>", " </instructions>", " </touchpointData>", " </unit>"); } private static void addJreUnit(ArrayList<String> lines) { String[] javaPackages = { "javax.accessibility", "javax.activation", "javax.activity", "javax.annotation", "javax.annotation.processing", "javax.crypto", "javax.crypto.interfaces", "javax.crypto.spec", "javax.imageio", "javax.imageio.event", "javax.imageio.metadata", "javax.imageio.plugins.bmp", "javax.imageio.plugins.jpeg", "javax.imageio.spi", "javax.imageio.stream", "javax.jws", "javax.jws.soap", "javax.lang.model", "javax.lang.model.element", "javax.lang.model.type", "javax.lang.model.util", "javax.management", "javax.management.loading", "javax.management.modelmbean", "javax.management.monitor", "javax.management.openmbean", "javax.management.relation", "javax.management.remote", "javax.management.remote.rmi", "javax.management.timer", "javax.naming", "javax.naming.directory", "javax.naming.event", "javax.naming.ldap", "javax.naming.spi", "javax.net", "javax.net.ssl", "javax.print", "javax.print.attribute", "javax.print.attribute.standard", "javax.print.event", "javax.rmi", "javax.rmi.CORBA", "javax.rmi.ssl", "javax.script", "javax.security.auth", "javax.security.auth.callback", "javax.security.auth.kerberos", "javax.security.auth.login", "javax.security.auth.spi", "javax.security.auth.x500", "javax.security.cert", "javax.security.sasl", "javax.sound.midi", "javax.sound.midi.spi", "javax.sound.sampled", "javax.sound.sampled.spi", "javax.sql", "javax.sql.rowset", "javax.sql.rowset.serial", "javax.sql.rowset.spi", "javax.swing", "javax.swing.border", "javax.swing.colorchooser", "javax.swing.event", "javax.swing.filechooser", "javax.swing.plaf", "javax.swing.plaf.basic", "javax.swing.plaf.metal", "javax.swing.plaf.multi", "javax.swing.plaf.synth", "javax.swing.table", "javax.swing.text", "javax.swing.text.html", "javax.swing.text.html.parser", "javax.swing.text.rtf", "javax.swing.tree", "javax.swing.undo", "javax.tools", "javax.transaction", "javax.transaction.xa", "javax.xml", "javax.xml.bind", "javax.xml.bind.annotation", "javax.xml.bind.annotation.adapters", "javax.xml.bind.attachment", "javax.xml.bind.helpers", "javax.xml.bind.util", "javax.xml.crypto", "javax.xml.crypto.dom", "javax.xml.crypto.dsig", "javax.xml.crypto.dsig.dom", "javax.xml.crypto.dsig.keyinfo", "javax.xml.crypto.dsig.spec", "javax.xml.datatype", "javax.xml.namespace", "javax.xml.parsers", "javax.xml.soap", "javax.xml.stream", "javax.xml.stream.events", "javax.xml.stream.util", "javax.xml.transform", "javax.xml.transform.dom", "javax.xml.transform.sax", "javax.xml.transform.stax", "javax.xml.transform.stream", "javax.xml.validation", "javax.xml.ws", "javax.xml.ws.handler", "javax.xml.ws.handler.soap", "javax.xml.ws.http", "javax.xml.ws.soap", "javax.xml.ws.spi", "javax.xml.ws.wsaddressing", "javax.xml.xpath", "org.ietf.jgss", "org.omg.CORBA", "org.omg.CORBA_2_3", "org.omg.CORBA_2_3.portable", "org.omg.CORBA.DynAnyPackage", "org.omg.CORBA.ORBPackage", "org.omg.CORBA.portable", "org.omg.CORBA.TypeCodePackage", "org.omg.CosNaming", "org.omg.CosNaming.NamingContextExtPackage", "org.omg.CosNaming.NamingContextPackage", "org.omg.Dynamic", "org.omg.DynamicAny", "org.omg.DynamicAny.DynAnyFactoryPackage", "org.omg.DynamicAny.DynAnyPackage", "org.omg.IOP", "org.omg.IOP.CodecFactoryPackage", "org.omg.IOP.CodecPackage", "org.omg.Messaging", "org.omg.PortableInterceptor", "org.omg.PortableInterceptor.ORBInitInfoPackage", "org.omg.PortableServer", "org.omg.PortableServer.CurrentPackage", "org.omg.PortableServer.POAManagerPackage", "org.omg.PortableServer.POAPackage", "org.omg.PortableServer.portable", "org.omg.PortableServer.ServantLocatorPackage", "org.omg.SendingContext", "org.omg.stub.java.rmi", "org.w3c.dom", "org.w3c.dom.bootstrap", "org.w3c.dom.css", "org.w3c.dom.events", "org.w3c.dom.html", "org.w3c.dom.ls", "org.w3c.dom.ranges", "org.w3c.dom.stylesheets", "org.w3c.dom.traversal", "org.w3c.dom.views", "org.w3c.dom.xpath", "org.xml.sax", "org.xml.sax.ext", "org.xml.sax.helpers", }; String[] osgiMinimums = { "1.0.0", "1.1.0", "1.2.0", }; String[] osgiJREs = { "1.0.0", "1.1.0", }; String[] osgiJavaSEs = { "1.0.0", "1.1.0", "1.2.0", "1.3.0", "1.4.0", "1.5.0", "1.6.0", }; int size = 1 + javaPackages.length + osgiMinimums.length + osgiJREs.length + osgiJavaSEs.length; lines.add(" <unit id='a.jre.javase' version='1.6.0' singleton='false'>"); providesOpen(lines, size); lines.add(" <provided namespace='org.eclipse.equinox.p2.iu' name='a.jre.javase' version='1.6.0'/>"); for (String s : javaPackages) { lines.add(" <provided namespace='java.package' name='" + s + "' version='0.0.0'/>"); } for (String s : osgiMinimums) { lines.add(" <provided namespace='osgi.ee' name='OSGi/Minimum' version='" + s + "'/>"); } for (String s : osgiJREs) { lines.add(" <provided namespace='osgi.ee' name='JRE' version='" + s + "'/>"); } for (String s : osgiJavaSEs) { lines.add(" <provided namespace='osgi.ee' name='JavaSE' version='" + s + "'/>"); } providesClose(lines); lines.add(" <touchpoint id='org.eclipse.equinox.p2.native' version='1.0.0'/>"); unitClose(lines); } private static void compare(List<String> v1, List<String> v2) { int i1 = 0; int i2 = 0; int matchCount = 0; int errorCount = 0; int n1 = v1.size(); int n2 = v2.size(); while (i1 < n1 && i2 < n2) { String s1 = v1.get(i1); String s2 = v2.get(i2); String filterS1 = significantChanges(s1); String filterS2 = significantChanges(s2); if (filterS1.equals(filterS2)) { matchCount++; i1++; i2++; } else { List<String> subV1 = v1.subList(Math.max(i1 - 10, 0), Math.min(i1 + 10, n1)) .replaceAll(s -> significantChanges(s)); List<String> subV2 = v2.subList(Math.max(i2 - 10, 0), Math.min(i2 + 10, n2)) .replaceAll(s -> significantChanges(s)); boolean foundS1 = subV2.contains(filterS1); boolean foundS2 = subV1.contains(filterS2); if (foundS1 && foundS2) { matchCount++; i1++; i2++; } else if (filterS2.contains("name='maven-")) { matchCount++; i2++; } else if (filterS1.contains("name='maven-")) { i1++; } else { if (matchCount > 0) { if (matchCount > 11) { System.out.println("(skipping to line " + (i1 - 9) + " / " + (i2 - 9) + ")"); } for (int i = -Math.min(matchCount, 10); i < 0; i++) { report("match v1 v2 ", v2.get(i2 + i)); } matchCount = 0; } if (foundS2) { i1++; report("NOT FOUND v1 ", s1); } else if (foundS1) { i2++; report("NOT FOUND v2 ", s2); } else { i1++; i2++; report("MISMATCH ", s1, s2); } errorCount++; } } if (errorCount > 10) { System.out.println("Too many errors, aborting..."); break; } } if (matchCount > 0) { System.out.println("(" + matchCount + " matching lines)"); } } private static String significantChanges(String s) { s = s.replaceAll("\\s|
|	|optional='true'|\\.SNAPSHOT|\\.qualifier|\\.[vI]?\\d{8}-?\\d{0,4}-?r?", ""); s = s.replaceAll("\\d+", "9"); s = s.replace("9.9.9", "9"); s = s.replace("9.9", "9"); s = s.replace("[9,9]", "9"); s = s.replace("[9,9)", "9"); return s; } private static void report(String error, String s) { if (s.length() > 200) { s = s.substring(0, 200) + "..."; } System.out.println(error + s); } private static void report(String error, String s1, String s2) { if (s1.length() > 10000) { s1 = s1.substring(0, 10000) + "..."; } System.out.println(error + " v1 " + s1); if (s2.length() > 10000) { s2 = s2.substring(0, 10000) + "..."; } System.out.println(error + " v2 " + s2); } private static List<String> readLastProfile(Path root) throws IOException { Path registryFolder = root.resolve("p2/org.eclipse.equinox.p2.engine/profileRegistry"); IOStream<Path> sorted = Files.walk(registryFolder).filter(p -> p.getFileName().toString().endsWith(".gz")) .sorted(Comparator.comparing(Path::getFileName).reversed()); Path path = sorted.findFirst().get(); System.out.println("Reading " + path); byte[] bs = Streams.readFully(new GZIPInputStream(Files.newInputStream(path))); String string = new String(bs, StandardCharsets.UTF_8).replace("\r", ""); return List.of(string.split("\n")); } private static String wrap(String s) { return s.replace("&", "&").replace("'", "'").replace("\"", """).replace("<", "<") .replace("\n", "
").replace("\r", "
").replace("\t", "	"); } private static List<String> readNewProfile(String profileName) { String string = snapshot.getFileAsString(Paths.get(profileName)).replace("\r", ""); return List.of(string.split("\n")); } private static HashMap<Path, Feature> getFeatures() throws IOException { HashMap<Path, Feature> originalFeatures = new HashMap<>(); List<Path> folders = snapshot.listFolders(Paths.get("features")); for (Path path : folders) { Feature feature = snapshot.getFileAsFeature(path); originalFeatures.put(fromZipPath(path), feature); } return originalFeatures; } private static HashMap<Path, Plugin> getPlugins() throws IOException { HashMap<Path, Plugin> originalPlugins = new HashMap<>(); List<Path> folders = snapshot.listFolders(Paths.get("plugins")); for (Path path : folders) { Plugin feature = snapshot.getFileAsPlugin(path); originalPlugins.put(fromZipPath(path), feature); } return originalPlugins; } private static HashMap<Path, Map<String, String>> getPluginToP2Inf() throws IOException { HashMap<Path, Map<String, String>> pluginToP2Inf = new HashMap<>(); for (Path plugin : snapshot.listAll(Paths.get("plugins"))) { Path p2Inf = plugin.resolve("META-INF/p2.inf"); Map<String, String> properties = snapshot.getFileAsProperties(p2Inf); pluginToP2Inf.put(fromZipPath(plugin), properties); } return pluginToP2Inf; } private static HashMap<Path, Map<String, String>> getPluginToProperties() throws IOException { HashMap<Path, Map<String, String>> pluginToProperties = new HashMap<>(); for (Path pluginPath : snapshot.listAll(Paths.get("plugins"))) { Plugin plugin = snapshot.getFileAsPlugin(pluginPath); if (plugin == null) { continue; } Map<String, String> localization = plugin.getLocalization(snapshot); List<Path> metaInfFiles = snapshot.listFilesRecursive(pluginPath.resolve("META-INF")); Optional<Path> optional = metaInfFiles.stream().filter(p -> p.endsWith("pom.properties")).findAny(); if (optional.isPresent()) { Map<String, String> pomProperties = snapshot.getFileAsProperties(optional.get()); localization = localization.putAll(pomProperties); } pluginToProperties.put(fromZipPath(pluginPath), localization); } return pluginToProperties; } private static Path fromZipPath(String path) { return MainBuildIDE.fromZipPath(path); } private static Path fromZipPath(Path path) { return MainBuildIDE.fromZipPath(path); } private static Map<Path, List<String>> tooling = HashMap.of(fromZipPath("tooling.osgi.bundle.default"), List.of( " <unit id='tooling.osgi.bundle.default' version='1.0.0' singleton='false'>", " <hostRequirements size='1'>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='0.0.0' multiple='true' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='tooling.osgi.bundle.default' version='1.0.0'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='tooling' version='1.0.0'/>", " </provides>", " <requires size='1'>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='0.0.0' multiple='true' greedy='false'/>", " </requires>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", "", " </instruction>", " <instruction key='configure'>", " setStartLevel(startLevel:4);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("tooling.source.default"), List.of( " <unit id='tooling.source.default' version='1.0.0' singleton='false'>", " <hostRequirements size='1'>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='source' range='0.0.0' optional='true' multiple='true' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='tooling.source.default' version='1.0.0'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='tooling' version='1.0.0'/>", " </provides>", " <requires size='1'>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='source' range='0.0.0' optional='true' multiple='true' greedy='false'/>", " </requires>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='2'>", " <instruction key='install'>", " addSourceBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " removeSourceBundle(bundle:${artifact})", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingorg.eclipse.equinox.launcher"), List.of( " <unit id='toolingorg.eclipse.equinox.launcher' version='1.3.0.v20140415-2008' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.launcher' range='1.3.0.v20140415-2008'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingorg.eclipse.equinox.launcher' version='1.3.0.v20140415-2008'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='tooling' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.launcher' range='1.3.0.v20140415-2008'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " removeProgramArg(programArg:-startup);removeProgramArg(programArg:@artifact);", " </instruction>", " <instruction key='configure'>", " addProgramArg(programArg:-startup);addProgramArg(programArg:@artifact);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingorg.eclipse.equinox.launcher.win32.win32.x86_64"), List.of( " <unit id='toolingorg.eclipse.equinox.launcher.win32.win32.x86_64' version='1.1.200.v20140603-1326' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.launcher.win32.win32.x86_64' range='1.1.200.v20140603-1326'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingorg.eclipse.equinox.launcher.win32.win32.x86_64' version='1.1.200.v20140603-1326'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='tooling' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.launcher.win32.win32.x86_64' range='1.1.200.v20140603-1326'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " removeProgramArg(programArg:--launcher.library);removeProgramArg(programArg:@artifact);", " </instruction>", " <instruction key='configure'>", " addProgramArg(programArg:--launcher.library);addProgramArg(programArg:@artifact);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.equinox.common"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.equinox.common' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.common' range='3.6.200.v20140819-0835'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.equinox.common' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.common' range='3.6.200.v20140819-0835'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " setStartLevel(startLevel:-1);markStarted(started: false);", " </instruction>", " <instruction key='configure'>", " setStartLevel(startLevel:2);markStarted(started: true);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.equinox.ds"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.equinox.ds' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.ds' range='1.4.200.v20131126-2331'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.equinox.ds' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.ds' range='1.4.200.v20131126-2331'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " setStartLevel(startLevel:-1);markStarted(started: false);", " </instruction>", " <instruction key='configure'>", " setStartLevel(startLevel:2);markStarted(started: true);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.equinox.event"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.equinox.event' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.event' range='1.3.100.v20140115-1647'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.equinox.event' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.event' range='1.3.100.v20140115-1647'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " setStartLevel(startLevel:-1);markStarted(started: false);", " </instruction>", " <instruction key='configure'>", " setStartLevel(startLevel:2);markStarted(started: true);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.equinox.p2.reconciler.dropins"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.equinox.p2.reconciler.dropins' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.p2.reconciler.dropins' range='1.1.200.v20131119-0908'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.equinox.p2.reconciler.dropins' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.p2.reconciler.dropins' range='1.1.200.v20131119-0908'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " markStarted(started: false);", " </instruction>", " <instruction key='configure'>", " markStarted(started: true);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.equinox.simpleconfigurator"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.equinox.simpleconfigurator' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.simpleconfigurator' range='1.1.0.v20131217-1203'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.equinox.simpleconfigurator' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.equinox.simpleconfigurator' range='1.1.0.v20131217-1203'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " setStartLevel(startLevel:-1);markStarted(started: false);", " </instruction>", " <instruction key='configure'>", " setStartLevel(startLevel:1);markStarted(started: true);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .put(fromZipPath("toolingwin32.win32.x86_64org.eclipse.update.configurator"), List.of( " <unit id='toolingwin32.win32.x86_64org.eclipse.update.configurator' version='4.5.0.I20140909-1315' singleton='false'>", " <hostRequirements size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.update.configurator' range='3.3.300.v20140518-1928'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </hostRequirements>", " <properties size='1'>", " <property name='org.eclipse.equinox.p2.type.fragment' value='true'/>", " </properties>", " <provides size='2'>", " <provided namespace='org.eclipse.equinox.p2.iu' name='toolingwin32.win32.x86_64org.eclipse.update.configurator' version='4.5.0.I20140909-1315'/>", " <provided namespace='org.eclipse.equinox.p2.flavor' name='toolingwin32.win32.x86_64' version='1.0.0'/>", " </provides>", " <requires size='2'>", " <required namespace='osgi.bundle' name='org.eclipse.update.configurator' range='3.3.300.v20140518-1928'/>", " <required namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' range='[1.0.0,2.0.0)' greedy='false'/>", " </requires>", " <filter>", " (&(osgi.arch=x86_64)(osgi.os=win32)(osgi.ws=win32))", " </filter>", " <touchpoint id='null' version='0.0.0'/>", " <touchpointData size='1'>", " <instructions size='4'>", " <instruction key='install'>", " installBundle(bundle:${artifact})", " </instruction>", " <instruction key='uninstall'>", " uninstallBundle(bundle:${artifact})", " </instruction>", " <instruction key='unconfigure'>", " setProgramProperty(propName:org.eclipse.update.reconcile, propValue:);", " </instruction>", " <instruction key='configure'>", " setProgramProperty(propName:org.eclipse.update.reconcile, propValue:false);", " </instruction>", " </instructions>", " </touchpointData>", " </unit>")) .toMap(); private static final Set<String> MAVEN_PROPERTIES = Set.of("groupId", "artifactId", "version"); private static final String MAC_UNBUNDLED_EXE = "toolingorg.eclipse.platform.ide.executable.cocoa.macosx.x86_64"; private static final String MAC_UNBUNDLED_FILTER = "(&(!(macosx-bundled=*))(osgi.arch=x86_64)(osgi.os=macosx)(osgi.ws=cocoa))"; private static final String MAC_BUNDLED_EXE = "toolingorg.eclipse.platform.ide.executable.cocoa.macosx.x86_64-bundled"; private static final String MAC_BUNDLED_FILTER = "(&(macosx-bundled=true)(osgi.arch=x86_64)(osgi.os=macosx)(osgi.ws=cocoa))"; }