| /******************************************************************************* |
| * Copyright (c) 2000, 2008 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.update.internal.core; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import org.eclipse.core.net.proxy.IProxyService; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.osgi.signedcontent.SignedContentFactory; |
| import org.eclipse.update.configuration.IInstallConfiguration; |
| import org.eclipse.update.configurator.ConfiguratorUtils; |
| import org.eclipse.update.configurator.IPlatformConfiguration; |
| import org.eclipse.update.core.*; |
| import org.eclipse.update.internal.core.connection.ConnectionThreadManagerFactory; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.service.packageadmin.PackageAdmin; |
| import org.osgi.util.tracker.ServiceTracker; |
| |
| /** |
| * The main plugin class to be used in the desktop. |
| */ |
| public class UpdateCore extends Plugin { |
| |
| // debug options |
| public static boolean DEBUG; |
| public static boolean DEBUG_SHOW_INSTALL; |
| public static boolean DEBUG_SHOW_PARSING; |
| public static boolean DEBUG_SHOW_WARNINGS; |
| public static boolean DEBUG_SHOW_CONFIGURATION; |
| public static boolean DEBUG_SHOW_TYPE; |
| public static boolean DEBUG_SHOW_WEB; |
| public static boolean DEBUG_SHOW_IHANDLER; |
| public static boolean DEBUG_SHOW_RECONCILER; |
| |
| private static final String PREFIX = "org.eclipse.update.core"; //$NON-NLS-1$ |
| public static final String P_HISTORY_SIZE = PREFIX + ".historySize"; //$NON-NLS-1$ |
| public static final String P_CHECK_SIGNATURE = PREFIX + ".checkSignature"; //$NON-NLS-1$ |
| public static final String P_AUTOMATICALLY_CHOOSE_MIRROR = PREFIX + ".automaticallyChooseMirror"; //$NON-NLS-1$ |
| public static final String P_UPDATE_VERSIONS = PREFIX + ".updateVersions"; //$NON-NLS-1$ |
| public static final String EQUIVALENT_VALUE = "equivalent"; //$NON-NLS-1$ |
| public static final String COMPATIBLE_VALUE = "compatible"; //$NON-NLS-1$ |
| |
| public static int DEFAULT_HISTORY = 100;//Integer.MAX_VALUE; |
| |
| //The shared instance. |
| private static UpdateCore plugin; |
| |
| //log |
| private static UpdateManagerLogWriter log; |
| private static final String LOG_FILE="install.log"; //$NON-NLS-1$ |
| |
| // bundle data |
| private BundleContext context; |
| private ServiceTracker pkgAdminTracker; |
| private ServiceTracker verifierFactoryTracker; |
| private ServiceTracker proxyTracker; |
| |
| // Session |
| private UpdateSession updateSession = null; |
| /** |
| * HTTP response code indicating success. |
| */ |
| public static final int HTTP_OK = 200; |
| |
| /** |
| * The constructor. |
| */ |
| public UpdateCore() { |
| plugin = this; |
| } |
| |
| |
| /** |
| * Returns the shared instance. |
| */ |
| public static UpdateCore getPlugin() { |
| return plugin; |
| } |
| |
| |
| private boolean getBooleanDebugOption(String flag, boolean dflt) { |
| String result = Platform.getDebugOption(flag); |
| if (result == null) |
| return dflt; |
| else |
| return result.trim().equalsIgnoreCase("true"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * dumps a String in the trace |
| */ |
| public static void debug(String s) { |
| StringBuffer msg = new StringBuffer(); |
| msg.append(getPlugin().toString()); |
| msg.append("^"); //$NON-NLS-1$ |
| msg.append(Integer.toHexString(Thread.currentThread().hashCode())); |
| msg.append(" "); //$NON-NLS-1$ |
| msg.append(s); |
| System.out.println(msg.toString()); |
| } |
| |
| /** |
| * Dumps a String in the log if WARNING is set to true |
| */ |
| public static void warn(String s) { |
| if (DEBUG && DEBUG_SHOW_WARNINGS) { |
| if (s!=null){ |
| s="WARNING: "+s; //$NON-NLS-1$ |
| } |
| log(s, null); |
| } |
| } |
| |
| /** |
| * Dumps an exception in the log if WARNING is set to true |
| * |
| * @param s log string |
| * @param e exception to be logged |
| * @since 2.0 |
| */ |
| public static void warn(String s, Throwable e) { |
| if (DEBUG && DEBUG_SHOW_WARNINGS){ |
| if (s!=null){ |
| s="UPDATE MANAGER INFO: "+s; //$NON-NLS-1$ |
| } |
| log(s,e); |
| } |
| } |
| |
| /** |
| * Logs a status |
| */ |
| public static void log(IStatus status){ |
| UpdateCore.getPlugin().getLog().log(status); |
| } |
| |
| /** |
| * Logs an error |
| */ |
| public static void log(Throwable e){ |
| log("",e); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Logs a string and an error |
| */ |
| public static void log(String msg, Throwable e){ |
| IStatus status = null; |
| if (e instanceof CoreException) |
| status = ((CoreException)e).getStatus(); |
| else |
| status = Utilities.newCoreException(msg,e).getStatus(); |
| if (status!=null) |
| log(status); |
| } |
| /* |
| * Method log. |
| * @param newConfiguration |
| */ |
| public static void log(IInstallConfiguration newConfiguration) { |
| if (log!=null) |
| log.log(newConfiguration); |
| } |
| |
| /* |
| * Get update log location relative to platform configuration |
| */ |
| private static File getInstallLogFile() throws IOException { |
| |
| IPlatformConfiguration config = ConfiguratorUtils.getCurrentPlatformConfiguration(); |
| URL configurationLocation = config.getConfigurationLocation(); |
| if (configurationLocation==null){ |
| warn("Unable to retrieve location for update manager log file"); //$NON-NLS-1$ |
| return null; |
| } |
| // URL configLocation = Platform.resolve(configurationLocation); |
| File updateStateLocation = null; |
| |
| if ("file".equalsIgnoreCase(configurationLocation.getProtocol())) { //$NON-NLS-1$ |
| File path = new File(configurationLocation.getFile()); |
| updateStateLocation = new File(path.getParentFile(), LOG_FILE); |
| } |
| return updateStateLocation; |
| } |
| |
| /** |
| * Sends the GET request to the server and returns the server's |
| * response. |
| * |
| * @param url the URL to open on the server |
| * @return the server's response |
| * @throws IOException if an I/O error occurs. Reasons include: |
| * <ul> |
| * <li>The client is closed. |
| * <li>The client could not connect to the server |
| * <li>An I/O error occurs while communicating with the server |
| * <ul> |
| */ |
| |
| |
| /* |
| * Returns true if the feature is a patch |
| */ |
| public static boolean isPatch(IFeature candidate) { |
| IImport[] imports = candidate.getImports(); |
| |
| for (int i = 0; i < imports.length; i++) { |
| IImport iimport = imports[i]; |
| if (iimport.isPatch()) |
| return true; |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) |
| */ |
| public void start(BundleContext context) throws Exception { |
| super.start(context); |
| this.context = context; |
| |
| DEBUG = getBooleanDebugOption("org.eclipse.update.core/debug", false); //$NON-NLS-1$ |
| |
| if (DEBUG) { |
| DEBUG_SHOW_WARNINGS = getBooleanDebugOption("org.eclipse.update.core/debug/warning", false); //$NON-NLS-1$ |
| DEBUG_SHOW_PARSING = getBooleanDebugOption("org.eclipse.update.core/debug/parsing", false); //$NON-NLS-1$ |
| DEBUG_SHOW_INSTALL = getBooleanDebugOption("org.eclipse.update.core/debug/install", false); //$NON-NLS-1$ |
| DEBUG_SHOW_CONFIGURATION = getBooleanDebugOption("org.eclipse.update.core/debug/configuration", false); //$NON-NLS-1$ |
| DEBUG_SHOW_TYPE = getBooleanDebugOption("org.eclipse.update.core/debug/type", false); //$NON-NLS-1$ |
| DEBUG_SHOW_WEB = getBooleanDebugOption("org.eclipse.update.core/debug/web", false); //$NON-NLS-1$ |
| DEBUG_SHOW_IHANDLER = getBooleanDebugOption("org.eclipse.update.core/debug/installhandler", false); //$NON-NLS-1$ |
| DEBUG_SHOW_RECONCILER = getBooleanDebugOption("org.eclipse.update.core/debug/reconciler", false); //$NON-NLS-1$ |
| } |
| |
| // |
| try { |
| File logFile = getInstallLogFile(); |
| if (logFile!=null) |
| log = new UpdateManagerLogWriter(logFile); |
| } catch (IOException e){ |
| warn("",e); //$NON-NLS-1$ |
| } |
| } |
| /* (non-Javadoc) |
| * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) |
| */ |
| public void stop(BundleContext context) throws Exception { |
| super.stop(context); |
| |
| JarContentReference.shutdown(); // make sure we are not leaving jars open |
| Utilities.shutdown(); // cleanup temp area |
| if (log!=null) |
| log.shutdown(); |
| |
| ConnectionThreadManagerFactory.getConnectionManager().shutdown(); |
| |
| |
| this.context = null; |
| if (pkgAdminTracker != null) { |
| pkgAdminTracker.close(); |
| pkgAdminTracker = null; |
| } |
| if (verifierFactoryTracker != null) { |
| verifierFactoryTracker.close(); |
| verifierFactoryTracker = null; |
| } |
| if (proxyTracker != null) { |
| proxyTracker.close(); |
| proxyTracker = null; |
| } |
| } |
| |
| public BundleContext getBundleContext() { |
| return context; |
| } |
| |
| PackageAdmin getPackageAdmin() { |
| if (pkgAdminTracker == null) { |
| pkgAdminTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null); |
| pkgAdminTracker.open(); |
| } |
| return (PackageAdmin)pkgAdminTracker.getService(); |
| } |
| |
| public IProxyService getProxyService() { |
| if (proxyTracker == null) { |
| proxyTracker=new ServiceTracker(getBundle().getBundleContext(), |
| IProxyService.class.getName(), null); |
| proxyTracker.open(); |
| } |
| return (IProxyService)proxyTracker.getService(); |
| } |
| |
| |
| public SignedContentFactory getSignedContentFactory() { |
| if (verifierFactoryTracker == null) { |
| verifierFactoryTracker = new ServiceTracker(context, SignedContentFactory.class.getName(), null); |
| verifierFactoryTracker.open(); |
| } |
| return (SignedContentFactory)verifierFactoryTracker.getService(); |
| } |
| |
| public UpdateSession getUpdateSession() { |
| synchronized(UpdateSession.class) { |
| if (updateSession == null) { |
| updateSession = new UpdateSession(); |
| } |
| } |
| return updateSession; |
| } |
| } |