blob: 610b891e6caa2609452981105dc580444e9d23dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.build.packager;
import java.io.*;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.build.*;
import org.eclipse.pde.internal.build.ant.AntScript;
import org.eclipse.pde.internal.build.builder.BuildDirector;
import org.eclipse.pde.internal.build.site.BuildTimeFeature;
public class PackageScriptGenerator extends AssembleScriptGenerator {
private String packagingPropertiesLocation;
private boolean backwardCompatibleName = false;
public PackageScriptGenerator(String directory, AssemblyInformation assemblageInformation, String featureId) {
super(directory, assemblageInformation, featureId);
}
@Override
protected void printProjectDeclaration() {
script.printProjectDeclaration("Package all config of " + featureId, TARGET_MAIN, null); //$NON-NLS-1$
}
@Override
protected AssembleConfigScriptGenerator getConfigScriptGenerator() {
return new PackageConfigScriptGenerator();
}
@Override
protected String getScriptName() {
if (backwardCompatibleName)
return "package" + '.' + DEFAULT_ASSEMBLE_ALL; //$NON-NLS-1$
return "package" + '.' + (featureId.equals("") ? "" : featureId + '.') + DEFAULT_ASSEMBLE_ALL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
public void setPropertyFile(String propertyFile) {
packagingPropertiesLocation = propertyFile;
}
@Override
protected Collection<?>[] getConfigInfos(Config aConfig) {
return new Collection<?>[] {assemblageInformation.getBinaryPlugins(aConfig), assemblageInformation.getBinaryFeatures(aConfig), assemblageInformation.getFeatures(aConfig), BuildDirector.p2Gathering ? assemblageInformation.getRootFileProviders(aConfig) : new HashSet<BuildTimeFeature>(0)};
}
@Override
protected void generateP2ConfigFileTargetCall() {
//empty
}
@Override
protected void basicGenerateAssembleConfigFileTargetCall(Config aConfig, Collection<BundleDescription> binaryPlugins, Collection<BuildTimeFeature> binaryFeatures, Collection<BuildTimeFeature> allFeatures, Collection<BuildTimeFeature> rootFiles) throws CoreException {
configScriptGenerator.initialize(directory, featureId, aConfig, binaryPlugins, binaryFeatures, allFeatures, rootFiles);
((PackageConfigScriptGenerator) configScriptGenerator).setPackagingPropertiesLocation(packagingPropertiesLocation);
configScriptGenerator.setArchiveFormat(archivesFormat.get(aConfig));
configScriptGenerator.setGroupConfigs(groupConfigs || BuildDirector.p2Gathering);
setForceUpdateJar(forceUpdateJarFormat);
configScriptGenerator.setBuildSiteFactory(siteFactory);
configScriptGenerator.setProductQualifier(productQualifier);
configScriptGenerator.generate();
script.printTab();
script.print("<assemble "); //$NON-NLS-1$
String config = configScriptGenerator.getTargetConfig();
script.printAttribute("config", config, true); //$NON-NLS-1$
script.printAttribute("element", configScriptGenerator.getTargetElement(), true); //$NON-NLS-1$
script.printAttribute("dot", config.length() > 0 ? "." : "", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
script.printAttribute("scriptPrefix", "package", true); //$NON-NLS-1$//$NON-NLS-2$
script.println("/>"); //$NON-NLS-1$
}
public void setBackwardCompatibleName(boolean value) {
backwardCompatibleName = value;
}
@Override
protected void printDefaultAssembleCondition() {
if (backwardCompatibleName)
script.printConditionIsSet("defaultAssemble.@{config}", "defaultAssemble", "defaultAssemblyEnabled", "assemble@{dot}@{config}.xml"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
else
script.printConditionIsSet("defaultAssemble.@{config}", "defaultAssemble", "defaultAssemblyEnabled", "assemble.@{element}@{dot}@{config}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
@Override
protected void generateMetadataTarget() {
if (configScriptGenerator.haveP2Bundles()) {
script.printTargetDeclaration(TARGET_P2_METADATA, null, TARGET_P2_METADATA, null, null);
ProductFile product = configScriptGenerator.getProductFile();
String productPath = null;
if (product != null) {
File productFile = product.getLocation();
String modLocation = getProductDir() + productFile.getName();
script.printAvailableTask(PROPERTY_P2_PRODUCT_MOD, modLocation, modLocation);
script.printProperty(PROPERTY_P2_PRODUCT_MOD, product.getLocation().getPath());
productPath = Utils.getPropertyFormat(PROPERTY_P2_PRODUCT_MOD);
}
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$
String versionAdvice = null;
if (versionsList && product != null) {
if (product.useFeatures())
versionAdvice = getWorkingDirectory() + '/' + DEFAULT_FEATURE_VERSION_FILENAME_PREFIX + PROPERTIES_FILE_SUFFIX;
else
versionAdvice = getWorkingDirectory() + '/' + DEFAULT_PLUGIN_VERSION_FILENAME_PREFIX + PROPERTIES_FILE_SUFFIX;
}
generateP2FinalCall(script, productPath, versionAdvice);
script.printTargetEnd();
}
}
private static void generateP2FinalCall(AntScript script, String productFileLocation, String versionAdvice) {
script.printTab();
script.print("<p2.generator "); //$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("mode", "final", true); //$NON-NLS-1$ //$NON-NLS-2$
if (productFileLocation != null) {
script.printAttribute("productFile", productFileLocation, true); //$NON-NLS-1$
if (versionAdvice != null)
script.printAttribute("versionAdvice", versionAdvice, 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$
}
/**
* Generate an ant script that can be run to generate final p2 metadata for a product.
* Returns null if p2 bundles aren't available.
*
* If no product file is given, the generated p2 call generates final metadata for a
* ${p2.root.name}_${p2.root.version} IU.
*
* versionAdvice is a properties file with bsn=3.2.1.xyz entries
*
* @param workingDir - the directory in which to generate the script
* @param productFileLocation - the location of a .product file (can be null)
* @param versionAdvice - version advice (can be null)
* @return The location of the generated script, or null
* @throws CoreException
*/
public static String generateP2ProductScript(String workingDir, String productFileLocation, Properties versionAdvice) throws CoreException {
if (!loadP2Class())
return null;
File working = new File(workingDir);
working.mkdirs();
File adviceFile = null;
if (versionAdvice != null) {
adviceFile = new File(working, "versionAdvice.properties"); //$NON-NLS-1$
try (OutputStream os = new BufferedOutputStream(new FileOutputStream(adviceFile))) {
versionAdvice.store(os, null);
} catch (IOException e) {
String message = NLS.bind(Messages.exception_writingFile, adviceFile.toString());
throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_WRITING_FILE, message, e));
}
}
AntScript p2Script = null;
try {
p2Script = newAntScript(workingDir, "p2product.xml"); //$NON-NLS-1$
p2Script.printProjectDeclaration("P2 Product IU Generation", "main", "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
p2Script.println();
p2Script.printProperty(PROPERTY_P2_APPEND, "true"); //$NON-NLS-1$
p2Script.printProperty(PROPERTY_P2_COMPRESS, "false"); //$NON-NLS-1$
p2Script.printProperty(PROPERTY_P2_METADATA_REPO_NAME, ""); //$NON-NLS-1$
p2Script.printProperty(PROPERTY_P2_ARTIFACT_REPO_NAME, ""); //$NON-NLS-1$
p2Script.printTargetDeclaration("main", null, TARGET_P2_METADATA, null, "Generate the final Product IU"); //$NON-NLS-1$//$NON-NLS-2$
generateP2FinalCall(p2Script, productFileLocation, adviceFile != null ? adviceFile.getAbsolutePath() : null);
p2Script.printTargetEnd();
p2Script.printProjectEnd();
} finally {
if (p2Script != null)
p2Script.close();
}
return workingDir + "/p2product.xml"; //$NON-NLS-1$
}
}