/******************************************************************************* * 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; } }