| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * Andre Eisenberg - Adapted for AJDT 1.6 |
| *******************************************************************************/ |
| package org.eclipse.pde.internal.build.tasks; |
| |
| import java.io.BufferedOutputStream; |
| import java.io.BufferedWriter; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.io.Writer; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.osgi.service.resolver.BundleDescription; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.pde.internal.build.AbstractScriptGenerator; |
| import org.eclipse.pde.internal.build.BundleHelper; |
| import org.eclipse.pde.internal.build.IBuildPropertiesConstants; |
| import org.eclipse.pde.internal.build.IXMLConstants; |
| import org.eclipse.pde.internal.build.Messages; |
| import org.eclipse.pde.internal.build.Utils; |
| import org.eclipse.pde.internal.build.ant.AntScript; |
| import org.eclipse.pde.internal.build.ant.FileSet; |
| import org.eclipse.pde.internal.build.ant.JavacTask; |
| import org.eclipse.pde.internal.build.builder.ClasspathComputer2_1; |
| import org.eclipse.pde.internal.build.builder.ClasspathComputer3_0; |
| import org.eclipse.pde.internal.build.builder.IClasspathComputer; |
| import org.eclipse.pde.internal.build.builder.ModelBuildScriptGenerator; |
| import org.eclipse.pde.internal.build.builder.ClasspathComputer3_0.ClasspathElement; |
| import org.eclipse.pde.internal.build.site.compatibility.FeatureEntry; |
| |
| /** |
| * Generic class for generating scripts for plug-ins and fragments. |
| */ |
| /* |
| * Copied from org.eclipse.pde.internal.build.builder.ModelBuildScriptGenerator |
| * to enable AspectJ plugins to be correctly exported. |
| * |
| * Changes marked with // AspectJ Change |
| */ |
| public class AJModelBuildScriptGenerator extends ModelBuildScriptGenerator { // AspectJ change |
| public static final String SRC_ZIP = "src.zip"; //$NON-NLS-1$ |
| public static final String EXPANDED_DOT = "@dot"; //$NON-NLS-1$ |
| public static final String DOT = "."; //$NON-NLS-1$ |
| |
| // AspectJ Change Begin - aspectpath and inpath support |
| public static final String PROPERTY_INPATH = "inpath"; //$NON-NLS-1$ |
| public static final String PROPERTY_ASPECTPATH = "aspectpath"; //$NON-NLS-1$ |
| // AspectJ Change end |
| |
| |
| /** |
| * Represents a entry that must be compiled and which is listed in the build.properties file. |
| */ |
| static protected class CompiledEntry extends ModelBuildScriptGenerator.CompiledEntry { // AspectJ change |
| static final byte JAR = 0; |
| static final byte FOLDER = 1; |
| private String name; |
| private String resolvedName; |
| private String[] source; |
| private String[] output; |
| private String[] extraClasspath; |
| private String excludedFromJar; |
| byte type; |
| |
| protected CompiledEntry(String entryName, String[] entrySource, String[] entryOutput, String[] entryExtraClasspath, String excludedFromJar, byte entryType) { |
| // AspectJ Change Begin |
| super(entryName, entrySource, entryOutput, entryExtraClasspath, excludedFromJar, entryType); |
| // AspectJ Change End |
| this.name = entryName; |
| this.source = entrySource; |
| this.output = entryOutput; |
| this.extraClasspath = entryExtraClasspath; |
| this.type = entryType; |
| this.excludedFromJar = excludedFromJar; |
| } |
| |
| protected String getName(boolean resolved) { |
| if (!resolved) |
| return name; |
| |
| if (resolvedName == null) |
| resolvedName = replaceVariables(name, true); |
| |
| return resolvedName; |
| } |
| |
| protected String[] getSource() { |
| return source; |
| } |
| |
| public String[] getOutput() { |
| return output; |
| } |
| |
| public String[] getExtraClasspath() { |
| return extraClasspath; |
| } |
| |
| public byte getType() { |
| return type; |
| } |
| |
| public String getExcludedFromJar() { |
| return excludedFromJar; |
| } |
| } |
| |
| // AspectJ Change Begin - aspectpath and inpath support |
| protected List aspectpath; |
| protected List inpath; |
| // AspectJ Change End |
| |
| /** |
| * Bundle for which we are generating the script. |
| */ |
| protected BundleDescription model; |
| /** |
| * PluginEntry corresponding to the bundle |
| */ |
| private FeatureEntry associatedEntry; |
| |
| protected String fullName; |
| protected String pluginZipDestination; |
| protected String pluginUpdateJarDestination; |
| |
| private AJBuildDirector featureGenerator; // AspectJ Change |
| |
| /** constants */ |
| protected final String PLUGIN_DESTINATION = Utils.getPropertyFormat(PROPERTY_PLUGIN_DESTINATION); |
| |
| private Properties permissionProperties; |
| |
| private String propertiesFileName = PROPERTIES_FILE; |
| private String buildScriptFileName = DEFAULT_BUILD_SCRIPT_FILENAME; |
| private String customBuildCallbacks = null; |
| private String customCallbacksBuildpath = null; |
| private String customCallbacksFailOnError = null; |
| private String customCallbacksInheritAll = null; |
| //This list is initialized by the generateBuildJarsTarget |
| private ArrayList compiledJarNames; |
| private boolean dotOnTheClasspath = false; |
| private boolean binaryPlugin = false; |
| private boolean signJars = false; |
| |
| // added bundles required for AspectJ |
| private List addedBundles; // AspectJ Change |
| |
| |
| // AspectJ Change Begin - override this method to use an AJAntScript |
| /** |
| * @see AbstractScriptGenerator#openScript() |
| */ |
| public void openScript(String scriptLocation, String scriptName) throws CoreException { |
| if (script != null) |
| return; |
| |
| try { |
| OutputStream scriptStream = new BufferedOutputStream(new FileOutputStream(scriptLocation + '/' + scriptName)); |
| try { |
| script = new AJAntScript(scriptStream); |
| } catch (IOException e) { |
| try { |
| scriptStream.close(); |
| String message = NLS.bind(Messages.exception_writingFile, scriptLocation + '/' + scriptName); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_WRITING_FILE, message, e)); |
| } catch (IOException e1) { |
| // Ignored |
| } |
| } |
| } catch (FileNotFoundException e) { |
| String message = NLS.bind(Messages.exception_writingFile, scriptLocation + '/' + scriptName); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_WRITING_FILE, message, e)); |
| } |
| } |
| |
| private String buildConfig; |
| |
| public void setBuildConfig(String config) { |
| buildConfig = config; |
| } |
| // AspectJ Change End |
| |
| |
| |
| /** |
| * @see AbstractScriptGenerator#generate() |
| */ |
| public void generate() throws CoreException { |
| //If it is a binary plugin, then we don't generate scripts |
| if (binaryPlugin) |
| return; |
| |
| if (model == null) { |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_ELEMENT_MISSING, Messages.error_missingElement, null)); |
| } |
| |
| // If the the plugin we want to generate is a source plugin, and the feature that required the generation of this plugin is not being asked to build the source |
| // we want to leave. This is particularly usefull for the case of the pde.source building (at least for now since the source of pde is not in a feature) |
| // if (featureGenerator != null && featureGenerator.getBuildProperties().containsKey(GENERATION_SOURCE_PLUGIN_PREFIX + model.getSymbolicName())) |
| // return; |
| |
| if (!AbstractScriptGenerator.isBuildingOSGi()) |
| checkBootAndRuntime(); |
| |
| initializeVariables(); |
| if (BundleHelper.getDefault().isDebugging()) |
| System.out.println("Generating plugin " + model.getSymbolicName()); //$NON-NLS-1$ |
| |
| String custom = (String) getBuildProperties().get(PROPERTY_CUSTOM); |
| if (custom != null && custom.equalsIgnoreCase("true")) { //$NON-NLS-1$ |
| updateExistingScript(); |
| return; |
| } |
| |
| openScript(getLocation(model), buildScriptFileName); |
| try { |
| generateBuildScript(); |
| } finally { |
| closeScript(); |
| } |
| } |
| |
| /** |
| * Check that boot and runtime are available, otherwise throws an exception because the build will fail. |
| */ |
| private void checkBootAndRuntime() throws CoreException { |
| if (getSite(false).getRegistry().getResolvedBundle(PI_BOOT) == null) { |
| IStatus status = new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_PLUGIN_MISSING, NLS.bind(Messages.exception_missingPlugin, PI_BOOT), null); |
| throw new CoreException(status); |
| } |
| if (getSite(false).getRegistry().getResolvedBundle(PI_RUNTIME) == null) { |
| IStatus status = new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_PLUGIN_MISSING, NLS.bind(Messages.exception_missingPlugin, PI_RUNTIME), null); |
| throw new CoreException(status); |
| } |
| } |
| |
| public static String getNormalizedName(BundleDescription bundle) { |
| return bundle.getSymbolicName() + '_' + bundle.getVersion(); |
| } |
| |
| private void initializeVariables() throws CoreException { |
| fullName = getNormalizedName(model); |
| pluginZipDestination = PLUGIN_DESTINATION + '/' + fullName + ".zip"; //$NON-NLS-1$ |
| pluginUpdateJarDestination = PLUGIN_DESTINATION + '/' + fullName + ".jar"; //$NON-NLS-1$ |
| String[] classpathInfo = getClasspathEntries(model); |
| dotOnTheClasspath = specialDotProcessing(getBuildProperties(), classpathInfo); |
| |
| //Persist this information for use in the assemble script generation |
| Properties bundleProperties = (Properties) model.getUserObject(); |
| bundleProperties.put(WITH_DOT, Boolean.valueOf(dotOnTheClasspath)); |
| |
| Properties properties = getBuildProperties(); |
| customBuildCallbacks = properties.getProperty(PROPERTY_CUSTOM_BUILD_CALLBACKS); |
| if (TRUE.equalsIgnoreCase(customBuildCallbacks)) |
| customBuildCallbacks = DEFAULT_CUSTOM_BUILD_CALLBACKS_FILE; |
| else if (FALSE.equalsIgnoreCase(customBuildCallbacks)) |
| customBuildCallbacks = null; |
| |
| customCallbacksBuildpath = properties.getProperty(PROPERTY_CUSTOM_CALLBACKS_BUILDPATH, "."); //$NON-NLS-1$ |
| customCallbacksFailOnError = properties.getProperty(PROPERTY_CUSTOM_CALLBACKS_FAILONERROR, FALSE); |
| customCallbacksInheritAll = properties.getProperty(PROPERTY_CUSTOM_CALLBACKS_INHERITALL); |
| |
| // AspectJ change begin |
| String inpathProp = getBuildProperties().getProperty(PROPERTY_INPATH); |
| if (inpathProp != null) { |
| inpath = new ArrayList(); |
| inpath.add(inpathProp); |
| } |
| String aspectpathProp = getBuildProperties().getProperty(PROPERTY_ASPECTPATH); |
| if (aspectpathProp != null) { |
| aspectpath = new ArrayList(); |
| aspectpath.add(aspectpathProp); |
| } |
| // AspectJ change end |
| } |
| |
| protected static boolean findAndReplaceDot(String[] classpathInfo) { |
| for (int i = 0; i < classpathInfo.length; i++) { |
| if (DOT.equals(classpathInfo[i])) { |
| classpathInfo[i] = EXPANDED_DOT; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean specialDotProcessing(Properties properties, String[] classpathInfo) { |
| findAndReplaceDot(classpathInfo); |
| |
| String outputValue = properties.getProperty(PROPERTY_OUTPUT_PREFIX + DOT); |
| if (outputValue != null) { |
| properties.setProperty(PROPERTY_OUTPUT_PREFIX + EXPANDED_DOT, outputValue); |
| properties.remove(PROPERTY_OUTPUT_PREFIX + DOT); |
| } |
| |
| String sourceFolder = properties.getProperty(PROPERTY_SOURCE_PREFIX + DOT); |
| if (sourceFolder != null) { |
| properties.setProperty(PROPERTY_SOURCE_PREFIX + EXPANDED_DOT, sourceFolder); |
| properties.remove(PROPERTY_SOURCE_PREFIX + DOT); |
| |
| String excludedFromJar = properties.getProperty(PROPERTY_EXCLUDE_PREFIX + DOT); |
| if (excludedFromJar != null) { |
| properties.setProperty(PROPERTY_EXCLUDE_PREFIX + EXPANDED_DOT, excludedFromJar); |
| properties.remove(PROPERTY_EXCLUDE_PREFIX + DOT); |
| } |
| String buildOrder = properties.getProperty(PROPERTY_JAR_ORDER); |
| if (buildOrder != null) { |
| String[] order = Utils.getArrayFromString(buildOrder); |
| for (int i = 0; i < order.length; i++) |
| if (order[i].equals(DOT)) |
| order[i] = EXPANDED_DOT; |
| properties.setProperty(PROPERTY_JAR_ORDER, Utils.getStringFromArray(order, ",")); //$NON-NLS-1$ |
| } |
| |
| String extraEntries = properties.getProperty(PROPERTY_EXTRAPATH_PREFIX + '.'); |
| if (extraEntries != null) { |
| properties.setProperty(PROPERTY_EXTRAPATH_PREFIX + EXPANDED_DOT, extraEntries); |
| } |
| |
| String includeString = properties.getProperty(PROPERTY_BIN_INCLUDES); |
| if (includeString != null) { |
| String[] includes = Utils.getArrayFromString(includeString); |
| for (int i = 0; i < includes.length; i++) |
| if (includes[i].equals(DOT)) |
| includes[i] = EXPANDED_DOT + '/'; |
| properties.setProperty(PROPERTY_BIN_INCLUDES, Utils.getStringFromArray(includes, ",")); //$NON-NLS-1$ |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * Main call for generating the script. |
| * |
| * @throws CoreException |
| */ |
| private void generateBuildScript() throws CoreException { |
| generatePrologue(); |
| generateBuildUpdateJarTarget(); |
| |
| if (getBuildProperties().getProperty(SOURCE_PLUGIN, null) == null) { |
| generateBuildJarsTarget(model); |
| } else { |
| generateBuildJarsTargetForSourceGathering(); |
| generateEmptyBuildSourcesTarget(); |
| } |
| generateGatherBinPartsTarget(); |
| generateBuildZipsTarget(); |
| generateGatherSourcesTarget(); |
| generateGatherIndividualSourcesTarget(); |
| generateCopySourcesTarget(); |
| generateGatherLogTarget(); |
| generateCleanTarget(); |
| generateRefreshTarget(); |
| generateZipPluginTarget(); |
| generateEpilogue(); |
| } |
| |
| /** |
| * Method generateEmptyBuildSourceTarget. |
| */ |
| private void generateEmptyBuildSourcesTarget() { |
| script.printTargetDeclaration(TARGET_BUILD_SOURCES, null, null, null, null); |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Method generateBuildJarsTargetForSourceGathering. |
| */ |
| private void generateBuildJarsTargetForSourceGathering() { |
| script.printTargetDeclaration(TARGET_BUILD_JARS, null, null, null, null); |
| compiledJarNames = new ArrayList(0); |
| |
| try { |
| Set pluginsToGatherSourceFrom = (Set) featureGenerator.getSourceToGather().getElementEntries().get(model.getSymbolicName()); |
| if (pluginsToGatherSourceFrom != null) { |
| for (Iterator iter = pluginsToGatherSourceFrom.iterator(); iter.hasNext();) { |
| BundleDescription plugin = (BundleDescription) iter.next(); |
| if (plugin.getSymbolicName().equals(model.getSymbolicName())) // We are not trying to gather the source from ourself since we are generated and we know we don't have source... |
| continue; |
| |
| IPath location = Utils.makeRelative(new Path(getLocation(plugin)), new Path(getLocation(model))); |
| if (!Utils.isSourceBundle(model)) { |
| // The two steps are required, because some plugins (xerces, junit, ...) don't build their source: the source already comes zipped |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, location.toOSString(), TARGET_BUILD_SOURCES, null, null, null); |
| HashMap params = new HashMap(1); |
| params.put(PROPERTY_DESTINATION_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_BASEDIR) + "/src"); //$NON-NLS-1$ |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, location.toOSString(), TARGET_GATHER_SOURCES, null, null, params); |
| } |
| } |
| } |
| } catch (NullPointerException e) { |
| |
| } finally { |
| script.printTargetEnd(); |
| } |
| } |
| |
| /** |
| * Add the <code>clean</code> target to the given Ant script. |
| * |
| * @throws CoreException |
| */ |
| private void generateCleanTarget() throws CoreException { |
| script.println(); |
| Properties properties = getBuildProperties(); |
| ModelBuildScriptGenerator.CompiledEntry[] availableJars = extractEntriesToCompile(properties); // AspectJ change |
| script.printTargetDeclaration(TARGET_CLEAN, TARGET_INIT, null, null, NLS.bind(Messages.build_plugin_clean, model.getSymbolicName())); |
| |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(3); |
| params.put(PROPERTY_PLUGIN_DESTINATION, PLUGIN_DESTINATION); |
| params.put(PROPERTY_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER)); |
| params.put(PROPERTY_BUILD_RESULT_FOLDER, Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER)); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_CLEAN, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| for (int i = 0; i < availableJars.length; i++) { |
| String jarName = ((CompiledEntry)availableJars[i]).getName(true); // AspectJ change |
| String jarLocation = getJARLocation(jarName); |
| //avoid destructive cleans |
| if (jarLocation.equals("") || jarLocation.startsWith(DOT + DOT) || jarLocation.equals(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER))) //$NON-NLS-1$ |
| continue; |
| if (((CompiledEntry)availableJars[i]).type == CompiledEntry.JAR) { // AspectJ change |
| script.printDeleteTask(null, jarLocation, null); |
| } else { |
| script.printDeleteTask(jarLocation, null, null); |
| } |
| script.printDeleteTask(null, getSRCLocation(jarName), null); |
| } |
| script.printDeleteTask(null, pluginUpdateJarDestination, null); |
| script.printDeleteTask(null, pluginZipDestination, null); |
| script.printDeleteTask(Utils.getPropertyFormat(IXMLConstants.PROPERTY_TEMP_FOLDER), null, null); |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_CLEAN, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Add the <code>gather.logs</code> target to the given Ant script. |
| * |
| * @throws CoreException |
| */ |
| private void generateGatherLogTarget() throws CoreException { |
| script.println(); |
| script.printTargetDeclaration(TARGET_GATHER_LOGS, TARGET_INIT, PROPERTY_DESTINATION_TEMP_FOLDER, null, null); |
| IPath baseDestination = new Path(Utils.getPropertyFormat(PROPERTY_DESTINATION_TEMP_FOLDER)); |
| baseDestination = baseDestination.append(fullName); |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(1); |
| params.put(PROPERTY_DESTINATION_TEMP_FOLDER, baseDestination.toString()); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_GATHER_LOGS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| List destinations = new ArrayList(5); |
| Properties properties = getBuildProperties(); |
| ModelBuildScriptGenerator.CompiledEntry[] availableJars = extractEntriesToCompile(properties); // AspectJ change |
| for (int i = 0; i < availableJars.length; i++) { |
| String name = ((CompiledEntry)availableJars[i]).getName(true); // AspectJ change |
| IPath destination = baseDestination.append(name).removeLastSegments(1); // remove the jar name |
| if (!destinations.contains(destination)) { |
| script.printMkdirTask(destination.toString()); |
| destinations.add(destination); |
| } |
| Path logPath = new Path(getTempJARFolderLocation(name) + Utils.getPropertyFormat(PROPERTY_LOG_EXTENSION)); |
| FileSet logSet = new FileSet(logPath.removeLastSegments(1).toString(), null, logPath.lastSegment(), null, null, null, null); |
| script.printCopyTask(null, destination.toString(), new FileSet[] {logSet}, false, false); |
| } |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_GATHER_LOGS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * |
| * @param zipName |
| * @param source |
| */ |
| private void generateZipIndividualTarget(String zipName, String source) { |
| script.println(); |
| script.printTargetDeclaration(zipName, TARGET_INIT, null, null, null); |
| IPath root = new Path(Utils.getPropertyFormat(IXMLConstants.PROPERTY_BASEDIR)); |
| script.printZipTask(root.append(zipName).toString(), root.append(source).toString(), false, false, null); |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Add the <code>gather.sources</code> target to the given Ant script. |
| * |
| * @throws CoreException |
| */ |
| private void generateGatherSourcesTarget() throws CoreException { |
| script.println(); |
| script.printTargetDeclaration(TARGET_GATHER_SOURCES, TARGET_INIT, PROPERTY_DESTINATION_TEMP_FOLDER, null, null); |
| |
| IPath baseDestination = new Path(Utils.getPropertyFormat(PROPERTY_DESTINATION_TEMP_FOLDER)); |
| baseDestination = baseDestination.append(fullName); |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(1); |
| params.put(PROPERTY_TARGET_FOLDER, baseDestination.toString()); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_GATHER_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| List destinations = new ArrayList(5); |
| Properties properties = getBuildProperties(); |
| ModelBuildScriptGenerator.CompiledEntry[] availableJars = extractEntriesToCompile(properties); // AspectJ Change |
| for (int i = 0; i < availableJars.length; i++) { |
| String jar = ((CompiledEntry) availableJars[i]).getName(true); // AspectJ Change |
| IPath destination = baseDestination.append(jar).removeLastSegments(1); // remove the jar name |
| if (!destinations.contains(destination)) { |
| script.printMkdirTask(destination.toString()); |
| destinations.add(destination); |
| } |
| script.printCopyTask(getSRCLocation(jar), destination.toString(), null, false, false); |
| } |
| |
| Properties copyParams = new Properties(); |
| copyParams.put(PROPERTY_SOURCE_DESTINATION_FOLDER, baseDestination.toString()); |
| script.printAntCallTask(TARGET_COPY_SRC_INCLUDES, true, copyParams); |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_GATHER_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| } |
| |
| private void generateGatherIndividualSourcesTarget() throws CoreException { |
| script.println(); |
| script.printTargetDeclaration(TARGET_GATHER_INDIVIDUAL_SOURCES, TARGET_INIT, null, null, null); |
| |
| IPath baseDestination = new Path(Utils.getPropertyFormat(PROPERTY_DESTINATION_TEMP_FOLDER)); |
| |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(1); |
| params.put(PROPERTY_TARGET_FOLDER, baseDestination.toString()); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_GATHER_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| |
| Properties copyParams = new Properties(); |
| copyParams.put(PROPERTY_SOURCE_DESTINATION_FOLDER, baseDestination.toString()); |
| |
| Properties properties = getBuildProperties(); |
| ModelBuildScriptGenerator.CompiledEntry[] availableJars = extractEntriesToCompile(properties); // AspectJ Change |
| for (int i = 0; i < availableJars.length; i++) { |
| String jar = ((CompiledEntry) availableJars[i]).getName(true); // AspectJ Change |
| String srcName = getSRCName(jar); |
| |
| script.printAntCallTask("copy." + srcName, true, copyParams); //$NON-NLS-1$ |
| } |
| |
| script.printAntCallTask(TARGET_COPY_SRC_INCLUDES, true, copyParams); |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_GATHER_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| } |
| |
| private void generateCopySourcesTarget() throws CoreException { |
| script.println(); |
| script.printTargetDeclaration(TARGET_COPY_SRC_INCLUDES, TARGET_INIT, null, null, null); |
| |
| IPath baseDestination = new Path(Utils.getPropertyFormat(PROPERTY_SOURCE_DESTINATION_FOLDER)); |
| String include = (String) getBuildProperties().get(PROPERTY_SRC_INCLUDES); |
| String exclude = (String) getBuildProperties().get(PROPERTY_SRC_EXCLUDES); |
| if (include != null || exclude != null) { |
| FileSet fileSet = new FileSet(Utils.getPropertyFormat(PROPERTY_BASEDIR), null, include, null, exclude, null, null); |
| script.printCopyTask(null, baseDestination.toString(), new FileSet[] {fileSet}, false, false); |
| } |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Add the <code>gather.bin.parts</code> target to the given Ant script. |
| * |
| * @throws CoreException |
| */ |
| private void generateGatherBinPartsTarget() throws CoreException { |
| script.println(); |
| script.printTargetDeclaration(TARGET_GATHER_BIN_PARTS, TARGET_INIT, PROPERTY_DESTINATION_TEMP_FOLDER, null, null); |
| IPath destination = new Path(Utils.getPropertyFormat(PROPERTY_DESTINATION_TEMP_FOLDER)); |
| destination = destination.append(fullName); |
| String root = destination.toString(); |
| script.printMkdirTask(root); |
| |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(3); |
| params.put(PROPERTY_TARGET_FOLDER, root); |
| params.put(PROPERTY_BUILD_RESULT_FOLDER, Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER)); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_GATHER_BIN_PARTS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| |
| List destinations = new ArrayList(5); |
| destinations.add(destination); |
| String include = (String) getBuildProperties().get(PROPERTY_BIN_INCLUDES); |
| String exclude = (String) getBuildProperties().get(PROPERTY_BIN_EXCLUDES); |
| |
| //Copy only the jars that has been compiled and are listed in the includes |
| String[] splitIncludes = Utils.getArrayFromString(include); |
| String[] fileSetValues = new String[compiledJarNames.size()]; |
| int count = 0; |
| |
| boolean dotIncluded = false; //This flag indicates if . should be gathered |
| int pos = Utils.isStringIn(splitIncludes, EXPANDED_DOT + '/'); |
| if (pos != -1) { |
| splitIncludes[pos] = null; |
| dotIncluded = true; |
| } |
| |
| //Iterate over the classpath |
| for (Iterator iter = compiledJarNames.iterator(); iter.hasNext();) { |
| CompiledEntry entry = (CompiledEntry) iter.next(); |
| String formatedName = entry.getName(false) + (entry.getType() == CompiledEntry.FOLDER ? "/" : ""); //$NON-NLS-1$//$NON-NLS-2$ |
| if (dotOnTheClasspath && formatedName.startsWith(EXPANDED_DOT)) { |
| dotIncluded = dotIncluded & true; |
| continue; |
| } |
| fileSetValues[count++] = formatedName; |
| continue; |
| } |
| if (count != 0) { |
| FileSet fileSet = new FileSet(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER), null, Utils.getStringFromArray(fileSetValues, ","), null, replaceVariables(exclude, true), null, null); //$NON-NLS-1$ |
| script.printCopyTask(null, root, new FileSet[] {fileSet}, true, false); |
| } |
| //Dot on the classpath need to be copied in a special way |
| if (dotIncluded) { |
| FileSet fileSet = new FileSet(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER) + '/' + EXPANDED_DOT, null, "**", null, replaceVariables(exclude, true), null, null); //$NON-NLS-1$ |
| script.printCopyTask(null, root, new FileSet[] {fileSet}, true, false); |
| } |
| //General copy of the files listed in the includes |
| if (include != null || exclude != null) { |
| String includeSet = replaceVariables(Utils.getStringFromArray(splitIncludes, ","), true); //$NON-NLS-1$ |
| if (includeSet != null && includeSet.length() > 0) { |
| FileSet fileSet = new FileSet(Utils.getPropertyFormat(PROPERTY_BASEDIR), null, includeSet, null, replaceVariables(exclude, true), null, null); |
| script.printCopyTask(null, root, new FileSet[] {fileSet}, true, false); |
| } |
| } |
| |
| if (Utils.isSourceBundle(model)) { |
| Set pluginsToGatherSourceFrom = (Set) featureGenerator.getSourceToGather().getElementEntries().get(model.getSymbolicName()); |
| if (pluginsToGatherSourceFrom != null) { |
| for (Iterator iter = pluginsToGatherSourceFrom.iterator(); iter.hasNext();) { |
| BundleDescription plugin = (BundleDescription) iter.next(); |
| IPath location = Utils.makeRelative(new Path(getLocation(plugin)), new Path(getLocation(model))); |
| HashMap taskParams = new HashMap(1); |
| taskParams.put(PROPERTY_DESTINATION_TEMP_FOLDER, root); |
| script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, location.toOSString(), TARGET_GATHER_INDIVIDUAL_SOURCES, null, null, taskParams); |
| } |
| } |
| } |
| |
| generatePermissionProperties(root); |
| genarateIdReplacementCall(destination.toString()); |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_GATHER_BIN_PARTS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| |
| script.printTargetEnd(); |
| } |
| |
| private void genarateIdReplacementCall(String location) { |
| Properties bundleProperties = (Properties) model.getUserObject(); |
| if (bundleProperties == null) |
| return; |
| |
| String qualifier = bundleProperties.getProperty(PROPERTY_QUALIFIER); |
| if (qualifier == null) |
| return; |
| script.println("<eclipse.versionReplacer path=\"" + AntScript.getEscaped(location) + "\" version=\"" + model.getVersion() + "\"/>"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ |
| } |
| |
| private void generatePermissionProperties(String directory) throws CoreException { |
| getPermissionProperties(); |
| for (Iterator iter = permissionProperties.entrySet().iterator(); iter.hasNext();) { |
| Map.Entry permission = (Map.Entry) iter.next(); |
| String instruction = (String) permission.getKey(); |
| String parameters = (String) permission.getValue(); |
| int index; |
| if ((index = instruction.indexOf(PERMISSIONS)) != -1) { |
| generateChmodInstruction(directory, instruction.substring(index + PERMISSIONS.length() + 1), parameters); |
| continue; |
| } |
| if (instruction.startsWith(LINK)) { |
| generateLinkInstruction(directory, parameters); |
| } |
| } |
| } |
| |
| private void generateChmodInstruction(String dir, String rights, String files) { |
| // TO CHECK We only consider rights specified with numbers |
| if (rights.equals(EXECUTABLE)) { |
| rights = "755"; //$NON-NLS-1$ |
| } |
| script.printChmod(dir, rights, files); |
| } |
| |
| private void generateLinkInstruction(String dir, String files) { |
| String[] links = Utils.getArrayFromString(files, ","); //$NON-NLS-1$ |
| List arguments = new ArrayList(2); |
| for (int i = 0; i < links.length; i += 2) { |
| arguments.add(links[i]); |
| arguments.add(links[i + 1]); |
| script.printExecTask("ln -s", dir, arguments, "Linux"); //$NON-NLS-1$ //$NON-NLS-2$ |
| arguments.clear(); |
| } |
| } |
| |
| protected Properties getPermissionProperties() throws CoreException { |
| if (permissionProperties == null) { |
| permissionProperties = readProperties(getLocation(model), PERMISSIONS_FILE, IStatus.INFO); |
| } |
| return permissionProperties; |
| } |
| |
| /** |
| * Add the <code>zip.plugin</code> target to the given Ant script. |
| */ |
| private void generateZipPluginTarget() { |
| script.println(); |
| script.printTargetDeclaration(TARGET_ZIP_PLUGIN, TARGET_INIT, null, null, NLS.bind(Messages.build_plugin_zipPlugin, model.getSymbolicName())); |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), null, null); |
| script.printMkdirTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER)); |
| script.printAntCallTask(TARGET_BUILD_JARS, true, null); |
| script.printAntCallTask(TARGET_BUILD_SOURCES, true, null); |
| Map params = new HashMap(1); |
| params.put(PROPERTY_DESTINATION_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER) + '/'); |
| script.printAntCallTask(TARGET_GATHER_BIN_PARTS, true, params); |
| script.printAntCallTask(TARGET_GATHER_SOURCES, true, params); |
| FileSet fileSet = new FileSet(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), null, "**/*.bin" + Utils.getPropertyFormat(PROPERTY_LOG_EXTENSION), null, null, null, null); //$NON-NLS-1$ |
| script.printDeleteTask(null, null, new FileSet[] {fileSet}); |
| script.printZipTask(pluginZipDestination, Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), true, false, null); |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), null, null); |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Add the <code>build.update.jar</code> target to the given Ant script. |
| */ |
| private void generateBuildUpdateJarTarget() { |
| script.println(); |
| script.printTargetDeclaration(TARGET_BUILD_UPDATE_JAR, TARGET_INIT, null, null, NLS.bind(Messages.build_plugin_buildUpdateJar, model.getSymbolicName())); |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), null, null); |
| script.printMkdirTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER)); |
| script.printAntCallTask(TARGET_BUILD_JARS, true, null); |
| Map params = new HashMap(1); |
| params.put(PROPERTY_DESTINATION_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER) + '/'); |
| script.printAntCallTask(TARGET_GATHER_BIN_PARTS, true, params); |
| script.printJarTask(pluginUpdateJarDestination, Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER) + '/' + fullName, null, "merge"); //$NON-NLS-1$ |
| script.printDeleteTask(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER), null, null); |
| if (signJars) |
| script.println("<eclipse.jarProcessor sign=\"" + Utils.getPropertyFormat(PROPERTY_SIGN) + "\" pack=\"" + Utils.getPropertyFormat(PROPERTY_PACK) + "\" unsign=\"" + Utils.getPropertyFormat(PROPERTY_UNSIGN) + "\" jar=\"" + AntScript.getEscaped(pluginUpdateJarDestination) + "\" alias=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_ALIAS) + "\" keystore=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_KEYSTORE) + "\" storepass=\"" + Utils.getPropertyFormat(PROPERTY_SIGN_STOREPASS) + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Add the <code>refresh</code> target to the given Ant script. |
| */ |
| private void generateRefreshTarget() { |
| script.println(); |
| script.printTargetDeclaration(TARGET_REFRESH, TARGET_INIT, PROPERTY_ECLIPSE_RUNNING, null, Messages.build_plugin_refresh); |
| script.printConvertPathTask(new Path(getLocation(model)).removeLastSegments(0).toOSString().replace('\\', '/'), PROPERTY_RESOURCE_PATH, false); |
| script.printRefreshLocalTask(Utils.getPropertyFormat(PROPERTY_RESOURCE_PATH), "infinite"); //$NON-NLS-1$ |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * End the script by closing the project element. |
| */ |
| private void generateEpilogue() { |
| script.println(); |
| script.printProjectEnd(); |
| } |
| |
| /** |
| * Defines, the XML declaration, Ant project and targets init and initTemplate. |
| */ |
| private void generatePrologue() { |
| script.printProjectDeclaration(model.getSymbolicName(), TARGET_BUILD_JARS, DOT); |
| script.println(); |
| |
| script.printProperty(PROPERTY_BASE_WS, Utils.getPropertyFormat(PROPERTY_WS)); |
| script.printProperty(PROPERTY_BASE_OS, Utils.getPropertyFormat(PROPERTY_OS)); |
| script.printProperty(PROPERTY_BASE_ARCH, Utils.getPropertyFormat(PROPERTY_ARCH)); |
| script.printProperty(PROPERTY_BASE_NL, Utils.getPropertyFormat(PROPERTY_NL)); |
| script.printProperty(PROPERTY_BUNDLE_ID, model.getSymbolicName()); |
| script.printProperty(PROPERTY_BUNDLE_VERSION, model.getVersion().toString()); |
| script.println(); |
| |
| if (customBuildCallbacks != null && !customBuildCallbacks.equals(FALSE)) { |
| script.printAvailableTask(PROPERTY_CUSTOM_BUILD_CALLBACKS, customCallbacksBuildpath + '/' + customBuildCallbacks, customBuildCallbacks); |
| script.println(); |
| } |
| |
| generateCompilerSettings(); |
| |
| script.printTargetDeclaration(TARGET_INIT, TARGET_PROPERTIES, null, null, null); |
| script.printConditionIsSet(PROPERTY_PLUGIN_TEMP, Utils.getPropertyFormat(PROPERTY_BUILD_TEMP) + '/' + DEFAULT_PLUGIN_LOCATION, PROPERTY_BUILD_TEMP); |
| script.printProperty(PROPERTY_PLUGIN_TEMP, Utils.getPropertyFormat(PROPERTY_BASEDIR)); |
| script.printConditionIsSet(PROPERTY_BUILD_RESULT_FOLDER, Utils.getPropertyFormat(PROPERTY_PLUGIN_TEMP) + '/' + model.getSymbolicName() + '_' + model.getVersion(), PROPERTY_BUILD_TEMP); |
| script.printProperty(PROPERTY_BUILD_RESULT_FOLDER, Utils.getPropertyFormat(PROPERTY_BASEDIR)); |
| |
| script.printProperty(PROPERTY_TEMP_FOLDER, Utils.getPropertyFormat(PROPERTY_BASEDIR) + '/' + PROPERTY_TEMP_FOLDER); |
| script.printProperty(PROPERTY_PLUGIN_DESTINATION, Utils.getPropertyFormat(PROPERTY_BASEDIR)); |
| script.printTargetEnd(); |
| script.println(); |
| script.printTargetDeclaration(TARGET_PROPERTIES, null, PROPERTY_ECLIPSE_RUNNING, null, null); |
| script.printProperty(PROPERTY_BUILD_COMPILER, JDT_COMPILER_ADAPTER); |
| script.println(); |
| |
| script.printTargetEnd(); |
| } |
| |
| private void generateCompilerSettings() { |
| String javacSource = null; |
| String javacTarget = null; |
| String bootClasspath = null; |
| String jreProfile = null; |
| try { |
| Properties properties = getBuildProperties(); |
| javacSource = properties.getProperty(IBuildPropertiesConstants.PROPERTY_JAVAC_SOURCE); |
| javacTarget = properties.getProperty(IBuildPropertiesConstants.PROPERTY_JAVAC_TARGET); |
| bootClasspath = properties.getProperty(IBuildPropertiesConstants.PROPERTY_BOOT_CLASSPATH); |
| jreProfile = properties.getProperty(IBuildPropertiesConstants.PROPERTY_JRE_COMPILATION_PROFILE); |
| } catch (CoreException e) { |
| //ignore |
| } |
| |
| script.printComment(Messages.build_compilerSetting); |
| script.printProperty(PROPERTY_JAVAC_FAIL_ON_ERROR, "false"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_JAVAC_DEBUG_INFO, "on"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_JAVAC_VERBOSE, "false"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_LOG_EXTENSION, ".log"); //$NON-NLS-1$ |
| script.printProperty(PROPERTY_JAVAC_COMPILERARG, ""); //$NON-NLS-1$ |
| |
| if (javacSource == null) |
| script.printProperty(IXMLConstants.PROPERTY_JAVAC_SOURCE, "1.5"); //$NON-NLS-1$ |
| if (javacTarget == null) |
| script.printProperty(IXMLConstants.PROPERTY_JAVAC_TARGET, "1.5"); //$NON-NLS-1$ |
| if (bootClasspath == null) { |
| script.println("<condition property=\"dir_bootclasspath\" value=\"${java.home}/../Classes\">");//$NON-NLS-1$ |
| script.println("\t<os family=\"mac\"/>");//$NON-NLS-1$ |
| script.println("</condition>");//$NON-NLS-1$ |
| script.println("<property name=\"dir_bootclasspath\" value=\"${java.home}/lib\"/>");//$NON-NLS-1$ |
| script.println("<path id=\"path_bootclasspath\">");//$NON-NLS-1$ |
| script.println("\t<fileset dir=\"${dir_bootclasspath}\">");//$NON-NLS-1$ |
| script.println("\t\t<include name=\"*.jar\"/>");//$NON-NLS-1$ |
| script.println("\t</fileset>");//$NON-NLS-1$ |
| script.println("</path>");//$NON-NLS-1$ |
| script.printPropertyRefid(PROPERTY_BOOTCLASSPATH, "path_bootclasspath"); //$NON-NLS-1$ |
| } |
| |
| Properties environmentMappings = getExecutionEnvironmentMappings(); |
| if (jreProfile != null && !environmentMappings.containsKey(jreProfile + '.' + IXMLConstants.PROPERTY_JAVAC_SOURCE)) { |
| if (reportResolutionErrors) { |
| IStatus status = new Status(IStatus.ERROR, model.getSymbolicName(), IStatus.ERROR, NLS.bind(Messages.build_plugin_unrecognizedJRE, jreProfile), null); |
| BundleHelper.getDefault().getLog().log(status); |
| } |
| jreProfile = null; |
| } |
| |
| if (javacSource != null) |
| script.printProperty(PROPERTY_BUNDLE_JAVAC_SOURCE, javacSource); |
| if (javacTarget != null) |
| script.printProperty(PROPERTY_BUNDLE_JAVAC_TARGET, javacTarget); |
| if (bootClasspath != null) |
| script.printProperty(PROPERTY_BUNDLE_BOOTCLASSPATH, bootClasspath); |
| |
| String source, target = null; |
| String[] modelEnvironments = model.getExecutionEnvironments(); |
| String[] environments = null; |
| if (jreProfile != null) { |
| environments = new String[modelEnvironments.length + 1]; |
| environments[0] = jreProfile; |
| System.arraycopy(modelEnvironments, 0, environments, 1, modelEnvironments.length); |
| } else { |
| environments = modelEnvironments; |
| } |
| for (int i = 0; i < environments.length; i++) { |
| if (bootClasspath == null) |
| script.printConditionIsSet(PROPERTY_BUNDLE_BOOTCLASSPATH, Utils.getPropertyFormat(environments[i]), environments[i]); |
| |
| source = (String) environmentMappings.get(environments[i] + '.' + IXMLConstants.PROPERTY_JAVAC_SOURCE); |
| target = (String) environmentMappings.get(environments[i] + '.' + IXMLConstants.PROPERTY_JAVAC_TARGET); |
| if (javacSource == null && source != null) |
| script.printConditionIsSet(PROPERTY_BUNDLE_JAVAC_SOURCE, source, environments[i]); |
| if (javacTarget == null && target != null) |
| script.printConditionIsSet(PROPERTY_BUNDLE_JAVAC_TARGET, target, environments[i]); |
| } |
| |
| if (javacSource == null) |
| script.printProperty(PROPERTY_BUNDLE_JAVAC_SOURCE, Utils.getPropertyFormat(IXMLConstants.PROPERTY_JAVAC_SOURCE)); |
| if (javacTarget == null) |
| script.printProperty(PROPERTY_BUNDLE_JAVAC_TARGET, Utils.getPropertyFormat(IXMLConstants.PROPERTY_JAVAC_TARGET)); |
| if (bootClasspath == null) |
| script.printProperty(PROPERTY_BUNDLE_BOOTCLASSPATH, Utils.getPropertyFormat(PROPERTY_BOOTCLASSPATH)); |
| script.println(); |
| } |
| |
| /** |
| * Sets the PluginModel to generate script from. |
| * |
| * @param model |
| * @throws CoreException |
| */ |
| public void setModel(BundleDescription model) throws CoreException { |
| if (model == null) { |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_ELEMENT_MISSING, Messages.error_missingElement, null)); |
| } |
| model = getSite(false).getRegistry().getVersionReplacement(model); |
| this.model = model; |
| if (getBuildProperties() == AbstractScriptGenerator.MissingProperties.getInstance()) { |
| //if there were no build.properties, then it is a binary plugin |
| binaryPlugin = true; |
| } else { |
| getCompiledElements().add(model.getSymbolicName()); |
| } |
| Properties bundleProperties = (Properties) model.getUserObject(); |
| if (bundleProperties == null) { |
| bundleProperties = new Properties(); |
| model.setUserObject(bundleProperties); |
| } |
| bundleProperties.put(IS_COMPILED, binaryPlugin ? Boolean.FALSE : Boolean.TRUE); |
| } |
| |
| /** |
| * Sets model to generate scripts from. |
| * |
| * @param modelId |
| * @throws CoreException |
| */ |
| public void setModelId(String modelId, String modelVersion) throws CoreException { |
| BundleDescription newModel = getModel(modelId, modelVersion); |
| if (newModel == null) { |
| String message = NLS.bind(Messages.exception_missingElement, modelId); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_ELEMENT_MISSING, message, null)); |
| } |
| setModel(newModel); |
| } |
| |
| /** |
| * Add the <code>build.zips</code> target to the given Ant script. |
| * |
| * @throws CoreException |
| */ |
| private void generateBuildZipsTarget() throws CoreException { |
| StringBuffer zips = new StringBuffer(); |
| Properties props = getBuildProperties(); |
| for (Iterator iterator = props.entrySet().iterator(); iterator.hasNext();) { |
| Map.Entry entry = (Map.Entry) iterator.next(); |
| String key = (String) entry.getKey(); |
| if (key.startsWith(PROPERTY_SOURCE_PREFIX) && key.endsWith(PROPERTY_ZIP_SUFFIX)) { |
| String zipName = key.substring(PROPERTY_SOURCE_PREFIX.length()); |
| zips.append(','); |
| zips.append(zipName); |
| generateZipIndividualTarget(zipName, (String) entry.getValue()); |
| } |
| } |
| script.println(); |
| script.printTargetDeclaration(TARGET_BUILD_ZIPS, TARGET_INIT + zips.toString(), null, null, null); |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * Sets the featureGenerator. |
| * @param featureGenerator The featureGenerator to set |
| */ |
| public void setFeatureGenerator(AJBuildDirector featureGenerator) { // AspectJ Change |
| this.featureGenerator = featureGenerator; |
| } |
| |
| /** |
| * Add the "build.jars" target to the given Ant script using the specified plug-in model. |
| * |
| * @param pluginModel the plug-in model to reference |
| * @throws CoreException |
| */ |
| private void generateBuildJarsTarget(BundleDescription pluginModel) throws CoreException { |
| Properties properties = getBuildProperties(); |
| ModelBuildScriptGenerator.CompiledEntry[] availableJars = extractEntriesToCompile(properties); // AspectJ change |
| compiledJarNames = new ArrayList(availableJars.length); |
| Map jars = new HashMap(availableJars.length); |
| for (int i = 0; i < availableJars.length; i++) |
| jars.put(((CompiledEntry)availableJars[i]).getName(false), availableJars[i]); // AspectJ change |
| |
| // Put the jars in a correct compile order |
| String jarOrder = (String) getBuildProperties().get(PROPERTY_JAR_ORDER); |
| IClasspathComputer classpath; |
| if (AbstractScriptGenerator.isBuildingOSGi()) |
| classpath = new ClasspathComputer3_0(this); |
| else |
| classpath = new ClasspathComputer2_1(this); |
| |
| if (jarOrder != null) { |
| String[] order = Utils.getArrayFromString(jarOrder); |
| for (int i = 0; i < order.length; i++) { |
| CompiledEntry jar = (CompiledEntry) jars.get(order[i]); |
| if (jar == null) |
| continue; |
| |
| compiledJarNames.add(jar); |
| generateCompilationTarget(classpath.getClasspath(pluginModel, jar), jar); |
| generateSRCTarget(jar); |
| jars.remove(order[i]); |
| } |
| } |
| for (Iterator iterator = jars.values().iterator(); iterator.hasNext();) { |
| CompiledEntry jar = (CompiledEntry) iterator.next(); |
| compiledJarNames.add(jar); |
| generateCompilationTarget(classpath.getClasspath(pluginModel, jar), jar); |
| generateSRCTarget(jar); |
| } |
| script.println(); |
| script.printTargetDeclaration(TARGET_BUILD_JARS, TARGET_INIT, null, null, NLS.bind(Messages.build_plugin_buildJars, pluginModel.getSymbolicName())); |
| Map params = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(1); |
| params.put(PROPERTY_BUILD_RESULT_FOLDER, Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER)); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_BUILD_JARS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| for (Iterator iter = compiledJarNames.iterator(); iter.hasNext();) { |
| String name = ((CompiledEntry) iter.next()).getName(false); |
| script.printAvailableTask(name, replaceVariables(getJARLocation(name), true)); |
| script.printAntCallTask(name, true, null); |
| } |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_BUILD_JARS, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| |
| script.println(); |
| script.printTargetDeclaration(TARGET_BUILD_SOURCES, TARGET_INIT, null, null, null); |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + TARGET_BUILD_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| for (Iterator iter = compiledJarNames.iterator(); iter.hasNext();) { |
| String jarName = ((CompiledEntry) iter.next()).getName(false); |
| String srcName = getSRCName(jarName); |
| script.printAvailableTask(srcName, getSRCLocation(jarName)); |
| script.printAntCallTask(srcName, true, null); |
| } |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + TARGET_BUILD_SOURCES, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, null); |
| } |
| script.printTargetEnd(); |
| } |
| |
| /** |
| * generate compile settings for compiling this entry |
| * warning levels, default encoding, custom encodings |
| * @param javac |
| * @param entry |
| */ |
| private void generateCompilerSettings(JavacTask javac, CompiledEntry entry, List classpath) { |
| final String ADAPTER_ENCODING = "#ADAPTER#ENCODING#"; //$NON-NLS-1$ |
| final String ADAPTER_ACCESS = "#ADAPTER#ACCESS#"; //$NON-NLS-1$ |
| |
| Properties properties = null; |
| try { |
| properties = getBuildProperties(); |
| } catch (CoreException e) { |
| return; |
| } |
| if (properties == null && classpath.size() == 0) |
| return; |
| |
| String name = entry.getName(false); |
| if (name.equals(EXPANDED_DOT)) |
| name = DOT; |
| |
| String defaultEncodingVal = properties.getProperty(PROPERTY_JAVAC_DEFAULT_ENCODING_PREFIX + name); |
| if (defaultEncodingVal != null) |
| javac.setEncoding(defaultEncodingVal); |
| |
| String customEncodingsVal = properties.getProperty(PROPERTY_JAVAC_CUSTOM_ENCODINGS_PREFIX + name); |
| String warningLevels = properties.getProperty(PROPERTY_JAVAC_WARNINGS_PREFIX + name); |
| |
| if (customEncodingsVal == null && warningLevels == null && classpath.size() == 0) { |
| return; |
| } |
| |
| String root = getLocation(model); |
| File file = new File(root, "javaCompiler." + name.replaceAll("[\\\\/]", "_") + ".args"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| if (file.exists()) { |
| file.delete(); |
| } |
| Writer writer = null; |
| try { |
| try { |
| //only create the file if we are going to write something in it |
| if (warningLevels != null || customEncodingsVal != null) |
| writer = new BufferedWriter(new FileWriter(file)); |
| |
| if (warningLevels != null) { |
| writer.write("-warn:" + warningLevels + "\n"); //$NON-NLS-1$//$NON-NLS-2$ |
| } |
| |
| if (customEncodingsVal != null) { |
| String[] encodings = customEncodingsVal.split(","); //$NON-NLS-1$ |
| if (encodings.length > 0) { |
| for (int i = 0; i < encodings.length; i++) { |
| writer.write(ADAPTER_ENCODING + encodings[i] + "\n"); //$NON-NLS-1$ |
| } |
| } |
| } |
| //handle access rules if we are using ClasspathComputer3_0 |
| Properties data = (Properties) model.getUserObject(); |
| if (data == null || !data.containsKey(PROPERTY_CONVERTED_MANIFEST)) { |
| if (classpath.size() > 0 && classpath.get(0) instanceof ClasspathElement) { |
| for (Iterator iterator = classpath.iterator(); iterator.hasNext();) { |
| ClasspathElement element = (ClasspathElement) iterator.next(); |
| if (element.getPath() != null && element.getPath().length() > 0 && element.getAccessRules().length() > 0) { |
| String path = element.getPath(); |
| if (path.startsWith(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER))) { |
| //remove leading ${build.result.folder}/ |
| path = path.substring(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER).length() + 1); |
| } |
| //remove leading ../../.. |
| path = path.replaceFirst("^(\\.\\.[\\\\/])*", ""); //$NON-NLS-1$//$NON-NLS-2$ |
| if (writer == null) |
| writer = new BufferedWriter(new FileWriter(file)); |
| writer.write(ADAPTER_ACCESS + path + element.getAccessRules() + "\n"); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| if (writer != null) |
| javac.setCompileArgsFile(Utils.getPropertyFormat(PROPERTY_BASEDIR) + "/" + file.getName()); //$NON-NLS-1$ |
| } finally { |
| if (writer != null) |
| writer.close(); |
| } |
| } catch (IOException e1) { |
| //ignore |
| } |
| } |
| |
| /** |
| * Add the "jar" target to the given Ant script using the given classpath and |
| * jar as parameters. |
| * |
| * @param classpath the classpath for the jar command |
| * @param entry |
| */ |
| private void generateCompilationTarget(List classpath, CompiledEntry entry) { |
| script.println(); |
| String name = entry.getName(false); |
| script.printTargetDeclaration(name, TARGET_INIT, null, entry.getName(true), NLS.bind(Messages.build_plugin_jar, model.getSymbolicName() + ' ' + name)); |
| String destdir = getTempJARFolderLocation(entry.getName(true)); |
| script.printDeleteTask(destdir, null, null); |
| script.printMkdirTask(destdir); |
| script.printPathStructure("path", name + PROPERTY_CLASSPATH, classpath); //$NON-NLS-1$ |
| |
| String[] sources = entry.getSource(); |
| Map params = null, references = null; |
| if (customBuildCallbacks != null) { |
| params = new HashMap(2); |
| params.put(PROPERTY_TARGET_FOLDER, destdir); |
| for (int i = 1; i <= sources.length; i++) { |
| params.put(PROPERTY_SOURCE_FOLDER + i, sources[i - 1]); |
| } |
| |
| references = new HashMap(1); |
| references.put(name + PROPERTY_CLASSPATH, null); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_PRE + name, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, references); |
| } |
| |
| script.printComment("compile the source code"); //$NON-NLS-1$ |
| // AspectJ Change Begin |
| String[] ajdeClasspath = null; |
| try { |
| addedBundles = new ArrayList(); |
| ajdeClasspath = bundleToCP(getModel("org.aspectj.ajde", null)); //$NON-NLS-1$ |
| } catch (CoreException e) { |
| } |
| AJCTask javac = new AJCTask(buildConfig, ajdeClasspath); |
| javac.setAspectpath(aspectpath); |
| javac.setInpath(inpath); |
| // AspectJ Change End |
| javac.setClasspathId(name + PROPERTY_CLASSPATH); |
| javac.setBootClasspath(Utils.getPropertyFormat(PROPERTY_BUNDLE_BOOTCLASSPATH)); |
| javac.setDestdir(destdir); |
| javac.setFailOnError(Utils.getPropertyFormat(PROPERTY_JAVAC_FAIL_ON_ERROR)); |
| javac.setDebug(Utils.getPropertyFormat(PROPERTY_JAVAC_DEBUG_INFO)); |
| javac.setVerbose(Utils.getPropertyFormat(PROPERTY_JAVAC_VERBOSE)); |
| javac.setIncludeAntRuntime("no"); //$NON-NLS-1$ |
| javac.setSource(Utils.getPropertyFormat(PROPERTY_BUNDLE_JAVAC_SOURCE)); |
| javac.setTarget(Utils.getPropertyFormat(PROPERTY_BUNDLE_JAVAC_TARGET)); |
| javac.setCompileArgs(Utils.getPropertyFormat(PROPERTY_JAVAC_COMPILERARG)); |
| javac.setSrcdir(sources); |
| javac.setLogExtension(Utils.getPropertyFormat(PROPERTY_LOG_EXTENSION)); |
| generateCompilerSettings(javac, entry, classpath); |
| |
| script.print(javac); |
| script.printComment("Copy necessary resources"); //$NON-NLS-1$ |
| FileSet[] fileSets = new FileSet[sources.length]; |
| for (int i = 0; i < sources.length; i++) { |
| // AspectJ Change Begin |
| // Also filter .aj files when copying resources |
| String excludes = "**/*.aj, **/*.java, **/package.htm*"; //$NON-NLS-1$ |
| // AspectJ Change End |
| String excludedFromJar = entry.getExcludedFromJar(); |
| if (excludedFromJar != null) |
| excludes += ',' + excludedFromJar; |
| |
| fileSets[i] = new FileSet(sources[i], null, null, null, excludes, null, null); |
| } |
| |
| script.printCopyTask(null, destdir, fileSets, true, false); |
| |
| if (customBuildCallbacks != null) { |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST_COMPILE + name, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, references); |
| } |
| |
| String jarLocation = getJARLocation(entry.getName(true)); |
| script.printMkdirTask(new Path(jarLocation).removeLastSegments(1).toString()); |
| |
| if (entry.getType() == CompiledEntry.FOLDER) { |
| FileSet[] binFolder = new FileSet[] {new FileSet(destdir, null, null, null, null, null, null)}; |
| script.printCopyTask(null, jarLocation, binFolder, true, false); |
| } else { |
| script.printJarTask(jarLocation, destdir, getEmbeddedManifestFile(entry, destdir)); |
| } |
| script.printDeleteTask(destdir, null, null); |
| |
| if (customBuildCallbacks != null) { |
| params.clear(); |
| params.put(PROPERTY_JAR_LOCATION, jarLocation); |
| script.printSubantTask(Utils.getPropertyFormat(PROPERTY_CUSTOM_BUILD_CALLBACKS), PROPERTY_POST + name, customCallbacksBuildpath, customCallbacksFailOnError, customCallbacksInheritAll, params, references); |
| } |
| script.printTargetEnd(); |
| } |
| |
| private String getEmbeddedManifestFile(CompiledEntry jarEntry, String destdir) { |
| try { |
| String manifestName = getBuildProperties().getProperty(PROPERTY_MANIFEST_PREFIX + jarEntry.getName(true)); |
| if (manifestName == null) |
| return null; |
| return destdir + '/' + manifestName; |
| } catch (CoreException e) { |
| return null; |
| } |
| } |
| |
| /** |
| * |
| * @param properties |
| * @return JAR[] |
| */ |
| // AspectJ Change Begin |
| protected ModelBuildScriptGenerator.CompiledEntry[] extractEntriesToCompile(Properties properties) throws CoreException { |
| // AspectJ Change End |
| return extractEntriesToCompile(properties, model); |
| } |
| |
| // AspectJ Change Begin |
| public static ModelBuildScriptGenerator.CompiledEntry[] extractEntriesToCompile(Properties properties, BundleDescription model) throws CoreException { |
| // AspectJ Change End |
| List result = new ArrayList(5); |
| int prefixLength = PROPERTY_SOURCE_PREFIX.length(); |
| for (Iterator iterator = properties.entrySet().iterator(); iterator.hasNext();) { |
| Map.Entry entry = (Map.Entry) iterator.next(); |
| String key = (String) entry.getKey(); |
| if (!(key.startsWith(PROPERTY_SOURCE_PREFIX))) |
| continue; |
| key = key.substring(prefixLength); |
| String[] source = Utils.getArrayFromString((String) entry.getValue()); |
| if (source.length == 0) { |
| String message = NLS.bind(Messages.error_missingSourceFolder, model.getSymbolicName(), entry.getKey()); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_GENERIC, message, null)); |
| } |
| String[] output = Utils.getArrayFromString(properties.getProperty(PROPERTY_OUTPUT_PREFIX + key)); |
| String[] extraClasspath = Utils.getArrayFromString(properties.getProperty(PROPERTY_EXTRAPATH_PREFIX + key)); |
| String excludedFromJar = properties.getProperty(PROPERTY_EXCLUDE_PREFIX + key); |
| CompiledEntry newEntry = new CompiledEntry(key, source, output, extraClasspath, excludedFromJar, key.endsWith(PROPERTY_JAR_SUFFIX) ? CompiledEntry.JAR : CompiledEntry.FOLDER); |
| result.add(newEntry); |
| } |
| return (CompiledEntry[]) result.toArray(new CompiledEntry[result.size()]); |
| } |
| |
| /** |
| * Add the "src" target to the given Ant script. |
| * |
| * @param jar |
| */ |
| private void generateSRCTarget(CompiledEntry jar) { |
| script.println(); |
| String name = jar.getName(false); |
| String srcName = getSRCName(name); |
| script.printTargetDeclaration(srcName, TARGET_INIT, null, srcName, null); |
| String[] sources = jar.getSource(); |
| filterNonExistingSourceFolders(sources); |
| FileSet[] fileSets = new FileSet[sources.length]; |
| int count = 0; |
| for (int i = 0; i < sources.length; i++) { |
| if (sources[i] != null) { |
| // AspectJ Change Begin |
| // Also include .aj files in source zip |
| fileSets[count++] = new FileSet(sources[i], null, "**/*.aj, **/*.java", null, null, null, null); //$NON-NLS-1$ |
| // AspectJ Change Emd |
| } |
| } |
| |
| String srcLocation = getSRCLocation(name); |
| String srcParent = new Path(srcLocation).removeLastSegments(1).toString(); |
| script.printMkdirTask(srcParent); |
| script.printAntCallTask("zip." + srcName, true, null); //$NON-NLS-1$ |
| script.printTargetEnd(); |
| |
| script.printTargetDeclaration("zip." + srcName, null, null, null, null); //$NON-NLS-1$ |
| if (count != 0) |
| script.printZipTask(srcLocation, null, false, false, fileSets); |
| script.printTargetEnd(); |
| |
| script.printTargetDeclaration("copy." + srcName, null, null, null, null); //$NON-NLS-1$ |
| if (count != 0) { |
| String dest = null; |
| if(srcName.equals(SRC_ZIP) ) |
| dest = new Path(srcName).removeLastSegments(1).toString(); //src.zip can go in the root |
| else |
| dest = srcName.substring(0, srcName.length() - 4 ); //remove .zip, the rest go in folders |
| String toDir = Utils.getPropertyFormat(PROPERTY_SOURCE_DESTINATION_FOLDER) + '/' + dest; |
| script.printCopyTask(null, toDir, fileSets, true, true); |
| } |
| script.printTargetEnd(); |
| } |
| |
| private void filterNonExistingSourceFolders(String[] sources) { |
| File pluginRoot; |
| pluginRoot = new File(getLocation(model)); |
| for (int i = 0; i < sources.length; i++) { |
| File file = new File(pluginRoot, sources[i]); |
| if (!file.exists()) { |
| sources[i] = null; |
| IStatus status = new Status(IStatus.WARNING, PI_PDEBUILD, EXCEPTION_SOURCE_LOCATION_MISSING, NLS.bind(Messages.warning_cannotLocateSource, file.getAbsolutePath()), null); |
| BundleHelper.getDefault().getLog().log(status); |
| } |
| } |
| } |
| |
| /** |
| * Return the name of the zip file for the source for the jar with |
| * the given name. |
| * |
| * @param jarName the name of the jar file |
| * @return String |
| */ |
| protected String getSRCLocation(String jarName) { |
| return getJARLocation(getSRCName(jarName)); |
| } |
| |
| /** |
| * Return the location for a temporary file for the jar file with |
| * the given name. |
| * |
| * @param jarName the name of the jar file |
| * @return String |
| */ |
| protected String getTempJARFolderLocation(String jarName) { |
| IPath destination = new Path(Utils.getPropertyFormat(PROPERTY_TEMP_FOLDER)); |
| destination = destination.append(jarName + ".bin"); //$NON-NLS-1$ |
| return destination.toString(); |
| } |
| |
| /** |
| * Return the full location of the jar file. |
| * |
| * @param jarName the name of the jar file |
| * @return String |
| */ |
| protected String getJARLocation(String jarName) { |
| return new Path(Utils.getPropertyFormat(PROPERTY_BUILD_RESULT_FOLDER)).append(jarName).toString(); |
| } |
| |
| protected String[] getClasspathEntries(BundleDescription lookedUpModel) throws CoreException { |
| return (String[]) getSite(false).getRegistry().getExtraData().get(new Long(lookedUpModel.getBundleId())); |
| } |
| |
| protected Properties getBuildProperties() throws CoreException { |
| if (buildProperties == null) |
| return buildProperties = readProperties(model.getLocation(), propertiesFileName, isIgnoreMissingPropertiesFile() ? IStatus.OK : IStatus.WARNING); |
| |
| return buildProperties; |
| } |
| |
| /** |
| * Return the name of the zip file for the source from the given jar name. |
| * |
| * @param jarName the name of the jar file |
| * @return String |
| */ |
| public static String getSRCName(String jarName) { |
| if (jarName.endsWith(".jar")) { //$NON-NLS-1$ |
| return jarName.substring(0, jarName.length() - 4) + SRC_ZIP; |
| } |
| if (jarName.equals(EXPANDED_DOT) || jarName.equals(DOT)) |
| return SRC_ZIP; |
| return jarName.replace('/', '.') + SRC_ZIP; |
| } |
| |
| /** |
| * If the model defines its own custom script, we do not generate a new one |
| * but we do try to update the version number. |
| */ |
| private void updateExistingScript() throws CoreException { |
| String root = getLocation(model); |
| File buildFile = new File(root, buildScriptFileName); |
| if (!buildFile.exists()) { |
| String message = NLS.bind(Messages.error_missingCustomBuildFile, buildFile); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_WRITING_SCRIPT, message, null)); |
| } |
| try { |
| Utils.updateVersion(buildFile, PROPERTY_VERSION_SUFFIX, model.getVersion().toString()); |
| } catch (IOException e) { |
| String message = NLS.bind(Messages.exception_writeScript, buildFile); |
| throw new CoreException(new Status(IStatus.ERROR, PI_PDEBUILD, EXCEPTION_WRITING_SCRIPT, message, e)); |
| } |
| return; |
| } |
| |
| /** |
| * Substitute the value of an element description variable (variables that |
| * are found in files like plugin.xml, e.g. $ws$) by an Ant property. |
| * |
| * @param sourceString |
| * @return String |
| */ |
| static protected String replaceVariables(String sourceString, boolean compiledElement) { |
| if (sourceString == null) |
| return null; |
| |
| int i = -1; |
| String result = sourceString; |
| while ((i = result.indexOf(DESCRIPTION_VARIABLE_WS)) >= 0) |
| result = result.substring(0, i) + "ws/" + Utils.getPropertyFormat(compiledElement ? PROPERTY_WS : PROPERTY_BASE_WS) + result.substring(i + DESCRIPTION_VARIABLE_WS.length()); //$NON-NLS-1$ |
| while ((i = result.indexOf(DESCRIPTION_VARIABLE_OS)) >= 0) |
| result = result.substring(0, i) + "os/" + Utils.getPropertyFormat(compiledElement ? PROPERTY_OS : PROPERTY_BASE_OS) + result.substring(i + DESCRIPTION_VARIABLE_OS.length()); //$NON-NLS-1$ |
| while ((i = result.indexOf(DESCRIPTION_VARIABLE_ARCH)) >= 0) |
| result = result.substring(0, i) + "arch/" + Utils.getPropertyFormat(compiledElement ? PROPERTY_ARCH : PROPERTY_BASE_ARCH) + result.substring(i + DESCRIPTION_VARIABLE_OS.length()); //$NON-NLS-1$ |
| while ((i = result.indexOf(DESCRIPTION_VARIABLE_NL)) >= 0) |
| result = result.substring(0, i) + "nl/" + Utils.getPropertyFormat(compiledElement ? PROPERTY_NL : PROPERTY_BASE_NL) + result.substring(i + DESCRIPTION_VARIABLE_NL.length()); //$NON-NLS-1$ |
| return result; |
| } |
| |
| public BundleDescription getModel() { |
| return model; |
| } |
| |
| public String getPropertiesFileName() { |
| return propertiesFileName; |
| } |
| |
| public void setPropertiesFileName(String propertyFileName) { |
| this.propertiesFileName = propertyFileName; |
| } |
| |
| public String getBuildScriptFileName() { |
| return buildScriptFileName; |
| } |
| |
| public void setBuildScriptFileName(String buildScriptFileName) { |
| this.buildScriptFileName = buildScriptFileName; |
| } |
| |
| /** |
| * Sets whether or not to sign any constructed jars. |
| * |
| * @param value whether or not to sign any constructed JARs |
| */ |
| public void setSignJars(boolean value) { |
| signJars = value; |
| } |
| |
| /** |
| * Returns the model object which is associated with the given identifier. |
| * Returns <code>null</code> if the model object cannot be found. |
| * |
| * @param modelId the identifier of the model object to lookup |
| * @return the model object or <code>null</code> |
| */ |
| protected BundleDescription getModel(String modelId, String modelVersion) throws CoreException { |
| if (modelVersion == null) |
| return getSite(false).getRegistry().getResolvedBundle(modelId); |
| return getSite(false).getRegistry().getResolvedBundle(modelId, modelVersion); |
| } |
| |
| public FeatureEntry getAssociatedEntry() { |
| return associatedEntry; |
| } |
| |
| public void setAssociatedEntry(FeatureEntry associatedEntry) { |
| this.associatedEntry = associatedEntry; |
| } |
| |
| |
| // AspectJ Change Begin - aspectpath and inpath support |
| public void setAspectpath(List aspectpath) { |
| this.aspectpath = aspectpath; |
| } |
| public void setInpath(List inpath) { |
| this.inpath = inpath; |
| } |
| |
| private String[] bundleToCP(BundleDescription bundle) throws CoreException { |
| if (addedBundles.contains(bundle)) { |
| return new String[]{}; |
| } |
| addedBundles.add(bundle); |
| if (bundle.getName().equals("org.apache.ant")) { //$NON-NLS-1$ |
| return new String[]{}; |
| } |
| |
| List pathList = new ArrayList(); |
| String loc = bundle.getLocation(); |
| Path absPath = new Path(loc); |
| IPath basePath = Utils.makeRelative(absPath, new Path(getLocation(model))); |
| |
| if ("jar".equalsIgnoreCase(basePath.getFileExtension())) { //$NON-NLS-1$ |
| pathList.add(basePath.toString()); |
| } else { |
| String[] cpe = getClasspathEntries(bundle); |
| for (int i = 0; i < cpe.length; i++) { |
| pathList.add(basePath.append(cpe[i]).toString()); |
| } |
| } |
| |
| // now add prerequisite bundles |
| BundleDescription[] prereqs = bundle.getResolvedRequires(); |
| for (int i = 0; i < prereqs.length; i++) { |
| String[] pcp = bundleToCP(prereqs[i]); |
| pathList.addAll(Arrays.asList(pcp)); |
| } |
| |
| String[] path = new String[pathList.size()]; |
| pathList.toArray(path); |
| return path; |
| } |
| // AspectJ Change End |
| |
| } |