/******************************************************************************* * Copyright (c) 2000, 2010 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.operations; import java.util.ArrayList; import java.util.Iterator; import java.util.Vector; import org.eclipse.update.core.*; import org.eclipse.update.internal.configurator.*; import org.eclipse.update.internal.operations.*; /** * Entry point for update manager operations. Use this class to obtain the factory that creates * update manager operations, or to get the operation validator. * <p> * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> * @since 3.0 * @deprecated The org.eclipse.update component has been replaced by Equinox p2. * This API will be deleted in a future release. See bug 311590 for details. */ public class OperationsManager { private static IOperationValidator validator; private static IOperationFactory operationFactory; private static Vector listeners = new Vector(); private static Vector pendingOperations = new Vector(); private static boolean inProgress; private OperationsManager() { } /** * Each update operations must be created by the operation factory. * Use this method to obtain the factory. * @return returns the operation factory */ public static IOperationFactory getOperationFactory() { if (operationFactory == null) operationFactory = new OperationFactory(); return operationFactory; } /** * Check if the feature is the subject of an update operation such as install, * configure, etc. and return it. Currently there can only be one pending * operation on a feature. * @param feature feature to check for pending operations * @return pending operation if any, otherwise null. */ public static IFeatureOperation findPendingOperation(IFeature feature) { for (int i = 0; i < pendingOperations.size(); i++) { IFeatureOperation operation = (IFeatureOperation) pendingOperations.elementAt(i); if (operation.getFeature().equals(feature)) return operation; } return null; } /** * Register a pending operation. * @param operation pending operation */ public static void addPendingOperation(IOperation operation) { pendingOperations.add(operation); //fireObjectsAdded(this, new Object[] { change }); } /** * Unregister a pending operation. * @param operation pending operation */ public static void removePendingOperation(IOperation operation) { pendingOperations.remove(operation); //fireObjectsRemoved(this, new Object[] { change }); } /** * Adds a model changed listener. * @param listener update model change listener */ public static void addUpdateModelChangedListener(IUpdateModelChangedListener listener) { if (!listeners.contains(listener)) listeners.add(listener); } /** * Removes an model changed listener. * @param listener update model change listener */ public static void removeUpdateModelChangedListener(IUpdateModelChangedListener listener) { if (listeners.contains(listener)) listeners.remove(listener); } /** * Notifies model changed listeners when features/sites/etc. are added. * @param parent parent object * @param children children added */ public static void fireObjectsAdded(Object parent, Object[] children) { for (Iterator iter = listeners.iterator(); iter.hasNext();) { IUpdateModelChangedListener listener = (IUpdateModelChangedListener) iter.next(); listener.objectsAdded(parent, children); } } /** * Notifies model changed listeners when features/sites/etc are removed. * @param parent parent object * @param children children removed */ public static void fireObjectsRemoved(Object parent, Object[] children) { for (Iterator iter = listeners.iterator(); iter.hasNext();) { IUpdateModelChangedListener listener = (IUpdateModelChangedListener) iter.next(); listener.objectsRemoved(parent, children); } } /** * Notifies model changed listeners when features/sites/etc. have changed. * @param object changed object * @param property changed object property */ public static void fireObjectChanged(Object object, String property) { for (Iterator iter = listeners.iterator(); iter.hasNext();) { IUpdateModelChangedListener listener = (IUpdateModelChangedListener) iter.next(); listener.objectChanged(object, property); } } /** * Returns true when any of the install operations requires a license agreement. * @param jobs features to install * @return true when any of the features to install have a license */ public static boolean hasSelectedJobsWithLicenses(IInstallFeatureOperation[] jobs) { for (int i = 0; i < jobs.length; i++) { if (UpdateUtils.hasLicense(jobs[i].getFeature())) return true; } return false; } /** * Returns true when any of the features to install has optional features. * @param jobs features to install * @return true when any of the features has optional features */ public static boolean hasSelectedJobsWithOptionalFeatures(IInstallFeatureOperation[] jobs) { for (int i = 0; i < jobs.length; i++) { if (UpdateUtils.hasOptionalFeatures(jobs[i].getFeature())) return true; } return false; } /** * Returns the list of operations that need a license agreement. * @param jobs features to install * @return the list of operation that need a license agreement */ public static IInstallFeatureOperation[] getSelectedJobsWithLicenses(IInstallFeatureOperation[] jobs) { ArrayList list = new ArrayList(); for (int i = 0; i < jobs.length; i++) { if (UpdateUtils.hasLicense(jobs[i].getFeature())) list.add(jobs[i]); } return (IInstallFeatureOperation[]) list.toArray( new IInstallFeatureOperation[list.size()]); } /** * Returns the list of operations that have optional features to install. * @param jobs features to install * @return list of operations that have optional features to install */ public static IInstallFeatureOperation[] getSelectedJobsWithOptionalFeatures(IInstallFeatureOperation[] jobs) { ArrayList list = new ArrayList(); for (int i = 0; i < jobs.length; i++) { if (UpdateUtils.hasOptionalFeatures(jobs[i].getFeature())) list.add(jobs[i]); } return (IInstallFeatureOperation[]) list.toArray( new IInstallFeatureOperation[list.size()]); } /** * Sets whether any operations is in progress. * @param inProgress true when operation is in progress */ public static synchronized void setInProgress(boolean inProgress) { OperationsManager.inProgress = inProgress; } /** * Returns true when some operation is being executed, false otherwise. * @return true when some operation execution is in progress, false otherwise */ public static synchronized boolean isInProgress() { return inProgress; } /** * Returns the operations validator. * @return the operation validator */ public static IOperationValidator getValidator() { if (validator == null) validator = new OperationValidator(); return validator; } /** * Sets a custom operation validator * @param validator the custom validator */ public static void setValidator(IOperationValidator validator) { OperationsManager.validator = validator; } /** * Applies the changes made to the current configuration. * Care must be taken when using this method. Normally, if you install a new * plugin it is safe to do it. */ public static void applyChangesNow() { ConfigurationActivator configurator = ConfigurationActivator.getConfigurator(); configurator.installBundles(); pendingOperations.clear(); } }