| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * G&H Softwareentwicklung GmbH - internationalization implementation (bug 150933) |
| * Prosyst - create proper OSGi bundles (bug 174157) |
| * Felix Riegger (SAP AG) - consolidation of publishers for PDE formats (bug 331974) |
| * Rapicorp, Inc - Specify download stats URL and type of artifacts to monitor in category.xml (bug 436872) |
| *******************************************************************************/ |
| package org.eclipse.pde.internal.build; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.*; |
| import java.util.jar.JarFile; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile; |
| import org.eclipse.osgi.service.resolver.BundleDescription; |
| import org.eclipse.pde.internal.build.ant.*; |
| import org.eclipse.pde.internal.build.builder.BuildDirector; |
| import org.eclipse.pde.internal.build.builder.ModelBuildScriptGenerator; |
| import org.eclipse.pde.internal.build.site.BuildTimeFeature; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.Version; |
| |
| /** |
| * Generate an assemble script for a given feature and a given config. It |
| * generates all the instruction to zip the listed plugins and features. |
| */ |
| public class AssembleConfigScriptGenerator extends AbstractScriptGenerator { |
| protected String directory; // representing the directory where to generate the file |
| protected String featureId; |
| protected Config configInfo; |
| protected BuildTimeFeature[] features; // the features that will be assembled |
| protected BuildTimeFeature[] allFeatures; //the set of all the features that have been considered |
| protected BundleDescription[] plugins; |
| protected String filename; |
| protected Collection<BuildTimeFeature> rootFileProviders; |
| protected String rootFolder = null; |
| protected ArrayList<String> addedByPermissions = new ArrayList<>(); //contains the list of files and folders that have been added to an archive by permission management |
| |
| private static final String PROPERTY_SOURCE = "source"; //$NON-NLS-1$ |
| private static final String PROPERTY_ELEMENT_NAME = "elementName"; //$NON-NLS-1$ |
| |
| private static final byte BUNDLE_TYPE = 0; |
| private static final byte FEATURE_TYPE = 1; |
| |
| protected String PROPERTY_ECLIPSE_PLUGINS = "eclipse.plugins"; //$NON-NLS-1$ |
| protected String PROPERTY_ECLIPSE_FEATURES = "eclipse.features"; //$NON-NLS-1$ |
| protected boolean signJars; |
| private boolean generateJnlp; |
| |
| private String archiveFormat; |
| private boolean groupConfigs = false; |
| private String product; |
| private ProductFile productFile = null; |
| protected ShapeAdvisor shapeAdvisor = null; |
| private Boolean p2Bundles = null; |
| |
| public AssembleConfigScriptGenerator() { |
| super(); |
| } |
| |
| public void initialize(String directoryName, String feature, Config configurationInformation, Collection<BundleDescription> elementList, Collection<BuildTimeFeature> featureList, Collection<BuildTimeFeature> allFeaturesList, Collection<BuildTimeFeature> rootProviders) throws CoreException { |
| this.directory = directoryName; |
| this.featureId = feature; |
| this.configInfo = configurationInformation; |
| this.rootFileProviders = rootProviders != null ? rootProviders : new ArrayList<>(0); |
| this.rootFolder = Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER); //$NON-NLS-1$ |
| this.features = new BuildTimeFeature[featureList.size()]; |
| featureList.toArray(this.features); |
| |
| this.allFeatures = new BuildTimeFeature[allFeaturesList.size()]; |
| allFeaturesList.toArray(this.allFeatures); |
| |
| this.plugins = new BundleDescription[elementList.size()]; |
| this.plugins = elementList.toArray(this.plugins); |
| |
| openScript(directoryName, getTargetName() + ".xml"); //$NON-NLS-1$ |
| shapeAdvisor = new ShapeAdvisor(); |
| shapeAdvisor.setForceUpdateJars(forceUpdateJarFormat); |
| } |
| |
| protected String computeIconsList() { |
| return computeIconsList(configInfo.getOs()); |
| } |
| |
| protected String computeIconsList(String os) { |
| String result = Utils.getPropertyFormat(PROPERTY_LAUNCHER_ICONS); |
| if (getProductFile() == null) |
| return result; |
| String[] icons = os != null ? productFile.getIcons(os) : productFile.getIcons(); |
| for (int i = 0; i < icons.length; i++) { |
| |
| String icon = Utils.makeRelative(new Path(icons[i]), new Path(productFile.getLocation().getParent())).toOSString(); |
| |
| String location = findFile(icon, true); |
| if (location == null) { |
| File iconFile = new File(productFile.getLocation().getParentFile(), icon); |
| if (iconFile.exists()) |
| location = Utils.makeRelative(new Path(iconFile.getAbsolutePath()), new Path(workingDirectory)).toOSString(); |
| } |
| if (location != null) |
| result += ", " + Utils.getPropertyFormat(PROPERTY_BASEDIR) + '/' + location; //$NON-NLS-1$ |
| else { |
| result += ", " + Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + '/' + DEFAULT_PLUGIN_LOCATION + '/' + icon; //$NON-NLS-1$ |
| result += ", " + Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + '/' + DEFAULT_FEATURE_LOCATION + '/' + icon; //$NON-NLS-1$ |
| } |
| } |
| return result; |
| } |
| |
| @Override |
| public void generate() { |
| try { |
| // Note that we must pass the OS information in to load product |
| // so that any icon files can be calculated for the |
| // generateBrandingCalls. |
| productFile = loadProduct(product, configInfo.getOs()); |
| } catch (CoreException e) { |
| //ignore |
| } |
| generatePrologue(); |
| |
| generateMainBegin(); |
| generateInitializationSteps(); |
| if (BuildDirector.p2Gathering) { |
| generateP2Assembling(); |
| } else { |
| generateGatherCalls(); |
| generateProcessingCalls(); |
| generateBrandingCalls(); |
| generateP2Steps(); |
| } |
| generateArchivingCalls(); |
| generateMainEnd(); |
| |
| generateEpilogue(); |
| } |
| |
| protected void generateGatherCalls() { |
| script.printAntCallTask(TARGET_GATHER_BIN_PARTS, true, null); |
| |
| if (embeddedSource) |
| script.printAntCallTask(TARGET_GATHER_SOURCES, true, null); |
| |
| printCustomAssemblyAntCall(PROPERTY_POST + TARGET_GATHER_BIN_PARTS, null); |
| script.println(); |
| } |
| |
| protected void generateP2Assembling() { |
| if (productFile != null) { |
| script.printAntCallTask(TARGET_RUN_DIRECTOR, true, null); |
| script.printAntCallTask(TARGET_MIRROR_PRODUCT, true, null); |
| } else { |
| script.printAntCallTask(TARGET_MIRROR_ARCHIVE, true, null); |
| } |
| } |
| |
| protected void generateMirrorProductTask() { |
| Map<String, String> mirrorArgs = new HashMap<>(); |
| mirrorArgs.put(PROPERTY_P2_MIRROR_METADATA_DEST, Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO)); |
| mirrorArgs.put(PROPERTY_P2_MIRROR_ARTIFACT_DEST, Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO)); |
| |
| script.printTargetDeclaration(TARGET_MIRROR_PRODUCT, null, PROPERTY_P2_METADATA_REPO, PROPERTY_SKIP_MIRRORING, null); |
| script.printAntCallTask(TARGET_MIRROR_ARCHIVE, true, mirrorArgs); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| protected void generateMirrorTask(boolean assembling) { |
| script.printTargetDeclaration(TARGET_MIRROR_ARCHIVE, null, null, PROPERTY_SKIP_MIRRORING, null); |
| script.printProperty(PROPERTY_P2_APPEND, "true"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_P2_MIRROR_METADATA_DEST, "file:" + Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE)); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_P2_MIRROR_ARTIFACT_DEST, "file:" + Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE)); //$NON-NLS-1$ |
| if (features.length + plugins.length + rootFileProviders.size() > 0 || productFile != null) { |
| script.printTab(); |
| script.print("<p2.mirror "); //$NON-NLS-1$ |
| script.printAttribute("source", Utils.getPropertyFormat(PROPERTY_P2_BUILD_REPO), true); //$NON-NLS-1$ |
| script.printAttribute("mirrorProperties", TRUE, true); //$NON-NLS-1$ |
| script.println(">"); //$NON-NLS-1$ |
| script.printTab(); |
| script.print("\t<destination "); //$NON-NLS-1$ |
| script.printAttribute("location", Utils.getPropertyFormat(PROPERTY_P2_MIRROR_METADATA_DEST), true); //$NON-NLS-1$ |
| script.printAttribute("name", Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("compressed", Utils.getPropertyFormat(PROPERTY_P2_COMPRESS), true); //$NON-NLS-1$ |
| script.printAttribute("append", assembling ? Utils.getPropertyFormat(PROPERTY_P2_APPEND) : TRUE, true); //$NON-NLS-1$ |
| script.printAttribute("kind", "metadata", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("/>"); //$NON-NLS-1$ |
| script.printTab(); |
| script.print("\t<destination "); //$NON-NLS-1$ |
| script.printAttribute("location", Utils.getPropertyFormat(PROPERTY_P2_MIRROR_ARTIFACT_DEST), true); //$NON-NLS-1$ |
| script.printAttribute("name", Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("compressed", Utils.getPropertyFormat(PROPERTY_P2_COMPRESS), true); //$NON-NLS-1$ |
| script.printAttribute("append", assembling ? Utils.getPropertyFormat(PROPERTY_P2_APPEND) : TRUE, true); //$NON-NLS-1$ |
| script.printAttribute("kind", "artifact", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("/>"); //$NON-NLS-1$ |
| script.printTab(); |
| |
| for (int i = 0; i < plugins.length; i++) { |
| BundleDescription plugin = plugins[i]; |
| script.printTab(); |
| script.print("\t<iu "); //$NON-NLS-1$ |
| script.printAttribute(ID, plugin.getSymbolicName(), true); |
| script.printAttribute(VERSION, plugin.getVersion().toString(), true); |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| |
| for (int i = 0; i < features.length; i++) { |
| BuildTimeFeature feature = features[i]; |
| script.printTab(); |
| script.print("\t<iu"); //$NON-NLS-1$ |
| script.printAttribute(ID, getFeatureGroupId(feature), true); |
| script.printAttribute(VERSION, feature.getVersion(), true); |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| |
| for (Iterator<BuildTimeFeature> iterator = rootFileProviders.iterator(); iterator.hasNext();) { |
| BuildTimeFeature rootProvider = iterator.next(); |
| if (!(havePDEUIState() && rootProvider.getId().equals("org.eclipse.pde.container.feature"))) { //$NON-NLS-1$ |
| script.printTab(); |
| script.print("\t<iu"); //$NON-NLS-1$ |
| script.printAttribute(ID, getFeatureGroupId(rootProvider), true); |
| script.printAttribute(VERSION, rootProvider.getVersion(), true); |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| } |
| if (productFile != null) { |
| script.printTab(); |
| script.print("\t<iu"); //$NON-NLS-1$ |
| script.printAttribute(ID, productFile.getId(), true); |
| script.printAttribute(VERSION, getReplacedProductVersion(), true); |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| //categories |
| script.printTab(); |
| script.println("<iu query=\"property[@name='org.eclipse.equinox.p2.type.category']\" required=\"false\" />"); //$NON-NLS-1$ |
| script.println("</p2.mirror>"); //$NON-NLS-1$ |
| } |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| protected String getFeatureGroupId(BuildTimeFeature feature) { |
| if (!feature.isBinary()) { |
| Properties properties = getFeatureBuildProperties(feature); |
| if (properties.containsKey(PROPERTY_P2_GROUP_ID)) |
| return properties.getProperty(PROPERTY_P2_GROUP_ID); |
| } |
| return feature.getId() + ".feature.group"; //$NON-NLS-1$ |
| } |
| |
| protected String getReplacedProductVersion() { |
| String productVersion = productFile.getVersion(); |
| if (productVersion.endsWith(PROPERTY_QUALIFIER)) { |
| Version version = new Version(productVersion); |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append(version.getMajor()); |
| buffer.append('.'); |
| buffer.append(version.getMinor()); |
| buffer.append('.'); |
| buffer.append(version.getMicro()); |
| buffer.append('.'); |
| buffer.append(Utils.getPropertyFormat(PROPERTY_P2_PRODUCT_QUALIFIER)); |
| |
| productVersion = buffer.toString(); |
| } |
| return productVersion; |
| } |
| |
| protected void generateDirectorTarget(boolean assembling) { |
| if (assembling) { |
| script.printTargetDeclaration(TARGET_RUN_DIRECTOR_CONDITION, null, null, null, null); |
| script.printTab(); |
| script.print("<condition"); //$NON-NLS-1$ |
| script.printAttribute("property", TARGET_RUN_DIRECTOR_CONDITION, true); //$NON-NLS-1$ |
| script.printAttribute("value", TRUE, true); //$NON-NLS-1$ |
| script.println(">"); //$NON-NLS-1$ |
| script.println("\t<or>"); //$NON-NLS-1$ |
| script.println("\t\t<isset property=\"" + PROPERTY_RUN_PACKAGER + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("\t\t<isset property=\"" + PROPERTY_SKIP_DIRECTOR + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("\t</or>"); //$NON-NLS-1$ |
| script.printEndTag("condition"); //$NON-NLS-1$ |
| script.printTargetEnd(); |
| } |
| |
| script.printTargetDeclaration(TARGET_RUN_DIRECTOR, assembling ? TARGET_RUN_DIRECTOR_CONDITION : null, null, assembling ? TARGET_RUN_DIRECTOR_CONDITION : PROPERTY_SKIP_DIRECTOR, null); |
| Map<String, String> parameters = new HashMap<>(); |
| parameters.put(PROPERTY_OS, Utils.getPropertyFormat(PROPERTY_OS)); |
| parameters.put(PROPERTY_WS, Utils.getPropertyFormat(PROPERTY_WS)); |
| parameters.put(PROPERTY_ARCH, Utils.getPropertyFormat(PROPERTY_ARCH)); |
| parameters.put(PROPERTY_P2_REPO, Utils.getPropertyFormat(PROPERTY_P2_BUILD_REPO)); |
| parameters.put(PROPERTY_P2_DIRECTOR_IU, productFile != null ? productFile.getId() : Utils.getPropertyFormat(PROPERTY_P2_ROOT_NAME)); |
| parameters.put(PROPERTY_P2_DIRECTOR_VERSION, productFile != null ? getReplacedProductVersion() : Utils.getPropertyFormat(PROPERTY_P2_ROOT_VERSION)); |
| parameters.put(PROPERTY_P2_DIRECTOR_INSTALLPATH, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE)); |
| script.printAntTask(Utils.getPropertyFormat(PROPERTY_GENERIC_TARGETS), null, TARGET_RUN_DIRECTOR, null, TRUE, parameters); |
| script.println(); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| private void generateProcessingCalls() { |
| script.printAntCallTask(TARGET_JAR_PROCESSING, true, null); |
| script.println(); |
| } |
| |
| private void generateArchivingCalls() { |
| script.printAntCallTask(TARGET_ASSEMBLE_ARCHIVE, true, null); |
| } |
| |
| protected void generateMainBegin() { |
| script.printTargetDeclaration(TARGET_MAIN, null, null, null, null); |
| } |
| |
| protected void generateMainEnd() { |
| script.printAntCallTask(TARGET_CLEANUP_ASSEMBLY, true, null); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| protected void generateCleanupAssembly(boolean assembling) { |
| String condition = (assembling && BuildDirector.p2Gathering) ? PROPERTY_RUN_PACKAGER : null; |
| script.printTargetDeclaration(TARGET_CLEANUP_ASSEMBLY, null, null, condition, null); |
| if (!FORMAT_FOLDER.equalsIgnoreCase(archiveFormat)) |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP), null, null); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| /** |
| * |
| */ |
| protected void generateBrandingCalls() { |
| script.printBrandTask(rootFolder, computeIconsList(), Utils.getPropertyFormat(PROPERTY_LAUNCHER_NAME), Utils.getPropertyFormat(PROPERTY_OS)); |
| } |
| |
| private void generateP2Steps() { |
| if (!haveP2Bundles()) |
| return; |
| if (rootFileProviders.size() == 0 && features.length == 0 && plugins.length == 0) |
| return; |
| script.printAntCallTask(TARGET_P2_METADATA, true, null); |
| script.println(); |
| } |
| |
| protected void generateArchivingTarget(boolean assembling) { |
| boolean condition = assembling && BuildDirector.p2Gathering; |
| if (condition) { |
| script.printTargetDeclaration(TARGET_ASSEMBLE_ARCHIVE_CONDITION, null, null, null, null); |
| script.printTab(); |
| script.print("<condition"); //$NON-NLS-1$ |
| script.printAttribute("property", TARGET_ASSEMBLE_ARCHIVE_CONDITION, true); //$NON-NLS-1$ |
| script.printAttribute("value", TRUE, true); //$NON-NLS-1$ |
| script.println(">"); //$NON-NLS-1$ |
| script.println("\t<or>"); //$NON-NLS-1$ |
| script.println("\t\t<isset property=\"" + PROPERTY_RUN_PACKAGER + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (productFile != null) |
| script.println("\t\t<isset property=\"" + PROPERTY_SKIP_DIRECTOR + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| else |
| script.println("\t\t<isset property=\"" + PROPERTY_SKIP_MIRRORING + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("\t</or>"); //$NON-NLS-1$ |
| script.printEndTag("condition"); //$NON-NLS-1$ |
| script.printTargetEnd(); |
| } |
| |
| // Only run the archive target if there is something there to archive. |
| // if not p2Gathering, no conditions, |
| // else, if assembling condition is (runPackager || skipDirector), if packaging condition is skipDirector |
| String assemblyCondition = BuildDirector.p2Gathering ? TARGET_ASSEMBLE_ARCHIVE_CONDITION : null; |
| String packageCondition = BuildDirector.p2Gathering ? (productFile != null ? PROPERTY_SKIP_DIRECTOR : PROPERTY_SKIP_MIRRORING) : null; |
| script.printTargetDeclaration(TARGET_ASSEMBLE_ARCHIVE, condition ? TARGET_ASSEMBLE_ARCHIVE_CONDITION : null, null, assembling ? assemblyCondition : packageCondition, null); |
| Map<String, String> properties = new HashMap<>(); |
| properties.put(PROPERTY_ROOT_FOLDER, rootFolder); |
| printCustomAssemblyAntCall(PROPERTY_PRE + "archive", properties); //$NON-NLS-1$ |
| |
| if (FORMAT_FOLDER.equalsIgnoreCase(archiveFormat)) { |
| generateMoveRootFiles(); |
| } else if (FORMAT_ZIP.equalsIgnoreCase(archiveFormat)) { |
| generateZipTarget(); |
| } else if (FORMAT_ANTZIP.equalsIgnoreCase(archiveFormat)) { |
| generateAntZipTarget(); |
| } else if (FORMAT_ANTTAR.equalsIgnoreCase(archiveFormat)) { |
| generateAntTarTarget(); |
| } else if (FORMAT_TAR.equalsIgnoreCase(archiveFormat)) { |
| generateTarGZTasks(true); |
| } |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| private void generateMoveRootFiles() { |
| if (rootFileProviders.size() == 0 || BuildDirector.p2Gathering) |
| return; |
| |
| for (Iterator<BuildTimeFeature> iter = rootFileProviders.iterator(); iter.hasNext();) { |
| Properties featureProperties = getFeatureBuildProperties(iter.next()); |
| Utils.generatePermissions(featureProperties, configInfo, PROPERTY_ECLIPSE_BASE, script); |
| } |
| |
| if (Platform.getOS().equals("win32")) { //$NON-NLS-1$ |
| FileSet[] rootFiles = new FileSet[1]; |
| rootFiles[0] = new FileSet(rootFolder, null, "**/**", null, null, null, null); //$NON-NLS-1$ |
| script.printMoveTask(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), rootFiles, false); |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING), null, null); //$NON-NLS-1$ |
| } else { |
| List<String> params = new ArrayList<>(3); |
| params.add("-R"); //$NON-NLS-1$ |
| params.add("."); //$NON-NLS-1$ |
| params.add('\'' + Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '\''); |
| String rootFileFolder = Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING); //$NON-NLS-1$ |
| script.printExecTask("cp", rootFileFolder + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER), params, null); //$NON-NLS-1$ |
| script.printDeleteTask(rootFileFolder, null, null); |
| } |
| } |
| |
| protected Properties getFeatureBuildProperties(BuildTimeFeature feature) { |
| if (feature.isBinary()) |
| return null; |
| try { |
| return AbstractScriptGenerator.readProperties(new Path(feature.getRootLocation()).toOSString(), PROPERTIES_FILE, IStatus.OK); |
| } catch (CoreException e) { |
| return null; |
| } |
| |
| } |
| |
| protected void generateGatherSourceTarget() { |
| script.printTargetDeclaration(TARGET_GATHER_SOURCES, null, null, null, null); |
| Map<String, String> properties = new HashMap<>(1); |
| properties.put(PROPERTY_DESTINATION_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS)); |
| |
| for (int i = 0; i < plugins.length; i++) { |
| BundleDescription plugin = plugins[i]; |
| String placeToGather = getLocation(plugin); |
| |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, Utils.makeRelative(new Path(placeToGather), new Path(workingDirectory)).toOSString(), TARGET_GATHER_SOURCES, null, null, properties); |
| |
| Properties bundleProperties = (Properties) plugin.getUserObject(); |
| //Source code for plugins with . on the classpath must be put in a folder in the final jar. |
| if (bundleProperties.get(WITH_DOT) == Boolean.TRUE) { |
| String targetLocation = Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS) + '/' + ModelBuildScriptGenerator.getNormalizedName(plugin); |
| String targetLocationSrc = targetLocation + "/src"; //$NON-NLS-1$ |
| |
| //Find the source zip where it has been gathered and extract it in a folder |
| script.println("<unzip dest=\"" + AntScript.getEscaped(targetLocationSrc) + "\">"); //$NON-NLS-1$//$NON-NLS-2$ |
| script.println("\t<fileset dir=\"" + AntScript.getEscaped(targetLocation) + "\" includes=\"**/*src.zip\" casesensitive=\"false\"/>"); //$NON-NLS-1$//$NON-NLS-2$ |
| script.println("</unzip>"); //$NON-NLS-1$ |
| |
| // Delete the source zip where it has been gathered since we extracted it |
| script.printDeleteTask(null, null, new FileSet[] {new FileSet(targetLocation, null, "**/*src.zip", null, null, null, "false")}); //$NON-NLS-1$ //$NON-NLS-2$//$NON-bNLS-3$ |
| } |
| } |
| |
| properties = new HashMap<>(1); |
| properties.put(PROPERTY_FEATURE_BASE, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE)); |
| for (int i = 0; i < features.length; i++) { |
| BuildTimeFeature feature = features[i]; |
| String placeToGather = feature.getRootLocation(); |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, Utils.makeRelative(new Path(placeToGather), new Path(workingDirectory)).toOSString(), TARGET_GATHER_SOURCES, null, null, properties); |
| } |
| |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| protected void generatePackagingTargets() { |
| String fileName = Utils.getPropertyFormat(PROPERTY_SOURCE) + '/' + Utils.getPropertyFormat(PROPERTY_ELEMENT_NAME); |
| String fileExists = Utils.getPropertyFormat(PROPERTY_SOURCE) + '/' + Utils.getPropertyFormat(PROPERTY_ELEMENT_NAME) + "_exists"; //$NON-NLS-1$ |
| |
| script.printComment("Beginning of the jarUp task"); //$NON-NLS-1$ |
| script.printTargetDeclaration(TARGET_JARUP, null, null, null, Messages.assemble_jarUp); |
| script.printAvailableTask(fileExists, fileName); |
| Map<String, String> params = new HashMap<>(2); |
| params.put(PROPERTY_SOURCE, Utils.getPropertyFormat(PROPERTY_SOURCE)); |
| params.put(PROPERTY_ELEMENT_NAME, Utils.getPropertyFormat(PROPERTY_ELEMENT_NAME)); |
| script.printAvailableTask(PROPERTY_JARING_MANIFEST, fileName + '/' + JarFile.MANIFEST_NAME); |
| script.printConditionIsSet(PROPERTY_JARING_TASK, TARGET_JARING, PROPERTY_JARING_MANIFEST, TARGET_JARING + "_NoManifest"); //$NON-NLS-1$ |
| script.printAntCallTask(Utils.getPropertyFormat(PROPERTY_JARING_TASK), true, params); |
| script.printTargetEnd(); |
| script.println(); |
| |
| script.printTargetDeclaration(TARGET_JARING, null, fileExists, null, null); |
| script.printJarTask(fileName + ".jar", fileName, fileName + '/' + JarFile.MANIFEST_NAME, "skip"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printDeleteTask(fileName, null, null); |
| script.printTargetEnd(); |
| script.println(); |
| |
| script.printTargetDeclaration(TARGET_JARING + "_NoManifest", null, fileExists, null, null); //$NON-NLS-1$ |
| script.printJarTask(fileName + ".jar", fileName, null, "merge"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printDeleteTask(fileName, null, null); |
| script.printTargetEnd(); |
| script.printComment("End of the jarUp task"); //$NON-NLS-1$ |
| script.println(); |
| |
| script.printComment("Beginning of the jar signing target"); //$NON-NLS-1$ |
| script.printTargetDeclaration(TARGET_JARSIGNING, null, null, null, Messages.sign_Jar); |
| printCustomAssemblyAntCall(PROPERTY_PRE + TARGET_JARSIGNING, null); |
| if (generateJnlp) |
| script.printProperty(PROPERTY_UNSIGN, "true"); //$NON-NLS-1$ |
| script.println("<eclipse.jarProcessor sign=\"" + Utils.getPropertyFormat(PROPERTY_SIGN) + "\" pack=\"" + Utils.getPropertyFormat(PROPERTY_PACK) + "\" unsign=\"" + Utils.getPropertyFormat(PROPERTY_UNSIGN) + "\" jar=\"" + fileName + ".jar" + "\" alias=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_ALIAS) + "\" keystore=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_KEYSTORE) + "\" storepass=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_STOREPASS) + "\" keypass=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_KEYPASS) + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ |
| script.printTargetEnd(); |
| script.printComment("End of the jarUp task"); //$NON-NLS-1$ |
| script.println(); |
| } |
| |
| protected void generateGZipTarget(boolean assembling) { |
| //during the assemble stage, only zip if we aren't running the packager |
| script.printTargetDeclaration(TARGET_GZIP_RESULTS, null, null, assembling ? PROPERTY_RUN_PACKAGER : null, null); |
| script.println("<move file=\"" //$NON-NLS-1$ |
| + Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH) + "\" tofile=\"" //$NON-NLS-1$ |
| + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER) + "/tmp.tar\"/>"); //$NON-NLS-1$ |
| script.printGZip(Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER) + "/tmp.tar", //$NON-NLS-1$ |
| Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH)); |
| script.printTargetEnd(); |
| } |
| |
| protected void generatePrologue() { |
| script.printProjectDeclaration("Assemble " + featureId, TARGET_MAIN, null); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_ARCHIVE_NAME, computeArchiveName()); |
| script.printProperty(PROPERTY_OS, configInfo.getOs()); |
| script.printProperty(PROPERTY_WS, configInfo.getWs()); |
| script.printProperty(PROPERTY_ARCH, configInfo.getArch()); |
| script.printProperty(PROPERTY_SIGN, (signJars ? Boolean.TRUE : Boolean.FALSE).toString()); |
| script.printProperty(PROPERTY_ASSEMBLY_TMP, Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + "/tmp"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_ECLIPSE_BASE, Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER)); |
| script.printProperty(PROPERTY_ECLIPSE_PLUGINS, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_PLUGIN_LOCATION); |
| script.printProperty(PROPERTY_ECLIPSE_FEATURES, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_FEATURE_LOCATION); |
| script.printProperty(PROPERTY_ARCHIVE_FULLPATH, Utils.getPropertyFormat(PROPERTY_BASEDIR) + '/' + Utils.getPropertyFormat(PROPERTY_BUILD_LABEL) + '/' + Utils.getPropertyFormat(PROPERTY_ARCHIVE_NAME)); |
| printLauncherJarProperty(); |
| script.printProperty(PROPERTY_P2_BUILD_REPO, "file:" + Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + "/buildRepo"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printProperty(PROPERTY_GENERIC_TARGETS, Utils.getPropertyFormat("eclipse.pdebuild.scripts") + '/' + "/genericTargets.xml"); //$NON-NLS-1$//$NON-NLS-2$ |
| script.printAvailableTask(PROPERTY_CUSTOM_ASSEMBLY, "${builder}/customAssembly.xml", "${builder}/customAssembly.xml"); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (productQualifier != null) |
| script.printProperty(PROPERTY_P2_PRODUCT_QUALIFIER, productQualifier); |
| |
| if (productFile != null && productFile.getLauncherName() != null) |
| script.printProperty(PROPERTY_LAUNCHER_NAME, productFile.getLauncherName()); |
| script.printProperty(PROPERTY_TAR_ARGS, ""); //$NON-NLS-1$ |
| script.println(); |
| |
| generateCustomGatherMacro(); |
| generatePackagingTargets(); |
| } |
| |
| protected void printLauncherJarProperty() { |
| Bundle launcherBundle = Platform.getBundle(BUNDLE_EQUINOX_LAUNCHER); |
| try { |
| File bundleFile = FileLocator.getBundleFile(launcherBundle); |
| script.printProperty(PROPERTY_LAUNCHER_JAR, bundleFile.getAbsolutePath()); |
| } catch (IOException e) { |
| // what can we do with this? |
| } |
| } |
| |
| protected void generateCustomGatherMacro() { |
| List<String> attributes = new ArrayList<>(5); |
| attributes.add("dir"); //$NON-NLS-1$ |
| attributes.add("propertyName"); //$NON-NLS-1$ |
| attributes.add("propertyValue"); //$NON-NLS-1$ |
| attributes.add("subFolder"); //$NON-NLS-1$ |
| attributes.add(PROPERTY_PROJECT_NAME); |
| script.printMacroDef(PROPERTY_CUSTOM_GATHER, attributes); |
| |
| Map<String, String> params = new HashMap<>(); |
| params.put("@{propertyName}", "@{propertyValue}"); //$NON-NLS-1$//$NON-NLS-2$ |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, "@{dir}", TARGET_GATHER_BIN_PARTS, null, null, params); //$NON-NLS-1$ |
| |
| params.put(PROPERTY_PROJECT_LOCATION, "${basedir}/@{dir}"); //$NON-NLS-1$ |
| params.put(PROPERTY_PROJECT_NAME, "@{projectName}"); //$NON-NLS-1$ |
| params.put(PROPERTY_TARGET_FOLDER, "@{propertyValue}@{subFolder}"); //$NON-NLS-1$ |
| printCustomAssemblyAntCall(TARGET_GATHER_BIN_PARTS, params); |
| |
| script.printEndMacroDef(); |
| script.println(); |
| } |
| |
| protected void printCustomGatherCall(String fullName, String dir, String propertyName, String propertyValue, String subFolder) { |
| script.println("<" + PROPERTY_CUSTOM_GATHER + " dir=\"" + dir + "\" projectName=\"" + fullName + "\" propertyName=\"" + propertyName + "\" propertyValue=\"" + propertyValue + "\" subFolder=\"" + (subFolder != null ? subFolder : "") + "\" />"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ |
| } |
| |
| private void generateInitializationSteps() { |
| if (BundleHelper.getDefault().isDebugging()) { |
| script.printEchoTask("basedir : " + Utils.getPropertyFormat(PROPERTY_BASEDIR)); //$NON-NLS-1$ |
| script.printEchoTask("assemblyTempDir : " + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP)); //$NON-NLS-1$ |
| script.printEchoTask("eclipse.base : " + Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE)); //$NON-NLS-1$ |
| script.printEchoTask("collectingFolder : " + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER)); //$NON-NLS-1$ |
| script.printEchoTask("archivePrefix : " + Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX)); //$NON-NLS-1$ |
| } |
| |
| script.println("<condition property=\"" + PROPERTY_PLUGIN_ARCHIVE_PREFIX + "\" value=\"" + DEFAULT_PLUGIN_LOCATION + "\">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| script.println("\t<equals arg1=\"" + Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + "\" arg2=\"\" trim=\"true\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("</condition>"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_PLUGIN_ARCHIVE_PREFIX, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + '/' + DEFAULT_PLUGIN_LOCATION); |
| |
| script.println(); |
| script.println("<condition property=\"" + PROPERTY_FEATURE_ARCHIVE_PREFIX + "\" value=\"" + DEFAULT_FEATURE_LOCATION + "\">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| script.println("\t<equals arg1=\"" + Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + "\" arg2=\"\" trim=\"true\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("</condition>"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_FEATURE_ARCHIVE_PREFIX, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + '/' + DEFAULT_FEATURE_LOCATION); |
| |
| script.println(); |
| |
| script.printDirName(PROPERTY_ARCHIVE_PARENT, Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH)); |
| script.printMkdirTask(Utils.getPropertyFormat(PROPERTY_ARCHIVE_PARENT)); |
| script.printMkdirTask(Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP)); |
| script.printMkdirTask(Utils.getPropertyFormat(PROPERTY_BUILD_LABEL)); |
| script.println(); |
| } |
| |
| protected void generatePostProcessingTarget() { |
| script.printTargetDeclaration(TARGET_JAR_PROCESSING, null, null, null, null); |
| for (int i = 0; i < plugins.length; i++) { |
| BundleDescription plugin = plugins[i]; |
| generatePostProcessingSteps(plugin.getSymbolicName(), plugin.getVersion().toString(), (String) shapeAdvisor.getFinalShape(plugin)[1], BUNDLE_TYPE); |
| } |
| |
| for (int i = 0; i < features.length; i++) { |
| BuildTimeFeature feature = features[i]; |
| generatePostProcessingSteps(feature.getId(), feature.getVersion(), (String) shapeAdvisor.getFinalShape(feature)[1], FEATURE_TYPE); |
| } |
| printCustomAssemblyAntCall(PROPERTY_POST + TARGET_JARUP, null); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| protected void generateGatherBinPartsTarget() { |
| script.printTargetDeclaration(TARGET_GATHER_BIN_PARTS, null, null, null, null); |
| for (int i = 0; i < plugins.length; i++) { |
| BundleDescription plugin = plugins[i]; |
| String placeToGather = getLocation(plugin); |
| printCustomGatherCall(ModelBuildScriptGenerator.getNormalizedName(plugin), Utils.makeRelative(new Path(placeToGather), new Path(workingDirectory)).toOSString(), PROPERTY_DESTINATION_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS), null); |
| } |
| |
| Set<BuildTimeFeature> featureSet = new HashSet<>(); |
| for (int i = 0; i < features.length; i++) { |
| BuildTimeFeature feature = features[i]; |
| String placeToGather = feature.getRootLocation(); |
| String featureFullName = feature.getId() + "_" + feature.getVersion(); //$NON-NLS-1$ |
| printCustomGatherCall(featureFullName, Utils.makeRelative(new Path(placeToGather), new Path(workingDirectory)).toOSString(), PROPERTY_FEATURE_BASE, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), '/' + DEFAULT_FEATURE_LOCATION); |
| featureSet.add(feature); |
| } |
| |
| //This will generate gather.bin.parts call to features that provides files for the root |
| for (Iterator<BuildTimeFeature> iter = rootFileProviders.iterator(); iter.hasNext();) { |
| BuildTimeFeature feature = iter.next(); |
| if (featureSet.contains(feature)) |
| continue; |
| String placeToGather = feature.getRootLocation(); |
| String featureFullName = feature.getId() + "_" + feature.getVersion(); //$NON-NLS-1$ |
| printCustomGatherCall(featureFullName, Utils.makeRelative(new Path(placeToGather), new Path(workingDirectory)).toOSString(), PROPERTY_FEATURE_BASE, Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), '/' + DEFAULT_FEATURE_LOCATION); |
| } |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| private void generateSignJarCall(String name, String version, byte type) { |
| if (!signJars) |
| return; |
| Map<String, String> properties = new HashMap<>(2); |
| properties.put(PROPERTY_SOURCE, type == BUNDLE_TYPE ? Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS) : Utils.getPropertyFormat(PROPERTY_ECLIPSE_FEATURES)); |
| properties.put(PROPERTY_ELEMENT_NAME, name + '_' + version); |
| script.printAntCallTask(TARGET_JARSIGNING, true, properties); |
| } |
| |
| //generate the appropriate postProcessingCall |
| private void generatePostProcessingSteps(String name, String version, String style, byte type) { |
| if (ShapeAdvisor.FOLDER.equalsIgnoreCase(style)) |
| return; |
| if (ShapeAdvisor.FILE.equalsIgnoreCase(style)) { |
| generateJarUpCall(name, version, type); |
| generateSignJarCall(name, version, type); |
| generateJNLPCall(name, version, type); |
| return; |
| } |
| } |
| |
| private void generateJNLPCall(String name, String version, byte type) { |
| if (generateJnlp == false) |
| return; |
| if (type != FEATURE_TYPE) |
| return; |
| |
| String dir = type == BUNDLE_TYPE ? Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS) : Utils.getPropertyFormat(PROPERTY_ECLIPSE_FEATURES); |
| String location = dir + '/' + name + '_' + version + ".jar"; //$NON-NLS-1$ |
| script.println("<eclipse.jnlpGenerator feature=\"" + AntScript.getEscaped(location) + "\" codebase=\"" + Utils.getPropertyFormat(PROPERTY_JNLP_CODEBASE) + "\" j2se=\"" + Utils.getPropertyFormat(PROPERTY_JNLP_J2SE) + "\" locale=\"" + Utils.getPropertyFormat(PROPERTY_JNLP_LOCALE) + "\" generateOfflineAllowed=\"" + Utils.getPropertyFormat(PROPERTY_JNLP_GENOFFLINE) + "\" configInfo=\"" + Utils.getPropertyFormat(PROPERTY_JNLP_CONFIGS) + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ |
| } |
| |
| private void generateJarUpCall(String name, String version, byte type) { |
| Map<String, String> properties = new HashMap<>(2); |
| properties.put(PROPERTY_SOURCE, type == BUNDLE_TYPE ? Utils.getPropertyFormat(PROPERTY_ECLIPSE_PLUGINS) : Utils.getPropertyFormat(PROPERTY_ECLIPSE_FEATURES)); |
| properties.put(PROPERTY_ELEMENT_NAME, name + '_' + version); |
| script.printAntCallTask(TARGET_JARUP, true, properties); |
| } |
| |
| private void generateEpilogue() { |
| generateGatherBinPartsTarget(); |
| if (embeddedSource) |
| generateGatherSourceTarget(); |
| generatePostProcessingTarget(); |
| generateArchivingTarget(true); |
| generateCleanupAssembly(true); |
| if (FORMAT_TAR.equalsIgnoreCase(archiveFormat)) |
| generateGZipTarget(true); |
| |
| generateCustomAssemblyTarget(); |
| generateMetadataTarget(); |
| generateDirectorTarget(true); |
| if (BuildDirector.p2Gathering) { |
| generateMirrorTask(true); |
| generateMirrorProductTask(); |
| } |
| |
| script.printProjectEnd(); |
| script.close(); |
| script = null; |
| } |
| |
| public String getTargetName() { |
| String config = getTargetConfig(); |
| return DEFAULT_ASSEMBLE_NAME + '.' + getTargetElement() + (config.length() > 0 ? "." : "") + config; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public String getTargetConfig() { |
| return (configInfo.equals(Config.genericConfig()) ? "" : configInfo.toStringReplacingAny(".", ANY_STRING)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public String getTargetElement() { |
| return (featureId.equals("") ? "" : featureId); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| protected void printCustomAssemblyAntCall(String customTarget, Map<String, String> properties) { |
| Map<String, String> params = (properties != null) ? new HashMap<>(properties) : new HashMap<>(1); |
| params.put(PROPERTY_CUSTOM_TARGET, customTarget); |
| script.printAntCallTask(TARGET_CUSTOM_ASSEMBLY, true, params); |
| } |
| |
| protected void generateCustomAssemblyTarget() { |
| script.printTargetDeclaration(TARGET_CUSTOM_ASSEMBLY, null, PROPERTY_CUSTOM_ASSEMBLY, null, null); |
| script.printAntTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_ASSEMBLY), null, Utils.getPropertyFormat(PROPERTY_CUSTOM_TARGET), null, TRUE, null); |
| script.printTargetEnd(); |
| script.println(); |
| } |
| |
| private void generateMetadataTarget() { |
| if (haveP2Bundles()) { |
| script.printTargetDeclaration(TARGET_P2_METADATA, null, TARGET_P2_METADATA, null, null); |
| script.printProperty(PROPERTY_P2_APPEND, "true"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_P2_COMPRESS, "false"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_P2_METADATA_REPO_NAME, ""); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_P2_ARTIFACT_REPO_NAME, ""); //$NON-NLS-1$ |
| |
| if (havePDEUIState()) { |
| //during feature export we need to override the "mode" |
| printP2GenerationModeCondition(); |
| } |
| if (!BuildDirector.p2Gathering) { |
| script.printTab(); |
| script.print("<p2.generator "); //$NON-NLS-1$ |
| script.printAttribute("source", Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), true); //$NON-NLS-1$ |
| script.printAttribute("append", Utils.getPropertyFormat(PROPERTY_P2_APPEND), true); //$NON-NLS-1$ |
| script.printAttribute("flavor", Utils.getPropertyFormat(PROPERTY_P2_FLAVOR), true); //$NON-NLS-1$ |
| script.printAttribute("compress", Utils.getPropertyFormat(PROPERTY_P2_COMPRESS), true); //$NON-NLS-1$ |
| script.printAttribute("metadataRepository", Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO), true); //$NON-NLS-1$ |
| script.printAttribute("artifactRepository", Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO), true); //$NON-NLS-1$ |
| script.printAttribute("metadataRepositoryName", Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("artifactRepositoryName", Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("publishArtifacts", Utils.getPropertyFormat(PROPERTY_P2_PUBLISH_ARTIFACTS), true); //$NON-NLS-1$ |
| script.printAttribute("site", Utils.getPropertyFormat(PROPERTY_P2_CATEGORY_SITE), true); //$NON-NLS-1$ |
| script.printAttribute("siteVersion", Utils.getPropertyFormat(PROPERTY_P2_CATEGORY_VERSION), true); //$NON-NLS-1$ |
| script.printAttribute("p2OS", configInfo.getOs(), true); //$NON-NLS-1$ |
| if (!havePDEUIState() || rootFileProviders.size() > 0) |
| script.printAttribute("mode", "incremental", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| else |
| script.printAttribute("mode", Utils.getPropertyFormat(PROPERTY_P2_GENERATION_MODE), true); //$NON-NLS-1$ |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| if (rootFileProviders.size() > 0) { |
| if (productFile != null) { |
| script.println(); |
| File modFile = productFile.getLocation(); |
| String modLocation = Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + '/' + DEFAULT_FEATURE_LOCATION + '/' + CONTAINER_FEATURE + "/product/" + modFile.getName(); //$NON-NLS-1$ |
| script.printAvailableTask(PROPERTY_P2_PRODUCT_MOD, modLocation, modLocation); |
| script.printProperty(PROPERTY_P2_PRODUCT_MOD, productFile.getLocation().getPath()); |
| } |
| script.printTab(); |
| script.print("<p2.generator "); //$NON-NLS-1$ |
| script.printAttribute("config", rootFolder, true); //$NON-NLS-1$ |
| script.printAttribute("append", Utils.getPropertyFormat(PROPERTY_P2_APPEND), true); //$NON-NLS-1$ |
| script.printAttribute("flavor", Utils.getPropertyFormat(PROPERTY_P2_FLAVOR), true); //$NON-NLS-1$ |
| script.printAttribute("compress", Utils.getPropertyFormat(PROPERTY_P2_COMPRESS), true); //$NON-NLS-1$ |
| script.printAttribute("metadataRepository", Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO), true); //$NON-NLS-1$ |
| script.printAttribute("artifactRepository", Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO), true); //$NON-NLS-1$ |
| script.printAttribute("metadataRepositoryName", Utils.getPropertyFormat(PROPERTY_P2_METADATA_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("artifactRepositoryName", Utils.getPropertyFormat(PROPERTY_P2_ARTIFACT_REPO_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("launcherConfig", configInfo.toString(), true); //$NON-NLS-1$ |
| script.printAttribute("p2OS", configInfo.getOs(), true); //$NON-NLS-1$ |
| script.printAttribute("publishArtifacts", Utils.getPropertyFormat(PROPERTY_P2_PUBLISH_ARTIFACTS), true); //$NON-NLS-1$ |
| if (!havePDEUIState()) |
| script.printAttribute("mode", "incremental", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| else |
| script.printAttribute("mode", Utils.getPropertyFormat(PROPERTY_P2_GENERATION_MODE), true); //$NON-NLS-1$ |
| if (productFile != null) { |
| script.printAttribute("exe", rootFolder + '/' + Utils.getPropertyFormat(PROPERTY_LAUNCHER_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("productFile", Utils.getPropertyFormat(PROPERTY_P2_PRODUCT_MOD), true); //$NON-NLS-1$ |
| } else { |
| script.printAttribute("root", Utils.getPropertyFormat(PROPERTY_P2_ROOT_NAME), true); //$NON-NLS-1$ |
| script.printAttribute("rootVersion", Utils.getPropertyFormat(PROPERTY_P2_ROOT_VERSION), true); //$NON-NLS-1$ |
| } |
| script.println("/>"); //$NON-NLS-1$ |
| } |
| |
| script.printTargetEnd(); |
| script.println(); |
| } |
| } |
| |
| protected void printP2GenerationModeCondition() { |
| // "final" if not running packager and we are overriding, else "incremental" |
| script.print("<condition"); //$NON-NLS-1$ |
| script.printAttribute("property", PROPERTY_P2_GENERATION_MODE, true); //$NON-NLS-1$ |
| script.printAttribute("value", "final", true); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printAttribute("else", "incremental", false); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println(">"); //$NON-NLS-1$ |
| script.println("\t<and>"); //$NON-NLS-1$ |
| script.println("\t\t<not>"); //$NON-NLS-1$ |
| script.println("\t\t\t<isset property=\"runPackager\"/>"); //$NON-NLS-1$ |
| script.println("\t\t</not>"); //$NON-NLS-1$ |
| script.println("\t\t<isset property=\"" + PROPERTY_P2_FINAL_MODE_OVERRIDE + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.println("\t</and>"); //$NON-NLS-1$ |
| script.printEndTag("condition"); //$NON-NLS-1$ |
| } |
| |
| public boolean haveP2Bundles() { |
| if (p2Bundles != null) |
| return p2Bundles.booleanValue(); |
| |
| p2Bundles = Boolean.valueOf(loadP2Class()); |
| return p2Bundles.booleanValue(); |
| } |
| |
| private void generateZipTarget() { |
| final int parameterSize = 15; |
| List<String> parameters = new ArrayList<>(parameterSize + 1); |
| |
| if (BuildDirector.p2Gathering) { |
| parameters.add(Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX)); |
| createZipExecCommand(parameters); |
| return; |
| } |
| |
| for (int i = 0; i < plugins.length; i++) { |
| parameters.add(Utils.getPropertyFormat(PROPERTY_PLUGIN_ARCHIVE_PREFIX) + '/' + (String) shapeAdvisor.getFinalShape(plugins[i])[0]); |
| if (i % parameterSize == 0) { |
| createZipExecCommand(parameters); |
| parameters.clear(); |
| } |
| } |
| if (!parameters.isEmpty()) { |
| createZipExecCommand(parameters); |
| parameters.clear(); |
| } |
| |
| if (!parameters.isEmpty()) { |
| createZipExecCommand(parameters); |
| parameters.clear(); |
| } |
| |
| for (int i = 0; i < features.length; i++) { |
| parameters.add(Utils.getPropertyFormat(PROPERTY_FEATURE_ARCHIVE_PREFIX) + '/' + (String) shapeAdvisor.getFinalShape(features[i])[0]); |
| if (i % parameterSize == 0) { |
| createZipExecCommand(parameters); |
| parameters.clear(); |
| } |
| } |
| if (!parameters.isEmpty()) { |
| createZipExecCommand(parameters); |
| parameters.clear(); |
| } |
| |
| createZipRootFileCommand(); |
| } |
| |
| /** |
| * Zip the root files |
| */ |
| private void createZipRootFileCommand() { |
| if (rootFileProviders.size() == 0) |
| return; |
| |
| List<String> parameters = new ArrayList<>(1); |
| parameters.add("-r -q ${zipargs} '" + Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH) + "' . "); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printExecTask("zip", Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING), parameters, null); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| private void createZipExecCommand(List<String> parameters) { |
| parameters.add(0, "-r -q " + Utils.getPropertyFormat(PROPERTY_ZIP_ARGS) + " '" + Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH) + '\''); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printExecTask("zip", Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP), parameters, null); //$NON-NLS-1$ |
| } |
| |
| protected String computeArchiveName() { |
| String extension = (FORMAT_TAR.equalsIgnoreCase(archiveFormat) || FORMAT_ANTTAR.equalsIgnoreCase(archiveFormat)) ? ".tar.gz" : ".zip"; //$NON-NLS-1$ //$NON-NLS-2$ |
| return featureId + "-" + Utils.getPropertyFormat(PROPERTY_BUILD_ID_PARAM) + (configInfo.equals(Config.genericConfig()) ? "" : ("-" + configInfo.toStringReplacingAny(".", ANY_STRING))) + extension; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| |
| public void generateTarGZTasks(boolean assembling) { |
| //This task only supports creation of archive with eclipse at the root |
| //Need to do the copy using cp because of the link |
| List<String> parameters = new ArrayList<>(2); |
| if (rootFileProviders.size() > 0) { |
| parameters.add("-r '" + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER) + "' '" + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '\''); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| script.printExecTask("cp", Utils.getPropertyFormat(PROPERTY_BASEDIR), parameters, null); //$NON-NLS-1$ |
| |
| parameters.clear(); |
| parameters.add("-rf '" + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '/' + Utils.getPropertyFormat(PROPERTY_COLLECTING_FOLDER) + '/' + configInfo.toStringReplacingAny(".", ANY_STRING) + '\''); //$NON-NLS-1$ //$NON-NLS-2$ |
| script.printExecTask("rm", Utils.getPropertyFormat(PROPERTY_BASEDIR), parameters, null); //$NON-NLS-1$ |
| } |
| parameters.clear(); |
| String tarArgs = assembling ? "-cvf '" : "-rvf '"; //$NON-NLS-1$//$NON-NLS-2$ |
| parameters.add(Utils.getPropertyFormat(PROPERTY_TAR_ARGS) + tarArgs + Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH) + "' " + ((BuildDirector.p2Gathering && productFile == null) ? "." : Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX)) + ' '); //$NON-NLS-1$ //$NON-NLS-2$ |
| String folder = (BuildDirector.p2Gathering && productFile == null) ? Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) : Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP); |
| script.printExecTask("tar", folder, parameters, null); //$NON-NLS-1$ |
| |
| script.printAntCallTask(TARGET_GZIP_RESULTS, true, null); |
| |
| List<String> args = new ArrayList<>(2); |
| args.add("-rf"); //$NON-NLS-1$ |
| args.add('\'' + Utils.getPropertyFormat(PROPERTY_ASSEMBLY_TMP) + '\''); |
| script.printExecTask("rm", null, args, null); //$NON-NLS-1$ |
| } |
| |
| //TODO this code and the generateAntTarTarget() should be refactored using a factory or something like that. |
| protected void generateAntZipTarget() { |
| List<FileSet> fileSets = new ArrayList<>(); |
| |
| if (BuildDirector.p2Gathering) { |
| //TODO permissions |
| FileSet[] permissions = generatePermissions(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), true); |
| String toExcludeFromArchive = Utils.getStringFromCollection(this.addedByPermissions, ","); //$NON-NLS-1$ |
| fileSets.add(new ZipFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), false, null, "**/**", null, toExcludeFromArchive, null, productFile != null ? Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) : null, null, null)); //$NON-NLS-1$ |
| fileSets.addAll(Arrays.asList(permissions)); |
| } else { |
| for (int i = 0; i < plugins.length; i++) { |
| Object[] shape = shapeAdvisor.getFinalShape(plugins[i]); |
| fileSets.add(new ZipFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_PLUGIN_LOCATION + '/' + (String) shape[0], shape[1] == ShapeAdvisor.FILE, null, null, null, null, null, Utils.getPropertyFormat(PROPERTY_PLUGIN_ARCHIVE_PREFIX) + '/' + (String) shape[0], null, null)); |
| } |
| |
| for (int i = 0; i < features.length; i++) { |
| Object[] shape = shapeAdvisor.getFinalShape(features[i]); |
| fileSets.add(new ZipFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_FEATURE_LOCATION + '/' + (String) shape[0], shape[1] == ShapeAdvisor.FILE, null, null, null, null, null, Utils.getPropertyFormat(PROPERTY_FEATURE_ARCHIVE_PREFIX) + '/' + (String) shape[0], null, null)); |
| } |
| |
| if (rootFileProviders.size() > 0) { |
| if (groupConfigs) { |
| List<Config> allConfigs = getConfigInfos(); |
| for (Iterator<Config> iter = allConfigs.iterator(); iter.hasNext();) { |
| Config elt = iter.next(); |
| fileSets.add(new ZipFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + elt.toStringReplacingAny(".", ANY_STRING), false, null, "**/**", null, null, null, elt.toStringReplacingAny(".", ANY_STRING), null, null)); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| } else { |
| FileSet[] permissions = generatePermissions(rootFolder, true); |
| String toExcludeFromArchive = Utils.getStringFromCollection(this.addedByPermissions, ","); //$NON-NLS-1$ |
| fileSets.add(new ZipFileSet(rootFolder, false, null, "**/**", null, toExcludeFromArchive, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX), null, null)); //$NON-NLS-1$ |
| fileSets.addAll(Arrays.asList(permissions)); |
| } |
| } |
| } |
| if (fileSets.size() > 0) { |
| FileSet[] sets = fileSets.toArray(new FileSet[fileSets.size()]); |
| script.printZipTask(Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH), null, false, true, sets); |
| } |
| } |
| |
| protected Collection<BuildTimeFeature> getArchiveRootFileProviders() { |
| return rootFileProviders != null ? rootFileProviders : new ArrayList<>(0); |
| } |
| |
| protected FileSet[] generatePermissions(String root, boolean zip) { |
| String configInfix = configInfo.toString("."); //$NON-NLS-1$ |
| String prefixPermissions = ROOT_PREFIX + configInfix + '.' + PERMISSIONS + '.'; |
| String commonPermissions = ROOT_PREFIX + PERMISSIONS + '.'; |
| ArrayList<ZipFileSet> fileSets = new ArrayList<>(); |
| |
| for (Iterator<BuildTimeFeature> iter = getArchiveRootFileProviders().iterator(); iter.hasNext();) { |
| Properties featureProperties = getFeatureBuildProperties(iter.next()); |
| for (Iterator<Map.Entry<Object, Object>> iter2 = featureProperties.entrySet().iterator(); iter2.hasNext();) { |
| Map.Entry<Object, Object> permission = iter2.next(); |
| String instruction = (String) permission.getKey(); |
| String parameters = (String) permission.getValue(); |
| String[] values = Utils.getArrayFromString(parameters); |
| for (int i = 0; i < values.length; i++) { |
| boolean isFile = !values[i].endsWith("/"); //$NON-NLS-1$ |
| if (instruction.startsWith(prefixPermissions)) { |
| addedByPermissions.add(values[i]); |
| if (zip) |
| fileSets.add(new ZipFileSet(root + (isFile ? '/' + values[i] : ""), isFile, null, isFile ? null : values[i] + "/**", null, null, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + (isFile ? '/' + values[i] : ""), null, instruction.substring(prefixPermissions.length()))); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ |
| else |
| fileSets.add(new TarFileSet(root + (isFile ? '/' + values[i] : ""), isFile, null, isFile ? null : values[i] + "/**", null, null, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + (isFile ? '/' + values[i] : ""), null, instruction.substring(prefixPermissions.length()))); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ |
| continue; |
| } |
| if (instruction.startsWith(commonPermissions)) { |
| addedByPermissions.add(values[i]); |
| if (zip) |
| fileSets.add(new ZipFileSet(root + (isFile ? '/' + values[i] : ""), isFile, null, isFile ? null : values[i] + "/**", null, null, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + (isFile ? '/' + values[i] : ""), null, instruction.substring(commonPermissions.length()))); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ |
| else |
| fileSets.add(new TarFileSet(root + (isFile ? '/' + values[i] : ""), isFile, null, isFile ? null : values[i] + "/**", null, null, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) + (isFile ? '/' + values[i] : ""), null, instruction.substring(commonPermissions.length()))); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ |
| continue; |
| } |
| } |
| } |
| } |
| return fileSets.toArray(new FileSet[fileSets.size()]); |
| } |
| |
| //TODO this code andn the generateAntZipTarget() should be refactored using a factory or something like that. |
| private void generateAntTarTarget() { |
| List<Object> fileSets = new ArrayList<>(); |
| |
| if (BuildDirector.p2Gathering) { |
| FileSet[] permissions = generatePermissions(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), false); |
| String toExcludeFromArchive = Utils.getStringFromCollection(this.addedByPermissions, ","); //$NON-NLS-1$ |
| fileSets.add(new TarFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE), false, null, "**/**", null, toExcludeFromArchive, null, productFile != null ? Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX) : null, null, null)); //$NON-NLS-1$ |
| fileSets.addAll(Arrays.asList(permissions)); |
| } else { |
| //FileSet[] filesPlugins = new FileSet[plugins.length]; |
| for (int i = 0; i < plugins.length; i++) { |
| Object[] shape = shapeAdvisor.getFinalShape(plugins[i]); |
| fileSets.add(new TarFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_PLUGIN_LOCATION + '/' + (String) shape[0], shape[1] == ShapeAdvisor.FILE, null, null, null, null, null, Utils.getPropertyFormat(PROPERTY_PLUGIN_ARCHIVE_PREFIX) + '/' + (String) shape[0], null, null)); |
| } |
| |
| for (int i = 0; i < features.length; i++) { |
| Object[] shape = shapeAdvisor.getFinalShape(features[i]); |
| fileSets.add(new TarFileSet(Utils.getPropertyFormat(PROPERTY_ECLIPSE_BASE) + '/' + DEFAULT_FEATURE_LOCATION + '/' + (String) shape[0], shape[1] == ShapeAdvisor.FILE, null, null, null, null, null, Utils.getPropertyFormat(PROPERTY_FEATURE_ARCHIVE_PREFIX) + '/' + (String) shape[0], null, null)); |
| } |
| |
| if (rootFileProviders.size() > 0) { |
| FileSet[] permissionSets = generatePermissions(rootFolder, false); |
| fileSets.add(new TarFileSet(rootFolder, false, null, "**/**", null, null, null, Utils.getPropertyFormat(PROPERTY_ARCHIVE_PREFIX), null, null)); //$NON-NLS-1$ |
| fileSets.add(Arrays.asList(permissionSets)); |
| } |
| } |
| if (fileSets.size() > 0) { |
| FileSet[] sets = fileSets.toArray(new FileSet[fileSets.size()]); |
| script.printTarTask(Utils.getPropertyFormat(PROPERTY_ARCHIVE_FULLPATH), null, false, true, sets); |
| } |
| } |
| |
| public void setGenerateJnlp(boolean value) { |
| generateJnlp = value; |
| } |
| |
| public void setSignJars(boolean value) { |
| signJars = value; |
| } |
| |
| public boolean isSigning() { |
| return signJars; |
| } |
| |
| public void setProduct(String value) { |
| product = value; |
| } |
| |
| public void setDirectory(String directory) { |
| this.directory = directory; |
| } |
| |
| public ProductFile getProductFile() { |
| if (productFile == null && product != null) { |
| try { |
| // Note that we must pass the OS information in to load product |
| // so that any icon files can be calculated for the |
| // generateBrandingCalls. |
| productFile = loadProduct(product, configInfo != null ? configInfo.getOs() : null); |
| } catch (CoreException e) { |
| //ignore |
| } |
| } |
| return productFile; |
| } |
| |
| public void setArchiveFormat(String archiveFormat) { |
| this.archiveFormat = archiveFormat; |
| } |
| |
| public void setGroupConfigs(boolean group) { |
| groupConfigs = group; |
| } |
| } |