/******************************************************************************* * Copyright (c) 2008, 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.equinox.internal.p2.engine; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.core.helpers.LogHelper; import org.eclipse.equinox.p2.engine.spi.ProvisioningAction; import org.eclipse.equinox.p2.engine.spi.Touchpoint; import org.eclipse.equinox.p2.metadata.ITouchpointType; import org.eclipse.equinox.p2.metadata.VersionRange; import org.eclipse.osgi.util.NLS; public class ActionManager implements IRegistryChangeListener { private static final String PT_ACTIONS = "actions"; //$NON-NLS-1$ private static final String ELEMENT_ACTION = "action"; //$NON-NLS-1$ private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$ private static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$ private static final String TOUCHPOINT_TYPE = "touchpointType"; //$NON-NLS-1$ private static final String TOUCHPOINT_VERSION = "touchpointVersion"; //$NON-NLS-1$ /** * Service name constant for the action manager service. This service is used internally * by the engine implementation and should not be referenced directly by clients. */ public static final String SERVICE_NAME = ActionManager.class.getName(); private HashMap<String, IConfigurationElement> actionMap; private TouchpointManager touchpointManager; public ActionManager() { this.touchpointManager = new TouchpointManager(); RegistryFactory.getRegistry().addRegistryChangeListener(this, EngineActivator.ID); } public Touchpoint getTouchpointPoint(ITouchpointType type) { if (type == null || type == ITouchpointType.NONE) return null; return touchpointManager.getTouchpoint(type); } public String getTouchpointQualifiedActionId(String actionId, ITouchpointType type) { if (actionId.indexOf('.') == -1) { if (type == null || type == ITouchpointType.NONE) return actionId; Touchpoint touchpoint = touchpointManager.getTouchpoint(type); if (touchpoint == null) throw new IllegalArgumentException(NLS.bind(Messages.ActionManager_Required_Touchpoint_Not_Found, type.toString(), actionId)); actionId = touchpoint.qualifyAction(actionId); } return actionId; } public ProvisioningAction getAction(String actionId, VersionRange versionRange) { IConfigurationElement actionElement = getActionMap().get(actionId); if (actionElement != null && actionElement.isValid()) { try { ProvisioningAction action = (ProvisioningAction) actionElement.createExecutableExtension(ATTRIBUTE_CLASS); String touchpointType = actionElement.getAttribute(TOUCHPOINT_TYPE); if (touchpointType != null) { String touchpointVersion = actionElement.getAttribute(TOUCHPOINT_VERSION); Touchpoint touchpoint = touchpointManager.getTouchpoint(touchpointType, touchpointVersion); if (touchpoint == null) throw new IllegalArgumentException(NLS.bind(Messages.ActionManager_Required_Touchpoint_Not_Found, touchpointType, actionId)); action.setTouchpoint(touchpoint); } return action; } catch (InvalidRegistryObjectException e) { // skip } catch (CoreException e) { throw new IllegalArgumentException(NLS.bind(Messages.ActionManager_Exception_Creating_Action_Extension, actionId)); } } return null; } private synchronized Map<String, IConfigurationElement> getActionMap() { if (actionMap != null) return actionMap; IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(EngineActivator.ID, PT_ACTIONS); IExtension[] extensions = point.getExtensions(); actionMap = new HashMap<String, IConfigurationElement>(extensions.length); for (int i = 0; i < extensions.length; i++) { try { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { IConfigurationElement actionElement = elements[j]; if (!actionElement.getName().equals(ELEMENT_ACTION)) continue; String actionId = actionElement.getAttribute(ATTRIBUTE_NAME); if (actionId == null) continue; if (actionId.indexOf('.') == -1) actionId = actionElement.getNamespaceIdentifier() + "." + actionId; //$NON-NLS-1$ actionMap.put(actionId, actionElement); } } catch (InvalidRegistryObjectException e) { // skip } } return actionMap; } public synchronized void registryChanged(IRegistryChangeEvent event) { actionMap = null; } static void reportError(String errorMsg) { Status errorStatus = new Status(IStatus.ERROR, EngineActivator.ID, 1, errorMsg, null); LogHelper.log(errorStatus); } }