blob: 0f07f79ef4948a7ce19d7ef253cb1fe7ce165037 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.build.fetch;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.build.IAntScript;
import org.eclipse.pde.build.IFetchFactory;
import org.eclipse.pde.internal.build.*;
/**
* This class implements a fetch factory which calls the Ant Get task on a given URL. The
* format of the map file entry is as follows:
* type@id=GET,url,[args]
* where:
* type = feature | plugin
* id = plug-in or feature identifier (symbolic name)
* GET = mandatory constant (to call this fetch factory)
* url = url to retrieve the data from (suitable to be used in the Ant Get task)
* args = optional comma-separated list of key/value pairs, specify unpack=true to indicate the element should be unzipped
*
* e.g.
* plugin@com.example.foobar=GET,http://downloads.example.com/com.example.foobar_1.0.jar
* plugin@com.example.foobar=GET,http://downloads.example.com/com.example.foobar_1.0.jar,unpack=true
* plugin@com.example.foobar=GET,http://downloads.example.com/com.example.foobar_1.0.zip,unpack=true, username=foo, password=bar
*
* @since 3.2.100
*/
public class GETFetchFactory implements IFetchFactory {
private static final String UNPACK = "unpack"; //$NON-NLS-1$
private static final String SEPARATOR = ","; //$NON-NLS-1$
private static final String TASK_GET = "get"; //$NON-NLS-1$
private static final String TASK_MKDIR = "mkdir"; //$NON-NLS-1$
private static final String TASK_DELETE = "delete"; //$NON-NLS-1$
private static final String TASK_UNZIP = "unzip"; //$NON-NLS-1$
private static final String ATTRIBUTE_SRC = "src"; //$NON-NLS-1$
private static final String ATTRIBUTE_DEST = "dest"; //$NON-NLS-1$
private static final String ATTRIBUTE_DIR = "dir"; //$NON-NLS-1$
private static final String ATTRIBUTE_FILE = "file"; //$NON-NLS-1$
private static final String ATTRIBUTE_VERBOSE = "verbose"; //$NON-NLS-1$
private static final String ATTRIBUTE_IGNORE_ERRORS = "ignoreerrors"; //$NON-NLS-1$
private static final String ATTRIBUTE_USE_TIMESTAMP = "usetimestamp"; //$NON-NLS-1$
private static final String ATTRIBUTE_USERNAME = "username"; //$NON-NLS-1$
private static final String ATTRIBUTE_PASSWORD = "password"; //$NON-NLS-1$
private static final String TAG_OPEN = "<"; //$NON-NLS-1$
private static final String TAG_CLOSE = "/>"; //$NON-NLS-1$
@Override
public void addTargets(IAntScript script) {
//
}
@Override
public void generateRetrieveElementCall(Map<String, Object> entryInfos, IPath destination, IAntScript script) {
printGetTask(destination, script, entryInfos);
}
@Override
public void generateRetrieveFilesCall(Map<String, Object> entryInfos, IPath destination, String[] files, IAntScript script) {
//
}
@Override
public void parseMapFileEntry(String rawEntry, Properties overrideTags, Map<String, Object> entryInfos) throws CoreException {
String url = rawEntry;
if (rawEntry.indexOf(',') != -1) {
StringTokenizer tokenizer = new StringTokenizer(rawEntry, SEPARATOR);
if (tokenizer.hasMoreTokens())
url = tokenizer.nextToken();
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
int index = token.indexOf('=');
if (index == -1) {
// invalid format...we require key=value...log and continue
IStatus status = new Status(IStatus.WARNING, IPDEBuildConstants.PI_PDEBUILD, NLS.bind(Messages.warning_problemsParsingMapFileEntry, rawEntry));
BundleHelper.getDefault().getLog().log(status);
} else {
String key = token.substring(0, index).trim();
String value = token.substring(index + 1).trim();
entryInfos.put(key, value);
}
}
}
try {
new URL(url);
} catch (MalformedURLException e) {
throw new CoreException(new Status(IStatus.ERROR, IPDEBuildConstants.PI_PDEBUILD, NLS.bind(Messages.error_invalidURLInMapFileEntry, rawEntry)));
}
entryInfos.put(ATTRIBUTE_SRC, url);
}
/*
* Print out the Ant GET task to the Ant script.
*/
private void printGetTask(IPath destination, IAntScript script, Map<String, Object> entryInfos) {
String src = (String) entryInfos.get(ATTRIBUTE_SRC);
int index = src.lastIndexOf('/');
String filename = index == -1 ? src : src.substring(index);
String dest = (String) entryInfos.get(ATTRIBUTE_DEST);
if (dest != null) {
//if a dest was specified, make sure the parent directory exists
script.printTabs();
script.print(TAG_OPEN + TASK_MKDIR);
script.printAttribute(ATTRIBUTE_DIR, new Path(dest).removeLastSegments(1).toOSString(), true);
script.print(TAG_CLOSE);
script.println();
} else {
// "dest" attribute is mandatory
dest = destination.removeLastSegments(1).append(filename).toOSString();
}
// "src" attribute is mandatory
script.printTabs();
script.print(TAG_OPEN + TASK_GET);
script.printAttribute(ATTRIBUTE_SRC, src, true);
script.printAttribute(ATTRIBUTE_DEST, dest, true);
// the rest of the attributes are optional so check if they exist before writing in the file
String ignoreErrors = (String) entryInfos.get(ATTRIBUTE_IGNORE_ERRORS);
if (ignoreErrors != null)
script.printAttribute(ATTRIBUTE_IGNORE_ERRORS, ignoreErrors, false);
String useTimestamp = (String) entryInfos.get(ATTRIBUTE_USE_TIMESTAMP);
if (useTimestamp != null)
script.printAttribute(ATTRIBUTE_USE_TIMESTAMP, useTimestamp, false);
String verbose = (String) entryInfos.get(ATTRIBUTE_VERBOSE);
if (verbose != null)
script.printAttribute(ATTRIBUTE_VERBOSE, verbose, false);
String username = (String) entryInfos.get(ATTRIBUTE_USERNAME);
String password = (String) entryInfos.get(ATTRIBUTE_PASSWORD);
if (username != null)
script.printAttribute(ATTRIBUTE_USERNAME, username, password != null);
if (password != null)
script.printAttribute(ATTRIBUTE_PASSWORD, password, username != null);
script.print(TAG_CLOSE);
// if we have a feature or un-packed plug-in then we need to unzip it
boolean unpack = Boolean.valueOf((String) entryInfos.get(UNPACK)).booleanValue();
if (unpack || ELEMENT_TYPE_FEATURE.equals(entryInfos.get(KEY_ELEMENT_TYPE))) {
Path destPath = new Path(dest);
String unzipped = destPath.removeLastSegments(1).toOSString();
if (destPath.getFileExtension().equalsIgnoreCase("jar")) { //$NON-NLS-1$
unzipped = destPath.removeFileExtension().toOSString();
script.printTabs();
script.print(TAG_OPEN + TASK_MKDIR);
script.printAttribute(ATTRIBUTE_DIR, unzipped, true);
script.print(TAG_CLOSE);
}
script.printTabs();
script.print(TAG_OPEN + TASK_UNZIP);
script.printAttribute(ATTRIBUTE_SRC, dest, true);
script.printAttribute(ATTRIBUTE_DEST, unzipped, true);
script.print(TAG_CLOSE);
script.printTabs();
script.print(TAG_OPEN + TASK_DELETE);
script.printAttribute(ATTRIBUTE_FILE, dest, true);
script.print(TAG_CLOSE);
}
script.println();
}
}