/******************************************************************************* * Copyright (c) 2004, 2006 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.core.internal.registry; import java.util.Map; import org.eclipse.core.runtime.InvalidRegistryObjectException; /** * @since 3.1 */ public class TemporaryObjectManager implements IObjectManager { private Map actualObjects; //id --> registry objects private RegistryObjectManager parent; //the main object manager (should be equals to extensionRegistry.getObjectManager) public TemporaryObjectManager(Map actualObjects, RegistryObjectManager parent) { this.actualObjects = actualObjects; this.parent = parent; } public Handle getHandle(int id, byte type) { switch (type) { case RegistryObjectManager.EXTENSION_POINT : return new ExtensionPointHandle(this, id); case RegistryObjectManager.EXTENSION : return new ExtensionHandle(this, id); case RegistryObjectManager.CONFIGURATION_ELEMENT : return new ConfigurationElementHandle(this, id); case RegistryObjectManager.THIRDLEVEL_CONFIGURATION_ELEMENT : default : //avoid compiler error, type should always be known return new ThirdLevelConfigurationElementHandle(this, id); } } public Handle[] getHandles(int[] ids, byte type) { Handle[] results = null; int nbrId = ids.length; switch (type) { case RegistryObjectManager.EXTENSION_POINT : if (nbrId == 0) return ExtensionPointHandle.EMPTY_ARRAY; results = new ExtensionPointHandle[nbrId]; for (int i = 0; i < nbrId; i++) { results[i] = new ExtensionPointHandle(this, ids[i]); } break; case RegistryObjectManager.EXTENSION : if (nbrId == 0) return ExtensionHandle.EMPTY_ARRAY; results = new ExtensionHandle[nbrId]; for (int i = 0; i < nbrId; i++) { results[i] = new ExtensionHandle(this, ids[i]); } break; case RegistryObjectManager.CONFIGURATION_ELEMENT : if (nbrId == 0) return ConfigurationElementHandle.EMPTY_ARRAY; results = new ConfigurationElementHandle[nbrId]; for (int i = 0; i < nbrId; i++) { results[i] = new ConfigurationElementHandle(this, ids[i]); } break; case RegistryObjectManager.THIRDLEVEL_CONFIGURATION_ELEMENT : if (nbrId == 0) return ConfigurationElementHandle.EMPTY_ARRAY; results = new ThirdLevelConfigurationElementHandle[nbrId]; for (int i = 0; i < nbrId; i++) { results[i] = new ThirdLevelConfigurationElementHandle(this, ids[i]); } break; } return results; } synchronized public Object getObject(int id, byte type) { Object result = null; try { result = parent.getObject(id, type); } catch (InvalidRegistryObjectException e) { if (actualObjects != null) { result = actualObjects.get(new Integer(id)); } } if (result == null) throw new InvalidRegistryObjectException(); return result; } synchronized public RegistryObject[] getObjects(int[] values, byte type) { if (values.length == 0) { switch (type) { case RegistryObjectManager.EXTENSION_POINT : return ExtensionPoint.EMPTY_ARRAY; case RegistryObjectManager.EXTENSION : return Extension.EMPTY_ARRAY; case RegistryObjectManager.CONFIGURATION_ELEMENT : case RegistryObjectManager.THIRDLEVEL_CONFIGURATION_ELEMENT : return ConfigurationElement.EMPTY_ARRAY; } } RegistryObject[] results = null; switch (type) { case RegistryObjectManager.EXTENSION_POINT : results = new ExtensionPoint[values.length]; break; case RegistryObjectManager.EXTENSION : results = new Extension[values.length]; break; case RegistryObjectManager.CONFIGURATION_ELEMENT : case RegistryObjectManager.THIRDLEVEL_CONFIGURATION_ELEMENT : results = new ConfigurationElement[values.length]; break; } for (int i = 0; i < values.length; i++) { results[i] = (RegistryObject) getObject(values[i], type); } return results; } public synchronized void close() { actualObjects = null; } }