/*******************************************************************************
* Copyright (c) 2014 Mentor Graphics 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:
* Mentor Graphics - initial API and implementation
*******************************************************************************/
package com.codesourcery.installer;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.management.ManagementFactory;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Files;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import com.codesourcery.internal.installer.FileUtils;
import com.codesourcery.internal.installer.IInstallConstants;
import com.codesourcery.internal.installer.IInstallerImages;
import com.codesourcery.internal.installer.InstallDescription;
import com.codesourcery.internal.installer.InstallManager;
import com.codesourcery.internal.installer.InstallManifest;
import com.codesourcery.internal.installer.InstallMessages;
import com.codesourcery.internal.installer.InstallMode;
import com.codesourcery.internal.installer.InstallPlatform;
import com.codesourcery.internal.installer.InstallUtils;
import com.codesourcery.internal.installer.Log;
import com.codesourcery.internal.installer.RepositoryManager;
import com.codesourcery.internal.installer.ShutdownHandler;
/**
* The activator class controls the plug-in life cycle
*/
@SuppressWarnings("restriction") // Access p2 internal logging API's
public class Installer implements BundleActivator {
/** The plug-in identifier */
public static final String ID = "com.codesourcery.installer"; //$NON-NLS-1$
/** The shared instance */
private static Installer plugin;
/** Bundle context */
private BundleContext context;
/** Image registry */
private ImageRegistry imageRegistry;
/** Install platform */
private InstallPlatform installPlatform;
/** <code>true</code> if running on Windows platform */
private static boolean isWindows;
/** Data folder */
private IPath dataFolder;
/** Log path */
private IPath logPath;
/** <code>true</code> if using platform log directory should be copied */
private boolean copyLog = false;
/** Install manager */
private InstallManager installManager;
/** Lock file */
private RandomAccessFile lockFile;
/** Lock file lock */
private FileLock fileLock;
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static Installer getDefault() {
return plugin;
}
/**
* The constructor
*/
public Installer() {
}
/**
* Returns the bundle context for this bundle.
* @return the bundle context
*/
public BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext aContext) throws Exception {
this.context = aContext;
plugin = this;
// Determine platform
isWindows = Platform.getOS().equals(Platform.OS_WIN32);
// Initialize install manager
initInstallManager();
// Initialize log path
initializeLogPath();
// Initialize install platform
initializeInstallPlatform();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext aContext) throws Exception {
// Run shutdown operations
ShutdownHandler.getDefault().run();
// Dispose of images
if (imageRegistry != null) {
imageRegistry.dispose();
}
// Dispose of install manager
if (installManager != null) {
installManager.dispose();
}
// Shutdown the repository manager
RepositoryManager.getDefault().shutdown();
plugin = null;
// Release installer lock
releaseLock();
}
/**
* Returns if this instance of the installer has the exclusive lock or the
* installer was run with the command line option to not obtain a lock.
*
* @return <code>true</code> if has lock
*/
public boolean hasLock() {
if (hasCommandLineOption(IInstallConstants.COMMAND_LINE_NO_LOCK)) {
return true;
}
else {
return (fileLock != null);
}
}
/**
* Attempts to get the installer lock. If another instance of the installer
* is currently running, this instance will not be able to obtain the lock.
*
* @param path Directory for lock file
* @see #hasLock()
*/
private void getLock(IPath path) {
try {
File dataLockFile = path.append(".lock").toFile();
if (!dataLockFile.exists()) {
dataLockFile.createNewFile();
}
lockFile = new RandomAccessFile(dataLockFile, "rw");
FileChannel channel = lockFile.getChannel();
fileLock = channel.tryLock();
} catch (Exception e) {
Installer.log(e);
}
}
/**
* Releases the installer lock.
*/
private void releaseLock() {
try {
if (fileLock != null) {
fileLock.release();
}
fileLock = null;
if (lockFile != null) {
lockFile.close();
}
lockFile = null;
}
catch (Exception e) {
Installer.log(e);
}
}
/**
* Initializes the install manager.
*
* @throws CoreException on failure
*/
private void initInstallManager() throws CoreException {
// Attempt to load installation manifest (uninstall)
InstallManifest manifest = loadInstallManifest();
// Get log command line argument
String dataDirectory = getCommandLineOption(IInstallConstants.COMMAND_LINE_DATA);
if (dataDirectory != null) {
dataFolder = InstallUtils.resolvePath(dataDirectory);
}
// Use default location
else {
// Set saved data folder if available
if ((manifest != null) && (manifest.getDataPath() != null)) {
dataFolder = manifest.getDataPath();
}
// Else use default folder
else {
String home = System.getProperty("user.home");
dataFolder = new Path(home).append(IInstallConstants.DEFAULT_INSTALL_DATA_FOLDER);
}
}
// Load install description
InstallDescription description = loadInstallDescription(SubMonitor.convert(null));
// If data location is specified in install description, it overrides
// default location or any location specified on command line
if (description != null) {
IPath dataLocation = description.getDataLocation();
if (dataLocation != null) {
dataFolder = dataLocation;
}
}
// Setup data folder
try {
File dataDirectoryFile = dataFolder.toFile();
// Clean data folder
if (hasCommandLineOption(IInstallConstants.COMMAND_CLEAN)) {
if (dataDirectoryFile.exists()) {
FileUtils.deleteDirectory(dataDirectoryFile.toPath());
}
}
// Create data folder
if (!dataDirectoryFile.exists()) {
Files.createDirectories(dataDirectoryFile.toPath());
}
}
catch (Exception e) {
fail("Failed to access data folder.", e);
}
// Only one instance of the installer is allowed to run at a time.
// Obtain the installer lock.
getLock(dataFolder);
if (hasLock()) {
// Create install manager. This must be done after the data location
// has been initialized.
installManager = new InstallManager();
// Uninstall
if (manifest != null) {
installManager.setInstallMode(new InstallMode(false));
installManager.setInstallManifest(manifest);
}
// Install
else if (description != null) {
// Set install mode
InstallMode mode = new InstallMode(true);
// Patch installation
if (description.getPatch())
mode.setPatch();
installManager.setInstallMode(mode);
// Set install description
installManager.setInstallDescription(description);
}
else {
Installer.fail("No install description found.");
}
// Save to mirror command line option
String location = Installer.getDefault().getCommandLineOption(IInstallConstants.COMMAND_LINE_SAVE_INSTALL);
if (location != null) {
installManager.setMirrorLocation(new Path(location), null);
}
// Load from mirror command line option
else {
location = Installer.getDefault().getCommandLineOption(IInstallConstants.COMMAND_LINE_LOAD_INSTALL);
if (location != null) {
try {
installManager.setSourceLocation(new Path(location));
}
catch (Exception e) {
System.err.println(e.getLocalizedMessage());
}
}
}
}
}
/**
* Loads the install description.
*
* @param monitor Progress monitor
* @return Install description or <code>null</code>.
* @throws CoreException on failure
*/
private InstallDescription loadInstallDescription(SubMonitor monitor) throws CoreException {
InstallDescription description = null;
try {
String site = getCommandLineOption(IInstallConstants.COMMAND_LINE_INSTALL_DESCRIPTION);
URI siteUri = resolveFile(site, IInstallConstants.INSTALL_DESCRIPTION_FILENAME);
if (siteUri != null) {
description = new InstallDescription();
// Properties specified on command line
Map<String, String> properties = getCommandLineProperties();
// Load description
description.load(siteUri, properties, monitor);
// Override the install location if specified
String installLocation = getCommandLineOption(IInstallConstants.COMMAND_LINE_INSTALL_LOCATION);
if (installLocation != null) {
description.setRootLocation(InstallUtils.resolvePath(installLocation));
}
}
} catch (Exception e) {
Installer.fail(InstallMessages.Error_InvalidSite, e);
}
return description;
}
/**
* Resolves an install file.
*
* @param site File URI or <code>null</code>.
* @param filename File name
* @return File URI
* @throws URISyntaxException on invalid syntax
*/
private URI resolveFile(String site, String filename) throws URISyntaxException {
// If no URL was given from the outside, look for file
// relative to where the installer is running. This allows the installer to be self-contained
if (site == null)
site = filename;
URI propsURI = URIUtil.fromString(site);
if (!propsURI.isAbsolute()) {
String installerInstallArea = System.getProperty(IInstallConstants.OSGI_INSTALL_AREA);
if (installerInstallArea == null)
throw new IllegalStateException(InstallMessages.Error_NoInstallArea);
// Get the locale
String locale = Platform.getNL();
// Check for locale installer description
propsURI = URIUtil.append(URIUtil.fromString(installerInstallArea), locale);
propsURI = URIUtil.append(propsURI, site);
File installerDescription = URIUtil.toFile(propsURI);
// If not found, use default install description
if (!installerDescription.exists()) {
propsURI = URIUtil.append(URIUtil.fromString(installerInstallArea), site);
installerDescription = URIUtil.toFile(propsURI);
if (!installerDescription.exists()) {
propsURI = null;
}
}
}
return propsURI;
}
/**
* Returns the install manager.
*
* @return Install manager or <code>null</code> if there was a problem
* starting the installer
*/
public IInstallManager getInstallManager() {
return installManager;
}
/**
* Loads an install manifest.
*
* @return Install manifest or <code>null</code>.
* @throws CoreException on failure
*/
private InstallManifest loadInstallManifest() throws CoreException {
InstallManifest manifest = null;
try {
IPath manifestPath;
String site = getCommandLineOption(IInstallConstants.COMMAND_LINE_INSTALL_MANIFEST);
File manifestFile = null;
// Manifest specified on command line
if (site != null) {
manifestPath = new Path(site);
manifestFile = manifestPath.toFile();
}
// Look for manifest in install area
else {
String installerInstallArea = System.getProperty(IInstallConstants.OSGI_INSTALL_AREA);
if (installerInstallArea == null)
throw new IllegalStateException(InstallMessages.Error_NoInstallArea);
manifestPath = new Path(installerInstallArea).append(IInstallConstants.INSTALL_MANIFEST_FILENAME);
URL url = new URL(manifestPath.toOSString());
url = FileLocator.toFileURL(url);
manifestFile = new File(url.getPath());
}
if (manifestFile.exists()) {
manifest = new InstallManifest();
manifest.load(manifestFile);
}
}
catch (Exception e) {
Installer.fail(InstallMessages.Error_LoadingManifest, e);
}
return manifest;
}
/**
* Returns if the installer is running on
* the Windows platform.
*
* @return <code>true</code> if Windows
*/
public static boolean isWindows() {
return isWindows;
}
/**
* Returns if the installer is running on
* the Linux platform.
*
* @return <code>true</code> if running on Linux
*/
public static boolean isLinux() {
return !isWindows;
}
/**
* Returns if the installer is running on
* the OSX platform.
*
* @return <code>true</code> if running on OSX
*/
public static boolean isOSX() {
// Not currently supported
throw new UnsupportedOperationException();
}
/**
* Initializes the install platform.
*
* @throws CoreException on failure
*/
private void initializeInstallPlatform() throws CoreException {
try {
Bundle bundle = Platform.getBundle(Installer.ID);
String os = Platform.getOS();
String arch = Platform.getOSArch();
// Temporary directory
String tempDirValue = System.getProperty("java.io.tmpdir");
if (tempDirValue == null)
fail("No temporary directory available, aborting.");
IPath tempPath = new Path(tempDirValue);
File tempDir = tempPath.toFile();
if (!tempDir.exists())
fail("Temporary directory does not exist, aborting.");
// Install monitor prefix
final String monPrefix = MessageFormat.format("{0}-{1}-{2}", new Object[] {
IInstallConstants.INSTALL_MONITOR_NAME,
os,
arch
});
// Install monitor filename
String monSrcName = monPrefix;
if (isWindows()) {
monSrcName += "." + IInstallConstants.EXTENSION_EXE;
}
// Install monitor included with installer
URL url = FileLocator.find(bundle, new Path("/exe/" + monSrcName), null); //$NON-NLS-1$
url = FileLocator.resolve(url);
File monSrcFile = new File(url.getFile());
// Install monitor temporary path
IPath monTempPath = tempPath.append(
monPrefix +
"-" + UUID.randomUUID().toString() +
(isWindows() ? "." + IInstallConstants.EXTENSION_EXE : ""));
File monTempFile = monTempPath.toFile();
// Copy install monitor
FileUtils.copyFile(monSrcFile.toPath(), monTempFile.toPath(), true);
// Set execute attribute
monTempFile.setExecutable(true);
// Get the installer PID (only works for a SUN JVM)
String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
int seperator = runtimeName.indexOf('@');
String pid = runtimeName.substring(0, seperator);
// Redistributables directory (if available)
String redistPath = null;
File redistDir = getInstallFile(IInstallConstants.REDIST_DIRECTORY);
if ((redistDir != null) && redistDir.exists())
redistPath = redistDir.getAbsolutePath();
IPath monitorLogPath = getLogPath().append(IInstallConstants.INSTALL_MONITOR_NAME + ".log");
// Create the install monitor
installPlatform = new InstallPlatform(monTempFile.getAbsolutePath(), redistPath,
pid, monitorLogPath.toOSString());
}
catch (Exception e) {
fail(InstallMessages.Error_FailedInstallMonitor, e);
}
}
/**
* Initializes the log path.
*/
private void initializeLogPath() {
try {
IPath platformLogPath = Platform.getLogFileLocation().removeLastSegments(1);
File installArea = getInstallFile("");
IPath installPath = new Path(installArea.getAbsolutePath());
// If the platform log directory is in the installer directory,
// use a log location in the data directory. This prevents the
// log from blocking removal of the directory during uninstallation.
if (installPath.isPrefixOf(platformLogPath)) {
setCopyLog(true);
logPath = Installer.getDefault().getDataFolder().append(IInstallConstants.LOGS_DIRECTORY);
String dateNow = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
logPath = logPath.append(dateNow);
try {
Files.createDirectories(logPath.toFile().toPath());
} catch (IOException e) {
log(e);
}
}
// Otherwise write the log to the platform log directory
else {
setCopyLog(false);
logPath = platformLogPath;
}
}
catch (Exception e) {
log(e);
}
}
/**
* Sets whether the platform log file will be copied.
*
* @param copyLog <code>true</code> if to copy log.
*/
public void setCopyLog(boolean copyLog) {
this.copyLog = copyLog;
}
/**
* Returns if the platform log file will be copied to the log directory.
*
* @return <code>true</code> if platform log file will be copied.
*/
public boolean isCopyLog() {
return copyLog;
}
/**
* Returns the path to the log directory.
*
* @return Log directory path
*/
public IPath getLogPath() {
return logPath;
}
/**
* Returns the install Platform.
*
* @return Install platform
*/
public IInstallPlatform getInstallPlatform() {
return installPlatform;
}
/**
* Logs an exception.
*
* @param e Exception
*/
public static void log(Throwable failure) {
IStatus status;
Throwable cause = failure;
//unwrap target exception if applicable
if (failure instanceof InvocationTargetException) {
cause = ((InvocationTargetException) failure).getTargetException();
if (cause == null)
cause = failure;
}
if (cause instanceof CoreException) {
status = ((CoreException) cause).getStatus();
}
else {
status = new Status(IStatus.ERROR, ID, failure.getLocalizedMessage(), cause);
}
LogHelper.log(status);
Log.getDefault().log(status);
}
/**
* Logs a message.
*
* @param message Message
*/
public static void log(int severity, String message) {
Status status = new Status(severity, ID, 0, message, null);
LogHelper.log(status);
Log.getDefault().log(status);
}
/**
* Logs a message.
*
* @param message Message
*/
public static void log(String message) {
log(IStatus.INFO, message);
}
/**
* Logs an error.
*
* @param message Error message
*/
public static void logError(String message) {
log(IStatus.ERROR, message);
}
/**
* Returns the image registry.
*
* @return Image registry
*/
public ImageRegistry getImageRegistry() {
return imageRegistry;
}
/**
* Called to initialize images.
*/
public void initializeImages() {
if (imageRegistry == null) {
try {
imageRegistry = new ImageRegistry();
Bundle bundle = getContext().getBundle();
URL imagePathUrl;
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-empty.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_EMPTY, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-empty2.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_EMPTY2, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-solid.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_SOLID, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-error.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_ERROR, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-error2.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_ERROR2, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-checked.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_CHECKED, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/bullet-checked2.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_CHECKED2, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/arrow-right.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_ARROW, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/arrow-right2.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.BULLET_ARROW2, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/title.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.PAGE_BANNER, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/comp.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.COMPONENT, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/comp-opt.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.COMPONENT_OPTIONAL, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/refresh.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.REFRESH, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/folder.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.FOLDER, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/csl-16x16-32bit.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TITLE_ICON, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/info.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.INFO, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/error.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.ERROR, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/warning.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WARNING, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait0.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT0, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait1.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT1, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait2.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT2, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait3.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT3, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait4.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT4, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait5.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT5, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait6.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT6, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait7.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT7, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait8.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT8, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait9.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT9, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait10.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT10, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait11.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT11, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait12.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT12, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait13.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT13, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/wait14.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.WAIT14, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/comp-required.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.COMP_REQUIRED_OVERLAY, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/comp-optional.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.COMP_OPTIONAL_OVERLAY, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/comp-addon.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.COMP_ADDON_OVERLAY, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/update-add.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.UPDATE_ADD, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/update-folder.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.UPDATE_FOLDER, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/update-install.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.UPDATE_INSTALL, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/update-remove.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.UPDATE_REMOVE, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/tree-collapse.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TREE_COLLAPSE, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/tree-expand.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TREE_EXPAND, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/tree-nocheck.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TREE_NOCHECK, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/tree-checked.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TREE_CHECKED, ImageDescriptor.createFromURL(imagePathUrl));
imagePathUrl = FileLocator.find(bundle, new Path("icons/tree-unchecked.png"), null); //$NON-NLS-1$
imageRegistry.put(IInstallerImages.TREE_UNCHECKED, ImageDescriptor.createFromURL(imagePathUrl));
}
catch (Exception e) {
log(e);
}
}
}
/**
* Copied from ServiceHelper because we need to obtain services
* before p2 has been started.
*/
public Object getService(String name) {
BundleContext bundleContext = getContext();
if (bundleContext == null)
return null;
ServiceReference<?> reference = bundleContext.getServiceReference(name);
if (reference == null)
return null;
Object result = bundleContext.getService(reference);
bundleContext.ungetService(reference);
return result;
}
/**
* Throws a new exception of severity error with the given error message.
* @throws CoreException Exception
*/
public static void fail(String message) throws CoreException {
fail(message, null);
}
/**
* Throws a new exception of severity error with the given error message.
* @throws CoreException Exception
*/
public static void fail(String message, Throwable throwable) throws CoreException {
Status status = new Status(IStatus.ERROR, Installer.ID, message, throwable);
Log.getDefault().log(status);
throw new CoreException(status);
}
/**
* Throws a new exception of severity error.
* @throws CoreException Exception
*/
public static void fail(Throwable throwable) throws CoreException {
Status status = new Status(IStatus.ERROR, Installer.ID, throwable.getLocalizedMessage(), throwable);
Log.getDefault().log(status);
throw new CoreException(status);
}
/**
* Returns the path to an install file.
*
* @param site File
* @return Install file
* @throws URISyntaxException on bad format
*/
public File getInstallFile(String site) throws URISyntaxException {
String installArea = System.getProperty(IInstallConstants.OSGI_INSTALL_AREA);
URI fileUri = URIUtil.append(URIUtil.fromString(installArea), site);
File file = URIUtil.toFile(fileUri);
return file;
}
/**
* Returns the installer data folder.
*
* @return Path to data folder
*/
public IPath getDataFolder() {
return dataFolder;
}
/**
* Returns if a command line option is
* present.
*
* @param option Option
* @return <code>true</code> if option is found
*/
public boolean hasCommandLineOption(String option) {
boolean hasOption = false;
String[] args = Platform.getCommandLineArgs();
for (String arg : args) {
if (arg.startsWith(option)) {
hasOption = true;
break;
}
}
return hasOption;
}
/**
* Returns the argument to a command line option.
* The argument will be stripped of quotes.
*
* @param option Option
* @return Option argument or <code>null</code> if
* option was not found.
*/
public String getCommandLineOption(String option) {
String argument = null;
String[] args = Platform.getCommandLineArgs();
for (int index = 0; index < args.length; index++) {
if (args[index].startsWith(option)) {
int offset = args[index].indexOf('=');
if (offset != -1) {
argument = args[index].substring(offset + 1).trim();
// Strip quotes
argument = argument.replace("\"", "");
break;
}
}
}
return argument;
}
/**
* Returns the set of defined command line properties.
*
* @return Command line properties
*/
public Map<String, String> getCommandLineProperties() {
HashMap<String, String> defines = new HashMap<String, String>();
String[] args = Platform.getCommandLineArgs();
for (int index = 0; index < args.length; index++) {
if (args[index].startsWith(IInstallConstants.COMMAND_LINE_INSTALL_PROPERTY)) {
int nameOffset = IInstallConstants.COMMAND_LINE_INSTALL_PROPERTY.length();
int offset = args[index].indexOf('=', nameOffset);
if (offset != -1) {
String name = args[index].substring(nameOffset, offset);
String argument = args[index].substring(offset + 1).trim();
// Strip quotes
argument = argument.replace("\"", "");
defines.put(name, argument);
}
}
}
return defines;
}
}