blob: 40baacdb7cecf029bfbac24861ae23d4bc0cf4ee [file] [log] [blame]
/*******************************************************************************
* 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.build;
import java.io.File;
import java.util.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.internal.build.builder.BuildDirector;
import org.eclipse.pde.internal.build.site.BuildTimeFeature;
public class AssembleScriptGenerator extends AbstractScriptGenerator {
protected String directory; // representing the directory where to generate the file
protected AssemblyInformation assemblageInformation;
protected String featureId;
protected HashMap<Config, String> archivesFormat;
protected boolean groupConfigs = false;
protected boolean versionsList = false;
protected String productLocation = null;
protected AssembleConfigScriptGenerator configScriptGenerator;
public AssembleScriptGenerator(String directory, AssemblyInformation assemblageInformation, String featureId) {
this.directory = directory;
this.assemblageInformation = assemblageInformation;
this.featureId = featureId;
configScriptGenerator = getConfigScriptGenerator();
}
protected String getScriptName() {
return DEFAULT_ASSEMBLE_NAME + '.' + (featureId.equals("") ? "" : featureId + '.') + DEFAULT_ASSEMBLE_ALL; //$NON-NLS-1$//$NON-NLS-2$
}
protected String getProductDir() {
return Utils.getPropertyFormat(PROPERTY_BUILD_DIRECTORY) + '/' + DEFAULT_FEATURE_LOCATION + '/' + CONTAINER_FEATURE + "/product/"; //$NON-NLS-1$
}
protected AssembleConfigScriptGenerator getConfigScriptGenerator() {
return new AssembleConfigScriptGenerator();
}
@Override
public void generate() throws CoreException {
//make sure the script generator is initialized with the site before we try doing anything with it.
configScriptGenerator.setBuildSiteFactory(siteFactory);
try {
openScript(directory, getScriptName());
printProjectDeclaration();
printAssembleMacroDef();
generatePrologue();
generateMainTarget();
generateReplaceProductTarget();
generateMetadataTarget();
script.printProjectEnd();
} finally {
if (script != null)
script.close();
script = null;
}
}
protected void printProjectDeclaration() {
script.printProjectDeclaration("Assemble All Config of " + featureId, TARGET_MAIN, null); //$NON-NLS-1$
}
protected void generatePrologue() {
if (productQualifier != null)
script.printProperty(PROPERTY_P2_PRODUCT_QUALIFIER, productQualifier);
script.println();
}
protected void printDefaultAssembleCondition() {
// packaging may need to print something different if running in a backward compatible mode.
script.printConditionIsSet("defaultAssemble.@{config}", "defaultAssemble", "defaultAssemblyEnabled", "assemble.@{element}@{dot}@{config}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
protected void printAssembleMacroDef() {
List<String> attributes = new ArrayList<>(4);
attributes.add("config"); //$NON-NLS-1$
attributes.add("element"); //$NON-NLS-1$
attributes.add("dot"); //$NON-NLS-1$
attributes.add("scriptPrefix"); //$NON-NLS-1$
script.printMacroDef("assemble", attributes); //$NON-NLS-1$
printDefaultAssembleCondition();
script.printConditionIsSet("customOrDefault.@{config}", "assemble.@{element}@{dot}@{config}", "assemble.@{element}@{dot}@{config}", "${defaultAssemble.@{config}}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
Map<String, String> properties = new HashMap<>();
properties.put("assembleScriptName", "@{scriptPrefix}.@{element}@{dot}@{config}.xml"); //$NON-NLS-1$ //$NON-NLS-2$
properties.put("element", "@{element}"); //$NON-NLS-1$//$NON-NLS-2$
properties.put("config", "@{config}"); //$NON-NLS-1$//$NON-NLS-2$
script.printAntTask(Utils.getPropertyFormat(DEFAULT_CUSTOM_TARGETS), null, "${customOrDefault.@{config}}", null, null, properties); //$NON-NLS-1$
script.printEndMacroDef();
}
@SuppressWarnings("unchecked")
protected void generateMainTarget() throws CoreException {
script.printTargetDeclaration(TARGET_MAIN, null, null, null, null);
if (BuildDirector.p2Gathering) {
generateP2ConfigFileTargetCall();
} else if (configScriptGenerator.getProductFile() != null && configScriptGenerator.haveP2Bundles()) {
script.printAntCallTask(TARGET_P2_REPLACE_PRODUCT, true, null);
}
if (shouldGroupConfigs()) {
Collection<BundleDescription> allPlugins = new LinkedHashSet<>();
Collection<BuildTimeFeature> allFeatures = new LinkedHashSet<>();
Collection<BuildTimeFeature> features = new LinkedHashSet<>();
Collection<BuildTimeFeature> rootFiles = new LinkedHashSet<>();
for (Iterator<Config> allConfigs = getConfigInfos().iterator(); allConfigs.hasNext();) {
@SuppressWarnings("rawtypes")
Collection[] configInfo = getConfigInfos(allConfigs.next());
allPlugins.addAll(configInfo[0]);
allFeatures.addAll(configInfo[1]);
features.addAll(configInfo[2]);
rootFiles.addAll(configInfo[3]);
}
basicGenerateAssembleConfigFileTargetCall(new Config("group", "group", "group"), allPlugins, allFeatures, features, rootFiles); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else {
for (Iterator<Config> allConfigs = getConfigInfos().iterator(); allConfigs.hasNext();) {
Config current = allConfigs.next();
@SuppressWarnings("rawtypes")
Collection[] configInfo = getConfigInfos(current);
basicGenerateAssembleConfigFileTargetCall(current, configInfo[0], configInfo[1], configInfo[2], configInfo[3]);
}
}
if (configScriptGenerator.haveP2Bundles() && !BuildDirector.p2Gathering)
script.printAntCallTask(TARGET_P2_METADATA, true, null);
script.printTargetEnd();
}
protected boolean shouldGroupConfigs() {
if (!BuildDirector.p2Gathering)
return groupConfigs;
// product builds are not grouped.
if (configScriptGenerator.getProductFile() != null)
return false;
return true;
}
/**
* Returns an array of collections containing the plug-ins, compiled features, all features
* and root file providers known to this generator for the given config.
*
* @param aConfig the config to lookup information on
* @return array of collections with configuration information
*/
@SuppressWarnings("rawtypes")
protected Collection[] getConfigInfos(Config aConfig) {
return new Collection[] {assemblageInformation.getCompiledPlugins(aConfig), assemblageInformation.getCompiledFeatures(aConfig), assemblageInformation.getFeatures(aConfig), assemblageInformation.getRootFileProviders(aConfig)};
}
protected void generateP2ConfigFileTargetCall() {
P2ConfigScriptGenerator p2ConfigGenerator = new P2ConfigScriptGenerator(assemblageInformation, true);
p2ConfigGenerator.setProduct(productLocation);
p2ConfigGenerator.setBuildSiteFactory(siteFactory);
p2ConfigGenerator.initialize(directory, featureId);
p2ConfigGenerator.setSignJars(configScriptGenerator.isSigning());
p2ConfigGenerator.setVersionsList(versionsList);
p2ConfigGenerator.setContextMetadata(contextMetadata);
p2ConfigGenerator.setContextArtifacts(contextArtifacts);
p2ConfigGenerator.setProductQualifier(productQualifier);
p2ConfigGenerator.generate();
script.printTab();
script.print("<assemble "); //$NON-NLS-1$
script.printAttribute("config", "p2", true); //$NON-NLS-1$ //$NON-NLS-2$
script.printAttribute("element", p2ConfigGenerator.getTargetElement(), true); //$NON-NLS-1$
script.printAttribute("dot", ".", true); //$NON-NLS-1$ //$NON-NLS-2$
script.printAttribute("scriptPrefix", "assemble", true); //$NON-NLS-1$ //$NON-NLS-2$
script.println("/>"); //$NON-NLS-1$
}
protected void basicGenerateAssembleConfigFileTargetCall(Config aConfig, Collection<BundleDescription> binaryPlugins, Collection<BuildTimeFeature> binaryFeatures, Collection<BuildTimeFeature> allFeatures, Collection<BuildTimeFeature> rootFiles) throws CoreException {
// generate the script for a configuration
configScriptGenerator.initialize(directory, featureId, aConfig, binaryPlugins, binaryFeatures, allFeatures, rootFiles);
configScriptGenerator.setArchiveFormat(archivesFormat.get(aConfig));
configScriptGenerator.setBuildSiteFactory(siteFactory);
configScriptGenerator.setGroupConfigs(groupConfigs);
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", "assemble", true); //$NON-NLS-1$ //$NON-NLS-2$
script.println("/>"); //$NON-NLS-1$
}
protected void generateReplaceProductTarget() {
ProductFile product = configScriptGenerator.getProductFile();
if (product != null) {
File productFile = product.getLocation();
String newProduct = getProductDir() + productFile.getName();
File p2Inf = new File(productFile.getParentFile(), "p2.inf"); //$NON-NLS-1$
script.printTargetDeclaration(TARGET_P2_REPLACE_PRODUCT, null, null, null, null);
script.printCopyFileTask(productFile.getPath(), newProduct, true);
if (p2Inf.exists())
script.printCopyTask(p2Inf.getAbsolutePath(), getProductDir(), null, false, true);
generateProductReplaceTask(product, newProduct, assemblageInformation);
script.printTargetEnd();
script.println();
}
}
protected void generateMetadataTarget() {
if (BuildDirector.p2Gathering)
return;
if (configScriptGenerator.haveP2Bundles()) {
ProductFile product = configScriptGenerator.getProductFile();
script.printTargetDeclaration(TARGET_P2_METADATA, null, TARGET_P2_METADATA, PROPERTY_RUN_PACKAGER, null);
script.printConditionIsSet("mode", "incremental", PROPERTY_RUN_PACKAGER, "final"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
script.printProperty(PROPERTY_P2_APPEND, "true"); //$NON-NLS-1$
script.printProperty(PROPERTY_P2_METADATA_REPO_NAME, ""); //$NON-NLS-1$
script.printProperty(PROPERTY_P2_ARTIFACT_REPO_NAME, ""); //$NON-NLS-1$
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());
}
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("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", "${mode}", true); //$NON-NLS-1$ //$NON-NLS-2$
if (product != null) {
script.printAttribute("productFile", Utils.getPropertyFormat(PROPERTY_P2_PRODUCT_MOD), true); //$NON-NLS-1$
if (versionsList) {
if (product.useFeatures())
script.printAttribute("versionAdvice", getWorkingDirectory() + '/' + DEFAULT_FEATURE_VERSION_FILENAME_PREFIX + PROPERTIES_FILE_SUFFIX, true); //$NON-NLS-1$
else
script.printAttribute("versionAdvice", getWorkingDirectory() + '/' + DEFAULT_PLUGIN_VERSION_FILENAME_PREFIX + PROPERTIES_FILE_SUFFIX, 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();
}
}
public void setSignJars(boolean value) {
configScriptGenerator.setSignJars(value);
}
public void setProduct(String value) {
productLocation = value;
configScriptGenerator.setProduct(value);
}
public void setGenerateJnlp(boolean value) {
configScriptGenerator.setGenerateJnlp(value);
}
public void setArchivesFormat(HashMap<Config, String> outputFormat) {
archivesFormat = outputFormat;
}
public void setGroupConfigs(boolean group) {
groupConfigs = group;
}
public void setVersionsList(boolean versionsList) {
this.versionsList = versionsList;
}
}