blob: 8af03305488034d7290db8c2252f00f1dddd0ea2 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}